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.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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
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:
|
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))
|
||||||
|
|
|
@ -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},
|
||||||
|
]
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user