From 2ed28d750854e413027b82f0eaa72918ccda9709 Mon Sep 17 00:00:00 2001 From: iceBear67 Date: Wed, 25 Sep 2024 23:08:10 +0800 Subject: [PATCH] refactor: prefix module --- .../io/ib67/sfcraft/SFCraftInitializer.java | 6 +- .../io/ib67/sfcraft/module/AFKModule.java | 52 +++---- .../ib67/sfcraft/module/chat/ChatPrefix.java | 34 +++++ .../sfcraft/module/chat/ChatPrefixModule.java | 128 ++++++++++++++++++ .../chat/{ => decorator}/ChatPingModule.java | 3 +- .../{ => decorator}/ChatSendLocModule.java | 3 +- .../chat/{ => decorator}/ReplaceHelper.java | 2 +- .../module/room/CreativeRoomModule.java | 76 +++++------ .../room/create/CreativePlayerManager.java | 8 +- .../room/create/CreativePlayerSession.java | 12 +- .../room/create/CreativeSpaceRoom.java | 5 +- 11 files changed, 233 insertions(+), 96 deletions(-) create mode 100644 src/main/java/io/ib67/sfcraft/module/chat/ChatPrefix.java create mode 100644 src/main/java/io/ib67/sfcraft/module/chat/ChatPrefixModule.java rename src/main/java/io/ib67/sfcraft/module/chat/{ => decorator}/ChatPingModule.java (97%) rename src/main/java/io/ib67/sfcraft/module/chat/{ => decorator}/ChatSendLocModule.java (96%) rename src/main/java/io/ib67/sfcraft/module/chat/{ => decorator}/ReplaceHelper.java (95%) diff --git a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java index 685afff..0f83cc6 100644 --- a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java +++ b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java @@ -4,8 +4,9 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.inject.*; import io.ib67.sfcraft.module.*; -import io.ib67.sfcraft.module.chat.ChatPingModule; -import io.ib67.sfcraft.module.chat.ChatSendLocModule; +import io.ib67.sfcraft.module.chat.ChatPrefixModule; +import io.ib67.sfcraft.module.chat.decorator.ChatPingModule; +import io.ib67.sfcraft.module.chat.decorator.ChatSendLocModule; import io.ib67.sfcraft.module.compat.ModCompatModule; import io.ib67.sfcraft.module.randomevt.LongNightModule; import io.ib67.sfcraft.module.room.CreativeRoomModule; @@ -59,6 +60,7 @@ public class SFCraftInitializer extends GuiceModInitializer { registerFeature(ModCompatModule.class); registerFeature(RoomModule.class); registerFeature(CreativeRoomModule.class); + registerFeature(ChatPrefixModule.class); } @Override diff --git a/src/main/java/io/ib67/sfcraft/module/AFKModule.java b/src/main/java/io/ib67/sfcraft/module/AFKModule.java index 8d0ec38..d3a0dd2 100644 --- a/src/main/java/io/ib67/sfcraft/module/AFKModule.java +++ b/src/main/java/io/ib67/sfcraft/module/AFKModule.java @@ -4,6 +4,8 @@ import com.google.inject.Inject; import io.ib67.sfcraft.ServerModule; import io.ib67.sfcraft.callback.SFCallbacks; import io.ib67.sfcraft.inject.MinecraftServerSupplier; +import io.ib67.sfcraft.module.chat.ChatPrefix; +import io.ib67.sfcraft.module.chat.ChatPrefixModule; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.minecraft.network.packet.s2c.play.TeamS2CPacket; @@ -19,33 +21,21 @@ import java.util.Objects; public class AFKModule extends ServerModule { @Inject private MinecraftServerSupplier serverSupplier; - private Team team; + @Inject + private ChatPrefixModule chatPrefixModule; + private ChatPrefix prefix; @Override public void onInitialize() { SFCallbacks.PLAYER_IDLE.register(this::onAFK); - ServerPlayConnectionEvents.JOIN.register(this::onJoin); - ServerPlayConnectionEvents.DISCONNECT.register(this::onDisconnect); + prefix = new ChatPrefix( + Text.literal("[挂机] ").withColor(Colors.LIGHT_GRAY), + "afk", + true, + 10 + ); } - private void onDisconnect(ServerPlayNetworkHandler serverPlayNetworkHandler, MinecraftServer server) { - if (team != null) { - var name = serverPlayNetworkHandler.getPlayer().getName().getLiteralString(); - if (team.getPlayerList().contains(name)) { - team.getPlayerList().remove(name); - server.getPlayerManager().sendToAll(TeamS2CPacket.updateTeam(team, true)); - server.getPlayerManager().sendToAll(TeamS2CPacket.changePlayerTeam(team, name, TeamS2CPacket.Operation.REMOVE)); - } - } - } - - @Override - public void onEnable() { - if (team == null) { - team = new Team(serverSupplier.get().getScoreboard(), "afk"); - team.setPrefix(Text.literal("[挂机] ").withColor(Colors.LIGHT_GRAY)); - } - } private void onAFK(ServerPlayerEntity player, boolean afk) { if (afk) { @@ -56,31 +46,21 @@ public class AFKModule extends ServerModule { } private void enAFK(ServerPlayerEntity player) { - String playerName = player.getName().getLiteralString(); - team.getPlayerList().add(playerName); - player.server.getPlayerManager().sendToAll(TeamS2CPacket.updateTeam(team, true)); + chatPrefixModule.applyPrefix(player, prefix); player.server.getPlayerManager().broadcast( - Text.literal(" * " + playerName + " 正在挂机.").withColor(Colors.LIGHT_GRAY), + Text.literal(" * " + player.getName().getLiteralString() + " 正在挂机.").withColor(Colors.LIGHT_GRAY), false ); - SFCallbacks.PLAYER_AFK.invoker().onAFKStatus(player,true); + SFCallbacks.PLAYER_AFK.invoker().onAFKStatus(player, true); } public void deAFK(ServerPlayerEntity player) { String playerName = player.getName().getLiteralString(); - team.getPlayerList().remove(playerName); - player.server.getPlayerManager().sendToAll(TeamS2CPacket.updateTeam(team, true)); - player.server.getPlayerManager().sendToAll(TeamS2CPacket.changePlayerTeam(team, playerName, TeamS2CPacket.Operation.REMOVE)); + chatPrefixModule.removePrefix(player, prefix); player.server.getPlayerManager().broadcast( Text.literal(" * " + playerName + " 回来了.").withColor(Colors.LIGHT_GRAY), false ); - SFCallbacks.PLAYER_AFK.invoker().onAFKStatus(player,false); - } - - private void onJoin(ServerPlayNetworkHandler serverPlayNetworkHandler, PacketSender packetSender, MinecraftServer minecraftServer) { - if (team != null) { - packetSender.sendPacket(TeamS2CPacket.updateTeam(team, true)); - } + SFCallbacks.PLAYER_AFK.invoker().onAFKStatus(player, false); } } diff --git a/src/main/java/io/ib67/sfcraft/module/chat/ChatPrefix.java b/src/main/java/io/ib67/sfcraft/module/chat/ChatPrefix.java new file mode 100644 index 0000000..7ceb5ab --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/module/chat/ChatPrefix.java @@ -0,0 +1,34 @@ +package io.ib67.sfcraft.module.chat; + +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; + +import java.util.Comparator; +import java.util.Objects; + +public record ChatPrefix( + Text prefix, + String id, + boolean temporary, + int priority +) implements Comparable { + public ChatPrefix { + Objects.requireNonNull(id, "id cannot be null"); + Objects.requireNonNull(prefix, "prefix cannot be null"); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj != null && obj instanceof ChatPrefix && ((ChatPrefix) obj).id.equals(id); + } + + @Override + public int compareTo(@NotNull ChatPrefix o) { + return Integer.compare(priority, o.priority); + } +} diff --git a/src/main/java/io/ib67/sfcraft/module/chat/ChatPrefixModule.java b/src/main/java/io/ib67/sfcraft/module/chat/ChatPrefixModule.java new file mode 100644 index 0000000..82daf0c --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/module/chat/ChatPrefixModule.java @@ -0,0 +1,128 @@ +package io.ib67.sfcraft.module.chat; + +import com.google.inject.Inject; +import io.ib67.sfcraft.ServerModule; +import io.ib67.sfcraft.inject.MinecraftServerSupplier; +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.s2c.play.TeamS2CPacket; +import net.minecraft.scoreboard.Team; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.text.Text; + +import java.util.*; + +public class ChatPrefixModule extends ServerModule { + @Inject + private MinecraftServerSupplier serverSupplier; + private volatile ChatPrefix empty; + private final Map> playerPrefixes = new HashMap<>(); + private final Map virtualTeams = new HashMap<>(); + private final Map players = new HashMap<>(); + + @Override + public void onInitialize() { + ServerPlayConnectionEvents.JOIN.register(this::onJoin); + ServerPlayConnectionEvents.DISCONNECT.register(this::onDisconnect); + } + + @Override + public void onEnable() { + empty = new ChatPrefix( + Text.empty(), + "EMPTY", + true, + 1000 + ); + virtualTeams.put(empty.id(), createTeamFrom(empty)); + } + + private void onDisconnect(ServerPlayNetworkHandler serverPlayNetworkHandler, MinecraftServer minecraftServer) { + var player = serverPlayNetworkHandler.getPlayer(); + var current = getCurrentPrefix(player); + if (current.temporary()) { + removeFromTeam(player, players.get(player.getUuid())); + } + } + + private void onJoin(ServerPlayNetworkHandler networkHandler, PacketSender sender, MinecraftServer minecraftServer) { + for (Map.Entry uuidTeamEntry : players.entrySet()) { + var team = uuidTeamEntry.getValue(); + sender.sendPacket(TeamS2CPacket.updateTeam(team, true)); + } + } + + private void onPrefixUpdate(PlayerEntity player) { + var lastTeam = players.get(player.getUuid()); + var current = virtualTeams.get(playerPrefixes.get(player.getUuid()).getFirst().id()); + if (lastTeam == current) return; + if (lastTeam != null) removeFromTeam(player, lastTeam); + if (current == null) { + return; + } + addToTeam(player, current); + } + + private void addToTeam(PlayerEntity player, Team team) { + var playerName = player.getName().getLiteralString(); + team.getPlayerList().add(playerName); + sendToAll(TeamS2CPacket.updateTeam(team, true)); + players.put(player.getUuid(), team); + } + + private void removeFromTeam(PlayerEntity player, Team team) { + var playerName = player.getName().getLiteralString(); + team.getPlayerList().remove(playerName); + sendToAll(TeamS2CPacket.updateTeam(team, true)); + var current = getCurrentPrefix(player); + var newTeam = virtualTeams.get(current.id()); + addToTeam(player, newTeam); + } + + private void sendToAll(Packet packet) { + serverSupplier.get().getPlayerManager().sendToAll(packet); + } + + public void applyPrefix(PlayerEntity player, ChatPrefix prefix) { + if (hasPrefix(player.getUuid(), prefix)) { + return; + } + playerPrefixes.get(player.getUuid()).add(prefix); + onPrefixUpdate(player); + } + + public void removePrefix(PlayerEntity player, ChatPrefix prefix) { + if (!hasPrefix(player.getUuid(), prefix)) { + return; + } + playerPrefixes.get(player.getUuid()).remove(prefix); + onPrefixUpdate(player); + } + + public ChatPrefix getCurrentPrefix(PlayerEntity player) { + if (!playerPrefixes.containsKey(player.getUuid())) { + return null; + } + return playerPrefixes.get(player.getUuid()).first(); + + } + + public boolean hasPrefix(UUID player, ChatPrefix prefix) { + if (!virtualTeams.containsKey(prefix.id())) { + virtualTeams.put(prefix.id(), createTeamFrom(prefix)); + } + return playerPrefixes.computeIfAbsent(player, ignored -> new TreeSet<>(List.of(empty))).contains(prefix); + } + + private Team createTeamFrom(ChatPrefix prefix) { + var t = new Team( + serverSupplier.get().getScoreboard(), + prefix.id() + ); + t.setPrefix(prefix.prefix()); + return t; + } +} diff --git a/src/main/java/io/ib67/sfcraft/module/chat/ChatPingModule.java b/src/main/java/io/ib67/sfcraft/module/chat/decorator/ChatPingModule.java similarity index 97% rename from src/main/java/io/ib67/sfcraft/module/chat/ChatPingModule.java rename to src/main/java/io/ib67/sfcraft/module/chat/decorator/ChatPingModule.java index 4a6a320..3ac80a7 100644 --- a/src/main/java/io/ib67/sfcraft/module/chat/ChatPingModule.java +++ b/src/main/java/io/ib67/sfcraft/module/chat/decorator/ChatPingModule.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.module.chat; +package io.ib67.sfcraft.module.chat.decorator; import com.google.inject.Inject; import io.ib67.sfcraft.ServerModule; @@ -9,7 +9,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.message.MessageDecorator; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import net.minecraft.util.Colors; diff --git a/src/main/java/io/ib67/sfcraft/module/chat/ChatSendLocModule.java b/src/main/java/io/ib67/sfcraft/module/chat/decorator/ChatSendLocModule.java similarity index 96% rename from src/main/java/io/ib67/sfcraft/module/chat/ChatSendLocModule.java rename to src/main/java/io/ib67/sfcraft/module/chat/decorator/ChatSendLocModule.java index 74339cb..902ed49 100644 --- a/src/main/java/io/ib67/sfcraft/module/chat/ChatSendLocModule.java +++ b/src/main/java/io/ib67/sfcraft/module/chat/decorator/ChatSendLocModule.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.module.chat; +package io.ib67.sfcraft.module.chat.decorator; import com.google.inject.Inject; import io.ib67.sfcraft.ServerModule; @@ -6,7 +6,6 @@ import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator; import io.ib67.sfcraft.util.Helper; import io.ib67.sfcraft.util.SFConsts; import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffectUtil; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.network.message.MessageDecorator; import net.minecraft.registry.RegistryKey; diff --git a/src/main/java/io/ib67/sfcraft/module/chat/ReplaceHelper.java b/src/main/java/io/ib67/sfcraft/module/chat/decorator/ReplaceHelper.java similarity index 95% rename from src/main/java/io/ib67/sfcraft/module/chat/ReplaceHelper.java rename to src/main/java/io/ib67/sfcraft/module/chat/decorator/ReplaceHelper.java index dd9b010..be822e9 100644 --- a/src/main/java/io/ib67/sfcraft/module/chat/ReplaceHelper.java +++ b/src/main/java/io/ib67/sfcraft/module/chat/decorator/ReplaceHelper.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.module.chat; +package io.ib67.sfcraft.module.chat.decorator; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; diff --git a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java index 2a8e37e..32e5491 100644 --- a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java +++ b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java @@ -8,6 +8,8 @@ import io.ib67.sfcraft.ServerModule; import io.ib67.sfcraft.callback.SFCallbacks; import io.ib67.sfcraft.inject.MinecraftServerSupplier; import io.ib67.sfcraft.module.RoomModule; +import io.ib67.sfcraft.module.chat.ChatPrefix; +import io.ib67.sfcraft.module.chat.ChatPrefixModule; import io.ib67.sfcraft.registry.RoomRegistry; import io.ib67.sfcraft.room.RoomTeleporter; import io.ib67.sfcraft.room.create.CreativeSpaceFactory; @@ -29,8 +31,10 @@ import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.Colors; +import net.minecraft.world.GameMode; import org.jetbrains.annotations.NotNull; +import java.awt.*; import java.util.Set; public class CreativeRoomModule extends ServerModule { @@ -50,19 +54,24 @@ public class CreativeRoomModule extends ServerModule { private RoomModule roomModule; @Inject private MinecraftServerSupplier serverSupplier; + @Inject + private ChatPrefixModule chatPrefixModule; private CreativeSpaceRoom room; - private Team team; + private ChatPrefix prefix; @Override public void onInitialize() { + prefix = new ChatPrefix( + Text.literal("[PLAYGRD] ").withColor(Colors.LIGHT_YELLOW), + "playgrd", + true, + 20 + ); CommandRegistrationCallback.EVENT .register(this::registerCommand); - ServerPlayConnectionEvents.JOIN.register(this::onJoin); - ServerPlayConnectionEvents.DISCONNECT.register(this::onDisconnect); PermissionCheckEvent.EVENT.register(this::onWorldEdit); PermissionCheckEvent.EVENT.register(this::onOtherCommands); - SFCallbacks.PLAYER_AFK.register(this::onAFK); - room = new CreativeSpaceRoom(); + room = new CreativeSpaceRoom(this); roomRegistry.registerRoomType(CreativeSpaceRoom.class, CreativeSpaceRoom.WORLD, new CreativeSpaceFactory(room)); roomRegistry.createRoomOf(CreativeSpaceRoom.class, CreativeSpaceRoom.IDENTIFIER, null, (String) null); roomModule.enqueuePregen(CreativeSpaceRoom.WORLD, CreativeSpaceRoom.SPAWN_POS); @@ -92,44 +101,6 @@ public class CreativeRoomModule extends ServerModule { return TriState.DEFAULT; } - private void onAFK(ServerPlayerEntity player, boolean b) { - if (!b) { - player.server.getPlayerManager().sendToAll(TeamS2CPacket.changePlayerTeam(team, player.getName().getLiteralString(), TeamS2CPacket.Operation.ADD)); - player.server.getPlayerManager().sendToAll(TeamS2CPacket.updateTeam(team, true)); - } - } - - private void onDisconnect(ServerPlayNetworkHandler serverPlayNetworkHandler, MinecraftServer minecraftServer) { - ServerPlayerEntity player = serverPlayNetworkHandler.getPlayer(); - if (!RoomModule.isVirtual(player.getUuid())) { - return; - } - String playerName = player.getName().getLiteralString(); - team.getPlayerList().remove(playerName); - player.server.getPlayerManager().sendToAll(TeamS2CPacket.updateTeam(team, true)); - player.server.getPlayerManager().sendToAll(TeamS2CPacket.changePlayerTeam(team, playerName, TeamS2CPacket.Operation.REMOVE)); - } - - private void onJoin(ServerPlayNetworkHandler serverPlayNetworkHandler, PacketSender packetSender, MinecraftServer minecraftServer) { - ServerPlayerEntity player = serverPlayNetworkHandler.getPlayer(); - if (RoomModule.isVirtual(player.getUuid())) { - String playerName = player.getName().getLiteralString(); - team.getPlayerList().add(playerName); - } - player.server.getPlayerManager().sendToAll(TeamS2CPacket.updateTeam(team, true)); - packetSender.sendPacket(TeamS2CPacket.updateTeam(team, true)); - } - - - @Override - public void onEnable() { - if (team == null) { - team = new Team(serverSupplier.get().getScoreboard(), "playgrd"); - team.setPrefix(Text.literal("[游乐场] ").withColor(Colors.LIGHT_YELLOW)); - } - } - - private void registerCommand(CommandDispatcher dispatcher, CommandRegistryAccess registry, CommandManager.RegistrationEnvironment env) { dispatcher.register( @@ -144,4 +115,23 @@ public class CreativeRoomModule extends ServerModule { teleporter.teleportTo(room, player); return 0; } + + public void onPlayerJoin(ServerPlayerEntity player) { + player.sendMessage(Text.of("你现在正在创造游乐园中,使用 //schem list 查看可用投影。")); + player.sendMessage(Text.literal("以下功能现在可用:").withColor(Colors.WHITE) + .append(Text.literal("/player /track /summon /setblock /time /gamerule /weather 及 WorldEdit 的所有命令").withColor(Color.MAGENTA.getRGB()).append("。"))); + player.sendMessage(Text.of(" ")); + player.sendMessage(Text.literal("如何上传投影到游乐场: ").withColor(Colors.GRAY) + .append(Text.literal("https://github.com/saltedfishclub/sfcraft-schematics").withColor(Colors.GRAY).styled(it -> it.withUnderline(true))) ); + player.sendMessage(Text.literal("游乐园中的生物不能逃逸到其他维度。").withColor(Colors.GRAY)); + player.sendMessage(Text.literal("使用 /reco 或重新加入游戏即可离开。").withColor(Colors.GRAY)); + player.changeGameMode(GameMode.CREATIVE); + + chatPrefixModule.applyPrefix(player, prefix); + } + + public void onPlayerQuit(ServerPlayerEntity player) { + System.out.println(player.getUuid()); + chatPrefixModule.removePrefix(player, prefix); + } } diff --git a/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerManager.java b/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerManager.java index 95d4a4d..a34c94f 100644 --- a/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerManager.java +++ b/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerManager.java @@ -1,5 +1,6 @@ package io.ib67.sfcraft.room.create; +import io.ib67.sfcraft.module.room.CreativeRoomModule; import io.ib67.sfcraft.room.SimpleRoomPlayerManager; import io.ib67.sfcraft.subserver.Room; import io.ib67.sfcraft.subserver.RoomSession; @@ -7,12 +8,15 @@ import io.ib67.sfcraft.subserver.RoomSession; import java.util.UUID; public class CreativePlayerManager extends SimpleRoomPlayerManager { - protected CreativePlayerManager(Room room) { + protected final CreativeRoomModule module; + + protected CreativePlayerManager(Room room, CreativeRoomModule module) { super(room); + this.module = module; } @Override protected RoomSession createSession(UUID id) { - return new CreativePlayerSession(room); + return new CreativePlayerSession(room, module); } } diff --git a/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerSession.java b/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerSession.java index f815e94..67b29de 100644 --- a/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerSession.java +++ b/src/main/java/io/ib67/sfcraft/room/create/CreativePlayerSession.java @@ -1,5 +1,6 @@ package io.ib67.sfcraft.room.create; +import io.ib67.sfcraft.module.room.CreativeRoomModule; import io.ib67.sfcraft.subserver.Room; import io.ib67.sfcraft.subserver.RoomSession; import net.minecraft.server.network.ServerPlayerEntity; @@ -13,9 +14,11 @@ import java.util.UUID; public class CreativePlayerSession extends RoomSession { private final GlobalPos spawn; + protected final CreativeRoomModule module; - protected CreativePlayerSession(Room room) { + protected CreativePlayerSession(Room room, CreativeRoomModule module) { super(room); + this.module = module; spawn = new GlobalPos( CreativeSpaceRoom.WORLD, CreativeSpaceRoom.SPAWN_POS @@ -24,10 +27,7 @@ public class CreativePlayerSession extends RoomSession { @Override public void onPlayerJoin(ServerPlayerEntity player) { - player.sendMessage(Text.of("你现在正在创造游乐园中。")); - player.sendMessage(Text.literal("游乐园中的生物不能逃逸到其他维度。").withColor(Colors.GRAY)); - player.sendMessage(Text.literal("使用 /reco 或重新加入游戏即可离开。").withColor(Colors.GRAY)); - player.changeGameMode(GameMode.CREATIVE); + module.onPlayerJoin(player); } @Override @@ -42,6 +42,6 @@ public class CreativePlayerSession extends RoomSession { @Override public void onPlayerQuit(ServerPlayerEntity player) { - + module.onPlayerQuit(player); } } diff --git a/src/main/java/io/ib67/sfcraft/room/create/CreativeSpaceRoom.java b/src/main/java/io/ib67/sfcraft/room/create/CreativeSpaceRoom.java index 675e759..6c09ab5 100644 --- a/src/main/java/io/ib67/sfcraft/room/create/CreativeSpaceRoom.java +++ b/src/main/java/io/ib67/sfcraft/room/create/CreativeSpaceRoom.java @@ -1,5 +1,6 @@ package io.ib67.sfcraft.room.create; +import io.ib67.sfcraft.module.room.CreativeRoomModule; import io.ib67.sfcraft.subserver.Room; import io.ib67.sfcraft.subserver.RoomPlayerManager; import lombok.Getter; @@ -18,8 +19,8 @@ public class CreativeSpaceRoom implements Room { @Getter private final RoomPlayerManager playerManager; - public CreativeSpaceRoom() { - this.playerManager = new CreativePlayerManager(this); + public CreativeSpaceRoom(CreativeRoomModule module) { + this.playerManager = new CreativePlayerManager(this,module); } @Override