From 358289cf426dffc5971287970746c44b8d41858c Mon Sep 17 00:00:00 2001 From: hkc Date: Fri, 25 Aug 2023 23:11:36 +0300 Subject: [PATCH] Added more packets --- bta_proxy/dpi.py | 16 +++++++++-- bta_proxy/packets/__init__.py | 17 ++++++++++++ bta_proxy/packets/base.py | 29 ++++++++++++++++---- bta_proxy/packets/packet101closewindow.py | 6 ++++ bta_proxy/packets/packet102windowclick.py | 13 +++++++++ bta_proxy/packets/packet10flying.py | 6 ++++ bta_proxy/packets/packet11playerposition.py | 10 +++++++ bta_proxy/packets/packet12playerlook.py | 8 ++++++ bta_proxy/packets/packet135placementmode.py | 9 ++++++ bta_proxy/packets/packet13lookmove.py | 12 ++++++++ bta_proxy/packets/packet14blockdig.py | 10 +++++++ bta_proxy/packets/packet15place.py | 11 ++++++++ bta_proxy/packets/packet16blockitemswitch.py | 6 ++++ bta_proxy/packets/packet17sleep.py | 10 +++++++ bta_proxy/packets/packet18animation.py | 7 +++++ bta_proxy/packets/packet19entityaction.py | 7 +++++ bta_proxy/packets/packet255kickdisconnect.py | 6 ++++ 17 files changed, 176 insertions(+), 7 deletions(-) create mode 100644 bta_proxy/packets/packet101closewindow.py create mode 100644 bta_proxy/packets/packet102windowclick.py create mode 100644 bta_proxy/packets/packet10flying.py create mode 100644 bta_proxy/packets/packet11playerposition.py create mode 100644 bta_proxy/packets/packet12playerlook.py create mode 100644 bta_proxy/packets/packet135placementmode.py create mode 100644 bta_proxy/packets/packet13lookmove.py create mode 100644 bta_proxy/packets/packet14blockdig.py create mode 100644 bta_proxy/packets/packet15place.py create mode 100644 bta_proxy/packets/packet16blockitemswitch.py create mode 100644 bta_proxy/packets/packet17sleep.py create mode 100644 bta_proxy/packets/packet18animation.py create mode 100644 bta_proxy/packets/packet19entityaction.py create mode 100644 bta_proxy/packets/packet255kickdisconnect.py diff --git a/bta_proxy/dpi.py b/bta_proxy/dpi.py index 9d9a7cc..f9b2294 100644 --- a/bta_proxy/dpi.py +++ b/bta_proxy/dpi.py @@ -2,14 +2,26 @@ from asyncio.queues import Queue from bta_proxy.datainputstream import AsyncDataInputStream -from bta_proxy.packets.base import Packet +from bta_proxy.packets import * async def inspect_client(queue: Queue, addr: tuple[str, int]): dis = AsyncDataInputStream(queue) while True: pkt = await Packet.read_packet(dis) - print("C", pkt) + match pkt.packet_id: + case Packet10Flying.packet_id: + continue + case Packet11PlayerPosition.packet_id: + continue + case Packet12PlayerLook.packet_id: + continue + case Packet13LookMove.packet_id: + continue + case Packet255KickDisconnect.packet_id: + break + case _: + print("C", pkt) async def inspect_server(queue: Queue, addr: tuple[str, int]): dis = AsyncDataInputStream(queue) diff --git a/bta_proxy/packets/__init__.py b/bta_proxy/packets/__init__.py index 9ebba70..14d2a16 100644 --- a/bta_proxy/packets/__init__.py +++ b/bta_proxy/packets/__init__.py @@ -12,3 +12,20 @@ from .packet24mobspawn import Packet24MobSpawn from .packet4updatetime import Packet4UpdateTime from .packet138playerlist import Packet138PlayerList from .packet72updateplayerprofile import Packet72UpdatePlayerProfile +from .packet135placementmode import Packet135PlacementMode +from .packet13lookmove import Packet13LookMove +from .packet11playerposition import Packet11PlayerPosition +from .packet12playerlook import Packet12PlayerLook +from .packet10flying import Packet10Flying +from .packet101closewindow import Packet101CloseWindow +from .packet14blockdig import Packet14BlockDig +from .packet18animation import Packet18Animation +from .packet19entityaction import Packet19EntityAction +from .packet17sleep import Packet17Sleep +from .packet17sleep import Packet17Sleep +from .packet16blockitemswitch import Packet16BlockItemSwitch +from .packet15place import Packet15Place +from .packet15place import Packet15Place +from .packet255kickdisconnect import Packet255KickDisconnect +from .packet255kickdisconnect import Packet255KickDisconnect +from .packet102windowclick import Packet102WindowClick diff --git a/bta_proxy/packets/base.py b/bta_proxy/packets/base.py index fbdc364..8e375ea 100644 --- a/bta_proxy/packets/base.py +++ b/bta_proxy/packets/base.py @@ -1,6 +1,7 @@ from typing import Any, ClassVar, Type from bta_proxy.entitydata import EntityData +from bta_proxy.itemstack import ItemStack from ..datainputstream import AsyncDataInputStream class Packet: @@ -16,11 +17,11 @@ class Packet: async def read_data_from(cls, stream: AsyncDataInputStream) -> 'Packet': fields: dict = {} for key, datatype in cls.FIELDS: - fields[key] = await cls.read_field(stream, datatype) + fields[key] = await cls.read_field(stream, datatype, fields) return cls(**fields) @staticmethod - async def read_field(stream: AsyncDataInputStream, datatype: Any): + async def read_field(stream: AsyncDataInputStream, datatype: Any, fields: dict[str, Any] = {}): match datatype: case 'uint': return await stream.read_uint() @@ -30,6 +31,10 @@ class Packet: return await stream.read_string() case 'str', length: return (await stream.read_string())[:length] + case 'string': + return await stream.read_string() + case 'string', length: + return (await stream.read_string())[:length] case 'ulong': return await stream.read_ulong() case 'long': @@ -46,8 +51,22 @@ class Packet: return await stream.read_double() case 'bool': return await stream.read_boolean() - case 'bytes', length: - return await stream.read_bytes(length) + case 'bytes', length_or_key: + if isinstance(length_or_key, int): + return await stream.read_bytes(length_or_key) + elif isinstance(length_or_key, str): + if length_or_key not in fields: + raise KeyError(f'failed to find {length_or_key} in {fields} to read bytes length') + return await stream.read_bytes(fields[length_or_key]) + raise ValueError(f'invalid type for bytes length_or_key: {length_or_key!r}') + case 'itemstack': + return await ItemStack.read_from(stream) + case 'itemstack_optional': + if (item_id := await stream.read_short()) >= 0: + count = await stream.read() + data = await stream.read_short() + return ItemStack(item_id, count, data) + return None case 'entitydata': return await EntityData.read_from(stream) case _: @@ -62,7 +81,7 @@ class Packet: async def read_packet(cls, stream: AsyncDataInputStream) -> 'Packet': packet_id: int = await stream.read() if packet_id not in cls.REGISTRY: - raise ValueError(f'invalid packet 0x{packet_id:02x}') + raise ValueError(f'invalid packet 0x{packet_id:02x} ({packet_id})') pkt = await cls.REGISTRY[packet_id].read_data_from(stream) pkt.packet_id = packet_id return pkt diff --git a/bta_proxy/packets/packet101closewindow.py b/bta_proxy/packets/packet101closewindow.py new file mode 100644 index 0000000..9cd67c7 --- /dev/null +++ b/bta_proxy/packets/packet101closewindow.py @@ -0,0 +1,6 @@ +from .base import Packet + +class Packet101CloseWindow(Packet, packet_id=101): + FIELDS = [ + ('window_id', 'byte'), + ] diff --git a/bta_proxy/packets/packet102windowclick.py b/bta_proxy/packets/packet102windowclick.py new file mode 100644 index 0000000..a935faf --- /dev/null +++ b/bta_proxy/packets/packet102windowclick.py @@ -0,0 +1,13 @@ +from bta_proxy.datainputstream import AsyncDataInputStream +from bta_proxy.itemstack import ItemStack +from .base import Packet + +class Packet102WindowClick(Packet, packet_id=102): + FIELDS = [ + ('window_id', 'byte'), + ('action', 'byte'), + ('size', 'byte'), + ('args', ('bytes', 'size')), + ('action_id', 'short'), + ('item', 'itemstack_optional') + ] diff --git a/bta_proxy/packets/packet10flying.py b/bta_proxy/packets/packet10flying.py new file mode 100644 index 0000000..1fdcb62 --- /dev/null +++ b/bta_proxy/packets/packet10flying.py @@ -0,0 +1,6 @@ +from .base import Packet + +class Packet10Flying(Packet, packet_id=10): + FIELDS = [ + ('grounded', 'bool'), + ] diff --git a/bta_proxy/packets/packet11playerposition.py b/bta_proxy/packets/packet11playerposition.py new file mode 100644 index 0000000..dbb1c04 --- /dev/null +++ b/bta_proxy/packets/packet11playerposition.py @@ -0,0 +1,10 @@ +from .base import Packet + +class Packet11PlayerPosition(Packet, packet_id=11): + FIELDS = [ + ('x', 'double'), + ('y', 'double'), + ('stance', 'double'), + ('z', 'double'), + ('grounded', 'bool'), + ] diff --git a/bta_proxy/packets/packet12playerlook.py b/bta_proxy/packets/packet12playerlook.py new file mode 100644 index 0000000..9927e88 --- /dev/null +++ b/bta_proxy/packets/packet12playerlook.py @@ -0,0 +1,8 @@ +from .base import Packet + +class Packet12PlayerLook(Packet, packet_id=12): + FIELDS = [ + ('yaw', 'float'), + ('pitch', 'float'), + ('grounded', 'bool'), + ] diff --git a/bta_proxy/packets/packet135placementmode.py b/bta_proxy/packets/packet135placementmode.py new file mode 100644 index 0000000..83f9d5c --- /dev/null +++ b/bta_proxy/packets/packet135placementmode.py @@ -0,0 +1,9 @@ +from .base import Packet + +class Packet135PlacementMode(Packet, packet_id=135): + FIELDS = [ + ('rotation', 'byte'), + ('horizontal', 'byte'), + ('vertical', 'byte'), + ('mode', 'byte'), + ] diff --git a/bta_proxy/packets/packet13lookmove.py b/bta_proxy/packets/packet13lookmove.py new file mode 100644 index 0000000..0acc8cf --- /dev/null +++ b/bta_proxy/packets/packet13lookmove.py @@ -0,0 +1,12 @@ +from .base import Packet + +class Packet13LookMove(Packet, packet_id=13): + FIELDS = [ + ('x', 'double'), + ('y', 'double'), + ('stance', 'double'), + ('z', 'double'), + ('yaw', 'float'), + ('pitch', 'float'), + ('grounded', 'bool'), + ] diff --git a/bta_proxy/packets/packet14blockdig.py b/bta_proxy/packets/packet14blockdig.py new file mode 100644 index 0000000..b494909 --- /dev/null +++ b/bta_proxy/packets/packet14blockdig.py @@ -0,0 +1,10 @@ +from .base import Packet + +class Packet14BlockDig(Packet, packet_id=14): + FIELDS = [ + ('status', 'byte'), + ('x', 'int'), + ('y', 'byte'), + ('z', 'int'), + ('side', 'byte'), + ] diff --git a/bta_proxy/packets/packet15place.py b/bta_proxy/packets/packet15place.py new file mode 100644 index 0000000..245ac5b --- /dev/null +++ b/bta_proxy/packets/packet15place.py @@ -0,0 +1,11 @@ +from .base import Packet + +class Packet15Place(Packet, packet_id=15): + FIELDS = [ + ('x', 'int'), + ('y', 'byte'), + ('z', 'int'), + ('direction', 'byte'), + ('y_placed', 'double'), + ('item', 'itemstack_optional') + ] diff --git a/bta_proxy/packets/packet16blockitemswitch.py b/bta_proxy/packets/packet16blockitemswitch.py new file mode 100644 index 0000000..983af2c --- /dev/null +++ b/bta_proxy/packets/packet16blockitemswitch.py @@ -0,0 +1,6 @@ +from .base import Packet + +class Packet16BlockItemSwitch(Packet, packet_id=16): + FIELDS = [ + ('item_id', 'short'), + ] diff --git a/bta_proxy/packets/packet17sleep.py b/bta_proxy/packets/packet17sleep.py new file mode 100644 index 0000000..045a74d --- /dev/null +++ b/bta_proxy/packets/packet17sleep.py @@ -0,0 +1,10 @@ +from .base import Packet + +class Packet17Sleep(Packet, packet_id=17): + FIELDS = [ + ('entity_id', 'int'), + ('field_22046_e', 'byte'), + ('x', 'int'), + ('y', 'int'), + ('z', 'int'), + ] diff --git a/bta_proxy/packets/packet18animation.py b/bta_proxy/packets/packet18animation.py new file mode 100644 index 0000000..954cebb --- /dev/null +++ b/bta_proxy/packets/packet18animation.py @@ -0,0 +1,7 @@ +from .base import Packet + +class Packet18Animation(Packet, packet_id=18): + FIELDS = [ + ('entity_id', 'int'), + ('animate', 'byte'), + ] diff --git a/bta_proxy/packets/packet19entityaction.py b/bta_proxy/packets/packet19entityaction.py new file mode 100644 index 0000000..331fb30 --- /dev/null +++ b/bta_proxy/packets/packet19entityaction.py @@ -0,0 +1,7 @@ +from .base import Packet + +class Packet19EntityAction(Packet, packet_id=19): + FIELDS = [ + ('entity_id', 'int'), + ('state', 'byte'), + ] diff --git a/bta_proxy/packets/packet255kickdisconnect.py b/bta_proxy/packets/packet255kickdisconnect.py new file mode 100644 index 0000000..9011be4 --- /dev/null +++ b/bta_proxy/packets/packet255kickdisconnect.py @@ -0,0 +1,6 @@ +from .base import Packet + +class Packet255KickDisconnect(Packet, packet_id=255): + FIELDS = [ + ('reason', ('str', 200)), + ]