diff --git a/README.md b/README.md index caa7d66..402899a 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ A NetEase (China) Minecraft protocol extension library for [CloudburstMC/Protoco | Protocol Version | Minecraft Version | |------------------|-------------------| +| v630 | 1.20.50 | +| v686 | 1.21.2 | | v766 | 1.21.50 | ## Installation @@ -44,7 +46,7 @@ dependencies { ### Using NetEase Codec ```java -import org.allaymc.protocol.extension.v766.Bedrock_v766_NetEase; +import org.allaymc.protocol.extension.codec.v766.Bedrock_v766_NetEase; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; BedrockCodec codec = Bedrock_v766_NetEase.CODEC; diff --git a/src/main/java/org/allaymc/protocol/extension/v766/ConfirmSkinSerializer_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/ConfirmSkinSerializer.java similarity index 86% rename from src/main/java/org/allaymc/protocol/extension/v766/ConfirmSkinSerializer_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/common/serializer/ConfirmSkinSerializer.java index 224510a..de488b2 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/ConfirmSkinSerializer_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/ConfirmSkinSerializer.java @@ -1,12 +1,12 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.common.serializer; import io.netty.buffer.ByteBuf; import org.allaymc.protocol.extension.packet.ConfirmSkinPacket; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; -public class ConfirmSkinSerializer_v766_NetEase implements BedrockPacketSerializer { - public static final ConfirmSkinSerializer_v766_NetEase INSTANCE = new ConfirmSkinSerializer_v766_NetEase(); +public class ConfirmSkinSerializer implements BedrockPacketSerializer { + public static final ConfirmSkinSerializer INSTANCE = new ConfirmSkinSerializer(); @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ConfirmSkinPacket packet) { diff --git a/src/main/java/org/allaymc/protocol/extension/v766/NetEaseJsonSerializer_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/NetEaseJsonSerializer.java similarity index 70% rename from src/main/java/org/allaymc/protocol/extension/v766/NetEaseJsonSerializer_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/common/serializer/NetEaseJsonSerializer.java index e155507..5995e05 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/NetEaseJsonSerializer_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/NetEaseJsonSerializer.java @@ -1,4 +1,4 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.common.serializer; import io.netty.buffer.ByteBuf; import org.allaymc.protocol.extension.packet.NetEaseJsonPacket; @@ -8,8 +8,8 @@ /** * @author daoge_cmd */ -public class NetEaseJsonSerializer_v766_NetEase implements BedrockPacketSerializer { - public static final NetEaseJsonSerializer_v766_NetEase INSTANCE = new NetEaseJsonSerializer_v766_NetEase(); +public class NetEaseJsonSerializer implements BedrockPacketSerializer { + public static final NetEaseJsonSerializer INSTANCE = new NetEaseJsonSerializer(); @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, NetEaseJsonPacket packet) { diff --git a/src/main/java/org/allaymc/protocol/extension/v766/PlayerEnchantOptionsSerializer_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/PlayerEnchantOptionsSerializer_v407_NetEase.java similarity index 92% rename from src/main/java/org/allaymc/protocol/extension/v766/PlayerEnchantOptionsSerializer_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/common/serializer/PlayerEnchantOptionsSerializer_v407_NetEase.java index 8f35d88..961e8f2 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/PlayerEnchantOptionsSerializer_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/PlayerEnchantOptionsSerializer_v407_NetEase.java @@ -1,4 +1,4 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.common.serializer; import io.netty.buffer.ByteBuf; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -15,9 +15,9 @@ /** * @author daoge_cmd */ -public class PlayerEnchantOptionsSerializer_v766_NetEase extends PlayerEnchantOptionsSerializer_v407 { +public class PlayerEnchantOptionsSerializer_v407_NetEase extends PlayerEnchantOptionsSerializer_v407 { - public static final PlayerEnchantOptionsSerializer_v766_NetEase INSTANCE = new PlayerEnchantOptionsSerializer_v766_NetEase(); + public static final PlayerEnchantOptionsSerializer_v407_NetEase INSTANCE = new PlayerEnchantOptionsSerializer_v407_NetEase(); protected void writeOption(ByteBuf buffer, BedrockCodecHelper helper, EnchantOptionData option) { VarInts.writeUnsignedInt(buffer, option.getCost()); diff --git a/src/main/java/org/allaymc/protocol/extension/v766/PyRpcSerializer_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/PyRpcSerializer.java similarity index 73% rename from src/main/java/org/allaymc/protocol/extension/v766/PyRpcSerializer_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/common/serializer/PyRpcSerializer.java index 4565893..c22fcee 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/PyRpcSerializer_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/PyRpcSerializer.java @@ -1,12 +1,12 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.common.serializer; import io.netty.buffer.ByteBuf; import org.allaymc.protocol.extension.packet.PyRpcPacket; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; -public class PyRpcSerializer_v766_NetEase implements BedrockPacketSerializer { - public static final PyRpcSerializer_v766_NetEase INSTANCE = new PyRpcSerializer_v766_NetEase(); +public class PyRpcSerializer implements BedrockPacketSerializer { + public static final PyRpcSerializer INSTANCE = new PyRpcSerializer(); @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PyRpcPacket packet) { diff --git a/src/main/java/org/allaymc/protocol/extension/v766/StoreBuySuccessSerializer_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/StoreBuySuccessSerializer.java similarity index 66% rename from src/main/java/org/allaymc/protocol/extension/v766/StoreBuySuccessSerializer_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/common/serializer/StoreBuySuccessSerializer.java index 732f2d2..3656f7a 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/StoreBuySuccessSerializer_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/common/serializer/StoreBuySuccessSerializer.java @@ -1,4 +1,4 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.common.serializer; import io.netty.buffer.ByteBuf; import org.allaymc.protocol.extension.packet.StoreBuySuccessPacket; @@ -8,8 +8,8 @@ /** * @author daoge_cmd */ -public class StoreBuySuccessSerializer_v766_NetEase implements BedrockPacketSerializer { - public static final StoreBuySuccessSerializer_v766_NetEase INSTANCE = new StoreBuySuccessSerializer_v766_NetEase(); +public class StoreBuySuccessSerializer implements BedrockPacketSerializer { + public static final StoreBuySuccessSerializer INSTANCE = new StoreBuySuccessSerializer(); @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, StoreBuySuccessPacket packet) { diff --git a/src/main/java/org/allaymc/protocol/extension/codec/v630/Bedrock_v630_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v630/Bedrock_v630_NetEase.java new file mode 100644 index 0000000..29649ce --- /dev/null +++ b/src/main/java/org/allaymc/protocol/extension/codec/v630/Bedrock_v630_NetEase.java @@ -0,0 +1,48 @@ +package org.allaymc.protocol.extension.codec.v630; + +import org.allaymc.protocol.extension.codec.common.serializer.ConfirmSkinSerializer; +import org.allaymc.protocol.extension.codec.common.serializer.NetEaseJsonSerializer; +import org.allaymc.protocol.extension.codec.common.serializer.PyRpcSerializer; +import org.allaymc.protocol.extension.codec.common.serializer.StoreBuySuccessSerializer; +import org.allaymc.protocol.extension.codec.v630.serializer.PlayerAuthInputSerializer_v630_NetEase; +import org.allaymc.protocol.extension.codec.v630.serializer.TextSerializer_v630_NetEase; +import org.allaymc.protocol.extension.codec.common.serializer.PlayerEnchantOptionsSerializer_v407_NetEase; +import org.allaymc.protocol.extension.packet.ConfirmSkinPacket; +import org.allaymc.protocol.extension.packet.NetEaseJsonPacket; +import org.allaymc.protocol.extension.packet.PyRpcPacket; +import org.allaymc.protocol.extension.packet.StoreBuySuccessPacket; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.v575.BedrockCodecHelper_v575; +import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; +import org.cloudburstmc.protocol.bedrock.data.PacketRecipient; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket; +import org.cloudburstmc.protocol.bedrock.packet.PlayerEnchantOptionsPacket; +import org.cloudburstmc.protocol.bedrock.packet.TextPacket; +import org.cloudburstmc.protocol.common.util.TypeMap; + +/** + * NetEase variant of the v630 codec. + * + * @author daoge_cmd + */ +public class Bedrock_v630_NetEase extends Bedrock_v630 { + + protected static final TypeMap CONTAINER_SLOT_TYPES = Bedrock_v630.CONTAINER_SLOT_TYPES + .toBuilder() + // NetEase: RECIPE_CUSTOM + .shift(17, 1) + .build(); + + public static final BedrockCodec CODEC = Bedrock_v630.CODEC.toBuilder() + .raknetProtocolVersion(8) + .helper(() -> new BedrockCodecHelper_v575(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) + .updateSerializer(PlayerAuthInputPacket.class, PlayerAuthInputSerializer_v630_NetEase.INSTANCE) + .updateSerializer(TextPacket.class, TextSerializer_v630_NetEase.INSTANCE) + .updateSerializer(PlayerEnchantOptionsPacket.class, PlayerEnchantOptionsSerializer_v407_NetEase.INSTANCE) + .registerPacket(PyRpcPacket::new, PyRpcSerializer.INSTANCE, 200, PacketRecipient.BOTH) + .registerPacket(StoreBuySuccessPacket::new, StoreBuySuccessSerializer.INSTANCE, 202, PacketRecipient.BOTH) // TODO: check packet recipient + .registerPacket(NetEaseJsonPacket::new, NetEaseJsonSerializer.INSTANCE, 203, PacketRecipient.BOTH) + .registerPacket(ConfirmSkinPacket::new, ConfirmSkinSerializer.INSTANCE, 228, PacketRecipient.CLIENT) + .build(); +} diff --git a/src/main/java/org/allaymc/protocol/extension/codec/v630/serializer/PlayerAuthInputSerializer_v630_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v630/serializer/PlayerAuthInputSerializer_v630_NetEase.java new file mode 100644 index 0000000..c27b0de --- /dev/null +++ b/src/main/java/org/allaymc/protocol/extension/codec/v630/serializer/PlayerAuthInputSerializer_v630_NetEase.java @@ -0,0 +1,85 @@ +package org.allaymc.protocol.extension.codec.v630.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector2f; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v575.serializer.PlayerAuthInputSerializer_v575; +import org.cloudburstmc.protocol.bedrock.data.PlayerAuthInputData; +import org.cloudburstmc.protocol.bedrock.data.PlayerBlockActionData; +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +/** + * @author daoge_cmd + */ +public class PlayerAuthInputSerializer_v630_NetEase extends PlayerAuthInputSerializer_v575 { + + public static final PlayerAuthInputSerializer_v630_NetEase INSTANCE = new PlayerAuthInputSerializer_v630_NetEase(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PlayerAuthInputPacket packet) { + Vector3f rotation = packet.getRotation(); + buffer.writeFloatLE(rotation.getX()); + buffer.writeFloatLE(rotation.getY()); + helper.writeVector3f(buffer, packet.getPosition()); + buffer.writeFloatLE(packet.getMotion().getX()); + buffer.writeFloatLE(packet.getMotion().getY()); + buffer.writeFloatLE(rotation.getZ()); + helper.writeLargeVarIntFlags(buffer, packet.getInputData(), PlayerAuthInputData.class); + VarInts.writeUnsignedInt(buffer, packet.getInputMode().ordinal()); + VarInts.writeUnsignedInt(buffer, packet.getPlayMode().ordinal()); + writeInteractionModel(buffer, helper, packet); + helper.writeVector2f(buffer, packet.getInteractRotation()); + VarInts.writeUnsignedLong(buffer, packet.getTick()); + helper.writeVector3f(buffer, packet.getDelta()); + + // NetEase only: cameraDeparted + buffer.writeBoolean(false); + + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_INTERACTION)) { + this.writeItemUseTransaction(buffer, helper, packet.getItemUseTransaction()); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_STACK_REQUEST)) { + helper.writeItemStackRequest(buffer, packet.getItemStackRequest()); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_BLOCK_ACTIONS)) { + VarInts.writeInt(buffer, packet.getPlayerActions().size()); + for (PlayerBlockActionData actionData : packet.getPlayerActions()) { + writePlayerBlockActionData(buffer, helper, actionData); + } + } + helper.writeVector2f(buffer, packet.getAnalogMoveVector()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, PlayerAuthInputPacket packet) { + float x = buffer.readFloatLE(); + float y = buffer.readFloatLE(); + packet.setPosition(helper.readVector3f(buffer)); + packet.setMotion(Vector2f.from(buffer.readFloatLE(), buffer.readFloatLE())); + float z = buffer.readFloatLE(); + packet.setRotation(Vector3f.from(x, y, z)); + helper.readLargeVarIntFlags(buffer, packet.getInputData(), PlayerAuthInputData.class); + packet.setInputMode(INPUT_MODES[VarInts.readUnsignedInt(buffer)]); + packet.setPlayMode(CLIENT_PLAY_MODES[VarInts.readUnsignedInt(buffer)]); + readInteractionModel(buffer, helper, packet); + packet.setInteractRotation(helper.readVector2f(buffer)); + packet.setTick(VarInts.readUnsignedLong(buffer)); + packet.setDelta(helper.readVector3f(buffer)); + + // NetEase only: cameraDeparted + buffer.readBoolean(); + + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_INTERACTION)) { + packet.setItemUseTransaction(this.readItemUseTransaction(buffer, helper)); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_STACK_REQUEST)) { + packet.setItemStackRequest(helper.readItemStackRequest(buffer)); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_BLOCK_ACTIONS)) { + helper.readArray(buffer, packet.getPlayerActions(), VarInts::readInt, this::readPlayerBlockActionData, 32); // 32 is more than enough + } + packet.setAnalogMoveVector(helper.readVector2f(buffer)); + } +} diff --git a/src/main/java/org/allaymc/protocol/extension/codec/v630/serializer/TextSerializer_v630_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v630/serializer/TextSerializer_v630_NetEase.java new file mode 100644 index 0000000..bd25e0b --- /dev/null +++ b/src/main/java/org/allaymc/protocol/extension/codec/v630/serializer/TextSerializer_v630_NetEase.java @@ -0,0 +1,34 @@ +package org.allaymc.protocol.extension.codec.v630.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v554.serializer.TextSerializer_v554; +import org.cloudburstmc.protocol.bedrock.packet.TextPacket; + +/** + * @author daoge_cmd + */ +public class TextSerializer_v630_NetEase extends TextSerializer_v554 { + + public static final TextSerializer_v630_NetEase INSTANCE = new TextSerializer_v630_NetEase(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { + super.serialize(buffer, helper, packet); + + var type = packet.getType(); + if (type == TextPacket.Type.CHAT || type == TextPacket.Type.POPUP) { + helper.writeString(buffer, ""); + } + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { + super.deserialize(buffer, helper, packet); + + var type = packet.getType(); + if (type == TextPacket.Type.CHAT || type == TextPacket.Type.POPUP) { + helper.readString(buffer); + } + } +} diff --git a/src/main/java/org/allaymc/protocol/extension/codec/v686/Bedrock_v686_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v686/Bedrock_v686_NetEase.java new file mode 100644 index 0000000..65b3a1d --- /dev/null +++ b/src/main/java/org/allaymc/protocol/extension/codec/v686/Bedrock_v686_NetEase.java @@ -0,0 +1,48 @@ +package org.allaymc.protocol.extension.codec.v686; + +import org.allaymc.protocol.extension.codec.common.serializer.ConfirmSkinSerializer; +import org.allaymc.protocol.extension.codec.common.serializer.NetEaseJsonSerializer; +import org.allaymc.protocol.extension.codec.common.serializer.PyRpcSerializer; +import org.allaymc.protocol.extension.codec.common.serializer.StoreBuySuccessSerializer; +import org.allaymc.protocol.extension.codec.v686.serializer.PlayerAuthInputSerializer_v686_NetEase; +import org.allaymc.protocol.extension.codec.v686.serializer.TextSerializer_v686_NetEase; +import org.allaymc.protocol.extension.packet.ConfirmSkinPacket; +import org.allaymc.protocol.extension.packet.NetEaseJsonPacket; +import org.allaymc.protocol.extension.packet.PyRpcPacket; +import org.allaymc.protocol.extension.packet.StoreBuySuccessPacket; +import org.allaymc.protocol.extension.codec.common.serializer.PlayerEnchantOptionsSerializer_v407_NetEase; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.v575.BedrockCodecHelper_v575; +import org.cloudburstmc.protocol.bedrock.codec.v686.Bedrock_v686; +import org.cloudburstmc.protocol.bedrock.data.PacketRecipient; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket; +import org.cloudburstmc.protocol.bedrock.packet.PlayerEnchantOptionsPacket; +import org.cloudburstmc.protocol.bedrock.packet.TextPacket; +import org.cloudburstmc.protocol.common.util.TypeMap; + +/** + * NetEase variant of the v686 codec. + * + * @author LT_Name + */ +public class Bedrock_v686_NetEase extends Bedrock_v686 { + + protected static final TypeMap CONTAINER_SLOT_TYPES = Bedrock_v686.CONTAINER_SLOT_TYPES + .toBuilder() + // NetEase: RECIPE_CUSTOM + .shift(17, 1) + .build(); + + public static final BedrockCodec CODEC = Bedrock_v686.CODEC.toBuilder() + .raknetProtocolVersion(8) + .helper(() -> new BedrockCodecHelper_v575(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) + .updateSerializer(PlayerAuthInputPacket.class, PlayerAuthInputSerializer_v686_NetEase.INSTANCE) + .updateSerializer(TextPacket.class, TextSerializer_v686_NetEase.INSTANCE) + .updateSerializer(PlayerEnchantOptionsPacket.class, PlayerEnchantOptionsSerializer_v407_NetEase.INSTANCE) + .registerPacket(PyRpcPacket::new, PyRpcSerializer.INSTANCE, 200, PacketRecipient.BOTH) + .registerPacket(StoreBuySuccessPacket::new, StoreBuySuccessSerializer.INSTANCE, 202, PacketRecipient.BOTH) // TODO: check packet recipient + .registerPacket(NetEaseJsonPacket::new, NetEaseJsonSerializer.INSTANCE, 203, PacketRecipient.BOTH) + .registerPacket(ConfirmSkinPacket::new, ConfirmSkinSerializer.INSTANCE, 228, PacketRecipient.CLIENT) + .build(); +} diff --git a/src/main/java/org/allaymc/protocol/extension/codec/v686/serializer/PlayerAuthInputSerializer_v686_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v686/serializer/PlayerAuthInputSerializer_v686_NetEase.java new file mode 100644 index 0000000..9841256 --- /dev/null +++ b/src/main/java/org/allaymc/protocol/extension/codec/v686/serializer/PlayerAuthInputSerializer_v686_NetEase.java @@ -0,0 +1,93 @@ +package org.allaymc.protocol.extension.codec.v686.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector2f; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v575.serializer.PlayerAuthInputSerializer_v575; +import org.cloudburstmc.protocol.bedrock.data.PlayerAuthInputData; +import org.cloudburstmc.protocol.bedrock.data.PlayerBlockActionData; +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +/** + * @author daoge_cmd + */ +public class PlayerAuthInputSerializer_v686_NetEase extends PlayerAuthInputSerializer_v575 { + + public static final PlayerAuthInputSerializer_v686_NetEase INSTANCE = new PlayerAuthInputSerializer_v686_NetEase(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PlayerAuthInputPacket packet) { + Vector3f rotation = packet.getRotation(); + buffer.writeFloatLE(rotation.getX()); + buffer.writeFloatLE(rotation.getY()); + helper.writeVector3f(buffer, packet.getPosition()); + buffer.writeFloatLE(packet.getMotion().getX()); + buffer.writeFloatLE(packet.getMotion().getY()); + buffer.writeFloatLE(rotation.getZ()); + helper.writeLargeVarIntFlags(buffer, packet.getInputData(), PlayerAuthInputData.class); + VarInts.writeUnsignedInt(buffer, packet.getInputMode().ordinal()); + VarInts.writeUnsignedInt(buffer, packet.getPlayMode().ordinal()); + writeInteractionModel(buffer, helper, packet); + helper.writeVector2f(buffer, packet.getInteractRotation()); + VarInts.writeUnsignedLong(buffer, packet.getTick()); + helper.writeVector3f(buffer, packet.getDelta()); + + // NetEase only: cameraDeparted + buffer.writeBoolean(false); + + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_INTERACTION)) { + this.writeItemUseTransaction(buffer, helper, packet.getItemUseTransaction()); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_STACK_REQUEST)) { + helper.writeItemStackRequest(buffer, packet.getItemStackRequest()); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_BLOCK_ACTIONS)) { + VarInts.writeInt(buffer, packet.getPlayerActions().size()); + for (PlayerBlockActionData actionData : packet.getPlayerActions()) { + writePlayerBlockActionData(buffer, helper, actionData); + } + } + if (packet.getInputData().contains(PlayerAuthInputData.IN_CLIENT_PREDICTED_IN_VEHICLE)) { + helper.writeVector2f(buffer, packet.getVehicleRotation()); + VarInts.writeLong(buffer, packet.getPredictedVehicle()); + } + helper.writeVector2f(buffer, packet.getAnalogMoveVector()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, PlayerAuthInputPacket packet) { + float x = buffer.readFloatLE(); + float y = buffer.readFloatLE(); + packet.setPosition(helper.readVector3f(buffer)); + packet.setMotion(Vector2f.from(buffer.readFloatLE(), buffer.readFloatLE())); + float z = buffer.readFloatLE(); + packet.setRotation(Vector3f.from(x, y, z)); + helper.readLargeVarIntFlags(buffer, packet.getInputData(), PlayerAuthInputData.class); + packet.setInputMode(INPUT_MODES[VarInts.readUnsignedInt(buffer)]); + packet.setPlayMode(CLIENT_PLAY_MODES[VarInts.readUnsignedInt(buffer)]); + readInteractionModel(buffer, helper, packet); + packet.setInteractRotation(helper.readVector2f(buffer)); + packet.setTick(VarInts.readUnsignedLong(buffer)); + packet.setDelta(helper.readVector3f(buffer)); + + // NetEase only: cameraDeparted + buffer.readBoolean(); + + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_INTERACTION)) { + packet.setItemUseTransaction(this.readItemUseTransaction(buffer, helper)); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_ITEM_STACK_REQUEST)) { + packet.setItemStackRequest(helper.readItemStackRequest(buffer)); + } + if (packet.getInputData().contains(PlayerAuthInputData.PERFORM_BLOCK_ACTIONS)) { + helper.readArray(buffer, packet.getPlayerActions(), VarInts::readInt, this::readPlayerBlockActionData, 32); // 32 is more than enough + } + if (packet.getInputData().contains(PlayerAuthInputData.IN_CLIENT_PREDICTED_IN_VEHICLE)) { + packet.setVehicleRotation(helper.readVector2f(buffer)); + packet.setPredictedVehicle(VarInts.readLong(buffer)); + } + packet.setAnalogMoveVector(helper.readVector2f(buffer)); + } +} diff --git a/src/main/java/org/allaymc/protocol/extension/v766/TextSerializer_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v686/serializer/TextSerializer_v686_NetEase.java similarity index 80% rename from src/main/java/org/allaymc/protocol/extension/v766/TextSerializer_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/v686/serializer/TextSerializer_v686_NetEase.java index a1a909c..30406b1 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/TextSerializer_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/v686/serializer/TextSerializer_v686_NetEase.java @@ -1,16 +1,13 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.v686.serializer; import io.netty.buffer.ByteBuf; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.v685.serializer.TextSerializer_v685; import org.cloudburstmc.protocol.bedrock.packet.TextPacket; -/** - * @author daoge_cmd - */ -public class TextSerializer_v766_NetEase extends TextSerializer_v685 { +public class TextSerializer_v686_NetEase extends TextSerializer_v685 { - public static final TextSerializer_v685 INSTANCE = new TextSerializer_v766_NetEase(); + public static final TextSerializer_v686_NetEase INSTANCE = new TextSerializer_v686_NetEase(); @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { diff --git a/src/main/java/org/allaymc/protocol/extension/v766/BedrockCodecHelper_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v766/BedrockCodecHelper_v766_NetEase.java similarity index 98% rename from src/main/java/org/allaymc/protocol/extension/v766/BedrockCodecHelper_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/v766/BedrockCodecHelper_v766_NetEase.java index b9d53ad..02c6ff6 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/BedrockCodecHelper_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/v766/BedrockCodecHelper_v766_NetEase.java @@ -1,4 +1,4 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.v766; import io.netty.buffer.ByteBuf; import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; diff --git a/src/main/java/org/allaymc/protocol/extension/v766/Bedrock_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v766/Bedrock_v766_NetEase.java similarity index 74% rename from src/main/java/org/allaymc/protocol/extension/v766/Bedrock_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/v766/Bedrock_v766_NetEase.java index 471ee8d..269bb1a 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/Bedrock_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/v766/Bedrock_v766_NetEase.java @@ -1,5 +1,8 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.v766; +import org.allaymc.protocol.extension.codec.common.serializer.*; +import org.allaymc.protocol.extension.codec.v686.serializer.TextSerializer_v686_NetEase; +import org.allaymc.protocol.extension.codec.v766.serializer.PlayerAuthInputSerializer_v766_NetEase; import org.allaymc.protocol.extension.packet.ConfirmSkinPacket; import org.allaymc.protocol.extension.packet.NetEaseJsonPacket; import org.allaymc.protocol.extension.packet.PyRpcPacket; @@ -31,11 +34,11 @@ public class Bedrock_v766_NetEase extends Bedrock_v766 { .raknetProtocolVersion(8) .helper(() -> new BedrockCodecHelper_v766_NetEase(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) .updateSerializer(PlayerAuthInputPacket.class, PlayerAuthInputSerializer_v766_NetEase.INSTANCE) - .updateSerializer(TextPacket.class, TextSerializer_v766_NetEase.INSTANCE) - .updateSerializer(PlayerEnchantOptionsPacket.class, PlayerEnchantOptionsSerializer_v766_NetEase.INSTANCE) - .registerPacket(PyRpcPacket::new, PyRpcSerializer_v766_NetEase.INSTANCE, 200, PacketRecipient.BOTH) - .registerPacket(StoreBuySuccessPacket::new, StoreBuySuccessSerializer_v766_NetEase.INSTANCE, 202, PacketRecipient.BOTH) // TODO: check packet recipient - .registerPacket(NetEaseJsonPacket::new, NetEaseJsonSerializer_v766_NetEase.INSTANCE, 203, PacketRecipient.BOTH) - .registerPacket(ConfirmSkinPacket::new, ConfirmSkinSerializer_v766_NetEase.INSTANCE, 228, PacketRecipient.CLIENT) + .updateSerializer(TextPacket.class, TextSerializer_v686_NetEase.INSTANCE) + .updateSerializer(PlayerEnchantOptionsPacket.class, PlayerEnchantOptionsSerializer_v407_NetEase.INSTANCE) + .registerPacket(PyRpcPacket::new, PyRpcSerializer.INSTANCE, 200, PacketRecipient.BOTH) + .registerPacket(StoreBuySuccessPacket::new, StoreBuySuccessSerializer.INSTANCE, 202, PacketRecipient.BOTH) // TODO: check packet recipient + .registerPacket(NetEaseJsonPacket::new, NetEaseJsonSerializer.INSTANCE, 203, PacketRecipient.BOTH) + .registerPacket(ConfirmSkinPacket::new, ConfirmSkinSerializer.INSTANCE, 228, PacketRecipient.CLIENT) .build(); } diff --git a/src/main/java/org/allaymc/protocol/extension/v766/PlayerAuthInputSerializer_v766_NetEase.java b/src/main/java/org/allaymc/protocol/extension/codec/v766/serializer/PlayerAuthInputSerializer_v766_NetEase.java similarity index 96% rename from src/main/java/org/allaymc/protocol/extension/v766/PlayerAuthInputSerializer_v766_NetEase.java rename to src/main/java/org/allaymc/protocol/extension/codec/v766/serializer/PlayerAuthInputSerializer_v766_NetEase.java index 063227e..5c20986 100644 --- a/src/main/java/org/allaymc/protocol/extension/v766/PlayerAuthInputSerializer_v766_NetEase.java +++ b/src/main/java/org/allaymc/protocol/extension/codec/v766/serializer/PlayerAuthInputSerializer_v766_NetEase.java @@ -1,4 +1,4 @@ -package org.allaymc.protocol.extension.v766; +package org.allaymc.protocol.extension.codec.v766.serializer; import io.netty.buffer.ByteBuf; import org.cloudburstmc.math.vector.Vector2f; @@ -15,7 +15,7 @@ */ public class PlayerAuthInputSerializer_v766_NetEase extends PlayerAuthInputSerializer_v766 { - public static final PlayerAuthInputSerializer_v766 INSTANCE = new PlayerAuthInputSerializer_v766_NetEase(); + public static final PlayerAuthInputSerializer_v766_NetEase INSTANCE = new PlayerAuthInputSerializer_v766_NetEase(); @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PlayerAuthInputPacket packet) {