Add living entity packets

This commit is contained in:
Tanner Collin 2020-09-23 15:36:18 -06:00
parent 43f4eb3517
commit 0e616dc7c1
4 changed files with 94 additions and 10 deletions

29
game.py
View File

@ -10,7 +10,17 @@ from panda3d.core import LPoint3f
from minecraft.networking.packets import Packet, clientbound, serverbound from minecraft.networking.packets import Packet, clientbound, serverbound
from minecraft.networking.types import BlockFace 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 from protocol.types import Slot
import utils import utils
@ -190,6 +200,9 @@ class Game:
register(self.handle_window_confirmation, ClientWindowConfirmationPacket) register(self.handle_window_confirmation, ClientWindowConfirmationPacket)
register(self.handle_spawn_object, clientbound.play.SpawnObjectPacket) register(self.handle_spawn_object, clientbound.play.SpawnObjectPacket)
register(self.handle_entity_metadata, EntityMetadataPacket) 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) #register(self.handle_packet, Packet, early=True)
@ -497,13 +510,23 @@ class Game:
self.g.connection.write_packet(packet2) self.g.connection.write_packet(packet2)
def handle_spawn_object(self, packet): def handle_spawn_object(self, packet):
return
print(packet) print(packet)
print(packet.type_id)
def handle_entity_metadata(self, packet): def handle_entity_metadata(self, packet):
return
if packet.metadata and packet.metadata[0].index == 1: return
print(packet) 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) print(packet)
def tick(self): def tick(self):

View File

@ -21,6 +21,9 @@ def get_packets(old_get_packets):
mc_packets.add(packets.ClientWindowConfirmationPacket) mc_packets.add(packets.ClientWindowConfirmationPacket)
mc_packets.add(packets.ServerWindowConfirmationPacket) mc_packets.add(packets.ServerWindowConfirmationPacket)
mc_packets.add(packets.EntityMetadataPacket) mc_packets.add(packets.EntityMetadataPacket)
mc_packets.add(packets.SpawnLivingEntityPacket)
mc_packets.add(packets.EntityPositionPacket)
mc_packets.add(packets.EntityPositionRotationPacket)
return mc_packets return mc_packets
return lambda x: wrapper(old_get_packets, x) return lambda x: wrapper(old_get_packets, x)

View File

@ -307,3 +307,58 @@ class EntityMetadataPacket(Packet):
entry = Entry.read(file_object) entry = Entry.read(file_object)
if not entry: break if not entry: break
self.metadata.append(entry) 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},
]

View File

@ -40,10 +40,9 @@ class Nbt(Type):
@staticmethod @staticmethod
def read(file_object): def read(file_object):
type_id = Byte.read(file_object) type_id = Byte.read(file_object)
if type_id == TAG_End:
return None
if type_id != TAG_Compound: 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') name = ShortPrefixedByteArray.read(file_object).decode('utf-8')
a = Nbt.decode_tag(file_object, TAG_Compound) a = Nbt.decode_tag(file_object, TAG_Compound)
a['_name'] = name a['_name'] = name
@ -119,10 +118,14 @@ class Slot(Type):
@staticmethod @staticmethod
def read(file_object): def read(file_object):
present = Boolean.read(file_object) present = Boolean.read(file_object)
item_id = VarInt.read(file_object) if present else None if present:
item_count = Byte.read(file_object) if present else None item_id = VarInt.read(file_object)
print('slot read', present, item_id, item_count) item_count = Byte.read(file_object)
nbt = Nbt.read(file_object) if present else None nbt = Nbt.read(file_object)
else:
item_id = None
item_count = None
nbt = None
return Slot(present, item_id, item_count, nbt) return Slot(present, item_id, item_count, nbt)
@staticmethod @staticmethod