       :id 1
       :fields [{:name "transaction_id" :type "i32" :read "varint" :getter "Get the transaction ID"}
                {:name "location" :type "(i32, i32, i32)" :read "position" :getter "Get the X/Y/Z coords position"}]}
-    {:name "ChatMessage"
+     {:name "SetDifficulty"
       :id 2
+      :fields [{:name "new_difficulty" :type "u8" :getter "Get the new difficulty"}]}
+     {:name "ChatMessage"
+      :id 3
       :fields [{:name "message" :type "String" :getter "Get the chat message (not json)"}]}
      {:name "ClientStatus"
-      :id 3
+      :id 4
       :fields [{:name "action" :type "i32" :read "varint" :getter "Get the action ID varint enum"}]}
      {:name "ClientSettings"
-      :id 4
+      :id 5
       :fields [{:name "locale" :type "String" :getter "Get the client's locale"}
                {:name "view_distance" :type "u8" :getter "Get the client's view distance in chunks"}
                {:name "chat_mode" :type "i32" :read "varint" :getter "Get the client's chat mode as varint enum"}

	  {:name "seed" :type "i64" :read "varlong" :getter "Get the seed"}
	  {:name "flags" :type "u8" :getter "Get the flags bitarray"}]}	  
{:name "UpdateSign"
 :id 38
 :fields [{:name "location" :type "(i32, i32, i32)" :read "position" :getter "Get the block coordinates"}
          {:name "line1" :type "String" :getter "Get line 1"}
          {:name "line2" :type "String" :getter "Get line 2"}
          {:name "line3" :type "String" :getter "Get line 3"}
          {:name "line4" :type "String" :getter "Get line 4"}]}
{:name "Animation"
 :id 39
 :fields [{:name "hand" :type "i32" :read "varint" :getter "Get which arm was used as a raw varint enum"}]}
{:name "Spectate"
 :id 40
 :fields [{:name "target" :type "u128" :getter "Get the uuid of the selected target"}]}
{:name "PlayerBlockPlacement"
 :id 41
 :fields [{:name "location" :type "(i32, i32, i32)" :read "position" :getter "Get the location of the placed block"}
          {:name "face" :type "i32" :read "varint" :getter "Get the face of the block as a raw varint enum"}
          {:name "hand" :type "i32" :read "varint" :getter "Get the hand from which the block was placed as a raw varint enum"}
          {:name "x" :type "f32" :getter "Get the X position of the crosshair on the block"}
          {:name "y" :type "f32" :getter "Get the Y position of the crosshair on the block"}
          {:name "z" :type "f32" :getter "Get the Z position of the crosshair on the block"}]}
{:name "UseItem"
 :id 42
 :fields [{:name "hand" :type "i32" :read "varint" :getter "Get which hand contained the used item as a raw varint enum"}]}]}
:clientbound
{"Handshake" []

               {:name "mode" :type "i32" :read "varint" :getter "Get the action/mode"}
               {:name "slot" :type "Vec<u8>" :read "bytearray" :getter "Get the raw unprocessed slot data"}]}
     {:name "CloseWindow"
      :id 10
      :fields [{:name "window_id" :type "u8" :getter "Get the window id"}]}
     {:name "PluginMessage"
      :id 11
      :fields [{:name "channel" :type "String" :getter "Get the channel"}
               {:name "data" :type "Vec<u8>" :read "bytearray" :getter "Get the data"}]}
     {:name "EditBook"
      :id 12
      :fields [{:name "data" :type "Vec<u8>" :read "bytearray_to_end" :getter "Get the raw data contained in this packet. The first field in the packet is NBT slot data, and therefore we cannot parse the remaining data without parsing the NBT."}]}
     {:name "QueryEntityNBT"
      :id 13
      :fields [{:name "transaction_id" :type "i32" :read "varint" :getter "Get the transaction ID"}
               {:name "entity_id" :type "i32" :read "varint" :getter "Get the entity ID"}]}
     {:name "UseEntity"
      :id 14
      :automatic-serialize false
      :fields [{:name "target" :type "i32" :read "varint" :getter "Get the target eid"}
               {:name "action" :type "i32" :read "varint" :getter "Get the action type varint enum"}
               {:name "location" :type "Option<(f32, f32, f32)>" :getter "Get the target location (if any)"}
               {:name "hand" :type "Option<i32>" :getter "Get the hand used as a varint enum (if any)"}]}
     {:name "KeepAlive"
      :id 15
      :fields [{:name "id" :type "i64" :getter "Get the keep alive ID"}]}
     {:name "LockDifficulty"
      :id 16
      :fields [{:name "locked" :type "bool" :getter "Get whether or not the difficulty is locked"}]}
     {:name "PlayerPosition"
      :id 17
      :fields [{:name "x" :type "f64" :getter "Get the X coordinate"}
               {:name "y" :type "f64" :getter "Get the Y coordinate (feet)"}
               {:name "z" :type "f64" :getter "Get the Z coordinate"}
               {:name "on_ground" :type "bool" :getter "Get whether on the ground"}]}
     {:name "PlayerPositionAndLook"
      :id 18
      :fields [{:name "x" :type "f64" :getter "Get the X coordinate"}
               {:name "y" :type "f64" :getter "Get the Y coordinate"}
               {:name "z" :type "f64" :getter "Get the Z coordinate"}
