           {:name "z" :type "i32" :getter "Get the Z effect multiplied by 8"}
           {:name "volume" :type "f32" :getter "Get the volume where 1.0 is 100%"}
           {:name "pitch" :type "f32" :getter "Get the pitch"}]}
+{:name "StopSound"
+ :id 83
+ :automatic-serialize false
+ :fields [{:name "flags" :type "u8"}
+          {:name "source" :type "Option<i32>" :getter "Get the source to stop sound from. If None stop from all sources."}
+	  {:name "sound" :type "Option<String>" :getter "Get the identifier to stop, if relevant."}]}
 {:name "PlayerListHeaderFooter"
- :id 78
+ :id 84
  :fields [{:name "header" :type "String" :getter "Get the raw json data for the header"}
           {:name "footer" :type "String" :getter "Get the raw json data for the footer"}]}
+{:name "NBTQueryResponse"
+ :id 85
+ :fields [{:name "transaction_id" :type "i32" :read "varint" :getter "Get the transaction ID"}
+          {:name "nbt" :type "Vec<u8>" :read "bytearray_to_end" :getter "Get the raw NBT data"}]}
 {:name "CollectItem"
- :id 79
+ :id 86
  :fields [{:name "collected_entity_id" :type "i32" :getter "Get the entity ID of the collected item" :read "varint"}
           {:name "collector_entity_id" :type "i32" :getter "Get the entity ID of the person picking up the item" :read "varint"}
           {:name "item_count" :type "i32" :getter "Get how many items were picked up" :read "varint"}]}
 {:name "EntityTeleport"
- :id 80
+ :id 87
  :fields [{:name "entity_id" :type "i32" :getter "Get the entity ID of the entity teleported" :read "varint"}
           {:name "x" :type "f64" :getter "Get the X coordinate the entity moved to"}
           {:name "y" :type "f64" :getter "Get the Y coordinate the entity moved to"}

   :id 7
   :automatic-serialize false
   :fields  [{:name "values" :type "BTreeMap<String, i32>" :getter "Get the statistics, with the key being the name of the statistic and the value being the value."}]}
  {:name "BlockBreakAnimation"
   :id 8
   :fields [{:name "entity_id" :type "i32" :getter "Get the entity ID doing the animation" :read "varint"}
            {:name "location" :type "(i32, i32, i32)" :read "position" :getter "Get the block position"}
	    {:name "destroy_stage" :type "u8" :getter "Get the destroy stage"}]}
  {:name "UpdateBlockEntity"
   :id 9
   :fields [{:name "position" :type "(i32, i32, i32)" :getter "Get the (x, y, z) position" :read "position"}
            {:name "action" :type "u8" :getter "Get the action ID being performed"}
            {:name "nbt" :type "Vec<u8>" :getter "Get the raw NBT bytes" :read "bytearray_to_end"}]}
  {:name "BlockAction"
   :id 10
   :fields [{:name "position" :type "(i32, i32, i32)" :getter "Get the (x, y, z) position" :read "position"}
            {:name "action_id" :type "u8" :getter "Get the action ID"}
            {:name "action_param" :type "u8" :getter "Get the action parameter"}
            {:name "block_type" :type "i32" :getter "Get the block type" :read "varint"}]}
  {:name "BlockChange"
   :id 11
   :fields [{:name "position" :type "(i32, i32, i32)" :getter "Get the (x, y, z) position" :read "position"}
            {:name "new_block" :type "i32" :getter "Get the new block state ID for the block" :read "varint"}]}
  {:name "BossBar"
   :id 12
   :fields [{:name "data" :type "Vec<u8>" :getter "Get the raw data from this packet. Parsing this is very dependent on the specific client, and doing so would be out of scope for this library, therefore parsing this packet is left to the user of the library." :read "bytearray_to_end"}]}
  {:name "ServerDifficulty"
   :id 13
   :fields [{:name "difficulty" :type "u8" :getter "Get the difficulty"}]}
  {:name "ChatMessage"
   :id 14
   :fields [{:name "chat" :type "String" :getter "Get the raw JSON data of the chat message. See also ozelot::utils::chat_to_str"}
            {:name "position" :type "u8" :getter "Get the position of the chat message (enum)"}]}
  {:name "MultiBlockChange"
   :id 15
   :automatic-serialize false
   :fields [{:name "chunk_x" :type "i32" :getter "Get the chunk X coordinate"}
            {:name "chunk_z" :type "i32" :getter "Get the chunk Z coordinate"}
            {:name "changes" :type "Vec<(u8, u8, u8, i32)>" :getter "Get the changes as a vector, in the form of Vec<(x, y, z, new_block_state)>, where the x, y, z are relative to the chunk."}]}
{:name "ClientboundTabComplete"
 :id 16
 :automatic-serialize false
 :fields [{:name "transaction_id" :type "i32" :getter "Get the transaction ID"}
          {:name "start" :type "i32" :getter "Get the start position of the text to replace"}
          {:name "length" :type "i32" :getter "Get the length of the text to replace"}
	  {:name "matches" :type "Vec<(String, Option<String>)>" :getter "Get the eligible values to insert, with a corresponding tooltip if available."}]}
{:name "DeclareCommands"
 :id 17
 ; It might make sense for ozelot to parse this command, I just haven't gotten around to understanding the Node format
 :fields [{:name "raw_data" :type "Vec<u8>" :read "bytearray_to_end" :getter "Get the raw packet data"}]}
{:name "ClientboundConfirmTransaction"
 :id 18
 :fields [{:name "window_id" :type "u8" :getter "Get the window ID"}
          {:name "action_id" :type "i16" :getter "Get the action ID (nonce)"}
          {:name "accepted" :type "bool"}]}
{:name "ClientboundCloseWindow"
 :id 19
 :fields [{:name "window_id" :type "u8" :getter "Get the window ID"}]}
{:name "OpenWindow"
 :id 20
 :automatic-serialize false
 :fields [{:name "window_id" :type "u8" :getter "Get the window ID"}
          {:name "window_type" :type "String" :getter "Get the window type"}
          {:name "window_title" :type "String" :getter "Get the raw JSON of the window title"}
          {:name "number_of_slots" :type "u8" :getter "Get the number of slots in the window"}
          {:name "entity_id" :type "Option<i32>" :getter "Get the entity ID if the window type is `EntityHorse`, else `None`"}]}
{:name "WindowItems"
 :id 21
 :fields [{:name "window_id" :type "u8" :getter "Get the window ID"}

          {:name "motion_y" :type "f32" :getter "Get the motion in the Y direction that the player suffers as a result of the explosion"}
          {:name "motion_z" :type "f32" :getter "Get the motion in the Z direction that the player suffers as a result of the explosion"}]}
{:name "UnloadChunk"
 :id 30
 :fields [{:name "chunk_x" :type "i32" :getter "Get the chunk's X coordinate"}
          {:name "chunk_z" :type "i32" :getter "Get the chunk's Z coordinate"}]}
{:name "ChangeGameState"
 :id 31
 :fields [{:name "action" :type "u8" :getter "Get the reason for the change as a byte"}
          {:name "value" :type "f32" :getter "Get the value, its meaning depends on the action"}]}
{:name "OpenHorseWindow"
 :id 32
 :fields [{:name "window_id" :type "u8" :getter "Get the window id"}
          {:name "number_of_slots" :type "i32" :getter "Get the amount of slots"}
          {:name "entity_id" :type "i32" :getter "Get the entity ID"}]}
{:name "KeepAlive"
 :id 33
 :fields [{:name "id" :type "i64" :getter "Get the ID of the keep alive packet"}]}
