From e1afabcba53456fc0790a00dfc9642e961c4b66f Mon Sep 17 00:00:00 2001 From: Sillyfrog Date: Wed, 11 Dec 2019 15:52:25 +1000 Subject: [PATCH] Add support for v1.15 --- minecraft/__init__.py | 1 + minecraft/networking/connection.py | 1 + .../packets/clientbound/play/__init__.py | 38 +++++++++++++------ .../clientbound/play/block_change_packet.py | 6 ++- .../clientbound/play/combat_event_packet.py | 3 +- .../clientbound/play/explosion_packet.py | 3 +- .../clientbound/play/face_player_packet.py | 3 +- .../packets/clientbound/play/map_packet.py | 3 +- .../play/player_list_item_packet.py | 4 +- .../play/player_position_and_look_packet.py | 3 +- .../clientbound/play/sound_effect_packet.py | 3 +- tests/fake_server.py | 5 ++- 12 files changed, 50 insertions(+), 23 deletions(-) diff --git a/minecraft/__init__.py b/minecraft/__init__.py index 06e4a3a..e2f64da 100644 --- a/minecraft/__init__.py +++ b/minecraft/__init__.py @@ -197,6 +197,7 @@ SUPPORTED_MINECRAFT_VERSIONS = { '1.14.4-pre6': 496, '1.14.4-pre7': 497, '1.14.4': 498, + '1.15': 573, } # Those Minecraft versions supported by pyCraft which are "release" versions, diff --git a/minecraft/networking/connection.py b/minecraft/networking/connection.py index f696743..23770c0 100644 --- a/minecraft/networking/connection.py +++ b/minecraft/networking/connection.py @@ -642,6 +642,7 @@ class PacketReactor(object): # If we know the structure of the packet, attempt to parse it # otherwise just skip it if packet_id in self.clientbound_packets: + # print("XXX packet_id 0x{:02X}".format(packet_id)) packet = self.clientbound_packets[packet_id]() packet.context = self.connection.context packet.read(packet_data) diff --git a/minecraft/networking/packets/clientbound/play/__init__.py b/minecraft/networking/packets/clientbound/play/__init__.py index 45be9dd..939cb11 100644 --- a/minecraft/networking/packets/clientbound/play/__init__.py +++ b/minecraft/networking/packets/clientbound/play/__init__.py @@ -5,7 +5,8 @@ from minecraft.networking.packets import ( from minecraft.networking.types import ( Integer, FixedPointInteger, Angle, UnsignedByte, Byte, Boolean, UUID, Short, VarInt, Double, Float, String, Enum, Difficulty, Dimension, - GameMode, Vector, Direction, PositionAndLook, multi_attribute_alias, + GameMode, Long, Vector, Direction, PositionAndLook, + multi_attribute_alias, ) from .combat_event_packet import CombatEventPacket @@ -61,7 +62,8 @@ def get_packets(context): class KeepAlivePacket(AbstractKeepAlivePacket): @staticmethod def get_id(context): - return 0x20 if context.protocol_version >= 471 else \ + return 0x21 if context.protocol_version >= 573 else \ + 0x20 if context.protocol_version >= 471 else \ 0x21 if context.protocol_version >= 389 else \ 0x20 if context.protocol_version >= 345 else \ 0x1F if context.protocol_version >= 332 else \ @@ -73,7 +75,8 @@ class KeepAlivePacket(AbstractKeepAlivePacket): class JoinGamePacket(Packet): @staticmethod def get_id(context): - return 0x25 if context.protocol_version >= 389 else \ + return 0x26 if context.protocol_version >= 573 else \ + 0x25 if context.protocol_version >= 389 else \ 0x24 if context.protocol_version >= 345 else \ 0x23 if context.protocol_version >= 332 else \ 0x24 if context.protocol_version >= 318 else \ @@ -85,11 +88,13 @@ class JoinGamePacket(Packet): {'entity_id': Integer}, {'game_mode': UnsignedByte}, {'dimension': Integer if context.protocol_version >= 108 else Byte}, + {'hashed_seed': Long} if context.protocol_version >= 573 else {}, {'difficulty': UnsignedByte} if context.protocol_version < 464 else {}, {'max_players': UnsignedByte}, {'level_type': String}, {'render_distance': VarInt} if context.protocol_version >= 468 else {}, {'reduced_debug_info': Boolean}, + {'respawn_screen': Boolean} if context.protocol_version >= 573 else {}, ]) # These aliases declare the Enum type corresponding to each field: @@ -101,7 +106,8 @@ class JoinGamePacket(Packet): class ServerDifficultyPacket(Packet): @staticmethod def get_id(context): - return 0x0D if context.protocol_version >= 332 else \ + return 0x0E if context.protocol_version >= 573 else \ + 0x0D if context.protocol_version >= 332 else \ 0x0E if context.protocol_version >= 318 else \ 0x0D if context.protocol_version >= 70 else \ 0x41 @@ -119,7 +125,8 @@ class ServerDifficultyPacket(Packet): class ChatMessagePacket(Packet): @staticmethod def get_id(context): - return 0x0E if context.protocol_version >= 343 else \ + return 0x0F if context.protocol_version >= 573 else \ + 0x0E if context.protocol_version >= 343 else \ 0x0F if context.protocol_version >= 332 else \ 0x10 if context.protocol_version >= 317 else \ 0x0F if context.protocol_version >= 107 else \ @@ -139,7 +146,8 @@ class ChatMessagePacket(Packet): class DisconnectPacket(Packet): @staticmethod def get_id(context): - return 0x1A if context.protocol_version >= 471 else \ + return 0x1B if context.protocol_version >= 573 else \ + 0x1A if context.protocol_version >= 471 else \ 0x1B if context.protocol_version >= 345 else \ 0x1A if context.protocol_version >= 332 else \ 0x1B if context.protocol_version >= 318 else \ @@ -198,7 +206,8 @@ class SpawnPlayerPacket(Packet): class EntityVelocityPacket(Packet): @staticmethod def get_id(context): - return 0x45 if context.protocol_version >= 471 else \ + return 0x46 if context.protocol_version >= 573 else \ + 0x45 if context.protocol_version >= 471 else \ 0x41 if context.protocol_version >= 461 else \ 0x42 if context.protocol_version >= 451 else \ 0x41 if context.protocol_version >= 389 else \ @@ -223,7 +232,8 @@ class EntityVelocityPacket(Packet): class UpdateHealthPacket(Packet): @staticmethod def get_id(context): - return 0x48 if context.protocol_version >= 471 else \ + return 0x49 if context.protocol_version >= 573 else \ + 0x48 if context.protocol_version >= 471 else \ 0x44 if context.protocol_version >= 461 else \ 0x45 if context.protocol_version >= 451 else \ 0x44 if context.protocol_version >= 389 else \ @@ -247,7 +257,8 @@ class UpdateHealthPacket(Packet): class RespawnPacket(Packet): @staticmethod def get_id(context): - return 0x3A if context.protocol_version >= 471 else \ + return 0x3B if context.protocol_version >= 573 else \ + 0x3A if context.protocol_version >= 471 else \ 0x38 if context.protocol_version >= 461 else \ 0x39 if context.protocol_version >= 451 else \ 0x38 if context.protocol_version >= 389 else \ @@ -276,7 +287,8 @@ class RespawnPacket(Packet): class PluginMessagePacket(AbstractPluginMessagePacket): @staticmethod def get_id(context): - return 0x18 if context.protocol_version >= 471 else \ + return 0x19 if context.protocol_version >= 573 else \ + 0x18 if context.protocol_version >= 471 else \ 0x19 if context.protocol_version >= 345 else \ 0x18 if context.protocol_version >= 332 else \ 0x19 if context.protocol_version >= 318 else \ @@ -287,7 +299,8 @@ class PluginMessagePacket(AbstractPluginMessagePacket): class PlayerListHeaderAndFooterPacket(Packet): @staticmethod def get_id(context): - return 0x53 if context.protocol_version >= 471 else \ + return 0x54 if context.protocol_version >= 573 else \ + 0x53 if context.protocol_version >= 471 else \ 0x5F if context.protocol_version >= 461 else \ 0x50 if context.protocol_version >= 451 else \ 0x4F if context.protocol_version >= 441 else \ @@ -307,7 +320,8 @@ class PlayerListHeaderAndFooterPacket(Packet): class EntityLookPacket(Packet): @staticmethod def get_id(context): - return 0x2A if context.protocol_version >= 389 else \ + return 0x2B if context.protocol_version >= 573 else \ + 0x2A if context.protocol_version >= 389 else \ 0x29 if context.protocol_version >= 345 else \ 0x28 if context.protocol_version >= 318 else \ 0x27 if context.protocol_version >= 94 else \ diff --git a/minecraft/networking/packets/clientbound/play/block_change_packet.py b/minecraft/networking/packets/clientbound/play/block_change_packet.py index 42764b8..c8528d4 100644 --- a/minecraft/networking/packets/clientbound/play/block_change_packet.py +++ b/minecraft/networking/packets/clientbound/play/block_change_packet.py @@ -8,7 +8,8 @@ from minecraft.networking.types import ( class BlockChangePacket(Packet): @staticmethod def get_id(context): - return 0x0B if context.protocol_version >= 332 else \ + return 0x0C if context.protocol_version >= 573 else \ + 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 \ @@ -45,7 +46,8 @@ class BlockChangePacket(Packet): class MultiBlockChangePacket(Packet): @staticmethod def get_id(context): - return 0x0F if context.protocol_version >= 343 else \ + return 0x10 if context.protocol_version >= 573 else \ + 0x0F if context.protocol_version >= 343 else \ 0x10 if context.protocol_version >= 332 else \ 0x11 if context.protocol_version >= 318 else \ 0x10 if context.protocol_version >= 67 else \ diff --git a/minecraft/networking/packets/clientbound/play/combat_event_packet.py b/minecraft/networking/packets/clientbound/play/combat_event_packet.py index a3fc48a..f983148 100644 --- a/minecraft/networking/packets/clientbound/play/combat_event_packet.py +++ b/minecraft/networking/packets/clientbound/play/combat_event_packet.py @@ -8,7 +8,8 @@ from minecraft.networking.types import ( class CombatEventPacket(Packet): @staticmethod def get_id(context): - return 0x32 if context.protocol_version >= 471 else \ + return 0x33 if context.protocol_version >= 573 else \ + 0x32 if context.protocol_version >= 471 else \ 0x30 if context.protocol_version >= 451 else \ 0x2F if context.protocol_version >= 389 else \ 0x2E if context.protocol_version >= 345 else \ diff --git a/minecraft/networking/packets/clientbound/play/explosion_packet.py b/minecraft/networking/packets/clientbound/play/explosion_packet.py index 25b2e4b..1e90712 100644 --- a/minecraft/networking/packets/clientbound/play/explosion_packet.py +++ b/minecraft/networking/packets/clientbound/play/explosion_packet.py @@ -7,7 +7,8 @@ from minecraft.networking.packets import Packet class ExplosionPacket(Packet): @staticmethod def get_id(context): - return 0x1C if context.protocol_version >= 471 else \ + return 0x1D if context.protocol_version >= 573 else \ + 0x1C if context.protocol_version >= 471 else \ 0x1E if context.protocol_version >= 389 else \ 0x1D if context.protocol_version >= 345 else \ 0x1C if context.protocol_version >= 332 else \ diff --git a/minecraft/networking/packets/clientbound/play/face_player_packet.py b/minecraft/networking/packets/clientbound/play/face_player_packet.py index 5ac351c..7aaed00 100644 --- a/minecraft/networking/packets/clientbound/play/face_player_packet.py +++ b/minecraft/networking/packets/clientbound/play/face_player_packet.py @@ -8,7 +8,8 @@ from minecraft.networking.packets import Packet class FacePlayerPacket(Packet): @staticmethod def get_id(context): - return 0x34 if context.protocol_version >= 471 else \ + return 0x35 if context.protocol_version >= 573 else \ + 0x34 if context.protocol_version >= 471 else \ 0x32 if context.protocol_version >= 451 else \ 0x31 if context.protocol_version >= 389 else \ 0x30 diff --git a/minecraft/networking/packets/clientbound/play/map_packet.py b/minecraft/networking/packets/clientbound/play/map_packet.py index 6ee625f..ce7a420 100644 --- a/minecraft/networking/packets/clientbound/play/map_packet.py +++ b/minecraft/networking/packets/clientbound/play/map_packet.py @@ -8,7 +8,8 @@ from minecraft.networking.types import ( class MapPacket(Packet): @staticmethod def get_id(context): - return 0x26 if context.protocol_version >= 389 else \ + return 0x27 if context.protocol_version >= 573 else \ + 0x26 if context.protocol_version >= 389 else \ 0x25 if context.protocol_version >= 345 else \ 0x24 if context.protocol_version >= 334 else \ 0x25 if context.protocol_version >= 318 else \ diff --git a/minecraft/networking/packets/clientbound/play/player_list_item_packet.py b/minecraft/networking/packets/clientbound/play/player_list_item_packet.py index c1003c3..2d133c3 100644 --- a/minecraft/networking/packets/clientbound/play/player_list_item_packet.py +++ b/minecraft/networking/packets/clientbound/play/player_list_item_packet.py @@ -5,10 +5,12 @@ from minecraft.networking.types import ( ) +# Player Info class PlayerListItemPacket(Packet): @staticmethod def get_id(context): - return 0x33 if context.protocol_version >= 471 else \ + return 0x34 if context.protocol_version >= 573 else \ + 0x33 if context.protocol_version >= 471 else \ 0x31 if context.protocol_version >= 451 else \ 0x30 if context.protocol_version >= 389 else \ 0x2F if context.protocol_version >= 345 else \ diff --git a/minecraft/networking/packets/clientbound/play/player_position_and_look_packet.py b/minecraft/networking/packets/clientbound/play/player_position_and_look_packet.py index 508875d..aba13c6 100644 --- a/minecraft/networking/packets/clientbound/play/player_position_and_look_packet.py +++ b/minecraft/networking/packets/clientbound/play/player_position_and_look_packet.py @@ -9,7 +9,8 @@ from minecraft.networking.types import ( class PlayerPositionAndLookPacket(Packet, BitFieldEnum): @staticmethod def get_id(context): - return 0x35 if context.protocol_version >= 471 else \ + return 0x36 if context.protocol_version >= 573 else \ + 0x35 if context.protocol_version >= 471 else \ 0x33 if context.protocol_version >= 451 else \ 0x32 if context.protocol_version >= 389 else \ 0x31 if context.protocol_version >= 352 else \ diff --git a/minecraft/networking/packets/clientbound/play/sound_effect_packet.py b/minecraft/networking/packets/clientbound/play/sound_effect_packet.py index b58c59e..2ed0321 100644 --- a/minecraft/networking/packets/clientbound/play/sound_effect_packet.py +++ b/minecraft/networking/packets/clientbound/play/sound_effect_packet.py @@ -9,7 +9,8 @@ __all__ = 'SoundEffectPacket', class SoundEffectPacket(Packet): @staticmethod def get_id(context): - return 0x51 if context.protocol_version >= 471 else \ + return 0x52 if context.protocol_version >= 573 else \ + 0x51 if context.protocol_version >= 471 else \ 0x4D if context.protocol_version >= 461 else \ 0x4E if context.protocol_version >= 451 else \ 0x4E if context.protocol_version >= 451 else \ diff --git a/tests/fake_server.py b/tests/fake_server.py index 90aafc1..ead9e9e 100644 --- a/tests/fake_server.py +++ b/tests/fake_server.py @@ -102,8 +102,9 @@ class FakeClientHandler(object): def handle_play_start(self): # Called upon entering the play state. self.write_packet(clientbound.play.JoinGamePacket( - entity_id=0, game_mode=0, dimension=0, difficulty=2, max_players=1, - level_type='default', reduced_debug_info=False, render_distance=9)) + entity_id=0, game_mode=0, dimension=0, hashed_seed=12345, + difficulty=2, max_players=1, level_type='default', + reduced_debug_info=False, render_distance=9, respawn_screen=False)) def handle_play_packet(self, packet): # Called upon each packet received after handle_play_start() returns.