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,
),
}

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.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,24 @@ class Game:
self.g.connection.write_packet(packet2)
def handle_spawn_object(self, packet):
if packet.type_id != 37: return
print(packet)
print(packet.type_id)
def handle_entity_metadata(self, packet):
return
if packet.metadata and packet.metadata[0].index != 7: return
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)
def tick(self):

View File

@ -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)

View File

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

View File

@ -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},
]

View File

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