diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java index 4d5e969b..a6407b37 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.GameRules; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; +import org.leavesmc.leaves.protocol.core.Context; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; import org.leavesmc.leaves.protocol.core.ProtocolUtils; @@ -16,6 +17,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.UUID; @LeavesProtocol.Register(namespace = "appleskin") public class AppleSkinProtocol implements LeavesProtocol { @@ -32,7 +34,7 @@ public class AppleSkinProtocol implements LeavesProtocol { private static final Map previousExhaustionLevels = new HashMap<>(); private static final Map previousNaturalRegeneration = new HashMap<>(); - private static final Map> subscribedChannels = new HashMap<>(); + private static final Map> subscribedChannels = new HashMap<>(); @Contract("_ -> new") public static ResourceLocation id(String path) { @@ -46,21 +48,24 @@ public class AppleSkinProtocol implements LeavesProtocol { @ProtocolHandler.PlayerLeave public static void onPlayerLoggedOut(@NotNull ServerPlayer player) { - subscribedChannels.remove(player); + subscribedChannels.remove(player.getUUID()); resetPlayerData(player); } @ProtocolHandler.MinecraftRegister(onlyNamespace = true) - public static void onPlayerSubscribed(@NotNull ServerPlayer player, ResourceLocation id) { - subscribedChannels.computeIfAbsent(player, k -> new HashSet<>()).add(id.getPath()); + public static void onPlayerSubscribed(@NotNull Context context, ResourceLocation id) { + subscribedChannels.computeIfAbsent(context.profile().getId(), k -> new HashSet<>()).add(id.getPath()); } @ProtocolHandler.Ticker public static void tick() { - for (Map.Entry> entry : subscribedChannels.entrySet()) { - ServerPlayer player = entry.getKey(); - FoodData data = player.getFoodData(); + for (Map.Entry> entry : subscribedChannels.entrySet()) { + ServerPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(entry.getKey()); + if (player == null) { + continue; + } + FoodData data = player.getFoodData(); for (String channel : entry.getValue()) { switch (channel) { case "saturation" -> { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/Context.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/Context.java new file mode 100644 index 00000000..ca17fdb0 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/Context.java @@ -0,0 +1,9 @@ +package org.leavesmc.leaves.protocol.core; + +import com.mojang.authlib.GameProfile; +import net.minecraft.network.Connection; +import org.jetbrains.annotations.NotNull; + +public record Context(@NotNull GameProfile profile, Connection connection) { + +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/IdentifierSelector.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/IdentifierSelector.java new file mode 100644 index 00000000..3fe9d894 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/IdentifierSelector.java @@ -0,0 +1,11 @@ +package org.leavesmc.leaves.protocol.core; + +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.Nullable; + +public record IdentifierSelector(@Nullable Context context, @Nullable ServerPlayer player) { + + public Object select(ProtocolHandler.Stage stage) { + return stage == ProtocolHandler.Stage.CONFIGURATION ? context : player; + } +} \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java index 4c7bf96c..f6300c8e 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java @@ -218,27 +218,27 @@ public class LeavesProtocolManager { codec.encode(ProtocolUtils.decorate(buf), payload); } - public static void handlePayload(ServerPlayer player, LeavesCustomPayload payload) { + public static void handlePayload(IdentifierSelector selector, LeavesCustomPayload payload) { PayloadReceiverInvokerHolder holder; if ((holder = PAYLOAD_RECEIVERS.get(payload.getClass())) != null) { - holder.invoke(player, payload); + holder.invoke(selector, payload); } } - public static boolean handleBytebuf(ServerPlayer player, ResourceLocation location, ByteBuf buf) { + public static boolean handleBytebuf(IdentifierSelector selector, ResourceLocation location, ByteBuf buf) { RegistryFriendlyByteBuf buf1 = ProtocolUtils.decorate(buf); BytebufReceiverInvokerHolder holder; if ((holder = STRICT_BYTEBUF_RECEIVERS.get(location.toString())) != null) { - holder.invoke(player, buf1); + holder.invoke(selector, buf1); return true; } if ((holder = NAMESPACED_BYTEBUF_RECEIVERS.get(location.getNamespace())) != null) { - if (holder.invoke(player, buf1)) { + if (holder.invoke(selector, buf1)) { return true; } } for (var holder1 : GENERIC_BYTEBUF_RECEIVERS) { - if (holder1.invoke(player, buf1)) { + if (holder1.invoke(selector, buf1)) { return true; } } @@ -278,22 +278,22 @@ public class LeavesProtocolManager { } } - public static void handleMinecraftRegister(String channelId, ServerPlayer player) { + public static void handleMinecraftRegister(String channelId, IdentifierSelector selector) { ResourceLocation location = ResourceLocation.tryParse(channelId); if (location == null) { return; } for (var wildHolder : WILD_MINECRAFT_REGISTER) { - wildHolder.invoke(player, location); + wildHolder.invoke(selector, location); } MinecraftRegisterInvokerHolder holder; if ((holder = STRICT_MINECRAFT_REGISTER.get(location.toString())) != null) { - holder.invoke(player, location); + holder.invoke(selector, location); } if ((holder = NAMESPACED_MINECRAFT_REGISTER.get(location.getNamespace())) != null) { - holder.invoke(player, location); + holder.invoke(selector, location); } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java index 0a36db38..5aefe65d 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java @@ -1,5 +1,7 @@ package org.leavesmc.leaves.protocol.core; +import net.minecraft.server.level.ServerPlayer; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -16,6 +18,8 @@ public class ProtocolHandler { @Retention(RetentionPolicy.RUNTIME) public @interface PayloadReceiver { Class payload(); + + Stage stage() default Stage.GAME; } @Target(ElementType.METHOD) @@ -24,6 +28,8 @@ public class ProtocolHandler { String key() default ""; boolean onlyNamespace() default false; + + Stage stage() default Stage.GAME; } @Target(ElementType.METHOD) @@ -53,10 +59,27 @@ public class ProtocolHandler { String key() default ""; boolean onlyNamespace() default false; + + Stage stage() default Stage.CONFIGURATION; } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ReloadDataPack { } + + public enum Stage { + CONFIGURATION(Context.class), + GAME(ServerPlayer.class); + + private final Class identifier; + + Stage(Class identifier) { + this.identifier = identifier; + } + + public Class identifier() { + return identifier; + } + } } \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java index e2c01b8e..958ba57b 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java @@ -1,7 +1,7 @@ package org.leavesmc.leaves.protocol.core.invoker; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; +import org.leavesmc.leaves.protocol.core.IdentifierSelector; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; @@ -9,10 +9,10 @@ import java.lang.reflect.Method; public class BytebufReceiverInvokerHolder extends AbstractInvokerHolder { public BytebufReceiverInvokerHolder(LeavesProtocol owner, Method invoker, ProtocolHandler.BytebufReceiver handler) { - super(owner, invoker, handler, null, ServerPlayer.class, FriendlyByteBuf.class); + super(owner, invoker, handler, null, handler.stage().identifier(), FriendlyByteBuf.class); } - public boolean invoke(ServerPlayer player, FriendlyByteBuf buf) { - return invoke0(false, player, buf) instanceof Boolean b && b; + public boolean invoke(IdentifierSelector selector, FriendlyByteBuf buf) { + return invoke0(false, selector.select(handler.stage()), buf) instanceof Boolean b && b; } -} +} \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java index c6766bc7..caa18b77 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java @@ -2,6 +2,7 @@ package org.leavesmc.leaves.protocol.core.invoker; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import org.leavesmc.leaves.protocol.core.IdentifierSelector; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; @@ -9,10 +10,10 @@ import java.lang.reflect.Method; public class MinecraftRegisterInvokerHolder extends AbstractInvokerHolder { public MinecraftRegisterInvokerHolder(LeavesProtocol owner, Method invoker, ProtocolHandler.MinecraftRegister handler) { - super(owner, invoker, handler, null, ServerPlayer.class, ResourceLocation.class); + super(owner, invoker, handler, null, handler.stage().identifier(), ResourceLocation.class); } - public void invoke(ServerPlayer player, ResourceLocation id) { - invoke0(false, player, id); + public void invoke(IdentifierSelector selector, ResourceLocation id) { + invoke0(false, selector.select(handler.stage()), id); } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java index bed868b5..a89741e4 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java @@ -1,6 +1,6 @@ package org.leavesmc.leaves.protocol.core.invoker; -import net.minecraft.server.level.ServerPlayer; +import org.leavesmc.leaves.protocol.core.IdentifierSelector; import org.leavesmc.leaves.protocol.core.LeavesCustomPayload; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; @@ -9,10 +9,10 @@ import java.lang.reflect.Method; public class PayloadReceiverInvokerHolder extends AbstractInvokerHolder { public PayloadReceiverInvokerHolder(LeavesProtocol owner, Method invoker, ProtocolHandler.PayloadReceiver handler) { - super(owner, invoker, handler, null, ServerPlayer.class, handler.payload()); + super(owner, invoker, handler, null,handler.stage().identifier(), handler.payload()); } - public void invoke(ServerPlayer player, LeavesCustomPayload payload) { - invoke0(false, player, payload); + public void invoke(IdentifierSelector selector, LeavesCustomPayload payload) { + invoke0(false, selector.select(handler.stage()), payload); } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java index 1af1cdb2..8c32ecf3 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java @@ -177,7 +177,7 @@ public class REIServerProtocol implements LeavesProtocol { }); } - @ProtocolHandler.MinecraftRegister(onlyNamespace = true) + @ProtocolHandler.MinecraftRegister(onlyNamespace = true, stage = ProtocolHandler.Stage.GAME) public static void onPlayerSubscribed(@NotNull ServerPlayer player, ResourceLocation location) { enabledPlayers.add(player); String channel = location.getPath();