From 0e616dc7c146c4074452319e72aa4ed60d57eee1 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Wed, 23 Sep 2020 15:36:18 -0600 Subject: [PATCH] Add living entity packets --- game.py | 29 +++++++++++++++++++++--- monkey_patch.py | 3 +++ protocol/packets.py | 55 +++++++++++++++++++++++++++++++++++++++++++++ protocol/types.py | 17 ++++++++------ 4 files changed, 94 insertions(+), 10 deletions(-) diff --git a/game.py b/game.py index 72a7538..71a5d9b 100644 --- a/game.py +++ b/game.py @@ -10,7 +10,17 @@ from panda3d.core import LPoint3f from minecraft.networking.packets import Packet, clientbound, serverbound from minecraft.networking.types import BlockFace -from protocol.packets import TimeUpdatePacket, SetSlotPacket, PlayerDiggingPacket, BlockBreakAnimationPacket, AcknowledgePlayerDiggingPacket, HeldItemChangePacket, PickItemPacket, OpenWindowPacket, ClickWindowPacket, CloseWindowPacket, ServerWindowConfirmationPacket, ClientWindowConfirmationPacket, EntityMetadataPacket +from protocol.packets import ( + TimeUpdatePacket, SetSlotPacket, PlayerDiggingPacket, + BlockBreakAnimationPacket, AcknowledgePlayerDiggingPacket, + HeldItemChangePacket, PickItemPacket, OpenWindowPacket, + ClickWindowPacket, CloseWindowPacket, ServerWindowConfirmationPacket, + ClientWindowConfirmationPacket, EntityMetadataPacket, + SpawnLivingEntityPacket, EntityPositionPacket, + EntityPositionRotationPacket, + +) + from protocol.types import Slot import utils @@ -190,6 +200,9 @@ class Game: register(self.handle_window_confirmation, ClientWindowConfirmationPacket) register(self.handle_spawn_object, clientbound.play.SpawnObjectPacket) register(self.handle_entity_metadata, EntityMetadataPacket) + register(self.handle_spawn_living, SpawnLivingEntityPacket) + register(self.handle_entity_position, EntityPositionPacket) + register(self.handle_entity_position_rotation, EntityPositionRotationPacket) #register(self.handle_packet, Packet, early=True) @@ -497,13 +510,23 @@ class Game: self.g.connection.write_packet(packet2) def handle_spawn_object(self, packet): + return print(packet) - print(packet.type_id) def handle_entity_metadata(self, packet): + return + if packet.metadata and packet.metadata[0].index == 1: return print(packet) - def handle_packet(self, packet): + def handle_spawn_living(self, packet): + print(packet) + + def handle_entity_position(self, packet): + return + print(packet) + + def handle_entity_position_rotation(self, packet): + return print(packet) def tick(self): diff --git a/monkey_patch.py b/monkey_patch.py index 0ecf959..ed06cbb 100644 --- a/monkey_patch.py +++ b/monkey_patch.py @@ -21,6 +21,9 @@ def get_packets(old_get_packets): mc_packets.add(packets.ClientWindowConfirmationPacket) mc_packets.add(packets.ServerWindowConfirmationPacket) mc_packets.add(packets.EntityMetadataPacket) + mc_packets.add(packets.SpawnLivingEntityPacket) + mc_packets.add(packets.EntityPositionPacket) + mc_packets.add(packets.EntityPositionRotationPacket) return mc_packets return lambda x: wrapper(old_get_packets, x) diff --git a/protocol/packets.py b/protocol/packets.py index bcc65d0..4bba2ca 100644 --- a/protocol/packets.py +++ b/protocol/packets.py @@ -307,3 +307,58 @@ class EntityMetadataPacket(Packet): entry = Entry.read(file_object) if not entry: break self.metadata.append(entry) + + +class SpawnLivingEntityPacket(Packet): + # Sent by the server when a living entity is spawned + # https://wiki.vg/Protocol#Spawn_Entity + + id = 0x02 + packet_name = 'spawn living entity' + + definition = [ + {'entity_id': VarInt}, + {'entity_uuid': UUID}, + {'type': VarInt}, + {'x': Double}, + {'y': Double}, + {'z': Double}, + {'yaw': Angle}, + {'pitch': Angle}, + {'head_pitch': Angle}, + {'x_velocity': Short}, + {'y_velocity': Short}, + {'z_velocity': Short}, + ] + +class EntityPositionPacket(Packet): + # Sent by the server when an entity moves less then 8 blocks + # https://wiki.vg/Protocol#Spawn_Entity + + id = 0x27 + packet_name = 'entity position' + + definition = [ + {'entity_id': VarInt}, + {'delta_x': Short}, + {'delta_y': Short}, + {'delta_z': Short}, + {'on_ground': Boolean}, + ] + +class EntityPositionRotationPacket(Packet): + # Sent by the server when an entity rotates and moves + # https://wiki.vg/Protocol#Entity_Position_and_Rotation + + id = 0x28 + packet_name = 'entity position and rotation' + + definition = [ + {'entity_id': VarInt}, + {'delta_x': Short}, + {'delta_y': Short}, + {'delta_z': Short}, + {'yaw': Angle}, + {'pitch': Angle}, + {'on_ground': Boolean}, + ] diff --git a/protocol/types.py b/protocol/types.py index 861ff5f..1d4f681 100644 --- a/protocol/types.py +++ b/protocol/types.py @@ -40,10 +40,9 @@ class Nbt(Type): @staticmethod def read(file_object): type_id = Byte.read(file_object) - if type_id == TAG_End: - return None if type_id != TAG_Compound: - raise Exception("Invalid NBT header") + #raise Exception("Invalid NBT header") + return None name = ShortPrefixedByteArray.read(file_object).decode('utf-8') a = Nbt.decode_tag(file_object, TAG_Compound) a['_name'] = name @@ -119,10 +118,14 @@ class Slot(Type): @staticmethod def read(file_object): present = Boolean.read(file_object) - item_id = VarInt.read(file_object) if present else None - item_count = Byte.read(file_object) if present else None - print('slot read', present, item_id, item_count) - nbt = Nbt.read(file_object) if present else None + if present: + item_id = VarInt.read(file_object) + item_count = Byte.read(file_object) + nbt = Nbt.read(file_object) + else: + item_id = None + item_count = None + nbt = None return Slot(present, item_id, item_count, nbt) @staticmethod