refactor: prefix module

This commit is contained in:
iceBear67 committed 2024-09-25 23:08:10 +08:00
1 parent 94599cd9e2
commit 2ed28d7508
11 files changed
+233 -96

No files matched your search

@@ -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
@@ -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);
}
}
@@ -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<ChatPrefix> {
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);
}
}
@@ -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<UUID, SortedSet<ChatPrefix>> playerPrefixes = new HashMap<>();
private final Map<String, Team> virtualTeams = new HashMap<>();
private final Map<UUID, Team> 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<UUID, Team> 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;
}
}
@@ -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;
@@ -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;
@@ -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;
@@ -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<ServerCommandSource> 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);
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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