From 3b71911ba0bf9478b4ef43c3c5ff66d4d07784a6 Mon Sep 17 00:00:00 2001 From: lionarius Date: Sat, 30 Nov 2024 00:37:27 +0300 Subject: [PATCH] backport to 1.20.3 --- .../SkinShuffleHandshakePayload.java | 16 +++--- .../SkinShuffleSkinRefreshV1Payload.java | 17 ++++--- .../SkinShuffleSkinRefreshV2Payload.java | 15 +++--- .../skinshuffle/SkinShuffleCompatibility.java | 29 +++++++---- .../platform/FabricCompatibilityHelper.java | 4 +- forge/build.gradle | 6 ++- .../skinshuffle/SkinShufflePacketHandler.java | 10 ++-- .../skinshuffle/SkinShuffleCompatibility.java | 5 +- .../SkinShuffleModEventHandler.java | 31 ----------- .../skinshuffle/SkinShufflePacketHandler.java | 51 +++++++++++++++++++ .../platform/NeoForgeCompatibilityHelper.java | 2 +- 11 files changed, 110 insertions(+), 76 deletions(-) delete mode 100644 neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleModEventHandler.java create mode 100644 neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShufflePacketHandler.java diff --git a/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleHandshakePayload.java b/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleHandshakePayload.java index 798ed92..b4afa59 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleHandshakePayload.java +++ b/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleHandshakePayload.java @@ -1,19 +1,23 @@ package net.lionarius.skinrestorer.compat.skinshuffle; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; public record SkinShuffleHandshakePayload() implements CustomPacketPayload { - + public static final SkinShuffleHandshakePayload INSTANCE = new SkinShuffleHandshakePayload(); - - public static final CustomPacketPayload.Type PACKET_ID = new CustomPacketPayload.Type<>(SkinShuffleCompatibility.resourceLocation("handshake")); - public static final StreamCodec PACKET_CODEC = StreamCodec.unit(INSTANCE); + + public static final ResourceLocation PACKET_ID = SkinShuffleCompatibility.resourceLocation("handshake"); + + @Override + public void write(@NotNull FriendlyByteBuf buf) { + // NO-OP + } @Override - public CustomPacketPayload.@NotNull Type type() { + public @NotNull ResourceLocation id() { return PACKET_ID; } } diff --git a/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV1Payload.java b/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV1Payload.java index 8892357..6a3132b 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV1Payload.java +++ b/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV1Payload.java @@ -2,18 +2,14 @@ package net.lionarius.skinrestorer.compat.skinshuffle; import com.mojang.authlib.properties.Property; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; public record SkinShuffleSkinRefreshV1Payload( Property textureProperty) implements CustomPacketPayload, SkinShuffleSkinRefreshPayload { - public static final CustomPacketPayload.Type PACKET_ID = new CustomPacketPayload.Type<>(SkinShuffleCompatibility.resourceLocation("refresh")); - public static final StreamCodec PACKET_CODEC = StreamCodec.of( - SkinShuffleSkinRefreshV1Payload::encode, - SkinShuffleSkinRefreshV1Payload::decode - ); + public static final ResourceLocation PACKET_ID = SkinShuffleCompatibility.resourceLocation("refresh"); public static void encode(FriendlyByteBuf buf, SkinShuffleSkinRefreshV1Payload value) { var textureProperty = value.textureProperty(); @@ -22,13 +18,18 @@ public record SkinShuffleSkinRefreshV1Payload( buf.writeUtf(textureProperty.value()); buf.writeNullable(textureProperty.signature(), FriendlyByteBuf::writeUtf); } - + public static SkinShuffleSkinRefreshV1Payload decode(FriendlyByteBuf buf) { return new SkinShuffleSkinRefreshV1Payload(new Property(buf.readUtf(), buf.readUtf(), buf.readNullable(FriendlyByteBuf::readUtf))); } @Override - public @NotNull CustomPacketPayload.Type type() { + public void write(@NotNull FriendlyByteBuf buf) { + encode(buf, this); + } + + @Override + public @NotNull ResourceLocation id() { return PACKET_ID; } } diff --git a/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV2Payload.java b/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV2Payload.java index 177fef9..82cab98 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV2Payload.java +++ b/common/src/main/java/net/lionarius/skinrestorer/compat/skinshuffle/SkinShuffleSkinRefreshV2Payload.java @@ -2,18 +2,14 @@ package net.lionarius.skinrestorer.compat.skinshuffle; import com.mojang.authlib.properties.Property; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; public record SkinShuffleSkinRefreshV2Payload( Property textureProperty) implements CustomPacketPayload, SkinShuffleSkinRefreshPayload { - public static final CustomPacketPayload.Type PACKET_ID = new CustomPacketPayload.Type<>(SkinShuffleCompatibility.resourceLocation("skin_refresh")); - public static final StreamCodec PACKET_CODEC = StreamCodec.of( - SkinShuffleSkinRefreshV2Payload::encode, - SkinShuffleSkinRefreshV2Payload::decode - ); + public static final ResourceLocation PACKET_ID = SkinShuffleCompatibility.resourceLocation("skin_refresh"); public static void encode(FriendlyByteBuf buf, SkinShuffleSkinRefreshV2Payload value) { var textureProperty = value.textureProperty(); @@ -36,7 +32,12 @@ public record SkinShuffleSkinRefreshV2Payload( } @Override - public @NotNull CustomPacketPayload.Type type() { + public void write(@NotNull FriendlyByteBuf buf) { + encode(buf, this); + } + + @Override + public @NotNull ResourceLocation id() { return PACKET_ID; } } diff --git a/fabric/src/main/java/net/lionarius/skinrestorer/fabric/compat/skinshuffle/SkinShuffleCompatibility.java b/fabric/src/main/java/net/lionarius/skinrestorer/fabric/compat/skinshuffle/SkinShuffleCompatibility.java index 662ae14..5b77b27 100644 --- a/fabric/src/main/java/net/lionarius/skinrestorer/fabric/compat/skinshuffle/SkinShuffleCompatibility.java +++ b/fabric/src/main/java/net/lionarius/skinrestorer/fabric/compat/skinshuffle/SkinShuffleCompatibility.java @@ -1,14 +1,17 @@ package net.lionarius.skinrestorer.fabric.compat.skinshuffle; -import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.lionarius.skinrestorer.SkinRestorer; -import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleHandshakePayload; import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleSkinRefreshPayload; import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleSkinRefreshV1Payload; import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleSkinRefreshV2Payload; import net.lionarius.skinrestorer.fabric.SkinRestorerFabric; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; public final class SkinShuffleCompatibility { @@ -20,18 +23,24 @@ public final class SkinShuffleCompatibility { return; } - PayloadTypeRegistry.playS2C().register(SkinShuffleHandshakePayload.PACKET_ID, SkinShuffleHandshakePayload.PACKET_CODEC); - PayloadTypeRegistry.playC2S().register(SkinShuffleSkinRefreshV1Payload.PACKET_ID, SkinShuffleSkinRefreshV1Payload.PACKET_CODEC); - PayloadTypeRegistry.playC2S().register(SkinShuffleSkinRefreshV2Payload.PACKET_ID, SkinShuffleSkinRefreshV2Payload.PACKET_CODEC); - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility.onPlayerJoin(handler.getPlayer())); - ServerPlayNetworking.registerGlobalReceiver(SkinShuffleSkinRefreshV1Payload.PACKET_ID, SkinShuffleCompatibility::handleSkinRefreshPacket); + ServerPlayNetworking.registerGlobalReceiver(SkinShuffleSkinRefreshV1Payload.PACKET_ID, SkinShuffleCompatibility::handleSkinRefreshV1Packet); - ServerPlayNetworking.registerGlobalReceiver(SkinShuffleSkinRefreshV2Payload.PACKET_ID, SkinShuffleCompatibility::handleSkinRefreshPacket); + ServerPlayNetworking.registerGlobalReceiver(SkinShuffleSkinRefreshV2Payload.PACKET_ID, SkinShuffleCompatibility::handleSkinRefreshV2Packet); } - private static void handleSkinRefreshPacket(SkinShuffleSkinRefreshPayload payload, ServerPlayNetworking.Context context) { - net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility.handleSkinRefresh(context.player().getServer(), context.player(), payload); + private static void handleSkinRefreshV1Packet(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl listener, FriendlyByteBuf buf, PacketSender sender) { + var payload = SkinShuffleSkinRefreshV1Payload.decode(buf); + SkinShuffleCompatibility.handleSkinRefreshPacket(payload, server, player); + } + + private static void handleSkinRefreshV2Packet(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl listener, FriendlyByteBuf buf, PacketSender sender) { + var payload = SkinShuffleSkinRefreshV2Payload.decode(buf); + SkinShuffleCompatibility.handleSkinRefreshPacket(payload, server, player); + } + + private static void handleSkinRefreshPacket(SkinShuffleSkinRefreshPayload payload, MinecraftServer server, ServerPlayer player) { + net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility.handleSkinRefresh(server, player, payload); } } diff --git a/fabric/src/main/java/net/lionarius/skinrestorer/fabric/platform/FabricCompatibilityHelper.java b/fabric/src/main/java/net/lionarius/skinrestorer/fabric/platform/FabricCompatibilityHelper.java index c8d7588..706ac01 100644 --- a/fabric/src/main/java/net/lionarius/skinrestorer/fabric/platform/FabricCompatibilityHelper.java +++ b/fabric/src/main/java/net/lionarius/skinrestorer/fabric/platform/FabricCompatibilityHelper.java @@ -1,13 +1,13 @@ package net.lionarius.skinrestorer.fabric.platform; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleHandshakePayload; import net.lionarius.skinrestorer.platform.services.CompatibilityHelper; +import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; import net.minecraft.server.level.ServerPlayer; public final class FabricCompatibilityHelper implements CompatibilityHelper { @Override public void skinShuffle_sendHandshake(ServerPlayer player) { - ServerPlayNetworking.send(player, SkinShuffleHandshakePayload.INSTANCE); + player.connection.send(new ServerboundCustomPayloadPacket(SkinShuffleHandshakePayload.INSTANCE)); } } diff --git a/forge/build.gradle b/forge/build.gradle index e3b12c2..173721d 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -17,12 +17,14 @@ mixin { jarJar.enable() +tasks.named('jar') { + archiveClassifier = 'thin' +} + tasks.named('jarJar') { archiveClassifier = '' } -jar.finalizedBy('jarJar') - minecraft { mappings channel: 'parchment', version: "${parchment_version}-${parchment_minecraft}" diff --git a/forge/src/main/java/net/lionarius/skinrestorer/forge/compat/skinshuffle/SkinShufflePacketHandler.java b/forge/src/main/java/net/lionarius/skinrestorer/forge/compat/skinshuffle/SkinShufflePacketHandler.java index 9f6ba68..2b02632 100644 --- a/forge/src/main/java/net/lionarius/skinrestorer/forge/compat/skinshuffle/SkinShufflePacketHandler.java +++ b/forge/src/main/java/net/lionarius/skinrestorer/forge/compat/skinshuffle/SkinShufflePacketHandler.java @@ -14,18 +14,18 @@ public class SkinShufflePacketHandler { } private static final EventNetworkChannel HANDSHAKE_INSTANCE = ChannelBuilder - .named(SkinShuffleHandshakePayload.PACKET_ID.id()) + .named(SkinShuffleHandshakePayload.PACKET_ID) .optional() .eventNetworkChannel(); private static final EventNetworkChannel SKIN_REFRESH_V1_INSTANCE = ChannelBuilder - .named(SkinShuffleSkinRefreshV1Payload.PACKET_ID.id()) + .named(SkinShuffleSkinRefreshV1Payload.PACKET_ID) .optional() .eventNetworkChannel() .addListener(SkinShufflePacketHandler::skinRefreshV1Listener); private static final EventNetworkChannel SKIN_REFRESH_V2_INSTANCE = ChannelBuilder - .named(SkinShuffleSkinRefreshV2Payload.PACKET_ID.id()) + .named(SkinShuffleSkinRefreshV2Payload.PACKET_ID) .optional() .eventNetworkChannel() .addListener(SkinShufflePacketHandler::skinRefreshV2Listener); @@ -39,12 +39,12 @@ public class SkinShufflePacketHandler { } private static void skinRefreshV1Listener(CustomPayloadEvent event) { - var payload = SkinShuffleSkinRefreshV1Payload.PACKET_CODEC.decode(event.getPayload()); + var payload = SkinShuffleSkinRefreshV1Payload.decode(event.getPayload()); handleSkinRefreshPacket(payload, event.getSource()); } private static void skinRefreshV2Listener(CustomPayloadEvent event) { - var payload = SkinShuffleSkinRefreshV2Payload.PACKET_CODEC.decode(event.getPayload()); + var payload = SkinShuffleSkinRefreshV2Payload.decode(event.getPayload()); handleSkinRefreshPacket(payload, event.getSource()); } diff --git a/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleCompatibility.java b/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleCompatibility.java index 702ea67..404cabd 100644 --- a/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleCompatibility.java +++ b/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleCompatibility.java @@ -1,7 +1,5 @@ package net.lionarius.skinrestorer.neoforge.compat.skinshuffle; -import net.lionarius.skinrestorer.SkinRestorer; -import net.neoforged.fml.ModList; import net.neoforged.neoforge.common.NeoForge; public final class SkinShuffleCompatibility { @@ -11,7 +9,6 @@ public final class SkinShuffleCompatibility { public static void initialize() { NeoForge.EVENT_BUS.register(SkinShuffleGameEventHandler.class); - final var mod = ModList.get().getModContainerById(SkinRestorer.MOD_ID).get(); - mod.getEventBus().register(SkinShuffleModEventHandler.class); + SkinShufflePacketHandler.initialize(); } } diff --git a/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleModEventHandler.java b/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleModEventHandler.java deleted file mode 100644 index 6036393..0000000 --- a/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShuffleModEventHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.lionarius.skinrestorer.neoforge.compat.skinshuffle; - -import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility; -import net.lionarius.skinrestorer.compat.skinshuffle.*; -import net.minecraft.server.level.ServerPlayer; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; -import net.neoforged.neoforge.network.handling.IPayloadContext; -import net.neoforged.neoforge.network.registration.HandlerThread; - -public final class SkinShuffleModEventHandler { - private SkinShuffleModEventHandler() {} - - @SubscribeEvent - public static void onRegisterPayloadHandlers(RegisterPayloadHandlersEvent event) { - final var registrar = event.registrar("1").optional().executesOn(HandlerThread.NETWORK); - - registrar - .playToClient(SkinShuffleHandshakePayload.PACKET_ID, SkinShuffleHandshakePayload.PACKET_CODEC, - (payload, context) -> {}) - .playToServer(SkinShuffleSkinRefreshV1Payload.PACKET_ID, SkinShuffleSkinRefreshV1Payload.PACKET_CODEC, - SkinShuffleModEventHandler::handleSkinRefreshPacket) - .playToServer(SkinShuffleSkinRefreshV2Payload.PACKET_ID, SkinShuffleSkinRefreshV2Payload.PACKET_CODEC, - SkinShuffleModEventHandler::handleSkinRefreshPacket); - } - - private static void handleSkinRefreshPacket(SkinShuffleSkinRefreshPayload payload, IPayloadContext context) { - var player = (ServerPlayer) context.player(); - SkinShuffleCompatibility.handleSkinRefresh(player.getServer(), player, payload); - } -} diff --git a/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShufflePacketHandler.java b/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShufflePacketHandler.java new file mode 100644 index 0000000..9280c14 --- /dev/null +++ b/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/compat/skinshuffle/SkinShufflePacketHandler.java @@ -0,0 +1,51 @@ +package net.lionarius.skinrestorer.neoforge.compat.skinshuffle; + +import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility; +import net.lionarius.skinrestorer.compat.skinshuffle.*; +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.network.NetworkRegistry; +import net.neoforged.neoforge.network.event.EventNetworkChannel; + +public final class SkinShufflePacketHandler { + private SkinShufflePacketHandler() { + } + + // there is no need for handshake channel but register it to not allow other mods to use it + private static final EventNetworkChannel HANDSHAKE_INSTANCE = NetworkRegistry.ChannelBuilder + .named(SkinShuffleHandshakePayload.PACKET_ID) + .serverAcceptedVersions(NetworkRegistry.acceptMissingOr("1")) + .clientAcceptedVersions(NetworkRegistry.acceptMissingOr("1")) + .eventNetworkChannel(); + + private static final EventNetworkChannel SKIN_REFRESH_V1_INSTANCE = NetworkRegistry.ChannelBuilder + .named(SkinShuffleSkinRefreshV1Payload.PACKET_ID) + .serverAcceptedVersions(NetworkRegistry.acceptMissingOr("1")) + .clientAcceptedVersions(NetworkRegistry.acceptMissingOr("1")) + .eventNetworkChannel(); + + private static final EventNetworkChannel SKIN_REFRESH_V2_INSTANCE = NetworkRegistry.ChannelBuilder + .named(SkinShuffleSkinRefreshV2Payload.PACKET_ID) + .serverAcceptedVersions(NetworkRegistry.acceptMissingOr("1")) + .clientAcceptedVersions(NetworkRegistry.acceptMissingOr("1")) + .eventNetworkChannel(); + + static void initialize() { + SKIN_REFRESH_V1_INSTANCE.addListener(SkinShufflePacketHandler::skinRefreshV1Listener); + SKIN_REFRESH_V2_INSTANCE.addListener(SkinShufflePacketHandler::skinRefreshV2Listener); + } + + private static void skinRefreshV1Listener(NetworkEvent.ServerCustomPayloadEvent event) { + var payload = SkinShuffleSkinRefreshV1Payload.decode(event.getPayload()); + handleSkinRefreshPacket(payload, event.getSource()); + } + + private static void skinRefreshV2Listener(NetworkEvent.ServerCustomPayloadEvent event) { + var payload = SkinShuffleSkinRefreshV2Payload.decode(event.getPayload()); + handleSkinRefreshPacket(payload, event.getSource()); + } + + private static void handleSkinRefreshPacket(SkinShuffleSkinRefreshPayload payload, NetworkEvent.Context context) { + var player = context.getSender(); + SkinShuffleCompatibility.handleSkinRefresh(player.getServer(), player, payload); + } +} diff --git a/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/platform/NeoForgeCompatibilityHelper.java b/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/platform/NeoForgeCompatibilityHelper.java index 4cd9a0c..b488b12 100644 --- a/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/platform/NeoForgeCompatibilityHelper.java +++ b/neoforge/src/main/java/net/lionarius/skinrestorer/neoforge/platform/NeoForgeCompatibilityHelper.java @@ -10,6 +10,6 @@ public final class NeoForgeCompatibilityHelper implements CompatibilityHelper { @Override public void skinShuffle_sendHandshake(ServerPlayer player) { // we can't use the packet distributor here because neoforge doesn't support sending packets to non-neoforge players - player.connection.getConnection().send(new ClientboundCustomPayloadPacket(SkinShuffleHandshakePayload.INSTANCE)); + player.connection.connection.send(new ClientboundCustomPayloadPacket(SkinShuffleHandshakePayload.INSTANCE)); } }