Protocol updates, new packets

This commit is contained in:
extremeheat 2021-02-25 22:18:25 -05:00
commit 863d51c56a
4 changed files with 784 additions and 37 deletions

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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
}
}
]
}
}