Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ConfirmSkinPacket> {
public static final ConfirmSkinSerializer_v766_NetEase INSTANCE = new ConfirmSkinSerializer_v766_NetEase();
public class ConfirmSkinSerializer implements BedrockPacketSerializer<ConfirmSkinPacket> {
public static final ConfirmSkinSerializer INSTANCE = new ConfirmSkinSerializer();

@Override
public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ConfirmSkinPacket packet) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -8,8 +8,8 @@
/**
* @author daoge_cmd
*/
public class NetEaseJsonSerializer_v766_NetEase implements BedrockPacketSerializer<NetEaseJsonPacket> {
public static final NetEaseJsonSerializer_v766_NetEase INSTANCE = new NetEaseJsonSerializer_v766_NetEase();
public class NetEaseJsonSerializer implements BedrockPacketSerializer<NetEaseJsonPacket> {
public static final NetEaseJsonSerializer INSTANCE = new NetEaseJsonSerializer();

@Override
public void serialize(ByteBuf buffer, BedrockCodecHelper helper, NetEaseJsonPacket packet) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
@@ -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<PyRpcPacket> {
public static final PyRpcSerializer_v766_NetEase INSTANCE = new PyRpcSerializer_v766_NetEase();
public class PyRpcSerializer implements BedrockPacketSerializer<PyRpcPacket> {
public static final PyRpcSerializer INSTANCE = new PyRpcSerializer();

@Override
public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PyRpcPacket packet) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -8,8 +8,8 @@
/**
* @author daoge_cmd
*/
public class StoreBuySuccessSerializer_v766_NetEase implements BedrockPacketSerializer<StoreBuySuccessPacket> {
public static final StoreBuySuccessSerializer_v766_NetEase INSTANCE = new StoreBuySuccessSerializer_v766_NetEase();
public class StoreBuySuccessSerializer implements BedrockPacketSerializer<StoreBuySuccessPacket> {
public static final StoreBuySuccessSerializer INSTANCE = new StoreBuySuccessSerializer();

@Override
public void serialize(ByteBuf buffer, BedrockCodecHelper helper, StoreBuySuccessPacket packet) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ContainerSlotType> 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();
}
Original file line number Diff line number Diff line change
@@ -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));
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Original file line number Diff line number Diff line change
@@ -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<ContainerSlotType> 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();
}
Loading