diff --git a/minecraft/networking/packets/clientbound/play/block_change_packet.py b/minecraft/networking/packets/clientbound/play/block_change_packet.py index 31333d0..ca9c73f 100644 --- a/minecraft/networking/packets/clientbound/play/block_change_packet.py +++ b/minecraft/networking/packets/clientbound/play/block_change_packet.py @@ -1,7 +1,7 @@ from minecraft.networking.packets import Packet from minecraft.networking.types import ( - Type, VarInt, VarLong, Long, Integer, UnsignedByte, Position, Vector, - MutableRecord, PrefixedArray, Boolean, attribute_alias, + Type, VarInt, VarLong, UnsignedLong, Integer, UnsignedByte, Position, + Vector, MutableRecord, PrefixedArray, Boolean, attribute_alias, multi_attribute_alias, ) @@ -63,17 +63,19 @@ class MultiBlockChangePacket(Packet): class ChunkSectionPos(Vector, Type): @classmethod def read(cls, file_object): - value = Long.read(file_object) - x = value >> 42 - z = (value >> 20) & 0x3FFFFF - y = value & 0xFFFFF + value = UnsignedLong.read(file_object) + y = value | ~0xFFFFF if value & 0x80000 else value & 0xFFFFF + value >>= 20 + z = value | ~0x3FFFFF if value & 0x200000 else value & 0x3FFFFF + value >>= 22 + x = value | ~0x3FFFFF if value & 0x200000 else value return cls(x, y, z) @classmethod def send(cls, pos, socket): x, y, z = pos value = (x & 0x3FFFFF) << 42 | (z & 0x3FFFFF) << 20 | y & 0xFFFFF - Long.send(value, socket) + UnsignedLong.send(value, socket) class Record(MutableRecord, Type): __slots__ = 'x', 'y', 'z', 'block_state_id' diff --git a/tests/test_serialization.py b/tests/test_serialization.py index b991913..e751c5e 100644 --- a/tests/test_serialization.py +++ b/tests/test_serialization.py @@ -7,6 +7,9 @@ from minecraft.networking.types import ( ShortPrefixedByteArray, VarIntPrefixedByteArray, UUID, String as StringType, Position, TrailingByteArray, UnsignedLong, ) +from minecraft.networking.packets.clientbound.play import ( + MultiBlockChangePacket +) from minecraft.networking.packets import PacketBuffer from minecraft.networking.connection import ConnectionContext from minecraft import SUPPORTED_PROTOCOL_VERSIONS, RELEASE_PROTOCOL_VERSIONS @@ -36,6 +39,12 @@ TEST_DATA = { UUID: ["12345678-1234-5678-1234-567812345678"], StringType: ["hello world"], Position: [(758, 0, 691), (-500, -12, -684)], + MultiBlockChangePacket.ChunkSectionPos: [ + (x, y, z) + for x in [-0x200000, -123, -1, 0, 123, 0x1FFFFF] + for z in [-0x200000, -456, -1, 0, 456, 0x1FFFFF] + for y in [-0x80000, -789, -1, 0, 789, 0x7FFFF] + ] }