diff --git a/src/main/java/org/samo_lego/fabrictailor/FabricTailor.java b/src/main/java/org/samo_lego/fabrictailor/FabricTailor.java index 4b9d59f..74e0a31 100644 --- a/src/main/java/org/samo_lego/fabrictailor/FabricTailor.java +++ b/src/main/java/org/samo_lego/fabrictailor/FabricTailor.java @@ -3,6 +3,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.ServerConfigurationConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -14,13 +15,14 @@ import org.samo_lego.fabrictailor.compatibility.CarpetFunctions; import org.samo_lego.fabrictailor.config.TailorConfig; import org.samo_lego.fabrictailor.network.NetworkHandler; +import org.samo_lego.fabrictailor.network.payload.DefaultSkinPayload; +import org.samo_lego.fabrictailor.network.payload.HDSkinPayload; +import org.samo_lego.fabrictailor.network.payload.VanillaSkinPayload; import java.io.File; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static org.samo_lego.fabrictailor.network.SkinPackets.*; - public class FabricTailor implements ModInitializer { private static final Logger LOGGER = LogManager.getLogger(); @@ -29,6 +31,10 @@ public class FabricTailor implements ModInitializer { public static File configFile; public static final ExecutorService THREADPOOL = Executors.newCachedThreadPool(); + public static void errorLog(String error) { + LOGGER.error("[FabricTailor] An error occurred: {}", error); + } + @Override public void onInitialize() { CommandRegistrationCallback.EVENT.register((dispatcher, context, selection) -> { @@ -47,14 +53,17 @@ public void onInitialize() { ServerPlayConnectionEvents.INIT.register(NetworkHandler::onInit); + ServerConfigurationConnectionEvents.CONFIGURE.register(NetworkHandler::onConfigured); - ServerPlayNetworking.registerGlobalReceiver(FABRICTAILOR_VANILLA_CHANGE, NetworkHandler::changeVanillaSkinPacket); - ServerPlayNetworking.registerGlobalReceiver(FABRICTAILOR_HD_CHANGE, NetworkHandler::changeHDSkinPacket); - ServerPlayNetworking.registerGlobalReceiver(FABRICTAILOR_DEFAULT_SKIN, NetworkHandler::defaultSkinPacket); - } - public static void errorLog(String error) { - LOGGER.error("[FabricTailor] An error occurred: " + error); + PayloadTypeRegistry.playC2S().register(VanillaSkinPayload.TYPE, VanillaSkinPayload.CODEC); + ServerPlayNetworking.registerGlobalReceiver(VanillaSkinPayload.TYPE, NetworkHandler::changeVanillaSkinPacket); + + PayloadTypeRegistry.playC2S().register(HDSkinPayload.TYPE, HDSkinPayload.CODEC); + ServerPlayNetworking.registerGlobalReceiver(HDSkinPayload.TYPE, NetworkHandler::changeHDSkinPacket); + + PayloadTypeRegistry.playC2S().register(DefaultSkinPayload.TYPE, DefaultSkinPayload.CODEC); + ServerPlayNetworking.registerGlobalReceiver(DefaultSkinPayload.TYPE, NetworkHandler::defaultSkinPacket); } public static void reloadConfig() { diff --git a/src/main/java/org/samo_lego/fabrictailor/client/ClientTailor.java b/src/main/java/org/samo_lego/fabrictailor/client/ClientTailor.java index 7f6d360..ff981de 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/ClientTailor.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/ClientTailor.java @@ -8,11 +8,12 @@ import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking; import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import org.lwjgl.glfw.GLFW; import org.samo_lego.fabrictailor.client.screen.SkinChangeScreen; -import org.samo_lego.fabrictailor.network.SkinPackets; +import org.samo_lego.fabrictailor.network.payload.FabricTailorHelloPayload; import org.samo_lego.fabrictailor.util.TextTranslations; /** @@ -61,9 +62,10 @@ public void onInitializeClient() { forceOpen = false; }); - ClientConfigurationNetworking.registerGlobalReceiver(SkinPackets.FT_HELLO, (client, handler, buf, responseSender) -> { + PayloadTypeRegistry.configurationS2C().register(FabricTailorHelloPayload.TYPE, FabricTailorHelloPayload.CODEC); + ClientConfigurationNetworking.registerGlobalReceiver(FabricTailorHelloPayload.TYPE, (payload, context) -> { TAILORED_SERVER = true; - ALLOW_DEFAULT_SKIN = buf.readBoolean(); + ALLOW_DEFAULT_SKIN = payload.allowSkinButton(); }); } } diff --git a/src/main/java/org/samo_lego/fabrictailor/client/network/SkinChangePacket.java b/src/main/java/org/samo_lego/fabrictailor/client/network/SkinChangePacket.java deleted file mode 100644 index 29ced90..0000000 --- a/src/main/java/org/samo_lego/fabrictailor/client/network/SkinChangePacket.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.samo_lego.fabrictailor.client.network; - -import com.mojang.authlib.properties.Property; -import io.netty.buffer.Unpooled; -import net.fabricmc.fabric.impl.networking.client.ClientNetworkingImpl; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.common.ServerCommonPacketListener; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; - -import static org.samo_lego.fabrictailor.FabricTailor.MOD_ID; - -public class SkinChangePacket { - public static final ResourceLocation FABRICTAILOR_CHANNEL = new ResourceLocation(MOD_ID, "skin_change"); - - public static Packet create(@NotNull Property skinData) { - return ClientNetworkingImpl.createC2SPacket(FABRICTAILOR_CHANNEL, generateSkinData(skinData.value(), skinData.signature())); - } - - private static FriendlyByteBuf generateSkinData(String value, String signature) { - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); - buf.writeUtf(value); - buf.writeUtf(signature); - - return buf; - } -} diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java index fc62ee8..691bc43 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java @@ -1,16 +1,12 @@ package org.samo_lego.fabrictailor.client.screen; import com.mojang.authlib.properties.PropertyMap; -import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.ChatFormatting; import net.minecraft.Util; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Checkbox; @@ -19,12 +15,14 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.advancements.AdvancementsScreen; import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; -import org.joml.Quaternionf; import org.samo_lego.fabrictailor.casts.TailoredPlayer; -import org.samo_lego.fabrictailor.client.screen.tabs.*; +import org.samo_lego.fabrictailor.client.screen.tabs.CapeTab; +import org.samo_lego.fabrictailor.client.screen.tabs.LocalSkinTab; +import org.samo_lego.fabrictailor.client.screen.tabs.PlayerSkinTab; +import org.samo_lego.fabrictailor.client.screen.tabs.SkinTabType; +import org.samo_lego.fabrictailor.client.screen.tabs.UrlSkinTab; import org.samo_lego.fabrictailor.mixin.client.AAbstractClientPlayer; import org.samo_lego.fabrictailor.util.TextTranslations; @@ -164,7 +162,7 @@ private void applyNewSkin() { final var packetInfo = this.selectedTab.getSkinChangePacket(minecraft.player, skinInput.getValue(), this.skinModelCheckbox.selected()); packetInfo.ifPresent(packet -> { if (TAILORED_SERVER) { - ClientPlayNetworking.send(packet.getFirst(), packet.getSecond()); + ClientPlayNetworking.send(packet); } else { // Change skin clientside only todo: reload skin PropertyMap map = ((AAbstractClientPlayer) this.minecraft.player).ft_getPlayerInfo().getProfile().getProperties(); @@ -226,54 +224,34 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) if (this.selectedTab.showModelBackwards()) { - int x = startX + 64; - int y = startY + 120; - int size = 50; float mousex = -(((float) width / 2) - 75 - mouseX); float mousey = ((float) height / 2) - mouseY; - var entity = minecraft.player; + var player = minecraft.player; float f = (float) Math.atan(mousex / 40.0f); float g = (float) Math.atan(mousey / 40.0f); - PoseStack poseStack = RenderSystem.getModelViewStack(); - poseStack.pushPose(); - poseStack.translate(x, y, 1050.0); - poseStack.scale(1.0f, 1.0f, -1.0f); - RenderSystem.applyModelViewMatrix(); - PoseStack poseStack2 = new PoseStack(); - poseStack2.translate(0.0, 0.0, 1000.0); - poseStack2.scale(size, size, size); - Quaternionf quaternion = Axis.ZP.rotationDegrees(180.0f); - Quaternionf quaternion2 = Axis.XP.rotationDegrees(g * 20.0f); - quaternion.mul(quaternion2); - poseStack2.mulPose(quaternion); - float h = entity.yBodyRot; - float i = entity.getYRot(); - float j = entity.getXRot(); - float k = entity.yHeadRotO; - float l = entity.yHeadRot; - entity.yBodyRot = f * 20.0f; - entity.setYRot(f * 40.0f); - entity.setXRot(-g * 20.0f); - entity.yHeadRot = entity.getYRot(); - entity.yHeadRotO = entity.getYRot(); - Lighting.setupForEntityInInventory(); - EntityRenderDispatcher entityRenderDispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); - quaternion2.conjugate(); - entityRenderDispatcher.overrideCameraOrientation(quaternion2); - entityRenderDispatcher.setRenderShadow(false); - var bufferSource = Minecraft.getInstance().renderBuffers().bufferSource(); - RenderSystem.runAsFancy(() -> entityRenderDispatcher.render(entity, 0.0, 0.0, 0.0, 0.0f, 1.0f, poseStack2, bufferSource, 0xF000F0)); - bufferSource.endBatch(); - entityRenderDispatcher.setRenderShadow(true); - entity.yBodyRot = h; - entity.setYRot(i); - entity.setXRot(j); - entity.yHeadRotO = k; - entity.yHeadRot = l; - poseStack.popPose(); - RenderSystem.applyModelViewMatrix(); - Lighting.setupFor3DItems(); + float yBodyRot = player.yBodyRot; + float yRot = player.getYRot(); + float xRot = player.getXRot(); + float yHeadRotO = player.yHeadRotO; + float yHeadRot = player.yHeadRot; + + player.yBodyRot = f * 20.0f; + player.setYRot(f * 40.0f); + player.setXRot(-g * 20.0f); + player.yHeadRot = player.getYRot(); + player.yHeadRotO = player.getYRot(); + + + int x = this.startX + 24; + int y = this.startY - 76; + InventoryScreen.renderEntityInInventoryFollowsMouse(guiGraphics, x, y, x + 75, y + 208, 48, 1.0f, mouseX + 2, mouseY - 16, this.minecraft.player); + + player.yBodyRot = yBodyRot; + player.setYRot(yRot); + player.setXRot(xRot); + player.yHeadRotO = yHeadRotO; + player.yHeadRot = yHeadRot; } else { // Drawing Player // Luckily vanilla code is available diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/CapeTab.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/CapeTab.java index 7319956..b2b5bce 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/CapeTab.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/CapeTab.java @@ -1,20 +1,16 @@ package org.samo_lego.fabrictailor.client.screen.tabs; import com.mojang.authlib.minecraft.MinecraftProfileTexture; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import org.samo_lego.fabrictailor.network.SkinPackets; +import org.samo_lego.fabrictailor.network.payload.HDSkinPayload; import org.samo_lego.fabrictailor.util.TextTranslations; import java.util.Optional; -import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_HD_CHANGE; - public class CapeTab implements SkinTabType { @Override @@ -33,9 +29,10 @@ public ItemStack getIcon() { } @Override - public Optional> getSkinChangePacket(LocalPlayer player, String capeUrl, boolean useSlim) { + public Optional getSkinChangePacket(LocalPlayer player, String capeUrl, boolean useSlim) { var skinData = this.getExtendedProperty(player, MinecraftProfileTexture.Type.CAPE, capeUrl, null); - return Optional.of(new Pair<>(FABRICTAILOR_HD_CHANGE, SkinPackets.skin2ByteBuf(skinData))); + + return Optional.of(new HDSkinPayload(skinData)); } @Override diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/LocalSkinTab.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/LocalSkinTab.java index 878297b..19becf5 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/LocalSkinTab.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/LocalSkinTab.java @@ -1,21 +1,17 @@ package org.samo_lego.fabrictailor.client.screen.tabs; import com.mojang.authlib.properties.Property; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import org.samo_lego.fabrictailor.network.SkinPackets; +import org.samo_lego.fabrictailor.network.payload.VanillaSkinPayload; import org.samo_lego.fabrictailor.util.SkinFetcher; import org.samo_lego.fabrictailor.util.TextTranslations; import java.util.Optional; -import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_VANILLA_CHANGE; - public class LocalSkinTab implements SkinTabType { private final MutableComponent TITLE; private final MutableComponent DESCRIPTION; @@ -43,12 +39,12 @@ public ItemStack getIcon() { } @Override - public Optional> getSkinChangePacket(LocalPlayer player, String filePath, boolean useSlim) { + public Optional getSkinChangePacket(LocalPlayer player, String filePath, boolean useSlim) { Property skinData = SkinFetcher.setSkinFromFile(filePath, useSlim); if (skinData == null) return Optional.empty(); - return Optional.of(new Pair<>(FABRICTAILOR_VANILLA_CHANGE, SkinPackets.skin2ByteBuf(skinData))); + return Optional.of(new VanillaSkinPayload(skinData)); } @Override diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/PlayerSkinTab.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/PlayerSkinTab.java index 2cc0c37..0d823f4 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/PlayerSkinTab.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/PlayerSkinTab.java @@ -1,22 +1,18 @@ package org.samo_lego.fabrictailor.client.screen.tabs; import com.mojang.authlib.properties.Property; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.gui.screens.advancements.AdvancementTabType; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import org.samo_lego.fabrictailor.network.SkinPackets; +import org.samo_lego.fabrictailor.network.payload.VanillaSkinPayload; import org.samo_lego.fabrictailor.util.SkinFetcher; import org.samo_lego.fabrictailor.util.TextTranslations; import java.util.Optional; -import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_VANILLA_CHANGE; - public class PlayerSkinTab implements SkinTabType { private final MutableComponent TITLE; @@ -50,13 +46,13 @@ public boolean hasSkinModels() { } @Override - public Optional> getSkinChangePacket(LocalPlayer player, String playername, boolean _ignored) { + public Optional getSkinChangePacket(LocalPlayer player, String playername, boolean _ignored) { Property skinData = SkinFetcher.fetchSkinByName(playername); if (skinData == null) return Optional.empty(); - return Optional.of(new Pair<>(FABRICTAILOR_VANILLA_CHANGE, SkinPackets.skin2ByteBuf(skinData))); + return Optional.of(new VanillaSkinPayload(skinData)); } @Override diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/SkinTabType.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/SkinTabType.java index 0cef9d2..88523d3 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/SkinTabType.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/SkinTabType.java @@ -4,12 +4,10 @@ import com.google.gson.JsonParser; import com.mojang.authlib.minecraft.MinecraftProfileTexture; import com.mojang.authlib.properties.Property; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.gui.screens.advancements.AdvancementTabType; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.item.ItemStack; import org.samo_lego.fabrictailor.casts.TailoredPlayer; import org.samo_lego.fabrictailor.mixin.client.AAbstractClientPlayer; @@ -32,7 +30,7 @@ default boolean isSelected(int startX, int startY, int mouseX, int mouseY) { return mouseX > startX && mouseX < startX + this.width && mouseY > startY && mouseY < startY + this.height; } - Optional> getSkinChangePacket(LocalPlayer player, String param, boolean useSlim); + Optional getSkinChangePacket(LocalPlayer player, String param, boolean useSlim); default boolean hasSkinModels() { return true; diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java index b03a8c6..f287417 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java @@ -3,27 +3,24 @@ import com.google.common.net.InternetDomainName; import com.google.gson.JsonObject; import com.mojang.authlib.minecraft.MinecraftProfileTexture; -import com.mojang.authlib.properties.Property; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import org.samo_lego.fabrictailor.network.SkinPackets; +import org.samo_lego.fabrictailor.network.payload.HDSkinPayload; +import org.samo_lego.fabrictailor.network.payload.VanillaSkinPayload; import org.samo_lego.fabrictailor.util.SkinFetcher; import org.samo_lego.fabrictailor.util.TextTranslations; import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; +import java.awt.image.*; import java.io.IOException; +import java.net.URI; import java.net.URL; import java.util.Optional; import static org.samo_lego.fabrictailor.FabricTailor.config; -import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_HD_CHANGE; -import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_VANILLA_CHANGE; public class UrlSkinTab implements SkinTabType { @@ -54,23 +51,21 @@ public ItemStack getIcon() { @Override - public Optional> getSkinChangePacket(LocalPlayer player, String url, boolean useSlim) { - Property skinData; - ResourceLocation channel; + public Optional getSkinChangePacket(LocalPlayer player, String url, boolean useSlim) { try { - URL skinUrl = new URL(url); + URL skinUrl = URI.create(url).toURL(); BufferedImage image = ImageIO.read(skinUrl); int height = image.getHeight(); int width = image.getWidth(); if (width == 64 && (height == 32 || height == 64)) { // Normal skin (vanilla compatible) - skinData = SkinFetcher.fetchSkinByUrl(url, useSlim); + var skinData = SkinFetcher.fetchSkinByUrl(url, useSlim); if (skinData == null) return Optional.empty(); - channel = FABRICTAILOR_VANILLA_CHANGE; + return Optional.of(new VanillaSkinPayload(skinData)); } else { // HD skin (not vanilla compatible) JsonObject metadata = null; @@ -87,14 +82,13 @@ public Optional> getSkinChangePacket(Loc url = "https://external-content.duckduckgo.com/iu/?u=" + skinUrl; } - skinData = this.getExtendedProperty(player, MinecraftProfileTexture.Type.SKIN, url, metadata); - channel = FABRICTAILOR_HD_CHANGE; + var skinData = this.getExtendedProperty(player, MinecraftProfileTexture.Type.SKIN, url, metadata); + return Optional.of(new HDSkinPayload(skinData)); } } catch (IOException ignored) { return Optional.empty(); } - return Optional.of(new Pair<>(channel, SkinPackets.skin2ByteBuf(skinData))); } } diff --git a/src/main/java/org/samo_lego/fabrictailor/mixin/MServerPlayerEntity_TailoredPlayer.java b/src/main/java/org/samo_lego/fabrictailor/mixin/MServerPlayerEntity_TailoredPlayer.java index 899dfdc..d81c1f6 100644 --- a/src/main/java/org/samo_lego/fabrictailor/mixin/MServerPlayerEntity_TailoredPlayer.java +++ b/src/main/java/org/samo_lego/fabrictailor/mixin/MServerPlayerEntity_TailoredPlayer.java @@ -7,8 +7,23 @@ import com.mojang.datafixers.util.Pair; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.game.*; -import net.minecraft.server.level.*; +import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket; +import net.minecraft.network.protocol.game.ClientboundRespawnPacket; +import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket; +import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket; +import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; +import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; +import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; +import net.minecraft.network.protocol.game.CommonPlayerSpawnInfo; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ClientInformation; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.server.players.PlayerList; import net.minecraft.world.effect.MobEffectInstance; @@ -98,7 +113,7 @@ public void fabrictailor_reloadSkin() { ServerLevel level = self.serverLevel(); this.connection.send(new ClientboundRespawnPacket( new CommonPlayerSpawnInfo( - level.dimensionTypeId(), + level.dimensionTypeRegistration(), level.dimension(), BiomeManager.obfuscateSeed(level.getSeed()), self.gameMode.getGameModeForPlayer(), @@ -123,7 +138,7 @@ public void fabrictailor_reloadSkin() { this.connection.send(new ClientboundSetHealthPacket(this.getHealth(), this.getFoodData().getFoodLevel(), this.getFoodData().getSaturationLevel())); for (MobEffectInstance statusEffect : this.getActiveEffects()) { - this.connection.send(new ClientboundUpdateMobEffectPacket(self.getId(), statusEffect)); + this.connection.send(new ClientboundUpdateMobEffectPacket(self.getId(), statusEffect, false)); } var equipmentList = new ArrayList>(); diff --git a/src/main/java/org/samo_lego/fabrictailor/network/NetworkHandler.java b/src/main/java/org/samo_lego/fabrictailor/network/NetworkHandler.java index 11ec298..cd8a6b6 100644 --- a/src/main/java/org/samo_lego/fabrictailor/network/NetworkHandler.java +++ b/src/main/java/org/samo_lego/fabrictailor/network/NetworkHandler.java @@ -3,8 +3,8 @@ import com.mojang.authlib.properties.Property; import io.netty.buffer.Unpooled; import me.lucko.fabric.api.permissions.v0.Permissions; -import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerConfigurationNetworking; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking.Context; import net.minecraft.ChatFormatting; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -14,6 +14,10 @@ import net.minecraft.server.network.ServerConfigurationPacketListenerImpl; import net.minecraft.server.network.ServerGamePacketListenerImpl; import org.samo_lego.fabrictailor.casts.TailoredPlayer; +import org.samo_lego.fabrictailor.network.payload.DefaultSkinPayload; +import org.samo_lego.fabrictailor.network.payload.FabricTailorHelloPayload; +import org.samo_lego.fabrictailor.network.payload.HDSkinPayload; +import org.samo_lego.fabrictailor.network.payload.VanillaSkinPayload; import org.samo_lego.fabrictailor.util.TextTranslations; import java.util.Optional; @@ -21,6 +25,7 @@ import static org.samo_lego.fabrictailor.FabricTailor.THREADPOOL; import static org.samo_lego.fabrictailor.FabricTailor.config; +import static org.samo_lego.fabrictailor.FabricTailor.errorLog; import static org.samo_lego.fabrictailor.network.SkinPackets.FT_HELLO; import static org.samo_lego.fabrictailor.util.SkinFetcher.fetchSkinByName; @@ -68,38 +73,36 @@ public static FriendlyByteBuf createHelloPacket(boolean allowDefaultSkinButton) return buf; } - public static void changeVanillaSkinPacket(MinecraftServer _server, ServerPlayer player, ServerGamePacketListenerImpl _listener, FriendlyByteBuf buf, PacketSender _sender) { - NetworkHandler.onSkinChangePacket(player, buf, () -> { + public static void changeVanillaSkinPacket(VanillaSkinPayload payload, Context context) { + NetworkHandler.onSkinChangePacket(context.player(), payload.skinProperty(), () -> { }); } - public static void defaultSkinPacket(MinecraftServer _server, ServerPlayer player, ServerGamePacketListenerImpl _listener, FriendlyByteBuf buf, PacketSender _sender) { - if (player.hasPermissions(2)) { - String value = buf.readUtf(); - String signature = buf.readUtf(); + public static void defaultSkinPacket(DefaultSkinPayload payload, Context context) { + if (context.player().hasPermissions(2)) { - config.defaultSkin.value = value; - config.defaultSkin.signature = signature; + config.defaultSkin.value = payload.skinProperty().value(); + config.defaultSkin.signature = payload.skinProperty().signature(); config.save(); - player.sendSystemMessage( + context.player().sendSystemMessage( TextTranslations.create("command.fabrictailor.config.defaultSkin").withStyle(ChatFormatting.GREEN)); } } - public static void changeHDSkinPacket(MinecraftServer _server, ServerPlayer player, ServerGamePacketListenerImpl _listener, FriendlyByteBuf buf, PacketSender _sender) { - NetworkHandler.onSkinChangePacket(player, buf, () -> - player.displayClientMessage(TextTranslations.create("hint.fabrictailor.client_only") + public static void changeHDSkinPacket(HDSkinPayload payload, Context context) { + NetworkHandler.onSkinChangePacket(context.player(), payload.skinProperty(), () -> + context.player().displayClientMessage(TextTranslations.create("hint.fabrictailor.client_only") .withStyle(ChatFormatting.DARK_PURPLE), false)); } - public static void onSkinChangePacket(ServerPlayer player, FriendlyByteBuf buf, Runnable callback) { + public static void onSkinChangePacket(ServerPlayer player, Property skin, Runnable callback) { long lastChange = ((TailoredPlayer) player).fabrictailor_getLastSkinChange(); long now = System.currentTimeMillis(); if (now - lastChange > config.skinChangeTimer * 1000 || lastChange == 0) { - ((TailoredPlayer) player).fabrictailor_setSkin(buf.readProperty(), true); + ((TailoredPlayer) player).fabrictailor_setSkin(skin, true); callback.run(); } else { // Prevent skin change spamming @@ -115,13 +118,14 @@ public static void onSkinChangePacket(ServerPlayer player, FriendlyByteBuf buf, public static void onConfigured(ServerConfigurationPacketListenerImpl listener, MinecraftServer server) { if (ServerConfigurationNetworking.canSend(listener, FT_HELLO)) { + boolean allowDefaultSkinButton = false; try { - FriendlyByteBuf packetBuf = NetworkHandler.createHelloPacket(Permissions.check(listener.getOwner(), "fabrictailor.set_default_skin", 2, server).get()); - ServerConfigurationNetworking.send(listener, SkinPackets.FT_HELLO, packetBuf); + allowDefaultSkinButton = Permissions.check(listener.getOwner(), "fabrictailor.set_default_skin", 2, server).get(); } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); + errorLog(e.getMessage()); } + var payload = new FabricTailorHelloPayload(allowDefaultSkinButton); + ServerConfigurationNetworking.send(listener, payload); } } - } diff --git a/src/main/java/org/samo_lego/fabrictailor/network/SkinPackets.java b/src/main/java/org/samo_lego/fabrictailor/network/SkinPackets.java index 5ce8b08..137ebc2 100644 --- a/src/main/java/org/samo_lego/fabrictailor/network/SkinPackets.java +++ b/src/main/java/org/samo_lego/fabrictailor/network/SkinPackets.java @@ -1,10 +1,6 @@ package org.samo_lego.fabrictailor.network; -import com.mojang.authlib.properties.Property; -import io.netty.buffer.Unpooled; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; import static org.samo_lego.fabrictailor.FabricTailor.MOD_ID; @@ -13,10 +9,4 @@ public class SkinPackets { public static final ResourceLocation FABRICTAILOR_HD_CHANGE = new ResourceLocation(MOD_ID, "skin_change_hd"); public static final ResourceLocation FABRICTAILOR_DEFAULT_SKIN = new ResourceLocation(MOD_ID, "default_skin_request"); public static final ResourceLocation FT_HELLO = new ResourceLocation(MOD_ID, "hello"); - - public static FriendlyByteBuf skin2ByteBuf(@NotNull Property skinData) { - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); - buf.writeProperty(skinData); - return buf; - } } diff --git a/src/main/java/org/samo_lego/fabrictailor/network/payload/DefaultSkinPayload.java b/src/main/java/org/samo_lego/fabrictailor/network/payload/DefaultSkinPayload.java new file mode 100644 index 0000000..4a3674b --- /dev/null +++ b/src/main/java/org/samo_lego/fabrictailor/network/payload/DefaultSkinPayload.java @@ -0,0 +1,21 @@ +package org.samo_lego.fabrictailor.network.payload; + +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 org.jetbrains.annotations.NotNull; +import org.samo_lego.fabrictailor.util.PropertyExtension; + +import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_DEFAULT_SKIN; + +public record DefaultSkinPayload(Property skinProperty) implements CustomPacketPayload { + + public static final Type TYPE = CustomPacketPayload.createType(FABRICTAILOR_DEFAULT_SKIN.toString()); + public static final StreamCodec CODEC = StreamCodec.composite(PropertyExtension.STREAM_CODEC, DefaultSkinPayload::skinProperty, DefaultSkinPayload::new); + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/org/samo_lego/fabrictailor/network/payload/FabricTailorHelloPayload.java b/src/main/java/org/samo_lego/fabrictailor/network/payload/FabricTailorHelloPayload.java new file mode 100644 index 0000000..2345029 --- /dev/null +++ b/src/main/java/org/samo_lego/fabrictailor/network/payload/FabricTailorHelloPayload.java @@ -0,0 +1,23 @@ +package org.samo_lego.fabrictailor.network.payload; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import org.jetbrains.annotations.NotNull; + +import static org.samo_lego.fabrictailor.network.SkinPackets.FT_HELLO; + +public record FabricTailorHelloPayload(boolean allowSkinButton) implements CustomPacketPayload { + + public static final Type TYPE = CustomPacketPayload.createType(FT_HELLO.toString()); + public static final StreamCodec CODEC = StreamCodec.of( + (buf, value) -> buf.writeBoolean(value.allowSkinButton()), + buf -> new FabricTailorHelloPayload(buf.readBoolean()) + ); + + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/org/samo_lego/fabrictailor/network/payload/HDSkinPayload.java b/src/main/java/org/samo_lego/fabrictailor/network/payload/HDSkinPayload.java new file mode 100644 index 0000000..09c45f5 --- /dev/null +++ b/src/main/java/org/samo_lego/fabrictailor/network/payload/HDSkinPayload.java @@ -0,0 +1,21 @@ +package org.samo_lego.fabrictailor.network.payload; + +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 org.jetbrains.annotations.NotNull; +import org.samo_lego.fabrictailor.util.PropertyExtension; + +import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_HD_CHANGE; + +public record HDSkinPayload(Property skinProperty) implements CustomPacketPayload { + + public static final Type TYPE = CustomPacketPayload.createType(FABRICTAILOR_HD_CHANGE.toString()); + public static final StreamCodec CODEC = StreamCodec.composite(PropertyExtension.STREAM_CODEC, HDSkinPayload::skinProperty, HDSkinPayload::new); + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/org/samo_lego/fabrictailor/network/payload/VanillaSkinPayload.java b/src/main/java/org/samo_lego/fabrictailor/network/payload/VanillaSkinPayload.java index 28a3657..fe81060 100644 --- a/src/main/java/org/samo_lego/fabrictailor/network/payload/VanillaSkinPayload.java +++ b/src/main/java/org/samo_lego/fabrictailor/network/payload/VanillaSkinPayload.java @@ -4,6 +4,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import org.jetbrains.annotations.NotNull; import org.samo_lego.fabrictailor.util.PropertyExtension; import static org.samo_lego.fabrictailor.network.SkinPackets.FABRICTAILOR_VANILLA_CHANGE; @@ -11,13 +12,10 @@ public record VanillaSkinPayload(Property skinProperty) implements CustomPacketPayload { public static final Type TYPE = CustomPacketPayload.createType(FABRICTAILOR_VANILLA_CHANGE.toString()); - public static final StreamCodec CODEC = StreamCodec.composite(PropertyExtension.STREAM_CODEC, BlockHighlightPayload::blockPos, VanillaSkinPayload::new); - public static final StreamCodec CODEC2 = StreamCodec.of((buf, value) -> buf.write.(value.blockPos),buf ->new - - BlockHighlightPayload(buf.readBlockPos())); + public static final StreamCodec CODEC = StreamCodec.composite(PropertyExtension.STREAM_CODEC, VanillaSkinPayload::skinProperty, VanillaSkinPayload::new); @Override - public Type type() { + public @NotNull Type type() { return TYPE; } } diff --git a/src/main/java/org/samo_lego/fabrictailor/util/PropertyExtension.java b/src/main/java/org/samo_lego/fabrictailor/util/PropertyExtension.java index ceac4cc..d07ac5d 100644 --- a/src/main/java/org/samo_lego/fabrictailor/util/PropertyExtension.java +++ b/src/main/java/org/samo_lego/fabrictailor/util/PropertyExtension.java @@ -3,16 +3,24 @@ import com.mojang.authlib.properties.Property; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; +import org.jetbrains.annotations.NotNull; public class PropertyExtension { public static final StreamCodec STREAM_CODEC = new StreamCodec<>() { @Override - public Property decode(FriendlyByteBuf buf) { + public @NotNull Property decode(FriendlyByteBuf buf) { + var name = buf.readUtf(); + var value = buf.readUtf(); + var signature = buf.readNullable(FriendlyByteBuf::readUtf); + + return new Property(name, value, signature); } @Override - public void encode(FriendlyByteBuf object, Property object2) { - + public void encode(FriendlyByteBuf object, Property property) { + object.writeUtf(property.name()); + object.writeUtf(property.value()); + object.writeNullable(property.signature(), FriendlyByteBuf::writeUtf); } }; }