diff --git a/data/new/packet_map.yml b/data/new/packet_map.yml index ff3e7f0..45d1f33 100644 --- a/data/new/packet_map.yml +++ b/data/new/packet_map.yml @@ -124,6 +124,8 @@ mcpe_packet: 0x7c: level_event_generic 0x7d: lectern_update 0x7e: video_stream_connect + 0x7f: add_ecs_entity + 0x80: remove_ecs_entity 0x81: client_cache_status 0x82: on_screen_texture_animation 0x83: map_create_locked_copy @@ -132,12 +134,21 @@ mcpe_packet: 0x86: update_block_properties 0x87: client_cache_blob_status 0x88: client_cache_miss_response + 0x89: education_settings + 0x8b: multiplayer_settings + 0x8c: settings_command + 0x8d: anvil_damage + 0x8e: completed_using_item 0x8f: network_settings + 0x90: player_auth_input 0x91: creative_content 0x92: player_enchant_options 0x93: item_stack_request 0x94: item_stack_response + 0x95: player_armor_damage 0x97: update_player_game_type + 0x9a: position_tracking_db_request + 0x99: position_tracking_db_broadcast 0x9c: packet_violation_warning 0xa2: item_component 0xa3: filter_text_packet @@ -266,6 +277,8 @@ mcpe_packet: if level_event_generic: packet_level_event_generic if lectern_update: packet_lectern_update if video_stream_connect: packet_video_stream_connect + if add_ecs_entity: packet_add_ecs_entity + if remove_ecs_entity: packet_remove_ecs_entity if client_cache_status: packet_client_cache_status if on_screen_texture_animation: packet_on_screen_texture_animation if map_create_locked_copy: packet_map_create_locked_copy @@ -274,12 +287,21 @@ mcpe_packet: if update_block_properties: packet_update_block_properties if client_cache_blob_status: packet_client_cache_blob_status if client_cache_miss_response: packet_client_cache_miss_response + if education_settings: packet_education_settings + if multiplayer_settings: packet_multiplayer_settings + if settings_command: packet_settings_command + if anvil_damage: packet_anvil_damage + if completed_using_item: packet_completed_using_item if network_settings: packet_network_settings + if player_auth_input: packet_player_auth_input if creative_content: packet_creative_content if player_enchant_options: packet_player_enchant_options if item_stack_request: packet_item_stack_request if item_stack_response: packet_item_stack_response + if player_armor_damage: packet_player_armor_damage if update_player_game_type: packet_update_player_game_type + if position_tracking_db_request: packet_position_tracking_db_request + if position_tracking_db_broadcast: packet_position_tracking_db_broadcast if packet_violation_warning: packet_packet_violation_warning if item_component: packet_item_component if filter_text_packet: packet_filter_text_packet diff --git a/data/new/proto.yml b/data/new/proto.yml index 526273f..c2c5c1f 100644 --- a/data/new/proto.yml +++ b/data/new/proto.yml @@ -41,6 +41,7 @@ nbt: native packet_login: !id: 0x01 !bound: server + # Protocol version (Big Endian!) protocol_version: i32 # The combined size of the `chain` and `client_data` payload_size: varint @@ -205,13 +206,7 @@ packet_start_game: # creative spectator. # This field may be set to 5 to make the client fall back to the game mode set in the WorldGameMode # field. - player_gamemode: zigzag32 => - 0: survival - 1: creative - 2: adventure - 3: survival_spectator - 4: creative_spectator - 5: fallback + player_gamemode: GameMode # The spawn position of the player in the world. In servers this is often the same as the # world's spawn position found below. spawn: vec3f @@ -229,9 +224,9 @@ packet_start_game: # 4 being end worlds. A value of 0 will actually make the client stop rendering chunks you # send beyond the world limit. generator: zigzag32 - # The game mode that a player gets when it first spawns in the world. It is shown in the + # The world game mode that a player gets when it first spawns in the world. It is shown in the # settings and is used if the Player Gamemode is set to 5. - gamemode: zigzag32 + world_gamemode: GameMode # Difficulty is the difficulty of the world. It is a value from 0-3, with 0 being peaceful, # 1 being easy, 2 being normal and 3 being hard. difficulty: zigzag32 @@ -1065,10 +1060,14 @@ packet_change_dimension: position: vec3f respawn: bool +# SetPlayerGameType is sent by the server to update the game type (game mode) of the player packet_set_player_game_type: !id: 0x3e !bound: both - gamemode: zigzag32 + # The new gamemode for the player. + # Some of these game types require additional flags to be set in an AdventureSettings packet for + # the game mode to obtain its full functionality. + gamemode: GameMode packet_player_list: !id: 0x3f @@ -1658,10 +1657,15 @@ packet_show_profile: !bound: client xuid: string +# SetDefaultGameType is sent by the client when it toggles the default game type in the settings UI, and is +# sent by the server when it actually changes the default game type, resulting in the toggle being changed +# in the settings UI. packet_set_default_game_type: !id: 0x69 !bound: client - gamemode: varint + # GameType is the new game type that is set. When sent by the client, this is the requested new default + # game type. + gamemode: GameMode packet_remove_objective: !id: 0x6a @@ -1834,6 +1838,27 @@ packet_video_stream_connect: resolution_x: li32 resolution_y: li32 +# This is NOT a Minecraft entity, but an entity in the Entity Component System (ECS) +# for the game engine Minecrat Bedrock uses. Internally, all 'Minecraft entities' are +# known as Actors including in packet names and fields. However, these are irrelevant +# internal details so we don't do the renames in these protocol definitions, for simplicity we just use Entity. +# +# AddEntity is sent by the server to the client. Its function is not entirely clear: It does not add an +# entity in the sense of an in-game entity, but has to do with the ECS that Minecraft uses. +packet_add_ecs_entity: + !id: 0x7f + !bound: client + # EntityNetworkID is the network ID of the entity that should be added. + network_id: varint64 + +# RemoveEntity is sent by the server to the client. Its function is not entirely clear: It does not remove an +# entity in the sense of an in-game entity, but has to do with the ECS that Minecraft uses +packet_remove_ecs_entity: + !id: 0x80 + !bound: client + # EntityNetworkID is the network ID of the entity that should be removed. + network_id: varint64 + packet_client_cache_status: !id: 0x81 !bound: both @@ -1879,6 +1904,88 @@ packet_client_cache_miss_response: !bound: client blobs: Blob[]varint +# EducationSettings is a packet sent by the server to update Minecraft: Education Edition related settings. +# It is unused by the normal base game. +packet_education_settings: + !id: 0x89 + !bound: client + # CodeBuilderDefaultURI is the default URI that the code builder is ran on. Using this, a Code Builder + # program can make code directly affect the server. + CodeBuilderDefaultURI: string + # CodeBuilderTitle is the title of the code builder shown when connected to the CodeBuilderDefaultURI. + CodeBuilderTitle: string + # CanResizeCodeBuilder specifies if clients connected to the world should be able to resize the code + # builder when it is opened. + CanResizeCodeBuilder: bool + HasOverrideURI: bool + OverrideURI: HasOverrideURI? + if true: string + # HasQuiz specifies if the world has a quiz connected to it. + HasQuiz: bool + +# MultiPlayerSettings is sent by the client to update multi-player related settings server-side and sent back +# to online players by the server. +# The MultiPlayerSettings packet is a Minecraft: Education Edition packet. It has no functionality for the +# base game. +packet_multiplayer_settings: + !id: 0x8b + !bound: server + # ActionType is the action that should be done when this packet is sent. It is one of the constants that + # may be found above. + action_type: zigzag32 => + 0: enable_multiplayer + 1: disable_multiplayer + 2: refresh_join_code + +# SettingsCommand is sent by the client when it changes a setting in the settings that results in the issuing +# of a command to the server, such as when Show Coordinates is enabled. +packet_settings_command: + !id: 0x8c + !bound: server + # CommandLine is the full command line that was sent to the server as a result of the setting that the + # client changed. + command_line: string + # SuppressOutput specifies if the client requests the suppressing of the output of the command that was + # executed. Generally this is set to true, as the client won't need a message to confirm the output of + # the change. + suppress_output: bool + +# AnvilDamage is sent by the client to request the dealing damage to an anvil. This packet is completely +# pointless and the server should never listen to it. +packet_anvil_damage: + !id: 0x8d + !bound: server + # Damage is the damage that the client requests to be dealt to the anvil. + damage: u8 + # AnvilPosition is the position in the world that the anvil can be found at. + position: BlockCoordinates + +# CompletedUsingItem is sent by the server to tell the client that it should be done using the item it is +# currently using. +packet_completed_using_item: + !id: 0x8e + !bound: client + # UsedItemID is the item ID of the item that the client completed using. This should typically be the + # ID of the item held in the hand. + used_item_id: li16 + # UseMethod is the method of the using of the item that was completed. It is one of the constants that + # may be found above. + use_method: li32 => + 0: equip_armor + 1: eat + 2: attack + 3: consume + 4: throw + 5: shoot + 6: place + 7: fill_bottle + 8: fill_bucket + 9: pour_bucket + 10: use_tool + 11: interact + 12: retrieved + 13: dyed + 14: traded # NetworkSettings is sent by the server to update a variety of network settings. These settings modify the # way packets are sent over the network stack. @@ -1890,6 +1997,90 @@ packet_network_settings: # When set to 0, all packets will be left uncompressed. compression_threshold: u16 + +# PlayerAuthInput is sent by the client to allow for server authoritative movement. It is used to synchronise +# the player input with the position server-side. +# The client sends this packet when the ServerAuthoritativeMovementMode field in the StartGame packet is set +# to true, instead of the MovePlayer packet. The client will send this packet once every tick. +packet_player_auth_input: + !id: 0x90 + !bound: server + # Pitch that the player reports it has. + pitch: lf32 + # Yaw that player reports it has. + yaw: lf32 + # Position holds the position that the player reports it has. + position: vec3f + # MoveVector is a Vec2 that specifies the direction in which the player moved, as a combination of X/Z + # values which are created using the WASD/controller stick state. + move_vector: vec2f + # HeadYaw is the horizontal rotation of the head that the player reports it has. + head_yaw: lf32 + # InputData is a combination of bit flags that together specify the way the player moved last tick. It + # is a combination of the flags above. + input_data: InputFlag + # InputMode specifies the way that the client inputs data to the screen. It is one of the constants that + # may be found above. + input_mode: varint => + 0: mouse + 1: touch + 2: game_pad + 3: motion_controller + # PlayMode specifies the way that the player is playing. The values it holds, which are rather random, + # may be found above. + play_mode: varint => + 0: normal + 1: teaser + 2: screen + 3: viewer + 4: reality + 5: placement + 6: living_room + 7: exit_level + 8: exit_level_living_room + 9: num_modes + # GazeDirection is the direction in which the player is gazing, when the PlayMode is PlayModeReality: In + # other words, when the player is playing in virtual reality. + gaze_direction: play_mode ? + if reality: vec3f + # Tick is the server tick at which the packet was sent. It is used in relation to + # CorrectPlayerMovePrediction. + tick: varint64 + # Delta was the delta between the old and the new position. There isn't any practical use for this field + # as it can be calculated by the server itself. + delta: vec3f + +InputFlag: [ "bitflags", { + "type": "varint64", + "flags": { + "ascend": 0b1, + "descend": 0b10, + "north_jump": 0b100, + "jump_down": 0b1000, + "sprint_down": 0b10000, + "change_height": 0b100000, + "jumping": 0b1000000, + "auto_jumping_in_water": 0b10000000, + "sneaking": 0b100000000, + "sneak_down": 0b1000000000, + "up": 0b10000000000, + "down": 0b100000000000, + "left": 0b1000000000000, + "right": 0b10000000000000, + "up_left": 0b100000000000000, + "up_right": 0b1000000000000000, + "want_up": 0b10000000000000000, + "want_down": 0b100000000000000000, + "want_down_slow": 0b1000000000000000000, + "want_up_slow": 0b10000000000000000000, + "sprinting": 0b100000000000000000000, + "ascend_scaffolding": 0b1000000000000000000000, + "descend_scaffolding": 0b10000000000000000000000, + "sneak_toggle_down": 0b100000000000000000000000, + "persist_sneak": 0b1000000000000000000000000, + } +}] + packet_creative_content: !id: 0x91 !bound: client @@ -1910,25 +2101,123 @@ packet_item_stack_response: !bound: client responses: ItemStackResponses +# PlayerArmourDamage is sent by the server to damage the armour of a player. It is a very efficient packet, +# but generally it's much easier to just send a slot update for the damaged armour. +packet_player_armor_damage: + !id: 0x95 + !bound: client + # Bitset holds a bitset of 4 bits that indicate which pieces of armour need to have damage dealt to them. + # The first bit, when toggled, is for a helmet, the second for the chestplate, the third for the leggings + # and the fourth for boots. + type: ArmorDamageType + helmet_damage: type.head ? + if true: zigzag32 + chestplate_damage: type.chest ? + if true: zigzag32 + leggings_damage: type.legs ? + if true: zigzag32 + boots_damage: types.feet ? + if true: zigzag32 + +ArmorDamageType: [ "bitflags", + { + "type": "u8", + "flags": { + "head": 0b1, + "chest": 0b10, + "legs": 0b100, + "feet": 0b1000 + } + } +] + +# UpdatePlayerGameType is sent by the server to change the game mode of a player. It is functionally +# identical to the SetPlayerGameType packet. packet_update_player_game_type: !id: 0x97 !bound: server + # GameType is the new game type of the player. It is one of the constants that can be found in + # set_player_game_type.go. Some of these game types require additional flags to be set in an + # AdventureSettings packet for the game mode to obtain its full functionality. + gamemode: GameMode + # PlayerUniqueID is the entity unique ID of the player that should have its game mode updated. If this + # packet is sent to other clients with the player unique ID of another player, nothing happens. + player_unique_id: zigzag64 + +# PositionTrackingDBClientRequest is a packet sent by the client to request the position and dimension of a +# 'tracking ID'. These IDs are tracked in a database by the server. In 1.16, this is used for lodestones. +# The client will send this request to find the position a lodestone compass needs to point to. If found, it +# will point to the lodestone. If not, it will start spinning around. +# A PositionTrackingDBServerBroadcast packet should be sent in response to this packet. +packet_position_tracking_db_request: + !id: 0x9a + !bound: server + # RequestAction is the action that should be performed upon the receiving of the packet. It is one of the + # constants found above. + action: u8 => + 0: query + # TrackingID is a unique ID used to identify the request. The server responds with a + # PositionTrackingDBServerBroadcast packet holding the same ID, so that the client can find out what that + # packet was in response to. + tracking_id: zigzag32 + +# PositionTrackingDBServerBroadcast is sent by the server in response to the +# PositionTrackingDBClientRequest packet. This packet is, as of 1.16, currently only used for lodestones. The +# server maintains a database with tracking IDs and their position and dimension. The client will request +# these tracking IDs, (NBT tag set on the lodestone compass with the tracking ID?) and the server will +# respond with the status of those tracking IDs. +# What is actually done with the data sent depends on what the client chooses to do with it. For the +# lodestone compass, it is used to make the compass point towards lodestones and to make it spin if the +# lodestone at a position is no longer there. +packet_position_tracking_db_broadcast: + !id: 0x99 + !bound: client + # BroadcastAction specifies the status of the position tracking DB response. It is one of the constants + # above, specifying the result of the request with the ID below. + # The Update action is sent for setting the position of a lodestone compass, the Destroy and NotFound to + # indicate that there is not (no longer) a lodestone at that position. + broadcast_action: u8 => + 0: update + 1: destory + 2: not_found + # TrackingID is the ID of the PositionTrackingDBClientRequest packet that this packet was in response to. + # The tracking ID is also present as the 'id' field in the SerialisedData field. + tracking_id: zigzag32 + nbt: nbt + +# PacketViolationWarning is sent by the client when it receives an invalid packet from the server. It holds +# some information on the error that occurred. packet_packet_violation_warning: !id: 0x9c !bound: server - violation_type: zigzag32 - severity: zigzag32 + violation_type: zigzag32 => + 0: malformed + # Severity specifies the severity of the packet violation. The action the client takes after this + # violation depends on the severity sent. + severity: zigzag32 => + 0: warning + 1: final_warning + 2: terminating + # PacketID is the ID of the invalid packet that was received. packet_id: zigzag32 + # ViolationContext holds a description on the violation of the packet. reason: string +# ItemComponent is sent by the server to attach client-side components to a custom item. packet_item_component: !id: 0xa2 !bound: client + # `entries` holds a list of all custom items with their respective components set. entries: ItemComponentList +# FilterText is sent by the both the client and the server. The client sends the packet to the server to +# allow the server to filter the text server-side. The server then responds with the same packet and the +# safer version of the text. packet_filter_text_packet: !id: 0xa3 !bound: client + # Text is either the text from the client or the safer version of the text sent by the server. text: string + # FromServer indicates if the packet was sent by the server or not. from_server: bool diff --git a/data/new/types.yaml b/data/new/types.yaml index b3418ff..9be85ae 100644 --- a/data/new/types.yaml +++ b/data/new/types.yaml @@ -35,6 +35,14 @@ Experiment: Experiments: Experiment[]li32 +GameMode: zigzag32 => + 0: survival + 1: creative + 2: adventure + 3: survival_spectator + 4: creative_spectator + 5: fallback + GameRule: name: string type: varint => @@ -638,7 +646,9 @@ ItemStackResponses: []varint custom_name: string ItemComponentList: []varint + # Name is the name of the item, which is a name like 'minecraft:stick'. name: string + # Data is a map containing the components and properties of the item. nbt: nbt CommandOrigin: diff --git a/data/newproto.json b/data/newproto.json index 3a31156..38f4bfd 100644 --- a/data/newproto.json +++ b/data/newproto.json @@ -141,6 +141,20 @@ "type": "Experiment" } ], + "GameMode": [ + "mapper", + { + "type": "zigzag32", + "mappings": { + "0": "survival", + "1": "creative", + "2": "adventure", + "3": "survival_spectator", + "4": "creative_spectator", + "5": "fallback" + } + } + ], "GameRule": [ "container", [ @@ -2654,6 +2668,8 @@ "124": "level_event_generic", "125": "lectern_update", "126": "video_stream_connect", + "127": "add_ecs_entity", + "128": "remove_ecs_entity", "129": "client_cache_status", "130": "on_screen_texture_animation", "131": "map_create_locked_copy", @@ -2662,12 +2678,21 @@ "134": "update_block_properties", "135": "client_cache_blob_status", "136": "client_cache_miss_response", + "137": "education_settings", + "139": "multiplayer_settings", + "140": "settings_command", + "141": "anvil_damage", + "142": "completed_using_item", "143": "network_settings", + "144": "player_auth_input", "145": "creative_content", "146": "player_enchant_options", "147": "item_stack_request", "148": "item_stack_response", + "149": "player_armor_damage", "151": "update_player_game_type", + "153": "position_tracking_db_broadcast", + "154": "position_tracking_db_request", "156": "packet_violation_warning", "162": "item_component", "163": "filter_text_packet" @@ -2805,6 +2830,8 @@ "level_event_generic": "packet_level_event_generic", "lectern_update": "packet_lectern_update", "video_stream_connect": "packet_video_stream_connect", + "add_ecs_entity": "packet_add_ecs_entity", + "remove_ecs_entity": "packet_remove_ecs_entity", "client_cache_status": "packet_client_cache_status", "on_screen_texture_animation": "packet_on_screen_texture_animation", "map_create_locked_copy": "packet_map_create_locked_copy", @@ -2813,12 +2840,21 @@ "update_block_properties": "packet_update_block_properties", "client_cache_blob_status": "packet_client_cache_blob_status", "client_cache_miss_response": "packet_client_cache_miss_response", + "education_settings": "packet_education_settings", + "multiplayer_settings": "packet_multiplayer_settings", + "settings_command": "packet_settings_command", + "anvil_damage": "packet_anvil_damage", + "completed_using_item": "packet_completed_using_item", "network_settings": "packet_network_settings", + "player_auth_input": "packet_player_auth_input", "creative_content": "packet_creative_content", "player_enchant_options": "packet_player_enchant_options", "item_stack_request": "packet_item_stack_request", "item_stack_response": "packet_item_stack_response", + "player_armor_damage": "packet_player_armor_damage", "update_player_game_type": "packet_update_player_game_type", + "position_tracking_db_request": "packet_position_tracking_db_request", + "position_tracking_db_broadcast": "packet_position_tracking_db_broadcast", "packet_violation_warning": "packet_packet_violation_warning", "item_component": "packet_item_component", "filter_text_packet": "packet_filter_text_packet" @@ -3177,20 +3213,7 @@ }, { "name": "player_gamemode", - "type": [ - "mapper", - { - "type": "zigzag32", - "mappings": { - "0": "survival", - "1": "creative", - "2": "adventure", - "3": "survival_spectator", - "4": "creative_spectator", - "5": "fallback" - } - } - ] + "type": "GameMode" }, { "name": "spawn", @@ -3221,8 +3244,8 @@ "type": "zigzag32" }, { - "name": "gamemode", - "type": "zigzag32" + "name": "world_gamemode", + "type": "GameMode" }, { "name": "difficulty", @@ -3729,7 +3752,7 @@ "type": "varint" }, { - "anon": true, + "name": "teleport", "type": [ "switch", { @@ -3739,7 +3762,7 @@ "container", [ { - "name": "teleport_cause", + "name": "cause", "type": [ "mapper", { @@ -4746,7 +4769,7 @@ [ { "name": "gamemode", - "type": "zigzag32" + "type": "GameMode" } ] ], @@ -4792,7 +4815,7 @@ "7": "boss_killed", "8": "agent_command", "9": "agent_created", - "10": "pattern_removed", + "10": "banner_pattern_removed", "11": "commaned_executed", "12": "fish_bucketed", "13": "mob_born", @@ -5835,7 +5858,7 @@ [ { "name": "gamemode", - "type": "varint" + "type": "GameMode" } ] ], @@ -6218,6 +6241,24 @@ } ] ], + "packet_add_ecs_entity": [ + "container", + [ + { + "name": "network_id", + "type": "varint64" + } + ] + ], + "packet_remove_ecs_entity": [ + "container", + [ + { + "name": "network_id", + "type": "varint64" + } + ] + ], "packet_client_cache_status": [ "container", [ @@ -6292,6 +6333,124 @@ } ] ], + "packet_education_settings": [ + "container", + [ + { + "name": "CodeBuilderDefaultURI", + "type": "string" + }, + { + "name": "CodeBuilderTitle", + "type": "string" + }, + { + "name": "CanResizeCodeBuilder", + "type": "bool" + }, + { + "name": "HasOverrideURI", + "type": "bool" + }, + { + "name": "OverrideURI", + "type": [ + "switch", + { + "compareTo": "HasOverrideURI", + "fields": { + "true": "string" + }, + "default": "void" + } + ] + }, + { + "name": "HasQuiz", + "type": "bool" + } + ] + ], + "packet_multiplayer_settings": [ + "container", + [ + { + "name": "action_type", + "type": [ + "mapper", + { + "type": "zigzag32", + "mappings": { + "0": "enable_multiplayer", + "1": "disable_multiplayer", + "2": "refresh_join_code" + } + } + ] + } + ] + ], + "packet_settings_command": [ + "container", + [ + { + "name": "command_line", + "type": "string" + }, + { + "name": "suppress_output", + "type": "bool" + } + ] + ], + "packet_anvil_damage": [ + "container", + [ + { + "name": "damage", + "type": "u8" + }, + { + "name": "position", + "type": "BlockCoordinates" + } + ] + ], + "packet_completed_using_item": [ + "container", + [ + { + "name": "used_item_id", + "type": "li16" + }, + { + "name": "use_method", + "type": [ + "mapper", + { + "type": "li32", + "mappings": { + "0": "equip_armor", + "1": "eat", + "2": "attack", + "3": "consume", + "4": "throw", + "5": "shoot", + "6": "place", + "7": "fill_bottle", + "8": "fill_bucket", + "9": "pour_bucket", + "10": "use_tool", + "11": "interact", + "12": "retrieved", + "13": "dyed", + "14": "traded" + } + } + ] + } + ] + ], "packet_network_settings": [ "container", [ @@ -6301,6 +6460,92 @@ } ] ], + "packet_player_auth_input": [ + "container", + [ + { + "name": "pitch", + "type": "lf32" + }, + { + "name": "yaw", + "type": "lf32" + }, + { + "name": "position", + "type": "vec3f" + }, + { + "name": "move_vector", + "type": "vec2f" + }, + { + "name": "head_yaw", + "type": "lf32" + }, + { + "name": "input_data", + "type": "InputFlag" + }, + { + "name": "input_mode", + "type": [ + "mapper", + { + "type": "varint", + "mappings": { + "0": "mouse", + "1": "touch", + "2": "game_pad", + "3": "motion_controller" + } + } + ] + }, + { + "name": "play_mode", + "type": [ + "mapper", + { + "type": "varint", + "mappings": { + "0": "normal", + "1": "teaser", + "2": "screen", + "3": "viewer", + "4": "reality", + "5": "placement", + "6": "living_room", + "7": "exit_level", + "8": "exit_level_living_room", + "9": "num_modes" + } + } + ] + }, + { + "name": "gaze_direction", + "type": [ + "switch", + { + "compareTo": "play_mode", + "fields": { + "reality": "vec3f" + }, + "default": "void" + } + ] + }, + { + "name": "tick", + "type": "varint64" + }, + { + "name": "delta", + "type": "vec3f" + } + ] + ], "packet_creative_content": [ "container", [ @@ -6337,20 +6582,156 @@ } ] ], + "packet_player_armor_damage": [ + "container", + [ + { + "name": "type", + "type": "ArmorDamageType" + }, + { + "name": "helmet_damage", + "type": [ + "switch", + { + "compareTo": "type.head", + "fields": { + "true": "zigzag32" + }, + "default": "void" + } + ] + }, + { + "name": "chestplate_damage", + "type": [ + "switch", + { + "compareTo": "type.chest", + "fields": { + "true": "zigzag32" + }, + "default": "void" + } + ] + }, + { + "name": "leggings_damage", + "type": [ + "switch", + { + "compareTo": "type.legs", + "fields": { + "true": "zigzag32" + }, + "default": "void" + } + ] + }, + { + "name": "boots_damage", + "type": [ + "switch", + { + "compareTo": "types.feet", + "fields": { + "true": "zigzag32" + }, + "default": "void" + } + ] + } + ] + ], "packet_update_player_game_type": [ "container", - [] + [ + { + "name": "gamemode", + "type": "GameMode" + }, + { + "name": "player_unique_id", + "type": "zigzag64" + } + ] + ], + "packet_position_tracking_db_request": [ + "container", + [ + { + "name": "action", + "type": [ + "mapper", + { + "type": "u8", + "mappings": { + "0": "query" + } + } + ] + }, + { + "name": "tracking_id", + "type": "zigzag32" + } + ] + ], + "packet_position_tracking_db_broadcast": [ + "container", + [ + { + "name": "broadcast_action", + "type": [ + "mapper", + { + "type": "u8", + "mappings": { + "0": "update", + "1": "destory", + "2": "not_found" + } + } + ] + }, + { + "name": "tracking_id", + "type": "zigzag32" + }, + { + "name": "nbt", + "type": "nbt" + } + ] ], "packet_packet_violation_warning": [ "container", [ { "name": "violation_type", - "type": "zigzag32" + "type": [ + "mapper", + { + "type": "zigzag32", + "mappings": { + "0": "malformed" + } + } + ] }, { "name": "severity", - "type": "zigzag32" + "type": [ + "mapper", + { + "type": "zigzag32", + "mappings": { + "0": "warning", + "1": "final_warning", + "2": "terminating" + } + } + ] }, { "name": "packet_id", @@ -6469,6 +6850,51 @@ "force_move": 256 } } + ], + "InputFlag": [ + "bitflags", + { + "type": "varint64", + "flags": { + "ascend": 1, + "descend": 2, + "north_jump": 4, + "jump_down": 8, + "sprint_down": 16, + "change_height": 32, + "jumping": 64, + "auto_jumping_in_water": 128, + "sneaking": 256, + "sneak_down": 512, + "up": 1024, + "down": 2048, + "left": 4096, + "right": 8192, + "up_left": 16384, + "up_right": 32768, + "want_up": 65536, + "want_down": 131072, + "want_down_slow": 262144, + "want_up_slow": 524288, + "sprinting": 1048576, + "ascend_scaffolding": 2097152, + "descend_scaffolding": 4194304, + "sneak_toggle_down": 8388608, + "persist_sneak": 16777216 + } + } + ], + "ArmorDamageType": [ + "bitflags", + { + "type": "u8", + "flags": { + "head": 1, + "chest": 2, + "legs": 4, + "feet": 8 + } + } ] } } \ No newline at end of file