Compare commits

...

2 Commits

Author SHA1 Message Date
6b2df0c27e Fix hidden item metadata bug 2020-09-24 16:02:15 -06:00
0e616dc7c1 Add living entity packets 2020-09-23 15:36:18 -06:00
6 changed files with 102 additions and 12 deletions

View File

@ -23,4 +23,3 @@ WINDOWS = {
slot_diff=45, slot_diff=45,
), ),
} }

30
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,24 @@ 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):
if packet.type_id != 37: 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 != 7: return
print(packet) print(packet)
def handle_packet(self, packet): def handle_spawn_living(self, packet):
return
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

@ -113,7 +113,10 @@ class ChatManager:
elif 'text' in data: elif 'text' in data:
return data['text'] return data['text']
elif 'with' in data: elif 'with' in data:
if len(data['with']) >= 2:
return '<{}> {}'.format(*[self.translate_chat(x) for x in data['with']]) return '<{}> {}'.format(*[self.translate_chat(x) for x in data['with']])
else:
return self.translate_chat(data['with'][0])
elif 'translate' in data: elif 'translate' in data:
return data['translate'] return data['translate']
else: else:
@ -127,6 +130,7 @@ class ChatManager:
print('[%s] %s'%(source, text)) print('[%s] %s'%(source, text))
except Exception as ex: except Exception as ex:
print('Exception %r on message (%s): %s' % (ex, chat_packet.field_string('position'), chat_packet.json_data)) print('Exception %r on message (%s): %s' % (ex, chat_packet.field_string('position'), chat_packet.json_data))
return
if self.handler: if self.handler:
self.handler((source, text)) self.handler((source, text))

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
@ -139,9 +142,11 @@ class Entry(Type):
1: VarInt, 1: VarInt,
2: Float, 2: Float,
3: String, 3: String,
5: Boolean,
6: Slot, 6: Slot,
7: Boolean, 7: Boolean,
9: Position, 9: Position,
18: VarInt,
} }
def __init__(self, index, type, value): def __init__(self, index, type, value):