mirror of
https://github.com/ammaraskar/pyCraft.git
synced 2025-01-03 06:28:17 +01:00
add Block Change Packet (client bound)
This commit is contained in:
parent
ca30ff2e74
commit
93227e26fa
@ -3,7 +3,7 @@ from zlib import compress
|
||||
|
||||
from .types import (
|
||||
VarInt, Integer, Float, Double, UnsignedShort, Long, Byte, UnsignedByte,
|
||||
String, VarIntPrefixedByteArray, Boolean, UUID, Short
|
||||
String, VarIntPrefixedByteArray, Boolean, UUID, Short, UnsignedLong, Position
|
||||
)
|
||||
|
||||
|
||||
@ -1007,6 +1007,26 @@ class ClientSpawnObject(Packet):
|
||||
def write(self, socket, compression_threshold=None):
|
||||
raise NotImplementedError
|
||||
|
||||
class ClientBlockChange(Packet):
|
||||
@staticmethod
|
||||
def get_id(context):
|
||||
return 0x0B if context.protocol_version >= 332 else \
|
||||
0x0C if context.protocol_version >= 318 else \
|
||||
0x0B if context.protocol_version >= 67 else \
|
||||
0x24 if context.protocol_version >= 62 else \
|
||||
0x23
|
||||
|
||||
packet_name = 'block change'
|
||||
|
||||
def read(self, file_object):
|
||||
self.location = Position.read(file_object)
|
||||
blockData = VarInt.read(file_object)
|
||||
self.blockId = (blockData >> 4)
|
||||
self.blockMeta = (blockData & 0xF)
|
||||
|
||||
def write(self, socket, compression_threshold=None):
|
||||
raise NotImplementedError
|
||||
|
||||
def state_playing_clientbound(context):
|
||||
packets = {
|
||||
KeepAlivePacketClientbound,
|
||||
@ -1022,6 +1042,7 @@ def state_playing_clientbound(context):
|
||||
ClientCombatEvent,
|
||||
ClientExplosion,
|
||||
ClientSpawnObject,
|
||||
ClientBlockChange,
|
||||
}
|
||||
if context.protocol_version <= 47:
|
||||
packets |= {
|
||||
|
@ -147,6 +147,14 @@ class Long(Type):
|
||||
def send(value, socket):
|
||||
socket.send(struct.pack('>q', value))
|
||||
|
||||
class UnsignedLong(Type):
|
||||
@staticmethod
|
||||
def read(file_object):
|
||||
return struct.unpack('>Q', file_object.read(8))[0]
|
||||
|
||||
@staticmethod
|
||||
def send(value, socket):
|
||||
socket.send(struct.pack('>Q', value))
|
||||
|
||||
class Float(Type):
|
||||
@staticmethod
|
||||
@ -213,3 +221,31 @@ class UUID(Type):
|
||||
@staticmethod
|
||||
def send(value, socket):
|
||||
socket.send(uuid.UUID(value).bytes)
|
||||
|
||||
class Position(Type):
|
||||
@staticmethod
|
||||
def read(file_object):
|
||||
location = UnsignedLong.read(file_object) # 64-bit value
|
||||
x = int(location >> 38) # 26 MSBs
|
||||
y = int((location >> 26) & 0xFFF) # 12 bits between them
|
||||
z = int(location & 0x3FFFFFF) # 26 LSBs
|
||||
|
||||
if x >= pow(2,25):
|
||||
x -= pow(2,26)
|
||||
|
||||
if y >= pow(2,11):
|
||||
y -= pow(2,12)
|
||||
|
||||
if z >= pow(2,25):
|
||||
z -= pow(2,26)
|
||||
|
||||
return {'x': x, 'y': y, 'z': z}
|
||||
|
||||
@staticmethod
|
||||
def send(value, socket):
|
||||
# Position is a single encoded long value; use encode method to encode position properly
|
||||
UnsignedLong.send(value, socket)
|
||||
|
||||
@staticmethod
|
||||
def encode(x,y,z):
|
||||
return ((x & 0x3FFFFFF) << 38) | ((y & 0xFFF) << 26) | (z & 0x3FFFFFF)
|
||||
|
Loading…
Reference in New Issue
Block a user