From f780c0ba98deaebbf8c210cdb57449f5191e784e Mon Sep 17 00:00:00 2001 From: STYLE-STARS <485429738@qq.com> Date: Sun, 22 Feb 2026 21:44:18 +0800 Subject: [PATCH 1/6] add pyrpc to mc_bytes_packet --- tooldelta/mc_bytes_packet/pool.py | 3 +++ tooldelta/mc_bytes_packet/py_rpc.py | 41 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 tooldelta/mc_bytes_packet/py_rpc.py diff --git a/tooldelta/mc_bytes_packet/pool.py b/tooldelta/mc_bytes_packet/pool.py index 719418e0..e46c27bd 100644 --- a/tooldelta/mc_bytes_packet/pool.py +++ b/tooldelta/mc_bytes_packet/pool.py @@ -8,6 +8,7 @@ from .structure_template_data_response import ( StructureTemplateDataResponse, ) +from .py_rpc import PyRpc class BytesPacketIDs(IntEnum): @@ -15,6 +16,7 @@ class BytesPacketIDs(IntEnum): LevelChunk = PacketIDS.IDLevelChunk SubChunk = PacketIDS.IDSubChunk StructureTemplateDataResponse = PacketIDS.IDStructureTemplateDataResponse + PyRpc = PacketIDS.PyRpc BYTES_PACKET_ID_POOL: dict[int, Callable[[], BaseBytesPacket]] = { @@ -22,6 +24,7 @@ class BytesPacketIDs(IntEnum): PacketIDS.IDLevelChunk: lambda: LevelChunk(), PacketIDS.IDSubChunk: lambda: SubChunk(), PacketIDS.IDStructureTemplateDataResponse: lambda: StructureTemplateDataResponse(), + PacketIDS.IDPyRpc: lambda: PyRpc() } diff --git a/tooldelta/mc_bytes_packet/py_rpc.py b/tooldelta/mc_bytes_packet/py_rpc.py new file mode 100644 index 00000000..b4894492 --- /dev/null +++ b/tooldelta/mc_bytes_packet/py_rpc.py @@ -0,0 +1,41 @@ +import struct +import msgpack +from dataclasses import dataclass +from io import BytesIO +from tooldelta.constants.packets import PacketIDS +from tooldelta.mc_bytes_packet.base_bytes_packet import BaseBytesPacket +from typing import Any + + +@dataclass +class PyRpc(BaseBytesPacket): + Value: Any = None + OperationType: int = 0 + + def name(self) -> str: + return "PyRpc" + + def custom_packet_id(self) -> int: + return 4 + + def real_packet_id(self) -> int: + return PacketIDS.IDPyRpc + + def encode(self) -> bytes: + raise NotImplementedError("Encode packet.PyRpc is not support") + + def decode(self, bs: bytes): + reader = BytesIO(bs) + length = 0 + shift = 0 + # 处理PyRpc的Value字段开头的VarInt + while True: + b = reader.read(1)[0] + length |= (b & 0x7F) << shift + if (b & 0x80) == 0: + break + shift += 7 + msgpack_bytes = reader.read(length) + self.Value = msgpack.unpackb(msgpack_bytes, raw=False, strict_map_key=False) + operation_type_bytes = bs[-4:] + self.OperationType = struct.unpack(" Date: Sun, 22 Feb 2026 23:18:23 +0800 Subject: [PATCH 2/6] Apply suggestion from @Happy2018new Co-authored-by: Eternal Crystal <109064184+Happy2018new@users.noreply.github.com> --- tooldelta/mc_bytes_packet/py_rpc.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tooldelta/mc_bytes_packet/py_rpc.py b/tooldelta/mc_bytes_packet/py_rpc.py index b4894492..7da9b394 100644 --- a/tooldelta/mc_bytes_packet/py_rpc.py +++ b/tooldelta/mc_bytes_packet/py_rpc.py @@ -35,7 +35,5 @@ def decode(self, bs: bytes): if (b & 0x80) == 0: break shift += 7 - msgpack_bytes = reader.read(length) - self.Value = msgpack.unpackb(msgpack_bytes, raw=False, strict_map_key=False) - operation_type_bytes = bs[-4:] - self.OperationType = struct.unpack(" Date: Mon, 23 Feb 2026 19:50:46 +0800 Subject: [PATCH 3/6] transfer pyrpc encoding format from varuint32 to uint32 --- tooldelta/mc_bytes_packet/py_rpc.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/tooldelta/mc_bytes_packet/py_rpc.py b/tooldelta/mc_bytes_packet/py_rpc.py index 7da9b394..dde4b29f 100644 --- a/tooldelta/mc_bytes_packet/py_rpc.py +++ b/tooldelta/mc_bytes_packet/py_rpc.py @@ -6,6 +6,9 @@ from tooldelta.mc_bytes_packet.base_bytes_packet import BaseBytesPacket from typing import Any +PYRPC_OP_SEND = 0x05DB23AE +PYRPC_OP_RECV = 0x0094D408 + @dataclass class PyRpc(BaseBytesPacket): @@ -22,18 +25,17 @@ def real_packet_id(self) -> int: return PacketIDS.IDPyRpc def encode(self) -> bytes: - raise NotImplementedError("Encode packet.PyRpc is not support") + writer = BytesIO() + packed_value = msgpack.packb(self.Value, use_bin_type=True) + writer.write(struct.pack(" Date: Tue, 24 Feb 2026 15:56:04 +0800 Subject: [PATCH 4/6] remove tooldelta/constants/netease.py --- tooldelta/constants/netease.py | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 tooldelta/constants/netease.py diff --git a/tooldelta/constants/netease.py b/tooldelta/constants/netease.py deleted file mode 100644 index 66153752..00000000 --- a/tooldelta/constants/netease.py +++ /dev/null @@ -1,2 +0,0 @@ -PYRPC_OP_SEND = 0x05DB23AE -PYRPC_OP_RECV = 0x0094D408 From 891f9929bf45f4afa6e016477d2840cba52dbab8 Mon Sep 17 00:00:00 2001 From: STYLE_STARS <485429738@qq.com> Date: Tue, 24 Feb 2026 15:59:21 +0800 Subject: [PATCH 5/6] Apply suggestion from @Happy2018new Co-authored-by: Eternal Crystal <109064184+Happy2018new@users.noreply.github.com> --- tooldelta/mc_bytes_packet/py_rpc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tooldelta/mc_bytes_packet/py_rpc.py b/tooldelta/mc_bytes_packet/py_rpc.py index dde4b29f..56cdeab7 100644 --- a/tooldelta/mc_bytes_packet/py_rpc.py +++ b/tooldelta/mc_bytes_packet/py_rpc.py @@ -26,8 +26,8 @@ def real_packet_id(self) -> int: def encode(self) -> bytes: writer = BytesIO() - packed_value = msgpack.packb(self.Value, use_bin_type=True) - writer.write(struct.pack(" Date: Tue, 24 Feb 2026 16:04:48 +0800 Subject: [PATCH 6/6] Fix encoding by writing the correct payload --- tooldelta/mc_bytes_packet/py_rpc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooldelta/mc_bytes_packet/py_rpc.py b/tooldelta/mc_bytes_packet/py_rpc.py index 56cdeab7..39496a10 100644 --- a/tooldelta/mc_bytes_packet/py_rpc.py +++ b/tooldelta/mc_bytes_packet/py_rpc.py @@ -28,7 +28,7 @@ def encode(self) -> bytes: writer = BytesIO() payload = msgpack.packb(self.Value, use_bin_type=True) writer.write(struct.pack("