Handle entity metadata

master
Tanner Collin 4 years ago
parent 97f248b0c6
commit 43f4eb3517
  1. 16
      game.py
  2. 1
      monkey_patch.py
  3. 25
      protocol/packets.py
  4. 42
      protocol/types.py

@ -10,7 +10,7 @@ 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
from protocol.packets import TimeUpdatePacket, SetSlotPacket, PlayerDiggingPacket, BlockBreakAnimationPacket, AcknowledgePlayerDiggingPacket, HeldItemChangePacket, PickItemPacket, OpenWindowPacket, ClickWindowPacket, CloseWindowPacket, ServerWindowConfirmationPacket, ClientWindowConfirmationPacket, EntityMetadataPacket
from protocol.types import Slot
import utils
@ -188,6 +188,10 @@ class Game:
register(self.handle_break_ack, AcknowledgePlayerDiggingPacket)
register(self.handle_window, OpenWindowPacket)
register(self.handle_window_confirmation, ClientWindowConfirmationPacket)
register(self.handle_spawn_object, clientbound.play.SpawnObjectPacket)
register(self.handle_entity_metadata, EntityMetadataPacket)
#register(self.handle_packet, Packet, early=True)
self.g.chat.set_handler(self.handle_chat)
@ -492,6 +496,16 @@ class Game:
packet2.accepted = packet.accepted
self.g.connection.write_packet(packet2)
def handle_spawn_object(self, packet):
print(packet)
print(packet.type_id)
def handle_entity_metadata(self, packet):
print(packet)
def handle_packet(self, packet):
print(packet)
def tick(self):
if self.g.breaking:
self.animate()

@ -20,6 +20,7 @@ def get_packets(old_get_packets):
mc_packets.add(packets.ClickWindowPacket)
mc_packets.add(packets.ClientWindowConfirmationPacket)
mc_packets.add(packets.ServerWindowConfirmationPacket)
mc_packets.add(packets.EntityMetadataPacket)
return mc_packets
return lambda x: wrapper(old_get_packets, x)

@ -4,10 +4,11 @@ from minecraft.networking.packets import Packet, PacketBuffer
from minecraft.networking.types import (
VarInt, Integer, UnsignedByte, Position, Vector, MutableRecord,
attribute_alias, multi_attribute_alias, Long, Boolean, VarLong,
Short, UnsignedLong, Byte, BlockFace, String
Short, UnsignedLong, Byte, BlockFace, String, UUID, Angle, Double,
Float,
)
from protocol.types import Nbt, Slot
from protocol.types import Nbt, Slot, Entry
class ChunkDataPacket(Packet):
@ -286,3 +287,23 @@ class ServerWindowConfirmationPacket(Packet):
{'action_number': Short},
{'accepted': Boolean},
]
class EntityMetadataPacket(Packet):
# Updates one or more metadata properties for an existing entity
# https://wiki.vg/Protocol#Entity_Metadata
id = 0x44
packet_name = 'entity metadata'
fields = 'entity_id', 'metadata'
class Entry:
__slots__ = 'index', 'type', 'value'
def read(self, file_object):
self.entity_id = VarInt.read(file_object)
self.metadata = []
for _ in range(99):
entry = Entry.read(file_object)
if not entry: break
self.metadata.append(entry)

@ -4,7 +4,8 @@ import struct
from minecraft.networking.types.basic import (
Type, Byte, Short, Integer, Long, Float, Double,
ShortPrefixedByteArray, Boolean, VarInt, TrailingByteArray
ShortPrefixedByteArray, Boolean, VarInt, TrailingByteArray,
Position, String, UnsignedByte
)
from minecraft.networking.types.utility import Vector
@ -39,6 +40,8 @@ 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")
name = ShortPrefixedByteArray.read(file_object).decode('utf-8')
@ -118,7 +121,8 @@ class Slot(Type):
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
nbt = TrailingByteArray.read(file_object) if present else None
print('slot read', present, item_id, item_count)
nbt = Nbt.read(file_object) if present else None
return Slot(present, item_id, item_count, nbt)
@staticmethod
@ -127,3 +131,37 @@ class Slot(Type):
VarInt.send(value.item_id, socket)
Byte.send(value.item_count, socket)
TrailingByteArray.send(value.nbt, socket)
class Entry(Type):
types = {
0: Byte,
1: VarInt,
2: Float,
3: String,
6: Slot,
7: Boolean,
9: Position,
}
def __init__(self, index, type, value):
self.index = index
self.type = type
self.value = value
def __str__(self):
return str(self.__dict__)
def __repr__(self):
return 'Entry(index={}, type={}, value={}'.format(
self.index, self.type, self.value)
@staticmethod
def read(file_object):
index = UnsignedByte.read(file_object)
if index == 0xff: return None
type = VarInt.read(file_object)
try:
value = Entry.types[type].read(file_object)
except KeyError:
return None
return Entry(index, type, value)

Loading…
Cancel
Save