Compare commits
2 Commits
43f4eb3517
...
6b2df0c27e
Author | SHA1 | Date | |
---|---|---|---|
6b2df0c27e | |||
0e616dc7c1 |
30
game.py
30
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,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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -113,7 +113,10 @@ class ChatManager:
|
|||
elif 'text' in data:
|
||||
return data['text']
|
||||
elif 'with' in data:
|
||||
return '<{}> {}'.format(*[self.translate_chat(x) for x in data['with']])
|
||||
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))
|
||||
|
|
|
@ -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},
|
||||
]
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue
Block a user