Repository: azalea-rs/azalea (language: rust)

Issue:
Whisper message is wrong
When printing a whisper chat message from some player to the client (via the `message` fn), it prints:
`You whisper to {player}: {message}`

It should be:
`{player} whispers to you: {message}`

For a minimal code example that displays this, just use the example from the README:
```rust
//...

#[derive(Default, Clone, Component)]
pub struct State {}

async fn handle(bot: Client, event: Event, state: State) -> anyhow::Result<()> {
    match event {
        Event::Chat(m) => {
            println!("{}", m.message().to_ansi());
        }
        _ => {}
    }

    Ok(())
}
```


Discussion / hints:
Looked into it a bit more and it seems the language string for `en_us` is correct:

[azalea-language/src/en_us.json L2594](https://github.com/azalea-rs/azalea/blob/2992fc6b4793e00cb35568e6bc42f7bde02463dd/azalea-language/src/en_us.json#L2594):
```
  "commands.message.display.incoming": "%s whispers to you: %s",
  "commands.message.display.outgoing": "You whisper to %s: %s",
```

The `message` fn itself also correctly calls `chat_translation_key` which maps the chat types correctly:

[azalea-protocol/src/packets/game/clientbound_player_chat_packet.rs#L129](https://github.com/azalea-rs/azalea/blob/2992fc6b4793e00cb35568e6bc42f7bde02463dd/azalea-protocol/src/packets/game/clientbound_player_chat_packet.rs#L129)
```rust
//...
ChatType::MsgCommandIncoming => "commands.message.display.incoming"
ChatType::MsgCommandOutgoing => "commands.message.display.outgoing",
//...
```

The only thing I can think of is either:
1. The Id numbers for the different chat numbers is wrong:

See [azalea-protocol/src/packets/game/clientbound_player_chat_packet.rs#L56](https://github.com/azalea-rs/azalea/blob/2992fc6b4793e00cb35568e6bc42f7bde02463dd/azalea-protocol/src/packets/game/clientbound_player_chat_packet.rs#L56)
```rust
pub enum ChatType {
    Chat = 0,
    SayCommand = 1,
    MsgCommandIncoming = 2,
    MsgCommandOutgoing = 3,
    TeamMsgCommandIncoming = 4,
    TeamMsgCommandOutgoing = 5,
    EmoteCommand = 6,
}
```
I couldn't find a source to verify that these numbers are correct.

2. The vanilla Minecraft 1.21.1 client sends the wrong chat type. That must mean the client interprets the message type incorrectly as well, since it displays "{player} whispers to you: {message}" just fine.

Fix patch:
diff --git a/Cargo.lock b/Cargo.lock
index 7e285f211..f7243fd55 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -190,7 +190,7 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
 
 [[package]]
 name = "azalea"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "anyhow",
  "azalea-auth",
@@ -229,7 +229,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-auth"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-buf",
  "azalea-crypto",
@@ -249,7 +249,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-block"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-block-macros",
  "azalea-buf",
@@ -258,7 +258,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-block-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -267,7 +267,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-brigadier"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-buf",
  "azalea-chat",
@@ -278,7 +278,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-buf"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-buf-macros",
  "byteorder",
@@ -291,7 +291,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-buf-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -300,7 +300,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-chat"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-buf",
  "azalea-language",
@@ -313,7 +313,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-client"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "anyhow",
  "azalea-auth",
@@ -347,7 +347,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-core"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-buf",
  "azalea-registry",
@@ -361,7 +361,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-crypto"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "aes",
  "azalea-buf",
@@ -378,7 +378,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-entity"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-block",
  "azalea-buf",
@@ -401,7 +401,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-inventory"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-buf",
  "azalea-chat",
@@ -414,7 +414,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-inventory-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -423,7 +423,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-language"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "serde",
  "serde_json",
@@ -431,7 +431,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-physics"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-block",
  "azalea-core",
@@ -447,7 +447,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-protocol"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "anyhow",
  "async-recursion",
@@ -484,7 +484,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-protocol-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -493,7 +493,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-registry"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-buf",
  "azalea-registry-macros",
@@ -503,7 +503,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-registry-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "quote",
  "syn",
@@ -511,7 +511,7 @@ dependencies = [
 
 [[package]]
 name = "azalea-world"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 dependencies = [
  "azalea-block",
  "azalea-buf",
@@ -1381,9 +1381,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.15.1"
+version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
 
 [[package]]
 name = "heck"
@@ -1661,7 +1661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
 dependencies = [
  "equivalent",
- "hashbrown 0.15.1",
+ "hashbrown 0.15.2",
 ]
 
 [[package]]
@@ -1707,9 +1707,9 @@ dependencies = [
 
 [[package]]
 name = "itoa"
-version = "1.0.13"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
 
 [[package]]
 name = "js-sys"
@@ -1731,9 +1731,9 @@ dependencies = [
 
 [[package]]
 name = "libc"
-version = "0.2.164"
+version = "0.2.166"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f"
+checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36"
 
 [[package]]
 name = "libm"
@@ -2346,9 +2346,9 @@ dependencies = [
 
 [[package]]
 name = "rsa"
-version = "0.9.6"
+version = "0.9.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519"
 dependencies = [
  "const-oid",
  "digest",
@@ -2405,9 +2405,9 @@ dependencies = [
 
 [[package]]
 name = "rustls"
-version = "0.23.18"
+version = "0.23.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f"
+checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1"
 dependencies = [
  "once_cell",
  "ring",
@@ -2911,9 +2911,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
 
 [[package]]
 name = "tracing"
-version = "0.1.40"
+version = "0.1.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
 dependencies = [
  "pin-project-lite",
  "tracing-attributes",
@@ -2922,9 +2922,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2933,9 +2933,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
 dependencies = [
  "once_cell",
  "valuable",
diff --git a/README.md b/README.md
index bdfebeb27..a8d40905b 100755
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ A collection of Rust crates for making Minecraft bots, clients, and tools.
 
 <!-- The line below is automatically read and updated by the migrate script, so don't change it manually. -->
 
-_Currently supported Minecraft version: `1.21.2`._
+_Currently supported Minecraft version: `1.21.3`._
 
 > [!WARNING]
 > Azalea is still very unfinished, though most crates are in a somewhat useable state
diff --git a/azalea-auth/Cargo.toml b/azalea-auth/Cargo.toml
index 6573081dc..ec39650cd 100644
--- a/azalea-auth/Cargo.toml
+++ b/azalea-auth/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-auth"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-auth"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-auth/src/game_profile.rs b/azalea-auth/src/game_profile.rs
index 31650754d..af00712d6 100755
--- a/azalea-auth/src/game_profile.rs
+++ b/azalea-auth/src/game_profile.rs
@@ -1,10 +1,10 @@
 use std::collections::HashMap;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use serde::{Deserialize, Serialize};
 use uuid::Uuid;
 
-#[derive(McBuf, Debug, Clone, Default, Eq, PartialEq)]
+#[derive(AzBuf, Debug, Clone, Default, Eq, PartialEq)]
 pub struct GameProfile {
     /// The UUID of the player.
     pub uuid: Uuid,
@@ -43,7 +43,7 @@ impl From<SerializableGameProfile> for GameProfile {
     }
 }
 
-#[derive(McBuf, Debug, Clone, Eq, PartialEq)]
+#[derive(AzBuf, Debug, Clone, Eq, PartialEq)]
 pub struct ProfilePropertyValue {
     pub value: String,
     pub signature: Option<String>,
diff --git a/azalea-block/Cargo.toml b/azalea-block/Cargo.toml
index dc0bc1993..87e3a726b 100644
--- a/azalea-block/Cargo.toml
+++ b/azalea-block/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-block"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-block"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 [lib]
 
diff --git a/azalea-block/README.md b/azalea-block/README.md
index 9be4c79bc..ae3b8c5f4 100755
--- a/azalea-block/README.md
+++ b/azalea-block/README.md
@@ -9,10 +9,10 @@ There's three block types, used for different things. You can (mostly) convert b
 ```
 # use azalea_block::BlockState;
 let block_state: BlockState = azalea_block::blocks::CobblestoneWall {
-    east: azalea_block::properties::EastWall::Low,
-    north: azalea_block::properties::NorthWall::Low,
-    south: azalea_block::properties::SouthWall::Low,
-    west: azalea_block::properties::WestWall::Low,
+    east: azalea_block::properties::WallEast::Low,
+    north: azalea_block::properties::WallNorth::Low,
+    south: azalea_block::properties::WallSouth::Low,
+    west: azalea_block::properties::WallWest::Low,
     up: false,
     waterlogged: false,
 }
diff --git a/azalea-block/azalea-block-macros/Cargo.toml b/azalea-block/azalea-block-macros/Cargo.toml
index 8e3885c11..70adb167f 100644
--- a/azalea-block/azalea-block-macros/Cargo.toml
+++ b/azalea-block/azalea-block-macros/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-block-macros"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-block/azalea-block-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 [lib]
 proc-macro = true
diff --git a/azalea-block/src/generated.rs b/azalea-block/src/generated.rs
index 18ee93fcc..00f1299fa 100755
--- a/azalea-block/src/generated.rs
+++ b/azalea-block/src/generated.rs
@@ -7,6 +7,11 @@ use crate::{Block, BlockBehavior, BlockState, BlockStates, Property};
 make_block_states! {
     Properties => {
         "snowy" => Snowy(bool),
+        "axis" => Axis {
+            X,
+            Y,
+            Z,
+        },
         "stage" => OakSaplingStage {
             _0,
             _1,
@@ -35,6 +40,10 @@ make_block_states! {
             _0,
             _1,
         },
+        "stage" => PaleOakSaplingStage {
+            _0,
+            _1,
+        },
         "age" => MangrovePropaguleAge {
             _0,
             _1,
@@ -96,11 +105,6 @@ make_block_states! {
             _2,
             _3,
         },
-        "axis" => Axis {
-            X,
-            Y,
-            Z,
-        },
         "distance" => OakLeavesDistance {
             _1,
             _2,
@@ -165,6 +169,15 @@ make_block_states! {
             _6,
             _7,
         },
+        "distance" => PaleOakLeavesDistance {
+            _1,
+            _2,
+            _3,
+            _4,
+            _5,
+            _6,
+            _7,
+        },
         "distance" => MangroveLeavesDistance {
             _1,
             _2,
@@ -284,7 +297,12 @@ make_block_states! {
         },
         "short" => Short(bool),
         "unstable" => Unstable(bool),
-        "slot_5_occupied" => TrueFalse(bool),
+        "slot_0_occupied" => Slot0Occupied(bool),
+        "slot_1_occupied" => Slot1Occupied(bool),
+        "slot_2_occupied" => Slot2Occupied(bool),
+        "slot_3_occupied" => Slot3Occupied(bool),
+        "slot_4_occupied" => Slot4Occupied(bool),
+        "slot_5_occupied" => Slot5Occupied(bool),
         "age" => FireAge {
             _0,
             _1,
@@ -308,6 +326,11 @@ make_block_states! {
         "south" => South(bool),
         "up" => Up(bool),
         "west" => West(bool),
+        "creaking" => Creaking {
+            Disabled,
+            Dormant,
+            Active,
+        },
         "half" => TopBottom {
             Top,
             Bottom,
@@ -509,6 +532,24 @@ make_block_states! {
             _14,
             _15,
         },
+        "rotation" => PaleOakSignRotation {
+            _0,
+            _1,
+            _2,
+            _3,
+            _4,
+            _5,
+            _6,
+            _7,
+            _8,
+            _9,
+            _10,
+            _11,
+            _12,
+            _13,
+            _14,
+            _15,
+        },
         "rotation" => MangroveSignRotation {
             _0,
             _1,
@@ -689,6 +730,24 @@ make_block_states! {
             _14,
             _15,
         },
+        "rotation" => PaleOakHangingSignRotation {
+            _0,
+            _1,
+            _2,
+            _3,
+            _4,
+            _5,
+            _6,
+            _7,
+            _8,
+            _9,
+            _10,
+            _11,
+            _12,
+            _13,
+            _14,
+            _15,
+        },
         "rotation" => CrimsonHangingSignRotation {
             _0,
             _1,
@@ -882,22 +941,22 @@ make_block_states! {
         },
         "disarmed" => Disarmed(bool),
         "conditional" => Conditional(bool),
-        "east" => EastWall {
+        "east" => WallEast {
             None,
             Low,
             Tall,
         },
-        "north" => NorthWall {
+        "north" => WallNorth {
             None,
             Low,
             Tall,
         },
-        "south" => SouthWall {
+        "south" => WallSouth {
             None,
             Low,
             Tall,
         },
-        "west" => WestWall {
+        "west" => WallWest {
             None,
             Low,
             Tall,
@@ -1438,17 +1497,13 @@ make_block_states! {
             _0,
             _1,
         },
-        "age" => _0_1_2_3_4 {
+        "age" => PitcherCropAge {
             _0,
             _1,
             _2,
             _3,
             _4,
         },
-        "half" => UpperLower {
-            Upper,
-            Lower,
-        },
         "age" => BeetrootsAge {
             _0,
             _1,
@@ -1673,7 +1728,7 @@ make_block_states! {
             _7,
             _8,
         },
-        "power" => TargetOutputPower {
+        "power" => TargetPower {
             _0,
             _1,
             _2,
@@ -1707,7 +1762,7 @@ make_block_states! {
             _4,
             _5,
         },
-        "charges" => RespawnAnchorCharge {
+        "charges" => RespawnAnchorCharges {
             _0,
             _1,
             _2,
@@ -1834,7 +1889,7 @@ make_block_states! {
             _14,
             _15,
         },
-        "sculk_sensor_phase" => Phase {
+        "sculk_sensor_phase" => SculkSensorPhase {
             Inactive,
             Active,
             Cooldown,
@@ -1867,7 +1922,7 @@ make_block_states! {
             Middle,
             Base,
         },
-        "vertical_direction" => TipDirection {
+        "vertical_direction" => VerticalDirection {
             Up,
             Down,
         },
@@ -1900,7 +1955,7 @@ make_block_states! {
             _25,
         },
         "berries" => Berries(bool),
-        "flower_amount" => PinkPetalsAmount {
+        "flower_amount" => PinkPetalsFlowerAmount {
             _1,
             _2,
             _3,
@@ -1912,11 +1967,6 @@ make_block_states! {
             Partial,
             Full,
         },
-        "axis" => Falling {
-            X,
-            Y,
-            Z,
-        },
         "cracked" => Cracked(bool),
         "crafting" => Crafting(bool),
         "ominous" => Ominous(bool),
@@ -1934,6 +1984,7 @@ make_block_states! {
             Unlocking,
             Ejecting,
         },
+        "tip" => Tip(bool),
     },
     Blocks => {
         air => BlockBehavior::new(), {},
@@ -1960,6 +2011,10 @@ make_block_states! {
         acacia_planks => BlockBehavior::new().strength(2.0, 3.0), {},
         cherry_planks => BlockBehavior::new().strength(2.0, 3.0), {},
         dark_oak_planks => BlockBehavior::new().strength(2.0, 3.0), {},
+        pale_oak_wood => BlockBehavior::new(), {
+            "axis": Axis::Y,
+        },
+        pale_oak_planks => BlockBehavior::new(), {},
         mangrove_planks => BlockBehavior::new().strength(2.0, 3.0), {},
         bamboo_planks => BlockBehavior::new().strength(2.0, 3.0), {},
         bamboo_mosaic => BlockBehavior::new().strength(2.0, 3.0), {},
@@ -1984,6 +2039,9 @@ make_block_states! {
         dark_oak_sapling => BlockBehavior::new(), {
             "stage": DarkOakSaplingStage::_0,
         },
+        pale_oak_sapling => BlockBehavior::new(), {
+            "stage": PaleOakSaplingStage::_0,
+        },
         mangrove_propagule => BlockBehavior::new(), {
             "age": MangrovePropaguleAge::_0,
             "hanging": Hanging(false),
@@ -2034,6 +2092,9 @@ make_block_states! {
         dark_oak_log => BlockBehavior::new().strength(2.0, 2.0), {
             "axis": Axis::Y,
         },
+        pale_oak_log => BlockBehavior::new(), {
+            "axis": Axis::Y,
+        },
         mangrove_log => BlockBehavior::new().strength(2.0, 2.0), {
             "axis": Axis::Y,
         },
@@ -2064,6 +2125,9 @@ make_block_states! {
         stripped_dark_oak_log => BlockBehavior::new().strength(2.0, 2.0), {
             "axis": Axis::Y,
         },
+        stripped_pale_oak_log => BlockBehavior::new(), {
+            "axis": Axis::Y,
+        },
         stripped_oak_log => BlockBehavior::new().strength(2.0, 2.0), {
             "axis": Axis::Y,
         },
@@ -2118,6 +2182,9 @@ make_block_states! {
         stripped_dark_oak_wood => BlockBehavior::new().strength(2.0, 2.0), {
             "axis": Axis::Y,
         },
+        stripped_pale_oak_wood => BlockBehavior::new(), {
+            "axis": Axis::Y,
+        },
         stripped_mangrove_wood => BlockBehavior::new().strength(2.0, 2.0), {
             "axis": Axis::Y,
         },
@@ -2156,6 +2223,11 @@ make_block_states! {
             "persistent": Persistent(false),
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_leaves => BlockBehavior::new(), {
+            "distance": PaleOakLeavesDistance::_7,
+            "persistent": Persistent(false),
+            "waterlogged": Waterlogged(false),
+        },
         mangrove_leaves => BlockBehavior::new().strength(0.2, 0.2), {
             "distance": MangroveLeavesDistance::_7,
             "persistent": Persistent(false),
@@ -2345,12 +2417,12 @@ make_block_states! {
         bookshelf => BlockBehavior::new().strength(1.5, 1.5), {},
         chiseled_bookshelf => BlockBehavior::new().strength(1.5, 1.5), {
             "facing": FacingCardinal::North,
-            "slot_0_occupied": TrueFalse(false),
-            "slot_1_occupied": TrueFalse(false),
-            "slot_2_occupied": TrueFalse(false),
-            "slot_3_occupied": TrueFalse(false),
-            "slot_4_occupied": TrueFalse(false),
-            "slot_5_occupied": TrueFalse(false),
+            "slot_0_occupied": Slot0Occupied(false),
+            "slot_1_occupied": Slot1Occupied(false),
+            "slot_2_occupied": Slot2Occupied(false),
+            "slot_3_occupied": Slot3Occupied(false),
+            "slot_4_occupied": Slot4Occupied(false),
+            "slot_5_occupied": Slot5Occupied(false),
         },
         mossy_cobblestone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {},
         obsidian => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 1200.0), {},
@@ -2368,6 +2440,10 @@ make_block_states! {
         },
         soul_fire => BlockBehavior::new(), {},
         spawner => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 5.0), {},
+        creaking_heart => BlockBehavior::new(), {
+            "axis": Axis::Y,
+            "creaking": Creaking::Disabled,
+        },
         oak_stairs => BlockBehavior::new().strength(2.0, 3.0), {
             "facing": FacingCardinal::North,
             "half": TopBottom::Bottom,
@@ -2428,6 +2504,10 @@ make_block_states! {
             "rotation": DarkOakSignRotation::_0,
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_sign => BlockBehavior::new(), {
+            "rotation": PaleOakSignRotation::_0,
+            "waterlogged": Waterlogged(false),
+        },
         mangrove_sign => BlockBehavior::new().strength(1.0, 1.0), {
             "rotation": MangroveSignRotation::_0,
             "waterlogged": Waterlogged(false),
@@ -2485,6 +2565,10 @@ make_block_states! {
             "facing": FacingCardinal::North,
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_wall_sign => BlockBehavior::new(), {
+            "facing": FacingCardinal::North,
+            "waterlogged": Waterlogged(false),
+        },
         mangrove_wall_sign => BlockBehavior::new().strength(1.0, 1.0), {
             "facing": FacingCardinal::North,
             "waterlogged": Waterlogged(false),
@@ -2528,6 +2612,11 @@ make_block_states! {
             "rotation": DarkOakHangingSignRotation::_0,
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_hanging_sign => BlockBehavior::new(), {
+            "attached": Attached(false),
+            "rotation": PaleOakHangingSignRotation::_0,
+            "waterlogged": Waterlogged(false),
+        },
         crimson_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), {
             "attached": Attached(false),
             "rotation": CrimsonHangingSignRotation::_0,
@@ -2576,6 +2665,10 @@ make_block_states! {
             "facing": FacingCardinal::North,
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_wall_hanging_sign => BlockBehavior::new(), {
+            "facing": FacingCardinal::North,
+            "waterlogged": Waterlogged(false),
+        },
         mangrove_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), {
             "facing": FacingCardinal::North,
             "waterlogged": Waterlogged(false),
@@ -2628,6 +2721,9 @@ make_block_states! {
         dark_oak_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), {
             "powered": Powered(false),
         },
+        pale_oak_pressure_plate => BlockBehavior::new(), {
+            "powered": Powered(false),
+        },
         mangrove_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), {
             "powered": Powered(false),
         },
@@ -2771,6 +2867,13 @@ make_block_states! {
             "powered": Powered(false),
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_trapdoor => BlockBehavior::new(), {
+            "facing": FacingCardinal::North,
+            "half": TopBottom::Bottom,
+            "open": Open(false),
+            "powered": Powered(false),
+            "waterlogged": Waterlogged(false),
+        },
         mangrove_trapdoor => BlockBehavior::new().strength(3.0, 3.0), {
             "facing": FacingCardinal::North,
             "half": TopBottom::Bottom,
@@ -2993,20 +3096,20 @@ make_block_states! {
         },
         beacon => BlockBehavior::new().strength(3.0, 3.0), {},
         cobblestone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         mossy_cobblestone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         flower_pot => BlockBehavior::new(), {},
         potted_torchflower => BlockBehavior::new(), {},
@@ -3017,6 +3120,7 @@ make_block_states! {
         potted_acacia_sapling => BlockBehavior::new(), {},
         potted_cherry_sapling => BlockBehavior::new(), {},
         potted_dark_oak_sapling => BlockBehavior::new(), {},
+        potted_pale_oak_sapling => BlockBehavior::new(), {},
         potted_mangrove_propagule => BlockBehavior::new(), {},
         potted_fern => BlockBehavior::new(), {},
         potted_dandelion => BlockBehavior::new(), {},
@@ -3077,6 +3181,11 @@ make_block_states! {
             "facing": FacingCardinal::North,
             "powered": Powered(false),
         },
+        pale_oak_button => BlockBehavior::new(), {
+            "face": Face::Wall,
+            "facing": FacingCardinal::North,
+            "powered": Powered(false),
+        },
         mangrove_button => BlockBehavior::new().strength(0.5, 0.5), {
             "face": Face::Wall,
             "facing": FacingCardinal::North,
@@ -3344,6 +3453,12 @@ make_block_states! {
             "shape": StairShape::Straight,
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_stairs => BlockBehavior::new(), {
+            "facing": FacingCardinal::North,
+            "half": TopBottom::Bottom,
+            "shape": StairShape::Straight,
+            "waterlogged": Waterlogged(false),
+        },
         mangrove_stairs => BlockBehavior::new().strength(2.0, 3.0), {
             "facing": FacingCardinal::North,
             "half": TopBottom::Bottom,
@@ -3584,6 +3699,10 @@ make_block_states! {
             "type": Type::Bottom,
             "waterlogged": Waterlogged(false),
         },
+        pale_oak_slab => BlockBehavior::new(), {
+            "type": Type::Bottom,
+            "waterlogged": Waterlogged(false),
+        },
         mangrove_slab => BlockBehavior::new().strength(2.0, 3.0), {
             "type": Type::Bottom,
             "waterlogged": Waterlogged(false),
@@ -3692,6 +3811,12 @@ make_block_states! {
             "open": Open(false),
             "powered": Powered(false),
         },
+        pale_oak_fence_gate => BlockBehavior::new(), {
+            "facing": FacingCardinal::North,
+            "in_wall": InWall(false),
+            "open": Open(false),
+            "powered": Powered(false),
+        },
         mangrove_fence_gate => BlockBehavior::new().strength(2.0, 3.0), {
             "facing": FacingCardinal::North,
             "in_wall": InWall(false),
@@ -3746,6 +3871,13 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
             "west": West(false),
         },
+        pale_oak_fence => BlockBehavior::new(), {
+            "east": East(false),
+            "north": North(false),
+            "south": South(false),
+            "waterlogged": Waterlogged(false),
+            "west": West(false),
+        },
         mangrove_fence => BlockBehavior::new().strength(2.0, 3.0), {
             "east": East(false),
             "north": North(false),
@@ -3802,6 +3934,13 @@ make_block_states! {
             "open": Open(false),
             "powered": Powered(false),
         },
+        pale_oak_door => BlockBehavior::new(), {
+            "facing": FacingCardinal::North,
+            "half": Half::Lower,
+            "hinge": Hinge::Left,
+            "open": Open(false),
+            "powered": Powered(false),
+        },
         mangrove_door => BlockBehavior::new().strength(3.0, 3.0), {
             "facing": FacingCardinal::North,
             "half": Half::Lower,
@@ -3845,8 +3984,8 @@ make_block_states! {
             "age": TorchflowerCropAge::_0,
         },
         pitcher_crop => BlockBehavior::new(), {
-            "age": _0_1_2_3_4::_0,
-            "half": UpperLower::Lower,
+            "age": PitcherCropAge::_0,
+            "half": Half::Lower,
         },
         pitcher_plant => BlockBehavior::new(), {
             "half": Half::Lower,
@@ -4288,108 +4427,108 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         prismarine_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         red_sandstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         mossy_stone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         granite_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         stone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         mud_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 3.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         nether_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         andesite_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         red_nether_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         sandstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         end_stone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 9.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         diorite_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         scaffolding => BlockBehavior::new(), {
             "bottom": Bottom(false),
@@ -4613,7 +4752,7 @@ make_block_states! {
             "level": ComposterLevel::_0,
         },
         target => BlockBehavior::new().strength(0.5, 0.5), {
-            "power": TargetOutputPower::_0,
+            "power": TargetPower::_0,
         },
         bee_nest => BlockBehavior::new().strength(0.3, 0.3), {
             "facing": FacingCardinal::North,
@@ -4629,7 +4768,7 @@ make_block_states! {
         ancient_debris => BlockBehavior::new().requires_correct_tool_for_drops().strength(30.0, 1200.0), {},
         crying_obsidian => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 1200.0), {},
         respawn_anchor => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 1200.0), {
-            "charges": RespawnAnchorCharge::_0,
+            "charges": RespawnAnchorCharges::_0,
         },
         potted_crimson_fungus => BlockBehavior::new(), {},
         potted_warped_fungus => BlockBehavior::new(), {},
@@ -4644,12 +4783,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         blackstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         blackstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
             "type": Type::Bottom,
@@ -4670,12 +4809,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         polished_blackstone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         gilded_blackstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {},
         polished_blackstone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
@@ -4697,12 +4836,12 @@ make_block_states! {
             "powered": Powered(false),
         },
         polished_blackstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         chiseled_nether_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {},
         cracked_nether_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {},
@@ -4873,12 +5012,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         tuff_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         polished_tuff => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {},
         polished_tuff_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
@@ -4892,12 +5031,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         polished_tuff_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         chiseled_tuff => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {},
         tuff_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {},
@@ -4912,12 +5051,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         tuff_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         chiseled_tuff_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {},
         calcite => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.75, 0.75), {},
@@ -4925,13 +5064,13 @@ make_block_states! {
         powder_snow => BlockBehavior::new().strength(0.25, 0.25), {},
         sculk_sensor => BlockBehavior::new().strength(1.5, 1.5), {
             "power": SculkSensorPower::_0,
-            "sculk_sensor_phase": Phase::Inactive,
+            "sculk_sensor_phase": SculkSensorPhase::Inactive,
             "waterlogged": Waterlogged(false),
         },
         calibrated_sculk_sensor => BlockBehavior::new().strength(1.5, 1.5), {
             "facing": FacingCardinal::North,
             "power": CalibratedSculkSensorPower::_0,
-            "sculk_sensor_phase": Phase::Inactive,
+            "sculk_sensor_phase": SculkSensorPhase::Inactive,
             "waterlogged": Waterlogged(false),
         },
         sculk => BlockBehavior::new().strength(0.2, 0.2), {},
@@ -5233,7 +5372,7 @@ make_block_states! {
         },
         pointed_dripstone => BlockBehavior::new().strength(1.5, 3.0), {
             "thickness": Thickness::Tip,
-            "vertical_direction": TipDirection::Up,
+            "vertical_direction": VerticalDirection::Up,
             "waterlogged": Waterlogged(false),
         },
         dripstone_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 1.0), {},
@@ -5250,7 +5389,7 @@ make_block_states! {
         moss_carpet => BlockBehavior::new().strength(0.1, 0.1), {},
         pink_petals => BlockBehavior::new(), {
             "facing": FacingCardinal::North,
-            "flower_amount": PinkPetalsAmount::_1,
+            "flower_amount": PinkPetalsFlowerAmount::_1,
         },
         moss_block => BlockBehavior::new().strength(0.1, 0.1), {},
         big_dripleaf => BlockBehavior::new().strength(0.1, 0.1), {
@@ -5287,12 +5426,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         cobbled_deepslate_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         polished_deepslate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {},
         polished_deepslate_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {
@@ -5306,12 +5445,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         polished_deepslate_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         deepslate_tiles => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {},
         deepslate_tile_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {
@@ -5325,12 +5464,12 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         deepslate_tile_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         deepslate_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {},
         deepslate_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {
@@ -5344,18 +5483,18 @@ make_block_states! {
             "waterlogged": Waterlogged(false),
         },
         deepslate_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {
-            "east": EastWall::None,
-            "north": NorthWall::None,
-            "south": SouthWall::None,
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
             "up": Up(true),
             "waterlogged": Waterlogged(false),
-            "west": WestWall::None,
+            "west": WallWest::None,
         },
         chiseled_deepslate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {},
         cracked_deepslate_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {},
         cracked_deepslate_tiles => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {},
         infested_deepslate => BlockBehavior::new().strength(1.5, 0.75), {
-            "axis": Falling::Y,
+            "axis": Axis::Y,
         },
         smooth_basalt => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), {},
         raw_iron_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), {},
@@ -5396,5 +5535,16 @@ make_block_states! {
         heavy_core => BlockBehavior::new(), {
             "waterlogged": Waterlogged(false),
         },
+        pale_moss_block => BlockBehavior::new(), {},
+        pale_moss_carpet => BlockBehavior::new(), {
+            "bottom": Bottom(true),
+            "east": WallEast::None,
+            "north": WallNorth::None,
+            "south": WallSouth::None,
+            "west": WallWest::None,
+        },
+        pale_hanging_moss => BlockBehavior::new(), {
+            "tip": Tip(true),
+        },
     }
 }
diff --git a/azalea-block/src/lib.rs b/azalea-block/src/lib.rs
index 7e6ccfaf6..c1655919f 100755
--- a/azalea-block/src/lib.rs
+++ b/azalea-block/src/lib.rs
@@ -11,7 +11,7 @@ use std::{
     io::{Cursor, Write},
 };
 
-use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 pub use behavior::BlockBehavior;
 pub use generated::{blocks, properties};
 pub use range::BlockStates;
@@ -80,17 +80,17 @@ impl TryFrom<u32> for BlockState {
     }
 }
 
-impl McBufReadable for BlockState {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let state_id = u32::var_read_from(buf)?;
+impl AzaleaRead for BlockState {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let state_id = u32::azalea_read_var(buf)?;
         Self::try_from(state_id).map_err(|_| BufReadError::UnexpectedEnumVariant {
             id: state_id as i32,
         })
     }
 }
-impl McBufWritable for BlockState {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        u32::var_write_into(&self.id, buf)
+impl AzaleaWrite for BlockState {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        u32::azalea_write_var(&self.id, buf)
     }
 }
 
diff --git a/azalea-brigadier/Cargo.toml b/azalea-brigadier/Cargo.toml
index 167559ea7..2b5bddcc5 100644
--- a/azalea-brigadier/Cargo.toml
+++ b/azalea-brigadier/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-brigadier"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-brigadier"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-brigadier/src/suggestion/mod.rs b/azalea-brigadier/src/suggestion/mod.rs
index 753b1bc86..a31b68375 100755
--- a/azalea-brigadier/src/suggestion/mod.rs
+++ b/azalea-brigadier/src/suggestion/mod.rs
@@ -9,7 +9,7 @@ use std::{
 };
 
 #[cfg(feature = "azalea-buf")]
-use azalea_buf::McBufWritable;
+use azalea_buf::AzaleaWrite;
 #[cfg(feature = "azalea-buf")]
 use azalea_chat::FormattedText;
 pub use suggestions::Suggestions;
@@ -137,13 +137,13 @@ impl PartialOrd for SuggestionValue {
 }
 
 #[cfg(feature = "azalea-buf")]
-impl McBufWritable for Suggestion {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.value.to_string().write_into(buf)?;
+impl AzaleaWrite for Suggestion {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.value.to_string().azalea_write(buf)?;
         self.tooltip
             .clone()
             .map(FormattedText::from)
-            .write_into(buf)?;
+            .azalea_write(buf)?;
         Ok(())
     }
 }
diff --git a/azalea-brigadier/src/suggestion/suggestions.rs b/azalea-brigadier/src/suggestion/suggestions.rs
index 5941aa7db..60eaa1112 100755
--- a/azalea-brigadier/src/suggestion/suggestions.rs
+++ b/azalea-brigadier/src/suggestion/suggestions.rs
@@ -3,9 +3,7 @@ use std::io::{Cursor, Write};
 use std::{collections::HashSet, hash::Hash};
 
 #[cfg(feature = "azalea-buf")]
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 #[cfg(feature = "azalea-buf")]
 use azalea_chat::FormattedText;
 
@@ -79,21 +77,21 @@ impl Suggestions {
 }
 
 #[cfg(feature = "azalea-buf")]
-impl McBufReadable for Suggestions {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        #[derive(McBuf)]
+impl AzaleaRead for Suggestions {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        #[derive(AzBuf)]
         struct StandaloneSuggestion {
             pub text: String,
             pub tooltip: Option<FormattedText>,
         }
 
-        let start = u32::var_read_from(buf)? as usize;
-        let length = u32::var_read_from(buf)? as usize;
+        let start = u32::azalea_read_var(buf)? as usize;
+        let length = u32::azalea_read_var(buf)? as usize;
         let range = StringRange::between(start, start + length);
 
         // the range of a Suggestion depends on the Suggestions containing it,
-        // so we can't just `impl McBufReadable for Suggestion`
-        let mut suggestions = Vec::<StandaloneSuggestion>::read_from(buf)?
+        // so we can't just `impl AzaleaRead for Suggestion`
+        let mut suggestions = Vec::<StandaloneSuggestion>::azalea_read(buf)?
             .into_iter()
             .map(|s| Suggestion {
                 value: SuggestionValue::Text(s.text),
@@ -108,11 +106,11 @@ impl McBufReadable for Suggestions {
 }
 
 #[cfg(feature = "azalea-buf")]
-impl McBufWritable for Suggestions {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        (self.range.start() as u32).var_write_into(buf)?;
-        (self.range.length() as u32).var_write_into(buf)?;
-        self.suggestions.write_into(buf)?;
+impl AzaleaWrite for Suggestions {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        (self.range.start() as u32).azalea_write_var(buf)?;
+        (self.range.length() as u32).azalea_write_var(buf)?;
+        self.suggestions.azalea_write(buf)?;
         Ok(())
     }
 }
diff --git a/azalea-buf/Cargo.toml b/azalea-buf/Cargo.toml
index c8b29c6f0..3c8572c88 100644
--- a/azalea-buf/Cargo.toml
+++ b/azalea-buf/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-buf"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-buf"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-buf/azalea-buf-macros/Cargo.toml b/azalea-buf/azalea-buf-macros/Cargo.toml
index 85545a75a..8920d0353 100644
--- a/azalea-buf/azalea-buf-macros/Cargo.toml
+++ b/azalea-buf/azalea-buf-macros/Cargo.toml
@@ -1,10 +1,10 @@
 [package]
-description = "#[derive(McBuf)]"
+description = "#[derive(AzBuf)]"
 edition = "2021"
 license = "MIT"
 name = "azalea-buf-macros"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-buf"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 [lib]
 proc-macro = true
diff --git a/azalea-buf/azalea-buf-macros/src/lib.rs b/azalea-buf/azalea-buf-macros/src/lib.rs
index 4d17daa6d..dec624e3d 100755
--- a/azalea-buf/azalea-buf-macros/src/lib.rs
+++ b/azalea-buf/azalea-buf-macros/src/lib.rs
@@ -5,26 +5,26 @@ use proc_macro::TokenStream;
 use quote::quote;
 use syn::{parse_macro_input, DeriveInput};
 
-#[proc_macro_derive(McBufReadable, attributes(var))]
-pub fn derive_mcbufreadable(input: TokenStream) -> TokenStream {
+#[proc_macro_derive(AzaleaRead, attributes(var))]
+pub fn derive_azalearead(input: TokenStream) -> TokenStream {
     let DeriveInput { ident, data, .. } = parse_macro_input!(input);
 
-    read::create_impl_mcbufreadable(&ident, &data).into()
+    read::create_impl_azalearead(&ident, &data).into()
 }
 
-#[proc_macro_derive(McBufWritable, attributes(var))]
-pub fn derive_mcbufwritable(input: TokenStream) -> TokenStream {
+#[proc_macro_derive(AzaleaWrite, attributes(var))]
+pub fn derive_azaleawrite(input: TokenStream) -> TokenStream {
     let DeriveInput { ident, data, .. } = parse_macro_input!(input);
 
-    write::create_impl_mcbufwritable(&ident, &data).into()
+    write::create_impl_azaleawrite(&ident, &data).into()
 }
 
-#[proc_macro_derive(McBuf, attributes(var))]
-pub fn derive_mcbuf(input: TokenStream) -> TokenStream {
+#[proc_macro_derive(AzBuf, attributes(var, limit))]
+pub fn derive_azbuf(input: TokenStream) -> TokenStream {
     let DeriveInput { ident, data, .. } = parse_macro_input!(input);
 
-    let writable = write::create_impl_mcbufwritable(&ident, &data);
-    let readable = read::create_impl_mcbufreadable(&ident, &data);
+    let writable = write::create_impl_azaleawrite(&ident, &data);
+    let readable = read::create_impl_azalearead(&ident, &data);
     quote! {
         #writable
         #readable
diff --git a/azalea-buf/azalea-buf-macros/src/read.rs b/azalea-buf/azalea-buf-macros/src/read.rs
index c5c484e77..c093d4a19 100644
--- a/azalea-buf/azalea-buf-macros/src/read.rs
+++ b/azalea-buf/azalea-buf-macros/src/read.rs
@@ -9,17 +9,38 @@ fn read_named_fields(
         .map(|f| {
             let field_name = &f.ident;
             let field_type = &f.ty;
+
+            let is_variable_length = f.attrs.iter().any(|a| a.path().is_ident("var"));
+            let limit = f
+                .attrs
+                .iter()
+                .find(|a| a.path().is_ident("limit"))
+                .map(|a| {
+                    a.parse_args::<syn::LitInt>()
+                        .unwrap()
+                        .base10_parse::<usize>()
+                        .unwrap()
+                });
+
+            if is_variable_length && limit.is_some() {
+                panic!("Fields cannot have both var and limit attributes");
+            }
+
             // do a different buf.write_* for each field depending on the type
             // if it's a string, use buf.write_string
             match field_type {
                 syn::Type::Path(_) | syn::Type::Array(_) => {
-                    if f.attrs.iter().any(|a| a.path().is_ident("var")) {
+                    if is_variable_length {
+                        quote! {
+                            let #field_name = azalea_buf::AzaleaReadVar::azalea_read_var(buf)?;
+                        }
+                    } else if let Some(limit) = limit {
                         quote! {
-                            let #field_name = azalea_buf::McBufVarReadable::var_read_from(buf)?;
+                            let #field_name = azalea_buf::AzaleaReadLimited::azalea_read_limited(buf, #limit)?;
                         }
                     } else {
                         quote! {
-                            let #field_name = azalea_buf::McBufReadable::read_from(buf)?;
+                            let #field_name = azalea_buf::AzaleaRead::azalea_read(buf)?;
                         }
                     }
                 }
@@ -36,15 +57,15 @@ fn read_named_fields(
     (read_fields, read_field_names)
 }
 
-pub fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::TokenStream {
+pub fn create_impl_azalearead(ident: &Ident, data: &Data) -> proc_macro2::TokenStream {
     match data {
         syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {
             syn::Fields::Named(FieldsNamed { named, .. }) => {
                 let (read_fields, read_field_names) = read_named_fields(named);
 
                 quote! {
-                impl azalea_buf::McBufReadable for #ident {
-                    fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+                impl azalea_buf::AzaleaRead for #ident {
+                    fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
                         #(#read_fields)*
                         Ok(Self {
                             #(#read_field_names: #read_field_names),*
@@ -55,15 +76,15 @@ pub fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::Tok
             }
             syn::Fields::Unit => {
                 quote! {
-                impl azalea_buf::McBufReadable for #ident {
-                    fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+                impl azalea_buf::AzaleaRead for #ident {
+                    fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
                         Ok(Self)
                     }
                 }
                 }
             }
             _ => {
-                panic!("#[derive(McBuf)] can only be used on structs with named fields")
+                panic!("#[derive(AzBuf)] can only be used on structs with named fields")
             }
         },
         syn::Data::Enum(syn::DataEnum { variants, .. }) => {
@@ -108,13 +129,34 @@ pub fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::Tok
                     syn::Fields::Unnamed(fields) => {
                         let mut reader_code = quote! {};
                         for f in &fields.unnamed {
-                            if f.attrs.iter().any(|attr| attr.path().is_ident("var")) {
+                            let is_variable_length =
+                                f.attrs.iter().any(|a| a.path().is_ident("var"));
+                            let limit =
+                                f.attrs
+                                    .iter()
+                                    .find(|a| a.path().is_ident("limit"))
+                                    .map(|a| {
+                                        a.parse_args::<syn::LitInt>()
+                                            .unwrap()
+                                            .base10_parse::<usize>()
+                                            .unwrap()
+                                    });
+
+                            if is_variable_length && limit.is_some() {
+                                panic!("Fields cannot have both var and limit attributes");
+                            }
+
+                            if is_variable_length {
+                                reader_code.extend(quote! {
+                                    Self::#variant_name(azalea_buf::AzaleaReadVar::azalea_read_var(buf)?),
+                                });
+                            } else if let Some(limit) = limit {
                                 reader_code.extend(quote! {
-                                    Self::#variant_name(azalea_buf::McBufVarReadable::var_read_from(buf)?),
+                                    Self::#variant_name(azalea_buf::AzaleaReadLimited::azalea_read_limited(buf, #limit)?),
                                 });
                             } else {
                                 reader_code.extend(quote! {
-                                    Self::#variant_name(azalea_buf::McBufReadable::read_from(buf)?),
+                                    Self::#variant_name(azalea_buf::AzaleaRead::azalea_read(buf)?),
                                 });
                             }
                         }
@@ -139,15 +181,15 @@ pub fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::Tok
             let first_reader = first_reader.expect("There should be at least one variant");
 
             quote! {
-            impl azalea_buf::McBufReadable for #ident {
-                fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
-                    let id = azalea_buf::McBufVarReadable::var_read_from(buf)?;
-                    Self::read_from_id(buf, id)
+            impl azalea_buf::AzaleaRead for #ident {
+                fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+                    let id = azalea_buf::AzaleaReadVar::azalea_read_var(buf)?;
+                    Self::azalea_read_id(buf, id)
                 }
             }
 
             impl #ident {
-                pub fn read_from_id(buf: &mut std::io::Cursor<&[u8]>, id: u32) -> Result<Self, azalea_buf::BufReadError> {
+                pub fn azalea_read_id(buf: &mut std::io::Cursor<&[u8]>, id: u32) -> Result<Self, azalea_buf::BufReadError> {
                     match id {
                         #match_contents
                         // you'd THINK this throws an error, but mojang decided to make it default for some reason
@@ -157,6 +199,6 @@ pub fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::Tok
             }
             }
         }
-        _ => panic!("#[derive(McBuf)] can only be used on structs"),
+        _ => panic!("#[derive(AzBuf)] can only be used on structs"),
     }
 }
diff --git a/azalea-buf/azalea-buf-macros/src/write.rs b/azalea-buf/azalea-buf-macros/src/write.rs
index 4d31f39e8..df461d592 100644
--- a/azalea-buf/azalea-buf-macros/src/write.rs
+++ b/azalea-buf/azalea-buf-macros/src/write.rs
@@ -19,11 +19,11 @@ fn write_named_fields(
             syn::Type::Path(_) | syn::Type::Array(_) => {
                 if f.attrs.iter().any(|attr| attr.path().is_ident("var")) {
                     quote! {
-                        azalea_buf::McBufVarWritable::var_write_into(#ident_dot_field, buf)?;
+                        azalea_buf::AzaleaWriteVar::azalea_write_var(#ident_dot_field, buf)?;
                     }
                 } else {
                     quote! {
-                        azalea_buf::McBufWritable::write_into(#ident_dot_field, buf)?;
+                        azalea_buf::AzaleaWrite::azalea_write(#ident_dot_field, buf)?;
                     }
                 }
             }
@@ -37,7 +37,7 @@ fn write_named_fields(
     quote! { #(#write_fields)* }
 }
 
-pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::TokenStream {
+pub fn create_impl_azaleawrite(ident: &Ident, data: &Data) -> proc_macro2::TokenStream {
     match data {
         syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {
             syn::Fields::Named(FieldsNamed { named, .. }) => {
@@ -45,8 +45,8 @@ pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::Tok
                     write_named_fields(named, Some(&Ident::new("self", Span::call_site())));
 
                 quote! {
-                    impl azalea_buf::McBufWritable for #ident {
-                        fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+                    impl azalea_buf::AzaleaWrite for #ident {
+                        fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
                             #write_fields
                             Ok(())
                         }
@@ -55,15 +55,15 @@ pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::Tok
             }
             syn::Fields::Unit => {
                 quote! {
-                    impl azalea_buf::McBufWritable for #ident {
-                        fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+                    impl azalea_buf::AzaleaWrite for #ident {
+                        fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
                             Ok(())
                         }
                     }
                 }
             }
             _ => {
-                panic!("#[derive(McBuf)] can only be used on structs with named fields")
+                panic!("#[derive(AzBuf)] can only be used on structs with named fields")
             }
         },
         syn::Data::Enum(syn::DataEnum { variants, .. }) => {
@@ -103,7 +103,7 @@ pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::Tok
 
                 // the variant number that we're going to write
                 let write_the_variant = quote! {
-                    azalea_buf::McBufVarWritable::var_write_into(&#variant_discrim, buf)?;
+                    azalea_buf::AzaleaWriteVar::azalea_write_var(&#variant_discrim, buf)?;
                 };
                 match &variant.fields {
                     syn::Fields::Named(f) => {
@@ -145,11 +145,11 @@ pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::Tok
                             params_code.extend(quote! { #param_ident, });
                             if f.attrs.iter().any(|attr| attr.path().is_ident("var")) {
                                 writers_code.extend(quote! {
-                                    azalea_buf::McBufVarWritable::var_write_into(#param_ident, buf)?;
+                                    azalea_buf::AzaleaWriteVar::azalea_write_var(#param_ident, buf)?;
                                 });
                             } else {
                                 writers_code.extend(quote! {
-                                    azalea_buf::McBufWritable::write_into(#param_ident, buf)?;
+                                    azalea_buf::AzaleaWrite::azalea_write(#param_ident, buf)?;
                                 });
                             }
                         }
@@ -161,7 +161,7 @@ pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::Tok
                         });
                         match_arms_without_id.extend(quote! {
                             Self::#variant_name(data) => {
-                                azalea_buf::McBufWritable::write_into(data, buf)?;
+                                azalea_buf::AzaleaWrite::azalea_write(data, buf)?;
                             }
                         });
                     }
@@ -169,8 +169,8 @@ pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::Tok
             }
             if is_data_enum {
                 quote! {
-                    impl azalea_buf::McBufWritable for #ident {
-                        fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+                    impl azalea_buf::AzaleaWrite for #ident {
+                        fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
                             match self {
                                 #match_arms
                             }
@@ -189,14 +189,14 @@ pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::Tok
             } else {
                 // optimization: if it doesn't have data we can just do `as u32`
                 quote! {
-                    impl azalea_buf::McBufWritable for #ident {
-                        fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
-                            azalea_buf::McBufVarWritable::var_write_into(&(*self as u32), buf)
+                    impl azalea_buf::AzaleaWrite for #ident {
+                        fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+                            azalea_buf::AzaleaWriteVar::azalea_write_var(&(*self as u32), buf)
                         }
                     }
                 }
             }
         }
-        _ => panic!("#[derive(McBuf)] can only be used on structs"),
+        _ => panic!("#[derive(AzBuf)] can only be used on structs"),
     }
 }
diff --git a/azalea-buf/src/lib.rs b/azalea-buf/src/lib.rs
index e1d1281fd..ef3bd3a8f 100755
--- a/azalea-buf/src/lib.rs
+++ b/azalea-buf/src/lib.rs
@@ -10,9 +10,9 @@ mod write;
 
 pub use azalea_buf_macros::*;
 pub use definitions::*;
-pub use read::{BufReadError, McBufReadable, McBufVarReadable};
+pub use read::{AzaleaRead, AzaleaReadLimited, AzaleaReadVar, BufReadError};
 pub use serializable_uuid::*;
-pub use write::{McBufVarWritable, McBufWritable};
+pub use write::{AzaleaWrite, AzaleaWriteVar};
 
 // const DEFAULT_NBT_QUOTA: u32 = 2097152;
 const MAX_STRING_LENGTH: u16 = 32767;
@@ -27,110 +27,113 @@ mod tests {
     #[test]
     fn test_write_varint() {
         let mut buf = Vec::new();
-        0.var_write_into(&mut buf).unwrap();
+        0.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![0]);
 
         let mut buf = Vec::new();
-        1.var_write_into(&mut buf).unwrap();
+        1.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![1]);
 
         let mut buf = Vec::new();
-        2.var_write_into(&mut buf).unwrap();
+        2.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![2]);
 
         let mut buf = Vec::new();
-        127.var_write_into(&mut buf).unwrap();
+        127.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![127]);
 
         let mut buf = Vec::new();
-        128.var_write_into(&mut buf).unwrap();
+        128.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![128, 1]);
 
         let mut buf = Vec::new();
-        255.var_write_into(&mut buf).unwrap();
+        255.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![255, 1]);
 
         let mut buf = Vec::new();
-        25565.var_write_into(&mut buf).unwrap();
+        25565.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![221, 199, 1]);
 
         let mut buf = Vec::new();
-        2097151.var_write_into(&mut buf).unwrap();
+        2097151.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![255, 255, 127]);
 
         let mut buf = Vec::new();
-        2147483647.var_write_into(&mut buf).unwrap();
+        2147483647.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![255, 255, 255, 255, 7]);
 
         let mut buf = Vec::new();
-        (-1).var_write_into(&mut buf).unwrap();
+        (-1).azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![255, 255, 255, 255, 15]);
 
         let mut buf = Vec::new();
-        (-2147483648).var_write_into(&mut buf).unwrap();
+        (-2147483648).azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![128, 128, 128, 128, 8]);
     }
 
     #[test]
     fn test_read_varint() {
         // let buf = &mut &vec![0][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 0);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 0);
         let buf = vec![0];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 0);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 0);
 
         // let buf = &mut &vec![1][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 1);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 1);
         let buf = vec![1];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 1);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 1);
 
         // let buf = &mut &vec![2][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 2);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2);
         let buf = vec![2];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 2);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 2);
 
         // let buf = &mut &vec![127][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 127);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 127);
         let buf = vec![127];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 127);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 127);
 
         // let buf = &mut &vec![128, 1][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 128);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 128);
         let buf = vec![128, 1];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 128);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 128);
 
         // let buf = &mut &vec![255, 1][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 255);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 255);
         let buf = vec![255, 1];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 255);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 255);
 
         // let buf = &mut &vec![221, 199, 1][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 25565);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 25565);
         let buf = vec![221, 199, 1];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 25565);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 25565);
 
         // let buf = &mut &vec![255, 255, 127][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 2097151);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2097151);
         let buf = vec![255, 255, 127];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 2097151);
+        assert_eq!(
+            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
+            2097151
+        );
 
         // let buf = &mut &vec![255, 255, 255, 255, 7][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), 2147483647);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2147483647);
         let buf = vec![255, 255, 255, 255, 7];
         assert_eq!(
-            i32::var_read_from(&mut Cursor::new(&buf)).unwrap(),
+            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
             2147483647
         );
 
         // let buf = &mut &vec![255, 255, 255, 255, 15][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), -1);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -1);
         let buf = vec![255, 255, 255, 255, 15];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), -1);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), -1);
 
         // let buf = &mut &vec![128, 128, 128, 128, 8][..];
-        // assert_eq!(i32::var_read_from(buf).unwrap(), -2147483648);
+        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -2147483648);
         let buf = vec![128, 128, 128, 128, 8];
         assert_eq!(
-            i32::var_read_from(&mut Cursor::new(&buf)).unwrap(),
+            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
             -2147483648
         );
     }
@@ -138,21 +141,21 @@ mod tests {
     #[test]
     fn test_read_varint_longer() {
         let buf = vec![138, 56, 0, 135, 56, 123];
-        assert_eq!(i32::var_read_from(&mut Cursor::new(&buf)).unwrap(), 7178);
+        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 7178);
     }
 
     #[test]
     fn test_write_varlong() {
         let mut buf = Vec::new();
-        0u64.var_write_into(&mut buf).unwrap();
+        0u64.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![0]);
 
         let mut buf = Vec::new();
-        1u64.var_write_into(&mut buf).unwrap();
+        1u64.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![1]);
 
         let mut buf = Vec::new();
-        9223372036854775807u64.var_write_into(&mut buf).unwrap();
+        9223372036854775807u64.azalea_write_var(&mut buf).unwrap();
         assert_eq!(buf, vec![255, 255, 255, 255, 255, 255, 255, 255, 127]);
     }
 
@@ -161,20 +164,20 @@ mod tests {
         let original_vec = vec!["a".to_string(), "bc".to_string(), "def".to_string()];
 
         let mut buf = Vec::new();
-        original_vec.write_into(&mut buf).unwrap();
+        original_vec.azalea_write(&mut buf).unwrap();
 
         dbg!(&buf);
 
-        let result = Vec::<String>::read_from(&mut Cursor::new(&buf)).unwrap();
+        let result = Vec::<String>::azalea_read(&mut Cursor::new(&buf)).unwrap();
         assert_eq!(result, original_vec);
     }
 
     #[test]
     fn test_int_id_list() {
         let mut buf = Vec::new();
-        vec![1, 2, 3].var_write_into(&mut buf).unwrap();
+        vec![1, 2, 3].azalea_write_var(&mut buf).unwrap();
 
-        let result = Vec::<i32>::var_read_from(&mut Cursor::new(&buf)).unwrap();
+        let result = Vec::<i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();
         assert_eq!(result, vec![1, 2, 3]);
     }
 
@@ -186,9 +189,9 @@ mod tests {
             ("def".to_string(), 456),
         ]);
         let mut buf = Vec::new();
-        original_map.var_write_into(&mut buf).unwrap();
+        original_map.azalea_write_var(&mut buf).unwrap();
 
-        let result = HashMap::<String, i32>::var_read_from(&mut Cursor::new(&buf)).unwrap();
+        let result = HashMap::<String, i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();
 
         assert_eq!(result, original_map);
     }
@@ -196,8 +199,8 @@ mod tests {
     #[test]
     fn test_long() {
         let mut buf: Vec<u8> = Vec::new();
-        123456u64.write_into(&mut buf).unwrap();
+        123456u64.azalea_write(&mut buf).unwrap();
 
-        assert_eq!(u64::read_from(&mut Cursor::new(&buf)).unwrap(), 123456);
+        assert_eq!(u64::azalea_read(&mut Cursor::new(&buf)).unwrap(), 123456);
     }
 }
diff --git a/azalea-buf/src/read.rs b/azalea-buf/src/read.rs
index 8e406acb7..4353539ae 100755
--- a/azalea-buf/src/read.rs
+++ b/azalea-buf/src/read.rs
@@ -81,7 +81,7 @@ fn read_bytes<'a>(buf: &'a mut Cursor<&[u8]>, length: usize) -> Result<&'a [u8],
 }
 
 fn read_utf_with_len(buf: &mut Cursor<&[u8]>, max_length: u32) -> Result<String, BufReadError> {
-    let length = u32::var_read_from(buf)?;
+    let length = u32::azalea_read_var(buf)?;
     // i don't know why it's multiplied by 4 but it's like that in mojang's code so
     if length > max_length * 4 {
         return Err(BufReadError::StringLengthTooLong {
@@ -105,30 +105,40 @@ fn read_utf_with_len(buf: &mut Cursor<&[u8]>, max_length: u32) -> Result<String,
     Ok(string)
 }
 
-pub trait McBufReadable
+pub trait AzaleaRead
 where
     Self: Sized,
 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
 }
 
-pub trait McBufVarReadable
+pub trait AzaleaReadVar
 where
     Self: Sized,
 {
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
 }
 
-impl McBufReadable for i32 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+// note that there's no Write equivalent for this trait since we don't really
+// care if we're writing over the limit (and maybe we already know that the
+// server implementation accepts it)
+pub trait AzaleaReadLimited
+where
+    Self: Sized,
+{
+    fn azalea_read_limited(buf: &mut Cursor<&[u8]>, limit: usize) -> Result<Self, BufReadError>;
+}
+
+impl AzaleaRead for i32 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(buf.read_i32::<BE>()?)
     }
 }
 
-impl McBufVarReadable for i32 {
+impl AzaleaReadVar for i32 {
     // fast varints modified from https://github.com/luojia65/mc-varint/blob/master/src/lib.rs#L67
     /// Read a single varint from the reader and return the value
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         let mut buffer = [0];
         let mut ans = 0;
         for i in 0..5 {
@@ -142,9 +152,9 @@ impl McBufVarReadable for i32 {
     }
 }
 
-impl McBufVarReadable for i64 {
+impl AzaleaReadVar for i64 {
     // fast varints modified from https://github.com/luojia65/mc-varint/blob/master/src/lib.rs#L54
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         let mut buffer = [0];
         let mut ans = 0;
         for i in 0..10 {
@@ -158,14 +168,14 @@ impl McBufVarReadable for i64 {
         Ok(ans)
     }
 }
-impl McBufVarReadable for u64 {
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        i64::var_read_from(buf).map(|i| i as u64)
+impl AzaleaReadVar for u64 {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        i64::azalea_read_var(buf).map(|i| i as u64)
     }
 }
 
-impl McBufReadable for UnsizedByteArray {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for UnsizedByteArray {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         // read to end of the buffer
         let data = buf.get_ref()[buf.position() as usize..].to_vec();
         buf.set_position((buf.position()) + data.len() as u64);
@@ -173,111 +183,114 @@ impl McBufReadable for UnsizedByteArray {
     }
 }
 
-impl<T: McBufReadable + Send> McBufReadable for Vec<T> {
-    default fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let length = u32::var_read_from(buf)? as usize;
+impl<T: AzaleaRead + Send> AzaleaRead for Vec<T> {
+    default fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let length = u32::azalea_read_var(buf)? as usize;
         // we limit the capacity to not get exploited into allocating a bunch
         let mut contents = Vec::with_capacity(usize::min(length, 65536));
         for _ in 0..length {
-            contents.push(T::read_from(buf)?);
+            contents.push(T::azalea_read(buf)?);
         }
         Ok(contents)
     }
 }
 
-impl<K: McBufReadable + Send + Eq + Hash, V: McBufReadable + Send> McBufReadable for HashMap<K, V> {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let length = i32::var_read_from(buf)? as usize;
+impl<K: AzaleaRead + Send + Eq + Hash, V: AzaleaRead + Send> AzaleaRead for HashMap<K, V> {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let length = i32::azalea_read_var(buf)? as usize;
         let mut contents = HashMap::with_capacity(usize::min(length, 65536));
         for _ in 0..length {
-            contents.insert(K::read_from(buf)?, V::read_from(buf)?);
+            contents.insert(K::azalea_read(buf)?, V::azalea_read(buf)?);
         }
         Ok(contents)
     }
 }
 
-impl<K: McBufReadable + Send + Eq + Hash, V: McBufVarReadable + Send> McBufVarReadable
-    for HashMap<K, V>
-{
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let length = i32::var_read_from(buf)? as usize;
+impl<K: AzaleaRead + Send + Eq + Hash, V: AzaleaReadVar + Send> AzaleaReadVar for HashMap<K, V> {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let length = i32::azalea_read_var(buf)? as usize;
         let mut contents = HashMap::with_capacity(usize::min(length, 65536));
         for _ in 0..length {
-            contents.insert(K::read_from(buf)?, V::var_read_from(buf)?);
+            contents.insert(K::azalea_read(buf)?, V::azalea_read_var(buf)?);
         }
         Ok(contents)
     }
 }
 
-impl McBufReadable for Vec<u8> {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let length = i32::var_read_from(buf)? as usize;
+impl AzaleaRead for Vec<u8> {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let length = i32::azalea_read_var(buf)? as usize;
         read_bytes(buf, length).map(|b| b.to_vec())
     }
 }
 
-impl McBufReadable for String {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for String {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         read_utf_with_len(buf, MAX_STRING_LENGTH.into())
     }
 }
+impl AzaleaReadLimited for String {
+    fn azalea_read_limited(buf: &mut Cursor<&[u8]>, limit: usize) -> Result<Self, BufReadError> {
+        read_utf_with_len(buf, limit as u32)
+    }
+}
 
-impl McBufReadable for u32 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        Ok(i32::read_from(buf)? as u32)
+impl AzaleaRead for u32 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        Ok(i32::azalea_read(buf)? as u32)
     }
 }
 
-impl McBufVarReadable for u32 {
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        Ok(i32::var_read_from(buf)? as u32)
+impl AzaleaReadVar for u32 {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        Ok(i32::azalea_read_var(buf)? as u32)
     }
 }
 
-impl McBufReadable for u16 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        i16::read_from(buf).map(|i| i as u16)
+impl AzaleaRead for u16 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        i16::azalea_read(buf).map(|i| i as u16)
     }
 }
 
-impl McBufReadable for i16 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for i16 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(buf.read_i16::<BE>()?)
     }
 }
 
-impl McBufVarReadable for u16 {
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        Ok(i32::var_read_from(buf)? as u16)
+impl AzaleaReadVar for u16 {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        Ok(i32::azalea_read_var(buf)? as u16)
     }
 }
 
-impl<T: McBufVarReadable> McBufVarReadable for Vec<T> {
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let length = i32::var_read_from(buf)? as usize;
+impl<T: AzaleaReadVar> AzaleaReadVar for Vec<T> {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let length = i32::azalea_read_var(buf)? as usize;
         let mut contents = Vec::with_capacity(usize::min(length, 65536));
         for _ in 0..length {
-            contents.push(T::var_read_from(buf)?);
+            contents.push(T::azalea_read_var(buf)?);
         }
         Ok(contents)
     }
 }
 
-impl McBufReadable for i64 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for i64 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(buf.read_i64::<BE>()?)
     }
 }
 
-impl McBufReadable for u64 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        i64::read_from(buf).map(|i| i as u64)
+impl AzaleaRead for u64 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        i64::azalea_read(buf).map(|i| i as u64)
     }
 }
 
-impl McBufReadable for bool {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let byte = u8::read_from(buf)?;
+impl AzaleaRead for bool {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let byte = u8::azalea_read(buf)?;
         if byte > 1 {
             warn!("Boolean value was not 0 or 1, but {}", byte);
         }
@@ -285,46 +298,46 @@ impl McBufReadable for bool {
     }
 }
 
-impl McBufReadable for u8 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for u8 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(buf.read_u8()?)
     }
 }
 
-impl McBufReadable for i8 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        u8::read_from(buf).map(|i| i as i8)
+impl AzaleaRead for i8 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        u8::azalea_read(buf).map(|i| i as i8)
     }
 }
 
-impl McBufReadable for f32 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for f32 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(buf.read_f32::<BE>()?)
     }
 }
 
-impl McBufReadable for f64 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for f64 {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(buf.read_f64::<BE>()?)
     }
 }
 
-impl<T: McBufReadable> McBufReadable for Option<T> {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let present = bool::read_from(buf)?;
+impl<T: AzaleaRead> AzaleaRead for Option<T> {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let present = bool::azalea_read(buf)?;
         Ok(if present {
-            Some(T::read_from(buf)?)
+            Some(T::azalea_read(buf)?)
         } else {
             None
         })
     }
 }
 
-impl<T: McBufVarReadable> McBufVarReadable for Option<T> {
-    fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let present = bool::read_from(buf)?;
+impl<T: AzaleaReadVar> AzaleaReadVar for Option<T> {
+    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let present = bool::azalea_read(buf)?;
         Ok(if present {
-            Some(T::var_read_from(buf)?)
+            Some(T::azalea_read_var(buf)?)
         } else {
             None
         })
@@ -332,11 +345,11 @@ impl<T: McBufVarReadable> McBufVarReadable for Option<T> {
 }
 
 // [String; 4]
-impl<T: McBufReadable, const N: usize> McBufReadable for [T; N] {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl<T: AzaleaRead, const N: usize> AzaleaRead for [T; N] {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         let mut contents = Vec::with_capacity(N);
         for _ in 0..N {
-            contents.push(T::read_from(buf)?);
+            contents.push(T::azalea_read(buf)?);
         }
         contents.try_into().map_err(|_| {
             unreachable!("Panic is not possible since the Vec is the same size as the array")
@@ -344,14 +357,14 @@ impl<T: McBufReadable, const N: usize> McBufReadable for [T; N] {
     }
 }
 
-impl McBufReadable for simdnbt::owned::NbtTag {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for simdnbt::owned::NbtTag {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(simdnbt::owned::read_tag(buf).map_err(simdnbt::Error::from)?)
     }
 }
 
-impl McBufReadable for simdnbt::owned::NbtCompound {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for simdnbt::owned::NbtCompound {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         match simdnbt::owned::read_tag(buf).map_err(simdnbt::Error::from)? {
             simdnbt::owned::NbtTag::Compound(compound) => Ok(compound),
             _ => Err(BufReadError::Custom("Expected compound tag".to_string())),
@@ -359,17 +372,17 @@ impl McBufReadable for simdnbt::owned::NbtCompound {
     }
 }
 
-impl McBufReadable for simdnbt::owned::Nbt {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for simdnbt::owned::Nbt {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(simdnbt::owned::read_unnamed(buf)?)
     }
 }
 
-impl<T> McBufReadable for Box<T>
+impl<T> AzaleaRead for Box<T>
 where
-    T: McBufReadable,
+    T: AzaleaRead,
 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        Ok(Box::new(T::read_from(buf)?))
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        Ok(Box::new(T::azalea_read(buf)?))
     }
 }
diff --git a/azalea-buf/src/serializable_uuid.rs b/azalea-buf/src/serializable_uuid.rs
index d4ec0315f..53eccbbb9 100755
--- a/azalea-buf/src/serializable_uuid.rs
+++ b/azalea-buf/src/serializable_uuid.rs
@@ -2,7 +2,7 @@ use std::io::{Cursor, Write};
 
 use uuid::Uuid;
 
-use crate::{read::BufReadError, McBufReadable, McBufWritable};
+use crate::{read::BufReadError, AzaleaRead, AzaleaWrite};
 
 pub trait SerializableUuid {
     fn to_int_array(&self) -> [u32; 4];
@@ -34,24 +34,24 @@ impl SerializableUuid for Uuid {
     }
 }
 
-impl McBufReadable for Uuid {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for Uuid {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(Uuid::from_int_array([
-            u32::read_from(buf)?,
-            u32::read_from(buf)?,
-            u32::read_from(buf)?,
-            u32::read_from(buf)?,
+            u32::azalea_read(buf)?,
+            u32::azalea_read(buf)?,
+            u32::azalea_read(buf)?,
+            u32::azalea_read(buf)?,
         ]))
     }
 }
 
-impl McBufWritable for Uuid {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for Uuid {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let [a, b, c, d] = self.to_int_array();
-        a.write_into(buf)?;
-        b.write_into(buf)?;
-        c.write_into(buf)?;
-        d.write_into(buf)?;
+        a.azalea_write(buf)?;
+        b.azalea_write(buf)?;
+        c.azalea_write(buf)?;
+        d.azalea_write(buf)?;
         Ok(())
     }
 }
@@ -79,10 +79,10 @@ mod tests {
     fn read_write() {
         let u = Uuid::parse_str("6536bfed-8695-48fd-83a1-ecd24cf2a0fd").unwrap();
         let mut buf = Vec::new();
-        u.write_into(&mut buf).unwrap();
+        u.azalea_write(&mut buf).unwrap();
         println!("{buf:?}");
         assert_eq!(buf.len(), 16);
-        let u2 = Uuid::read_from(&mut Cursor::new(&buf)).unwrap();
+        let u2 = Uuid::azalea_read(&mut Cursor::new(&buf)).unwrap();
         assert_eq!(u, u2);
     }
 }
diff --git a/azalea-buf/src/write.rs b/azalea-buf/src/write.rs
index 49215a5af..1092586d8 100755
--- a/azalea-buf/src/write.rs
+++ b/azalea-buf/src/write.rs
@@ -16,26 +16,26 @@ fn write_utf_with_len(
             len
         );
     }
-    string.as_bytes().to_vec().write_into(buf)?;
+    string.as_bytes().to_vec().azalea_write(buf)?;
     Ok(())
 }
 
-pub trait McBufWritable {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
+pub trait AzaleaWrite {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
 }
 
-pub trait McBufVarWritable {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
+pub trait AzaleaWriteVar {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
 }
 
-impl McBufWritable for i32 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for i32 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         WriteBytesExt::write_i32::<BigEndian>(buf, *self)
     }
 }
 
-impl McBufVarWritable for i32 {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWriteVar for i32 {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut buffer = [0];
         let mut value = *self;
         if value == 0 {
@@ -53,85 +53,85 @@ impl McBufVarWritable for i32 {
     }
 }
 
-impl McBufWritable for UnsizedByteArray {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for UnsizedByteArray {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         buf.write_all(self)
     }
 }
 
-impl<T: McBufWritable> McBufWritable for Vec<T> {
-    default fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self[..].write_into(buf)
+impl<T: AzaleaWrite> AzaleaWrite for Vec<T> {
+    default fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self[..].azalea_write(buf)
     }
 }
 
-impl<T: McBufWritable> McBufWritable for [T] {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        (self.len() as u32).var_write_into(buf)?;
+impl<T: AzaleaWrite> AzaleaWrite for [T] {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        (self.len() as u32).azalea_write_var(buf)?;
         for item in self {
-            T::write_into(item, buf)?;
+            T::azalea_write(item, buf)?;
         }
         Ok(())
     }
 }
 
-impl<K: McBufWritable, V: McBufWritable> McBufWritable for HashMap<K, V> {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        u32::var_write_into(&(self.len() as u32), buf)?;
+impl<K: AzaleaWrite, V: AzaleaWrite> AzaleaWrite for HashMap<K, V> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        u32::azalea_write_var(&(self.len() as u32), buf)?;
         for (key, value) in self {
-            key.write_into(buf)?;
-            value.write_into(buf)?;
+            key.azalea_write(buf)?;
+            value.azalea_write(buf)?;
         }
 
         Ok(())
     }
 }
 
-impl<K: McBufWritable, V: McBufVarWritable> McBufVarWritable for HashMap<K, V> {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        u32::var_write_into(&(self.len() as u32), buf)?;
+impl<K: AzaleaWrite, V: AzaleaWriteVar> AzaleaWriteVar for HashMap<K, V> {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        u32::azalea_write_var(&(self.len() as u32), buf)?;
         for (key, value) in self {
-            key.write_into(buf)?;
-            value.var_write_into(buf)?;
+            key.azalea_write(buf)?;
+            value.azalea_write_var(buf)?;
         }
 
         Ok(())
     }
 }
 
-impl McBufWritable for Vec<u8> {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        (self.len() as u32).var_write_into(buf)?;
+impl AzaleaWrite for Vec<u8> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        (self.len() as u32).azalea_write_var(buf)?;
         buf.write_all(self)
     }
 }
 
-impl McBufWritable for String {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for String {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         write_utf_with_len(buf, self, MAX_STRING_LENGTH.into())
     }
 }
 
-impl McBufWritable for &str {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for &str {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         write_utf_with_len(buf, self, MAX_STRING_LENGTH.into())
     }
 }
 
-impl McBufWritable for u32 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        i32::write_into(&(*self as i32), buf)
+impl AzaleaWrite for u32 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        i32::azalea_write(&(*self as i32), buf)
     }
 }
 
-impl McBufVarWritable for u32 {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        i32::var_write_into(&(*self as i32), buf)
+impl AzaleaWriteVar for u32 {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        i32::azalea_write_var(&(*self as i32), buf)
     }
 }
 
-impl McBufVarWritable for i64 {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWriteVar for i64 {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut buffer = [0];
         let mut value = *self;
         if value == 0 {
@@ -149,146 +149,146 @@ impl McBufVarWritable for i64 {
     }
 }
 
-impl McBufVarWritable for u64 {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        i64::var_write_into(&(*self as i64), buf)
+impl AzaleaWriteVar for u64 {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        i64::azalea_write_var(&(*self as i64), buf)
     }
 }
 
-impl McBufWritable for u16 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        i16::write_into(&(*self as i16), buf)
+impl AzaleaWrite for u16 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        i16::azalea_write(&(*self as i16), buf)
     }
 }
 
-impl McBufVarWritable for u16 {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        i32::var_write_into(&(*self as i32), buf)
+impl AzaleaWriteVar for u16 {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        i32::azalea_write_var(&(*self as i32), buf)
     }
 }
 
-impl<T: McBufVarWritable> McBufVarWritable for Vec<T> {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        u32::var_write_into(&(self.len() as u32), buf)?;
+impl<T: AzaleaWriteVar> AzaleaWriteVar for Vec<T> {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        u32::azalea_write_var(&(self.len() as u32), buf)?;
         for i in self {
-            i.var_write_into(buf)?;
+            i.azalea_write_var(buf)?;
         }
         Ok(())
     }
 }
 
-impl McBufWritable for u8 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for u8 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         WriteBytesExt::write_u8(buf, *self)
     }
 }
 
-impl McBufWritable for i16 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for i16 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         WriteBytesExt::write_i16::<BigEndian>(buf, *self)
     }
 }
 
-impl McBufWritable for i64 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for i64 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         WriteBytesExt::write_i64::<BigEndian>(buf, *self)
     }
 }
 
-impl McBufWritable for u64 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        i64::write_into(&(*self as i64), buf)
+impl AzaleaWrite for u64 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        i64::azalea_write(&(*self as i64), buf)
     }
 }
 
-impl McBufWritable for bool {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for bool {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let byte = u8::from(*self);
-        byte.write_into(buf)
+        byte.azalea_write(buf)
     }
 }
 
-impl McBufWritable for i8 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        (*self as u8).write_into(buf)
+impl AzaleaWrite for i8 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        (*self as u8).azalea_write(buf)
     }
 }
 
-impl McBufWritable for f32 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for f32 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         WriteBytesExt::write_f32::<BigEndian>(buf, *self)
     }
 }
 
-impl McBufWritable for f64 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for f64 {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         WriteBytesExt::write_f64::<BigEndian>(buf, *self)
     }
 }
 
-impl<T: McBufWritable> McBufWritable for Option<T> {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl<T: AzaleaWrite> AzaleaWrite for Option<T> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         if let Some(s) = self {
-            true.write_into(buf)?;
-            s.write_into(buf)?;
+            true.azalea_write(buf)?;
+            s.azalea_write(buf)?;
         } else {
-            false.write_into(buf)?;
+            false.azalea_write(buf)?;
         };
         Ok(())
     }
 }
 
-impl<T: McBufVarWritable> McBufVarWritable for Option<T> {
-    fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl<T: AzaleaWriteVar> AzaleaWriteVar for Option<T> {
+    fn azalea_write_var(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         if let Some(s) = self {
-            true.write_into(buf)?;
-            s.var_write_into(buf)?;
+            true.azalea_write(buf)?;
+            s.azalea_write_var(buf)?;
         } else {
-            false.write_into(buf)?;
+            false.azalea_write(buf)?;
         };
         Ok(())
     }
 }
 
 // [T; N]
-impl<T: McBufWritable, const N: usize> McBufWritable for [T; N] {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl<T: AzaleaWrite, const N: usize> AzaleaWrite for [T; N] {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         for i in self {
-            i.write_into(buf)?;
+            i.azalea_write(buf)?;
         }
         Ok(())
     }
 }
 
-impl McBufWritable for simdnbt::owned::NbtTag {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for simdnbt::owned::NbtTag {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut data = Vec::new();
         self.write(&mut data);
         buf.write_all(&data)
     }
 }
 
-impl McBufWritable for simdnbt::owned::NbtCompound {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for simdnbt::owned::NbtCompound {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut data = Vec::new();
         simdnbt::owned::NbtTag::Compound(self.clone()).write(&mut data);
         buf.write_all(&data)
     }
 }
 
-impl McBufWritable for simdnbt::owned::Nbt {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for simdnbt::owned::Nbt {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut data = Vec::new();
         self.write_unnamed(&mut data);
         buf.write_all(&data)
     }
 }
 
-impl<T> McBufWritable for Box<T>
+impl<T> AzaleaWrite for Box<T>
 where
-    T: McBufWritable,
+    T: AzaleaWrite,
 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        T::write_into(&**self, buf)
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        T::azalea_write(&**self, buf)
     }
 }
diff --git a/azalea-chat/Cargo.toml b/azalea-chat/Cargo.toml
index 370a8862d..b4f38ac33 100644
--- a/azalea-chat/Cargo.toml
+++ b/azalea-chat/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-chat"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-chat"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-chat/src/component.rs b/azalea-chat/src/component.rs
index 43614c771..86738b26f 100755
--- a/azalea-chat/src/component.rs
+++ b/azalea-chat/src/component.rs
@@ -1,7 +1,7 @@
 use std::{fmt::Display, sync::LazyLock};
 
 #[cfg(feature = "azalea-buf")]
-use azalea_buf::{BufReadError, McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
 use serde::{de, Deserialize, Deserializer, Serialize};
 #[cfg(feature = "simdnbt")]
 use simdnbt::{Deserialize as _, FromNbtTag as _, Serialize as _};
@@ -455,8 +455,8 @@ impl From<&simdnbt::Mutf8Str> for FormattedText {
 
 #[cfg(feature = "azalea-buf")]
 #[cfg(feature = "simdnbt")]
-impl McBufReadable for FormattedText {
-    fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for FormattedText {
+    fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, BufReadError> {
         let nbt = simdnbt::borrow::read_optional_tag(buf)?;
         if let Some(nbt) = nbt {
             FormattedText::from_nbt_tag(nbt.as_tag()).ok_or(BufReadError::Custom(
@@ -470,8 +470,8 @@ impl McBufReadable for FormattedText {
 
 #[cfg(feature = "azalea-buf")]
 #[cfg(feature = "simdnbt")]
-impl McBufWritable for FormattedText {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for FormattedText {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
         let mut out = Vec::new();
         simdnbt::owned::BaseNbt::write_unnamed(&(self.clone().to_compound().into()), &mut out);
         buf.write_all(&out)
diff --git a/azalea-chat/src/numbers.rs b/azalea-chat/src/numbers.rs
index a5a88c4f9..161f1177d 100644
--- a/azalea-chat/src/numbers.rs
+++ b/azalea-chat/src/numbers.rs
@@ -4,7 +4,7 @@
 use std::io::{Cursor, Write};
 
 #[cfg(feature = "azalea-buf")]
-use azalea_buf::{McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite};
 use azalea_registry::NumberFormatKind;
 use simdnbt::owned::Nbt;
 
@@ -18,33 +18,33 @@ pub enum NumberFormat {
 }
 
 #[cfg(feature = "azalea-buf")]
-impl McBufReadable for NumberFormat {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
-        let kind = NumberFormatKind::read_from(buf)?;
+impl AzaleaRead for NumberFormat {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+        let kind = NumberFormatKind::azalea_read(buf)?;
         match kind {
             NumberFormatKind::Blank => Ok(NumberFormat::Blank),
             NumberFormatKind::Styled => Ok(NumberFormat::Styled {
                 style: simdnbt::owned::read(buf)?,
             }),
             NumberFormatKind::Fixed => Ok(NumberFormat::Fixed {
-                value: FormattedText::read_from(buf)?,
+                value: FormattedText::azalea_read(buf)?,
             }),
         }
     }
 }
 
 #[cfg(feature = "azalea-buf")]
-impl McBufWritable for NumberFormat {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for NumberFormat {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
-            NumberFormat::Blank => NumberFormatKind::Blank.write_into(buf)?,
+            NumberFormat::Blank => NumberFormatKind::Blank.azalea_write(buf)?,
             NumberFormat::Styled { style } => {
-                NumberFormatKind::Styled.write_into(buf)?;
-                style.write_into(buf)?;
+                NumberFormatKind::Styled.azalea_write(buf)?;
+                style.azalea_write(buf)?;
             }
             NumberFormat::Fixed { value } => {
-                NumberFormatKind::Fixed.write_into(buf)?;
-                value.write_into(buf)?;
+                NumberFormatKind::Fixed.azalea_write(buf)?;
+                value.azalea_write(buf)?;
             }
         }
         Ok(())
diff --git a/azalea-chat/src/style.rs b/azalea-chat/src/style.rs
index e147bc975..fd2a58dd1 100755
--- a/azalea-chat/src/style.rs
+++ b/azalea-chat/src/style.rs
@@ -1,7 +1,7 @@
 use std::{collections::HashMap, fmt, sync::LazyLock};
 
 #[cfg(feature = "azalea-buf")]
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use serde::{ser::SerializeStruct, Serialize, Serializer};
 use serde_json::Value;
 #[cfg(feature = "simdnbt")]
@@ -100,7 +100,7 @@ impl Ansi {
 }
 
 #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
-#[cfg_attr(feature = "azalea-buf", derive(McBuf))]
+#[cfg_attr(feature = "azalea-buf", derive(AzBuf))]
 pub enum ChatFormatting {
     Black,
     DarkBlue,
diff --git a/azalea-client/Cargo.toml b/azalea-client/Cargo.toml
index ee1e400a0..3746a0762 100644
--- a/azalea-client/Cargo.toml
+++ b/azalea-client/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-client"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-client"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-client/src/attack.rs b/azalea-client/src/attack.rs
index a28f800db..b1b36b69c 100644
--- a/azalea-client/src/attack.rs
+++ b/azalea-client/src/attack.rs
@@ -4,9 +4,7 @@ use azalea_entity::{
     update_bounding_box, Attributes, Physics,
 };
 use azalea_physics::PhysicsSet;
-use azalea_protocol::packets::game::serverbound_interact_packet::{
-    self, ServerboundInteractPacket,
-};
+use azalea_protocol::packets::game::s_interact::{self, ServerboundInteract};
 use azalea_world::MinecraftEntityId;
 use bevy_app::{App, Plugin, Update};
 use bevy_ecs::prelude::*;
@@ -85,15 +83,14 @@ pub fn handle_attack_event(
         swing_arm_event.send(SwingArmEvent {
             entity: event.entity,
         });
-        send_packet_events.send(SendPacketEvent {
-            entity: event.entity,
-            packet: ServerboundInteractPacket {
+        send_packet_events.send(SendPacketEvent::new(
+            event.entity,
+            ServerboundInteract {
                 entity_id: *event.target,
-                action: serverbound_interact_packet::ActionType::Attack,
+                action: s_interact::ActionType::Attack,
                 using_secondary_action: **sneaking,
-            }
-            .get(),
-        });
+            },
+        ));
 
         // we can't attack if we're in spectator mode but it still sends the attack
         // packet
diff --git a/azalea-client/src/chat.rs b/azalea-client/src/chat.rs
index 80c52bafc..de0b8a7d7 100755
--- a/azalea-client/src/chat.rs
+++ b/azalea-client/src/chat.rs
@@ -6,12 +6,15 @@ use std::{
 };
 
 use azalea_chat::FormattedText;
-use azalea_protocol::packets::game::{
-    clientbound_disguised_chat_packet::ClientboundDisguisedChatPacket,
-    clientbound_player_chat_packet::ClientboundPlayerChatPacket,
-    clientbound_system_chat_packet::ClientboundSystemChatPacket,
-    serverbound_chat_command_packet::ServerboundChatCommandPacket,
-    serverbound_chat_packet::{LastSeenMessagesUpdate, ServerboundChatPacket},
+use azalea_protocol::packets::{
+    game::{
+        c_disguised_chat::ClientboundDisguisedChat,
+        c_player_chat::ClientboundPlayerChat,
+        c_system_chat::ClientboundSystemChat,
+        s_chat::{LastSeenMessagesUpdate, ServerboundChat},
+        s_chat_command::ServerboundChatCommand,
+    },
+    Packet,
 };
 use bevy_app::{App, Plugin, Update};
 use bevy_ecs::{
@@ -30,9 +33,9 @@ use crate::{
 /// A chat packet, either a system message or a chat message.
 #[derive(Debug, Clone, PartialEq)]
 pub enum ChatPacket {
-    System(Arc<ClientboundSystemChatPacket>),
-    Player(Arc<ClientboundPlayerChatPacket>),
-    Disguised(Arc<ClientboundDisguisedChatPacket>),
+    System(Arc<ClientboundSystemChat>),
+    Player(Arc<ClientboundPlayerChat>),
+    Disguised(Arc<ClientboundDisguisedChat>),
 }
 
 macro_rules! regex {
@@ -111,10 +114,10 @@ impl ChatPacket {
         self.split_sender_and_content().1
     }
 
-    /// Create a new ChatPacket from a string. This is meant to be used as a
+    /// Create a new Chat from a string. This is meant to be used as a
     /// convenience function for testing.
     pub fn new(message: &str) -> Self {
-        ChatPacket::System(Arc::new(ClientboundSystemChatPacket {
+        ChatPacket::System(Arc::new(ClientboundSystemChat {
             content: FormattedText::from(message),
             overlay: false,
         }))
@@ -141,7 +144,7 @@ impl Client {
         self.ecs.lock().send_event(SendChatKindEvent {
             entity: self.entity,
             content: message.to_string(),
-            kind: ChatPacketKind::Message,
+            kind: ChatKind::Message,
         });
         self.run_schedule_sender.send(()).unwrap();
     }
@@ -152,7 +155,7 @@ impl Client {
         self.ecs.lock().send_event(SendChatKindEvent {
             entity: self.entity,
             content: command.to_string(),
-            kind: ChatPacketKind::Command,
+            kind: ChatKind::Command,
         });
         self.run_schedule_sender.send(()).unwrap();
     }
@@ -215,13 +218,13 @@ pub fn handle_send_chat_event(
             send_chat_kind_events.send(SendChatKindEvent {
                 entity: event.entity,
                 content: event.content[1..].to_string(),
-                kind: ChatPacketKind::Command,
+                kind: ChatKind::Command,
             });
         } else {
             send_chat_kind_events.send(SendChatKindEvent {
                 entity: event.entity,
                 content: event.content.clone(),
-                kind: ChatPacketKind::Message,
+                kind: ChatKind::Message,
             });
         }
     }
@@ -240,11 +243,11 @@ pub fn handle_send_chat_event(
 pub struct SendChatKindEvent {
     pub entity: Entity,
     pub content: String,
-    pub kind: ChatPacketKind,
+    pub kind: ChatKind,
 }
 
 /// A kind of chat packet, either a chat message or a command.
-pub enum ChatPacketKind {
+pub enum ChatKind {
     Message,
     Command,
 }
@@ -261,7 +264,7 @@ pub fn handle_send_chat_kind_event(
             .take(256)
             .collect::<String>();
         let packet = match event.kind {
-            ChatPacketKind::Message => ServerboundChatPacket {
+            ChatKind::Message => ServerboundChat {
                 message: content,
                 timestamp: SystemTime::now()
                     .duration_since(UNIX_EPOCH)
@@ -273,17 +276,14 @@ pub fn handle_send_chat_kind_event(
                 signature: None,
                 last_seen_messages: LastSeenMessagesUpdate::default(),
             }
-            .get(),
-            ChatPacketKind::Command => {
+            .into_variant(),
+            ChatKind::Command => {
                 // TODO: chat signing
-                ServerboundChatCommandPacket { command: content }.get()
+                ServerboundChatCommand { command: content }.into_variant()
             }
         };
 
-        send_packet_events.send(SendPacketEvent {
-            entity: event.entity,
-            packet,
-        });
+        send_packet_events.send(SendPacketEvent::new(event.entity, packet));
     }
 }
 
diff --git a/azalea-client/src/chunks.rs b/azalea-client/src/chunks.rs
index 40e295aa3..7056efa41 100644
--- a/azalea-client/src/chunks.rs
+++ b/azalea-client/src/chunks.rs
@@ -10,8 +10,8 @@ use std::{
 
 use azalea_core::position::ChunkPos;
 use azalea_protocol::packets::game::{
-    clientbound_level_chunk_with_light_packet::ClientboundLevelChunkWithLightPacket,
-    serverbound_chunk_batch_received_packet::ServerboundChunkBatchReceivedPacket,
+    c_level_chunk_with_light::ClientboundLevelChunkWithLight,
+    s_chunk_batch_received::ServerboundChunkBatchReceived,
 };
 use bevy_app::{App, Plugin, Update};
 use bevy_ecs::prelude::*;
@@ -51,7 +51,7 @@ impl Plugin for ChunkPlugin {
 #[derive(Event)]
 pub struct ReceiveChunkEvent {
     pub entity: Entity,
-    pub packet: ClientboundLevelChunkWithLightPacket,
+    pub packet: ClientboundLevelChunkWithLight,
 }
 
 #[derive(Component, Clone, Debug)]
@@ -159,13 +159,12 @@ pub fn handle_chunk_batch_finished_event(
         if let Ok(mut chunk_batch_info) = query.get_mut(event.entity) {
             chunk_batch_info.batch_finished(event.batch_size);
             let desired_chunks_per_tick = chunk_batch_info.desired_chunks_per_tick();
-            send_packets.send(SendPacketEvent {
-                entity: event.entity,
-                packet: ServerboundChunkBatchReceivedPacket {
+            send_packets.send(SendPacketEvent::new(
+                event.entity,
+                ServerboundChunkBatchReceived {
                     desired_chunks_per_tick,
-                }
-                .get(),
-            });
+                },
+            ));
         }
     }
 }
diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs
index 9083a80b8..5158eedf7 100644
--- a/azalea-client/src/client.rs
+++ b/azalea-client/src/client.rs
@@ -17,24 +17,21 @@ use azalea_entity::{
 };
 use azalea_physics::PhysicsPlugin;
 use azalea_protocol::{
+    common::client_information::ClientInformation,
     connect::{Connection, ConnectionError, Proxy},
     packets::{
-        configuration::{
-            serverbound_client_information_packet::ClientInformation,
-            ClientboundConfigurationPacket, ServerboundConfigurationPacket,
-        },
+        self,
+        config::{ClientboundConfigPacket, ServerboundConfigPacket},
         game::ServerboundGamePacket,
-        handshaking::{
-            client_intention_packet::ClientIntentionPacket, ClientboundHandshakePacket,
+        handshake::{
+            s_intention::ServerboundIntention, ClientboundHandshakePacket,
             ServerboundHandshakePacket,
         },
         login::{
-            serverbound_hello_packet::ServerboundHelloPacket,
-            serverbound_key_packet::ServerboundKeyPacket,
-            serverbound_login_acknowledged_packet::ServerboundLoginAcknowledgedPacket,
-            ClientboundLoginPacket,
+            s_hello::ServerboundHello, s_key::ServerboundKey,
+            s_login_acknowledged::ServerboundLoginAcknowledged, ClientboundLoginPacket,
         },
-        ClientIntention, ConnectionProtocol, PROTOCOL_VERSION,
+        ClientIntention, ConnectionProtocol, Packet, PROTOCOL_VERSION,
     },
     resolver, ServerAddress,
 };
@@ -347,21 +344,18 @@ impl Client {
         address: &ServerAddress,
     ) -> Result<
         (
-            Connection<ClientboundConfigurationPacket, ServerboundConfigurationPacket>,
+            Connection<ClientboundConfigPacket, ServerboundConfigPacket>,
             GameProfile,
         ),
         JoinError,
     > {
         // handshake
-        conn.write(
-            ClientIntentionPacket {
-                protocol_version: PROTOCOL_VERSION,
-                hostname: address.host.clone(),
-                port: address.port,
-                intention: ClientIntention::Login,
-            }
-            .get(),
-        )
+        conn.write(ServerboundIntention {
+            protocol_version: PROTOCOL_VERSION,
+            hostname: address.host.clone(),
+            port: address.port,
+            intention: ClientIntention::Login,
+        })
         .await?;
         let mut conn = conn.login();
 
@@ -374,15 +368,12 @@ impl Client {
         ));
 
         // login
-        conn.write(
-            ServerboundHelloPacket {
-                name: account.username.clone(),
-                // TODO: pretty sure this should generate an offline-mode uuid instead of just
-                // Uuid::default()
-                profile_id: account.uuid.unwrap_or_default(),
-            }
-            .get(),
-        )
+        conn.write(ServerboundHello {
+            name: account.username.clone(),
+            // TODO: pretty sure this should generate an offline-mode uuid instead of just
+            // Uuid::default()
+            profile_id: account.uuid.unwrap_or_default(),
+        })
         .await?;
 
         let (conn, profile) = loop {
@@ -442,13 +433,10 @@ impl Client {
                         }
                     }
 
-                    conn.write(
-                        ServerboundKeyPacket {
-                            key_bytes: e.encrypted_public_key,
-                            encrypted_challenge: e.encrypted_challenge,
-                        }
-                        .get(),
-                    )
+                    conn.write(ServerboundKey {
+                        key_bytes: e.encrypted_public_key,
+                        encrypted_challenge: e.encrypted_challenge,
+                    })
                     .await?;
 
                     conn.set_encryption_key(e.secret_key);
@@ -462,8 +450,7 @@ impl Client {
                         "Got profile {:?}. handshake is finished and we're now switching to the configuration state",
                         p.game_profile
                     );
-                    conn.write(ServerboundLoginAcknowledgedPacket {}.get())
-                        .await?;
+                    conn.write(ServerboundLoginAcknowledged {}).await?;
                     break (conn.configuration(), p.game_profile);
                 }
                 ClientboundLoginPacket::LoginDisconnect(p) => {
@@ -477,6 +464,13 @@ impl Client {
                 }
                 ClientboundLoginPacket::CookieRequest(p) => {
                     debug!("Got cookie request {:?}", p);
+
+                    conn.write(packets::login::ServerboundCookieResponse {
+                        key: p.key,
+                        // cookies aren't implemented
+                        payload: None,
+                    })
+                    .await?;
                 }
             }
         };
@@ -493,8 +487,9 @@ impl Client {
     /// Write a packet directly to the server.
     pub fn write_packet(
         &self,
-        packet: ServerboundGamePacket,
+        packet: impl Packet<ServerboundGamePacket>,
     ) -> Result<(), crate::raw_connection::WritePacketError> {
+        let packet = packet.into_variant();
         self.raw_connection_mut(&mut self.ecs.lock())
             .write_packet(packet)
     }
@@ -605,7 +600,7 @@ impl Client {
                 "Sending client information (already logged in): {:?}",
                 client_information
             );
-            self.write_packet(azalea_protocol::packets::game::serverbound_client_information_packet::ServerboundClientInformationPacket { information: client_information.clone() }.get())?;
+            self.write_packet(azalea_protocol::packets::game::s_client_information::ServerboundClientInformation { information: client_information.clone() })?;
         }
 
         Ok(())
diff --git a/azalea-client/src/configuration.rs b/azalea-client/src/configuration.rs
index 99b97f60d..bfaa36f01 100644
--- a/azalea-client/src/configuration.rs
+++ b/azalea-client/src/configuration.rs
@@ -1,17 +1,16 @@
-use azalea_buf::McBufWritable;
+use azalea_buf::AzaleaWrite;
 use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol::packets::configuration::{
-    serverbound_client_information_packet::{
-        ClientInformation, ServerboundClientInformationPacket,
+use azalea_protocol::{
+    common::client_information::ClientInformation,
+    packets::config::{
+        s_client_information::ServerboundClientInformation,
+        s_custom_payload::ServerboundCustomPayload,
     },
-    serverbound_custom_payload_packet::ServerboundCustomPayloadPacket,
 };
 use bevy_app::prelude::*;
 use bevy_ecs::prelude::*;
 
-use crate::{
-    client::InConfigurationState, packet_handling::configuration::SendConfigurationPacketEvent,
-};
+use crate::{client::InConfigurationState, packet_handling::configuration::SendConfigurationEvent};
 
 pub struct ConfigurationPlugin;
 impl Plugin for ConfigurationPlugin {
@@ -26,27 +25,25 @@ impl Plugin for ConfigurationPlugin {
 
 fn handle_in_configuration_state(
     query: Query<(Entity, &ClientInformation), Added<InConfigurationState>>,
-    mut send_packet_events: EventWriter<SendConfigurationPacketEvent>,
+    mut send_packet_events: EventWriter<SendConfigurationEvent>,
 ) {
     for (entity, client_information) in query.iter() {
         let mut brand_data = Vec::new();
         // they don't have to know :)
-        "vanilla".write_into(&mut brand_data).unwrap();
-        send_packet_events.send(SendConfigurationPacketEvent {
+        "vanilla".azalea_write(&mut brand_data).unwrap();
+        send_packet_events.send(SendConfigurationEvent::new(
             entity,
-            packet: ServerboundCustomPayloadPacket {
+            ServerboundCustomPayload {
                 identifier: ResourceLocation::new("brand"),
                 data: brand_data.into(),
-            }
-            .get(),
-        });
+            },
+        ));
 
-        send_packet_events.send(SendConfigurationPacketEvent {
+        send_packet_events.send(SendConfigurationEvent::new(
             entity,
-            packet: ServerboundClientInformationPacket {
+            ServerboundClientInformation {
                 information: client_information.clone(),
-            }
-            .get(),
-        });
+            },
+        ));
     }
 }
diff --git a/azalea-client/src/events.rs b/azalea-client/src/events.rs
index 61104a4ba..fb8afa754 100644
--- a/azalea-client/src/events.rs
+++ b/azalea-client/src/events.rs
@@ -6,7 +6,7 @@ use std::sync::Arc;
 use azalea_chat::FormattedText;
 use azalea_core::tick::GameTick;
 use azalea_protocol::packets::game::{
-    clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, ClientboundGamePacket,
+    c_player_combat_kill::ClientboundPlayerCombatKill, ClientboundGamePacket,
 };
 use azalea_world::{InstanceName, MinecraftEntityId};
 use bevy_app::{App, Plugin, PreUpdate, Update};
@@ -93,7 +93,7 @@ pub enum Event {
     /// name, or latency changed).
     UpdatePlayer(PlayerInfo),
     /// The client player died in-game.
-    Death(Option<Arc<ClientboundPlayerCombatKillPacket>>),
+    Death(Option<Arc<ClientboundPlayerCombatKill>>),
     /// A `KeepAlive` packet was sent by the server.
     KeepAlive(u64),
     /// The client disconnected from the server.
diff --git a/azalea-client/src/interact.rs b/azalea-client/src/interact.rs
index 94b60ddc4..d2dfd93a2 100644
--- a/azalea-client/src/interact.rs
+++ b/azalea-client/src/interact.rs
@@ -10,12 +10,12 @@ use azalea_core::{
 use azalea_entity::{
     clamp_look_direction, view_vector, Attributes, EyeHeight, LocalEntity, LookDirection, Position,
 };
-use azalea_inventory::{ItemSlot, ItemSlotData};
+use azalea_inventory::{ItemStack, ItemStackData};
 use azalea_physics::clip::{BlockShapeType, ClipContext, FluidPickType};
 use azalea_protocol::packets::game::{
-    serverbound_interact_packet::InteractionHand,
-    serverbound_swing_packet::ServerboundSwingPacket,
-    serverbound_use_item_on_packet::{BlockHit, ServerboundUseItemOnPacket},
+    s_interact::InteractionHand,
+    s_swing::ServerboundSwing,
+    s_use_item_on::{BlockHit, ServerboundUseItemOn},
 };
 use azalea_registry::DataComponentKind;
 use azalea_world::{Instance, InstanceContainer, InstanceName};
@@ -148,15 +148,14 @@ pub fn handle_block_interact_event(
             }
         };
 
-        send_packet_events.send(SendPacketEvent {
+        send_packet_events.send(SendPacketEvent::new(
             entity,
-            packet: ServerboundUseItemOnPacket {
+            ServerboundUseItemOn {
                 hand: InteractionHand::MainHand,
                 block_hit,
                 sequence: sequence_number.0,
-            }
-            .get(),
-        });
+            },
+        ));
     }
 }
 
@@ -245,7 +244,7 @@ pub fn check_is_interaction_restricted(
             // way of modifying that
 
             let held_item = inventory.held_item();
-            if let ItemSlot::Present(item) = &held_item {
+            if let ItemStack::Present(item) = &held_item {
                 let block = instance.chunks.get_block_state(block_pos);
                 let Some(block) = block else {
                     // block isn't loaded so just say that it is restricted
@@ -263,7 +262,7 @@ pub fn check_is_interaction_restricted(
 
 /// Check if the item has the `CanDestroy` tag for the block.
 pub fn check_block_can_be_broken_by_item_in_adventure_mode(
-    item: &ItemSlotData,
+    item: &ItemStackData,
     _block: &BlockState,
 ) -> bool {
     // minecraft caches the last checked block but that's kind of an unnecessary
@@ -302,13 +301,12 @@ pub fn handle_swing_arm_event(
     mut send_packet_events: EventWriter<SendPacketEvent>,
 ) {
     for event in events.read() {
-        send_packet_events.send(SendPacketEvent {
-            entity: event.entity,
-            packet: ServerboundSwingPacket {
+        send_packet_events.send(SendPacketEvent::new(
+            event.entity,
+            ServerboundSwing {
                 hand: InteractionHand::MainHand,
-            }
-            .get(),
-        });
+            },
+        ));
     }
 }
 
diff --git a/azalea-client/src/inventory.rs b/azalea-client/src/inventory.rs
index d4ccab145..eb0b0675c 100644
--- a/azalea-client/src/inventory.rs
+++ b/azalea-client/src/inventory.rs
@@ -10,9 +10,8 @@ use azalea_inventory::{
     },
 };
 use azalea_protocol::packets::game::{
-    serverbound_container_click_packet::ServerboundContainerClickPacket,
-    serverbound_container_close_packet::ServerboundContainerClosePacket,
-    serverbound_set_carried_item_packet::ServerboundSetCarriedItemPacket,
+    s_container_click::ServerboundContainerClick, s_container_close::ServerboundContainerClose,
+    s_set_carried_item::ServerboundSetCarriedItem,
 };
 use azalea_registry::MenuKind;
 use bevy_app::{App, Plugin, Update};
@@ -98,7 +97,7 @@ pub struct Inventory {
     ///
     /// This is different from [`Self::selected_hotbar_slot`], which is the
     /// item that's selected in the hotbar.
-    pub carried: ItemSlot,
+    pub carried: ItemStack,
     /// An identifier used by the server to track client inventory desyncs. This
     /// is sent on every container click, and it's only ever updated when the
     /// server sends a new container update.
@@ -183,7 +182,7 @@ impl Inventory {
             if let QuickCraftStatus::Add { slot } = quick_craft.status {
                 let slot_item = self.menu().slot(slot as usize);
                 if let Some(slot_item) = slot_item {
-                    if let ItemSlot::Present(carried) = &self.carried {
+                    if let ItemStack::Present(carried) = &self.carried {
                         // minecraft also checks slot.may_place(carried) and
                         // menu.can_drag_to(slot)
                         // but they always return true so they're not relevant for us
@@ -222,7 +221,7 @@ impl Inventory {
                         return;
                     }
 
-                    let ItemSlot::Present(mut carried) = self.carried.clone() else {
+                    let ItemStack::Present(mut carried) = self.carried.clone() else {
                         // this should never happen
                         return self.reset_quick_craft();
                     };
@@ -231,14 +230,14 @@ impl Inventory {
                     let mut quick_craft_slots_iter = self.quick_craft_slots.iter();
 
                     loop {
-                        let mut slot: &ItemSlot;
+                        let mut slot: &ItemStack;
                         let mut slot_index: u16;
-                        let mut item_stack: &ItemSlot;
+                        let mut item_stack: &ItemStack;
 
                         loop {
                             let Some(&next_slot) = quick_craft_slots_iter.next() else {
                                 carried.count = carried_count;
-                                self.carried = ItemSlot::Present(carried);
+                                self.carried = ItemStack::Present(carried);
                                 return self.reset_quick_craft();
                             };
 
@@ -259,8 +258,8 @@ impl Inventory {
                             }
                         }
 
-                        // get the ItemSlotData for the slot
-                        let ItemSlot::Present(slot) = slot else {
+                        // get the ItemStackData for the slot
+                        let ItemStack::Present(slot) = slot else {
                             unreachable!("the loop above requires the slot to be present to break")
                         };
 
@@ -293,7 +292,7 @@ impl Inventory {
                             &mut self.inventory_menu
                         };
                         *menu.slot_mut(slot_index as usize).unwrap() =
-                            ItemSlot::Present(new_carried);
+                            ItemStack::Present(new_carried);
                     }
                 }
             } else {
@@ -316,7 +315,7 @@ impl Inventory {
                     // implementation
 
                     // player.drop(self.carried, true);
-                    self.carried = ItemSlot::Empty;
+                    self.carried = ItemStack::Empty;
                 }
             }
             ClickOperation::Pickup(PickupClick::Right { slot: None }) => {
@@ -336,8 +335,8 @@ impl Inventory {
                 // here
                 // i don't understand it so i didn't implement it
                 match slot_item {
-                    ItemSlot::Empty => if carried.is_present() {},
-                    ItemSlot::Present(_) => todo!(),
+                    ItemStack::Empty => if carried.is_present() {},
+                    ItemStack::Present(_) => todo!(),
                 }
             }
             ClickOperation::QuickMove(
@@ -374,7 +373,7 @@ impl Inventory {
                         *target_slot = source_slot;
                     }
                 } else if source_slot.is_empty() {
-                    let ItemSlot::Present(target_item) = target_slot else {
+                    let ItemStack::Present(target_item) = target_slot else {
                         unreachable!("target slot is not empty but is not present");
                     };
                     if self.menu().may_place(source_slot_index, target_item) {
@@ -386,7 +385,7 @@ impl Inventory {
                         *self.menu_mut().slot_mut(source_slot_index).unwrap() = new_source_slot;
                     }
                 } else if self.menu().may_pickup(source_slot_index) {
-                    let ItemSlot::Present(target_item) = target_slot else {
+                    let ItemStack::Present(target_item) = target_slot else {
                         unreachable!("target slot is not empty but is not present");
                     };
                     if self.menu().may_place(source_slot_index, target_item) {
@@ -421,12 +420,12 @@ impl Inventory {
                 let Some(source_slot) = self.menu().slot(*slot as usize) else {
                     return;
                 };
-                let ItemSlot::Present(source_item) = source_slot else {
+                let ItemStack::Present(source_item) = source_slot else {
                     return;
                 };
                 let mut new_carried = source_item.clone();
                 new_carried.count = new_carried.kind.max_stack_size();
-                self.carried = ItemSlot::Present(new_carried);
+                self.carried = ItemStack::Present(new_carried);
             }
             ClickOperation::Throw(c) => {
                 if self.carried.is_present() {
@@ -440,7 +439,7 @@ impl Inventory {
                 let Some(slot) = self.menu_mut().slot_mut(slot_index) else {
                     return;
                 };
-                let ItemSlot::Present(slot_item) = slot else {
+                let ItemStack::Present(slot_item) = slot else {
                     return;
                 };
 
@@ -467,7 +466,7 @@ impl Inventory {
                     return;
                 }
 
-                let ItemSlot::Present(target_slot_item) = &target_slot else {
+                let ItemStack::Present(target_slot_item) = &target_slot else {
                     unreachable!("target slot is not empty but is not present");
                 };
 
@@ -481,7 +480,7 @@ impl Inventory {
                     for i in iterator {
                         if target_slot_item.count < target_slot_item.kind.max_stack_size() {
                             let checking_slot = self.menu().slot(i).unwrap();
-                            if let ItemSlot::Present(checking_item) = checking_slot {
+                            if let ItemStack::Present(checking_item) = checking_slot {
                                 if can_item_quick_replace(checking_slot, &target_slot, true)
                                     && self.menu().may_pickup(i)
                                     && (round != 0
@@ -496,7 +495,7 @@ impl Inventory {
 
                                     // now extend the carried item
                                     let target_slot = &mut self.carried;
-                                    let ItemSlot::Present(target_slot_item) = target_slot else {
+                                    let ItemStack::Present(target_slot_item) = target_slot else {
                                         unreachable!("target slot is not empty but is not present");
                                     };
                                     target_slot_item.count += taken_item.count();
@@ -516,7 +515,7 @@ impl Inventory {
     }
 
     /// Get the item in the player's hotbar that is currently being held.
-    pub fn held_item(&self) -> ItemSlot {
+    pub fn held_item(&self) -> ItemStack {
         let inventory = &self.inventory_menu;
         let hotbar_items = &inventory.slots()[inventory.hotbar_slots_range()];
         hotbar_items[self.selected_hotbar_slot as usize].clone()
@@ -524,14 +523,14 @@ impl Inventory {
 }
 
 fn can_item_quick_replace(
-    target_slot: &ItemSlot,
-    item: &ItemSlot,
+    target_slot: &ItemStack,
+    item: &ItemStack,
     ignore_item_count: bool,
 ) -> bool {
-    let ItemSlot::Present(target_slot) = target_slot else {
+    let ItemStack::Present(target_slot) = target_slot else {
         return false;
     };
-    let ItemSlot::Present(item) = item else {
+    let ItemStack::Present(item) = item else {
         // i *think* this is what vanilla does
         // not 100% sure lol probably doesn't matter though
         return false;
@@ -552,7 +551,7 @@ fn can_item_quick_replace(
 fn get_quick_craft_slot_count(
     quick_craft_slots: &HashSet<u16>,
     quick_craft_kind: &QuickCraftKind,
-    item: &mut ItemSlotData,
+    item: &mut ItemStackData,
     slot_item_count: i32,
 ) {
     item.count = match quick_craft_kind {
@@ -570,7 +569,7 @@ impl Default for Inventory {
             id: 0,
             container_menu: None,
             container_menu_title: None,
-            carried: ItemSlot::Empty,
+            carried: ItemStack::Empty,
             state_id: 0,
             quick_craft_status: QuickCraftStatusKind::Start,
             quick_craft_kind: QuickCraftKind::Middle,
@@ -628,13 +627,12 @@ fn handle_container_close_event(
             continue;
         }
 
-        send_packet_events.send(SendPacketEvent {
+        send_packet_events.send(SendPacketEvent::new(
             entity,
-            packet: ServerboundContainerClosePacket {
+            ServerboundContainerClose {
                 container_id: inventory.id,
-            }
-            .get(),
-        });
+            },
+        ));
         client_side_events.send(ClientSideCloseContainerEvent {
             entity: event.entity,
         });
@@ -688,7 +686,7 @@ pub fn handle_container_click_event(
 
         // see which slots changed after clicking and put them in the hashmap
         // the server uses this to check if we desynced
-        let mut changed_slots: HashMap<u16, ItemSlot> = HashMap::new();
+        let mut changed_slots: HashMap<u16, ItemStack> = HashMap::new();
         for (slot_index, old_slot) in old_slots.iter().enumerate() {
             let new_slot = &menu.slots()[slot_index];
             if old_slot != new_slot {
@@ -696,9 +694,9 @@ pub fn handle_container_click_event(
             }
         }
 
-        send_packet_events.send(SendPacketEvent {
+        send_packet_events.send(SendPacketEvent::new(
             entity,
-            packet: ServerboundContainerClickPacket {
+            ServerboundContainerClick {
                 container_id: event.window_id,
                 state_id: inventory.state_id,
                 slot_num: event.operation.slot_num().map(|n| n as i16).unwrap_or(-999),
@@ -706,9 +704,8 @@ pub fn handle_container_click_event(
                 click_type: event.operation.click_type(),
                 changed_slots,
                 carried_item: inventory.carried.clone(),
-            }
-            .get(),
-        });
+            },
+        ));
     }
 }
 
@@ -717,7 +714,7 @@ pub fn handle_container_click_event(
 #[derive(Event)]
 pub struct SetContainerContentEvent {
     pub entity: Entity,
-    pub slots: Vec<ItemSlot>,
+    pub slots: Vec<ItemStack>,
     pub container_id: u8,
 }
 fn handle_set_container_content_event(
@@ -764,12 +761,11 @@ fn handle_set_selected_hotbar_slot_event(
         }
 
         inventory.selected_hotbar_slot = event.slot;
-        send_packet_events.send(SendPacketEvent {
-            entity: event.entity,
-            packet: ServerboundSetCarriedItemPacket {
+        send_packet_events.send(SendPacketEvent::new(
+            event.entity,
+            ServerboundSetCarriedItem {
                 slot: event.slot as u16,
-            }
-            .get(),
-        });
+            },
+        ));
     }
 }
diff --git a/azalea-client/src/lib.rs b/azalea-client/src/lib.rs
index 82d4f5616..3e4a48aad 100644
--- a/azalea-client/src/lib.rs
+++ b/azalea-client/src/lib.rs
@@ -30,7 +30,7 @@ pub mod respawn;
 pub mod task_pool;
 
 pub use account::{Account, AccountOpts};
-pub use azalea_protocol::packets::configuration::serverbound_client_information_packet::ClientInformation;
+pub use azalea_protocol::common::client_information::ClientInformation;
 pub use client::{
     start_ecs_runner, Client, DefaultPlugins, JoinError, JoinedClientBundle, StartClientOpts,
     TickBroadcast,
diff --git a/azalea-client/src/local_player.rs b/azalea-client/src/local_player.rs
index 3cc77f9da..d2fce3f15 100644
--- a/azalea-client/src/local_player.rs
+++ b/azalea-client/src/local_player.rs
@@ -3,7 +3,7 @@ use std::{collections::HashMap, io, sync::Arc};
 use azalea_auth::game_profile::GameProfile;
 use azalea_core::game_type::GameMode;
 use azalea_entity::Dead;
-use azalea_protocol::packets::game::clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket;
+use azalea_protocol::packets::game::c_player_abilities::ClientboundPlayerAbilities;
 use azalea_world::{Instance, PartialInstance};
 use bevy_ecs::{component::Component, prelude::*};
 use derive_more::{Deref, DerefMut};
@@ -62,8 +62,8 @@ pub struct PlayerAbilities {
     /// Used for the fov
     pub walking_speed: f32,
 }
-impl From<&ClientboundPlayerAbilitiesPacket> for PlayerAbilities {
-    fn from(packet: &ClientboundPlayerAbilitiesPacket) -> Self {
+impl From<&ClientboundPlayerAbilities> for PlayerAbilities {
+    fn from(packet: &ClientboundPlayerAbilities) -> Self {
         Self {
             invulnerable: packet.flags.invulnerable,
             flying: packet.flags.flying,
diff --git a/azalea-client/src/mining.rs b/azalea-client/src/mining.rs
index 1c8461c56..bf5a48cac 100644
--- a/azalea-client/src/mining.rs
+++ b/azalea-client/src/mining.rs
@@ -1,11 +1,9 @@
 use azalea_block::{Block, BlockState, FluidState};
 use azalea_core::{direction::Direction, game_type::GameMode, position::BlockPos, tick::GameTick};
 use azalea_entity::{mining::get_mine_progress, FluidOnEyes, Physics};
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use azalea_physics::PhysicsSet;
-use azalea_protocol::packets::game::serverbound_player_action_packet::{
-    self, ServerboundPlayerActionPacket,
-};
+use azalea_protocol::packets::game::s_player_action::{self, ServerboundPlayerAction};
 use azalea_world::{InstanceContainer, InstanceName};
 use bevy_app::{App, Plugin, Update};
 use bevy_ecs::prelude::*;
@@ -253,17 +251,16 @@ fn handle_start_mining_block_with_direction_event(
         {
             if mining.is_some() {
                 // send a packet to stop mining since we just changed target
-                send_packet_events.send(SendPacketEvent {
-                    entity: event.entity,
-                    packet: ServerboundPlayerActionPacket {
-                        action: serverbound_player_action_packet::Action::AbortDestroyBlock,
+                send_packet_events.send(SendPacketEvent::new(
+                    event.entity,
+                    ServerboundPlayerAction {
+                        action: s_player_action::Action::AbortDestroyBlock,
                         pos: current_mining_pos
                             .expect("IsMining is true so MineBlockPos must be present"),
                         direction: event.direction,
                         sequence: 0,
-                    }
-                    .get(),
-                });
+                    },
+                ));
             }
 
             let target_block_state = instance
@@ -326,16 +323,15 @@ fn handle_start_mining_block_with_direction_event(
                 });
             }
 
-            send_packet_events.send(SendPacketEvent {
-                entity: event.entity,
-                packet: ServerboundPlayerActionPacket {
-                    action: serverbound_player_action_packet::Action::StartDestroyBlock,
+            send_packet_events.send(SendPacketEvent::new(
+                event.entity,
+                ServerboundPlayerAction {
+                    action: s_player_action::Action::StartDestroyBlock,
                     pos: event.position,
                     direction: event.direction,
                     sequence: **sequence_number,
-                }
-                .get(),
-            });
+                },
+            ));
         }
     }
 }
@@ -407,9 +403,9 @@ pub struct MineTicks(pub f32);
 pub struct MineBlockPos(pub Option<BlockPos>);
 
 /// A component that contains the item we're currently using to mine. If we're
-/// not mining anything, it'll be [`ItemSlot::Empty`].
+/// not mining anything, it'll be [`ItemStack::Empty`].
 #[derive(Component, Clone, Debug, Default, Deref, DerefMut)]
-pub struct MineItem(pub ItemSlot);
+pub struct MineItem(pub ItemStack);
 
 /// Sent when we completed mining a block.
 #[derive(Event)]
@@ -496,16 +492,15 @@ pub fn handle_stop_mining_block_event(
 
         let mine_block_pos =
             mine_block_pos.expect("IsMining is true so MineBlockPos must be present");
-        send_packet_events.send(SendPacketEvent {
-            entity: event.entity,
-            packet: ServerboundPlayerActionPacket {
-                action: serverbound_player_action_packet::Action::AbortDestroyBlock,
+        send_packet_events.send(SendPacketEvent::new(
+            event.entity,
+            ServerboundPlayerAction {
+                action: s_player_action::Action::AbortDestroyBlock,
                 pos: mine_block_pos,
                 direction: Direction::Down,
                 sequence: 0,
-            }
-            .get(),
-        });
+            },
+        ));
         commands.entity(event.entity).remove::<Mining>();
         **mine_progress = 0.;
         mine_block_progress_events.send(MineBlockProgressEvent {
@@ -570,16 +565,15 @@ pub fn continue_mining_block(
                 position: mining.pos,
             });
             *sequence_number += 1;
-            send_packet_events.send(SendPacketEvent {
+            send_packet_events.send(SendPacketEvent::new(
                 entity,
-                packet: ServerboundPlayerActionPacket {
-                    action: serverbound_player_action_packet::Action::StartDestroyBlock,
+                ServerboundPlayerAction {
+                    action: s_player_action::Action::StartDestroyBlock,
                     pos: mining.pos,
                     direction: mining.dir,
                     sequence: **sequence_number,
-                }
-                .get(),
-            });
+                },
+            ));
             swing_arm_events.send(SwingArmEvent { entity });
         } else if is_same_mining_target(
             mining.pos,
@@ -616,16 +610,15 @@ pub fn continue_mining_block(
                     entity,
                     position: mining.pos,
                 });
-                send_packet_events.send(SendPacketEvent {
+                send_packet_events.send(SendPacketEvent::new(
                     entity,
-                    packet: ServerboundPlayerActionPacket {
-                        action: serverbound_player_action_packet::Action::StopDestroyBlock,
+                    ServerboundPlayerAction {
+                        action: s_player_action::Action::StopDestroyBlock,
                         pos: mining.pos,
                         direction: mining.dir,
                         sequence: **sequence_number,
-                    }
-                    .get(),
-                });
+                    },
+                ));
                 **mine_progress = 0.;
                 **mine_ticks = 0.;
                 **mine_delay = 0;
diff --git a/azalea-client/src/movement.rs b/azalea-client/src/movement.rs
index 806f87341..3304e27d8 100644
--- a/azalea-client/src/movement.rs
+++ b/azalea-client/src/movement.rs
@@ -5,12 +5,15 @@ use azalea_core::tick::GameTick;
 use azalea_entity::{metadata::Sprinting, Attributes, Jumping};
 use azalea_entity::{InLoadedChunk, LastSentPosition, LookDirection, Physics, Position};
 use azalea_physics::{ai_step, PhysicsSet};
-use azalea_protocol::packets::game::serverbound_player_command_packet::ServerboundPlayerCommandPacket;
-use azalea_protocol::packets::game::{
-    serverbound_move_player_pos_packet::ServerboundMovePlayerPosPacket,
-    serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket,
-    serverbound_move_player_rot_packet::ServerboundMovePlayerRotPacket,
-    serverbound_move_player_status_only_packet::ServerboundMovePlayerStatusOnlyPacket,
+use azalea_protocol::packets::game::ServerboundPlayerCommand;
+use azalea_protocol::packets::{
+    game::{
+        s_move_player_pos::ServerboundMovePlayerPos,
+        s_move_player_pos_rot::ServerboundMovePlayerPosRot,
+        s_move_player_rot::ServerboundMovePlayerRot,
+        s_move_player_status_only::ServerboundMovePlayerStatusOnly,
+    },
+    Packet,
 };
 use azalea_world::{MinecraftEntityId, MoveEntityError};
 use bevy_app::{App, Plugin, Update};
@@ -188,7 +191,7 @@ pub fn send_position(
             // }
             let packet = if sending_position && sending_direction {
                 Some(
-                    ServerboundMovePlayerPosRotPacket {
+                    ServerboundMovePlayerPosRot {
                         x: position.x,
                         y: position.y,
                         z: position.z,
@@ -196,33 +199,33 @@ pub fn send_position(
                         y_rot: direction.y_rot,
                         on_ground: physics.on_ground,
                     }
-                    .get(),
+                    .into_variant(),
                 )
             } else if sending_position {
                 Some(
-                    ServerboundMovePlayerPosPacket {
+                    ServerboundMovePlayerPos {
                         x: position.x,
                         y: position.y,
                         z: position.z,
                         on_ground: physics.on_ground,
                     }
-                    .get(),
+                    .into_variant(),
                 )
             } else if sending_direction {
                 Some(
-                    ServerboundMovePlayerRotPacket {
+                    ServerboundMovePlayerRot {
                         x_rot: direction.x_rot,
                         y_rot: direction.y_rot,
                         on_ground: physics.on_ground,
                     }
-                    .get(),
+                    .into_variant(),
                 )
             } else if physics.last_on_ground != physics.on_ground {
                 Some(
-                    ServerboundMovePlayerStatusOnlyPacket {
+                    ServerboundMovePlayerStatusOnly {
                         on_ground: physics.on_ground,
                     }
-                    .get(),
+                    .into_variant(),
                 )
             } else {
                 None
@@ -244,7 +247,10 @@ pub fn send_position(
         };
 
         if let Some(packet) = packet {
-            send_packet_events.send(SendPacketEvent { entity, packet });
+            send_packet_events.send(SendPacketEvent {
+                sent_by: entity,
+                packet,
+            });
         }
     }
 }
@@ -257,19 +263,18 @@ fn send_sprinting_if_needed(
         let was_sprinting = physics_state.was_sprinting;
         if **sprinting != was_sprinting {
             let sprinting_action = if **sprinting {
-                azalea_protocol::packets::game::serverbound_player_command_packet::Action::StartSprinting
+                azalea_protocol::packets::game::s_player_command::Action::StartSprinting
             } else {
-                azalea_protocol::packets::game::serverbound_player_command_packet::Action::StopSprinting
+                azalea_protocol::packets::game::s_player_command::Action::StopSprinting
             };
-            send_packet_events.send(SendPacketEvent {
+            send_packet_events.send(SendPacketEvent::new(
                 entity,
-                packet: ServerboundPlayerCommandPacket {
+                ServerboundPlayerCommand {
                     id: **minecraft_entity_id,
                     action: sprinting_action,
                     data: 0,
-                }
-                .get(),
-            });
+                },
+            ));
             physics_state.was_sprinting = **sprinting;
         }
     }
diff --git a/azalea-client/src/packet_handling/configuration.rs b/azalea-client/src/packet_handling/configuration.rs
index de365394a..e427e36e4 100644
--- a/azalea-client/src/packet_handling/configuration.rs
+++ b/azalea-client/src/packet_handling/configuration.rs
@@ -1,15 +1,14 @@
 use std::io::Cursor;
 
 use azalea_entity::indexing::EntityIdIndex;
-use azalea_protocol::packets::configuration::serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket;
-use azalea_protocol::packets::configuration::serverbound_keep_alive_packet::ServerboundKeepAlivePacket;
-use azalea_protocol::packets::configuration::serverbound_pong_packet::ServerboundPongPacket;
-use azalea_protocol::packets::configuration::serverbound_resource_pack_packet::ServerboundResourcePackPacket;
-use azalea_protocol::packets::configuration::serverbound_select_known_packs_packet::ServerboundSelectKnownPacksPacket;
-use azalea_protocol::packets::configuration::{
-    ClientboundConfigurationPacket, ServerboundConfigurationPacket,
+use azalea_protocol::packets::config::s_finish_configuration::ServerboundFinishConfiguration;
+use azalea_protocol::packets::config::s_keep_alive::ServerboundKeepAlive;
+use azalea_protocol::packets::config::s_select_known_packs::ServerboundSelectKnownPacks;
+use azalea_protocol::packets::config::{
+    self, ClientboundConfigPacket, ServerboundConfigPacket, ServerboundCookieResponse,
+    ServerboundResourcePack,
 };
-use azalea_protocol::packets::ConnectionProtocol;
+use azalea_protocol::packets::{ConnectionProtocol, Packet};
 use azalea_protocol::read::deserialize_packet;
 use bevy_ecs::prelude::*;
 use bevy_ecs::system::SystemState;
@@ -23,29 +22,29 @@ use crate::raw_connection::RawConnection;
 use crate::InstanceHolder;
 
 #[derive(Event, Debug, Clone)]
-pub struct ConfigurationPacketEvent {
+pub struct ConfigurationEvent {
     /// The client entity that received the packet.
     pub entity: Entity,
     /// The packet that was actually received.
-    pub packet: ClientboundConfigurationPacket,
+    pub packet: ClientboundConfigPacket,
 }
 
 pub fn send_packet_events(
     query: Query<(Entity, &RawConnection), With<InConfigurationState>>,
-    mut packet_events: ResMut<Events<ConfigurationPacketEvent>>,
+    mut packet_events: ResMut<Events<ConfigurationEvent>>,
 ) {
     // we manually clear and send the events at the beginning of each update
     // since otherwise it'd cause issues with events in process_packet_events
     // running twice
     packet_events.clear();
-    for (player_entity, raw_connection) in &query {
-        let packets_lock = raw_connection.incoming_packet_queue();
+    for (player_entity, raw_conn) in &query {
+        let packets_lock = raw_conn.incoming_packet_queue();
         let mut packets = packets_lock.lock();
         if !packets.is_empty() {
             for raw_packet in packets.iter() {
-                let packet = match deserialize_packet::<ClientboundConfigurationPacket>(
-                    &mut Cursor::new(raw_packet),
-                ) {
+                let packet = match deserialize_packet::<ClientboundConfigPacket>(&mut Cursor::new(
+                    raw_packet,
+                )) {
                     Ok(packet) => packet,
                     Err(err) => {
                         error!("failed to read packet: {:?}", err);
@@ -53,7 +52,7 @@ pub fn send_packet_events(
                         continue;
                     }
                 };
-                packet_events.send(ConfigurationPacketEvent {
+                packet_events.send(ConfigurationEvent {
                     entity: player_entity,
                     packet,
                 });
@@ -66,10 +65,9 @@ pub fn send_packet_events(
 
 pub fn process_packet_events(ecs: &mut World) {
     let mut events_owned = Vec::new();
-    let mut system_state: SystemState<EventReader<ConfigurationPacketEvent>> =
-        SystemState::new(ecs);
+    let mut system_state: SystemState<EventReader<ConfigurationEvent>> = SystemState::new(ecs);
     let mut events = system_state.get_mut(ecs);
-    for ConfigurationPacketEvent {
+    for ConfigurationEvent {
         entity: player_entity,
         packet,
     } in events.read()
@@ -79,7 +77,7 @@ pub fn process_packet_events(ecs: &mut World) {
     }
     for (player_entity, packet) in events_owned {
         match packet {
-            ClientboundConfigurationPacket::RegistryData(p) => {
+            ClientboundConfigPacket::RegistryData(p) => {
                 let mut system_state: SystemState<Query<&mut InstanceHolder>> =
                     SystemState::new(ecs);
                 let mut query = system_state.get_mut(ecs);
@@ -90,10 +88,10 @@ pub fn process_packet_events(ecs: &mut World) {
                 instance.registries.append(p.registry_id, p.entries);
             }
 
-            ClientboundConfigurationPacket::CustomPayload(p) => {
+            ClientboundConfigPacket::CustomPayload(p) => {
                 debug!("Got custom payload packet {p:?}");
             }
-            ClientboundConfigurationPacket::Disconnect(p) => {
+            ClientboundConfigPacket::Disconnect(p) => {
                 warn!("Got disconnect packet {p:?}");
                 let mut system_state: SystemState<EventWriter<DisconnectEvent>> =
                     SystemState::new(ecs);
@@ -103,20 +101,20 @@ pub fn process_packet_events(ecs: &mut World) {
                     reason: Some(p.reason.clone()),
                 });
             }
-            ClientboundConfigurationPacket::FinishConfiguration(p) => {
+            ClientboundConfigPacket::FinishConfiguration(p) => {
                 debug!("got FinishConfiguration packet: {p:?}");
 
                 let mut system_state: SystemState<Query<&mut RawConnection>> =
                     SystemState::new(ecs);
                 let mut query = system_state.get_mut(ecs);
-                let mut raw_connection = query.get_mut(player_entity).unwrap();
+                let mut raw_conn = query.get_mut(player_entity).unwrap();
 
-                raw_connection
-                    .write_packet(ServerboundFinishConfigurationPacket {}.get())
+                raw_conn
+                    .write_packet(ServerboundFinishConfiguration {})
                     .expect(
                         "we should be in the right state and encoding this packet shouldn't fail",
                     );
-                raw_connection.set_state(ConnectionProtocol::Game);
+                raw_conn.set_state(ConnectionProtocol::Game);
 
                 // these components are added now that we're going to be in the Game state
                 ecs.entity_mut(player_entity)
@@ -140,7 +138,7 @@ pub fn process_packet_events(ecs: &mut World) {
                         _local_entity: azalea_entity::LocalEntity,
                     });
             }
-            ClientboundConfigurationPacket::KeepAlive(p) => {
+            ClientboundConfigPacket::KeepAlive(p) => {
                 debug!("Got keep alive packet (in configuration) {p:?} for {player_entity:?}");
 
                 let mut system_state: SystemState<(
@@ -148,80 +146,91 @@ pub fn process_packet_events(ecs: &mut World) {
                     EventWriter<KeepAliveEvent>,
                 )> = SystemState::new(ecs);
                 let (query, mut keepalive_events) = system_state.get_mut(ecs);
-                let raw_connection = query.get(player_entity).unwrap();
+                let raw_conn = query.get(player_entity).unwrap();
 
                 keepalive_events.send(KeepAliveEvent {
                     entity: player_entity,
                     id: p.id,
                 });
-                raw_connection
-                    .write_packet(ServerboundKeepAlivePacket { id: p.id }.get())
+                raw_conn
+                    .write_packet(ServerboundKeepAlive { id: p.id })
                     .unwrap();
             }
-            ClientboundConfigurationPacket::Ping(p) => {
+            ClientboundConfigPacket::Ping(p) => {
                 debug!("Got ping packet {p:?}");
 
                 let mut system_state: SystemState<Query<&RawConnection>> = SystemState::new(ecs);
                 let mut query = system_state.get_mut(ecs);
-                let raw_connection = query.get_mut(player_entity).unwrap();
+                let raw_conn = query.get_mut(player_entity).unwrap();
 
-                raw_connection
-                    .write_packet(ServerboundPongPacket { id: p.id }.get())
+                raw_conn
+                    .write_packet(config::s_pong::ServerboundPong { id: p.id })
                     .unwrap();
             }
-            ClientboundConfigurationPacket::ResourcePackPush(p) => {
+            ClientboundConfigPacket::ResourcePackPush(p) => {
                 debug!("Got resource pack packet {p:?}");
 
                 let mut system_state: SystemState<Query<&RawConnection>> = SystemState::new(ecs);
                 let mut query = system_state.get_mut(ecs);
-                let raw_connection = query.get_mut(player_entity).unwrap();
+                let raw_conn = query.get_mut(player_entity).unwrap();
 
                 // always accept resource pack
-                raw_connection.write_packet(
-                    ServerboundResourcePackPacket {
+                raw_conn
+                    .write_packet(ServerboundResourcePack {
                         id: p.id,
-                        action: azalea_protocol::packets::configuration::serverbound_resource_pack_packet::Action::Accepted
-                    }.get()
-                ).unwrap();
+                        action: config::s_resource_pack::Action::Accepted,
+                    })
+                    .unwrap();
             }
-            ClientboundConfigurationPacket::ResourcePackPop(_) => {
+            ClientboundConfigPacket::ResourcePackPop(_) => {
                 // we can ignore this
             }
-            ClientboundConfigurationPacket::UpdateEnabledFeatures(p) => {
+            ClientboundConfigPacket::UpdateEnabledFeatures(p) => {
                 debug!("Got update enabled features packet {p:?}");
             }
-            ClientboundConfigurationPacket::UpdateTags(_p) => {
+            ClientboundConfigPacket::UpdateTags(_p) => {
                 debug!("Got update tags packet");
             }
-            ClientboundConfigurationPacket::CookieRequest(p) => {
+            ClientboundConfigPacket::CookieRequest(p) => {
                 debug!("Got cookie request packet {p:?}");
+
+                let mut system_state: SystemState<Query<&RawConnection>> = SystemState::new(ecs);
+                let mut query = system_state.get_mut(ecs);
+                let raw_conn = query.get_mut(player_entity).unwrap();
+
+                raw_conn
+                    .write_packet(ServerboundCookieResponse {
+                        key: p.key,
+                        // cookies aren't implemented
+                        payload: None,
+                    })
+                    .unwrap();
             }
-            ClientboundConfigurationPacket::ResetChat(p) => {
+            ClientboundConfigPacket::ResetChat(p) => {
                 debug!("Got reset chat packet {p:?}");
             }
-            ClientboundConfigurationPacket::StoreCookie(p) => {
+            ClientboundConfigPacket::StoreCookie(p) => {
                 debug!("Got store cookie packet {p:?}");
             }
-            ClientboundConfigurationPacket::Transfer(p) => {
+            ClientboundConfigPacket::Transfer(p) => {
                 debug!("Got transfer packet {p:?}");
             }
-            ClientboundConfigurationPacket::SelectKnownPacks(p) => {
+            ClientboundConfigPacket::SelectKnownPacks(p) => {
                 debug!("Got select known packs packet {p:?}");
 
                 let mut system_state: SystemState<Query<&RawConnection>> = SystemState::new(ecs);
                 let mut query = system_state.get_mut(ecs);
-                let raw_connection = query.get_mut(player_entity).unwrap();
+                let raw_conn = query.get_mut(player_entity).unwrap();
 
                 // resource pack management isn't implemented
-                raw_connection
-                    .write_packet(
-                        ServerboundSelectKnownPacksPacket {
-                            known_packs: vec![],
-                        }
-                        .get(),
-                    )
+                raw_conn
+                    .write_packet(ServerboundSelectKnownPacks {
+                        known_packs: vec![],
+                    })
                     .unwrap();
             }
+            ClientboundConfigPacket::ServerLinks(_) => {}
+            ClientboundConfigPacket::CustomReportDetails(_) => {}
         }
     }
 }
@@ -229,19 +238,25 @@ pub fn process_packet_events(ecs: &mut World) {
 /// An event for sending a packet to the server while we're in the
 /// `configuration` state.
 #[derive(Event)]
-pub struct SendConfigurationPacketEvent {
-    pub entity: Entity,
-    pub packet: ServerboundConfigurationPacket,
+pub struct SendConfigurationEvent {
+    pub sent_by: Entity,
+    pub packet: ServerboundConfigPacket,
+}
+impl SendConfigurationEvent {
+    pub fn new(sent_by: Entity, packet: impl Packet<ServerboundConfigPacket>) -> Self {
+        let packet = packet.into_variant();
+        Self { sent_by, packet }
+    }
 }
 
 pub fn handle_send_packet_event(
-    mut send_packet_events: EventReader<SendConfigurationPacketEvent>,
+    mut send_packet_events: EventReader<SendConfigurationEvent>,
     mut query: Query<&mut RawConnection>,
 ) {
     for event in send_packet_events.read() {
-        if let Ok(raw_connection) = query.get_mut(event.entity) {
+        if let Ok(raw_conn) = query.get_mut(event.sent_by) {
             // debug!("Sending packet: {:?}", event.packet);
-            if let Err(e) = raw_connection.write_packet(event.packet.clone()) {
+            if let Err(e) = raw_conn.write_packet(event.packet.clone()) {
                 error!("Failed to send packet: {e}");
             }
         }
diff --git a/azalea-client/src/packet_handling/game.rs b/azalea-client/src/packet_handling/game.rs
index 3c6ad6b57..38178a63b 100644
--- a/azalea-client/src/packet_handling/game.rs
+++ b/azalea-client/src/packet_handling/game.rs
@@ -17,14 +17,15 @@ use azalea_entity::{
     Physics, PlayerBundle, Position, RelativeEntityUpdate,
 };
 use azalea_protocol::{
-    packets::game::{
-        clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket,
-        serverbound_accept_teleportation_packet::ServerboundAcceptTeleportationPacket,
-        serverbound_configuration_acknowledged_packet::ServerboundConfigurationAcknowledgedPacket,
-        serverbound_keep_alive_packet::ServerboundKeepAlivePacket,
-        serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket,
-        serverbound_pong_packet::ServerboundPongPacket, ClientboundGamePacket,
-        ServerboundGamePacket,
+    packets::{
+        game::{
+            c_player_combat_kill::ClientboundPlayerCombatKill,
+            s_accept_teleportation::ServerboundAcceptTeleportation,
+            s_configuration_acknowledged::ServerboundConfigurationAcknowledged,
+            s_keep_alive::ServerboundKeepAlive, s_move_player_pos_rot::ServerboundMovePlayerPosRot,
+            s_pong::ServerboundPong, ClientboundGamePacket, ServerboundGamePacket,
+        },
+        Packet,
     },
     read::deserialize_packet,
 };
@@ -103,12 +104,12 @@ pub struct UpdatePlayerEvent {
 }
 
 /// Event for when an entity dies. dies. If it's a local player and there's a
-/// reason in the death screen, the [`ClientboundPlayerCombatKillPacket`] will
+/// reason in the death screen, the [`ClientboundPlayerCombatKill`] will
 /// be included.
 #[derive(Event, Debug, Clone)]
 pub struct DeathEvent {
     pub entity: Entity,
-    pub packet: Option<ClientboundPlayerCombatKillPacket>,
+    pub packet: Option<ClientboundPlayerCombatKill>,
 }
 
 /// A KeepAlive packet is sent from the server to verify that the client is
@@ -340,10 +341,9 @@ pub fn process_packet_events(ecs: &mut World) {
                     "Sending client information because login: {:?}",
                     client_information
                 );
-                send_packet_events.send(SendPacketEvent {
-                    entity: player_entity,
-                    packet: azalea_protocol::packets::game::serverbound_client_information_packet::ServerboundClientInformationPacket { information: client_information.clone() }.get(),
-                });
+                send_packet_events.send(SendPacketEvent::new(player_entity,
+                    azalea_protocol::packets::game::s_client_information::ServerboundClientInformation { information: client_information.clone() },
+                ));
 
                 system_state.apply(ecs);
             }
@@ -493,13 +493,13 @@ pub fn process_packet_events(ecs: &mut World) {
                     **position = new_pos;
                 }
 
-                send_packet_events.send(SendPacketEvent {
-                    entity: player_entity,
-                    packet: ServerboundAcceptTeleportationPacket { id: p.id }.get(),
-                });
-                send_packet_events.send(SendPacketEvent {
-                    entity: player_entity,
-                    packet: ServerboundMovePlayerPosRotPacket {
+                send_packet_events.send(SendPacketEvent::new(
+                    player_entity,
+                    ServerboundAcceptTeleportation { id: p.id },
+                ));
+                send_packet_events.send(SendPacketEvent::new(
+                    player_entity,
+                    ServerboundMovePlayerPosRot {
                         x: new_pos.x,
                         y: new_pos.y,
                         z: new_pos.z,
@@ -507,9 +507,8 @@ pub fn process_packet_events(ecs: &mut World) {
                         x_rot,
                         // this is always false
                         on_ground: false,
-                    }
-                    .get(),
-                });
+                    },
+                ));
             }
             ClientboundGamePacket::PlayerInfoUpdate(p) => {
                 debug!("Got player info packet {p:?}");
@@ -983,10 +982,10 @@ pub fn process_packet_events(ecs: &mut World) {
                     entity: player_entity,
                     id: p.id,
                 });
-                send_packet_events.send(SendPacketEvent {
-                    entity: player_entity,
-                    packet: ServerboundKeepAlivePacket { id: p.id }.get(),
-                });
+                send_packet_events.send(SendPacketEvent::new(
+                    player_entity,
+                    ServerboundKeepAlive { id: p.id },
+                ));
             }
             ClientboundGamePacket::RemoveEntities(p) => {
                 debug!("Got remove entities packet {:?}", p);
@@ -1096,7 +1095,7 @@ pub fn process_packet_events(ecs: &mut World) {
                 }
             }
             ClientboundGamePacket::GameEvent(p) => {
-                use azalea_protocol::packets::game::clientbound_game_event_packet::EventType;
+                use azalea_protocol::packets::game::c_game_event::EventType;
 
                 debug!("Got game event packet {p:?}");
 
@@ -1279,10 +1278,10 @@ pub fn process_packet_events(ecs: &mut World) {
                     SystemState::new(ecs);
                 let mut send_packet_events = system_state.get_mut(ecs);
 
-                send_packet_events.send(SendPacketEvent {
-                    entity: player_entity,
-                    packet: ServerboundPongPacket { id: p.id }.get(),
-                });
+                send_packet_events.send(SendPacketEvent::new(
+                    player_entity,
+                    ServerboundPong { id: p.id },
+                ));
             }
             ClientboundGamePacket::PlaceGhostRecipe(_) => {}
             ClientboundGamePacket::PlayerCombatEnd(_) => {}
@@ -1423,10 +1422,10 @@ pub fn process_packet_events(ecs: &mut World) {
                     SystemState::new(ecs);
                 let (mut commands, mut packet_events) = system_state.get_mut(ecs);
 
-                packet_events.send(SendPacketEvent {
-                    entity: player_entity,
-                    packet: ServerboundConfigurationAcknowledgedPacket {}.get(),
-                });
+                packet_events.send(SendPacketEvent::new(
+                    player_entity,
+                    ServerboundConfigurationAcknowledged {},
+                ));
 
                 commands
                     .entity(player_entity)
@@ -1459,7 +1458,7 @@ pub fn process_packet_events(ecs: &mut World) {
             ClientboundGamePacket::TabList(_) => {}
             ClientboundGamePacket::TagQuery(_) => {}
             ClientboundGamePacket::TakeItemEntity(_) => {}
-            ClientboundGamePacket::Bundle(_) => {}
+            ClientboundGamePacket::BundleDelimiter(_) => {}
             ClientboundGamePacket::DamageEvent(_) => {}
             ClientboundGamePacket::HurtAnimation(_) => {}
 
@@ -1472,7 +1471,7 @@ pub fn process_packet_events(ecs: &mut World) {
             ClientboundGamePacket::PongResponse(_) => {}
             ClientboundGamePacket::StoreCookie(_) => {}
             ClientboundGamePacket::Transfer(_) => {}
-            ClientboundGamePacket::MoveMinecart(_) => {}
+            ClientboundGamePacket::MoveMinecartAlongTrack(_) => {}
             ClientboundGamePacket::SetHeldSlot(_) => {}
             ClientboundGamePacket::SetPlayerInventory(_) => {}
             ClientboundGamePacket::ProjectilePower(_) => {}
@@ -1490,16 +1489,22 @@ pub fn process_packet_events(ecs: &mut World) {
 /// An event for sending a packet to the server while we're in the `game` state.
 #[derive(Event)]
 pub struct SendPacketEvent {
-    pub entity: Entity,
+    pub sent_by: Entity,
     pub packet: ServerboundGamePacket,
 }
+impl SendPacketEvent {
+    pub fn new(sent_by: Entity, packet: impl Packet<ServerboundGamePacket>) -> Self {
+        let packet = packet.into_variant();
+        Self { sent_by, packet }
+    }
+}
 
 pub fn handle_send_packet_event(
     mut send_packet_events: EventReader<SendPacketEvent>,
     mut query: Query<&mut RawConnection>,
 ) {
     for event in send_packet_events.read() {
-        if let Ok(raw_connection) = query.get_mut(event.entity) {
+        if let Ok(raw_connection) = query.get_mut(event.sent_by) {
             // debug!("Sending packet: {:?}", event.packet);
             if let Err(e) = raw_connection.write_packet(event.packet.clone()) {
                 error!("Failed to send packet: {e}");
diff --git a/azalea-client/src/packet_handling/login.rs b/azalea-client/src/packet_handling/login.rs
index 7d71b440a..11c0b8e9c 100644
--- a/azalea-client/src/packet_handling/login.rs
+++ b/azalea-client/src/packet_handling/login.rs
@@ -3,9 +3,12 @@
 
 use std::{collections::HashSet, sync::Arc};
 
-use azalea_protocol::packets::login::{
-    serverbound_custom_query_answer_packet::ServerboundCustomQueryAnswerPacket,
-    ClientboundLoginPacket, ServerboundLoginPacket,
+use azalea_protocol::packets::{
+    login::{
+        s_custom_query_answer::ServerboundCustomQueryAnswer, ClientboundLoginPacket,
+        ServerboundLoginPacket,
+    },
+    Packet,
 };
 use bevy_ecs::{prelude::*, system::SystemState};
 use derive_more::{Deref, DerefMut};
@@ -33,6 +36,12 @@ pub struct SendLoginPacketEvent {
     pub entity: Entity,
     pub packet: ServerboundLoginPacket,
 }
+impl SendLoginPacketEvent {
+    pub fn new(entity: Entity, packet: impl Packet<ServerboundLoginPacket>) -> Self {
+        let packet = packet.into_variant();
+        Self { entity, packet }
+    }
+}
 
 #[derive(Component)]
 pub struct LoginSendPacketQueue {
@@ -86,14 +95,13 @@ pub fn process_packet_events(ecs: &mut World) {
                     }
                 }
 
-                send_packet_events.send(SendLoginPacketEvent {
-                    entity: player_entity,
-                    packet: ServerboundCustomQueryAnswerPacket {
+                send_packet_events.send(SendLoginPacketEvent::new(
+                    player_entity,
+                    ServerboundCustomQueryAnswer {
                         transaction_id: p.transaction_id,
                         data: None,
-                    }
-                    .get(),
-                });
+                    },
+                ));
             }
             _ => {}
         }
diff --git a/azalea-client/src/packet_handling/mod.rs b/azalea-client/src/packet_handling/mod.rs
index eb8f1d47a..6bb9c3191 100644
--- a/azalea-client/src/packet_handling/mod.rs
+++ b/azalea-client/src/packet_handling/mod.rs
@@ -61,9 +61,9 @@ impl Plugin for PacketHandlerPlugin {
         )
         // we do this instead of add_event so we can handle the events ourselves
         .init_resource::<Events<game::PacketEvent>>()
-        .init_resource::<Events<configuration::ConfigurationPacketEvent>>()
+        .init_resource::<Events<configuration::ConfigurationEvent>>()
         .add_event::<game::SendPacketEvent>()
-        .add_event::<configuration::SendConfigurationPacketEvent>()
+        .add_event::<configuration::SendConfigurationEvent>()
         .add_event::<AddPlayerEvent>()
         .add_event::<RemovePlayerEvent>()
         .add_event::<UpdatePlayerEvent>()
diff --git a/azalea-client/src/ping.rs b/azalea-client/src/ping.rs
index ded1b5217..f5d714cd0 100755
--- a/azalea-client/src/ping.rs
+++ b/azalea-client/src/ping.rs
@@ -5,14 +5,13 @@ use std::io;
 use azalea_protocol::{
     connect::{Connection, ConnectionError, Proxy},
     packets::{
-        handshaking::{
-            client_intention_packet::ClientIntentionPacket, ClientboundHandshakePacket,
+        handshake::{
+            s_intention::ServerboundIntention, ClientboundHandshakePacket,
             ServerboundHandshakePacket,
         },
         status::{
-            clientbound_status_response_packet::ClientboundStatusResponsePacket,
-            serverbound_status_request_packet::ServerboundStatusRequestPacket,
-            ClientboundStatusPacket,
+            c_status_response::ClientboundStatusResponse,
+            s_status_request::ServerboundStatusRequest, ClientboundStatusPacket,
         },
         ClientIntention, PROTOCOL_VERSION,
     },
@@ -49,7 +48,7 @@ pub enum PingError {
 /// ```
 pub async fn ping_server(
     address: impl TryInto<ServerAddress>,
-) -> Result<ClientboundStatusResponsePacket, PingError> {
+) -> Result<ClientboundStatusResponse, PingError> {
     let address: ServerAddress = address.try_into().map_err(|_| PingError::InvalidAddress)?;
     let resolved_address = resolver::resolve_address(&address).await?;
     let conn = Connection::new(&resolved_address).await?;
@@ -60,7 +59,7 @@ pub async fn ping_server(
 pub async fn ping_server_with_proxy(
     address: impl TryInto<ServerAddress>,
     proxy: Proxy,
-) -> Result<ClientboundStatusResponsePacket, PingError> {
+) -> Result<ClientboundStatusResponse, PingError> {
     let address: ServerAddress = address.try_into().map_err(|_| PingError::InvalidAddress)?;
     let resolved_address = resolver::resolve_address(&address).await?;
     let conn = Connection::new_with_proxy(&resolved_address, proxy).await?;
@@ -73,22 +72,19 @@ pub async fn ping_server_with_proxy(
 pub async fn ping_server_with_connection(
     address: ServerAddress,
     mut conn: Connection<ClientboundHandshakePacket, ServerboundHandshakePacket>,
-) -> Result<ClientboundStatusResponsePacket, PingError> {
+) -> Result<ClientboundStatusResponse, PingError> {
     // send the client intention packet and switch to the status state
-    conn.write(
-        ClientIntentionPacket {
-            protocol_version: PROTOCOL_VERSION,
-            hostname: address.host.clone(),
-            port: address.port,
-            intention: ClientIntention::Status,
-        }
-        .get(),
-    )
+    conn.write(ServerboundIntention {
+        protocol_version: PROTOCOL_VERSION,
+        hostname: address.host.clone(),
+        port: address.port,
+        intention: ClientIntention::Status,
+    })
     .await?;
     let mut conn = conn.status();
 
     // send the empty status request packet
-    conn.write(ServerboundStatusRequestPacket {}.get()).await?;
+    conn.write(ServerboundStatusRequest {}).await?;
 
     let packet = conn.read().await?;
 
diff --git a/azalea-client/src/raw_connection.rs b/azalea-client/src/raw_connection.rs
index 8cbb15a47..3eacf5289 100644
--- a/azalea-client/src/raw_connection.rs
+++ b/azalea-client/src/raw_connection.rs
@@ -3,7 +3,7 @@ use std::sync::Arc;
 
 use azalea_protocol::{
     connect::{RawReadConnection, RawWriteConnection},
-    packets::{ConnectionProtocol, ProtocolPacket},
+    packets::{ConnectionProtocol, Packet, ProtocolPacket},
     read::ReadPacketError,
     write::serialize_packet,
 };
@@ -106,8 +106,9 @@ impl RawConnection {
     /// encoding it failed somehow (like it's too big or something).
     pub fn write_packet<P: ProtocolPacket + Debug>(
         &self,
-        packet: P,
+        packet: impl Packet<P>,
     ) -> Result<(), WritePacketError> {
+        let packet = packet.into_variant();
         let raw_packet = serialize_packet(&packet)?;
         self.write_raw_packet(raw_packet)?;
 
diff --git a/azalea-client/src/respawn.rs b/azalea-client/src/respawn.rs
index 150b35913..edd2a43aa 100644
--- a/azalea-client/src/respawn.rs
+++ b/azalea-client/src/respawn.rs
@@ -1,6 +1,4 @@
-use azalea_protocol::packets::game::serverbound_client_command_packet::{
-    self, ServerboundClientCommandPacket,
-};
+use azalea_protocol::packets::game::s_client_command::{self, ServerboundClientCommand};
 use bevy_app::{App, Plugin, Update};
 use bevy_ecs::prelude::*;
 
@@ -26,12 +24,11 @@ pub fn perform_respawn(
     mut send_packets: EventWriter<SendPacketEvent>,
 ) {
     for event in events.read() {
-        send_packets.send(SendPacketEvent {
-            entity: event.entity,
-            packet: ServerboundClientCommandPacket {
-                action: serverbound_client_command_packet::Action::PerformRespawn,
-            }
-            .get(),
-        });
+        send_packets.send(SendPacketEvent::new(
+            event.entity,
+            ServerboundClientCommand {
+                action: s_client_command::Action::PerformRespawn,
+            },
+        ));
     }
 }
diff --git a/azalea-core/Cargo.toml b/azalea-core/Cargo.toml
index bc65399f4..ddde62163 100644
--- a/azalea-core/Cargo.toml
+++ b/azalea-core/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-core"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-core"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-core/src/bitset.rs b/azalea-core/src/bitset.rs
index 0be04a57b..e7c79467f 100755
--- a/azalea-core/src/bitset.rs
+++ b/azalea-core/src/bitset.rs
@@ -1,9 +1,9 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError};
 
 /// Represents Java's BitSet, a list of bits.
-#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, McBuf)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, AzBuf)]
 pub struct BitSet {
     data: Vec<u64>,
 }
@@ -159,25 +159,25 @@ where
     }
 }
 
-impl<const N: usize> McBufReadable for FixedBitSet<N>
+impl<const N: usize> AzaleaRead for FixedBitSet<N>
 where
     [u8; N.div_ceil(8)]: Sized,
 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         let mut data = [0; N.div_ceil(8)];
         for item in data.iter_mut().take(N.div_ceil(8)) {
-            *item = u8::read_from(buf)?;
+            *item = u8::azalea_read(buf)?;
         }
         Ok(FixedBitSet { data })
     }
 }
-impl<const N: usize> McBufWritable for FixedBitSet<N>
+impl<const N: usize> AzaleaWrite for FixedBitSet<N>
 where
     [u8; N.div_ceil(8)]: Sized,
 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         for i in 0..N.div_ceil(8) {
-            self.data[i].write_into(buf)?;
+            self.data[i].azalea_write(buf)?;
         }
         Ok(())
     }
diff --git a/azalea-core/src/delta.rs b/azalea-core/src/delta.rs
index 2dd670052..238262a2a 100755
--- a/azalea-core/src/delta.rs
+++ b/azalea-core/src/delta.rs
@@ -1,4 +1,4 @@
-pub use azalea_buf::McBuf;
+pub use azalea_buf::AzBuf;
 
 use crate::position::Vec3;
 
@@ -9,7 +9,7 @@ pub trait PositionDeltaTrait {
 }
 
 /// Only works for up to 8 blocks
-#[derive(Clone, Debug, McBuf, Default)]
+#[derive(Clone, Debug, AzBuf, Default)]
 pub struct PositionDelta8 {
     pub xa: i16,
     pub ya: i16,
@@ -49,10 +49,6 @@ impl Vec3 {
         }
     }
 
-    pub fn length_squared(&self) -> f64 {
-        self.x * self.x + self.y * self.y + self.z * self.z
-    }
-
     pub fn normalize(&self) -> Vec3 {
         let length = f64::sqrt(self.x * self.x + self.y * self.y + self.z * self.z);
         if length < 1e-4 {
diff --git a/azalea-core/src/difficulty.rs b/azalea-core/src/difficulty.rs
index 750cfe1f5..b907bbb3b 100755
--- a/azalea-core/src/difficulty.rs
+++ b/azalea-core/src/difficulty.rs
@@ -3,7 +3,7 @@ use std::{
     io::{Cursor, Write},
 };
 
-use azalea_buf::{BufReadError, McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
 
 #[derive(Hash, Clone, Copy, Debug, PartialEq, Eq)]
 pub enum Difficulty {
@@ -66,15 +66,15 @@ impl Difficulty {
     }
 }
 
-impl McBufReadable for Difficulty {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        Ok(Difficulty::by_id(u8::read_from(buf)?))
+impl AzaleaRead for Difficulty {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        Ok(Difficulty::by_id(u8::azalea_read(buf)?))
     }
 }
 
-impl McBufWritable for Difficulty {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        u8::write_into(&self.id(), buf)
+impl AzaleaWrite for Difficulty {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        u8::azalea_write(&self.id(), buf)
     }
 }
 
diff --git a/azalea-core/src/direction.rs b/azalea-core/src/direction.rs
index 32e1a23a7..b0b8c9603 100755
--- a/azalea-core/src/direction.rs
+++ b/azalea-core/src/direction.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 
 use crate::position::Vec3;
 
-#[derive(Clone, Copy, Debug, McBuf, Default, Eq, PartialEq)]
+#[derive(Clone, Copy, Debug, AzBuf, Default, Eq, PartialEq)]
 pub enum Direction {
     #[default]
     Down = 0,
@@ -62,7 +62,7 @@ impl Direction {
 }
 
 // TODO: make azalea_block use this instead of FacingCardinal
-#[derive(Clone, Copy, Debug, McBuf, PartialEq, Eq, Hash)]
+#[derive(Clone, Copy, Debug, AzBuf, PartialEq, Eq, Hash)]
 pub enum CardinalDirection {
     North,
     South,
diff --git a/azalea-core/src/game_type.rs b/azalea-core/src/game_type.rs
index 1e4940351..5bac06d5c 100644
--- a/azalea-core/src/game_type.rs
+++ b/azalea-core/src/game_type.rs
@@ -1,6 +1,6 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaReadVar, AzaleaWrite, BufReadError};
 use tracing::debug;
 
 /// A Minecraft gamemode, like survival or creative.
@@ -93,9 +93,9 @@ impl GameMode {
     }
 }
 
-impl McBufReadable for GameMode {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let id = u32::var_read_from(buf)?;
+impl AzaleaRead for GameMode {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let id = u32::azalea_read_var(buf)?;
         let id = id.try_into().unwrap_or_else(|_| {
             debug!("Unknown game mode id {id}, defaulting to survival");
             0
@@ -107,13 +107,13 @@ impl McBufReadable for GameMode {
     }
 }
 
-impl McBufWritable for GameMode {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        u8::write_into(&self.to_id(), buf)
+impl AzaleaWrite for GameMode {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        u8::azalea_write(&self.to_id(), buf)
     }
 }
 
-/// Rust doesn't let us `impl McBufReadable for Option<GameType>` so we have to
+/// Rust doesn't let us `impl AzaleaRead for Option<GameType>` so we have to
 /// make a new type :(
 #[derive(Hash, Copy, Clone, Debug)]
 pub struct OptionalGameType(pub Option<GameMode>);
@@ -130,15 +130,15 @@ impl From<OptionalGameType> for Option<GameMode> {
     }
 }
 
-impl McBufReadable for OptionalGameType {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let id = i8::read_from(buf)?;
+impl AzaleaRead for OptionalGameType {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let id = i8::azalea_read(buf)?;
         GameMode::from_optional_id(id).ok_or(BufReadError::UnexpectedEnumVariant { id: id as i32 })
     }
 }
 
-impl McBufWritable for OptionalGameType {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        GameMode::to_optional_id(*self).write_into(buf)
+impl AzaleaWrite for OptionalGameType {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        GameMode::to_optional_id(*self).azalea_write(buf)
     }
 }
diff --git a/azalea-core/src/objectives.rs b/azalea-core/src/objectives.rs
index dd1534f20..a2f0d5171 100644
--- a/azalea-core/src/objectives.rs
+++ b/azalea-core/src/objectives.rs
@@ -3,9 +3,9 @@ use std::{
     str::FromStr,
 };
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 
-#[derive(Clone, Copy, Debug, McBuf)]
+#[derive(Clone, Copy, Debug, AzBuf)]
 pub enum ObjectiveCriteria {
     Integer,
     Hearts,
diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs
index de0276a32..c280a85a6 100755
--- a/azalea-core/src/position.rs
+++ b/azalea-core/src/position.rs
@@ -8,11 +8,9 @@ use std::{
     hash::Hash,
     io::{Cursor, Write},
     ops::{Add, AddAssign, Mul, Rem, Sub},
-    str::FromStr,
 };
 
-use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable};
-#[cfg(feature = "serde")]
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError};
 use serde::{Deserialize, Serialize};
 
 use crate::resource_location::ResourceLocation;
@@ -28,25 +26,25 @@ macro_rules! vec3_impl {
             /// Get the distance of this vector to the origin by doing `x^2 + y^2 +
             /// z^2`.
             #[inline]
-            pub fn length_sqr(&self) -> $type {
+            pub fn length_squared(&self) -> $type {
                 self.x * self.x + self.y * self.y + self.z * self.z
             }
 
             /// Get the squared distance from this position to another position.
-            /// Equivalent to `(self - other).length_sqr()`.
+            /// Equivalent to `(self - other).length_squared()`.
             #[inline]
-            pub fn distance_to_sqr(&self, other: &Self) -> $type {
-                (self - other).length_sqr()
+            pub fn distance_squared_to(&self, other: &Self) -> $type {
+                (self - other).length_squared()
             }
 
             #[inline]
-            pub fn horizontal_distance_sqr(&self) -> $type {
+            pub fn horizontal_distance_squared(&self) -> $type {
                 self.x * self.x + self.z * self.z
             }
 
             #[inline]
-            pub fn horizontal_distance_to_sqr(&self, other: &Self) -> $type {
-                (self - other).horizontal_distance_sqr()
+            pub fn horizontal_distance_squared_to(&self, other: &Self) -> $type {
+                (self - other).horizontal_distance_squared()
             }
 
             /// Return a new instance of this position with the y coordinate
@@ -214,7 +212,7 @@ macro_rules! vec3_impl {
 
 /// Used to represent an exact position in the world where an entity could be.
 /// For blocks, [`BlockPos`] is used instead.
-#[derive(Clone, Copy, Debug, Default, PartialEq, McBuf)]
+#[derive(Clone, Copy, Debug, Default, PartialEq, AzBuf)]
 #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
 pub struct Vec3 {
     pub x: f64,
@@ -272,6 +270,46 @@ impl BlockPos {
     pub fn length_manhattan(&self) -> u32 {
         (self.x.abs() + self.y.abs() + self.z.abs()) as u32
     }
+
+    /// Make a new BlockPos with the lower coordinates for each axis.
+    ///
+    /// ```
+    /// # use azalea_core::position::BlockPos;
+    /// assert_eq!(
+    ///     BlockPos::min(
+    ///        &BlockPos::new(1, 20, 300),
+    ///        &BlockPos::new(50, 40, 30),
+    ///    ),
+    ///    BlockPos::new(1, 20, 30),
+    /// );
+    /// ```
+    pub fn min(&self, other: &Self) -> Self {
+        Self {
+            x: self.x.min(other.x),
+            y: self.y.min(other.y),
+            z: self.z.min(other.z),
+        }
+    }
+
+    /// Make a new BlockPos with the higher coordinates for each axis.
+    ///
+    /// ```
+    /// # use azalea_core::position::BlockPos;
+    /// assert_eq!(
+    ///    BlockPos::max(
+    ///       &BlockPos::new(1, 20, 300),
+    ///       &BlockPos::new(50, 40, 30),
+    ///   ),
+    ///   BlockPos::new(50, 40, 300),
+    /// );
+    /// ```
+    pub fn max(&self, other: &Self) -> Self {
+        Self {
+            x: self.x.max(other.x),
+            y: self.y.max(other.y),
+            z: self.z.max(other.z),
+        }
+    }
 }
 
 /// Chunk coordinates are used to represent where a chunk is in the world. You
@@ -315,15 +353,15 @@ impl From<u64> for ChunkPos {
         }
     }
 }
-impl McBufReadable for ChunkPos {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let long = u64::read_from(buf)?;
+impl AzaleaRead for ChunkPos {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let long = u64::azalea_read(buf)?;
         Ok(ChunkPos::from(long))
     }
 }
-impl McBufWritable for ChunkPos {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        u64::from(*self).write_into(buf)?;
+impl AzaleaWrite for ChunkPos {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        u64::from(*self).azalea_write(buf)?;
         Ok(())
     }
 }
@@ -586,9 +624,9 @@ const PACKED_Z_MASK: u64 = (1 << PACKED_Z_LENGTH) - 1;
 const Z_OFFSET: u64 = PACKED_Y_LENGTH;
 const X_OFFSET: u64 = PACKED_Y_LENGTH + PACKED_Z_LENGTH;
 
-impl McBufReadable for BlockPos {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let val = i64::read_from(buf)?;
+impl AzaleaRead for BlockPos {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let val = i64::azalea_read(buf)?;
         let x = (val << (64 - X_OFFSET - PACKED_X_LENGTH) >> (64 - PACKED_X_LENGTH)) as i32;
         let y = (val << (64 - PACKED_Y_LENGTH) >> (64 - PACKED_Y_LENGTH)) as i32;
         let z = (val << (64 - Z_OFFSET - PACKED_Z_LENGTH) >> (64 - PACKED_Z_LENGTH)) as i32;
@@ -596,18 +634,18 @@ impl McBufReadable for BlockPos {
     }
 }
 
-impl McBufReadable for GlobalPos {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for GlobalPos {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         Ok(GlobalPos {
-            world: ResourceLocation::read_from(buf)?,
-            pos: BlockPos::read_from(buf)?,
+            world: ResourceLocation::azalea_read(buf)?,
+            pos: BlockPos::azalea_read(buf)?,
         })
     }
 }
 
-impl McBufReadable for ChunkSectionPos {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let long = i64::read_from(buf)?;
+impl AzaleaRead for ChunkSectionPos {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let long = i64::azalea_read(buf)?;
         Ok(ChunkSectionPos {
             x: (long >> 42) as i32,
             y: (long << 44 >> 44) as i32,
@@ -616,80 +654,35 @@ impl McBufReadable for ChunkSectionPos {
     }
 }
 
-impl McBufWritable for BlockPos {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for BlockPos {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut val: u64 = 0;
         val |= ((self.x as u64) & PACKED_X_MASK) << X_OFFSET;
         val |= (self.y as u64) & PACKED_Y_MASK;
         val |= ((self.z as u64) & PACKED_Z_MASK) << Z_OFFSET;
-        val.write_into(buf)
+        val.azalea_write(buf)
     }
 }
 
-impl McBufWritable for GlobalPos {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        ResourceLocation::write_into(&self.world, buf)?;
-        BlockPos::write_into(&self.pos, buf)?;
+impl AzaleaWrite for GlobalPos {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        ResourceLocation::azalea_write(&self.world, buf)?;
+        BlockPos::azalea_write(&self.pos, buf)?;
 
         Ok(())
     }
 }
 
-impl McBufWritable for ChunkSectionPos {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ChunkSectionPos {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let long = (((self.x & 0x3FFFFF) as i64) << 42)
             | (self.y & 0xFFFFF) as i64
             | (((self.z & 0x3FFFFF) as i64) << 20);
-        long.write_into(buf)?;
+        long.azalea_write(buf)?;
         Ok(())
     }
 }
 
-fn parse_three_values<T>(s: &str) -> Result<[T; 3], &'static str>
-where
-    T: FromStr,
-    <T as FromStr>::Err: fmt::Debug,
-{
-    let parts = s.split_whitespace().collect::<Vec<_>>();
-    if parts.len() != 3 {
-        return Err("Expected three values");
-    }
-
-    let x = parts[0].parse().map_err(|_| "Invalid X value")?;
-    let y = parts[1].parse().map_err(|_| "Invalid Y value")?;
-    let z = parts[2].parse().map_err(|_| "Invalid Z value")?;
-
-    Ok([x, y, z])
-}
-
-/// Parses a string in the format "X Y Z" into a BlockPos.
-///
-/// The input string should contain three integer values separated by spaces,
-/// representing the x, y, and z components of the vector respectively.
-/// This can be used to parse user input or from `BlockPos::to_string`.
-impl FromStr for BlockPos {
-    type Err = &'static str;
-
-    fn from_str(s: &str) -> Result<Self, Self::Err> {
-        let [x, y, z] = parse_three_values::<i32>(s)?;
-        Ok(BlockPos { x, y, z })
-    }
-}
-
-/// Parses a string in the format "X Y Z" into a Vec3.
-///
-/// The input string should contain three floating-point values separated by
-/// spaces, representing the x, y, and z components of the vector respectively.
-/// This can be used to parse user input or from `Vec3::to_string`.
-impl FromStr for Vec3 {
-    type Err = &'static str;
-
-    fn from_str(s: &str) -> Result<Self, Self::Err> {
-        let [x, y, z] = parse_three_values::<f64>(s)?;
-        Ok(Vec3 { x, y, z })
-    }
-}
-
 #[cfg(test)]
 mod tests {
     use super::*;
@@ -733,9 +726,9 @@ mod tests {
     #[test]
     fn test_read_blockpos_from() {
         let mut buf = Vec::new();
-        13743895338965u64.write_into(&mut buf).unwrap();
+        13743895338965u64.azalea_write(&mut buf).unwrap();
         let mut buf = Cursor::new(&buf[..]);
-        let block_pos = BlockPos::read_from(&mut buf).unwrap();
+        let block_pos = BlockPos::azalea_read(&mut buf).unwrap();
         assert_eq!(block_pos, BlockPos::new(49, -43, -3));
     }
 
@@ -751,9 +744,9 @@ mod tests {
     #[test]
     fn test_read_chunk_pos_from() {
         let mut buf = Vec::new();
-        ChunkPos::new(2, -1).write_into(&mut buf).unwrap();
+        ChunkPos::new(2, -1).azalea_write(&mut buf).unwrap();
         let mut buf = Cursor::new(&buf[..]);
-        let chunk_pos = ChunkPos::from(u64::read_from(&mut buf).unwrap());
+        let chunk_pos = ChunkPos::from(u64::azalea_read(&mut buf).unwrap());
         assert_eq!(chunk_pos, ChunkPos::new(2, -1));
     }
 }
diff --git a/azalea-core/src/resource_location.rs b/azalea-core/src/resource_location.rs
index 7e1e48fe0..c95e31094 100755
--- a/azalea-core/src/resource_location.rs
+++ b/azalea-core/src/resource_location.rs
@@ -6,7 +6,7 @@ use std::{
     str::FromStr,
 };
 
-use azalea_buf::{BufReadError, McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
 #[cfg(feature = "serde")]
 use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
 use simdnbt::{owned::NbtTag, FromNbtTag, ToNbtTag};
@@ -60,15 +60,15 @@ impl FromStr for ResourceLocation {
     }
 }
 
-impl McBufReadable for ResourceLocation {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let location_string = String::read_from(buf)?;
+impl AzaleaRead for ResourceLocation {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let location_string = String::azalea_read(buf)?;
         Ok(ResourceLocation::new(&location_string))
     }
 }
-impl McBufWritable for ResourceLocation {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.to_string().write_into(buf)
+impl AzaleaWrite for ResourceLocation {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.to_string().azalea_write(buf)
     }
 }
 
@@ -142,16 +142,16 @@ mod tests {
     }
 
     #[test]
-    fn mcbuf_resource_location() {
+    fn azbuf_resource_location() {
         let mut buf = Vec::new();
         ResourceLocation::new("minecraft:dirt")
-            .write_into(&mut buf)
+            .azalea_write(&mut buf)
             .unwrap();
 
         let mut buf = Cursor::new(&buf[..]);
 
         assert_eq!(
-            ResourceLocation::read_from(&mut buf).unwrap(),
+            ResourceLocation::azalea_read(&mut buf).unwrap(),
             ResourceLocation::new("minecraft:dirt")
         );
     }
diff --git a/azalea-crypto/Cargo.toml b/azalea-crypto/Cargo.toml
index 6369377b6..a9c6b2543 100644
--- a/azalea-crypto/Cargo.toml
+++ b/azalea-crypto/Cargo.toml
@@ -3,7 +3,7 @@ description = "Cryptography features used in Minecraft."
 edition = "2021"
 license = "MIT"
 name = "azalea-crypto"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-crypto"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
diff --git a/azalea-crypto/src/signing.rs b/azalea-crypto/src/signing.rs
index 5ecafa46d..ba9cc3056 100755
--- a/azalea-crypto/src/signing.rs
+++ b/azalea-crypto/src/signing.rs
@@ -1,6 +1,6 @@
 use std::time::{SystemTime, UNIX_EPOCH};
 
-use azalea_buf::{McBuf, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaWrite};
 use rsa::{
     signature::{RandomizedSigner, SignatureEncoding},
     RsaPrivateKey,
@@ -8,18 +8,18 @@ use rsa::{
 use sha2::Sha256;
 use uuid::Uuid;
 
-#[derive(Debug, Clone, McBuf)]
+#[derive(Debug, Clone, AzBuf)]
 pub struct SaltSignaturePair {
     pub salt: u64,
     pub signature: Vec<u8>,
 }
 
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct MessageSignature {
     pub bytes: [u8; 256],
 }
 
-#[derive(Clone, Debug, McBuf, PartialEq)]
+#[derive(Clone, Debug, AzBuf, PartialEq)]
 pub struct SignedMessageHeader {
     pub previous_signature: Option<MessageSignature>,
     pub sender: Uuid,
@@ -51,17 +51,17 @@ pub struct SignChatMessageOptions {
 pub fn sign_chat_message(opts: &SignChatMessageOptions) -> MessageSignature {
     let mut data_to_sign = Vec::new();
     // always 1 for some reason
-    1i32.write_into(&mut data_to_sign).unwrap();
+    1i32.azalea_write(&mut data_to_sign).unwrap();
     // player uuid
-    opts.account_uuid.write_into(&mut data_to_sign).unwrap();
+    opts.account_uuid.azalea_write(&mut data_to_sign).unwrap();
     // chat session uuid
     opts.chat_session_uuid
-        .write_into(&mut data_to_sign)
+        .azalea_write(&mut data_to_sign)
         .unwrap();
     // message index
-    opts.message_index.write_into(&mut data_to_sign).unwrap();
+    opts.message_index.azalea_write(&mut data_to_sign).unwrap();
     // salt
-    opts.salt.write_into(&mut data_to_sign).unwrap();
+    opts.salt.azalea_write(&mut data_to_sign).unwrap();
 
     // timestamp as seconds
     let seconds_since_epoch = opts
@@ -69,16 +69,16 @@ pub fn sign_chat_message(opts: &SignChatMessageOptions) -> MessageSignature {
         .duration_since(UNIX_EPOCH)
         .expect("timestamp must be after epoch")
         .as_secs();
-    seconds_since_epoch.write_into(&mut data_to_sign).unwrap();
+    seconds_since_epoch.azalea_write(&mut data_to_sign).unwrap();
 
     // message length as u32
     let message_len: u32 = opts.message.len().try_into().unwrap();
-    message_len.write_into(&mut data_to_sign).unwrap();
+    message_len.azalea_write(&mut data_to_sign).unwrap();
     // message bytes
     data_to_sign.extend_from_slice(opts.message.as_bytes());
 
     // last seen messages length
-    0i32.write_into(&mut data_to_sign).unwrap();
+    0i32.azalea_write(&mut data_to_sign).unwrap();
     // signatures of last seen messages
     // ... not implemented yet
 
diff --git a/azalea-entity/Cargo.toml b/azalea-entity/Cargo.toml
index 2f2948574..14068d206 100644
--- a/azalea-entity/Cargo.toml
+++ b/azalea-entity/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "azalea-entity"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 edition = "2021"
 description = "Things related to Minecraft entities used by Azalea"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-entity"
@@ -11,7 +11,9 @@ license = "MIT"
 [dependencies]
 azalea-block = { version = "0.10.0", path = "../azalea-block" }
 azalea-buf = { version = "0.10.0", path = "../azalea-buf" }
-azalea-chat = { version = "0.10.0", path = "../azalea-chat", features = ["azalea-buf"] }
+azalea-chat = { version = "0.10.0", path = "../azalea-chat", features = [
+    "azalea-buf",
+] }
 azalea-core = { version = "0.10.0", path = "../azalea-core" }
 azalea-inventory = { version = "0.10.0", path = "../azalea-inventory" }
 azalea-registry = { version = "0.10.0", path = "../azalea-registry" }
diff --git a/azalea-entity/src/attributes.rs b/azalea-entity/src/attributes.rs
index ddafaec36..797ea43c4 100644
--- a/azalea-entity/src/attributes.rs
+++ b/azalea-entity/src/attributes.rs
@@ -2,7 +2,7 @@
 
 use std::collections::{hash_map, HashMap};
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use bevy_ecs::component::Component;
 use thiserror::Error;
@@ -71,14 +71,14 @@ impl AttributeInstance {
     }
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct AttributeModifier {
     pub id: ResourceLocation,
     pub amount: f64,
     pub operation: AttributeModifierOperation,
 }
 
-#[derive(Clone, Debug, Copy, McBuf)]
+#[derive(Clone, Debug, Copy, AzBuf)]
 pub enum AttributeModifierOperation {
     Addition,
     MultiplyBase,
diff --git a/azalea-entity/src/data.rs b/azalea-entity/src/data.rs
index 050302cad..084fd26e5 100755
--- a/azalea-entity/src/data.rs
+++ b/azalea-entity/src/data.rs
@@ -2,15 +2,13 @@
 
 use std::io::{Cursor, Write};
 
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_chat::FormattedText;
 use azalea_core::{
     direction::Direction,
     position::{BlockPos, GlobalPos, Vec3},
 };
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use bevy_ecs::component::Component;
 use derive_more::Deref;
 use enum_as_inner::EnumAsInner;
@@ -29,35 +27,35 @@ pub struct EntityDataItem {
     pub value: EntityDataValue,
 }
 
-impl McBufReadable for EntityMetadataItems {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for EntityMetadataItems {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         let mut metadata = Vec::new();
         loop {
-            let id = u8::read_from(buf)?;
+            let id = u8::azalea_read(buf)?;
             if id == 0xff {
                 break;
             }
-            let value = EntityDataValue::read_from(buf)?;
+            let value = EntityDataValue::azalea_read(buf)?;
             metadata.push(EntityDataItem { index: id, value });
         }
         Ok(EntityMetadataItems(metadata))
     }
 }
 
-impl McBufWritable for EntityMetadataItems {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for EntityMetadataItems {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         for item in &self.0 {
-            item.index.write_into(buf)?;
-            item.value.write_into(buf)?;
+            item.index.azalea_write(buf)?;
+            item.value.azalea_write(buf)?;
         }
-        0xffu8.write_into(buf)?;
+        0xffu8.azalea_write(buf)?;
         Ok(())
     }
 }
 
 // Note: This enum is partially generated and parsed by
 // codegen/lib/code/entity.py
-#[derive(Clone, Debug, EnumAsInner, McBuf)]
+#[derive(Clone, Debug, EnumAsInner, AzBuf)]
 pub enum EntityDataValue {
     Byte(u8),
     Int(#[var] i32),
@@ -66,7 +64,7 @@ pub enum EntityDataValue {
     String(String),
     FormattedText(FormattedText),
     OptionalFormattedText(Option<FormattedText>),
-    ItemStack(ItemSlot),
+    ItemStack(ItemStack),
     Boolean(bool),
     Rotations(Rotations),
     BlockPos(BlockPos),
@@ -97,7 +95,7 @@ pub enum EntityDataValue {
 #[derive(Clone, Debug)]
 pub struct OptionalUnsignedInt(pub Option<u32>);
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct Quaternion {
     pub x: f32,
     pub y: f32,
@@ -107,7 +105,7 @@ pub struct Quaternion {
 
 // mojang just calls this ArmadilloState but i added "Kind" since otherwise it
 // collides with a name in metadata.rs
-#[derive(Clone, Debug, Copy, Default, McBuf)]
+#[derive(Clone, Debug, Copy, Default, AzBuf)]
 pub enum ArmadilloStateKind {
     #[default]
     Idle,
@@ -115,9 +113,9 @@ pub enum ArmadilloStateKind {
     Scared,
 }
 
-impl McBufReadable for OptionalUnsignedInt {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let val = u32::var_read_from(buf)?;
+impl AzaleaRead for OptionalUnsignedInt {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let val = u32::azalea_read_var(buf)?;
         Ok(OptionalUnsignedInt(if val == 0 {
             None
         } else {
@@ -125,24 +123,24 @@ impl McBufReadable for OptionalUnsignedInt {
         }))
     }
 }
-impl McBufWritable for OptionalUnsignedInt {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for OptionalUnsignedInt {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self.0 {
-            Some(val) => (val + 1).var_write_into(buf),
-            None => 0u32.var_write_into(buf),
+            Some(val) => (val + 1).azalea_write_var(buf),
+            None => 0u32.azalea_write_var(buf),
         }
     }
 }
 
 /// A set of x, y, and z rotations. This is used for armor stands.
-#[derive(Clone, Debug, McBuf, Default)]
+#[derive(Clone, Debug, AzBuf, Default)]
 pub struct Rotations {
     pub x: f32,
     pub y: f32,
     pub z: f32,
 }
 
-#[derive(Clone, Debug, Copy, McBuf, Default, Component, Eq, PartialEq)]
+#[derive(Clone, Debug, Copy, AzBuf, Default, Component, Eq, PartialEq)]
 pub enum Pose {
     #[default]
     Standing = 0,
@@ -155,7 +153,7 @@ pub enum Pose {
     Dying,
 }
 
-#[derive(Debug, Clone, McBuf)]
+#[derive(Debug, Clone, AzBuf)]
 pub struct VillagerData {
     pub kind: azalea_registry::VillagerKind,
     pub profession: azalea_registry::VillagerProfession,
@@ -163,7 +161,7 @@ pub struct VillagerData {
     pub level: u32,
 }
 
-#[derive(Debug, Copy, Clone, McBuf, Default)]
+#[derive(Debug, Copy, Clone, AzBuf, Default)]
 pub enum SnifferState {
     #[default]
     Idling,
diff --git a/azalea-entity/src/metadata.rs b/azalea-entity/src/metadata.rs
index 2a6f996ed..4054bfb3c 100644
--- a/azalea-entity/src/metadata.rs
+++ b/azalea-entity/src/metadata.rs
@@ -8,7 +8,7 @@ use azalea_core::{
     direction::Direction,
     position::{BlockPos, Vec3},
 };
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use bevy_ecs::{bundle::Bundle, component::Component};
 use derive_more::{Deref, DerefMut};
 use thiserror::Error;
@@ -3301,7 +3301,7 @@ impl Default for DrownedMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct EggItemStack(pub ItemSlot);
+pub struct EggItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct Egg;
 impl Egg {
@@ -3558,7 +3558,7 @@ impl Default for EnderDragonMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct EnderPearlItemStack(pub ItemSlot);
+pub struct EnderPearlItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct EnderPearl;
 impl EnderPearl {
@@ -3894,7 +3894,7 @@ impl Default for EvokerFangsMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct ExperienceBottleItemStack(pub ItemSlot);
+pub struct ExperienceBottleItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct ExperienceBottle;
 impl ExperienceBottle {
@@ -3991,7 +3991,7 @@ impl Default for ExperienceOrbMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct EyeOfEnderItemStack(pub ItemSlot);
+pub struct EyeOfEnderItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct EyeOfEnder;
 impl EyeOfEnder {
@@ -4095,7 +4095,7 @@ impl Default for FallingBlockMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct FireballItemStack(pub ItemSlot);
+pub struct FireballItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct Fireball;
 impl Fireball {
@@ -4147,7 +4147,7 @@ impl Default for FireballMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct FireworksItem(pub ItemSlot);
+pub struct FireworksItem(pub ItemStack);
 #[derive(Component, Deref, DerefMut, Clone)]
 pub struct AttachedToTarget(pub OptionalUnsignedInt);
 #[derive(Component, Deref, DerefMut, Clone)]
@@ -4682,7 +4682,7 @@ impl Default for GiantMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct ItemFrameItem(pub ItemSlot);
+pub struct ItemFrameItem(pub ItemStack);
 #[derive(Component, Deref, DerefMut, Clone)]
 pub struct Rotation(pub i32);
 #[derive(Component)]
@@ -4728,7 +4728,7 @@ impl Default for GlowItemFrameMetadataBundle {
                     pose: Pose::default(),
                     ticks_frozen: TicksFrozen(Default::default()),
                 },
-                item_frame_item: ItemFrameItem(ItemSlot::Empty),
+                item_frame_item: ItemFrameItem(ItemStack::Empty),
                 rotation: Rotation(0),
             },
         }
@@ -5521,7 +5521,7 @@ impl Default for IronGolemMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct ItemItem(pub ItemSlot);
+pub struct ItemItem(pub ItemStack);
 #[derive(Component)]
 pub struct Item;
 impl Item {
@@ -5567,7 +5567,7 @@ impl Default for ItemMetadataBundle {
                 pose: Pose::default(),
                 ticks_frozen: TicksFrozen(Default::default()),
             },
-            item_item: ItemItem(ItemSlot::Empty),
+            item_item: ItemItem(ItemStack::Empty),
         }
     }
 }
@@ -5603,7 +5603,7 @@ pub struct ItemDisplayHeight(pub f32);
 #[derive(Component, Deref, DerefMut, Clone)]
 pub struct ItemDisplayGlowColorOverride(pub i32);
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct ItemDisplayItemStack(pub ItemSlot);
+pub struct ItemDisplayItemStack(pub ItemStack);
 #[derive(Component, Deref, DerefMut, Clone)]
 pub struct ItemDisplayItemDisplay(pub u8);
 #[derive(Component)]
@@ -5758,7 +5758,7 @@ impl Default for ItemDisplayMetadataBundle {
             item_display_width: ItemDisplayWidth(0.0),
             item_display_height: ItemDisplayHeight(0.0),
             item_display_glow_color_override: ItemDisplayGlowColorOverride(-1),
-            item_display_item_stack: ItemDisplayItemStack(ItemSlot::Empty),
+            item_display_item_stack: ItemDisplayItemStack(ItemStack::Empty),
             item_display_item_display: ItemDisplayItemDisplay(Default::default()),
         }
     }
@@ -5813,7 +5813,7 @@ impl Default for ItemFrameMetadataBundle {
                 pose: Pose::default(),
                 ticks_frozen: TicksFrozen(Default::default()),
             },
-            item_frame_item: ItemFrameItem(ItemSlot::Empty),
+            item_frame_item: ItemFrameItem(ItemStack::Empty),
             rotation: Rotation(0),
         }
     }
@@ -7033,7 +7033,7 @@ impl Default for OcelotMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct OminousItemSpawnerItem(pub ItemSlot);
+pub struct OminousItemSpawnerItem(pub ItemStack);
 #[derive(Component)]
 pub struct OminousItemSpawner;
 impl OminousItemSpawner {
@@ -7079,7 +7079,7 @@ impl Default for OminousItemSpawnerMetadataBundle {
                 pose: Pose::default(),
                 ticks_frozen: TicksFrozen(Default::default()),
             },
-            ominous_item_spawner_item: OminousItemSpawnerItem(ItemSlot::Empty),
+            ominous_item_spawner_item: OminousItemSpawnerItem(ItemStack::Empty),
         }
     }
 }
@@ -8111,7 +8111,7 @@ impl Default for PolarBearMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct PotionItemStack(pub ItemSlot);
+pub struct PotionItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct Potion;
 impl Potion {
@@ -8996,7 +8996,7 @@ impl Default for SlimeMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct SmallFireballItemStack(pub ItemSlot);
+pub struct SmallFireballItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct SmallFireball;
 impl SmallFireball {
@@ -9207,7 +9207,7 @@ impl Default for SnowGolemMetadataBundle {
 }
 
 #[derive(Component, Deref, DerefMut, Clone)]
-pub struct SnowballItemStack(pub ItemSlot);
+pub struct SnowballItemStack(pub ItemStack);
 #[derive(Component)]
 pub struct Snowball;
 impl Snowball {
diff --git a/azalea-entity/src/particle.rs b/azalea-entity/src/particle.rs
index 6484b28f5..fa948f858 100755
--- a/azalea-entity/src/particle.rs
+++ b/azalea-entity/src/particle.rs
@@ -1,13 +1,13 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use azalea_registry::ParticleKind;
 use bevy_ecs::component::Component;
 
-// the order of this enum must be kept in-sync with ParticleKind, otherwise
+// the order of this enum must be kept in sync with ParticleKind, otherwise
 // we get errors parsing particles.
 /// A [`ParticleKind`] with data potentially attached to it.
-#[derive(Component, Clone, Debug, McBuf, Default)]
+#[derive(Component, Clone, Debug, AzBuf, Default)]
 pub enum Particle {
     AngryVillager,
     Block(BlockParticle),
@@ -44,6 +44,7 @@ pub enum Particle {
     Flame,
     Infested,
     CherryLeaves,
+    PaleOakLeaves,
     SculkSoul,
     SculkCharge(SculkChargeParticle),
     SculkChargePop,
@@ -128,7 +129,7 @@ impl From<ParticleKind> for Particle {
     /// attached (like block particles), then it's set to the default.
     fn from(kind: ParticleKind) -> Self {
         // this is mostly just here so it fails to compile when a new particle is added
-        // to ParticleKind, since ParticleData has to be updated manually
+        // to ParticleKind, since `Particle` has to be updated manually
         match kind {
             ParticleKind::AngryVillager => Self::AngryVillager,
             ParticleKind::Block => Self::Block(BlockParticle::default()),
@@ -247,12 +248,12 @@ impl From<ParticleKind> for Particle {
     }
 }
 
-#[derive(Debug, Clone, McBuf, Default)]
+#[derive(Debug, Clone, AzBuf, Default)]
 pub struct BlockParticle {
     #[var]
     pub block_state: i32,
 }
-#[derive(Debug, Clone, McBuf, Default)]
+#[derive(Debug, Clone, AzBuf, Default)]
 pub struct DustParticle {
     /// Red value, 0-1
     pub red: f32,
@@ -264,7 +265,7 @@ pub struct DustParticle {
     pub scale: f32,
 }
 
-#[derive(Debug, Clone, McBuf, Default)]
+#[derive(Debug, Clone, AzBuf, Default)]
 pub struct DustColorTransitionParticle {
     /// Red value, 0-1
     pub from_red: f32,
@@ -282,12 +283,12 @@ pub struct DustColorTransitionParticle {
     pub to_blue: f32,
 }
 
-#[derive(Debug, Clone, McBuf, Default)]
+#[derive(Debug, Clone, AzBuf, Default)]
 pub struct ItemParticle {
-    pub item: ItemSlot,
+    pub item: ItemStack,
 }
 
-#[derive(Debug, Clone, McBuf, Default)]
+#[derive(Debug, Clone, AzBuf, Default)]
 pub struct VibrationParticle {
     pub origin: BlockPos,
     pub position_type: String,
@@ -298,12 +299,12 @@ pub struct VibrationParticle {
     pub ticks: u32,
 }
 
-#[derive(Debug, Clone, McBuf, Default)]
+#[derive(Debug, Clone, AzBuf, Default)]
 pub struct SculkChargeParticle {
     pub roll: f32,
 }
 
-#[derive(Debug, Clone, McBuf, Default)]
+#[derive(Debug, Clone, AzBuf, Default)]
 pub struct ShriekParticle {
     #[var]
     pub delay: i32, // The time in ticks before the particle is displayed
diff --git a/azalea-inventory/Cargo.toml b/azalea-inventory/Cargo.toml
index 816df100d..5633c6dd0 100644
--- a/azalea-inventory/Cargo.toml
+++ b/azalea-inventory/Cargo.toml
@@ -4,13 +4,15 @@ edition = "2021"
 license = "MIT"
 name = "azalea-inventory"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-inventory-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
 azalea-buf = { version = "0.10.0", path = "../azalea-buf" }
-azalea-chat = { version = "0.10.0", path = "../azalea-chat", features = ["azalea-buf"] }
+azalea-chat = { version = "0.10.0", path = "../azalea-chat", features = [
+    "azalea-buf",
+] }
 azalea-core = { version = "0.10.0", path = "../azalea-core" }
 azalea-inventory-macros = { version = "0.10.0", path = "./azalea-inventory-macros" }
 azalea-registry = { version = "0.10.0", path = "../azalea-registry" }
diff --git a/azalea-inventory/azalea-inventory-macros/Cargo.toml b/azalea-inventory/azalea-inventory-macros/Cargo.toml
index c55729ee8..92b17e978 100644
--- a/azalea-inventory/azalea-inventory-macros/Cargo.toml
+++ b/azalea-inventory/azalea-inventory-macros/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-inventory-macros"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-inventory/azalea-inventory-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 [lib]
 proc-macro = true
diff --git a/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs b/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs
index 2b31f86c8..f2236ded0 100644
--- a/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs
+++ b/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs
@@ -34,11 +34,11 @@ pub fn generate(input: &DeclareMenus) -> TokenStream {
 }
 
 /// Player {
-///     craft_result: ItemSlot,
-///     craft: [ItemSlot; 4],
-///     armor: [ItemSlot; 4],
-///     inventory: [ItemSlot; 36],
-///     offhand: ItemSlot,
+///     craft_result: ItemStack,
+///     craft: [ItemStack; 4],
+///     armor: [ItemStack; 4],
+///     inventory: [ItemStack; 36],
+///     offhand: ItemStack,
 /// },
 fn generate_variant_for_menu(menu: &Menu) -> TokenStream {
     let name = &menu.name;
@@ -56,7 +56,7 @@ fn generate_fields(fields: &[Field], public: bool) -> TokenStream {
     for field in fields {
         let field_length = field.length;
         let field_type = if field.length == 1 {
-            quote! { ItemSlot }
+            quote! { ItemStack }
         } else {
             quote! { SlotList<#field_length> }
         };
diff --git a/azalea-inventory/azalea-inventory-macros/src/menu_impl.rs b/azalea-inventory/azalea-inventory-macros/src/menu_impl.rs
index f3cc5d5ce..4840f84c5 100644
--- a/azalea-inventory/azalea-inventory-macros/src/menu_impl.rs
+++ b/azalea-inventory/azalea-inventory-macros/src/menu_impl.rs
@@ -95,11 +95,11 @@ pub fn generate(input: &DeclareMenus) -> TokenStream {
         impl Menu {
             #menu_consts
 
-            /// Get a mutable reference to the [`ItemSlot`] at the given protocol index.
+            /// Get a mutable reference to the [`ItemStack`] at the given protocol index.
             ///
             /// If you're trying to get an item in a menu without caring about
             /// protocol indexes, you should just `match` it and index the
-            /// [`ItemSlot`] you get.
+            /// [`ItemStack`] you get.
             ///
             /// Use [`Menu::slot`] if you don't need a mutable reference to the slot.
             ///
@@ -107,24 +107,24 @@ pub fn generate(input: &DeclareMenus) -> TokenStream {
             ///
             /// Returns `None` if the index is out of bounds.
             #[inline]
-            pub fn slot_mut(&mut self, i: usize) -> Option<&mut ItemSlot> {
+            pub fn slot_mut(&mut self, i: usize) -> Option<&mut ItemStack> {
                 Some(match self {
                     #slot_mut_match_variants
                 })
             }
 
-            /// Get a reference to the [`ItemSlot`] at the given protocol index.
+            /// Get a reference to the [`ItemStack`] at the given protocol index.
             ///
             /// If you're trying to get an item in a menu without caring about
             /// protocol indexes, you should just `match` it and index the
-            /// [`ItemSlot`] you get.
+            /// [`ItemStack`] you get.
             ///
             /// Use [`Menu::slot_mut`] if you need a mutable reference to the slot.
             ///
             /// # Errors
             ///
             /// Returns `None` if the index is out of bounds.
-            pub fn slot(&self, i: usize) -> Option<&ItemSlot> {
+            pub fn slot(&self, i: usize) -> Option<&ItemStack> {
                 Some(match self {
                     #slot_match_variants
                 })
@@ -153,7 +153,7 @@ pub fn generate(input: &DeclareMenus) -> TokenStream {
             ///
             /// If you *only* want to include the players inventory, then you can filter by only
             /// using the slots in [`Self::player_slots_range`].
-            pub fn slots(&self) -> Vec<ItemSlot> {
+            pub fn slots(&self) -> Vec<ItemStack> {
                 match self {
                     #slots_match_variants
                 }
@@ -162,7 +162,7 @@ pub fn generate(input: &DeclareMenus) -> TokenStream {
             /// Return the contents of the menu, not including the player's inventory.
             ///
             /// If you want to include the player's inventory, use [`Menu::slots`] instead.
-            pub fn contents(&self) -> Vec<ItemSlot> {
+            pub fn contents(&self) -> Vec<ItemStack> {
                 match self {
                     #contents_match_variants
                 }
diff --git a/azalea-inventory/src/components.rs b/azalea-inventory/src/components.rs
index d7adf2c90..10b00b360 100644
--- a/azalea-inventory/src/components.rs
+++ b/azalea-inventory/src/components.rs
@@ -1,7 +1,7 @@
 use core::f64;
 use std::{any::Any, collections::HashMap, io::Cursor};
 
-use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError};
 use azalea_chat::FormattedText;
 use azalea_core::{position::GlobalPos, resource_location::ResourceLocation};
 use azalea_registry::{
@@ -11,7 +11,7 @@ use azalea_registry::{
 use simdnbt::owned::{Nbt, NbtCompound};
 use uuid::Uuid;
 
-use crate::ItemSlot;
+use crate::ItemStack;
 
 pub trait DataComponent: Send + Sync + Any {}
 
@@ -26,10 +26,10 @@ pub trait EncodableDataComponent: Send + Sync + Any {
 
 impl<T> EncodableDataComponent for T
 where
-    T: DataComponent + Clone + McBufWritable + McBufReadable + PartialEq,
+    T: DataComponent + Clone + AzaleaWrite + AzaleaRead + PartialEq,
 {
     fn encode(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
-        self.write_into(buf)
+        self.azalea_write(buf)
     }
     fn clone(&self) -> Box<dyn EncodableDataComponent> {
         let cloned = self.clone();
@@ -54,105 +54,107 @@ pub fn from_kind(
 
     // note that this match statement is updated by genitemcomponents.py
     Ok(match kind {
-        DataComponentKind::CustomData => Box::new(CustomData::read_from(buf)?),
-        DataComponentKind::MaxStackSize => Box::new(MaxStackSize::read_from(buf)?),
-        DataComponentKind::MaxDamage => Box::new(MaxDamage::read_from(buf)?),
-        DataComponentKind::Damage => Box::new(Damage::read_from(buf)?),
-        DataComponentKind::Unbreakable => Box::new(Unbreakable::read_from(buf)?),
-        DataComponentKind::CustomName => Box::new(CustomName::read_from(buf)?),
-        DataComponentKind::ItemName => Box::new(ItemName::read_from(buf)?),
-        DataComponentKind::Lore => Box::new(Lore::read_from(buf)?),
-        DataComponentKind::Rarity => Box::new(Rarity::read_from(buf)?),
-        DataComponentKind::Enchantments => Box::new(Enchantments::read_from(buf)?),
-        DataComponentKind::CanPlaceOn => Box::new(CanPlaceOn::read_from(buf)?),
-        DataComponentKind::CanBreak => Box::new(CanBreak::read_from(buf)?),
-        DataComponentKind::AttributeModifiers => Box::new(AttributeModifiers::read_from(buf)?),
-        DataComponentKind::CustomModelData => Box::new(CustomModelData::read_from(buf)?),
+        DataComponentKind::CustomData => Box::new(CustomData::azalea_read(buf)?),
+        DataComponentKind::MaxStackSize => Box::new(MaxStackSize::azalea_read(buf)?),
+        DataComponentKind::MaxDamage => Box::new(MaxDamage::azalea_read(buf)?),
+        DataComponentKind::Damage => Box::new(Damage::azalea_read(buf)?),
+        DataComponentKind::Unbreakable => Box::new(Unbreakable::azalea_read(buf)?),
+        DataComponentKind::CustomName => Box::new(CustomName::azalea_read(buf)?),
+        DataComponentKind::ItemName => Box::new(ItemName::azalea_read(buf)?),
+        DataComponentKind::Lore => Box::new(Lore::azalea_read(buf)?),
+        DataComponentKind::Rarity => Box::new(Rarity::azalea_read(buf)?),
+        DataComponentKind::Enchantments => Box::new(Enchantments::azalea_read(buf)?),
+        DataComponentKind::CanPlaceOn => Box::new(CanPlaceOn::azalea_read(buf)?),
+        DataComponentKind::CanBreak => Box::new(CanBreak::azalea_read(buf)?),
+        DataComponentKind::AttributeModifiers => Box::new(AttributeModifiers::azalea_read(buf)?),
+        DataComponentKind::CustomModelData => Box::new(CustomModelData::azalea_read(buf)?),
         DataComponentKind::HideAdditionalTooltip => {
-            Box::new(HideAdditionalTooltip::read_from(buf)?)
+            Box::new(HideAdditionalTooltip::azalea_read(buf)?)
         }
-        DataComponentKind::HideTooltip => Box::new(HideTooltip::read_from(buf)?),
-        DataComponentKind::RepairCost => Box::new(RepairCost::read_from(buf)?),
-        DataComponentKind::CreativeSlotLock => Box::new(CreativeSlotLock::read_from(buf)?),
+        DataComponentKind::HideTooltip => Box::new(HideTooltip::azalea_read(buf)?),
+        DataComponentKind::RepairCost => Box::new(RepairCost::azalea_read(buf)?),
+        DataComponentKind::CreativeSlotLock => Box::new(CreativeSlotLock::azalea_read(buf)?),
         DataComponentKind::EnchantmentGlintOverride => {
-            Box::new(EnchantmentGlintOverride::read_from(buf)?)
+            Box::new(EnchantmentGlintOverride::azalea_read(buf)?)
         }
-        DataComponentKind::IntangibleProjectile => Box::new(IntangibleProjectile::read_from(buf)?),
-        DataComponentKind::Food => Box::new(Food::read_from(buf)?),
-        DataComponentKind::Tool => Box::new(Tool::read_from(buf)?),
-        DataComponentKind::StoredEnchantments => Box::new(StoredEnchantments::read_from(buf)?),
-        DataComponentKind::DyedColor => Box::new(DyedColor::read_from(buf)?),
-        DataComponentKind::MapColor => Box::new(MapColor::read_from(buf)?),
-        DataComponentKind::MapId => Box::new(MapId::read_from(buf)?),
-        DataComponentKind::MapDecorations => Box::new(MapDecorations::read_from(buf)?),
-        DataComponentKind::MapPostProcessing => Box::new(MapPostProcessing::read_from(buf)?),
-        DataComponentKind::ChargedProjectiles => Box::new(ChargedProjectiles::read_from(buf)?),
-        DataComponentKind::BundleContents => Box::new(BundleContents::read_from(buf)?),
-        DataComponentKind::PotionContents => Box::new(PotionContents::read_from(buf)?),
+        DataComponentKind::IntangibleProjectile => {
+            Box::new(IntangibleProjectile::azalea_read(buf)?)
+        }
+        DataComponentKind::Food => Box::new(Food::azalea_read(buf)?),
+        DataComponentKind::Tool => Box::new(Tool::azalea_read(buf)?),
+        DataComponentKind::StoredEnchantments => Box::new(StoredEnchantments::azalea_read(buf)?),
+        DataComponentKind::DyedColor => Box::new(DyedColor::azalea_read(buf)?),
+        DataComponentKind::MapColor => Box::new(MapColor::azalea_read(buf)?),
+        DataComponentKind::MapId => Box::new(MapId::azalea_read(buf)?),
+        DataComponentKind::MapDecorations => Box::new(MapDecorations::azalea_read(buf)?),
+        DataComponentKind::MapPostProcessing => Box::new(MapPostProcessing::azalea_read(buf)?),
+        DataComponentKind::ChargedProjectiles => Box::new(ChargedProjectiles::azalea_read(buf)?),
+        DataComponentKind::BundleContents => Box::new(BundleContents::azalea_read(buf)?),
+        DataComponentKind::PotionContents => Box::new(PotionContents::azalea_read(buf)?),
         DataComponentKind::SuspiciousStewEffects => {
-            Box::new(SuspiciousStewEffects::read_from(buf)?)
+            Box::new(SuspiciousStewEffects::azalea_read(buf)?)
         }
-        DataComponentKind::WritableBookContent => Box::new(WritableBookContent::read_from(buf)?),
-        DataComponentKind::WrittenBookContent => Box::new(WrittenBookContent::read_from(buf)?),
-        DataComponentKind::Trim => Box::new(Trim::read_from(buf)?),
-        DataComponentKind::DebugStickState => Box::new(DebugStickState::read_from(buf)?),
-        DataComponentKind::EntityData => Box::new(EntityData::read_from(buf)?),
-        DataComponentKind::BucketEntityData => Box::new(BucketEntityData::read_from(buf)?),
-        DataComponentKind::BlockEntityData => Box::new(BlockEntityData::read_from(buf)?),
-        DataComponentKind::Instrument => Box::new(Instrument::read_from(buf)?),
+        DataComponentKind::WritableBookContent => Box::new(WritableBookContent::azalea_read(buf)?),
+        DataComponentKind::WrittenBookContent => Box::new(WrittenBookContent::azalea_read(buf)?),
+        DataComponentKind::Trim => Box::new(Trim::azalea_read(buf)?),
+        DataComponentKind::DebugStickState => Box::new(DebugStickState::azalea_read(buf)?),
+        DataComponentKind::EntityData => Box::new(EntityData::azalea_read(buf)?),
+        DataComponentKind::BucketEntityData => Box::new(BucketEntityData::azalea_read(buf)?),
+        DataComponentKind::BlockEntityData => Box::new(BlockEntityData::azalea_read(buf)?),
+        DataComponentKind::Instrument => Box::new(Instrument::azalea_read(buf)?),
         DataComponentKind::OminousBottleAmplifier => {
-            Box::new(OminousBottleAmplifier::read_from(buf)?)
+            Box::new(OminousBottleAmplifier::azalea_read(buf)?)
         }
-        DataComponentKind::Recipes => Box::new(Recipes::read_from(buf)?),
-        DataComponentKind::LodestoneTracker => Box::new(LodestoneTracker::read_from(buf)?),
-        DataComponentKind::FireworkExplosion => Box::new(FireworkExplosion::read_from(buf)?),
-        DataComponentKind::Fireworks => Box::new(Fireworks::read_from(buf)?),
-        DataComponentKind::Profile => Box::new(Profile::read_from(buf)?),
-        DataComponentKind::NoteBlockSound => Box::new(NoteBlockSound::read_from(buf)?),
-        DataComponentKind::BannerPatterns => Box::new(BannerPatterns::read_from(buf)?),
-        DataComponentKind::BaseColor => Box::new(BaseColor::read_from(buf)?),
-        DataComponentKind::PotDecorations => Box::new(PotDecorations::read_from(buf)?),
-        DataComponentKind::Container => Box::new(Container::read_from(buf)?),
-        DataComponentKind::BlockState => Box::new(BlockState::read_from(buf)?),
-        DataComponentKind::Bees => Box::new(Bees::read_from(buf)?),
-        DataComponentKind::Lock => Box::new(Lock::read_from(buf)?),
-        DataComponentKind::ContainerLoot => Box::new(ContainerLoot::read_from(buf)?),
-        DataComponentKind::JukeboxPlayable => Box::new(JukeboxPlayable::read_from(buf)?),
-        DataComponentKind::Consumable => Box::new(Consumable::read_from(buf)?),
-        DataComponentKind::UseRemainder => Box::new(UseRemainder::read_from(buf)?),
-        DataComponentKind::UseCooldown => Box::new(UseCooldown::read_from(buf)?),
-        DataComponentKind::Enchantable => Box::new(Enchantable::read_from(buf)?),
-        DataComponentKind::Repairable => Box::new(Repairable::read_from(buf)?),
-        DataComponentKind::ItemModel => Box::new(ItemModel::read_from(buf)?),
-        DataComponentKind::DamageResistant => Box::new(DamageResistant::read_from(buf)?),
-        DataComponentKind::Equippable => Box::new(Equippable::read_from(buf)?),
-        DataComponentKind::Glider => Box::new(Glider::read_from(buf)?),
-        DataComponentKind::TooltipStyle => Box::new(TooltipStyle::read_from(buf)?),
-        DataComponentKind::DeathProtection => Box::new(DeathProtection::read_from(buf)?),
+        DataComponentKind::Recipes => Box::new(Recipes::azalea_read(buf)?),
+        DataComponentKind::LodestoneTracker => Box::new(LodestoneTracker::azalea_read(buf)?),
+        DataComponentKind::FireworkExplosion => Box::new(FireworkExplosion::azalea_read(buf)?),
+        DataComponentKind::Fireworks => Box::new(Fireworks::azalea_read(buf)?),
+        DataComponentKind::Profile => Box::new(Profile::azalea_read(buf)?),
+        DataComponentKind::NoteBlockSound => Box::new(NoteBlockSound::azalea_read(buf)?),
+        DataComponentKind::BannerPatterns => Box::new(BannerPatterns::azalea_read(buf)?),
+        DataComponentKind::BaseColor => Box::new(BaseColor::azalea_read(buf)?),
+        DataComponentKind::PotDecorations => Box::new(PotDecorations::azalea_read(buf)?),
+        DataComponentKind::Container => Box::new(Container::azalea_read(buf)?),
+        DataComponentKind::BlockState => Box::new(BlockState::azalea_read(buf)?),
+        DataComponentKind::Bees => Box::new(Bees::azalea_read(buf)?),
+        DataComponentKind::Lock => Box::new(Lock::azalea_read(buf)?),
+        DataComponentKind::ContainerLoot => Box::new(ContainerLoot::azalea_read(buf)?),
+        DataComponentKind::JukeboxPlayable => Box::new(JukeboxPlayable::azalea_read(buf)?),
+        DataComponentKind::Consumable => Box::new(Consumable::azalea_read(buf)?),
+        DataComponentKind::UseRemainder => Box::new(UseRemainder::azalea_read(buf)?),
+        DataComponentKind::UseCooldown => Box::new(UseCooldown::azalea_read(buf)?),
+        DataComponentKind::Enchantable => Box::new(Enchantable::azalea_read(buf)?),
+        DataComponentKind::Repairable => Box::new(Repairable::azalea_read(buf)?),
+        DataComponentKind::ItemModel => Box::new(ItemModel::azalea_read(buf)?),
+        DataComponentKind::DamageResistant => Box::new(DamageResistant::azalea_read(buf)?),
+        DataComponentKind::Equippable => Box::new(Equippable::azalea_read(buf)?),
+        DataComponentKind::Glider => Box::new(Glider::azalea_read(buf)?),
+        DataComponentKind::TooltipStyle => Box::new(TooltipStyle::azalea_read(buf)?),
+        DataComponentKind::DeathProtection => Box::new(DeathProtection::azalea_read(buf)?),
     })
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct CustomData {
     pub nbt: Nbt,
 }
 impl DataComponent for CustomData {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct MaxStackSize {
     #[var]
     pub count: i32,
 }
 impl DataComponent for MaxStackSize {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct MaxDamage {
     #[var]
     pub amount: i32,
 }
 impl DataComponent for MaxDamage {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Damage {
     #[var]
     pub amount: i32,
@@ -160,7 +162,7 @@ pub struct Damage {
 
 impl DataComponent for Damage {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Unbreakable {
     pub show_in_tooltip: bool,
 }
@@ -173,26 +175,26 @@ impl Default for Unbreakable {
     }
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct CustomName {
     pub name: FormattedText,
 }
 impl DataComponent for CustomName {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct ItemName {
     pub name: FormattedText,
 }
 impl DataComponent for ItemName {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Lore {
     pub lines: Vec<FormattedText>,
     // vanilla also has styled_lines here but it doesn't appear to be used for the protocol
 }
 impl DataComponent for Lore {}
 
-#[derive(Clone, PartialEq, Copy, McBuf)]
+#[derive(Clone, PartialEq, Copy, AzBuf)]
 pub enum Rarity {
     Common,
     Uncommon,
@@ -201,7 +203,7 @@ pub enum Rarity {
 }
 impl DataComponent for Rarity {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Enchantments {
     #[var]
     pub levels: HashMap<Enchantment, u32>,
@@ -209,7 +211,7 @@ pub struct Enchantments {
 }
 impl DataComponent for Enchantments {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub enum BlockStateValueMatcher {
     Exact {
         value: String,
@@ -220,38 +222,38 @@ pub enum BlockStateValueMatcher {
     },
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BlockStatePropertyMatcher {
     pub name: String,
     pub value_matcher: BlockStateValueMatcher,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BlockPredicate {
     pub blocks: Option<HolderSet<Block, ResourceLocation>>,
     pub properties: Option<Vec<BlockStatePropertyMatcher>>,
     pub nbt: Option<NbtCompound>,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct AdventureModePredicate {
     pub predicates: Vec<BlockPredicate>,
     pub show_in_tooltip: bool,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct CanPlaceOn {
     pub predicate: AdventureModePredicate,
 }
 impl DataComponent for CanPlaceOn {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct CanBreak {
     pub predicate: AdventureModePredicate,
 }
 impl DataComponent for CanBreak {}
 
-#[derive(Clone, Copy, PartialEq, McBuf)]
+#[derive(Clone, Copy, PartialEq, AzBuf)]
 pub enum EquipmentSlotGroup {
     Any,
     Mainhand,
@@ -265,7 +267,7 @@ pub enum EquipmentSlotGroup {
     Body,
 }
 
-#[derive(Clone, Copy, PartialEq, McBuf)]
+#[derive(Clone, Copy, PartialEq, AzBuf)]
 pub enum AttributeModifierOperation {
     Addition,
     MultiplyBase,
@@ -275,7 +277,7 @@ pub enum AttributeModifierOperation {
 // this is duplicated in azalea-entity, BUT the one there has a different
 // protocol format (and we can't use it anyways because it would cause a
 // circular dependency)
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct AttributeModifier {
     pub uuid: Uuid,
     pub name: String,
@@ -283,57 +285,57 @@ pub struct AttributeModifier {
     pub operation: AttributeModifierOperation,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct AttributeModifiersEntry {
     pub attribute: Attribute,
     pub modifier: AttributeModifier,
     pub slot: EquipmentSlotGroup,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct AttributeModifiers {
     pub modifiers: Vec<AttributeModifiersEntry>,
     pub show_in_tooltip: bool,
 }
 impl DataComponent for AttributeModifiers {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct CustomModelData {
     #[var]
     pub value: i32,
 }
 impl DataComponent for CustomModelData {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct HideAdditionalTooltip;
 impl DataComponent for HideAdditionalTooltip {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct HideTooltip;
 impl DataComponent for HideTooltip {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct RepairCost {
     #[var]
     pub cost: u32,
 }
 impl DataComponent for RepairCost {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct CreativeSlotLock;
 impl DataComponent for CreativeSlotLock {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct EnchantmentGlintOverride {
     pub show_glint: bool,
 }
 impl DataComponent for EnchantmentGlintOverride {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct IntangibleProjectile;
 impl DataComponent for IntangibleProjectile {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct MobEffectDetails {
     #[var]
     pub amplifier: i32,
@@ -345,19 +347,19 @@ pub struct MobEffectDetails {
     pub hidden_effect: Option<Box<MobEffectDetails>>,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct MobEffectInstance {
     pub effect: MobEffect,
     pub details: MobEffectDetails,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct PossibleEffect {
     pub effect: MobEffectInstance,
     pub probability: f32,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Food {
     #[var]
     pub nutrition: i32,
@@ -368,14 +370,14 @@ pub struct Food {
 }
 impl DataComponent for Food {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct ToolRule {
     pub blocks: HolderSet<Block, ResourceLocation>,
     pub speed: Option<f32>,
     pub correct_for_drops: Option<bool>,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Tool {
     pub rules: Vec<ToolRule>,
     pub default_mining_speed: f32,
@@ -384,7 +386,7 @@ pub struct Tool {
 }
 impl DataComponent for Tool {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct StoredEnchantments {
     #[var]
     pub enchantments: HashMap<Enchantment, i32>,
@@ -392,52 +394,52 @@ pub struct StoredEnchantments {
 }
 impl DataComponent for StoredEnchantments {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct DyedColor {
     pub rgb: i32,
     pub show_in_tooltip: bool,
 }
 impl DataComponent for DyedColor {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct MapColor {
     pub color: i32,
 }
 impl DataComponent for MapColor {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct MapId {
     #[var]
     pub id: i32,
 }
 impl DataComponent for MapId {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct MapDecorations {
     pub decorations: NbtCompound,
 }
 impl DataComponent for MapDecorations {}
 
-#[derive(Clone, Copy, PartialEq, McBuf)]
+#[derive(Clone, Copy, PartialEq, AzBuf)]
 pub enum MapPostProcessing {
     Lock,
     Scale,
 }
 impl DataComponent for MapPostProcessing {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct ChargedProjectiles {
-    pub items: Vec<ItemSlot>,
+    pub items: Vec<ItemStack>,
 }
 impl DataComponent for ChargedProjectiles {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BundleContents {
-    pub items: Vec<ItemSlot>,
+    pub items: Vec<ItemStack>,
 }
 impl DataComponent for BundleContents {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct PotionContents {
     pub potion: Option<Potion>,
     pub custom_color: Option<i32>,
@@ -445,26 +447,26 @@ pub struct PotionContents {
 }
 impl DataComponent for PotionContents {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct SuspiciousStewEffect {
     pub effect: MobEffect,
     #[var]
     pub duration: i32,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct SuspiciousStewEffects {
     pub effects: Vec<SuspiciousStewEffect>,
 }
 impl DataComponent for SuspiciousStewEffects {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct WritableBookContent {
     pub pages: Vec<String>,
 }
 impl DataComponent for WritableBookContent {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct WrittenBookContent {
     pub title: String,
     pub author: String,
@@ -475,7 +477,7 @@ pub struct WrittenBookContent {
 }
 impl DataComponent for WrittenBookContent {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Trim {
     pub material: TrimMaterial,
     pub pattern: TrimPattern,
@@ -483,57 +485,57 @@ pub struct Trim {
 }
 impl DataComponent for Trim {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct DebugStickState {
     pub properties: NbtCompound,
 }
 impl DataComponent for DebugStickState {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct EntityData {
     pub entity: NbtCompound,
 }
 impl DataComponent for EntityData {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BucketEntityData {
     pub entity: NbtCompound,
 }
 impl DataComponent for BucketEntityData {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BlockEntityData {
     pub entity: NbtCompound,
 }
 impl DataComponent for BlockEntityData {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Instrument {
     pub instrument: azalea_registry::Instrument,
 }
 impl DataComponent for Instrument {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct OminousBottleAmplifier {
     #[var]
     pub amplifier: i32,
 }
 impl DataComponent for OminousBottleAmplifier {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Recipes {
     pub recipes: Vec<ResourceLocation>,
 }
 impl DataComponent for Recipes {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct LodestoneTracker {
     pub target: Option<GlobalPos>,
     pub tracked: bool,
 }
 impl DataComponent for LodestoneTracker {}
 
-#[derive(Clone, Copy, PartialEq, McBuf)]
+#[derive(Clone, Copy, PartialEq, AzBuf)]
 pub enum FireworkExplosionShape {
     SmallBall,
     LargeBall,
@@ -542,7 +544,7 @@ pub enum FireworkExplosionShape {
     Burst,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct FireworkExplosion {
     pub shape: FireworkExplosionShape,
     pub colors: Vec<i32>,
@@ -552,7 +554,7 @@ pub struct FireworkExplosion {
 }
 impl DataComponent for FireworkExplosion {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Fireworks {
     #[var]
     pub flight_duration: i32,
@@ -560,14 +562,14 @@ pub struct Fireworks {
 }
 impl DataComponent for Fireworks {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct GameProfileProperty {
     pub name: String,
     pub value: String,
     pub signature: Option<String>,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Profile {
     pub name: String,
     pub id: Option<Uuid>,
@@ -575,13 +577,13 @@ pub struct Profile {
 }
 impl DataComponent for Profile {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct NoteBlockSound {
     pub sound: ResourceLocation,
 }
 impl DataComponent for NoteBlockSound {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BannerPattern {
     #[var]
     pub pattern: i32,
@@ -589,13 +591,13 @@ pub struct BannerPattern {
     pub color: i32,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BannerPatterns {
     pub patterns: Vec<BannerPattern>,
 }
 impl DataComponent for BannerPatterns {}
 
-#[derive(Clone, Copy, PartialEq, McBuf)]
+#[derive(Clone, Copy, PartialEq, AzBuf)]
 pub enum DyeColor {
     White,
     Orange,
@@ -615,31 +617,31 @@ pub enum DyeColor {
     Black,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BaseColor {
     pub color: DyeColor,
 }
 impl DataComponent for BaseColor {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct PotDecorations {
     pub items: Vec<Item>,
 }
 impl DataComponent for PotDecorations {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Container {
-    pub items: Vec<ItemSlot>,
+    pub items: Vec<ItemStack>,
 }
 impl DataComponent for Container {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BlockState {
     pub properties: HashMap<String, String>,
 }
 impl DataComponent for BlockState {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct BeehiveOccupant {
     pub entity_data: NbtCompound,
     #[var]
@@ -648,32 +650,32 @@ pub struct BeehiveOccupant {
     pub min_ticks_in_hive: i32,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Bees {
     pub occupants: Vec<BeehiveOccupant>,
 }
 impl DataComponent for Bees {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Lock {
     pub key: String,
 }
 impl DataComponent for Lock {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct ContainerLoot {
     pub loot: NbtCompound,
 }
 impl DataComponent for ContainerLoot {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct JukeboxPlayable {
     pub song: azalea_registry::JukeboxSong,
     pub show_in_tooltip: bool,
 }
 impl DataComponent for JukeboxPlayable {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Consumable {
     pub consume_seconds: f32,
     pub animation: ItemUseAnimation,
@@ -683,7 +685,7 @@ pub struct Consumable {
 }
 impl DataComponent for Consumable {}
 
-#[derive(Clone, Copy, PartialEq, McBuf)]
+#[derive(Clone, Copy, PartialEq, AzBuf)]
 pub enum ItemUseAnimation {
     None,
     Eat,
@@ -697,39 +699,39 @@ pub enum ItemUseAnimation {
     Brush,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct UseRemainder {
-    pub convert_into: ItemSlot,
+    pub convert_into: ItemStack,
 }
 impl DataComponent for UseRemainder {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct UseCooldown {
     pub seconds: f32,
     pub cooldown_group: Option<ResourceLocation>,
 }
 impl DataComponent for UseCooldown {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Enchantable {
     #[var]
     pub value: u32,
 }
 impl DataComponent for Enchantable {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Repairable {
     pub items: HolderSet<Item, ResourceLocation>,
 }
 impl DataComponent for Repairable {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct ItemModel {
     pub resource_location: ResourceLocation,
 }
 impl DataComponent for ItemModel {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct DamageResistant {
     // in the vanilla code this is
     // ```
@@ -743,7 +745,7 @@ pub struct DamageResistant {
 }
 impl DataComponent for DamageResistant {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Equippable {
     pub slot: EquipmentSlot,
     pub equip_sound: SoundEvent,
@@ -752,7 +754,7 @@ pub struct Equippable {
 }
 impl DataComponent for Equippable {}
 
-#[derive(Clone, Copy, Debug, PartialEq, McBuf)]
+#[derive(Clone, Copy, Debug, PartialEq, AzBuf)]
 pub enum EquipmentSlot {
     Mainhand,
     Offhand,
@@ -765,17 +767,17 @@ pub enum EquipmentSlot {
     Body,
 }
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct Glider;
 impl DataComponent for Glider {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct TooltipStyle {
     pub resource_location: ResourceLocation,
 }
 impl DataComponent for TooltipStyle {}
 
-#[derive(Clone, PartialEq, McBuf)]
+#[derive(Clone, PartialEq, AzBuf)]
 pub struct DeathProtection {
     pub death_effects: Vec<ConsumeEffectKind>,
 }
diff --git a/azalea-inventory/src/item/mod.rs b/azalea-inventory/src/item/mod.rs
index 862cd20e1..7f077c6a8 100644
--- a/azalea-inventory/src/item/mod.rs
+++ b/azalea-inventory/src/item/mod.rs
@@ -2,9 +2,9 @@ pub trait MaxStackSizeExt {
     /// Get the maximum stack size for this item.
     ///
     /// This is a signed integer to be consistent with the `count` field of
-    /// [`ItemSlotData`].
+    /// [`ItemStackData`].
     ///
-    /// [`ItemSlotData`]: crate::ItemSlotData
+    /// [`ItemStackData`]: crate::ItemStackData
     fn max_stack_size(&self) -> i32;
 
     /// Whether this item can be stacked with other items.
diff --git a/azalea-inventory/src/lib.rs b/azalea-inventory/src/lib.rs
index 930c1a5d9..3f9ba2376 100644
--- a/azalea-inventory/src/lib.rs
+++ b/azalea-inventory/src/lib.rs
@@ -9,17 +9,17 @@ mod slot;
 use std::ops::{Deref, DerefMut, RangeInclusive};
 
 use azalea_inventory_macros::declare_menus;
-pub use slot::{DataComponentPatch, ItemSlot, ItemSlotData};
+pub use slot::{DataComponentPatch, ItemStack, ItemStackData};
 
 // TODO: remove this here and in azalea-inventory-macros when rust makes
 // Default be implemented for all array sizes
 // https://github.com/rust-lang/rust/issues/61415
 
-/// A fixed-size list of [`ItemSlot`]s.
+/// A fixed-size list of [`ItemStack`]s.
 #[derive(Debug, Clone)]
-pub struct SlotList<const N: usize>([ItemSlot; N]);
+pub struct SlotList<const N: usize>([ItemStack; N]);
 impl<const N: usize> Deref for SlotList<N> {
-    type Target = [ItemSlot; N];
+    type Target = [ItemStack; N];
     fn deref(&self) -> &Self::Target {
         &self.0
     }
@@ -31,7 +31,7 @@ impl<const N: usize> DerefMut for SlotList<N> {
 }
 impl<const N: usize> Default for SlotList<N> {
     fn default() -> Self {
-        SlotList([(); N].map(|_| ItemSlot::Empty))
+        SlotList([(); N].map(|_| ItemStack::Empty))
     }
 }
 
diff --git a/azalea-inventory/src/operations.rs b/azalea-inventory/src/operations.rs
index 652d19004..0df7c794a 100644
--- a/azalea-inventory/src/operations.rs
+++ b/azalea-inventory/src/operations.rs
@@ -1,6 +1,6 @@
 use std::ops::RangeInclusive;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 
 use crate::{
     item::MaxStackSizeExt, AnvilMenuLocation, BeaconMenuLocation, BlastFurnaceMenuLocation,
@@ -8,7 +8,7 @@ use crate::{
     CraftingMenuLocation, EnchantmentMenuLocation, FurnaceMenuLocation, Generic3x3MenuLocation,
     Generic9x1MenuLocation, Generic9x2MenuLocation, Generic9x3MenuLocation, Generic9x4MenuLocation,
     Generic9x5MenuLocation, Generic9x6MenuLocation, GrindstoneMenuLocation, HopperMenuLocation,
-    ItemSlot, ItemSlotData, LecternMenuLocation, LoomMenuLocation, Menu, MenuLocation,
+    ItemStack, ItemStackData, LecternMenuLocation, LoomMenuLocation, Menu, MenuLocation,
     MerchantMenuLocation, Player, PlayerMenuLocation, ShulkerBoxMenuLocation, SmithingMenuLocation,
     SmokerMenuLocation, StonecutterMenuLocation,
 };
@@ -250,7 +250,7 @@ impl ClickOperation {
     }
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum ClickType {
     Pickup = 0,
     QuickMove = 1,
@@ -266,10 +266,10 @@ impl Menu {
     ///
     /// Keep in mind that this doesn't send any packets to the server, it just
     /// mutates this specific `Menu`.
-    pub fn quick_move_stack(&mut self, slot_index: usize) -> ItemSlot {
+    pub fn quick_move_stack(&mut self, slot_index: usize) -> ItemStack {
         let slot = self.slot(slot_index);
         if slot.is_none() {
-            return ItemSlot::Empty;
+            return ItemStack::Empty;
         };
 
         let slot_location = self
@@ -587,7 +587,7 @@ impl Menu {
             },
         }
 
-        ItemSlot::Empty
+        ItemStack::Empty
     }
 
     fn try_move_item_to_slots_or_toggle_hotbar(
@@ -610,7 +610,7 @@ impl Menu {
     /// Whether the given item could be placed in this menu.
     ///
     /// TODO: right now this always returns true
-    pub fn may_place(&self, _target_slot_index: usize, _item: &ItemSlotData) -> bool {
+    pub fn may_place(&self, _target_slot_index: usize, _item: &ItemStackData) -> bool {
         true
     }
 
@@ -662,14 +662,14 @@ impl Menu {
     /// slot is present and the same item.
     fn move_item_to_slot_if_stackable(
         &mut self,
-        item_slot: &mut ItemSlot,
+        item_slot: &mut ItemStack,
         target_slot_index: usize,
     ) {
-        let ItemSlot::Present(item) = item_slot else {
+        let ItemStack::Present(item) = item_slot else {
             return;
         };
         let target_slot = self.slot(target_slot_index).unwrap();
-        if let ItemSlot::Present(target_item) = target_slot {
+        if let ItemStack::Present(target_item) = target_slot {
             // the target slot is empty, so we can just move the item there
             if self.may_place(target_slot_index, item)
                 && target_item.is_same_item_and_components(item)
@@ -679,15 +679,15 @@ impl Menu {
 
                 // get the target slot again but mut this time so we can update it
                 let target_slot = self.slot_mut(target_slot_index).unwrap();
-                *target_slot = ItemSlot::Present(new_target_slot_data);
+                *target_slot = ItemStack::Present(new_target_slot_data);
 
                 item_slot.update_empty();
             }
         }
     }
 
-    fn move_item_to_slot_if_empty(&mut self, item_slot: &mut ItemSlot, target_slot_index: usize) {
-        let ItemSlot::Present(item) = item_slot else {
+    fn move_item_to_slot_if_empty(&mut self, item_slot: &mut ItemStack, target_slot_index: usize) {
+        let ItemStack::Present(item) = item_slot else {
             return;
         };
         let target_slot = self.slot(target_slot_index).unwrap();
@@ -696,7 +696,7 @@ impl Menu {
             let new_target_slot_data = item.split(u32::min(slot_item_limit, item.count as u32));
 
             let target_slot = self.slot_mut(target_slot_index).unwrap();
-            *target_slot = ItemSlot::Present(new_target_slot_data);
+            *target_slot = ItemStack::Present(new_target_slot_data);
             item_slot.update_empty();
         }
     }
diff --git a/azalea-inventory/src/slot.rs b/azalea-inventory/src/slot.rs
index 601c28e28..7d62bf69e 100644
--- a/azalea-inventory/src/slot.rs
+++ b/azalea-inventory/src/slot.rs
@@ -4,34 +4,34 @@ use std::{
     io::{Cursor, Write},
 };
 
-use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_registry::DataComponentKind;
 
 use crate::components::{self};
 
 /// Either an item in an inventory or nothing.
 #[derive(Debug, Clone, Default, PartialEq)]
-pub enum ItemSlot {
+pub enum ItemStack {
     #[default]
     Empty,
-    Present(ItemSlotData),
+    Present(ItemStackData),
 }
 
-impl ItemSlot {
-    /// Check if the slot is ItemSlot::Empty, if the count is <= 0, or if the
+impl ItemStack {
+    /// Check if the slot is ItemStack::Empty, if the count is <= 0, or if the
     /// item is air.
     ///
-    /// This is the opposite of [`ItemSlot::is_present`].
+    /// This is the opposite of [`ItemStack::is_present`].
     pub fn is_empty(&self) -> bool {
         match self {
-            ItemSlot::Empty => true,
-            ItemSlot::Present(item) => item.is_empty(),
+            ItemStack::Empty => true,
+            ItemStack::Present(item) => item.is_empty(),
         }
     }
-    /// Check if the slot is not ItemSlot::Empty, if the count is > 0, and if
+    /// Check if the slot is not ItemStack::Empty, if the count is > 0, and if
     /// the item is not air.
     ///
-    /// This is the opposite of [`ItemSlot::is_empty`].
+    /// This is the opposite of [`ItemStack::is_empty`].
     pub fn is_present(&self) -> bool {
         !self.is_empty()
     }
@@ -42,21 +42,21 @@ impl ItemSlot {
     /// slot is present.
     pub fn count(&self) -> i32 {
         match self {
-            ItemSlot::Empty => 0,
-            ItemSlot::Present(i) => i.count,
+            ItemStack::Empty => 0,
+            ItemStack::Present(i) => i.count,
         }
     }
 
     /// Remove `count` items from this slot, returning the removed items.
-    pub fn split(&mut self, count: u32) -> ItemSlot {
+    pub fn split(&mut self, count: u32) -> ItemStack {
         match self {
-            ItemSlot::Empty => ItemSlot::Empty,
-            ItemSlot::Present(i) => {
+            ItemStack::Empty => ItemStack::Empty,
+            ItemStack::Present(i) => {
                 let returning = i.split(count);
                 if i.is_empty() {
-                    *self = ItemSlot::Empty;
+                    *self = ItemStack::Empty;
                 }
-                ItemSlot::Present(returning)
+                ItemStack::Present(returning)
             }
         }
     }
@@ -65,33 +65,33 @@ impl ItemSlot {
     /// [`azalea_registry::Item::Air`]
     pub fn kind(&self) -> azalea_registry::Item {
         match self {
-            ItemSlot::Empty => azalea_registry::Item::Air,
-            ItemSlot::Present(i) => i.kind,
+            ItemStack::Empty => azalea_registry::Item::Air,
+            ItemStack::Present(i) => i.kind,
         }
     }
 
     /// Update whether this slot is empty, based on the count.
     pub fn update_empty(&mut self) {
-        if let ItemSlot::Present(i) = self {
+        if let ItemStack::Present(i) = self {
             if i.is_empty() {
-                *self = ItemSlot::Empty;
+                *self = ItemStack::Empty;
             }
         }
     }
 
-    /// Convert this slot into an [`ItemSlotData`], if it's present.
-    pub fn as_present(&self) -> Option<&ItemSlotData> {
+    /// Convert this slot into an [`ItemStackData`], if it's present.
+    pub fn as_present(&self) -> Option<&ItemStackData> {
         match self {
-            ItemSlot::Empty => None,
-            ItemSlot::Present(i) => Some(i),
+            ItemStack::Empty => None,
+            ItemStack::Present(i) => Some(i),
         }
     }
 }
 
-/// An item in an inventory, with a count and NBT. Usually you want [`ItemSlot`]
-/// or [`azalea_registry::Item`] instead.
+/// An item in an inventory, with a count and NBT. Usually you want
+/// [`ItemStack`] or [`azalea_registry::Item`] instead.
 #[derive(Debug, Clone, PartialEq)]
-pub struct ItemSlotData {
+pub struct ItemStackData {
     /// The amount of the item in this slot.
     ///
     /// The count can be zero or negative, but this is rare.
@@ -100,9 +100,9 @@ pub struct ItemSlotData {
     pub components: DataComponentPatch,
 }
 
-impl ItemSlotData {
+impl ItemStackData {
     /// Remove `count` items from this slot, returning the removed items.
-    pub fn split(&mut self, count: u32) -> ItemSlotData {
+    pub fn split(&mut self, count: u32) -> ItemStackData {
         let returning_count = i32::min(count as i32, self.count);
         let mut returning = self.clone();
         returning.count = returning_count;
@@ -118,14 +118,14 @@ impl ItemSlotData {
     /// Whether this item is the same as another item, ignoring the count.
     ///
     /// ```
-    /// # use azalea_inventory::ItemSlotData;
+    /// # use azalea_inventory::ItemStackData;
     /// # use azalea_registry::Item;
-    /// let mut a = ItemSlotData {
+    /// let mut a = ItemStackData {
     ///    kind: Item::Stone,
     ///    count: 1,
     ///    components: Default::default(),
     /// };
-    /// let mut b = ItemSlotData {
+    /// let mut b = ItemStackData {
     ///   kind: Item::Stone,
     ///   count: 2,
     ///   components: Default::default(),
@@ -135,20 +135,20 @@ impl ItemSlotData {
     /// b.kind = Item::Dirt;
     /// assert!(!a.is_same_item_and_components(&b));
     /// ```
-    pub fn is_same_item_and_components(&self, other: &ItemSlotData) -> bool {
+    pub fn is_same_item_and_components(&self, other: &ItemStackData) -> bool {
         self.kind == other.kind && self.components == other.components
     }
 }
 
-impl McBufReadable for ItemSlot {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let count = i32::var_read_from(buf)?;
+impl AzaleaRead for ItemStack {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let count = i32::azalea_read_var(buf)?;
         if count <= 0 {
-            Ok(ItemSlot::Empty)
+            Ok(ItemStack::Empty)
         } else {
-            let kind = azalea_registry::Item::read_from(buf)?;
-            let components = DataComponentPatch::read_from(buf)?;
-            Ok(ItemSlot::Present(ItemSlotData {
+            let kind = azalea_registry::Item::azalea_read(buf)?;
+            let components = DataComponentPatch::azalea_read(buf)?;
+            Ok(ItemStack::Present(ItemStackData {
                 count,
                 kind,
                 components,
@@ -157,14 +157,14 @@ impl McBufReadable for ItemSlot {
     }
 }
 
-impl McBufWritable for ItemSlot {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ItemStack {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
-            ItemSlot::Empty => 0.var_write_into(buf)?,
-            ItemSlot::Present(i) => {
-                i.count.var_write_into(buf)?;
-                i.kind.write_into(buf)?;
-                i.components.write_into(buf)?;
+            ItemStack::Empty => 0.azalea_write_var(buf)?,
+            ItemStack::Present(i) => {
+                i.count.azalea_write_var(buf)?;
+                i.kind.azalea_write(buf)?;
+                i.components.azalea_write(buf)?;
             }
         };
         Ok(())
@@ -182,10 +182,10 @@ impl DataComponentPatch {
     }
 }
 
-impl McBufReadable for DataComponentPatch {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let components_with_data_count = u32::var_read_from(buf)?;
-        let components_without_data_count = u32::var_read_from(buf)?;
+impl AzaleaRead for DataComponentPatch {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let components_with_data_count = u32::azalea_read_var(buf)?;
+        let components_without_data_count = u32::azalea_read_var(buf)?;
 
         if components_without_data_count == 0 && components_with_data_count == 0 {
             return Ok(DataComponentPatch::default());
@@ -193,13 +193,13 @@ impl McBufReadable for DataComponentPatch {
 
         let mut components = HashMap::new();
         for _ in 0..components_with_data_count {
-            let component_kind = DataComponentKind::read_from(buf)?;
+            let component_kind = DataComponentKind::azalea_read(buf)?;
             let component_data = components::from_kind(component_kind, buf)?;
             components.insert(component_kind, Some(component_data));
         }
 
         for _ in 0..components_without_data_count {
-            let component_kind = DataComponentKind::read_from(buf)?;
+            let component_kind = DataComponentKind::azalea_read(buf)?;
             components.insert(component_kind, None);
         }
 
@@ -207,8 +207,8 @@ impl McBufReadable for DataComponentPatch {
     }
 }
 
-impl McBufWritable for DataComponentPatch {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for DataComponentPatch {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut components_with_data_count = 0;
         let mut components_without_data_count = 0;
         for component in self.components.values() {
@@ -219,21 +219,21 @@ impl McBufWritable for DataComponentPatch {
             }
         }
 
-        components_with_data_count.write_into(buf)?;
-        components_without_data_count.write_into(buf)?;
+        components_with_data_count.azalea_write(buf)?;
+        components_without_data_count.azalea_write(buf)?;
 
         for (kind, component) in &self.components {
             if let Some(component) = component {
-                kind.write_into(buf)?;
+                kind.azalea_write(buf)?;
                 let mut component_buf = Vec::new();
                 component.encode(&mut component_buf).unwrap();
-                component_buf.write_into(buf)?;
+                component_buf.azalea_write(buf)?;
             }
         }
 
         for (kind, component) in &self.components {
             if component.is_none() {
-                kind.write_into(buf)?;
+                kind.azalea_write(buf)?;
             }
         }
 
diff --git a/azalea-language/Cargo.toml b/azalea-language/Cargo.toml
index bdc7bb4e1..2038f31e5 100644
--- a/azalea-language/Cargo.toml
+++ b/azalea-language/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-language"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-language"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-physics/Cargo.toml b/azalea-physics/Cargo.toml
index fe4e925ac..d668db1b7 100644
--- a/azalea-physics/Cargo.toml
+++ b/azalea-physics/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-physics"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-physics"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-physics/src/clip.rs b/azalea-physics/src/clip.rs
index 30b46a8e8..f24721c5b 100644
--- a/azalea-physics/src/clip.rs
+++ b/azalea-physics/src/clip.rs
@@ -5,7 +5,7 @@ use azalea_core::{
     math::{self, lerp, EPSILON},
     position::{BlockPos, Vec3},
 };
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use azalea_world::ChunkStorage;
 use bevy_ecs::entity::Entity;
 
@@ -52,7 +52,7 @@ pub enum FluidPickType {
 pub struct EntityCollisionContext {
     pub descending: bool,
     pub entity_bottom: f64,
-    pub held_item: ItemSlot,
+    pub held_item: ItemStack,
     // pub can_stand_on_fluid: Box<dyn Fn(&FluidState) -> bool>,
     pub entity: Entity,
 }
@@ -62,21 +62,15 @@ pub fn clip(chunk_storage: &ChunkStorage, context: ClipContext) -> BlockHitResul
         context.from,
         context.to,
         context,
-        |context, block_pos| {
+        |ctx, block_pos| {
             let block_state = chunk_storage.get_block_state(block_pos).unwrap_or_default();
             // TODO: add fluid stuff to this (see getFluidState in vanilla source)
-            let block_shape = context.block_shape(block_state);
-            clip_with_interaction_override(
-                &context.from,
-                &context.to,
-                block_pos,
-                block_shape,
-                &block_state,
-            )
+            let block_shape = ctx.block_shape(block_state);
+            clip_with_interaction_override(&ctx.from, &ctx.to, block_pos, block_shape, &block_state)
             // let block_distance = if let Some(block_hit_result) =
-            // block_hit_result {     context.from.distance_to_sqr(&
+            // block_hit_result {     context.from.distance_squared_to(&
             // block_hit_result.location) } else {
-            //     f64::MAX
+            //     f64::INFINITY
             // };
         },
         |context| {
@@ -90,19 +84,6 @@ pub fn clip(chunk_storage: &ChunkStorage, context: ClipContext) -> BlockHitResul
     )
 }
 
-// default BlockHitResult clipWithInteractionOverride(Vec3 world, Vec3 from,
-// BlockPos to, VoxelShape shape,     BlockState block) {
-//  BlockHitResult blockHitResult = shape.clip(world, from, to);
-//  if (blockHitResult != null) {
-//     BlockHitResult var7 = block.getInteractionShape(this, to).clip(world,
-// from, to);     if (var7 != null
-//           && var7.getLocation().subtract(world).lengthSqr() <
-// blockHitResult.getLocation().subtract(world).lengthSqr()) {        return
-// blockHitResult.withDirection(var7.getDirection());     }
-//  }
-
-//  return blockHitResult;
-// }
 fn clip_with_interaction_override(
     from: &Vec3,
     to: &Vec3,
@@ -119,8 +100,8 @@ fn clip_with_interaction_override(
         let interaction_shape = block_state.shape();
         let interaction_hit_result = interaction_shape.clip(from, to, block_pos);
         if let Some(interaction_hit_result) = interaction_hit_result {
-            if interaction_hit_result.location.distance_to_sqr(from)
-                < block_hit_result.location.distance_to_sqr(from)
+            if interaction_hit_result.location.distance_squared_to(from)
+                < block_hit_result.location.distance_squared_to(from)
             {
                 return Some(block_hit_result.with_direction(interaction_hit_result.direction));
             }
diff --git a/azalea-physics/src/collision/blocks.rs b/azalea-physics/src/collision/blocks.rs
index 73d62a411..d3c976ac2 100644
--- a/azalea-physics/src/collision/blocks.rs
+++ b/azalea-physics/src/collision/blocks.rs
@@ -1,6 +1,6 @@
 //! Autogenerated block collisions for every block
 
-// This file is generated from codegen/lib/code/block_shapes.py. If you want to
+// This file is generated from codegen/lib/code/shapes.py. If you want to
 // modify it, change that file.
 
 #![allow(clippy::explicit_auto_deref)]
@@ -1776,19 +1776,21 @@ impl BlockWithShape for BlockState {
     }
 }
 
-static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
+static SHAPES_MAP: [&LazyLock<VoxelShape>; 27113] = [
     &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
@@ -1945,48 +1947,51 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE3, &SHAPE4,
-    &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6,
-    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3,
-    &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5,
-    &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6,
-    &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4,
-    &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5,
-    &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3,
-    &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4,
-    &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6,
-    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3,
-    &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5,
-    &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6,
-    &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4,
-    &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5,
-    &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3,
-    &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4,
-    &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6,
-    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3,
-    &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5,
-    &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6,
-    &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4,
-    &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5,
-    &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3,
-    &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4,
-    &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6,
-    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5,
+    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3,
+    &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6,
+    &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4,
+    &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3,
+    &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5,
+    &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4,
+    &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6,
+    &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5,
+    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3,
+    &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6,
+    &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4,
+    &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3,
+    &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5,
+    &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4,
+    &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6,
+    &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5,
+    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3,
+    &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6,
+    &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4,
+    &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3,
+    &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5,
+    &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4,
+    &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6,
+    &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5,
+    &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE9, &SHAPE10, &SHAPE11, &SHAPE12, &SHAPE13, &SHAPE14, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE9, &SHAPE10, &SHAPE11, &SHAPE12, &SHAPE13, &SHAPE14, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE15, &SHAPE15, &SHAPE16, &SHAPE16, &SHAPE17, &SHAPE17,
-    &SHAPE18, &SHAPE18, &SHAPE19, &SHAPE19, &SHAPE20, &SHAPE20, &SHAPE21, &SHAPE21, &SHAPE22,
-    &SHAPE22, &SHAPE23, &SHAPE23, &SHAPE24, &SHAPE24, &SHAPE25, &SHAPE25, &SHAPE26, &SHAPE26,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE9, &SHAPE10, &SHAPE11, &SHAPE12, &SHAPE13,
+    &SHAPE14, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE9, &SHAPE10, &SHAPE11, &SHAPE12, &SHAPE13, &SHAPE14,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE15, &SHAPE15, &SHAPE16, &SHAPE16,
+    &SHAPE17, &SHAPE17, &SHAPE18, &SHAPE18, &SHAPE19, &SHAPE19, &SHAPE20, &SHAPE20, &SHAPE21,
+    &SHAPE21, &SHAPE22, &SHAPE22, &SHAPE23, &SHAPE23, &SHAPE24, &SHAPE24, &SHAPE25, &SHAPE25,
+    &SHAPE26, &SHAPE26, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
@@ -2012,8 +2017,6 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2064,20 +2067,21 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE53, &SHAPE53, &SHAPE54, &SHAPE54,
-    &SHAPE55, &SHAPE55, &SHAPE53, &SHAPE53, &SHAPE55, &SHAPE55, &SHAPE54, &SHAPE54, &SHAPE53,
-    &SHAPE53, &SHAPE56, &SHAPE56, &SHAPE57, &SHAPE57, &SHAPE53, &SHAPE53, &SHAPE57, &SHAPE57,
-    &SHAPE56, &SHAPE56, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29,
+    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
+    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
+    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
+    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
+    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
+    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
+    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
+    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
+    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE53, &SHAPE53, &SHAPE54,
+    &SHAPE54, &SHAPE55, &SHAPE55, &SHAPE53, &SHAPE53, &SHAPE55, &SHAPE55, &SHAPE54, &SHAPE54,
+    &SHAPE53, &SHAPE53, &SHAPE56, &SHAPE56, &SHAPE57, &SHAPE57, &SHAPE53, &SHAPE53, &SHAPE57,
+    &SHAPE57, &SHAPE56, &SHAPE56, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2205,11 +2209,11 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2232,36 +2236,41 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67,
-    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65,
-    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64,
-    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE67, &SHAPE67,
-    &SHAPE66, &SHAPE66, &SHAPE64, &SHAPE64, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE64, &SHAPE64,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66,
+    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
+    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65,
+    &SHAPE65, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE64, &SHAPE64, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
-    &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
-    &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
-    &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
-    &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49,
-    &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50,
-    &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37,
-    &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42,
-    &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38,
-    &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE29, &SHAPE29,
+    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
+    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
+    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
+    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
+    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
+    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
+    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
+    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
+    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2308,6 +2317,13 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2333,52 +2349,81 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE69, &SHAPE69,
-    &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69,
-    &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69,
-    &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70,
-    &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70,
     &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70,
     &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70,
     &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69,
     &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69,
     &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69,
-    &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70,
+    &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70,
+    &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70,
+    &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
-    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65,
-    &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE64, &SHAPE64, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66,
+    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67,
+    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1,
+    &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE7,
-    &SHAPE58, &SHAPE59, &SHAPE8, &SHAPE60, &SHAPE13, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE71,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE7, &SHAPE58, &SHAPE59, &SHAPE8, &SHAPE60, &SHAPE13,
+    &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71,
     &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71,
-    &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76,
-    &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81,
-    &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84,
-    &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89,
-    &SHAPE1, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE91, &SHAPE92, &SHAPE93, &SHAPE94, &SHAPE95,
-    &SHAPE96, &SHAPE97, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
+    &SHAPE71, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1,
+    &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78,
+    &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83,
+    &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86,
+    &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE1, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1,
+    &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE91, &SHAPE92, &SHAPE93, &SHAPE94, &SHAPE95, &SHAPE96, &SHAPE97, &SHAPE7, &SHAPE7,
     &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
     &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
     &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
     &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
     &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
-    &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
+    &SHAPE7, &SHAPE7, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE65, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65,
+    &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98,
     &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
     &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67,
     &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66,
@@ -2399,28 +2444,13 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66,
     &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64,
     &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65,
-    &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65,
-    &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65,
-    &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65,
+    &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE65,
     &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65,
     &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67,
     &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
@@ -2435,14 +2465,7 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99,
     &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98,
     &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67,
-    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67,
-    &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66,
-    &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
@@ -2462,17 +2485,16 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE100, &SHAPE101, &SHAPE100,
-    &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104,
-    &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108,
-    &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112,
-    &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE115, &SHAPE115, &SHAPE116, &SHAPE116,
-    &SHAPE117, &SHAPE117, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103,
-    &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107,
-    &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111,
-    &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2,
-    &SHAPE114, &SHAPE2, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101,
+    &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105,
+    &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109,
+    &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113,
+    &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE115, &SHAPE115, &SHAPE116, &SHAPE116, &SHAPE117,
+    &SHAPE117, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102,
+    &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106,
+    &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110,
+    &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2,
+    &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2490,27 +2512,10 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80,
-    &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0,
-    &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83,
-    &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33,
-    &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37,
-    &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42,
-    &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46,
-    &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30,
-    &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46,
-    &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31,
-    &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52,
-    &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29,
-    &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33,
-    &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38,
-    &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42,
-    &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47,
-    &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30,
-    &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35,
-    &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31,
-    &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36,
-    &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80,
+    &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0,
+    &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83,
+    &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE29, &SHAPE29,
     &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
     &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
     &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
@@ -2519,11 +2524,7 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
     &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
     &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
-    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, &SHAPE1, &SHAPE119,
-    &SHAPE1, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77,
-    &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82,
-    &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87,
-    &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE29, &SHAPE29, &SHAPE30,
+    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30,
     &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
     &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
     &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
@@ -2532,22 +2533,44 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
     &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
     &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE13,
-    &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120,
-    &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121,
-    &SHAPE0, &SHAPE122, &SHAPE122, &SHAPE122, &SHAPE122, &SHAPE123, &SHAPE123, &SHAPE123,
-    &SHAPE123, &SHAPE1, &SHAPE72, &SHAPE1, &SHAPE1, &SHAPE124, &SHAPE125, &SHAPE126, &SHAPE127,
-    &SHAPE128, &SHAPE129, &SHAPE130, &SHAPE131, &SHAPE132, &SHAPE133, &SHAPE134, &SHAPE135,
-    &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33,
-    &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37,
-    &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42,
-    &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46,
-    &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30,
-    &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46,
-    &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31,
-    &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52,
-    &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1,
-    &SHAPE1, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53,
+    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
+    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
+    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
+    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
+    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
+    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
+    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
+    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, &SHAPE1, &SHAPE119, &SHAPE1, &SHAPE74,
+    &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79,
+    &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82,
+    &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87,
+    &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31,
+    &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35,
+    &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40,
+    &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44,
+    &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49,
+    &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32,
+    &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37,
+    &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33,
+    &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38,
+    &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE13, &SHAPE120,
+    &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE121,
+    &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE0,
+    &SHAPE122, &SHAPE122, &SHAPE122, &SHAPE122, &SHAPE123, &SHAPE123, &SHAPE123, &SHAPE123,
+    &SHAPE1, &SHAPE72, &SHAPE1, &SHAPE1, &SHAPE124, &SHAPE125, &SHAPE126, &SHAPE127, &SHAPE128,
+    &SHAPE129, &SHAPE130, &SHAPE131, &SHAPE132, &SHAPE133, &SHAPE134, &SHAPE135, &SHAPE29,
+    &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33,
+    &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38,
+    &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42,
+    &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47,
+    &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30,
+    &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35,
+    &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31,
+    &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36,
+    &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, &SHAPE1,
+    &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2562,16 +2585,7 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31,
-    &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35,
-    &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40,
-    &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44,
-    &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49,
-    &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32,
-    &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37,
-    &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33,
-    &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38,
-    &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
     &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
     &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
     &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
@@ -2589,75 +2603,30 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51,
     &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42,
     &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47,
-    &SHAPE47, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137,
-    &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141,
-    &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145,
-    &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153,
-    &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137,
-    &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138,
-    &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141,
-    &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140,
+    &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32,
+    &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37,
+    &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41,
+    &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46,
+    &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41,
+    &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46,
+    &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51,
+    &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52,
+    &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137,
+    &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140,
     &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142,
-    &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145,
-    &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150,
-    &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144,
+    &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141,
+    &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144,
     &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146,
     &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149,
     &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148,
     &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150,
-    &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153,
-    &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158,
-    &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162,
-    &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
-    &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
-    &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152,
+    &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145,
+    &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149,
+    &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152,
     &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154,
     &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157,
     &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156,
@@ -2671,8 +2640,62 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
     &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164,
     &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
-    &SHAPE166, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27,
+    &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153,
+    &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157,
+    &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
+    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161,
+    &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
+    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137,
+    &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
     &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27,
+    &SHAPE1, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27,
     &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27,
     &SHAPE27, &SHAPE27, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -2692,75 +2715,81 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
-    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172,
-    &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
+    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170,
+    &SHAPE171, &SHAPE171, &SHAPE172, &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
-    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172,
-    &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
+    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170,
+    &SHAPE171, &SHAPE171, &SHAPE172, &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
-    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172,
-    &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
+    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170,
+    &SHAPE171, &SHAPE171, &SHAPE172, &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
-    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172,
-    &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
+    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170,
+    &SHAPE171, &SHAPE171, &SHAPE172, &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
-    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172,
-    &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
+    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170,
+    &SHAPE171, &SHAPE171, &SHAPE172, &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
     &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169,
-    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172,
-    &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174,
+    &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170,
+    &SHAPE171, &SHAPE171, &SHAPE172, &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE174, &SHAPE174,
     &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174,
     &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174,
     &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174,
-    &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE175, &SHAPE175, &SHAPE176, &SHAPE176, &SHAPE177,
-    &SHAPE177, &SHAPE178, &SHAPE178, &SHAPE179, &SHAPE179, &SHAPE180, &SHAPE180, &SHAPE179,
-    &SHAPE179, &SHAPE180, &SHAPE180, &SHAPE179, &SHAPE179, &SHAPE180, &SHAPE180, &SHAPE53,
-    &SHAPE53, &SHAPE54, &SHAPE54, &SHAPE55, &SHAPE55, &SHAPE53, &SHAPE53, &SHAPE55, &SHAPE55,
-    &SHAPE54, &SHAPE54, &SHAPE53, &SHAPE53, &SHAPE56, &SHAPE56, &SHAPE57, &SHAPE57, &SHAPE53,
-    &SHAPE53, &SHAPE57, &SHAPE57, &SHAPE56, &SHAPE56, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE175, &SHAPE175,
+    &SHAPE176, &SHAPE176, &SHAPE177, &SHAPE177, &SHAPE178, &SHAPE178, &SHAPE179, &SHAPE179,
+    &SHAPE180, &SHAPE180, &SHAPE179, &SHAPE179, &SHAPE180, &SHAPE180, &SHAPE179, &SHAPE179,
+    &SHAPE180, &SHAPE180, &SHAPE53, &SHAPE53, &SHAPE54, &SHAPE54, &SHAPE55, &SHAPE55, &SHAPE53,
+    &SHAPE53, &SHAPE55, &SHAPE55, &SHAPE54, &SHAPE54, &SHAPE53, &SHAPE53, &SHAPE56, &SHAPE56,
+    &SHAPE57, &SHAPE57, &SHAPE53, &SHAPE53, &SHAPE57, &SHAPE57, &SHAPE56, &SHAPE56, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE7, &SHAPE7, &SHAPE7,
-    &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
-    &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7,
+    &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE59, &SHAPE59, &SHAPE59,
     &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59,
     &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59,
-    &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE1,
-    &SHAPE1, &SHAPE181, &SHAPE182, &SHAPE183, &SHAPE184, &SHAPE185, &SHAPE181, &SHAPE182,
-    &SHAPE183, &SHAPE184, &SHAPE185, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29,
-    &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33,
-    &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38,
-    &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42,
-    &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47,
-    &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30,
-    &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35,
-    &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31,
-    &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36,
-    &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0,
+    &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59,
+    &SHAPE59, &SHAPE59, &SHAPE1, &SHAPE1, &SHAPE181, &SHAPE182, &SHAPE183, &SHAPE184, &SHAPE185,
+    &SHAPE181, &SHAPE182, &SHAPE183, &SHAPE184, &SHAPE185, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32,
+    &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37,
+    &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41,
+    &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46,
+    &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41,
+    &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46,
+    &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51,
+    &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52,
+    &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102,
+    &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106,
+    &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110,
+    &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2,
     &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103,
     &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107,
     &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111,
@@ -2820,10 +2849,6 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107,
     &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111,
     &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2,
-    &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103,
-    &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107,
-    &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111,
-    &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2,
     &SHAPE114, &SHAPE2, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32,
     &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36,
     &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41,
@@ -2850,7 +2875,15 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46,
     &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31,
     &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52,
-    &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29,
+    &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29,
     &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33,
     &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38,
     &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42,
@@ -2966,6 +2999,9 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
     &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186,
     &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
+    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186,
+    &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
     &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186,
     &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
     &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
@@ -2974,10 +3010,14 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186,
     &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
     &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
-    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186,
-    &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
-    &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
+    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE80,
+    &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
+    &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83,
+    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
+    &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
+    &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
+    &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83,
+    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
     &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83,
     &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
     &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
@@ -2989,42 +3029,42 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80,
     &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
     &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83,
-    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
-    &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
-    &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
-    &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83,
-    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
+    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
     &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83,
     &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
     &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
     &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
     &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83,
-    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
-    &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
-    &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
-    &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE74, &SHAPE75,
+    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75,
+    &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80,
+    &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85,
+    &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88,
+    &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77,
+    &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82,
+    &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87,
+    &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74,
+    &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79,
+    &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84,
+    &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89,
+    &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76,
+    &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81,
+    &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86,
+    &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75,
     &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78,
     &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83,
     &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88,
     &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77,
     &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80,
     &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85,
-    &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74,
-    &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79,
-    &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82,
-    &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87,
-    &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76,
-    &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81,
-    &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84,
-    &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89,
-    &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78,
-    &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83,
-    &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86,
-    &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75,
-    &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80,
-    &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85,
-    &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88,
-    &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77,
+    &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77,
     &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82,
     &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87,
     &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74,
@@ -3073,47 +3113,52 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
     &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66,
     &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64,
-    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64,
-    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64,
-    &SHAPE64, &SHAPE187, &SHAPE188, &SHAPE187, &SHAPE188, &SHAPE90, &SHAPE90, &SHAPE189, &SHAPE190,
-    &SHAPE191, &SHAPE192, &SHAPE193, &SHAPE194, &SHAPE195, &SHAPE196, &SHAPE197, &SHAPE198,
-    &SHAPE199, &SHAPE200, &SHAPE201, &SHAPE202, &SHAPE203, &SHAPE204, &SHAPE205, &SHAPE206,
-    &SHAPE207, &SHAPE208, &SHAPE209, &SHAPE210, &SHAPE211, &SHAPE212, &SHAPE213, &SHAPE214,
-    &SHAPE215, &SHAPE216, &SHAPE217, &SHAPE68, &SHAPE218, &SHAPE219, &SHAPE220, &SHAPE221,
-    &SHAPE222, &SHAPE223, &SHAPE224, &SHAPE225, &SHAPE226, &SHAPE227, &SHAPE228, &SHAPE229,
-    &SHAPE230, &SHAPE231, &SHAPE232, &SHAPE233, &SHAPE234, &SHAPE235, &SHAPE236, &SHAPE237,
-    &SHAPE238, &SHAPE239, &SHAPE240, &SHAPE241, &SHAPE242, &SHAPE243, &SHAPE244, &SHAPE245,
-    &SHAPE246, &SHAPE247, &SHAPE248, &SHAPE249, &SHAPE250, &SHAPE251, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE252,
-    &SHAPE252, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE253,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE62, &SHAPE0, &SHAPE1, &SHAPE1,
+    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
+    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66,
+    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67,
+    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE187, &SHAPE188, &SHAPE187, &SHAPE188,
+    &SHAPE90, &SHAPE90, &SHAPE189, &SHAPE190, &SHAPE191, &SHAPE192, &SHAPE193, &SHAPE194,
+    &SHAPE195, &SHAPE196, &SHAPE197, &SHAPE198, &SHAPE199, &SHAPE200, &SHAPE201, &SHAPE202,
+    &SHAPE203, &SHAPE204, &SHAPE205, &SHAPE206, &SHAPE207, &SHAPE208, &SHAPE209, &SHAPE210,
+    &SHAPE211, &SHAPE212, &SHAPE213, &SHAPE214, &SHAPE215, &SHAPE216, &SHAPE217, &SHAPE68,
+    &SHAPE218, &SHAPE219, &SHAPE220, &SHAPE221, &SHAPE222, &SHAPE223, &SHAPE224, &SHAPE225,
+    &SHAPE226, &SHAPE227, &SHAPE228, &SHAPE229, &SHAPE230, &SHAPE231, &SHAPE232, &SHAPE233,
+    &SHAPE234, &SHAPE235, &SHAPE236, &SHAPE237, &SHAPE238, &SHAPE239, &SHAPE240, &SHAPE241,
+    &SHAPE242, &SHAPE243, &SHAPE244, &SHAPE245, &SHAPE246, &SHAPE247, &SHAPE248, &SHAPE249,
+    &SHAPE250, &SHAPE251, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32,
+    &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36,
+    &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41,
+    &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45,
+    &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41,
+    &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50,
+    &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51,
+    &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42,
+    &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47,
+    &SHAPE47, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE252, &SHAPE252, &SHAPE0, &SHAPE253, &SHAPE0,
+    &SHAPE253, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE62, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
@@ -3133,14 +3178,14 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE1, &SHAPE255, &SHAPE255, &SHAPE255, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256,
-    &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE257, &SHAPE257, &SHAPE257,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE255, &SHAPE255, &SHAPE255,
+    &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256,
+    &SHAPE256, &SHAPE257, &SHAPE257, &SHAPE257, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
@@ -3151,45 +3196,11 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE258, &SHAPE258, &SHAPE259, &SHAPE259, &SHAPE260, &SHAPE260, &SHAPE261, &SHAPE261,
-    &SHAPE1, &SHAPE254, &SHAPE254, &SHAPE0, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116,
-    &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE27, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
-    &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
-    &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
-    &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
-    &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49,
-    &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50,
-    &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37,
-    &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42,
-    &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38,
-    &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32,
-    &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36,
-    &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41,
-    &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45,
-    &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41,
-    &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50,
-    &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51,
-    &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42,
-    &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47,
-    &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32,
-    &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37,
-    &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41,
-    &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46,
-    &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41,
-    &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46,
-    &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51,
-    &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52,
-    &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47,
-    &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33,
-    &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37,
-    &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42,
-    &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46,
-    &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30,
-    &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46,
-    &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31,
-    &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52,
-    &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE258, &SHAPE258, &SHAPE259, &SHAPE259,
+    &SHAPE260, &SHAPE260, &SHAPE261, &SHAPE261, &SHAPE1, &SHAPE254, &SHAPE254, &SHAPE0, &SHAPE116,
+    &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116,
+    &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE27, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE29,
     &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33,
     &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38,
     &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42,
@@ -3278,15 +3289,91 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35,
     &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31,
     &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36,
-    &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186,
-    &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
+    &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29,
+    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
+    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
+    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
+    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
+    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
+    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
+    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
+    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
+    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30,
+    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
+    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
+    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
+    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
+    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
+    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
+    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
+    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
+    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
+    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
+    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
+    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
+    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
+    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
+    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
+    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31,
+    &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35,
+    &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40,
+    &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44,
+    &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49,
+    &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32,
+    &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37,
+    &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33,
+    &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38,
+    &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
     &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
     &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186,
     &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
     &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186,
     &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
     &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
-    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE136,
+    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186,
+    &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136,
+    &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140,
+    &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
+    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144,
+    &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
+    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
+    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
+    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
+    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
+    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152,
+    &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
+    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
+    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
+    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
+    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136,
     &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0,
     &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140,
     &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140,
@@ -3771,64 +3858,24 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164,
     &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
     &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137,
-    &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138,
-    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
-    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
-    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
-    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
-    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
-    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
-    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
-    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
-    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
-    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
-    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
-    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
-    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
-    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
-    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
-    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
-    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
-    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
-    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
-    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263,
+    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE263, &SHAPE263, &SHAPE263,
     &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263,
     &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263,
     &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263,
+    &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE264, &SHAPE264, &SHAPE265, &SHAPE265, &SHAPE266,
-    &SHAPE267, &SHAPE268, &SHAPE269, &SHAPE270, &SHAPE270, &SHAPE271, &SHAPE271, &SHAPE272,
+    &SHAPE264, &SHAPE264, &SHAPE265, &SHAPE265, &SHAPE266, &SHAPE267, &SHAPE268, &SHAPE269,
+    &SHAPE270, &SHAPE270, &SHAPE271, &SHAPE271, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272,
     &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272,
-    &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE1,
-    &SHAPE168, &SHAPE168, &SHAPE168, &SHAPE168, &SHAPE273, &SHAPE273, &SHAPE273, &SHAPE273,
-    &SHAPE274, &SHAPE274, &SHAPE274, &SHAPE274, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275,
-    &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE276, &SHAPE276, &SHAPE277, &SHAPE277,
-    &SHAPE278, &SHAPE278, &SHAPE279, &SHAPE279, &SHAPE280, &SHAPE280, &SHAPE280, &SHAPE280,
-    &SHAPE281, &SHAPE281, &SHAPE281, &SHAPE281, &SHAPE282, &SHAPE282, &SHAPE283, &SHAPE283,
-    &SHAPE282, &SHAPE282, &SHAPE283, &SHAPE283, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
+    &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE1, &SHAPE168, &SHAPE168, &SHAPE168,
+    &SHAPE168, &SHAPE273, &SHAPE273, &SHAPE273, &SHAPE273, &SHAPE274, &SHAPE274, &SHAPE274,
+    &SHAPE274, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275,
+    &SHAPE275, &SHAPE276, &SHAPE276, &SHAPE277, &SHAPE277, &SHAPE278, &SHAPE278, &SHAPE279,
+    &SHAPE279, &SHAPE280, &SHAPE280, &SHAPE280, &SHAPE280, &SHAPE281, &SHAPE281, &SHAPE281,
+    &SHAPE281, &SHAPE282, &SHAPE282, &SHAPE283, &SHAPE283, &SHAPE282, &SHAPE282, &SHAPE283,
+    &SHAPE283, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
     &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
     &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
     &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
@@ -3836,152 +3883,201 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
     &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
     &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167,
-    &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0,
-    &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE167, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1,
+    &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186,
-    &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77,
-    &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80,
-    &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85,
-    &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74,
-    &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79,
-    &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82,
-    &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87,
-    &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE0, &SHAPE0, &SHAPE80,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
+    &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78,
+    &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83,
+    &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86,
+    &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75,
+    &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80,
+    &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85,
+    &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88,
+    &SHAPE89, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66,
+    &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
     &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
-    &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83,
-    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
-    &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
-    &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
     &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83,
-    &SHAPE83, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32,
-    &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37,
-    &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41,
-    &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46,
-    &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41,
-    &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46,
-    &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51,
-    &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52,
-    &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47,
-    &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33,
-    &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37,
-    &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42,
-    &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46,
-    &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30,
-    &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46,
-    &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31,
-    &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52,
-    &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0,
+    &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80,
+    &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0,
+    &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE29, &SHAPE29,
+    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
+    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
+    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
+    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
+    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
+    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
+    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
+    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
+    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30,
+    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
+    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
+    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
+    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
+    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
+    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
+    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
+    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
+    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65,
-    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
-    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
-    &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66,
-    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67,
-    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65,
-    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
-    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66,
-    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
+    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66,
+    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67,
+    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284,
-    &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284,
+    &SHAPE284, &SHAPE284, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE71, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136,
-    &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139,
-    &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143,
-    &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151,
-    &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE186,
-    &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE186,
-    &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE71, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27,
+    &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32,
+    &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36,
+    &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41,
+    &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45,
+    &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41,
+    &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50,
+    &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51,
+    &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42,
+    &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47,
+    &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138,
+    &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32,
+    &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37,
+    &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41,
+    &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46,
+    &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41,
+    &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46,
+    &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51,
+    &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52,
+    &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47,
+    &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138,
+    &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
     &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
     &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
     &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
@@ -3990,634 +4086,106 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
     &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
     &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
-    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137,
-    &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141,
-    &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145,
-    &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153,
-    &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29,
-    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
-    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
-    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
-    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
-    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
-    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
-    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
-    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
-    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8,
-    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
     &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE136,
-    &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0,
-    &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141,
-    &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145,
-    &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153,
-    &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118,
-    &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286,
-    &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
-    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
-    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
-    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
-    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE1, &SHAPE1, &SHAPE289,
-    &SHAPE289, &SHAPE290, &SHAPE290, &SHAPE291, &SHAPE291, &SHAPE292, &SHAPE292, &SHAPE293,
-    &SHAPE293, &SHAPE294, &SHAPE294, &SHAPE295, &SHAPE295, &SHAPE296, &SHAPE296, &SHAPE297,
-    &SHAPE297, &SHAPE298, &SHAPE298, &SHAPE299, &SHAPE299, &SHAPE300, &SHAPE300, &SHAPE301,
-    &SHAPE301, &SHAPE302, &SHAPE302, &SHAPE303, &SHAPE303, &SHAPE304, &SHAPE304, &SHAPE305,
-    &SHAPE305, &SHAPE306, &SHAPE306, &SHAPE307, &SHAPE307, &SHAPE308, &SHAPE308, &SHAPE309,
-    &SHAPE309, &SHAPE310, &SHAPE310, &SHAPE311, &SHAPE311, &SHAPE312, &SHAPE312, &SHAPE1,
-    &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136,
-    &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139,
-    &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143,
-    &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151,
-    &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1,
-    &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136,
-    &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139,
-    &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143,
-    &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151,
-    &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1,
-    &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136,
-    &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139,
-    &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143,
-    &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147,
-    &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151,
-    &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155,
-    &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159,
-    &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163,
-    &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE0, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
-    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29,
-    &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33,
-    &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38,
-    &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42,
-    &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47,
-    &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30,
-    &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35,
-    &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31,
-    &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36,
-    &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29,
-    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
-    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
-    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
-    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
-    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
-    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
-    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
-    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
-    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
-    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
-    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
-    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
-    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
-    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
-    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
-    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
-    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
-    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
-    &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186,
-    &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29,
-    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
-    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
-    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
-    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
-    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
-    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
-    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
-    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
-    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
-    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
-    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
-    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
-    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
-    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
-    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
-    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
-    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
-    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31,
-    &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35,
-    &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40,
-    &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44,
-    &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49,
-    &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32,
-    &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37,
-    &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33,
-    &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38,
-    &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1,
-    &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
-    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE64,
-    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64,
-    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64,
-    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
-    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65,
-    &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65,
-    &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
-    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66,
-    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65,
-    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
-    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65,
-    &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65,
-    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
-    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65,
-    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
-    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
-    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
-    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67,
-    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65,
-    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
-    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64,
-    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66,
-    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
-    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67,
-    &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
-    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67,
-    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
-    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65,
-    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
-    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
-    &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66,
-    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
-    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67,
-    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
-    &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65,
-    &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65,
-    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65,
-    &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67,
-    &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65,
-    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67,
-    &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67,
-    &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67,
-    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67,
-    &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66,
-    &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67,
-    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66,
-    &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66,
-    &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66,
-    &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65,
-    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99,
-    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98,
-    &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99,
-    &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
-    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64,
-    &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE188,
-    &SHAPE188, &SHAPE188, &SHAPE188, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE188,
-    &SHAPE188, &SHAPE188, &SHAPE188, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90,
-    &SHAPE90, &SHAPE90, &SHAPE262, &SHAPE262, &SHAPE262, &SHAPE262, &SHAPE313, &SHAPE313,
-    &SHAPE314, &SHAPE314, &SHAPE63, &SHAPE63, &SHAPE63, &SHAPE63, &SHAPE68, &SHAPE68, &SHAPE68,
-    &SHAPE68, &SHAPE73, &SHAPE73, &SHAPE73, &SHAPE73, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE315, &SHAPE315, &SHAPE28, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE1, &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0,
-    &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE316,
-    &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE316, &SHAPE316,
-    &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
-    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29,
-    &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33,
-    &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38,
-    &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42,
-    &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47,
-    &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30,
-    &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35,
-    &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31,
-    &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36,
-    &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186,
-    &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137,
-    &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140,
-    &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141,
-    &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140,
-    &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144,
-    &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145,
-    &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144,
-    &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148,
-    &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149,
-    &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148,
-    &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152,
-    &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153,
-    &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152,
-    &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156,
-    &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157,
-    &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156,
-    &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160,
-    &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161,
-    &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160,
-    &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164,
-    &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164,
-    &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29,
-    &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34,
-    &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38,
-    &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43,
-    &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47,
-    &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43,
-    &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35,
-    &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40,
-    &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36,
-    &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8,
-    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137,
-    &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE136, &SHAPE137, &SHAPE137,
+    &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE285, &SHAPE285,
+    &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE287, &SHAPE287,
+    &SHAPE287, &SHAPE287, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
+    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
+    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
+    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288,
+    &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE1, &SHAPE1, &SHAPE289, &SHAPE289, &SHAPE290,
+    &SHAPE290, &SHAPE291, &SHAPE291, &SHAPE292, &SHAPE292, &SHAPE293, &SHAPE293, &SHAPE294,
+    &SHAPE294, &SHAPE295, &SHAPE295, &SHAPE296, &SHAPE296, &SHAPE297, &SHAPE297, &SHAPE298,
+    &SHAPE298, &SHAPE299, &SHAPE299, &SHAPE300, &SHAPE300, &SHAPE301, &SHAPE301, &SHAPE302,
+    &SHAPE302, &SHAPE303, &SHAPE303, &SHAPE304, &SHAPE304, &SHAPE305, &SHAPE305, &SHAPE306,
+    &SHAPE306, &SHAPE307, &SHAPE307, &SHAPE308, &SHAPE308, &SHAPE309, &SHAPE309, &SHAPE310,
+    &SHAPE310, &SHAPE311, &SHAPE311, &SHAPE312, &SHAPE312, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
+    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
+    &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
+    &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
+    &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
+    &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49,
+    &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50,
+    &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37,
+    &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42,
+    &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38,
+    &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0,
+    &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140,
     &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142,
     &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141,
     &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144,
@@ -4656,17 +4224,17 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164,
     &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
     &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8,
-    &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0,
+    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
+    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
+    &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
+    &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
+    &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
+    &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49,
+    &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50,
+    &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37,
+    &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42,
+    &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38,
+    &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0,
     &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140,
     &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142,
     &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141,
@@ -4706,17 +4274,17 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164,
     &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
     &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
-    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
-    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
-    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
-    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
-    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
-    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
-    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
-    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
-    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8,
-    &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0,
+    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186,
+    &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
+    &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
+    &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
+    &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
+    &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49,
+    &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50,
+    &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37,
+    &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42,
+    &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38,
+    &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0,
     &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140,
     &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142,
     &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141,
@@ -4756,14 +4324,493 @@ static SHAPES_MAP: [&LazyLock<VoxelShape>; 26644] = [
     &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164,
     &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166,
     &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165,
-    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE27, &SHAPE27, &SHAPE1, &SHAPE1,
-    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE72,
-    &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72,
-    &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8,
+    &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1,
+    &SHAPE1, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30,
+    &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34,
+    &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39,
+    &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43,
+    &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48,
+    &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43,
+    &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48,
+    &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40,
+    &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45,
+    &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
+    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
+    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
+    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
+    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
+    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
+    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
+    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31,
+    &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35,
+    &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40,
+    &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44,
+    &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49,
+    &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32,
+    &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37,
+    &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33,
+    &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38,
+    &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
+    &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
+    &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
+    &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
+    &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49,
+    &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50,
+    &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37,
+    &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42,
+    &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38,
+    &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186,
+    &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31,
+    &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35,
+    &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40,
+    &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44,
+    &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49,
+    &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32,
+    &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37,
+    &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33,
+    &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38,
+    &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31,
+    &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36,
+    &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40,
+    &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45,
+    &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49,
+    &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50,
+    &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37,
+    &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42,
+    &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38,
+    &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32,
+    &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36,
+    &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41,
+    &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45,
+    &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41,
+    &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50,
+    &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51,
+    &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42,
+    &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47,
+    &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32,
+    &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37,
+    &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41,
+    &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46,
+    &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41,
+    &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46,
+    &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51,
+    &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52,
+    &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47,
+    &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8,
+    &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186,
+    &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
+    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66,
+    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
+    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67,
+    &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67,
+    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
+    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
+    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
+    &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66,
+    &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
+    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67,
+    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66,
+    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
+    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
+    &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
+    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
+    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64,
+    &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64,
+    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67,
+    &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67,
+    &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
+    &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64,
+    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
+    &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66,
+    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66,
+    &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66,
+    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65,
+    &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65,
+    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65,
+    &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66,
+    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66,
+    &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
+    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65,
+    &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66,
+    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65,
+    &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65,
+    &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64,
+    &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64,
+    &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66,
+    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64,
+    &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64,
+    &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64,
+    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64,
+    &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65,
+    &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64,
+    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65,
+    &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98,
+    &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99,
+    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67,
+    &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66,
+    &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66,
+    &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64,
+    &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99,
+    &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE188, &SHAPE188, &SHAPE188,
+    &SHAPE188, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE188, &SHAPE188, &SHAPE188,
+    &SHAPE188, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90,
+    &SHAPE262, &SHAPE262, &SHAPE262, &SHAPE262, &SHAPE313, &SHAPE313, &SHAPE314, &SHAPE314,
+    &SHAPE63, &SHAPE63, &SHAPE63, &SHAPE63, &SHAPE68, &SHAPE68, &SHAPE68, &SHAPE68, &SHAPE73,
+    &SHAPE73, &SHAPE73, &SHAPE73, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE315,
+    &SHAPE315, &SHAPE28, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE316,
+    &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE316, &SHAPE316,
+    &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE316, &SHAPE316, &SHAPE316,
+    &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE316,
+    &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0,
+    &SHAPE1, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
+    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
+    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
+    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
+    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
+    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
+    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
+    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138,
+    &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
+    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
+    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
+    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
+    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
+    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
+    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
+    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138,
+    &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
+    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
+    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
+    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
+    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
+    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
+    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
+    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138,
+    &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30,
+    &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35,
+    &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39,
+    &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44,
+    &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48,
+    &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32,
+    &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48,
+    &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33,
+    &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45,
+    &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1,
+    &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138,
+    &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139,
+    &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142,
+    &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142,
+    &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143,
+    &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146,
+    &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147,
+    &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150,
+    &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150,
+    &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151,
+    &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154,
+    &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155,
+    &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158,
+    &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158,
+    &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159,
+    &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162,
+    &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163,
+    &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166,
+    &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166,
+    &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE27, &SHAPE27, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE72, &SHAPE72,
+    &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72,
+    &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
     &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
+    &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1,
 ];
diff --git a/azalea-physics/src/collision/mod.rs b/azalea-physics/src/collision/mod.rs
index 3986dc477..7d7ddc5e4 100644
--- a/azalea-physics/src/collision/mod.rs
+++ b/azalea-physics/src/collision/mod.rs
@@ -58,7 +58,7 @@ fn collide(movement: &Vec3, world: &Instance, physics: &azalea_entity::Physics)
     // let entity_collisions = world.get_entity_collisions(self,
     // entity_bounding_box.expand_towards(movement));
     let entity_collisions = Vec::new();
-    let collided_delta = if movement.length_sqr() == 0.0 {
+    let collided_delta = if movement.length_squared() == 0.0 {
         *movement
     } else {
         collide_bounding_box(
@@ -109,12 +109,16 @@ fn collide(movement: &Vec3, world: &Instance, physics: &azalea_entity::Physics)
                 entity_collisions.clone(),
             )
             .add(directly_up_delta);
-            if target_movement.horizontal_distance_sqr() > step_to_delta.horizontal_distance_sqr() {
+            if target_movement.horizontal_distance_squared()
+                > step_to_delta.horizontal_distance_squared()
+            {
                 step_to_delta = target_movement;
             }
         }
 
-        if step_to_delta.horizontal_distance_sqr() > collided_delta.horizontal_distance_sqr() {
+        if step_to_delta.horizontal_distance_squared()
+            > collided_delta.horizontal_distance_squared()
+        {
             return step_to_delta.add(collide_bounding_box(
                 &Vec3 {
                     x: 0.,
@@ -162,7 +166,7 @@ pub fn move_colliding(
 
     let collide_result = collide(movement, world, physics);
 
-    let move_distance = collide_result.length_sqr();
+    let move_distance = collide_result.length_squared();
 
     if move_distance > EPSILON {
         // TODO: fall damage
diff --git a/azalea-physics/src/collision/shape.rs b/azalea-physics/src/collision/shape.rs
index fab8d8dc0..3f584952a 100755
--- a/azalea-physics/src/collision/shape.rs
+++ b/azalea-physics/src/collision/shape.rs
@@ -423,7 +423,7 @@ impl VoxelShape {
             return None;
         }
         let vector = to - from;
-        if vector.length_sqr() < EPSILON {
+        if vector.length_squared() < EPSILON {
             return None;
         }
         let right_after_start = from + &(vector * 0.0001);
diff --git a/azalea-physics/src/lib.rs b/azalea-physics/src/lib.rs
index 702603960..998fb300d 100644
--- a/azalea-physics/src/lib.rs
+++ b/azalea-physics/src/lib.rs
@@ -699,10 +699,10 @@ mod tests {
         let block_state = world_lock.write().chunks.set_block_state(
             &BlockPos { x: 0, y: 69, z: 0 },
             azalea_block::blocks::CobblestoneWall {
-                east: azalea_block::properties::EastWall::Low,
-                north: azalea_block::properties::NorthWall::Low,
-                south: azalea_block::properties::SouthWall::Low,
-                west: azalea_block::properties::WestWall::Low,
+                east: azalea_block::properties::WallEast::Low,
+                north: azalea_block::properties::WallNorth::Low,
+                south: azalea_block::properties::WallSouth::Low,
+                west: azalea_block::properties::WallWest::Low,
                 up: false,
                 waterlogged: false,
             }
@@ -761,10 +761,10 @@ mod tests {
                 z: -8,
             },
             azalea_block::blocks::CobblestoneWall {
-                east: azalea_block::properties::EastWall::Low,
-                north: azalea_block::properties::NorthWall::Low,
-                south: azalea_block::properties::SouthWall::Low,
-                west: azalea_block::properties::WestWall::Low,
+                east: azalea_block::properties::WallEast::Low,
+                north: azalea_block::properties::WallNorth::Low,
+                south: azalea_block::properties::WallSouth::Low,
+                west: azalea_block::properties::WallWest::Low,
                 up: false,
                 waterlogged: false,
             }
diff --git a/azalea-protocol/Cargo.toml b/azalea-protocol/Cargo.toml
index 4ed5081b0..6a24c5ff8 100644
--- a/azalea-protocol/Cargo.toml
+++ b/azalea-protocol/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-protocol"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-protocol"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-protocol/README.md b/azalea-protocol/README.md
index 3f0ea40e8..e1923c9e2 100755
--- a/azalea-protocol/README.md
+++ b/azalea-protocol/README.md
@@ -21,6 +21,6 @@ Adding new packets is usually pretty easy, but you'll want to have Minecraft's d
 
 ### Implementing packets
 
-You can manually implement reading and writing functionality for a packet by implementing McBufReadable and McBufWritable, but you can also have this automatically generated for a struct or enum by deriving McBuf.
+You can manually implement reading and writing functionality for a packet by implementing AzaleaRead and AzaleaWrite, but you can also have this automatically generated for a struct or enum by deriving AzBuf.
 
 Look at other packets as an example.
diff --git a/azalea-protocol/azalea-protocol-macros/Cargo.toml b/azalea-protocol/azalea-protocol-macros/Cargo.toml
index 4bc8c3601..5f1d5b6ed 100644
--- a/azalea-protocol/azalea-protocol-macros/Cargo.toml
+++ b/azalea-protocol/azalea-protocol-macros/Cargo.toml
@@ -3,7 +3,7 @@ description = "Macros internally used in azalea-protocol."
 edition = "2021"
 license = "MIT"
 name = "azalea-protocol-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-protocol/azalea-protocol-macros"
 
 [lib]
diff --git a/azalea-protocol/azalea-protocol-macros/src/lib.rs b/azalea-protocol/azalea-protocol-macros/src/lib.rs
index 756d0d825..393f8de99 100755
--- a/azalea-protocol/azalea-protocol-macros/src/lib.rs
+++ b/azalea-protocol/azalea-protocol-macros/src/lib.rs
@@ -1,9 +1,9 @@
 use proc_macro::TokenStream;
 use quote::quote;
 use syn::{
-    braced,
+    bracketed,
     parse::{Parse, ParseStream, Result},
-    parse_macro_input, DeriveInput, Ident, LitInt, Token,
+    parse_macro_input, DeriveInput, Ident, Token,
 };
 
 fn as_packet_derive(input: TokenStream, state: proc_macro2::TokenStream) -> TokenStream {
@@ -20,19 +20,22 @@ fn as_packet_derive(input: TokenStream, state: proc_macro2::TokenStream) -> Toke
 
     let contents = quote! {
         impl #ident {
-            pub fn get(self) -> #state {
-                #state::#variant_name(self)
-            }
-
             pub fn write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
-                azalea_buf::McBufWritable::write_into(self, buf)
+                azalea_buf::AzaleaWrite::azalea_write(self, buf)
             }
 
             pub fn read(
                 buf: &mut std::io::Cursor<&[u8]>,
             ) -> Result<#state, azalea_buf::BufReadError> {
-                use azalea_buf::McBufReadable;
-                Ok(Self::read_from(buf)?.get())
+                use azalea_buf::AzaleaRead;
+                Ok(crate::packets::Packet::into_variant(Self::azalea_read(buf)?))
+            }
+
+        }
+
+        impl crate::packets::Packet<#state> for #ident {
+            fn into_variant(self) -> #state {
+                #state::#variant_name(self)
             }
         }
     };
@@ -41,121 +44,99 @@ fn as_packet_derive(input: TokenStream, state: proc_macro2::TokenStream) -> Toke
 }
 
 #[proc_macro_derive(ServerboundGamePacket, attributes(var))]
-pub fn derive_serverbound_game_packet(input: TokenStream) -> TokenStream {
+pub fn derive_s_game_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(input, quote! {crate::packets::game::ServerboundGamePacket})
 }
 #[proc_macro_derive(ServerboundHandshakePacket, attributes(var))]
-pub fn derive_serverbound_handshake_packet(input: TokenStream) -> TokenStream {
+pub fn derive_s_handshake_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
-        quote! {crate::packets::handshaking::ServerboundHandshakePacket},
+        quote! {crate::packets::handshake::ServerboundHandshakePacket},
     )
 }
 #[proc_macro_derive(ServerboundLoginPacket, attributes(var))]
-pub fn derive_serverbound_login_packet(input: TokenStream) -> TokenStream {
+pub fn derive_s_login_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
         quote! {crate::packets::login::ServerboundLoginPacket},
     )
 }
 #[proc_macro_derive(ServerboundStatusPacket, attributes(var))]
-pub fn derive_serverbound_status_packet(input: TokenStream) -> TokenStream {
+pub fn derive_s_status_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
         quote! {crate::packets::status::ServerboundStatusPacket},
     )
 }
-#[proc_macro_derive(ServerboundConfigurationPacket, attributes(var))]
-pub fn derive_serverbound_configuration_packet(input: TokenStream) -> TokenStream {
+#[proc_macro_derive(ServerboundConfigPacket, attributes(var))]
+pub fn derive_s_config_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
-        quote! {crate::packets::configuration::ServerboundConfigurationPacket},
+        quote! {crate::packets::config::ServerboundConfigPacket},
     )
 }
 
 #[proc_macro_derive(ClientboundGamePacket, attributes(var))]
-pub fn derive_clientbound_game_packet(input: TokenStream) -> TokenStream {
+pub fn derive_c_game_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(input, quote! {crate::packets::game::ClientboundGamePacket})
 }
 #[proc_macro_derive(ClientboundHandshakePacket, attributes(var))]
-pub fn derive_clientbound_handshake_packet(input: TokenStream) -> TokenStream {
+pub fn derive_c_handshake_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
-        quote! {crate::packets::handshaking::ClientboundHandshakePacket},
+        quote! {crate::packets::handshake::ClientboundHandshakePacket},
     )
 }
 #[proc_macro_derive(ClientboundLoginPacket, attributes(var))]
-pub fn derive_clientbound_login_packet(input: TokenStream) -> TokenStream {
+pub fn derive_c_login_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
         quote! {crate::packets::login::ClientboundLoginPacket},
     )
 }
 #[proc_macro_derive(ClientboundStatusPacket, attributes(var))]
-pub fn derive_clientbound_status_packet(input: TokenStream) -> TokenStream {
+pub fn derive_c_status_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
         quote! {crate::packets::status::ClientboundStatusPacket},
     )
 }
-#[proc_macro_derive(ClientboundConfigurationPacket, attributes(var))]
-pub fn derive_clientbound_configuration_packet(input: TokenStream) -> TokenStream {
+#[proc_macro_derive(ClientboundConfigPacket, attributes(var))]
+pub fn derive_c_config_packet(input: TokenStream) -> TokenStream {
     as_packet_derive(
         input,
-        quote! {crate::packets::configuration::ClientboundConfigurationPacket},
+        quote! {crate::packets::config::ClientboundConfigPacket},
     )
 }
 
 #[derive(Debug)]
-struct PacketIdPair {
-    id: u32,
-    module: Ident,
-    name: Ident,
-}
-#[derive(Debug)]
-struct PacketIdMap {
-    packets: Vec<PacketIdPair>,
+struct PacketList {
+    packets: Vec<Ident>,
 }
 
-impl Parse for PacketIdMap {
+impl Parse for PacketList {
     fn parse(input: ParseStream) -> Result<Self> {
         let mut packets = vec![];
 
         // example:
-        // 0x0e: clientbound_change_difficulty_packet::ClientboundChangeDifficultyPacket,
-
-        // 0x0e
-        while let Ok(packet_id) = input.parse::<LitInt>() {
-            let packet_id = packet_id.base10_parse::<u32>()?;
-            // :
-            input.parse::<Token![:]>()?;
-            // clientbound_change_difficulty_packet
-            let module: Ident = input.parse()?;
-            // ::
-            input.parse::<Token![::]>()?;
-            // ClientboundChangeDifficultyPacket
-            let name: Ident = input.parse()?;
-
-            packets.push(PacketIdPair {
-                id: packet_id,
-                module,
-                name,
-            });
-
+        // change_difficulty,
+        // keep_alive,
+        while let Ok(packet_name) = input.parse::<Ident>() {
+            packets.push(packet_name);
             if input.parse::<Token![,]>().is_err() {
                 break;
             }
         }
 
-        Ok(PacketIdMap { packets })
+        Ok(PacketList { packets })
     }
 }
 
 #[derive(Debug)]
 struct DeclareStatePackets {
     name: Ident,
-    serverbound: PacketIdMap,
-    clientbound: PacketIdMap,
+    clientbound: PacketList,
+    serverbound: PacketList,
 }
 
 impl Parse for DeclareStatePackets {
@@ -163,31 +144,31 @@ impl Parse for DeclareStatePackets {
         let name = input.parse()?;
         input.parse::<Token![,]>()?;
 
-        let serverbound_token: Ident = input.parse()?;
-        if serverbound_token != "Serverbound" {
+        let clientbound_token: Ident = input.parse()?;
+        if clientbound_token != "Clientbound" {
             return Err(syn::Error::new(
-                serverbound_token.span(),
-                "Expected `Serverbound`",
+                clientbound_token.span(),
+                "Expected `Clientbound`",
             ));
         }
         input.parse::<Token![=>]>()?;
         let content;
-        braced!(content in input);
-        let serverbound = content.parse()?;
+        bracketed!(content in input);
+        let clientbound = content.parse()?;
 
         input.parse::<Token![,]>()?;
 
-        let clientbound_token: Ident = input.parse()?;
-        if clientbound_token != "Clientbound" {
+        let serverbound_token: Ident = input.parse()?;
+        if serverbound_token != "Serverbound" {
             return Err(syn::Error::new(
-                clientbound_token.span(),
-                "Expected `Clientbound`",
+                serverbound_token.span(),
+                "Expected `Serverbound`",
             ));
         }
         input.parse::<Token![=>]>()?;
         let content;
-        braced!(content in input);
-        let clientbound = content.parse()?;
+        bracketed!(content in input);
+        let serverbound = content.parse()?;
 
         Ok(DeclareStatePackets {
             name,
@@ -200,92 +181,111 @@ impl Parse for DeclareStatePackets {
 pub fn declare_state_packets(input: TokenStream) -> TokenStream {
     let input = parse_macro_input!(input as DeclareStatePackets);
 
-    let serverbound_state_name =
-        Ident::new(&format!("Serverbound{}", input.name), input.name.span());
     let clientbound_state_name =
         Ident::new(&format!("Clientbound{}", input.name), input.name.span());
+    let serverbound_state_name =
+        Ident::new(&format!("Serverbound{}", input.name), input.name.span());
 
     let state_name_litstr = syn::LitStr::new(&input.name.to_string(), input.name.span());
 
-    let has_serverbound_packets = !input.serverbound.packets.is_empty();
     let has_clientbound_packets = !input.clientbound.packets.is_empty();
+    let has_serverbound_packets = !input.serverbound.packets.is_empty();
 
-    let mut serverbound_enum_contents = quote!();
+    let mut mod_and_use_statements_contents = quote!();
     let mut clientbound_enum_contents = quote!();
-    let mut serverbound_id_match_contents = quote!();
+    let mut serverbound_enum_contents = quote!();
     let mut clientbound_id_match_contents = quote!();
-    let mut serverbound_write_match_contents = quote!();
+    let mut serverbound_id_match_contents = quote!();
     let mut clientbound_write_match_contents = quote!();
-    let mut serverbound_read_match_contents = quote!();
+    let mut serverbound_write_match_contents = quote!();
     let mut clientbound_read_match_contents = quote!();
+    let mut serverbound_read_match_contents = quote!();
 
-    for PacketIdPair { id, module, name } in input.serverbound.packets {
-        let variant_name = variant_name_from(&name);
+    for (id, packet_name) in input.clientbound.packets.iter().enumerate() {
+        let id = id as u32;
 
-        let name_litstr = syn::LitStr::new(&name.to_string(), name.span());
-        serverbound_enum_contents.extend(quote! {
-            #variant_name(#module::#name),
+        let struct_name = packet_name_to_struct_name(packet_name, "clientbound");
+        let module_name = packet_name_to_module_name(packet_name, "clientbound");
+        let variant_name = packet_name_to_variant_name(packet_name);
+        let packet_name_litstr = syn::LitStr::new(&packet_name.to_string(), packet_name.span());
+
+        mod_and_use_statements_contents.extend(quote! {
+            pub mod #module_name;
+            pub use #module_name::#struct_name;
         });
-        serverbound_id_match_contents.extend(quote! {
-            #serverbound_state_name::#variant_name(_packet) => #id,
+
+        clientbound_enum_contents.extend(quote! {
+            #variant_name(#module_name::#struct_name),
         });
-        serverbound_write_match_contents.extend(quote! {
-            #serverbound_state_name::#variant_name(packet) => packet.write(buf),
+        clientbound_id_match_contents.extend(quote! {
+            #clientbound_state_name::#variant_name(_packet) => #id,
         });
-        serverbound_read_match_contents.extend(quote! {
+        clientbound_write_match_contents.extend(quote! {
+            #clientbound_state_name::#variant_name(packet) => packet.write(buf),
+        });
+        clientbound_read_match_contents.extend(quote! {
             #id => {
-                let data = #module::#name::read(buf).map_err(|e| crate::read::ReadPacketError::Parse {
+                let data = #module_name::#struct_name::read(buf).map_err(|e| crate::read::ReadPacketError::Parse {
                     source: e,
                     packet_id: #id,
                     backtrace: Box::new(std::backtrace::Backtrace::capture()),
-                    packet_name: #name_litstr.to_string(),
+                    packet_name: #packet_name_litstr.to_string(),
                 })?;
                 #[cfg(debug_assertions)]
                 {
                     let mut leftover = Vec::new();
                     let _ = std::io::Read::read_to_end(buf, &mut leftover);
                     if !leftover.is_empty() {
-                        return Err(Box::new(crate::read::ReadPacketError::LeftoverData { packet_name: #name_litstr.to_string(), data: leftover }));
+                        return Err(
+                            Box::new(
+                                crate::read::ReadPacketError::LeftoverData {
+                                    packet_name: #packet_name_litstr.to_string(),
+                                    data: leftover
+                                }
+                            )
+                        );
                     }
                 }
                 data
             },
         });
     }
-    for PacketIdPair { id, module, name } in input.clientbound.packets {
-        let name_litstr = syn::LitStr::new(&name.to_string(), name.span());
-        let variant_name = variant_name_from(&name);
+    for (id, packet_name) in input.serverbound.packets.iter().enumerate() {
+        let id = id as u32;
 
-        clientbound_enum_contents.extend(quote! {
-            #variant_name(#module::#name),
+        let struct_name = packet_name_to_struct_name(packet_name, "serverbound");
+        let module_name = packet_name_to_module_name(packet_name, "serverbound");
+        let variant_name = packet_name_to_variant_name(packet_name);
+        let packet_name_litstr = syn::LitStr::new(&packet_name.to_string(), packet_name.span());
+
+        mod_and_use_statements_contents.extend(quote! {
+            pub mod #module_name;
+            pub use #module_name::#struct_name;
         });
-        clientbound_id_match_contents.extend(quote! {
-            #clientbound_state_name::#variant_name(_packet) => #id,
+
+        serverbound_enum_contents.extend(quote! {
+            #variant_name(#module_name::#struct_name),
         });
-        clientbound_write_match_contents.extend(quote! {
-            #clientbound_state_name::#variant_name(packet) => packet.write(buf),
+        serverbound_id_match_contents.extend(quote! {
+            #serverbound_state_name::#variant_name(_packet) => #id,
         });
-        clientbound_read_match_contents.extend(quote! {
+        serverbound_write_match_contents.extend(quote! {
+            #serverbound_state_name::#variant_name(packet) => packet.write(buf),
+        });
+        serverbound_read_match_contents.extend(quote! {
             #id => {
-                let data = #module::#name::read(buf).map_err(|e| crate::read::ReadPacketError::Parse {
+                let data = #module_name::#struct_name::read(buf).map_err(|e| crate::read::ReadPacketError::Parse {
                     source: e,
                     packet_id: #id,
                     backtrace: Box::new(std::backtrace::Backtrace::capture()),
-                    packet_name: #name_litstr.to_string(),
+                    packet_name: #packet_name_litstr.to_string(),
                 })?;
                 #[cfg(debug_assertions)]
                 {
                     let mut leftover = Vec::new();
                     let _ = std::io::Read::read_to_end(buf, &mut leftover);
                     if !leftover.is_empty() {
-                        return Err(
-                            Box::new(
-                                crate::read::ReadPacketError::LeftoverData {
-                                    packet_name: #name_litstr.to_string(),
-                                    data: leftover
-                                }
-                            )
-                        );
+                        return Err(Box::new(crate::read::ReadPacketError::LeftoverData { packet_name: #packet_name_litstr.to_string(), data: leftover }));
                     }
                 }
                 data
@@ -311,19 +311,21 @@ pub fn declare_state_packets(input: TokenStream) -> TokenStream {
     }
 
     let mut contents = quote! {
+        #mod_and_use_statements_contents
+
         #[derive(Clone, Debug)]
-        pub enum #serverbound_state_name
+        pub enum #clientbound_state_name
         where
-        Self: Sized,
+            Self: Sized,
         {
-            #serverbound_enum_contents
+            #clientbound_enum_contents
         }
         #[derive(Clone, Debug)]
-        pub enum #clientbound_state_name
+        pub enum #serverbound_state_name
         where
-            Self: Sized,
+        Self: Sized,
         {
-            #clientbound_enum_contents
+            #serverbound_enum_contents
         }
     };
 
@@ -356,6 +358,13 @@ pub fn declare_state_packets(input: TokenStream) -> TokenStream {
                 })
             }
         }
+
+        impl crate::packets::Packet<#serverbound_state_name> for #serverbound_state_name {
+            /// No-op, exists so you can pass a packet enum when a Packet<> is expected.
+            fn into_variant(self) -> #serverbound_state_name {
+                self
+            }
+        }
     });
 
     contents.extend(quote! {
@@ -400,8 +409,50 @@ fn variant_name_from(name: &syn::Ident) -> syn::Ident {
     } else if variant_name.starts_with("Serverbound") {
         variant_name = variant_name["Serverbound".len()..].to_string();
     }
-    if variant_name.ends_with("Packet") {
-        variant_name = variant_name[..variant_name.len() - "Packet".len()].to_string();
-    }
     syn::Ident::new(&variant_name, name.span())
 }
+
+fn packet_name_to_struct_name(name: &syn::Ident, direction: &str) -> syn::Ident {
+    let struct_name_snake = format!("{direction}_{name}");
+    let struct_name = to_camel_case(&struct_name_snake);
+    syn::Ident::new(&struct_name, name.span())
+}
+fn packet_name_to_module_name(name: &syn::Ident, direction: &str) -> syn::Ident {
+    let module_name_snake = format!("{}_{name}", direction.chars().next().unwrap());
+    let module_name = to_snake_case(&module_name_snake);
+    syn::Ident::new(&module_name, name.span())
+}
+fn packet_name_to_variant_name(name: &syn::Ident) -> syn::Ident {
+    let variant_name = to_camel_case(&name.to_string());
+    syn::Ident::new(&variant_name, name.span())
+}
+
+fn to_camel_case(snake_case: &str) -> String {
+    let mut camel_case = String::new();
+    let mut capitalize_next = true;
+    for c in snake_case.chars() {
+        if c == '_' {
+            capitalize_next = true;
+        } else {
+            if capitalize_next {
+                camel_case.push(c.to_ascii_uppercase());
+            } else {
+                camel_case.push(c);
+            }
+            capitalize_next = false;
+        }
+    }
+    camel_case
+}
+fn to_snake_case(camel_case: &str) -> String {
+    let mut snake_case = String::new();
+    for c in camel_case.chars() {
+        if c.is_ascii_uppercase() {
+            snake_case.push('_');
+            snake_case.push(c.to_ascii_lowercase());
+        } else {
+            snake_case.push(c);
+        }
+    }
+    snake_case
+}
diff --git a/azalea-protocol/examples/handshake_proxy.rs b/azalea-protocol/examples/handshake_proxy.rs
index 14e5115e1..7ff7eaae6 100644
--- a/azalea-protocol/examples/handshake_proxy.rs
+++ b/azalea-protocol/examples/handshake_proxy.rs
@@ -6,19 +6,17 @@ use std::{error::Error, sync::LazyLock};
 use azalea_protocol::{
     connect::Connection,
     packets::{
-        handshaking::{
-            client_intention_packet::ClientIntentionPacket, ClientboundHandshakePacket,
+        handshake::{
+            s_intention::ServerboundIntention, ClientboundHandshakePacket,
             ServerboundHandshakePacket,
         },
-        login::{serverbound_hello_packet::ServerboundHelloPacket, ServerboundLoginPacket},
+        login::{s_hello::ServerboundHello, ServerboundLoginPacket},
         status::{
-            clientbound_pong_response_packet::ClientboundPongResponsePacket,
-            clientbound_status_response_packet::{
-                ClientboundStatusResponsePacket, Players, Version,
-            },
+            c_pong_response::ClientboundPongResponse,
+            c_status_response::{ClientboundStatusResponse, Players, Version},
             ServerboundStatusPacket,
         },
-        ClientIntention, PROTOCOL_VERSION,
+        ClientIntention, PROTOCOL_VERSION, VERSION_NAME,
     },
     read::ReadPacketError,
 };
@@ -39,7 +37,7 @@ const PROXY_DESC: &str = "An Azalea Minecraft Proxy";
 static PROXY_FAVICON: LazyLock<Option<String>> = LazyLock::new(|| None);
 
 static PROXY_VERSION: LazyLock<Version> = LazyLock::new(|| Version {
-    name: "1.19.3".to_string(),
+    name: VERSION_NAME.to_string(),
     protocol: PROTOCOL_VERSION,
 });
 
@@ -75,7 +73,7 @@ async fn handle_connection(stream: TcpStream) -> anyhow::Result<()> {
     // the server or is going to join the game.
     let intent = match conn.read().await {
         Ok(packet) => match packet {
-            ServerboundHandshakePacket::ClientIntention(packet) => {
+            ServerboundHandshakePacket::Intention(packet) => {
                 info!(
                     "New connection: {0}, Version {1}, {2:?}",
                     ip.ip(),
@@ -101,21 +99,17 @@ async fn handle_connection(stream: TcpStream) -> anyhow::Result<()> {
                 match conn.read().await {
                     Ok(p) => match p {
                         ServerboundStatusPacket::StatusRequest(_) => {
-                            conn.write(
-                                ClientboundStatusResponsePacket {
-                                    description: PROXY_DESC.into(),
-                                    favicon: PROXY_FAVICON.clone(),
-                                    players: PROXY_PLAYERS.clone(),
-                                    version: PROXY_VERSION.clone(),
-                                    enforces_secure_chat: PROXY_SECURE_CHAT,
-                                }
-                                .get(),
-                            )
+                            conn.write(ClientboundStatusResponse {
+                                description: PROXY_DESC.into(),
+                                favicon: PROXY_FAVICON.clone(),
+                                players: PROXY_PLAYERS.clone(),
+                                version: PROXY_VERSION.clone(),
+                                enforces_secure_chat: PROXY_SECURE_CHAT,
+                            })
                             .await?;
                         }
                         ServerboundStatusPacket::PingRequest(p) => {
-                            conn.write(ClientboundPongResponsePacket { time: p.time }.get())
-                                .await?;
+                            conn.write(ClientboundPongResponse { time: p.time }).await?;
                             break;
                         }
                     },
@@ -179,8 +173,8 @@ async fn handle_connection(stream: TcpStream) -> anyhow::Result<()> {
 
 async fn transfer(
     mut inbound: TcpStream,
-    intent: ClientIntentionPacket,
-    hello: ServerboundHelloPacket,
+    intent: ServerboundIntention,
+    hello: ServerboundHello,
 ) -> Result<(), Box<dyn Error>> {
     let outbound = TcpStream::connect(PROXY_ADDR).await?;
     let name = hello.name.clone();
@@ -190,10 +184,10 @@ async fn transfer(
     // received earlier to the proxy target
     let mut outbound_conn: Connection<ClientboundHandshakePacket, ServerboundHandshakePacket> =
         Connection::wrap(outbound);
-    outbound_conn.write(intent.get()).await?;
+    outbound_conn.write(intent).await?;
 
     let mut outbound_conn = outbound_conn.login();
-    outbound_conn.write(hello.get()).await?;
+    outbound_conn.write(hello).await?;
 
     let mut outbound = outbound_conn.unwrap()?;
 
diff --git a/azalea-protocol/src/packets/configuration/serverbound_client_information_packet.rs b/azalea-protocol/src/common/client_information.rs
similarity index 63%
rename from azalea-protocol/src/packets/configuration/serverbound_client_information_packet.rs
rename to azalea-protocol/src/common/client_information.rs
index b5fd6a355..6f5e05e25 100644
--- a/azalea-protocol/src/packets/configuration/serverbound_client_information_packet.rs
+++ b/azalea-protocol/src/common/client_information.rs
@@ -1,17 +1,11 @@
-use azalea_buf::{McBuf, McBufReadable, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite};
 use azalea_core::bitset::FixedBitSet;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
 use bevy_ecs::component::Component;
 
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket, PartialEq, Eq)]
-pub struct ServerboundClientInformationPacket {
-    pub information: ClientInformation,
-}
-
 /// A component that contains some of the "settings" for this client that are
 /// sent to the server, such as render distance. This is only present on local
 /// players.
-#[derive(Clone, Debug, McBuf, PartialEq, Eq, Component)]
+#[derive(Clone, Debug, AzBuf, PartialEq, Eq, Component)]
 pub struct ClientInformation {
     /// The locale of the client.
     pub language: String,
@@ -49,7 +43,7 @@ impl Default for ClientInformation {
     }
 }
 
-#[derive(McBuf, Clone, Copy, Debug, PartialEq, Eq, Default)]
+#[derive(AzBuf, Clone, Copy, Debug, PartialEq, Eq, Default)]
 pub enum ChatVisibility {
     /// All chat messages should be sent to the client.
     #[default]
@@ -61,7 +55,7 @@ pub enum ChatVisibility {
     Hidden = 2,
 }
 
-#[derive(McBuf, Clone, Copy, Debug, PartialEq, Eq, Default)]
+#[derive(AzBuf, Clone, Copy, Debug, PartialEq, Eq, Default)]
 pub enum HumanoidArm {
     Left = 0,
     #[default]
@@ -79,7 +73,7 @@ pub struct ModelCustomization {
     pub hat: bool,
 }
 
-#[derive(McBuf, Clone, Copy, Debug, PartialEq, Eq, Default)]
+#[derive(AzBuf, Clone, Copy, Debug, PartialEq, Eq, Default)]
 pub enum ParticleStatus {
     #[default]
     All,
@@ -101,9 +95,9 @@ impl Default for ModelCustomization {
     }
 }
 
-impl McBufReadable for ModelCustomization {
-    fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
-        let set = FixedBitSet::<7>::read_from(buf)?;
+impl AzaleaRead for ModelCustomization {
+    fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+        let set = FixedBitSet::<7>::azalea_read(buf)?;
         Ok(Self {
             cape: set.index(0),
             jacket: set.index(1),
@@ -116,8 +110,8 @@ impl McBufReadable for ModelCustomization {
     }
 }
 
-impl McBufWritable for ModelCustomization {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ModelCustomization {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<7>::new();
         if self.cape {
             set.set(0);
@@ -140,7 +134,7 @@ impl McBufWritable for ModelCustomization {
         if self.hat {
             set.set(6);
         }
-        set.write_into(buf)
+        set.azalea_write(buf)
     }
 }
 
@@ -148,46 +142,46 @@ impl McBufWritable for ModelCustomization {
 mod tests {
     use std::io::Cursor;
 
+    use azalea_buf::{AzaleaRead, AzaleaWrite};
+
     use super::*;
 
     #[test]
-    fn test_client_information_packet() {
+    fn test_client_information() {
         {
             let data = ClientInformation::default();
             let mut buf = Vec::new();
-            data.write_into(&mut buf).unwrap();
+            data.azalea_write(&mut buf).unwrap();
             let mut data_cursor: Cursor<&[u8]> = Cursor::new(&buf);
 
-            let read_data = ClientInformation::read_from(&mut data_cursor).unwrap();
+            let read_data = ClientInformation::azalea_read(&mut data_cursor).unwrap();
             assert_eq!(read_data, data);
         }
 
-        {
-            let data = ClientInformation {
-                language: "en_gb".to_string(),
-                view_distance: 24,
-                chat_visibility: ChatVisibility::Hidden,
-                chat_colors: false,
-                model_customization: ModelCustomization {
-                    cape: false,
-                    jacket: false,
-                    left_sleeve: true,
-                    right_sleeve: false,
-                    left_pants: true,
-                    right_pants: false,
-                    hat: true,
-                },
-                main_hand: HumanoidArm::Left,
-                text_filtering_enabled: true,
-                allows_listing: true,
-                particle_status: ParticleStatus::Decreased,
-            };
-            let mut buf = Vec::new();
-            data.write_into(&mut buf).unwrap();
-            let mut data_cursor: Cursor<&[u8]> = Cursor::new(&buf);
-
-            let read_data = ClientInformation::read_from(&mut data_cursor).unwrap();
-            assert_eq!(read_data, data);
-        }
+        let data = ClientInformation {
+            language: "en_gb".to_string(),
+            view_distance: 24,
+            chat_visibility: ChatVisibility::Hidden,
+            chat_colors: false,
+            model_customization: ModelCustomization {
+                cape: false,
+                jacket: false,
+                left_sleeve: true,
+                right_sleeve: false,
+                left_pants: true,
+                right_pants: false,
+                hat: true,
+            },
+            main_hand: HumanoidArm::Left,
+            text_filtering_enabled: true,
+            allows_listing: true,
+            particle_status: ParticleStatus::Decreased,
+        };
+        let mut buf = Vec::new();
+        data.azalea_write(&mut buf).unwrap();
+        let mut data_cursor: Cursor<&[u8]> = Cursor::new(&buf);
+
+        let read_data = ClientInformation::azalea_read(&mut data_cursor).unwrap();
+        assert_eq!(read_data, data);
     }
 }
diff --git a/azalea-protocol/src/common/mod.rs b/azalea-protocol/src/common/mod.rs
new file mode 100644
index 000000000..da535b487
--- /dev/null
+++ b/azalea-protocol/src/common/mod.rs
@@ -0,0 +1,4 @@
+//! Some serializable data types that are used by several packets.
+
+pub mod client_information;
+pub mod server_links;
diff --git a/azalea-protocol/src/packets/game/clientbound_server_links_packet.rs b/azalea-protocol/src/common/server_links.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/clientbound_server_links_packet.rs
rename to azalea-protocol/src/common/server_links.rs
index 4b24a5196..4aed98f34 100644
--- a/azalea-protocol/src/packets/game/clientbound_server_links_packet.rs
+++ b/azalea-protocol/src/common/server_links.rs
@@ -1,25 +1,19 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundServerLinksPacket {
-    pub links: Vec<ServerLinkEntry>,
-}
-
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct ServerLinkEntry {
     pub kind: ServerLinkKind,
     pub link: String,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub enum ServerLinkKind {
     Known(KnownLinkKind),
     Component(FormattedText),
 }
 
-#[derive(Clone, Copy, Debug, McBuf)]
+#[derive(Clone, Copy, Debug, AzBuf)]
 pub enum KnownLinkKind {
     BugReport,
     CommunityGuidelines,
diff --git a/azalea-protocol/src/connect.rs b/azalea-protocol/src/connect.rs
index 0a449bfd7..f64d9eb82 100755
--- a/azalea-protocol/src/connect.rs
+++ b/azalea-protocol/src/connect.rs
@@ -16,12 +16,10 @@ use tokio::net::TcpStream;
 use tracing::{error, info};
 use uuid::Uuid;
 
-use crate::packets::configuration::{
-    ClientboundConfigurationPacket, ServerboundConfigurationPacket,
-};
+use crate::packets::config::{ClientboundConfigPacket, ServerboundConfigPacket};
 use crate::packets::game::{ClientboundGamePacket, ServerboundGamePacket};
-use crate::packets::handshaking::{ClientboundHandshakePacket, ServerboundHandshakePacket};
-use crate::packets::login::clientbound_hello_packet::ClientboundHelloPacket;
+use crate::packets::handshake::{ClientboundHandshakePacket, ServerboundHandshakePacket};
+use crate::packets::login::c_hello::ClientboundHello;
 use crate::packets::login::{ClientboundLoginPacket, ServerboundLoginPacket};
 use crate::packets::status::{ClientboundStatusPacket, ServerboundStatusPacket};
 use crate::packets::ProtocolPacket;
@@ -66,10 +64,10 @@ pub struct WriteConnection<W: ProtocolPacket> {
 ///         ClientIntention, PROTOCOL_VERSION,
 ///         login::{
 ///             ClientboundLoginPacket,
-///             serverbound_hello_packet::ServerboundHelloPacket,
-///             serverbound_key_packet::ServerboundKeyPacket
+///             ServerboundHello,
+///             ServerboundKey
 ///         },
-///         handshaking::client_intention_packet::ClientIntentionPacket
+///         handshake::ServerboundIntention
 ///     }
 /// };
 ///
@@ -79,28 +77,20 @@ pub struct WriteConnection<W: ProtocolPacket> {
 ///     let mut conn = Connection::new(&resolved_address).await?;
 ///
 ///     // handshake
-///     conn.write(
-///         ClientIntentionPacket {
-///             protocol_version: PROTOCOL_VERSION,
-///             hostname: resolved_address.ip().to_string(),
-///             port: resolved_address.port(),
-///             intention: ClientIntention::Login,
-///         }
-///         .get(),
-///     )
-///     .await?;
+///     conn.write(ServerboundIntention {
+///         protocol_version: PROTOCOL_VERSION,
+///         hostname: resolved_address.ip().to_string(),
+///         port: resolved_address.port(),
+///         intention: ClientIntention::Login,
+///     }).await?;
 ///
 ///     let mut conn = conn.login();
 ///
 ///     // login
-///     conn.write(
-///         ServerboundHelloPacket {
-///             name: "bot".to_string(),
-///             profile_id: uuid::Uuid::nil(),
-///         }
-///         .get(),
-///     )
-///     .await?;
+///     conn.write(ServerboundHello {
+///         name: "bot".to_string(),
+///         profile_id: uuid::Uuid::nil(),
+///     }).await?;
 ///
 ///     let (conn, game_profile) = loop {
 ///         let packet = conn.read().await?;
@@ -108,14 +98,10 @@ pub struct WriteConnection<W: ProtocolPacket> {
 ///             ClientboundLoginPacket::Hello(p) => {
 ///                 let e = azalea_crypto::encrypt(&p.public_key, &p.challenge).unwrap();
 ///
-///                 conn.write(
-///                     ServerboundKeyPacket {
-///                         key_bytes: e.encrypted_public_key,
-///                         encrypted_challenge: e.encrypted_challenge,
-///                     }
-///                     .get(),
-///                 )
-///                 .await?;
+///                 conn.write(ServerboundKey {
+///                     key_bytes: e.encrypted_public_key,
+///                     encrypted_challenge: e.encrypted_challenge,
+///                 }).await?;
 ///                 conn.set_encryption_key(e.secret_key);
 ///             }
 ///             ClientboundLoginPacket::LoginCompression(p) => {
@@ -243,7 +229,8 @@ where
     }
 
     /// Write a packet to the other side of the connection.
-    pub async fn write(&mut self, packet: W) -> std::io::Result<()> {
+    pub async fn write(&mut self, packet: impl crate::packets::Packet<W>) -> std::io::Result<()> {
+        let packet = packet.into_variant();
         self.writer.write(packet).await
     }
 
@@ -368,9 +355,7 @@ impl Connection<ClientboundLoginPacket, ServerboundLoginPacket> {
     /// Change our state from login to configuration. This is the state where
     /// the server sends us the registries and resource pack and stuff.
     #[must_use]
-    pub fn configuration(
-        self,
-    ) -> Connection<ClientboundConfigurationPacket, ServerboundConfigurationPacket> {
+    pub fn configuration(self) -> Connection<ClientboundConfigPacket, ServerboundConfigPacket> {
         Connection::from(self)
     }
 
@@ -385,7 +370,7 @@ impl Connection<ClientboundLoginPacket, ServerboundLoginPacket> {
     /// use azalea_protocol::connect::Connection;
     /// use azalea_protocol::packets::login::{
     ///     ClientboundLoginPacket,
-    ///     serverbound_key_packet::ServerboundKeyPacket
+    ///     ServerboundKey
     /// };
     /// use uuid::Uuid;
     /// # use azalea_protocol::ServerAddress;
@@ -414,12 +399,10 @@ impl Connection<ClientboundLoginPacket, ServerboundLoginPacket> {
     ///             e.secret_key,
     ///             &p
     ///         ).await?;
-    ///         conn.write(
-    ///             ServerboundKeyPacket {
-    ///                 key_bytes: e.encrypted_public_key,
-    ///                 encrypted_challenge: e.encrypted_challenge,
-    ///             }.get()
-    ///         ).await?;
+    ///         conn.write(ServerboundKey {
+    ///             key_bytes: e.encrypted_public_key,
+    ///             encrypted_challenge: e.encrypted_challenge,
+    ///         }).await?;
     ///         conn.set_encryption_key(e.secret_key);
     ///     }
     ///     _ => {}
@@ -432,7 +415,7 @@ impl Connection<ClientboundLoginPacket, ServerboundLoginPacket> {
         access_token: &str,
         uuid: &Uuid,
         private_key: [u8; 16],
-        packet: &ClientboundHelloPacket,
+        packet: &ClientboundHello,
     ) -> Result<(), ClientSessionServerError> {
         azalea_auth::sessionserver::join(
             access_token,
@@ -506,14 +489,12 @@ impl Connection<ServerboundLoginPacket, ClientboundLoginPacket> {
 
     /// Change our state back to configuration.
     #[must_use]
-    pub fn configuration(
-        self,
-    ) -> Connection<ServerboundConfigurationPacket, ClientboundConfigurationPacket> {
+    pub fn configuration(self) -> Connection<ServerboundConfigPacket, ClientboundConfigPacket> {
         Connection::from(self)
     }
 }
 
-impl Connection<ServerboundConfigurationPacket, ClientboundConfigurationPacket> {
+impl Connection<ServerboundConfigPacket, ClientboundConfigPacket> {
     /// Change our state from configuration to game. This is the state that's
     /// used when the client is actually in the world.
     #[must_use]
@@ -522,7 +503,7 @@ impl Connection<ServerboundConfigurationPacket, ClientboundConfigurationPacket>
     }
 }
 
-impl Connection<ClientboundConfigurationPacket, ServerboundConfigurationPacket> {
+impl Connection<ClientboundConfigPacket, ServerboundConfigPacket> {
     /// Change our state from configuration to game. This is the state that's
     /// used when the client is actually in the world.
     #[must_use]
@@ -534,9 +515,7 @@ impl Connection<ClientboundConfigurationPacket, ServerboundConfigurationPacket>
 impl Connection<ClientboundGamePacket, ServerboundGamePacket> {
     /// Change our state back to configuration.
     #[must_use]
-    pub fn configuration(
-        self,
-    ) -> Connection<ClientboundConfigurationPacket, ServerboundConfigurationPacket> {
+    pub fn configuration(self) -> Connection<ClientboundConfigPacket, ServerboundConfigPacket> {
         Connection::from(self)
     }
 }
diff --git a/azalea-protocol/src/lib.rs b/azalea-protocol/src/lib.rs
index 1bbb80d40..fb271433a 100644
--- a/azalea-protocol/src/lib.rs
+++ b/azalea-protocol/src/lib.rs
@@ -14,6 +14,7 @@
 
 use std::{fmt::Display, net::SocketAddr, str::FromStr};
 
+pub mod common;
 #[cfg(feature = "connecting")]
 pub mod connect;
 #[cfg(feature = "packets")]
@@ -108,8 +109,9 @@ mod tests {
 
     use crate::{
         packets::{
-            game::serverbound_chat_packet::{LastSeenMessagesUpdate, ServerboundChatPacket},
-            login::{serverbound_hello_packet::ServerboundHelloPacket, ServerboundLoginPacket},
+            game::s_chat::{LastSeenMessagesUpdate, ServerboundChat},
+            login::{s_hello::ServerboundHello, ServerboundLoginPacket},
+            Packet,
         },
         read::{compression_decoder, read_packet},
         write::{compression_encoder, serialize_packet, write_packet},
@@ -117,13 +119,12 @@ mod tests {
 
     #[tokio::test]
     async fn test_hello_packet() {
-        let packet = ServerboundHelloPacket {
+        let packet = ServerboundHello {
             name: "test".to_string(),
             profile_id: Uuid::nil(),
-        }
-        .get();
+        };
         let mut stream = Vec::new();
-        write_packet(&packet, &mut stream, None, &mut None)
+        write_packet(&packet.into_variant(), &mut stream, None, &mut None)
             .await
             .unwrap();
 
@@ -141,11 +142,11 @@ mod tests {
 
     #[tokio::test]
     async fn test_double_hello_packet() {
-        let packet = ServerboundHelloPacket {
+        let packet = ServerboundHello {
             name: "test".to_string(),
             profile_id: Uuid::nil(),
         }
-        .get();
+        .into_variant();
         let mut stream = Vec::new();
         write_packet(&packet, &mut stream, None, &mut None)
             .await
@@ -170,14 +171,14 @@ mod tests {
         let compression_threshold = 256;
 
         let buf = serialize_packet(
-            &ServerboundChatPacket {
+            &ServerboundChat {
                 message: "a".repeat(256),
                 timestamp: 0,
                 salt: 0,
                 signature: None,
                 last_seen_messages: LastSeenMessagesUpdate::default(),
             }
-            .get(),
+            .into_variant(),
         )
         .unwrap();
 
diff --git a/azalea-protocol/src/packets/common.rs b/azalea-protocol/src/packets/common.rs
index 173e15fc0..fc78cd7a5 100644
--- a/azalea-protocol/src/packets/common.rs
+++ b/azalea-protocol/src/packets/common.rs
@@ -1,11 +1,11 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::{
     game_type::{GameMode, OptionalGameType},
     position::GlobalPos,
     resource_location::ResourceLocation,
 };
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct CommonPlayerSpawnInfo {
     pub dimension_type: azalea_registry::DimensionType,
     pub dimension: ResourceLocation,
diff --git a/azalea-protocol/src/packets/config/c_cookie_request.rs b/azalea-protocol/src/packets/config/c_cookie_request.rs
new file mode 100644
index 000000000..4c57718db
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_cookie_request.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundCookieRequest {
+    pub key: ResourceLocation,
+}
diff --git a/azalea-protocol/src/packets/config/c_custom_payload.rs b/azalea-protocol/src/packets/config/c_custom_payload.rs
new file mode 100644
index 000000000..3432ac3a5
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_custom_payload.rs
@@ -0,0 +1,10 @@
+use azalea_buf::AzBuf;
+use azalea_buf::UnsizedByteArray;
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundCustomPayload {
+    pub identifier: ResourceLocation,
+    pub data: UnsizedByteArray,
+}
diff --git a/azalea-protocol/src/packets/config/c_custom_report_details.rs b/azalea-protocol/src/packets/config/c_custom_report_details.rs
new file mode 100644
index 000000000..5fa375d04
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_custom_report_details.rs
@@ -0,0 +1,9 @@
+use std::collections::HashMap;
+
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundCustomReportDetails {
+    pub details: HashMap<String, String>,
+}
diff --git a/azalea-protocol/src/packets/config/c_disconnect.rs b/azalea-protocol/src/packets/config/c_disconnect.rs
new file mode 100644
index 000000000..b59b318d4
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_disconnect.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_chat::FormattedText;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundDisconnect {
+    pub reason: FormattedText,
+}
diff --git a/azalea-protocol/src/packets/config/c_finish_configuration.rs b/azalea-protocol/src/packets/config/c_finish_configuration.rs
new file mode 100644
index 000000000..e3f3e5a59
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_finish_configuration.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundFinishConfiguration {}
diff --git a/azalea-protocol/src/packets/config/c_keep_alive.rs b/azalea-protocol/src/packets/config/c_keep_alive.rs
new file mode 100644
index 000000000..f0310c348
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_keep_alive.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundKeepAlive {
+    pub id: u64,
+}
diff --git a/azalea-protocol/src/packets/config/c_ping.rs b/azalea-protocol/src/packets/config/c_ping.rs
new file mode 100644
index 000000000..35b5c39cc
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_ping.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundPing {
+    pub id: u32,
+}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs b/azalea-protocol/src/packets/config/c_registry_data.rs
similarity index 54%
rename from azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs
rename to azalea-protocol/src/packets/config/c_registry_data.rs
index 8bada6cad..185de4c36 100644
--- a/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs
+++ b/azalea-protocol/src/packets/config/c_registry_data.rs
@@ -1,12 +1,12 @@
 use std::collections::HashMap;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
+use azalea_protocol_macros::ClientboundConfigPacket;
 use simdnbt::owned::NbtCompound;
 
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundRegistryDataPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundRegistryData {
     pub registry_id: ResourceLocation,
     pub entries: HashMap<ResourceLocation, Option<NbtCompound>>,
 }
diff --git a/azalea-protocol/src/packets/config/c_reset_chat.rs b/azalea-protocol/src/packets/config/c_reset_chat.rs
new file mode 100644
index 000000000..273cb0fd6
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_reset_chat.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundResetChat;
diff --git a/azalea-protocol/src/packets/config/c_resource_pack.rs b/azalea-protocol/src/packets/config/c_resource_pack.rs
new file mode 100644
index 000000000..63a59b5ba
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_resource_pack.rs
@@ -0,0 +1,11 @@
+use azalea_buf::AzBuf;
+use azalea_chat::FormattedText;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundResourcePack {
+    pub url: String,
+    pub hash: String,
+    pub required: bool,
+    pub prompt: Option<FormattedText>,
+}
diff --git a/azalea-protocol/src/packets/config/c_resource_pack_pop.rs b/azalea-protocol/src/packets/config/c_resource_pack_pop.rs
new file mode 100644
index 000000000..f949a7267
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_resource_pack_pop.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+use uuid::Uuid;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundResourcePackPop {
+    pub id: Option<Uuid>,
+}
diff --git a/azalea-protocol/src/packets/config/c_resource_pack_push.rs b/azalea-protocol/src/packets/config/c_resource_pack_push.rs
new file mode 100644
index 000000000..6be5c7096
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_resource_pack_push.rs
@@ -0,0 +1,13 @@
+use azalea_buf::AzBuf;
+use azalea_chat::FormattedText;
+use azalea_protocol_macros::ClientboundConfigPacket;
+use uuid::Uuid;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundResourcePackPush {
+    pub id: Uuid,
+    pub url: String,
+    pub hash: String,
+    pub required: bool,
+    pub prompt: Option<FormattedText>,
+}
diff --git a/azalea-protocol/src/packets/config/c_select_known_packs.rs b/azalea-protocol/src/packets/config/c_select_known_packs.rs
new file mode 100644
index 000000000..6a4f76db1
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_select_known_packs.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+use super::s_select_known_packs::KnownPack;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundSelectKnownPacks {
+    pub known_packs: Vec<KnownPack>,
+}
diff --git a/azalea-protocol/src/packets/config/c_server_links.rs b/azalea-protocol/src/packets/config/c_server_links.rs
new file mode 100644
index 000000000..3420e5920
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_server_links.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+use crate::common::server_links::ServerLinkEntry;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundServerLinks {
+    pub links: Vec<ServerLinkEntry>,
+}
diff --git a/azalea-protocol/src/packets/config/c_store_cookie.rs b/azalea-protocol/src/packets/config/c_store_cookie.rs
new file mode 100644
index 000000000..c52211ea2
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_store_cookie.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundStoreCookie {
+    pub key: ResourceLocation,
+    pub payload: Vec<u8>,
+}
diff --git a/azalea-protocol/src/packets/config/c_transfer.rs b/azalea-protocol/src/packets/config/c_transfer.rs
new file mode 100644
index 000000000..332421d87
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_transfer.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundTransfer {
+    pub host: String,
+    #[var]
+    pub port: u32,
+}
diff --git a/azalea-protocol/src/packets/config/c_update_enabled_features.rs b/azalea-protocol/src/packets/config/c_update_enabled_features.rs
new file mode 100644
index 000000000..4529c7577
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_update_enabled_features.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundUpdateEnabledFeatures {
+    pub features: Vec<ResourceLocation>,
+}
diff --git a/azalea-protocol/src/packets/config/c_update_tags.rs b/azalea-protocol/src/packets/config/c_update_tags.rs
new file mode 100644
index 000000000..678a5ccf5
--- /dev/null
+++ b/azalea-protocol/src/packets/config/c_update_tags.rs
@@ -0,0 +1,74 @@
+use std::io::Cursor;
+use std::ops::Deref;
+use std::{collections::HashMap, io::Write};
+
+use azalea_buf::{AzBuf, AzaleaReadVar, AzaleaWriteVar, BufReadError};
+use azalea_buf::{AzaleaRead, AzaleaWrite};
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ClientboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
+pub struct ClientboundUpdateTags {
+    pub tags: TagMap,
+}
+
+#[derive(Clone, Debug)]
+pub struct Tags {
+    pub name: ResourceLocation,
+    pub elements: Vec<i32>,
+}
+
+#[derive(Clone, Debug)]
+pub struct TagMap(pub HashMap<ResourceLocation, Vec<Tags>>);
+
+impl AzaleaRead for TagMap {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let length = u32::azalea_read_var(buf)? as usize;
+        let mut data = HashMap::with_capacity(length);
+        for _ in 0..length {
+            let tag_type = ResourceLocation::azalea_read(buf)?;
+            let tags_count = i32::azalea_read_var(buf)? as usize;
+            let mut tags_vec = Vec::with_capacity(tags_count);
+            for _ in 0..tags_count {
+                let tags = Tags::azalea_read(buf)?;
+                tags_vec.push(tags);
+            }
+            data.insert(tag_type, tags_vec);
+        }
+        Ok(TagMap(data))
+    }
+}
+
+impl AzaleaWrite for TagMap {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        (self.len() as u32).azalea_write_var(buf)?;
+        for (k, v) in &self.0 {
+            k.azalea_write(buf)?;
+            v.azalea_write(buf)?;
+        }
+        Ok(())
+    }
+}
+impl AzaleaRead for Tags {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let name = ResourceLocation::azalea_read(buf)?;
+        let elements = Vec::<i32>::azalea_read_var(buf)?;
+        Ok(Tags { name, elements })
+    }
+}
+
+impl AzaleaWrite for Tags {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.name.azalea_write(buf)?;
+        self.elements.azalea_write_var(buf)?;
+        Ok(())
+    }
+}
+
+impl Deref for TagMap {
+    type Target = HashMap<ResourceLocation, Vec<Tags>>;
+
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
diff --git a/azalea-protocol/src/packets/config/mod.rs b/azalea-protocol/src/packets/config/mod.rs
new file mode 100755
index 000000000..4eda0f039
--- /dev/null
+++ b/azalea-protocol/src/packets/config/mod.rs
@@ -0,0 +1,36 @@
+// NOTE: This file is generated automatically by codegen/packet.py.
+// Don't edit it directly!
+
+use azalea_protocol_macros::declare_state_packets;
+
+declare_state_packets!(ConfigPacket,
+    Clientbound => [
+        cookie_request,
+        custom_payload,
+        disconnect,
+        finish_configuration,
+        keep_alive,
+        ping,
+        reset_chat,
+        registry_data,
+        resource_pack_pop,
+        resource_pack_push,
+        store_cookie,
+        transfer,
+        update_enabled_features,
+        update_tags,
+        select_known_packs,
+        custom_report_details,
+        server_links,
+    ],
+    Serverbound => [
+        client_information,
+        cookie_response,
+        custom_payload,
+        finish_configuration,
+        keep_alive,
+        pong,
+        resource_pack,
+        select_known_packs,
+    ]
+);
diff --git a/azalea-protocol/src/packets/config/s_client_information.rs b/azalea-protocol/src/packets/config/s_client_information.rs
new file mode 100644
index 000000000..d58ce5022
--- /dev/null
+++ b/azalea-protocol/src/packets/config/s_client_information.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundConfigPacket;
+
+use crate::common::client_information::ClientInformation;
+
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket, PartialEq, Eq)]
+pub struct ServerboundClientInformation {
+    pub information: ClientInformation,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/config/s_cookie_response.rs
similarity index 59%
rename from azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs
rename to azalea-protocol/src/packets/config/s_cookie_response.rs
index 8ad0f07ee..e932352f5 100644
--- a/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs
+++ b/azalea-protocol/src/packets/config/s_cookie_response.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ServerboundGamePacket;
+use azalea_protocol_macros::ServerboundConfigPacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundCookieResponsePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
+pub struct ServerboundCookieResponse {
     pub key: ResourceLocation,
     pub payload: Option<Vec<u8>>,
 }
diff --git a/azalea-protocol/src/packets/game/serverbound_custom_payload_packet.rs b/azalea-protocol/src/packets/config/s_custom_payload.rs
old mode 100755
new mode 100644
similarity index 64%
rename from azalea-protocol/src/packets/game/serverbound_custom_payload_packet.rs
rename to azalea-protocol/src/packets/config/s_custom_payload.rs
index d5d46627b..f480985d1
--- a/azalea-protocol/src/packets/game/serverbound_custom_payload_packet.rs
+++ b/azalea-protocol/src/packets/config/s_custom_payload.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_buf::UnsizedByteArray;
 use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ServerboundGamePacket;
+use azalea_protocol_macros::ServerboundConfigPacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundCustomPayloadPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
+pub struct ServerboundCustomPayload {
     pub identifier: ResourceLocation,
     pub data: UnsizedByteArray,
 }
diff --git a/azalea-protocol/src/packets/config/s_finish_configuration.rs b/azalea-protocol/src/packets/config/s_finish_configuration.rs
new file mode 100644
index 000000000..a4d94fb19
--- /dev/null
+++ b/azalea-protocol/src/packets/config/s_finish_configuration.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
+pub struct ServerboundFinishConfiguration {}
diff --git a/azalea-protocol/src/packets/config/s_keep_alive.rs b/azalea-protocol/src/packets/config/s_keep_alive.rs
new file mode 100644
index 000000000..1986a4eba
--- /dev/null
+++ b/azalea-protocol/src/packets/config/s_keep_alive.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
+pub struct ServerboundKeepAlive {
+    pub id: u64,
+}
diff --git a/azalea-protocol/src/packets/config/s_pong.rs b/azalea-protocol/src/packets/config/s_pong.rs
new file mode 100644
index 000000000..50c012dd7
--- /dev/null
+++ b/azalea-protocol/src/packets/config/s_pong.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
+pub struct ServerboundPong {
+    pub id: u32,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_resource_pack_packet.rs b/azalea-protocol/src/packets/config/s_resource_pack.rs
old mode 100755
new mode 100644
similarity index 64%
rename from azalea-protocol/src/packets/game/serverbound_resource_pack_packet.rs
rename to azalea-protocol/src/packets/config/s_resource_pack.rs
index f285707b2..0822c7230
--- a/azalea-protocol/src/packets/game/serverbound_resource_pack_packet.rs
+++ b/azalea-protocol/src/packets/config/s_resource_pack.rs
@@ -1,14 +1,14 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundConfigPacket;
 use uuid::Uuid;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundResourcePackPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
+pub struct ServerboundResourcePack {
     pub id: Uuid,
     pub action: Action,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Action {
     SuccessfullyLoaded = 0,
     Declined = 1,
diff --git a/azalea-protocol/src/packets/config/s_select_known_packs.rs b/azalea-protocol/src/packets/config/s_select_known_packs.rs
new file mode 100644
index 000000000..320b5ca5d
--- /dev/null
+++ b/azalea-protocol/src/packets/config/s_select_known_packs.rs
@@ -0,0 +1,14 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundConfigPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
+pub struct ServerboundSelectKnownPacks {
+    pub known_packs: Vec<KnownPack>,
+}
+
+#[derive(Clone, Debug, AzBuf)]
+pub struct KnownPack {
+    pub namespace: String,
+    pub id: String,
+    pub version: String,
+}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs
deleted file mode 100644
index 38566564a..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundCookieRequestPacket {
-    pub key: ResourceLocation,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_custom_payload_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_custom_payload_packet.rs
deleted file mode 100644
index 701a317c4..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_custom_payload_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_buf::UnsizedByteArray;
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundCustomPayloadPacket {
-    pub identifier: ResourceLocation,
-    pub data: UnsizedByteArray,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_disconnect_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_disconnect_packet.rs
deleted file mode 100644
index cd0ed42ab..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_disconnect_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundDisconnectPacket {
-    pub reason: FormattedText,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_finish_configuration_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_finish_configuration_packet.rs
deleted file mode 100644
index 812511088..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_finish_configuration_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundFinishConfigurationPacket {}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_keep_alive_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_keep_alive_packet.rs
deleted file mode 100644
index 83c256105..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_keep_alive_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundKeepAlivePacket {
-    pub id: u64,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_ping_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_ping_packet.rs
deleted file mode 100644
index 968dcaed9..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_ping_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundPingPacket {
-    pub id: u32,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs
deleted file mode 100644
index 75afa8c12..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundResetChatPacket;
diff --git a/azalea-protocol/src/packets/configuration/clientbound_resource_pack_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_resource_pack_packet.rs
deleted file mode 100644
index b05210b54..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_resource_pack_packet.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundResourcePackPacket {
-    pub url: String,
-    pub hash: String,
-    pub required: bool,
-    pub prompt: Option<FormattedText>,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_resource_pack_pop_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_resource_pack_pop_packet.rs
deleted file mode 100644
index 6533b589b..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_resource_pack_pop_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-use uuid::Uuid;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundResourcePackPopPacket {
-    pub id: Option<Uuid>,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_resource_pack_push_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_resource_pack_push_packet.rs
deleted file mode 100644
index 798f5f98f..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_resource_pack_push_packet.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-use uuid::Uuid;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundResourcePackPushPacket {
-    pub id: Uuid,
-    pub url: String,
-    pub hash: String,
-    pub required: bool,
-    pub prompt: Option<FormattedText>,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs
deleted file mode 100644
index 0f22b0547..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-use super::serverbound_select_known_packs_packet::KnownPack;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundSelectKnownPacksPacket {
-    pub known_packs: Vec<KnownPack>,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs
deleted file mode 100644
index fda166896..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundStoreCookiePacket {
-    pub key: ResourceLocation,
-    pub payload: Vec<u8>,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs
deleted file mode 100644
index 88f0054a8..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundTransferPacket {
-    pub host: String,
-    #[var]
-    pub port: u32,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_update_enabled_features_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_update_enabled_features_packet.rs
deleted file mode 100644
index ec37c8f30..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_update_enabled_features_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundUpdateEnabledFeaturesPacket {
-    pub features: Vec<ResourceLocation>,
-}
diff --git a/azalea-protocol/src/packets/configuration/clientbound_update_tags_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_update_tags_packet.rs
deleted file mode 100644
index 10f66e23f..000000000
--- a/azalea-protocol/src/packets/configuration/clientbound_update_tags_packet.rs
+++ /dev/null
@@ -1,74 +0,0 @@
-use std::io::Cursor;
-use std::ops::Deref;
-use std::{collections::HashMap, io::Write};
-
-use azalea_buf::{BufReadError, McBuf, McBufVarReadable, McBufVarWritable};
-use azalea_buf::{McBufReadable, McBufWritable};
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ClientboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)]
-pub struct ClientboundUpdateTagsPacket {
-    pub tags: TagMap,
-}
-
-#[derive(Clone, Debug)]
-pub struct Tags {
-    pub name: ResourceLocation,
-    pub elements: Vec<i32>,
-}
-
-#[derive(Clone, Debug)]
-pub struct TagMap(pub HashMap<ResourceLocation, Vec<Tags>>);
-
-impl McBufReadable for TagMap {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let length = u32::var_read_from(buf)? as usize;
-        let mut data = HashMap::with_capacity(length);
-        for _ in 0..length {
-            let tag_type = ResourceLocation::read_from(buf)?;
-            let tags_count = i32::var_read_from(buf)? as usize;
-            let mut tags_vec = Vec::with_capacity(tags_count);
-            for _ in 0..tags_count {
-                let tags = Tags::read_from(buf)?;
-                tags_vec.push(tags);
-            }
-            data.insert(tag_type, tags_vec);
-        }
-        Ok(TagMap(data))
-    }
-}
-
-impl McBufWritable for TagMap {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        (self.len() as u32).var_write_into(buf)?;
-        for (k, v) in &self.0 {
-            k.write_into(buf)?;
-            v.write_into(buf)?;
-        }
-        Ok(())
-    }
-}
-impl McBufReadable for Tags {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let name = ResourceLocation::read_from(buf)?;
-        let elements = Vec::<i32>::var_read_from(buf)?;
-        Ok(Tags { name, elements })
-    }
-}
-
-impl McBufWritable for Tags {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.name.write_into(buf)?;
-        self.elements.var_write_into(buf)?;
-        Ok(())
-    }
-}
-
-impl Deref for TagMap {
-    type Target = HashMap<ResourceLocation, Vec<Tags>>;
-
-    fn deref(&self) -> &Self::Target {
-        &self.0
-    }
-}
diff --git a/azalea-protocol/src/packets/configuration/mod.rs b/azalea-protocol/src/packets/configuration/mod.rs
deleted file mode 100755
index 757c496c2..000000000
--- a/azalea-protocol/src/packets/configuration/mod.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-pub mod clientbound_cookie_request_packet;
-pub mod clientbound_custom_payload_packet;
-pub mod clientbound_disconnect_packet;
-pub mod clientbound_finish_configuration_packet;
-pub mod clientbound_keep_alive_packet;
-pub mod clientbound_ping_packet;
-pub mod clientbound_registry_data_packet;
-pub mod clientbound_reset_chat_packet;
-pub mod clientbound_resource_pack_pop_packet;
-pub mod clientbound_resource_pack_push_packet;
-pub mod clientbound_select_known_packs_packet;
-pub mod clientbound_store_cookie_packet;
-pub mod clientbound_transfer_packet;
-pub mod clientbound_update_enabled_features_packet;
-pub mod clientbound_update_tags_packet;
-pub mod serverbound_client_information_packet;
-pub mod serverbound_cookie_response_packet;
-pub mod serverbound_custom_payload_packet;
-pub mod serverbound_finish_configuration_packet;
-pub mod serverbound_keep_alive_packet;
-pub mod serverbound_pong_packet;
-pub mod serverbound_resource_pack_packet;
-pub mod serverbound_select_known_packs_packet;
-
-use azalea_protocol_macros::declare_state_packets;
-
-declare_state_packets!(
-    ConfigurationPacket,
-    Serverbound => {
-        0x00: serverbound_client_information_packet::ServerboundClientInformationPacket,
-        0x01: serverbound_cookie_response_packet::ServerboundCookieResponsePacket,
-        0x02: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket,
-        0x03: serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket,
-        0x04: serverbound_keep_alive_packet::ServerboundKeepAlivePacket,
-        0x05: serverbound_pong_packet::ServerboundPongPacket,
-        0x06: serverbound_resource_pack_packet::ServerboundResourcePackPacket,
-        0x07: serverbound_select_known_packs_packet::ServerboundSelectKnownPacksPacket,
-    },
-    Clientbound => {
-        0x00: clientbound_cookie_request_packet::ClientboundCookieRequestPacket,
-        0x01: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket,
-        0x02: clientbound_disconnect_packet::ClientboundDisconnectPacket,
-        0x03: clientbound_finish_configuration_packet::ClientboundFinishConfigurationPacket,
-        0x04: clientbound_keep_alive_packet::ClientboundKeepAlivePacket,
-        0x05: clientbound_ping_packet::ClientboundPingPacket,
-        0x06: clientbound_reset_chat_packet::ClientboundResetChatPacket,
-        0x07: clientbound_registry_data_packet::ClientboundRegistryDataPacket,
-        0x08: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket,
-        0x09: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket,
-        0x0a: clientbound_store_cookie_packet::ClientboundStoreCookiePacket,
-        0x0b: clientbound_transfer_packet::ClientboundTransferPacket,
-        0x0c: clientbound_update_enabled_features_packet::ClientboundUpdateEnabledFeaturesPacket,
-        0x0d: clientbound_update_tags_packet::ClientboundUpdateTagsPacket,
-        0x0e: clientbound_select_known_packs_packet::ClientboundSelectKnownPacksPacket,
-    }
-);
diff --git a/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs
deleted file mode 100644
index 6c62c1c8b..000000000
--- a/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)]
-pub struct ServerboundCookieResponsePacket {
-    pub key: ResourceLocation,
-    pub payload: Option<Vec<u8>>,
-}
diff --git a/azalea-protocol/src/packets/configuration/serverbound_custom_payload_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_custom_payload_packet.rs
deleted file mode 100644
index 48c977b17..000000000
--- a/azalea-protocol/src/packets/configuration/serverbound_custom_payload_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_buf::UnsizedByteArray;
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)]
-pub struct ServerboundCustomPayloadPacket {
-    pub identifier: ResourceLocation,
-    pub data: UnsizedByteArray,
-}
diff --git a/azalea-protocol/src/packets/configuration/serverbound_finish_configuration_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_finish_configuration_packet.rs
deleted file mode 100644
index 53e04182e..000000000
--- a/azalea-protocol/src/packets/configuration/serverbound_finish_configuration_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)]
-pub struct ServerboundFinishConfigurationPacket {}
diff --git a/azalea-protocol/src/packets/configuration/serverbound_keep_alive_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_keep_alive_packet.rs
deleted file mode 100644
index 4604df46b..000000000
--- a/azalea-protocol/src/packets/configuration/serverbound_keep_alive_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)]
-pub struct ServerboundKeepAlivePacket {
-    pub id: u64,
-}
diff --git a/azalea-protocol/src/packets/configuration/serverbound_pong_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_pong_packet.rs
deleted file mode 100644
index 153e3feaf..000000000
--- a/azalea-protocol/src/packets/configuration/serverbound_pong_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)]
-pub struct ServerboundPongPacket {
-    pub id: u32,
-}
diff --git a/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs
deleted file mode 100644
index fe379a176..000000000
--- a/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)]
-pub struct ServerboundSelectKnownPacksPacket {
-    pub known_packs: Vec<KnownPack>,
-}
-
-#[derive(Clone, Debug, McBuf)]
-pub struct KnownPack {
-    pub namespace: String,
-    pub id: String,
-    pub version: String,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs b/azalea-protocol/src/packets/game/c_add_entity.rs
similarity index 87%
rename from azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs
rename to azalea-protocol/src/packets/game/c_add_entity.rs
index 6b62df199..cf0adeb7d 100755
--- a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs
+++ b/azalea-protocol/src/packets/game/c_add_entity.rs
@@ -1,11 +1,11 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::{position::Vec3, resource_location::ResourceLocation};
 use azalea_entity::{metadata::apply_default_metadata, EntityBundle};
 use azalea_protocol_macros::ClientboundGamePacket;
 use uuid::Uuid;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundAddEntityPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundAddEntity {
     /// The id of the entity.
     #[var]
     pub id: u32,
@@ -22,7 +22,7 @@ pub struct ClientboundAddEntityPacket {
     pub z_vel: i16,
 }
 
-impl ClientboundAddEntityPacket {
+impl ClientboundAddEntity {
     /// Make the entity into a bundle that can be inserted into the ECS. You
     /// must apply the metadata after inserting the bundle with
     /// [`Self::apply_metadata`].
diff --git a/azalea-protocol/src/packets/game/clientbound_add_experience_orb_packet.rs b/azalea-protocol/src/packets/game/c_add_experience_orb.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/clientbound_add_experience_orb_packet.rs
rename to azalea-protocol/src/packets/game/c_add_experience_orb.rs
index 84edcae62..b3d12858d 100755
--- a/azalea-protocol/src/packets/game/clientbound_add_experience_orb_packet.rs
+++ b/azalea-protocol/src/packets/game/c_add_experience_orb.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundAddExperienceOrbPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundAddExperienceOrb {
     #[var]
     pub id: u32,
     pub x: f64,
diff --git a/azalea-protocol/src/packets/game/clientbound_add_player_packet.rs b/azalea-protocol/src/packets/game/c_add_player.rs
similarity index 82%
rename from azalea-protocol/src/packets/game/clientbound_add_player_packet.rs
rename to azalea-protocol/src/packets/game/c_add_player.rs
index 45ab45840..7b36567dd 100755
--- a/azalea-protocol/src/packets/game/clientbound_add_player_packet.rs
+++ b/azalea-protocol/src/packets/game/c_add_player.rs
@@ -1,4 +1,4 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::{ResourceLocation, Vec3};
 use azalea_entity::{metadata::PlayerMetadataBundle, EntityBundle, PlayerBundle};
 use azalea_protocol_macros::ClientboundGamePacket;
@@ -7,8 +7,8 @@ use uuid::Uuid;
 
 /// This packet is sent by the server when a player comes into visible range,
 /// not when a player joins.
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundAddPlayerPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundAddPlayer {
     #[var]
     pub id: u32,
     pub uuid: Uuid,
@@ -17,7 +17,7 @@ pub struct ClientboundAddPlayerPacket {
     pub y_rot: i8,
 }
 
-impl ClientboundAddPlayerPacket {
+impl ClientboundAddPlayer {
     pub fn as_player_bundle(&self, world_name: ResourceLocation) -> PlayerBundle {
         PlayerBundle {
             entity: EntityBundle::new(self.uuid, self.position, EntityKind::Player, world_name),
diff --git a/azalea-protocol/src/packets/game/clientbound_animate_packet.rs b/azalea-protocol/src/packets/game/c_animate.rs
similarity index 72%
rename from azalea-protocol/src/packets/game/clientbound_animate_packet.rs
rename to azalea-protocol/src/packets/game/c_animate.rs
index 8c99b1b75..bda0b1520 100755
--- a/azalea-protocol/src/packets/game/clientbound_animate_packet.rs
+++ b/azalea-protocol/src/packets/game/c_animate.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundAnimatePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundAnimate {
     #[var]
     pub id: u32,
     pub action: AnimationAction,
@@ -10,7 +10,7 @@ pub struct ClientboundAnimatePacket {
 
 // minecraft actually uses a u8 for this, but a varint still works and makes it
 // so i don't have to add a special handler
-#[derive(Clone, Debug, Copy, McBuf)]
+#[derive(Clone, Debug, Copy, AzBuf)]
 pub enum AnimationAction {
     SwingMainHand = 0,
     Hurt = 1,
diff --git a/azalea-protocol/src/packets/game/clientbound_award_stats_packet.rs b/azalea-protocol/src/packets/game/c_award_stats.rs
similarity index 73%
rename from azalea-protocol/src/packets/game/clientbound_award_stats_packet.rs
rename to azalea-protocol/src/packets/game/c_award_stats.rs
index 32e2c8aa1..20f8b1e07 100755
--- a/azalea-protocol/src/packets/game/clientbound_award_stats_packet.rs
+++ b/azalea-protocol/src/packets/game/c_award_stats.rs
@@ -1,15 +1,15 @@
 use std::collections::HashMap;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundAwardStatsPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundAwardStats {
     #[var]
     pub stats: HashMap<Stat, i32>,
 }
 
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, McBuf)]
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, AzBuf)]
 pub enum Stat {
     Mined(azalea_registry::Block),
     Crafted(azalea_registry::Item),
diff --git a/azalea-protocol/src/packets/game/c_block_changed_ack.rs b/azalea-protocol/src/packets/game/c_block_changed_ack.rs
new file mode 100755
index 000000000..ebb303c02
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_block_changed_ack.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundBlockChangedAck {
+    #[var]
+    pub sequence: i32,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_block_destruction_packet.rs b/azalea-protocol/src/packets/game/c_block_destruction.rs
similarity index 68%
rename from azalea-protocol/src/packets/game/clientbound_block_destruction_packet.rs
rename to azalea-protocol/src/packets/game/c_block_destruction.rs
index 130c698e6..50d8085b1 100755
--- a/azalea-protocol/src/packets/game/clientbound_block_destruction_packet.rs
+++ b/azalea-protocol/src/packets/game/c_block_destruction.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundBlockDestructionPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundBlockDestruction {
     /// The ID of the entity breaking the block.
     #[var]
     pub id: u32,
diff --git a/azalea-protocol/src/packets/game/clientbound_block_entity_data_packet.rs b/azalea-protocol/src/packets/game/c_block_entity_data.rs
similarity index 63%
rename from azalea-protocol/src/packets/game/clientbound_block_entity_data_packet.rs
rename to azalea-protocol/src/packets/game/c_block_entity_data.rs
index 3406a75fe..82ba60de2 100755
--- a/azalea-protocol/src/packets/game/clientbound_block_entity_data_packet.rs
+++ b/azalea-protocol/src/packets/game/c_block_entity_data.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 use simdnbt::owned::Nbt;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundBlockEntityDataPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundBlockEntityData {
     pub pos: BlockPos,
     pub block_entity_type: azalea_registry::BlockEntityKind,
     pub tag: Nbt,
diff --git a/azalea-protocol/src/packets/game/clientbound_block_event_packet.rs b/azalea-protocol/src/packets/game/c_block_event.rs
similarity index 64%
rename from azalea-protocol/src/packets/game/clientbound_block_event_packet.rs
rename to azalea-protocol/src/packets/game/c_block_event.rs
index 86f57b973..3a71b1860 100755
--- a/azalea-protocol/src/packets/game/clientbound_block_event_packet.rs
+++ b/azalea-protocol/src/packets/game/c_block_event.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 use azalea_registry::Block;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundBlockEventPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundBlockEvent {
     pub pos: BlockPos,
     pub action_id: u8,
     pub action_parameter: u8,
diff --git a/azalea-protocol/src/packets/game/clientbound_block_update_packet.rs b/azalea-protocol/src/packets/game/c_block_update.rs
similarity index 59%
rename from azalea-protocol/src/packets/game/clientbound_block_update_packet.rs
rename to azalea-protocol/src/packets/game/c_block_update.rs
index c1869e740..ae9bd9981 100755
--- a/azalea-protocol/src/packets/game/clientbound_block_update_packet.rs
+++ b/azalea-protocol/src/packets/game/c_block_update.rs
@@ -1,10 +1,10 @@
 use azalea_block::BlockState;
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundBlockUpdatePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundBlockUpdate {
     pub pos: BlockPos,
     pub block_state: BlockState,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_boss_event_packet.rs b/azalea-protocol/src/packets/game/c_boss_event.rs
similarity index 55%
rename from azalea-protocol/src/packets/game/clientbound_boss_event_packet.rs
rename to azalea-protocol/src/packets/game/c_boss_event.rs
index 65240edf4..e54ab59fb 100755
--- a/azalea-protocol/src/packets/game/clientbound_boss_event_packet.rs
+++ b/azalea-protocol/src/packets/game/c_boss_event.rs
@@ -1,16 +1,14 @@
 use std::io::Cursor;
 use std::io::Write;
 
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_chat::FormattedText;
 use azalea_core::bitset::FixedBitSet;
 use azalea_protocol_macros::ClientboundGamePacket;
 use uuid::Uuid;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundBossEventPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundBossEvent {
     pub id: Uuid,
     pub operation: Operation,
 }
@@ -25,16 +23,16 @@ pub enum Operation {
     UpdateProperties(Properties),
 }
 
-impl McBufReadable for Operation {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let operation_id = u32::var_read_from(buf)?;
+impl AzaleaRead for Operation {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let operation_id = u32::azalea_read_var(buf)?;
         Ok(match operation_id {
-            0 => Operation::Add(AddOperation::read_from(buf)?),
+            0 => Operation::Add(AddOperation::azalea_read(buf)?),
             1 => Operation::Remove,
-            2 => Operation::UpdateProgress(f32::read_from(buf)?),
-            3 => Operation::UpdateName(FormattedText::read_from(buf)?),
-            4 => Operation::UpdateStyle(Style::read_from(buf)?),
-            5 => Operation::UpdateProperties(Properties::read_from(buf)?),
+            2 => Operation::UpdateProgress(f32::azalea_read(buf)?),
+            3 => Operation::UpdateName(FormattedText::azalea_read(buf)?),
+            4 => Operation::UpdateStyle(Style::azalea_read(buf)?),
+            5 => Operation::UpdateProperties(Properties::azalea_read(buf)?),
             _ => {
                 return Err(BufReadError::UnexpectedEnumVariant {
                     id: operation_id as i32,
@@ -44,38 +42,38 @@ impl McBufReadable for Operation {
     }
 }
 
-impl McBufWritable for Operation {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for Operation {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
             Operation::Add(add) => {
-                0u32.var_write_into(buf)?;
-                add.write_into(buf)?;
+                0u32.azalea_write_var(buf)?;
+                add.azalea_write(buf)?;
             }
             Operation::Remove => {
-                1u32.var_write_into(buf)?;
+                1u32.azalea_write_var(buf)?;
             }
             Operation::UpdateProgress(progress) => {
-                2u32.var_write_into(buf)?;
-                progress.write_into(buf)?;
+                2u32.azalea_write_var(buf)?;
+                progress.azalea_write(buf)?;
             }
             Operation::UpdateName(name) => {
-                3u32.var_write_into(buf)?;
-                name.write_into(buf)?;
+                3u32.azalea_write_var(buf)?;
+                name.azalea_write(buf)?;
             }
             Operation::UpdateStyle(style) => {
-                4u32.var_write_into(buf)?;
-                style.write_into(buf)?;
+                4u32.azalea_write_var(buf)?;
+                style.azalea_write(buf)?;
             }
             Operation::UpdateProperties(properties) => {
-                5u32.var_write_into(buf)?;
-                properties.write_into(buf)?;
+                5u32.azalea_write_var(buf)?;
+                properties.azalea_write(buf)?;
             }
         }
         Ok(())
     }
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct AddOperation {
     pub name: FormattedText,
     pub progress: f32,
@@ -83,13 +81,13 @@ pub struct AddOperation {
     pub properties: Properties,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct Style {
     pub color: BossBarColor,
     pub overlay: BossBarOverlay,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum BossBarColor {
     Pink = 0,
     Blue = 1,
@@ -100,7 +98,7 @@ pub enum BossBarColor {
     White = 6,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum BossBarOverlay {
     Progress = 0,
     Notched6 = 1,
@@ -116,9 +114,9 @@ pub struct Properties {
     pub create_world_fog: bool,
 }
 
-impl McBufReadable for Properties {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let set = FixedBitSet::<3>::read_from(buf)?;
+impl AzaleaRead for Properties {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let set = FixedBitSet::<3>::azalea_read(buf)?;
         Ok(Self {
             darken_screen: set.index(0),
             play_music: set.index(1),
@@ -127,8 +125,8 @@ impl McBufReadable for Properties {
     }
 }
 
-impl McBufWritable for Properties {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for Properties {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<3>::new();
         if self.darken_screen {
             set.set(0);
@@ -139,7 +137,7 @@ impl McBufWritable for Properties {
         if self.create_world_fog {
             set.set(2);
         }
-        set.write_into(buf)?;
+        set.azalea_write(buf)?;
         Ok(())
     }
 }
diff --git a/azalea-protocol/src/packets/game/c_bundle_delimiter.rs b/azalea-protocol/src/packets/game/c_bundle_delimiter.rs
new file mode 100644
index 000000000..cda33d1b7
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_bundle_delimiter.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundBundleDelimiter;
diff --git a/azalea-protocol/src/packets/game/clientbound_change_difficulty_packet.rs b/azalea-protocol/src/packets/game/c_change_difficulty.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/clientbound_change_difficulty_packet.rs
rename to azalea-protocol/src/packets/game/c_change_difficulty.rs
index e7dafbeb6..cdcc4792a 100755
--- a/azalea-protocol/src/packets/game/clientbound_change_difficulty_packet.rs
+++ b/azalea-protocol/src/packets/game/c_change_difficulty.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::difficulty::Difficulty;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundChangeDifficultyPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundChangeDifficulty {
     pub difficulty: Difficulty,
     pub locked: bool,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_chat_preview_packet.rs b/azalea-protocol/src/packets/game/c_chat_preview.rs
similarity index 55%
rename from azalea-protocol/src/packets/game/clientbound_chat_preview_packet.rs
rename to azalea-protocol/src/packets/game/c_chat_preview.rs
index 40f282593..e0ddd2ec6 100755
--- a/azalea-protocol/src/packets/game/clientbound_chat_preview_packet.rs
+++ b/azalea-protocol/src/packets/game/c_chat_preview.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundChatPreviewPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundChatPreview {
     pub query_id: i32,
     pub preview: Option<FormattedText>,
 }
diff --git a/azalea-protocol/src/packets/game/c_chunk_batch_finished.rs b/azalea-protocol/src/packets/game/c_chunk_batch_finished.rs
new file mode 100644
index 000000000..c419888b8
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_chunk_batch_finished.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundChunkBatchFinished {
+    #[var]
+    pub batch_size: u32,
+}
diff --git a/azalea-protocol/src/packets/game/c_chunk_batch_start.rs b/azalea-protocol/src/packets/game/c_chunk_batch_start.rs
new file mode 100644
index 000000000..8b0555dc9
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_chunk_batch_start.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundChunkBatchStart {}
diff --git a/azalea-protocol/src/packets/game/clientbound_chunks_biomes_packet.rs b/azalea-protocol/src/packets/game/c_chunks_biomes.rs
similarity index 58%
rename from azalea-protocol/src/packets/game/clientbound_chunks_biomes_packet.rs
rename to azalea-protocol/src/packets/game/c_chunks_biomes.rs
index 7c8f21543..a8e65af49 100644
--- a/azalea-protocol/src/packets/game/clientbound_chunks_biomes_packet.rs
+++ b/azalea-protocol/src/packets/game/c_chunks_biomes.rs
@@ -1,13 +1,13 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::ChunkPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundChunksBiomesPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundChunksBiomes {
     pub chunk_biome_data: Vec<ChunkBiomeData>,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct ChunkBiomeData {
     pub pos: ChunkPos,
     pub buffer: Vec<u8>,
diff --git a/azalea-protocol/src/packets/game/c_clear_titles.rs b/azalea-protocol/src/packets/game/c_clear_titles.rs
new file mode 100644
index 000000000..58b67bad8
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_clear_titles.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundClearTitles {
+    pub reset_times: bool,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_command_suggestions_packet.rs b/azalea-protocol/src/packets/game/c_command_suggestions.rs
similarity index 71%
rename from azalea-protocol/src/packets/game/clientbound_command_suggestions_packet.rs
rename to azalea-protocol/src/packets/game/c_command_suggestions.rs
index c9752ee95..37679a721 100755
--- a/azalea-protocol/src/packets/game/clientbound_command_suggestions_packet.rs
+++ b/azalea-protocol/src/packets/game/c_command_suggestions.rs
@@ -1,9 +1,9 @@
 use azalea_brigadier::suggestion::Suggestions;
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCommandSuggestionsPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCommandSuggestions {
     #[var]
     pub id: u32,
     pub suggestions: Suggestions,
@@ -14,7 +14,7 @@ mod tests {
     use std::io::Cursor;
 
     use azalea_brigadier::{context::StringRange, suggestion::Suggestion};
-    use azalea_buf::{McBufReadable, McBufWritable};
+    use azalea_buf::{AzaleaRead, AzaleaWrite};
 
     use super::*;
 
@@ -29,9 +29,9 @@ mod tests {
             )],
         );
         let mut buf = Vec::new();
-        suggestions.write_into(&mut buf).unwrap();
+        suggestions.azalea_write(&mut buf).unwrap();
         let mut cursor = Cursor::new(&buf[..]);
-        let suggestions = Suggestions::read_from(&mut cursor).unwrap();
+        let suggestions = Suggestions::azalea_read(&mut cursor).unwrap();
         assert_eq!(suggestions, suggestions);
     }
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_commands_packet.rs b/azalea-protocol/src/packets/game/c_commands.rs
similarity index 74%
rename from azalea-protocol/src/packets/game/clientbound_commands_packet.rs
rename to azalea-protocol/src/packets/game/c_commands.rs
index 10055e376..1a2315597 100755
--- a/azalea-protocol/src/packets/game/clientbound_commands_packet.rs
+++ b/azalea-protocol/src/packets/game/c_commands.rs
@@ -1,14 +1,12 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_core::{bitset::FixedBitSet, resource_location::ResourceLocation};
 use azalea_protocol_macros::ClientboundGamePacket;
 use tracing::warn;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCommandsPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCommands {
     pub entries: Vec<BrigadierNodeStub>,
     #[var]
     pub root_index: u32,
@@ -46,24 +44,24 @@ impl<T: PartialEq> PartialEq for BrigadierNumber<T> {
     }
 }
 
-impl<T: McBufReadable> McBufReadable for BrigadierNumber<T> {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let flags = FixedBitSet::<2>::read_from(buf)?;
+impl<T: AzaleaRead> AzaleaRead for BrigadierNumber<T> {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let flags = FixedBitSet::<2>::azalea_read(buf)?;
         let min = if flags.index(0) {
-            Some(T::read_from(buf)?)
+            Some(T::azalea_read(buf)?)
         } else {
             None
         };
         let max = if flags.index(1) {
-            Some(T::read_from(buf)?)
+            Some(T::azalea_read(buf)?)
         } else {
             None
         };
         Ok(BrigadierNumber { min, max })
     }
 }
-impl<T: McBufWritable> McBufWritable for BrigadierNumber<T> {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl<T: AzaleaWrite> AzaleaWrite for BrigadierNumber<T> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut flags = FixedBitSet::<2>::new();
         if self.min.is_some() {
             flags.set(0);
@@ -71,18 +69,18 @@ impl<T: McBufWritable> McBufWritable for BrigadierNumber<T> {
         if self.max.is_some() {
             flags.set(1);
         }
-        flags.write_into(buf)?;
+        flags.azalea_write(buf)?;
         if let Some(min) = &self.min {
-            min.write_into(buf)?;
+            min.azalea_write(buf)?;
         }
         if let Some(max) = &self.max {
-            max.write_into(buf)?;
+            max.azalea_write(buf)?;
         }
         Ok(())
     }
 }
 
-#[derive(Debug, Clone, Copy, McBuf, PartialEq, Eq)]
+#[derive(Debug, Clone, Copy, AzBuf, PartialEq, Eq)]
 pub enum BrigadierString {
     /// Reads a single word
     SingleWord = 0,
@@ -93,7 +91,7 @@ pub enum BrigadierString {
     GreedyPhrase = 2,
 }
 
-#[derive(Debug, Clone, McBuf, PartialEq)]
+#[derive(Debug, Clone, AzBuf, PartialEq)]
 pub enum BrigadierParser {
     Bool,
     Float(BrigadierNumber<f32>),
@@ -156,17 +154,17 @@ pub struct EntityParser {
     pub single: bool,
     pub players_only: bool,
 }
-impl McBufReadable for EntityParser {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let flags = FixedBitSet::<2>::read_from(buf)?;
+impl AzaleaRead for EntityParser {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let flags = FixedBitSet::<2>::azalea_read(buf)?;
         Ok(EntityParser {
             single: flags.index(0),
             players_only: flags.index(1),
         })
     }
 }
-impl McBufWritable for EntityParser {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for EntityParser {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut flags = FixedBitSet::<2>::new();
         if self.single {
             flags.set(0);
@@ -174,15 +172,15 @@ impl McBufWritable for EntityParser {
         if self.players_only {
             flags.set(1);
         }
-        flags.write_into(buf)?;
+        flags.azalea_write(buf)?;
         Ok(())
     }
 }
 
 // TODO: BrigadierNodeStub should have more stuff
-impl McBufReadable for BrigadierNodeStub {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let flags = FixedBitSet::<8>::read_from(buf)?;
+impl AzaleaRead for BrigadierNodeStub {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let flags = FixedBitSet::<8>::azalea_read(buf)?;
         if flags.index(5) || flags.index(6) || flags.index(7) {
             warn!("Warning: The flags from a Brigadier node are over 31. This is probably a bug.",);
         }
@@ -192,19 +190,19 @@ impl McBufReadable for BrigadierNodeStub {
         let has_redirect = flags.index(3);
         let has_suggestions_type = flags.index(4);
 
-        let children = Vec::<u32>::var_read_from(buf)?;
+        let children = Vec::<u32>::azalea_read_var(buf)?;
         let redirect_node = if has_redirect {
-            Some(u32::var_read_from(buf)?)
+            Some(u32::azalea_read_var(buf)?)
         } else {
             None
         };
 
         // argument node
         if node_type == 2 {
-            let name = String::read_from(buf)?;
-            let parser = BrigadierParser::read_from(buf)?;
+            let name = String::azalea_read(buf)?;
+            let parser = BrigadierParser::azalea_read(buf)?;
             let suggestions_type = if has_suggestions_type {
-                Some(ResourceLocation::read_from(buf)?)
+                Some(ResourceLocation::azalea_read(buf)?)
             } else {
                 None
             };
@@ -222,7 +220,7 @@ impl McBufReadable for BrigadierNodeStub {
         }
         // literal node
         else if node_type == 1 {
-            let name = String::read_from(buf)?;
+            let name = String::azalea_read(buf)?;
             return Ok(BrigadierNodeStub {
                 is_executable,
                 children,
@@ -239,8 +237,8 @@ impl McBufReadable for BrigadierNodeStub {
     }
 }
 
-impl McBufWritable for BrigadierNodeStub {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for BrigadierNodeStub {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut flags = FixedBitSet::<4>::new();
         if self.is_executable {
             flags.set(2);
@@ -251,25 +249,25 @@ impl McBufWritable for BrigadierNodeStub {
 
         match &self.node_type {
             NodeType::Root => {
-                flags.write_into(buf)?;
+                flags.azalea_write(buf)?;
 
-                self.children.var_write_into(buf)?;
+                self.children.azalea_write_var(buf)?;
 
                 if let Some(redirect) = self.redirect_node {
-                    redirect.var_write_into(buf)?;
+                    redirect.azalea_write_var(buf)?;
                 }
             }
             NodeType::Literal { name } => {
                 flags.set(0);
-                flags.write_into(buf)?;
+                flags.azalea_write(buf)?;
 
-                self.children.var_write_into(buf)?;
+                self.children.azalea_write_var(buf)?;
 
                 if let Some(redirect) = self.redirect_node {
-                    redirect.var_write_into(buf)?;
+                    redirect.azalea_write_var(buf)?;
                 }
 
-                name.write_into(buf)?;
+                name.azalea_write(buf)?;
             }
             NodeType::Argument {
                 name,
@@ -280,19 +278,19 @@ impl McBufWritable for BrigadierNodeStub {
                 if suggestions_type.is_some() {
                     flags.set(4);
                 }
-                flags.write_into(buf)?;
+                flags.azalea_write(buf)?;
 
-                self.children.var_write_into(buf)?;
+                self.children.azalea_write_var(buf)?;
 
                 if let Some(redirect) = self.redirect_node {
-                    redirect.var_write_into(buf)?;
+                    redirect.azalea_write_var(buf)?;
                 }
 
-                name.write_into(buf)?;
-                parser.write_into(buf)?;
+                name.azalea_write(buf)?;
+                parser.azalea_write(buf)?;
 
                 if let Some(suggestion) = suggestions_type {
-                    suggestion.write_into(buf)?;
+                    suggestion.azalea_write(buf)?;
                 }
             }
         }
@@ -336,9 +334,9 @@ mod tests {
             node_type: NodeType::Root,
         };
         let mut buf = Vec::new();
-        data.write_into(&mut buf).unwrap();
+        data.azalea_write(&mut buf).unwrap();
         let mut data_cursor: Cursor<&[u8]> = Cursor::new(&buf);
-        let read_data = BrigadierNodeStub::read_from(&mut data_cursor).unwrap();
+        let read_data = BrigadierNodeStub::azalea_read(&mut data_cursor).unwrap();
         assert_eq!(data, read_data);
     }
 
@@ -353,9 +351,9 @@ mod tests {
             },
         };
         let mut buf = Vec::new();
-        data.write_into(&mut buf).unwrap();
+        data.azalea_write(&mut buf).unwrap();
         let mut data_cursor: Cursor<&[u8]> = Cursor::new(&buf);
-        let read_data = BrigadierNodeStub::read_from(&mut data_cursor).unwrap();
+        let read_data = BrigadierNodeStub::azalea_read(&mut data_cursor).unwrap();
         assert_eq!(data, read_data);
     }
 
@@ -372,9 +370,9 @@ mod tests {
             },
         };
         let mut buf = Vec::new();
-        data.write_into(&mut buf).unwrap();
+        data.azalea_write(&mut buf).unwrap();
         let mut data_cursor: Cursor<&[u8]> = Cursor::new(&buf);
-        let read_data = BrigadierNodeStub::read_from(&mut data_cursor).unwrap();
+        let read_data = BrigadierNodeStub::azalea_read(&mut data_cursor).unwrap();
         assert_eq!(data, read_data);
     }
 }
diff --git a/azalea-protocol/src/packets/game/c_container_close.rs b/azalea-protocol/src/packets/game/c_container_close.rs
new file mode 100644
index 000000000..dda6153b2
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_container_close.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundContainerClose {
+    pub container_id: u8,
+}
diff --git a/azalea-protocol/src/packets/game/c_container_set_content.rs b/azalea-protocol/src/packets/game/c_container_set_content.rs
new file mode 100755
index 000000000..852ce60fd
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_container_set_content.rs
@@ -0,0 +1,12 @@
+use azalea_buf::AzBuf;
+use azalea_inventory::ItemStack;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundContainerSetContent {
+    pub container_id: i8,
+    #[var]
+    pub state_id: u32,
+    pub items: Vec<ItemStack>,
+    pub carried_item: ItemStack,
+}
diff --git a/azalea-protocol/src/packets/game/c_container_set_data.rs b/azalea-protocol/src/packets/game/c_container_set_data.rs
new file mode 100755
index 000000000..3815f5c51
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_container_set_data.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundContainerSetData {
+    pub container_id: i8,
+    pub id: u16,
+    pub value: u16,
+}
diff --git a/azalea-protocol/src/packets/game/c_container_set_slot.rs b/azalea-protocol/src/packets/game/c_container_set_slot.rs
new file mode 100755
index 000000000..5e3476d9d
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_container_set_slot.rs
@@ -0,0 +1,12 @@
+use azalea_buf::AzBuf;
+use azalea_inventory::ItemStack;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundContainerSetSlot {
+    pub container_id: i8,
+    #[var]
+    pub state_id: u32,
+    pub slot: u16,
+    pub item_stack: ItemStack,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/game/c_cookie_request.rs
similarity index 53%
rename from azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs
rename to azalea-protocol/src/packets/game/c_cookie_request.rs
index 9f1c1d438..330b73341 100755
--- a/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs
+++ b/azalea-protocol/src/packets/game/c_cookie_request.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCookieRequestPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCookieRequest {
     pub key: ResourceLocation,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_cooldown_packet.rs b/azalea-protocol/src/packets/game/c_cooldown.rs
similarity index 51%
rename from azalea-protocol/src/packets/game/clientbound_cooldown_packet.rs
rename to azalea-protocol/src/packets/game/c_cooldown.rs
index 41c8291a1..016101b77 100755
--- a/azalea-protocol/src/packets/game/clientbound_cooldown_packet.rs
+++ b/azalea-protocol/src/packets/game/c_cooldown.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCooldownPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCooldown {
     pub item: azalea_registry::Item,
     #[var]
     pub duration: u32,
diff --git a/azalea-protocol/src/packets/game/clientbound_custom_chat_completions_packet.rs b/azalea-protocol/src/packets/game/c_custom_chat_completions.rs
similarity index 50%
rename from azalea-protocol/src/packets/game/clientbound_custom_chat_completions_packet.rs
rename to azalea-protocol/src/packets/game/c_custom_chat_completions.rs
index 3165bbbed..87c27b7ab 100755
--- a/azalea-protocol/src/packets/game/clientbound_custom_chat_completions_packet.rs
+++ b/azalea-protocol/src/packets/game/c_custom_chat_completions.rs
@@ -1,13 +1,13 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCustomChatCompletionsPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCustomChatCompletions {
     pub action: Action,
     pub entries: Vec<String>,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Action {
     Add = 0,
     Remove = 1,
diff --git a/azalea-protocol/src/packets/game/clientbound_custom_payload_packet.rs b/azalea-protocol/src/packets/game/c_custom_payload.rs
similarity index 63%
rename from azalea-protocol/src/packets/game/clientbound_custom_payload_packet.rs
rename to azalea-protocol/src/packets/game/c_custom_payload.rs
index fb5f11ba5..0610d63e1 100755
--- a/azalea-protocol/src/packets/game/clientbound_custom_payload_packet.rs
+++ b/azalea-protocol/src/packets/game/c_custom_payload.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_buf::UnsizedByteArray;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCustomPayloadPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCustomPayload {
     pub identifier: ResourceLocation,
     pub data: UnsizedByteArray,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_custom_report_details_packet.rs b/azalea-protocol/src/packets/game/c_custom_report_details.rs
similarity index 69%
rename from azalea-protocol/src/packets/game/clientbound_custom_report_details_packet.rs
rename to azalea-protocol/src/packets/game/c_custom_report_details.rs
index a098f9150..85eccfb7e 100644
--- a/azalea-protocol/src/packets/game/clientbound_custom_report_details_packet.rs
+++ b/azalea-protocol/src/packets/game/c_custom_report_details.rs
@@ -1,10 +1,10 @@
 use std::collections::HashMap;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCustomReportDetailsPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCustomReportDetails {
     // azalea doesn't implement max lengths yet
 
     // max length = 32
diff --git a/azalea-protocol/src/packets/game/clientbound_custom_sound_packet.rs b/azalea-protocol/src/packets/game/c_custom_sound.rs
similarity index 74%
rename from azalea-protocol/src/packets/game/clientbound_custom_sound_packet.rs
rename to azalea-protocol/src/packets/game/c_custom_sound.rs
index 05b1560b6..7daadb3a7 100644
--- a/azalea-protocol/src/packets/game/clientbound_custom_sound_packet.rs
+++ b/azalea-protocol/src/packets/game/c_custom_sound.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundCustomSoundPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundCustomSound {
     pub name: ResourceLocation,
     pub source: SoundSource,
     pub x: i32,
@@ -13,7 +13,7 @@ pub struct ClientboundCustomSoundPacket {
     pub pitch: f32,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum SoundSource {
     Master = 0,
     Music = 1,
diff --git a/azalea-protocol/src/packets/game/c_damage_event.rs b/azalea-protocol/src/packets/game/c_damage_event.rs
new file mode 100644
index 000000000..a736f39a4
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_damage_event.rs
@@ -0,0 +1,35 @@
+use std::io::{Cursor, Write};
+
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWriteVar, AzaleaWrite};
+use azalea_core::position::Vec3;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundDamageEvent {
+    #[var]
+    pub entity_id: u32,
+    #[var]
+    pub source_type_id: u32,
+    pub source_cause_id: OptionalEntityId,
+    pub source_direct_id: OptionalEntityId,
+    pub source_position: Option<Vec3>,
+}
+
+#[derive(Clone, Debug)]
+pub struct OptionalEntityId(pub Option<u32>);
+impl AzaleaRead for OptionalEntityId {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+        match u32::azalea_read_var(buf)? {
+            0 => Ok(OptionalEntityId(None)),
+            id => Ok(OptionalEntityId(Some(id - 1))),
+        }
+    }
+}
+impl AzaleaWrite for OptionalEntityId {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        match self.0 {
+            Some(id) => (id + 1).azalea_write_var(buf),
+            None => 0u32.azalea_write_var(buf),
+        }
+    }
+}
diff --git a/azalea-protocol/src/packets/game/c_debug_sample.rs b/azalea-protocol/src/packets/game/c_debug_sample.rs
new file mode 100755
index 000000000..505500622
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_debug_sample.rs
@@ -0,0 +1,10 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+use super::s_debug_sample_subscription::RemoteDebugSampleType;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundDebugSample {
+    pub sample: Vec<u64>,
+    pub debug_sample_type: RemoteDebugSampleType,
+}
diff --git a/azalea-protocol/src/packets/game/c_delete_chat.rs b/azalea-protocol/src/packets/game/c_delete_chat.rs
new file mode 100755
index 000000000..d44a4553d
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_delete_chat.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+use super::c_player_chat::PackedMessageSignature;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundDeleteChat {
+    pub signature: PackedMessageSignature,
+}
diff --git a/azalea-protocol/src/packets/game/c_disconnect.rs b/azalea-protocol/src/packets/game/c_disconnect.rs
new file mode 100755
index 000000000..ba197f1db
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_disconnect.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_chat::FormattedText;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundDisconnect {
+    pub reason: FormattedText,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_disguised_chat_packet.rs b/azalea-protocol/src/packets/game/c_disguised_chat.rs
similarity index 78%
rename from azalea-protocol/src/packets/game/clientbound_disguised_chat_packet.rs
rename to azalea-protocol/src/packets/game/c_disguised_chat.rs
index 24e1a9927..90dc5d64a 100644
--- a/azalea-protocol/src/packets/game/clientbound_disguised_chat_packet.rs
+++ b/azalea-protocol/src/packets/game/c_disguised_chat.rs
@@ -1,23 +1,23 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::{
     translatable_component::{StringOrComponent, TranslatableComponent},
     FormattedText,
 };
 use azalea_protocol_macros::ClientboundGamePacket;
 
-use super::clientbound_player_chat_packet::ChatTypeBound;
+use super::c_player_chat::ChatTypeBound;
 
 // A disguised chat packet is basically the same as a normal
-// [`ClientboundPlayerChatPacket`], except that it doesn't have any of the chat
+// [`ClientboundPlayerChat`], except that it doesn't have any of the chat
 // signing things. Vanilla servers use this when messages are sent from the
 // console.
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket, PartialEq)]
-pub struct ClientboundDisguisedChatPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket, PartialEq)]
+pub struct ClientboundDisguisedChat {
     pub message: FormattedText,
     pub chat_type: ChatTypeBound,
 }
 
-impl ClientboundDisguisedChatPacket {
+impl ClientboundDisguisedChat {
     /// Get the full message, including the sender part.
     #[must_use]
     pub fn message(&self) -> FormattedText {
diff --git a/azalea-protocol/src/packets/game/c_entity_event.rs b/azalea-protocol/src/packets/game/c_entity_event.rs
new file mode 100755
index 000000000..13efbabd0
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_entity_event.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundEntityEvent {
+    pub entity_id: u32,
+    pub event_id: u8,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_entity_position_sync_packet.rs b/azalea-protocol/src/packets/game/c_entity_position_sync.rs
similarity index 66%
rename from azalea-protocol/src/packets/game/clientbound_entity_position_sync_packet.rs
rename to azalea-protocol/src/packets/game/c_entity_position_sync.rs
index 0125eeb46..c5cde3229 100755
--- a/azalea-protocol/src/packets/game/clientbound_entity_position_sync_packet.rs
+++ b/azalea-protocol/src/packets/game/c_entity_position_sync.rs
@@ -1,16 +1,16 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::Vec3;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundEntityPositionSyncPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundEntityPositionSync {
     #[var]
     pub id: u32,
     pub values: PositionMoveRotation,
     pub on_ground: bool,
 }
 
-#[derive(McBuf, Clone, Debug)]
+#[derive(AzBuf, Clone, Debug)]
 pub struct PositionMoveRotation {
     pub position: Vec3,
     pub delta_movement: Vec3,
diff --git a/azalea-protocol/src/packets/game/clientbound_explode_packet.rs b/azalea-protocol/src/packets/game/c_explode.rs
similarity index 60%
rename from azalea-protocol/src/packets/game/clientbound_explode_packet.rs
rename to azalea-protocol/src/packets/game/c_explode.rs
index 23c416d1b..aef3887d0 100755
--- a/azalea-protocol/src/packets/game/clientbound_explode_packet.rs
+++ b/azalea-protocol/src/packets/game/c_explode.rs
@@ -3,15 +3,13 @@ use std::{
     str::FromStr,
 };
 
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_core::{position::BlockPos, resource_location::ResourceLocation};
 use azalea_protocol_macros::ClientboundGamePacket;
 use azalea_registry::{ParticleKind, SoundEvent};
 
 #[derive(Clone, Debug, PartialEq, ClientboundGamePacket)]
-pub struct ClientboundExplodePacket {
+pub struct ClientboundExplode {
     pub x: f64,
     pub y: f64,
     pub z: f64,
@@ -26,7 +24,7 @@ pub struct ClientboundExplodePacket {
     pub explosion_sound: SoundEvent,
 }
 
-#[derive(Clone, Copy, Debug, PartialEq, McBuf)]
+#[derive(Clone, Copy, Debug, PartialEq, AzBuf)]
 pub enum BlockInteraction {
     Keep,
     Destroy,
@@ -34,36 +32,36 @@ pub enum BlockInteraction {
     TriggerBlock,
 }
 
-impl McBufReadable for ClientboundExplodePacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let x = f64::read_from(buf)?;
-        let y = f64::read_from(buf)?;
-        let z = f64::read_from(buf)?;
-        let power = f32::read_from(buf)?;
+impl AzaleaRead for ClientboundExplode {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let x = f64::azalea_read(buf)?;
+        let y = f64::azalea_read(buf)?;
+        let z = f64::azalea_read(buf)?;
+        let power = f32::azalea_read(buf)?;
 
         let x_floor = x.floor() as i32;
         let y_floor = y.floor() as i32;
         let z_floor = z.floor() as i32;
 
-        let to_blow_len = u32::var_read_from(buf)?;
+        let to_blow_len = u32::azalea_read_var(buf)?;
         let mut to_blow = Vec::with_capacity(to_blow_len as usize);
         for _ in 0..to_blow_len {
             // the bytes are offsets from the main x y z
-            let x = x_floor + i32::from(i8::read_from(buf)?);
-            let y = y_floor + i32::from(i8::read_from(buf)?);
-            let z = z_floor + i32::from(i8::read_from(buf)?);
+            let x = x_floor + i32::from(i8::azalea_read(buf)?);
+            let y = y_floor + i32::from(i8::azalea_read(buf)?);
+            let z = z_floor + i32::from(i8::azalea_read(buf)?);
             to_blow.push(BlockPos { x, y, z });
         }
 
-        let knockback_x = f32::read_from(buf)?;
-        let knockback_y = f32::read_from(buf)?;
-        let knockback_z = f32::read_from(buf)?;
+        let knockback_x = f32::azalea_read(buf)?;
+        let knockback_y = f32::azalea_read(buf)?;
+        let knockback_z = f32::azalea_read(buf)?;
 
-        let block_interaction = BlockInteraction::read_from(buf)?;
-        let small_explosion_particles = ParticleKind::read_from(buf)?;
-        let large_explosion_particles = ParticleKind::read_from(buf)?;
+        let block_interaction = BlockInteraction::azalea_read(buf)?;
+        let small_explosion_particles = ParticleKind::azalea_read(buf)?;
+        let large_explosion_particles = ParticleKind::azalea_read(buf)?;
 
-        let sound_event_resource_location = ResourceLocation::read_from(buf)?.to_string();
+        let sound_event_resource_location = ResourceLocation::azalea_read(buf)?.to_string();
         let explosion_sound =
             SoundEvent::from_str(&sound_event_resource_location).map_err(|_| {
                 BufReadError::UnexpectedStringEnumVariant {
@@ -88,15 +86,15 @@ impl McBufReadable for ClientboundExplodePacket {
     }
 }
 
-impl McBufWritable for ClientboundExplodePacket {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.x.write_into(buf)?;
-        self.y.write_into(buf)?;
-        self.z.write_into(buf)?;
-        self.power.write_into(buf)?;
+impl AzaleaWrite for ClientboundExplode {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.x.azalea_write(buf)?;
+        self.y.azalea_write(buf)?;
+        self.z.azalea_write(buf)?;
+        self.power.azalea_write(buf)?;
 
         let to_blow_len = self.to_blow.len() as u32;
-        to_blow_len.var_write_into(buf)?;
+        to_blow_len.azalea_write_var(buf)?;
 
         let x_floor = self.x.floor() as i32;
         let y_floor = self.y.floor() as i32;
@@ -106,22 +104,22 @@ impl McBufWritable for ClientboundExplodePacket {
             let x = (pos.x - x_floor) as i8;
             let y = (pos.y - y_floor) as i8;
             let z = (pos.z - z_floor) as i8;
-            x.write_into(buf)?;
-            y.write_into(buf)?;
-            z.write_into(buf)?;
+            x.azalea_write(buf)?;
+            y.azalea_write(buf)?;
+            z.azalea_write(buf)?;
         }
 
-        self.knockback_x.write_into(buf)?;
-        self.knockback_y.write_into(buf)?;
-        self.knockback_z.write_into(buf)?;
+        self.knockback_x.azalea_write(buf)?;
+        self.knockback_y.azalea_write(buf)?;
+        self.knockback_z.azalea_write(buf)?;
 
-        self.block_interaction.write_into(buf)?;
-        self.small_explosion_particles.write_into(buf)?;
-        self.large_explosion_particles.write_into(buf)?;
+        self.block_interaction.azalea_write(buf)?;
+        self.small_explosion_particles.azalea_write(buf)?;
+        self.large_explosion_particles.azalea_write(buf)?;
 
         let sound_event_resource_location =
             ResourceLocation::new(&self.explosion_sound.to_string());
-        sound_event_resource_location.write_into(buf)?;
+        sound_event_resource_location.azalea_write(buf)?;
 
         Ok(())
     }
@@ -133,7 +131,7 @@ mod tests {
 
     #[test]
     fn test_read_write() {
-        let packet = ClientboundExplodePacket {
+        let packet = ClientboundExplode {
             x: 123_456.0,
             y: 789_012.0,
             z: 345_678.0,
@@ -159,8 +157,8 @@ mod tests {
             explosion_sound: SoundEvent::EntityGenericExplode,
         };
         let mut buf = Vec::new();
-        packet.write_into(&mut buf).unwrap();
-        let packet2 = ClientboundExplodePacket::read_from(&mut Cursor::new(&buf)).unwrap();
+        packet.azalea_write(&mut buf).unwrap();
+        let packet2 = ClientboundExplode::azalea_read(&mut Cursor::new(&buf)).unwrap();
         assert_eq!(packet, packet2);
     }
 }
diff --git a/azalea-protocol/src/packets/game/c_forget_level_chunk.rs b/azalea-protocol/src/packets/game/c_forget_level_chunk.rs
new file mode 100755
index 000000000..bd9016341
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_forget_level_chunk.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_core::position::ChunkPos;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundForgetLevelChunk {
+    pub pos: ChunkPos,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_game_event_packet.rs b/azalea-protocol/src/packets/game/c_game_event.rs
similarity index 75%
rename from azalea-protocol/src/packets/game/clientbound_game_event_packet.rs
rename to azalea-protocol/src/packets/game/c_game_event.rs
index 2416f7c33..940aa2f1d 100755
--- a/azalea-protocol/src/packets/game/clientbound_game_event_packet.rs
+++ b/azalea-protocol/src/packets/game/c_game_event.rs
@@ -1,13 +1,13 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundGameEventPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundGameEvent {
     pub event: EventType,
     pub param: f32,
 }
 
-#[derive(Clone, Debug, Copy, McBuf)]
+#[derive(Clone, Debug, Copy, AzBuf)]
 pub enum EventType {
     NoRespawnBlockAvailable = 0,
     StartRaining = 1,
diff --git a/azalea-protocol/src/packets/game/clientbound_horse_screen_open_packet.rs b/azalea-protocol/src/packets/game/c_horse_screen_open.rs
similarity index 52%
rename from azalea-protocol/src/packets/game/clientbound_horse_screen_open_packet.rs
rename to azalea-protocol/src/packets/game/c_horse_screen_open.rs
index ad3f7b37a..13a672532 100755
--- a/azalea-protocol/src/packets/game/clientbound_horse_screen_open_packet.rs
+++ b/azalea-protocol/src/packets/game/c_horse_screen_open.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundHorseScreenOpenPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundHorseScreenOpen {
     pub container_id: u8,
     #[var]
     pub size: u32,
diff --git a/azalea-protocol/src/packets/game/c_hurt_animation.rs b/azalea-protocol/src/packets/game/c_hurt_animation.rs
new file mode 100644
index 000000000..49a329894
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_hurt_animation.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundHurtAnimation {
+    #[var]
+    pub id: u32,
+    pub yaw: f32,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_initialize_border_packet.rs b/azalea-protocol/src/packets/game/c_initialize_border.rs
similarity index 71%
rename from azalea-protocol/src/packets/game/clientbound_initialize_border_packet.rs
rename to azalea-protocol/src/packets/game/c_initialize_border.rs
index 77742c0a2..ca338b7f9 100755
--- a/azalea-protocol/src/packets/game/clientbound_initialize_border_packet.rs
+++ b/azalea-protocol/src/packets/game/c_initialize_border.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, ClientboundGamePacket, McBuf)]
-pub struct ClientboundInitializeBorderPacket {
+#[derive(Clone, Debug, ClientboundGamePacket, AzBuf)]
+pub struct ClientboundInitializeBorder {
     pub new_center_x: f64,
     pub new_center_z: f64,
     pub old_size: f64,
diff --git a/azalea-protocol/src/packets/game/c_keep_alive.rs b/azalea-protocol/src/packets/game/c_keep_alive.rs
new file mode 100755
index 000000000..ff93560b3
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_keep_alive.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundKeepAlive {
+    pub id: u64,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_level_chunk_with_light_packet.rs b/azalea-protocol/src/packets/game/c_level_chunk_with_light.rs
similarity index 98%
rename from azalea-protocol/src/packets/game/clientbound_level_chunk_with_light_packet.rs
rename to azalea-protocol/src/packets/game/c_level_chunk_with_light.rs
index f7212ba7c..a4a6da45c 100755
--- a/azalea-protocol/src/packets/game/clientbound_level_chunk_with_light_packet.rs
+++ b/azalea-protocol/src/packets/game/c_level_chunk_with_light.rs
@@ -1,18 +1,18 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 use simdnbt::owned::Nbt;
 
-use super::clientbound_light_update_packet::ClientboundLightUpdatePacketData;
+use super::c_light_update::ClientboundLightUpdatePacketData;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundLevelChunkWithLightPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundLevelChunkWithLight {
     pub x: i32,
     pub z: i32,
     pub chunk_data: ClientboundLevelChunkPacketData,
     pub light_data: ClientboundLightUpdatePacketData,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct ClientboundLevelChunkPacketData {
     pub heightmaps: Nbt,
     // we can't parse the data in azalea-protocol because it depends on context from other packets
@@ -20,7 +20,7 @@ pub struct ClientboundLevelChunkPacketData {
     pub block_entities: Vec<BlockEntity>,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct BlockEntity {
     pub packed_xz: u8,
     pub y: u16,
@@ -32,21 +32,20 @@ pub struct BlockEntity {
 mod tests {
     use std::{io::Cursor, ops::Deref};
 
-    use azalea_buf::McBufReadable;
+    use azalea_buf::AzaleaRead;
     use azalea_world::Chunk;
     use simdnbt::owned::BaseNbt;
 
     use super::*;
 
     #[test]
-    fn test_clientbound_level_chunk_with_light_packet() {
+    fn test_c_level_chunk_with_light_packet() {
         #[rustfmt::skip]
         let bytes = [
             255, 255, 255, 253, 0, 0, 0, 1, 10, 12, 0, 15, 77, 79, 84, 73, 79, 78, 95, 66, 76, 79, 67, 75, 73, 78, 71, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 240, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 195, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 33, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 37, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 2, 0, 137, 51, 128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 2, 0, 137, 51, 128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 2, 140, 1, 1, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 4, 128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 32, 67, 101, 0, 0, 0, 0, 0, 32, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 33, 67, 101, 135, 169, 203, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 33, 67, 101, 135, 169, 203, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 16, 50, 84, 118, 152, 186, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 33, 67, 101, 135, 169, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 16, 50, 84, 118, 152, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 33, 67, 101, 135, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 16, 50, 84, 118, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 33, 67, 101, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 16, 50, 84, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 16, 50, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
         ];
 
-        let packet =
-            ClientboundLevelChunkWithLightPacket::read_from(&mut Cursor::new(&bytes)).unwrap();
+        let packet = ClientboundLevelChunkWithLight::azalea_read(&mut Cursor::new(&bytes)).unwrap();
 
         let heightmaps_nbt = &packet.chunk_data.heightmaps;
         // necessary to make the unwrap_or work
diff --git a/azalea-protocol/src/packets/game/clientbound_level_event_packet.rs b/azalea-protocol/src/packets/game/c_level_event.rs
similarity index 61%
rename from azalea-protocol/src/packets/game/clientbound_level_event_packet.rs
rename to azalea-protocol/src/packets/game/c_level_event.rs
index a79217f19..f41a1f429 100755
--- a/azalea-protocol/src/packets/game/clientbound_level_event_packet.rs
+++ b/azalea-protocol/src/packets/game/c_level_event.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundLevelEventPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundLevelEvent {
     pub event_type: u32,
     pub pos: BlockPos,
     pub data: u32,
diff --git a/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs b/azalea-protocol/src/packets/game/c_level_particles.rs
similarity index 72%
rename from azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs
rename to azalea-protocol/src/packets/game/c_level_particles.rs
index eae996347..d700673c0 100755
--- a/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs
+++ b/azalea-protocol/src/packets/game/c_level_particles.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_entity::particle::Particle;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundLevelParticlesPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundLevelParticles {
     pub override_limiter: bool,
     pub x: f64,
     pub y: f64,
@@ -20,12 +20,12 @@ pub struct ClientboundLevelParticlesPacket {
 mod tests {
     use std::io::Cursor;
 
-    use azalea_buf::McBufReadable;
+    use azalea_buf::AzaleaRead;
 
     use super::*;
 
     #[test]
-    fn test_clientbound_level_particles_packet() {
+    fn test_c_level_particles_packet() {
         let slice = &[
             0, 64, 139, 10, 0, 0, 0, 0, 0, 192, 26, 0, 0, 0, 0, 0, 0, 64, 144, 58, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 13, 63, 128, 0, 0, 0, 0, 0,
@@ -33,7 +33,7 @@ mod tests {
         ][..];
         let mut bytes = Cursor::new(slice);
 
-        let _packet = ClientboundLevelParticlesPacket::read_from(&mut bytes).unwrap();
+        let _packet = ClientboundLevelParticles::azalea_read(&mut bytes).unwrap();
         assert_eq!(bytes.position(), slice.len() as u64);
     }
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_light_update_packet.rs b/azalea-protocol/src/packets/game/c_light_update.rs
similarity index 74%
rename from azalea-protocol/src/packets/game/clientbound_light_update_packet.rs
rename to azalea-protocol/src/packets/game/c_light_update.rs
index 8d50e94d1..725232914 100755
--- a/azalea-protocol/src/packets/game/clientbound_light_update_packet.rs
+++ b/azalea-protocol/src/packets/game/c_light_update.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::bitset::BitSet;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundLightUpdatePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundLightUpdate {
     #[var]
     pub x: i32,
     #[var]
@@ -11,7 +11,7 @@ pub struct ClientboundLightUpdatePacket {
     pub light_data: ClientboundLightUpdatePacketData,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct ClientboundLightUpdatePacketData {
     pub sky_y_mask: BitSet,
     pub block_y_mask: BitSet,
diff --git a/azalea-protocol/src/packets/game/clientbound_login_packet.rs b/azalea-protocol/src/packets/game/c_login.rs
similarity index 86%
rename from azalea-protocol/src/packets/game/clientbound_login_packet.rs
rename to azalea-protocol/src/packets/game/c_login.rs
index 234439d5d..c0616c559 100755
--- a/azalea-protocol/src/packets/game/clientbound_login_packet.rs
+++ b/azalea-protocol/src/packets/game/c_login.rs
@@ -1,4 +1,4 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
@@ -8,8 +8,8 @@ use crate::packets::common::CommonPlayerSpawnInfo;
 ///
 /// This packet contains information about the state of the player, the
 /// world, and the registry.
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundLoginPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundLogin {
     pub player_id: u32,
     pub hardcore: bool,
     pub levels: Vec<ResourceLocation>,
diff --git a/azalea-protocol/src/packets/game/clientbound_map_item_data_packet.rs b/azalea-protocol/src/packets/game/c_map_item_data.rs
similarity index 66%
rename from azalea-protocol/src/packets/game/clientbound_map_item_data_packet.rs
rename to azalea-protocol/src/packets/game/c_map_item_data.rs
index 0f858181e..9a41ed859 100755
--- a/azalea-protocol/src/packets/game/clientbound_map_item_data_packet.rs
+++ b/azalea-protocol/src/packets/game/c_map_item_data.rs
@@ -1,9 +1,9 @@
-use azalea_buf::{McBuf, McBufReadable, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite};
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, ClientboundGamePacket, McBuf)]
-pub struct ClientboundMapItemDataPacket {
+#[derive(Clone, Debug, ClientboundGamePacket, AzBuf)]
+pub struct ClientboundMapItemData {
     #[var]
     pub map_id: u32,
     pub scale: u8,
@@ -12,7 +12,7 @@ pub struct ClientboundMapItemDataPacket {
     pub color_patch: OptionalMapPatch,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct MapDecoration {
     pub decoration_type: DecorationType,
     pub x: i8,
@@ -26,28 +26,28 @@ pub struct MapDecoration {
 #[derive(Debug, Clone)]
 pub struct OptionalMapPatch(pub Option<MapPatch>);
 
-impl McBufReadable for OptionalMapPatch {
-    fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+impl AzaleaRead for OptionalMapPatch {
+    fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
         let pos = buf.position();
-        Ok(Self(if u8::read_from(buf)? == 0 {
+        Ok(Self(if u8::azalea_read(buf)? == 0 {
             None
         } else {
             buf.set_position(pos);
-            Some(MapPatch::read_from(buf)?)
+            Some(MapPatch::azalea_read(buf)?)
         }))
     }
 }
 
-impl McBufWritable for OptionalMapPatch {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for OptionalMapPatch {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
         match &self.0 {
-            None => 0u8.write_into(buf),
-            Some(m) => m.write_into(buf),
+            None => 0u8.azalea_write(buf),
+            Some(m) => m.azalea_write(buf),
         }
     }
 }
 
-#[derive(Debug, Clone, McBuf)]
+#[derive(Debug, Clone, AzBuf)]
 pub struct MapPatch {
     pub width: u8,
     pub height: u8,
@@ -56,7 +56,7 @@ pub struct MapPatch {
     pub map_colors: Vec<u8>,
 }
 
-#[derive(Clone, Copy, Debug, McBuf)]
+#[derive(Clone, Copy, Debug, AzBuf)]
 pub enum DecorationType {
     Player,
     Frame,
diff --git a/azalea-protocol/src/packets/game/clientbound_merchant_offers_packet.rs b/azalea-protocol/src/packets/game/c_merchant_offers.rs
similarity index 63%
rename from azalea-protocol/src/packets/game/clientbound_merchant_offers_packet.rs
rename to azalea-protocol/src/packets/game/c_merchant_offers.rs
index 4253ace46..e1822579b 100755
--- a/azalea-protocol/src/packets/game/clientbound_merchant_offers_packet.rs
+++ b/azalea-protocol/src/packets/game/c_merchant_offers.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
-use azalea_inventory::ItemSlot;
+use azalea_buf::AzBuf;
+use azalea_inventory::ItemStack;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundMerchantOffersPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundMerchantOffers {
     #[var]
     pub container_id: u32,
     pub offers: Vec<MerchantOffer>,
@@ -15,11 +15,11 @@ pub struct ClientboundMerchantOffersPacket {
     pub can_restock: bool,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct MerchantOffer {
-    pub base_cost_a: ItemSlot,
-    pub result: ItemSlot,
-    pub cost_b: ItemSlot,
+    pub base_cost_a: ItemStack,
+    pub result: ItemStack,
+    pub cost_b: ItemStack,
     pub out_of_stock: bool,
     pub uses: u32,
     pub max_uses: u32,
diff --git a/azalea-protocol/src/packets/game/clientbound_move_entity_pos_packet.rs b/azalea-protocol/src/packets/game/c_move_entity_pos.rs
similarity index 60%
rename from azalea-protocol/src/packets/game/clientbound_move_entity_pos_packet.rs
rename to azalea-protocol/src/packets/game/c_move_entity_pos.rs
index d909fdcc5..b153bb3ce 100755
--- a/azalea-protocol/src/packets/game/clientbound_move_entity_pos_packet.rs
+++ b/azalea-protocol/src/packets/game/c_move_entity_pos.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::delta::PositionDelta8;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundMoveEntityPosPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundMoveEntityPos {
     #[var]
     pub entity_id: u32,
     pub delta: PositionDelta8,
diff --git a/azalea-protocol/src/packets/game/clientbound_move_entity_pos_rot_packet.rs b/azalea-protocol/src/packets/game/c_move_entity_pos_rot.rs
similarity index 70%
rename from azalea-protocol/src/packets/game/clientbound_move_entity_pos_rot_packet.rs
rename to azalea-protocol/src/packets/game/c_move_entity_pos_rot.rs
index 5a5dfbd32..7b22e2901 100755
--- a/azalea-protocol/src/packets/game/clientbound_move_entity_pos_rot_packet.rs
+++ b/azalea-protocol/src/packets/game/c_move_entity_pos_rot.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::delta::PositionDelta8;
 use azalea_protocol_macros::ClientboundGamePacket;
 
 /// This packet is sent by the server when an entity moves less then 8 blocks.
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundMoveEntityPosRotPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundMoveEntityPosRot {
     #[var]
     pub entity_id: u32,
     pub delta: PositionDelta8,
diff --git a/azalea-protocol/src/packets/game/clientbound_move_entity_rot_packet.rs b/azalea-protocol/src/packets/game/c_move_entity_rot.rs
similarity index 55%
rename from azalea-protocol/src/packets/game/clientbound_move_entity_rot_packet.rs
rename to azalea-protocol/src/packets/game/c_move_entity_rot.rs
index 666abe236..a83627487 100755
--- a/azalea-protocol/src/packets/game/clientbound_move_entity_rot_packet.rs
+++ b/azalea-protocol/src/packets/game/c_move_entity_rot.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundMoveEntityRotPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundMoveEntityRot {
     #[var]
     pub entity_id: u32,
     pub y_rot: i8,
diff --git a/azalea-protocol/src/packets/game/clientbound_move_minecart_packet.rs b/azalea-protocol/src/packets/game/c_move_minecart_along_track.rs
similarity index 65%
rename from azalea-protocol/src/packets/game/clientbound_move_minecart_packet.rs
rename to azalea-protocol/src/packets/game/c_move_minecart_along_track.rs
index 014e2aaae..0a205ddde 100644
--- a/azalea-protocol/src/packets/game/clientbound_move_minecart_packet.rs
+++ b/azalea-protocol/src/packets/game/c_move_minecart_along_track.rs
@@ -1,15 +1,15 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::Vec3;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundMoveMinecartPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundMoveMinecartAlongTrack {
     #[var]
     pub entity_id: u32,
     pub lerp_steps: Vec<MinecartStep>,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct MinecartStep {
     pub position: Vec3,
     pub movement: Vec3,
diff --git a/azalea-protocol/src/packets/game/clientbound_move_vehicle_packet.rs b/azalea-protocol/src/packets/game/c_move_vehicle.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/clientbound_move_vehicle_packet.rs
rename to azalea-protocol/src/packets/game/c_move_vehicle.rs
index d2376c358..96e3e5c27 100755
--- a/azalea-protocol/src/packets/game/clientbound_move_vehicle_packet.rs
+++ b/azalea-protocol/src/packets/game/c_move_vehicle.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundMoveVehiclePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundMoveVehicle {
     pub x: f64,
     pub y: f64,
     pub z: f64,
diff --git a/azalea-protocol/src/packets/game/c_open_book.rs b/azalea-protocol/src/packets/game/c_open_book.rs
new file mode 100755
index 000000000..2c4f6b156
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_open_book.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+use super::s_interact::InteractionHand;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundOpenBook {
+    pub hand: InteractionHand,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_open_screen_packet.rs b/azalea-protocol/src/packets/game/c_open_screen.rs
similarity index 62%
rename from azalea-protocol/src/packets/game/clientbound_open_screen_packet.rs
rename to azalea-protocol/src/packets/game/c_open_screen.rs
index 582cac177..4ba717250 100755
--- a/azalea-protocol/src/packets/game/clientbound_open_screen_packet.rs
+++ b/azalea-protocol/src/packets/game/c_open_screen.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundOpenScreenPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundOpenScreen {
     #[var]
     pub container_id: u32,
     pub menu_type: azalea_registry::MenuKind,
diff --git a/azalea-protocol/src/packets/game/clientbound_open_sign_editor_packet.rs b/azalea-protocol/src/packets/game/c_open_sign_editor.rs
similarity index 53%
rename from azalea-protocol/src/packets/game/clientbound_open_sign_editor_packet.rs
rename to azalea-protocol/src/packets/game/c_open_sign_editor.rs
index 0b03cbe25..52f5922c8 100755
--- a/azalea-protocol/src/packets/game/clientbound_open_sign_editor_packet.rs
+++ b/azalea-protocol/src/packets/game/c_open_sign_editor.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundOpenSignEditorPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundOpenSignEditor {
     pub pos: BlockPos,
     pub is_front_text: bool,
 }
diff --git a/azalea-protocol/src/packets/game/c_ping.rs b/azalea-protocol/src/packets/game/c_ping.rs
new file mode 100755
index 000000000..956aca8dc
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_ping.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPing {
+    pub id: u32,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_place_ghost_recipe_packet.rs b/azalea-protocol/src/packets/game/c_place_ghost_recipe.rs
similarity index 57%
rename from azalea-protocol/src/packets/game/clientbound_place_ghost_recipe_packet.rs
rename to azalea-protocol/src/packets/game/c_place_ghost_recipe.rs
index 4d61a526c..41c324032 100755
--- a/azalea-protocol/src/packets/game/clientbound_place_ghost_recipe_packet.rs
+++ b/azalea-protocol/src/packets/game/c_place_ghost_recipe.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlaceGhostRecipePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlaceGhostRecipe {
     pub container_id: u8,
     pub recipe: ResourceLocation,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_player_abilities_packet.rs b/azalea-protocol/src/packets/game/c_player_abilities.rs
similarity index 64%
rename from azalea-protocol/src/packets/game/clientbound_player_abilities_packet.rs
rename to azalea-protocol/src/packets/game/c_player_abilities.rs
index 48c8b41a7..c32a99fef 100755
--- a/azalea-protocol/src/packets/game/clientbound_player_abilities_packet.rs
+++ b/azalea-protocol/src/packets/game/c_player_abilities.rs
@@ -1,12 +1,12 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBuf};
-use azalea_buf::{McBufReadable, McBufWritable};
+use azalea_buf::{AzBuf, BufReadError};
+use azalea_buf::{AzaleaRead, AzaleaWrite};
 use azalea_core::bitset::FixedBitSet;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerAbilitiesPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerAbilities {
     pub flags: PlayerAbilitiesFlags,
     pub flying_speed: f32,
     /// Used for the fov
@@ -21,9 +21,9 @@ pub struct PlayerAbilitiesFlags {
     pub instant_break: bool,
 }
 
-impl McBufReadable for PlayerAbilitiesFlags {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let set = FixedBitSet::<4>::read_from(buf)?;
+impl AzaleaRead for PlayerAbilitiesFlags {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let set = FixedBitSet::<4>::azalea_read(buf)?;
         Ok(PlayerAbilitiesFlags {
             invulnerable: set.index(0),
             flying: set.index(1),
@@ -33,8 +33,8 @@ impl McBufReadable for PlayerAbilitiesFlags {
     }
 }
 
-impl McBufWritable for PlayerAbilitiesFlags {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for PlayerAbilitiesFlags {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<4>::new();
         if self.invulnerable {
             set.set(0);
@@ -48,6 +48,6 @@ impl McBufWritable for PlayerAbilitiesFlags {
         if self.instant_break {
             set.set(3);
         }
-        set.write_into(buf)
+        set.azalea_write(buf)
     }
 }
diff --git a/azalea-protocol/src/packets/game/c_player_chat.rs b/azalea-protocol/src/packets/game/c_player_chat.rs
new file mode 100644
index 000000000..0e9960f2c
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_player_chat.rs
@@ -0,0 +1,160 @@
+use std::io::{Cursor, Write};
+
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
+use azalea_chat::{
+    translatable_component::{StringOrComponent, TranslatableComponent},
+    FormattedText,
+};
+use azalea_core::bitset::BitSet;
+use azalea_crypto::MessageSignature;
+use azalea_protocol_macros::ClientboundGamePacket;
+use azalea_registry::{ChatType, OptionalRegistry};
+use uuid::Uuid;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket, PartialEq)]
+pub struct ClientboundPlayerChat {
+    pub sender: Uuid,
+    #[var]
+    pub index: u32,
+    pub signature: Option<MessageSignature>,
+    pub body: PackedSignedMessageBody,
+    pub unsigned_content: Option<FormattedText>,
+    pub filter_mask: FilterMask,
+    pub chat_type: ChatTypeBound,
+}
+
+#[derive(Clone, Debug, PartialEq, AzBuf)]
+pub struct PackedSignedMessageBody {
+    // the error is here, for some reason it skipped a byte earlier and here
+    // it's reading `0` when it should be `11`
+    pub content: String,
+    pub timestamp: u64,
+    pub salt: u64,
+    pub last_seen: PackedLastSeenMessages,
+}
+
+#[derive(Clone, Debug, PartialEq, AzBuf)]
+pub struct PackedLastSeenMessages {
+    pub entries: Vec<PackedMessageSignature>,
+}
+
+/// Messages can be deleted by either their signature or message id.
+#[derive(Clone, Debug, PartialEq)]
+pub enum PackedMessageSignature {
+    Signature(Box<MessageSignature>),
+    Id(u32),
+}
+
+#[derive(Clone, Debug, PartialEq, AzBuf)]
+pub enum FilterMask {
+    PassThrough,
+    FullyFiltered,
+    PartiallyFiltered(BitSet),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct ChatTypeBound {
+    pub chat_type: ChatType,
+    pub name: FormattedText,
+    pub target_name: Option<FormattedText>,
+}
+impl AzaleaRead for ChatTypeBound {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let Some(chat_type) = OptionalRegistry::<ChatType>::azalea_read(buf)?.0 else {
+            return Err(BufReadError::Custom("ChatType cannot be None".to_owned()));
+        };
+        let name = FormattedText::azalea_read(buf)?;
+        let target_name = Option::<FormattedText>::azalea_read(buf)?;
+
+        Ok(ChatTypeBound {
+            chat_type,
+            name,
+            target_name,
+        })
+    }
+}
+impl AzaleaWrite for ChatTypeBound {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        OptionalRegistry(Some(self.chat_type)).azalea_write(buf)?;
+        self.name.azalea_write(buf)?;
+        self.target_name.azalea_write(buf)?;
+        Ok(())
+    }
+}
+
+// must be in Client
+#[derive(Clone, Debug, PartialEq)]
+pub struct MessageSignatureCache {
+    pub entries: Vec<Option<MessageSignature>>,
+}
+
+// impl MessageSignatureCache {
+//     pub fn unpacker(&self) -> impl Fn(u32) -> Option<SignedMessageBody> {
+
+//     }
+// }
+
+// impl PackedSignedMessageBody {
+//     pub fn unpack(&self, unpacker: impl Fn(u32) -> Option<SignedMessageBody>)
+// {} }
+
+impl ClientboundPlayerChat {
+    /// Returns the content of the message. If you want to get the FormattedText
+    /// for the whole message including the sender part, use
+    /// [`ClientboundPlayerChat::message`].
+    #[must_use]
+    pub fn content(&self) -> FormattedText {
+        self.unsigned_content
+            .clone()
+            .unwrap_or_else(|| FormattedText::from(self.body.content.clone()))
+    }
+
+    /// Get the full message, including the sender part.
+    #[must_use]
+    pub fn message(&self) -> FormattedText {
+        let sender = self.chat_type.name.clone();
+        let content = self.content();
+        let target = self.chat_type.target_name.clone();
+
+        let translation_key = self.chat_type.chat_type.chat_translation_key();
+
+        let mut args = vec![
+            StringOrComponent::FormattedText(sender),
+            StringOrComponent::FormattedText(content),
+        ];
+        if let Some(target) = target {
+            args.push(StringOrComponent::FormattedText(target));
+        }
+
+        let component = TranslatableComponent::new(translation_key.to_string(), args);
+
+        FormattedText::Translatable(component)
+    }
+}
+
+impl AzaleaRead for PackedMessageSignature {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let id = u32::azalea_read_var(buf)?;
+        if id == 0 {
+            let full_signature = MessageSignature::azalea_read(buf)?;
+
+            Ok(PackedMessageSignature::Signature(Box::new(full_signature)))
+        } else {
+            Ok(PackedMessageSignature::Id(id - 1))
+        }
+    }
+}
+impl AzaleaWrite for PackedMessageSignature {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        match self {
+            PackedMessageSignature::Signature(full_signature) => {
+                0u32.azalea_write_var(buf)?;
+                full_signature.azalea_write(buf)?;
+            }
+            PackedMessageSignature::Id(id) => {
+                (id + 1).azalea_write_var(buf)?;
+            }
+        }
+        Ok(())
+    }
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_player_chat_header_packet.rs b/azalea-protocol/src/packets/game/c_player_chat_header.rs
similarity index 64%
rename from azalea-protocol/src/packets/game/clientbound_player_chat_header_packet.rs
rename to azalea-protocol/src/packets/game/c_player_chat_header.rs
index 0e86a36dc..d7e84cc50 100755
--- a/azalea-protocol/src/packets/game/clientbound_player_chat_header_packet.rs
+++ b/azalea-protocol/src/packets/game/c_player_chat_header.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_crypto::{MessageSignature, SignedMessageHeader};
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerChatHeaderPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerChatHeader {
     pub header: SignedMessageHeader,
     pub header_signature: MessageSignature,
     pub body_digest: Vec<u8>,
diff --git a/azalea-protocol/src/packets/game/clientbound_player_combat_end_packet.rs b/azalea-protocol/src/packets/game/c_player_combat_end.rs
similarity index 50%
rename from azalea-protocol/src/packets/game/clientbound_player_combat_end_packet.rs
rename to azalea-protocol/src/packets/game/c_player_combat_end.rs
index dafb839fe..b8029f1bc 100755
--- a/azalea-protocol/src/packets/game/clientbound_player_combat_end_packet.rs
+++ b/azalea-protocol/src/packets/game/c_player_combat_end.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
 /// Unused by the client in vanilla.
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerCombatEndPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerCombatEnd {
     #[var]
     pub duration: u32,
 }
diff --git a/azalea-protocol/src/packets/game/c_player_combat_enter.rs b/azalea-protocol/src/packets/game/c_player_combat_enter.rs
new file mode 100755
index 000000000..8c344b499
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_player_combat_enter.rs
@@ -0,0 +1,6 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+/// Unused in vanilla.
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerCombatEnter {}
diff --git a/azalea-protocol/src/packets/game/clientbound_player_combat_kill_packet.rs b/azalea-protocol/src/packets/game/c_player_combat_kill.rs
similarity index 60%
rename from azalea-protocol/src/packets/game/clientbound_player_combat_kill_packet.rs
rename to azalea-protocol/src/packets/game/c_player_combat_kill.rs
index c309342f7..fb7285b58 100755
--- a/azalea-protocol/src/packets/game/clientbound_player_combat_kill_packet.rs
+++ b/azalea-protocol/src/packets/game/c_player_combat_kill.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 
 /// Used to send a respawn screen.
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerCombatKillPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerCombatKill {
     #[var]
     pub player_id: u32,
     pub message: FormattedText,
diff --git a/azalea-protocol/src/packets/game/c_player_info_remove.rs b/azalea-protocol/src/packets/game/c_player_info_remove.rs
new file mode 100644
index 000000000..fcaef9d45
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_player_info_remove.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+use uuid::Uuid;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerInfoRemove {
+    pub profile_ids: Vec<Uuid>,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_player_info_update_packet.rs b/azalea-protocol/src/packets/game/c_player_info_update.rs
similarity index 80%
rename from azalea-protocol/src/packets/game/clientbound_player_info_update_packet.rs
rename to azalea-protocol/src/packets/game/c_player_info_update.rs
index 2b286e64b..73c463d5d 100644
--- a/azalea-protocol/src/packets/game/clientbound_player_info_update_packet.rs
+++ b/azalea-protocol/src/packets/game/c_player_info_update.rs
@@ -4,18 +4,16 @@ use std::{
 };
 
 use azalea_auth::game_profile::{GameProfile, ProfilePropertyValue};
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_chat::FormattedText;
 use azalea_core::{bitset::FixedBitSet, game_type::GameMode};
 use azalea_protocol_macros::ClientboundGamePacket;
 use uuid::Uuid;
 
-use super::serverbound_chat_session_update_packet::RemoteChatSessionData;
+use super::s_chat_session_update::RemoteChatSessionData;
 
 #[derive(Clone, Debug, ClientboundGamePacket)]
-pub struct ClientboundPlayerInfoUpdatePacket {
+pub struct ClientboundPlayerInfoUpdate {
     pub actions: ActionEnumSet,
     pub entries: Vec<PlayerInfoEntry>,
 }
@@ -28,133 +26,142 @@ pub struct PlayerInfoEntry {
     pub game_mode: GameMode,
     pub display_name: Option<FormattedText>,
     pub list_order: i32,
+    pub update_hat: bool,
     pub chat_session: Option<RemoteChatSessionData>,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct AddPlayerAction {
     pub name: String,
     pub properties: HashMap<String, ProfilePropertyValue>,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct InitializeChatAction {
     pub chat_session: Option<RemoteChatSessionData>,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct UpdateGameModeAction {
     pub game_mode: GameMode,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct UpdateListedAction {
     pub listed: bool,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct UpdateLatencyAction {
     #[var]
     pub latency: i32,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct UpdateDisplayNameAction {
     pub display_name: Option<FormattedText>,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
+pub struct UpdateHatAction {
+    pub update_hat: bool,
+}
+#[derive(Clone, Debug, AzBuf)]
 pub struct UpdateListOrderAction {
     #[var]
     pub list_order: i32,
 }
 
-impl McBufReadable for ClientboundPlayerInfoUpdatePacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let actions = ActionEnumSet::read_from(buf)?;
+impl AzaleaRead for ClientboundPlayerInfoUpdate {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let actions = ActionEnumSet::azalea_read(buf)?;
         let mut entries = Vec::new();
 
-        let entry_count = u32::var_read_from(buf)?;
+        let entry_count = u32::azalea_read_var(buf)?;
         for _ in 0..entry_count {
-            let profile_id = Uuid::read_from(buf)?;
+            let profile_id = Uuid::azalea_read(buf)?;
             let mut entry = PlayerInfoEntry::default();
             entry.profile.uuid = profile_id;
 
             if actions.add_player {
-                let action = AddPlayerAction::read_from(buf)?;
+                let action = AddPlayerAction::azalea_read(buf)?;
                 entry.profile.name = action.name;
                 entry.profile.properties = action.properties;
             }
             if actions.initialize_chat {
-                let action = InitializeChatAction::read_from(buf)?;
+                let action = InitializeChatAction::azalea_read(buf)?;
                 entry.chat_session = action.chat_session;
             }
             if actions.update_game_mode {
-                let action = UpdateGameModeAction::read_from(buf)?;
+                let action = UpdateGameModeAction::azalea_read(buf)?;
                 entry.game_mode = action.game_mode;
             }
             if actions.update_listed {
-                let action = UpdateListedAction::read_from(buf)?;
+                let action = UpdateListedAction::azalea_read(buf)?;
                 entry.listed = action.listed;
             }
             if actions.update_latency {
-                let action = UpdateLatencyAction::read_from(buf)?;
+                let action = UpdateLatencyAction::azalea_read(buf)?;
                 entry.latency = action.latency;
             }
             if actions.update_display_name {
-                let action = UpdateDisplayNameAction::read_from(buf)?;
+                let action = UpdateDisplayNameAction::azalea_read(buf)?;
                 entry.display_name = action.display_name;
             }
+            if actions.update_hat {
+                let action = UpdateHatAction::azalea_read(buf)?;
+                entry.update_hat = action.update_hat;
+            }
             if actions.update_list_order {
-                let action = UpdateListOrderAction::read_from(buf)?;
+                let action = UpdateListOrderAction::azalea_read(buf)?;
                 entry.list_order = action.list_order;
             }
 
             entries.push(entry);
         }
 
-        Ok(ClientboundPlayerInfoUpdatePacket { actions, entries })
+        Ok(ClientboundPlayerInfoUpdate { actions, entries })
     }
 }
 
-impl McBufWritable for ClientboundPlayerInfoUpdatePacket {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.actions.write_into(buf)?;
+impl AzaleaWrite for ClientboundPlayerInfoUpdate {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.actions.azalea_write(buf)?;
 
-        (self.entries.len() as u32).var_write_into(buf)?;
+        (self.entries.len() as u32).azalea_write_var(buf)?;
         for entry in &self.entries {
-            entry.profile.uuid.write_into(buf)?;
+            entry.profile.uuid.azalea_write(buf)?;
 
             if self.actions.add_player {
                 AddPlayerAction {
                     name: entry.profile.name.clone(),
                     properties: entry.profile.properties.clone(),
                 }
-                .write_into(buf)?;
+                .azalea_write(buf)?;
             }
             if self.actions.initialize_chat {
                 InitializeChatAction {
                     chat_session: entry.chat_session.clone(),
                 }
-                .write_into(buf)?;
+                .azalea_write(buf)?;
             }
             if self.actions.update_game_mode {
                 UpdateGameModeAction {
                     game_mode: entry.game_mode,
                 }
-                .write_into(buf)?;
+                .azalea_write(buf)?;
             }
             if self.actions.update_listed {
                 UpdateListedAction {
                     listed: entry.listed,
                 }
-                .write_into(buf)?;
+                .azalea_write(buf)?;
             }
             if self.actions.update_latency {
                 UpdateLatencyAction {
                     latency: entry.latency,
                 }
-                .write_into(buf)?;
+                .azalea_write(buf)?;
             }
             if self.actions.update_display_name {
                 UpdateDisplayNameAction {
                     display_name: entry.display_name.clone(),
                 }
-                .write_into(buf)?;
+                .azalea_write(buf)?;
             }
         }
 
@@ -170,12 +177,13 @@ pub struct ActionEnumSet {
     pub update_listed: bool,
     pub update_latency: bool,
     pub update_display_name: bool,
+    pub update_hat: bool,
     pub update_list_order: bool,
 }
 
-impl McBufReadable for ActionEnumSet {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let set = FixedBitSet::<7>::read_from(buf)?;
+impl AzaleaRead for ActionEnumSet {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let set = FixedBitSet::<7>::azalea_read(buf)?;
         Ok(ActionEnumSet {
             add_player: set.index(0),
             initialize_chat: set.index(1),
@@ -183,13 +191,14 @@ impl McBufReadable for ActionEnumSet {
             update_listed: set.index(3),
             update_latency: set.index(4),
             update_display_name: set.index(5),
-            update_list_order: set.index(6),
+            update_hat: set.index(6),
+            update_list_order: set.index(7),
         })
     }
 }
 
-impl McBufWritable for ActionEnumSet {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ActionEnumSet {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<7>::new();
         if self.add_player {
             set.set(0);
@@ -209,10 +218,13 @@ impl McBufWritable for ActionEnumSet {
         if self.update_display_name {
             set.set(5);
         }
-        if self.update_list_order {
+        if self.update_hat {
             set.set(6);
         }
-        set.write_into(buf)?;
+        if self.update_list_order {
+            set.set(7);
+        }
+        set.azalea_write(buf)?;
         Ok(())
     }
 }
@@ -230,12 +242,13 @@ mod tests {
             update_listed: false,
             update_latency: true,
             update_display_name: false,
+            update_hat: false,
             update_list_order: true,
         };
         let mut buf = Vec::new();
-        data.write_into(&mut buf).unwrap();
+        data.azalea_write(&mut buf).unwrap();
         let mut data_cursor: Cursor<&[u8]> = Cursor::new(&buf);
-        let read_data = ActionEnumSet::read_from(&mut data_cursor).unwrap();
+        let read_data = ActionEnumSet::azalea_read(&mut data_cursor).unwrap();
         assert_eq!(read_data, data);
     }
 
@@ -308,6 +321,6 @@ mod tests {
                 0,
             ][..],
         );
-        let _packet = ClientboundPlayerInfoUpdatePacket::read_from(&mut bytes).unwrap();
+        let _packet = ClientboundPlayerInfoUpdate::azalea_read(&mut bytes).unwrap();
     }
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_player_look_at_packet.rs b/azalea-protocol/src/packets/game/c_player_look_at.rs
similarity index 61%
rename from azalea-protocol/src/packets/game/clientbound_player_look_at_packet.rs
rename to azalea-protocol/src/packets/game/c_player_look_at.rs
index 47c63d1f4..4d8868140 100755
--- a/azalea-protocol/src/packets/game/clientbound_player_look_at_packet.rs
+++ b/azalea-protocol/src/packets/game/c_player_look_at.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerLookAtPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerLookAt {
     pub from_anchor: Anchor,
     pub x: f64,
     pub y: f64,
@@ -10,13 +10,13 @@ pub struct ClientboundPlayerLookAtPacket {
     pub entity: Option<AtEntity>,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Anchor {
     Feet = 0,
     Eyes = 1,
 }
 
-#[derive(McBuf, Clone, Debug)]
+#[derive(AzBuf, Clone, Debug)]
 pub struct AtEntity {
     #[var]
     pub entity: u32,
diff --git a/azalea-protocol/src/packets/game/clientbound_player_position_packet.rs b/azalea-protocol/src/packets/game/c_player_position.rs
similarity index 68%
rename from azalea-protocol/src/packets/game/clientbound_player_position_packet.rs
rename to azalea-protocol/src/packets/game/c_player_position.rs
index 2a9cebc60..aa030fc57 100755
--- a/azalea-protocol/src/packets/game/clientbound_player_position_packet.rs
+++ b/azalea-protocol/src/packets/game/c_player_position.rs
@@ -1,11 +1,11 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError};
 use azalea_core::{bitset::FixedBitSet, position::Vec3};
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerPositionPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerPosition {
     #[var]
     pub id: u32,
     pub pos: Vec3,
@@ -24,10 +24,10 @@ pub struct RelativeMovements {
     pub x_rot: bool,
 }
 
-impl McBufReadable for RelativeMovements {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for RelativeMovements {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         // yes minecraft seriously wastes that many bits, smh
-        let set = FixedBitSet::<32>::read_from(buf)?;
+        let set = FixedBitSet::<32>::azalea_read(buf)?;
         Ok(RelativeMovements {
             x: set.index(0),
             y: set.index(1),
@@ -38,8 +38,8 @@ impl McBufReadable for RelativeMovements {
     }
 }
 
-impl McBufWritable for RelativeMovements {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for RelativeMovements {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<5>::new();
         if self.x {
             set.set(0);
@@ -56,6 +56,6 @@ impl McBufWritable for RelativeMovements {
         if self.x_rot {
             set.set(4);
         }
-        set.write_into(buf)
+        set.azalea_write(buf)
     }
 }
diff --git a/azalea-protocol/src/packets/game/c_player_rotation.rs b/azalea-protocol/src/packets/game/c_player_rotation.rs
new file mode 100755
index 000000000..33214cf9e
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_player_rotation.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPlayerRotation {
+    pub y_rot: f32,
+    pub x_rot: f32,
+}
diff --git a/azalea-protocol/src/packets/game/c_pong_response.rs b/azalea-protocol/src/packets/game/c_pong_response.rs
new file mode 100755
index 000000000..835666db6
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_pong_response.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundPongResponse {
+    pub time: u64,
+}
diff --git a/azalea-protocol/src/packets/game/c_projectile_power.rs b/azalea-protocol/src/packets/game/c_projectile_power.rs
new file mode 100644
index 000000000..8b453ae2b
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_projectile_power.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundProjectilePower {
+    pub id: u32,
+    pub acceleration_power: f64,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_recipe_book_add_packet.rs b/azalea-protocol/src/packets/game/c_recipe_book_add.rs
similarity index 79%
rename from azalea-protocol/src/packets/game/clientbound_recipe_book_add_packet.rs
rename to azalea-protocol/src/packets/game/c_recipe_book_add.rs
index e025da7dc..e6b911306 100755
--- a/azalea-protocol/src/packets/game/clientbound_recipe_book_add_packet.rs
+++ b/azalea-protocol/src/packets/game/c_recipe_book_add.rs
@@ -1,21 +1,21 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-use super::clientbound_update_recipes_packet::{Ingredient, SlotDisplayData};
+use super::c_update_recipes::{Ingredient, SlotDisplayData};
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundRecipeBookAddPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundRecipeBookAdd {
     pub entries: Vec<Entry>,
     pub replace: bool,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct Entry {
     pub contents: RecipeDisplayEntry,
     pub flags: u8,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct RecipeDisplayEntry {
     #[var]
     pub id: u32,
@@ -28,7 +28,7 @@ pub struct RecipeDisplayEntry {
 }
 
 /// [`azalea_registry::RecipeDisplay`]
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub enum RecipeDisplayData {
     Shapeless(ShapelessCraftingRecipeDisplay),
     Shaped(ShapedCraftingRecipeDisplay),
@@ -37,13 +37,13 @@ pub enum RecipeDisplayData {
     Smithing(SmithingRecipeDisplay),
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct ShapelessCraftingRecipeDisplay {
     pub ingredients: Vec<SlotDisplayData>,
     pub result: SlotDisplayData,
     pub crafting_station: SlotDisplayData,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct ShapedCraftingRecipeDisplay {
     #[var]
     pub width: u32,
@@ -53,7 +53,7 @@ pub struct ShapedCraftingRecipeDisplay {
     pub result: SlotDisplayData,
     pub crafting_station: SlotDisplayData,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct FurnaceRecipeDisplay {
     pub ingredient: SlotDisplayData,
     pub fuel: SlotDisplayData,
@@ -63,13 +63,13 @@ pub struct FurnaceRecipeDisplay {
     pub duration: u32,
     pub experience: f32,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct StonecutterRecipeDisplay {
     pub input: SlotDisplayData,
     pub result: SlotDisplayData,
     pub crafting_station: SlotDisplayData,
 }
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct SmithingRecipeDisplay {
     pub template: SlotDisplayData,
     pub base: SlotDisplayData,
diff --git a/azalea-protocol/src/packets/game/c_recipe_book_remove.rs b/azalea-protocol/src/packets/game/c_recipe_book_remove.rs
new file mode 100755
index 000000000..aa5a09fe3
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_recipe_book_remove.rs
@@ -0,0 +1,12 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+use super::{c_entity_position_sync::PositionMoveRotation, c_player_position::RelativeMovements};
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundRecipeBookRemove {
+    #[var]
+    pub id: u32,
+    pub change: PositionMoveRotation,
+    pub relatives: RelativeMovements,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_recipe_book_settings_packet.rs b/azalea-protocol/src/packets/game/c_recipe_book_settings.rs
similarity index 73%
rename from azalea-protocol/src/packets/game/clientbound_recipe_book_settings_packet.rs
rename to azalea-protocol/src/packets/game/c_recipe_book_settings.rs
index 1180bd261..f88a97334 100755
--- a/azalea-protocol/src/packets/game/clientbound_recipe_book_settings_packet.rs
+++ b/azalea-protocol/src/packets/game/c_recipe_book_settings.rs
@@ -1,12 +1,12 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundRecipeBookSettingsPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundRecipeBookSettings {
     pub book_settings: RecipeBookSettings,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct RecipeBookSettings {
     pub gui_open: bool,
     pub filtering_craftable: bool,
diff --git a/azalea-protocol/src/packets/game/c_remove_entities.rs b/azalea-protocol/src/packets/game/c_remove_entities.rs
new file mode 100755
index 000000000..f3eb71399
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_remove_entities.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundRemoveEntities {
+    #[var]
+    pub entity_ids: Vec<u32>,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_remove_mob_effect_packet.rs b/azalea-protocol/src/packets/game/c_remove_mob_effect.rs
similarity index 51%
rename from azalea-protocol/src/packets/game/clientbound_remove_mob_effect_packet.rs
rename to azalea-protocol/src/packets/game/c_remove_mob_effect.rs
index 87bf81bdc..21500db3b 100755
--- a/azalea-protocol/src/packets/game/clientbound_remove_mob_effect_packet.rs
+++ b/azalea-protocol/src/packets/game/c_remove_mob_effect.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundRemoveMobEffectPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundRemoveMobEffect {
     #[var]
     pub entity_id: u32,
     pub effect: azalea_registry::MobEffect,
diff --git a/azalea-protocol/src/packets/game/c_reset_score.rs b/azalea-protocol/src/packets/game/c_reset_score.rs
new file mode 100644
index 000000000..8a40dd0d6
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_reset_score.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundResetScore {
+    pub owner: String,
+    pub objective_name: Option<String>,
+}
diff --git a/azalea-protocol/src/packets/game/c_resource_pack_pop.rs b/azalea-protocol/src/packets/game/c_resource_pack_pop.rs
new file mode 100644
index 000000000..14150ea19
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_resource_pack_pop.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+use uuid::Uuid;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundResourcePackPop {
+    pub id: Option<Uuid>,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_resource_pack_push_packet.rs b/azalea-protocol/src/packets/game/c_resource_pack_push.rs
similarity index 64%
rename from azalea-protocol/src/packets/game/clientbound_resource_pack_push_packet.rs
rename to azalea-protocol/src/packets/game/c_resource_pack_push.rs
index 1d5e00b1f..6e355029d 100644
--- a/azalea-protocol/src/packets/game/clientbound_resource_pack_push_packet.rs
+++ b/azalea-protocol/src/packets/game/c_resource_pack_push.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 use uuid::Uuid;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundResourcePackPushPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundResourcePackPush {
     pub id: Uuid,
     pub url: String,
     pub hash: String,
diff --git a/azalea-protocol/src/packets/game/clientbound_respawn_packet.rs b/azalea-protocol/src/packets/game/c_respawn.rs
similarity index 59%
rename from azalea-protocol/src/packets/game/clientbound_respawn_packet.rs
rename to azalea-protocol/src/packets/game/c_respawn.rs
index 7e20a8430..79bbfd1d1 100755
--- a/azalea-protocol/src/packets/game/clientbound_respawn_packet.rs
+++ b/azalea-protocol/src/packets/game/c_respawn.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
 use crate::packets::common::CommonPlayerSpawnInfo;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundRespawnPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundRespawn {
     pub common: CommonPlayerSpawnInfo,
     pub data_to_keep: u8,
 }
diff --git a/azalea-protocol/src/packets/game/c_rotate_head.rs b/azalea-protocol/src/packets/game/c_rotate_head.rs
new file mode 100755
index 000000000..26e559489
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_rotate_head.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundRotateHead {
+    #[var]
+    pub entity_id: u32,
+    pub y_head_rot: i8,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_section_blocks_update_packet.rs b/azalea-protocol/src/packets/game/c_section_blocks_update.rs
similarity index 64%
rename from azalea-protocol/src/packets/game/clientbound_section_blocks_update_packet.rs
rename to azalea-protocol/src/packets/game/c_section_blocks_update.rs
index e92ca422d..4554c015d 100755
--- a/azalea-protocol/src/packets/game/clientbound_section_blocks_update_packet.rs
+++ b/azalea-protocol/src/packets/game/c_section_blocks_update.rs
@@ -1,14 +1,12 @@
 use std::io::{Cursor, Write};
 
 use azalea_block::BlockState;
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_core::position::{ChunkSectionBlockPos, ChunkSectionPos};
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSectionBlocksUpdatePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSectionBlocksUpdate {
     pub section_pos: ChunkSectionPos,
     pub states: Vec<BlockStateWithPosition>,
 }
@@ -19,9 +17,9 @@ pub struct BlockStateWithPosition {
     pub state: BlockState,
 }
 
-impl McBufReadable for BlockStateWithPosition {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let data = u64::var_read_from(buf)?;
+impl AzaleaRead for BlockStateWithPosition {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let data = u64::azalea_read_var(buf)?;
         let position_part = data & 4095;
         let state = (data >> 12) as u32;
         let state = BlockState::try_from(state)
@@ -35,11 +33,11 @@ impl McBufReadable for BlockStateWithPosition {
     }
 }
 
-impl McBufWritable for BlockStateWithPosition {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for BlockStateWithPosition {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let data = (self.state.id as u64) << 12
             | (u64::from(self.pos.x) << 8 | u64::from(self.pos.z) << 4 | u64::from(self.pos.y));
-        u64::var_write_into(&data, buf)?;
+        u64::azalea_write_var(&data, buf)?;
         Ok(())
     }
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_select_advancements_tab_packet.rs b/azalea-protocol/src/packets/game/c_select_advancements_tab.rs
similarity index 53%
rename from azalea-protocol/src/packets/game/clientbound_select_advancements_tab_packet.rs
rename to azalea-protocol/src/packets/game/c_select_advancements_tab.rs
index c0d5f2ee7..eb4cc62af 100755
--- a/azalea-protocol/src/packets/game/clientbound_select_advancements_tab_packet.rs
+++ b/azalea-protocol/src/packets/game/c_select_advancements_tab.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSelectAdvancementsTabPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSelectAdvancementsTab {
     pub tab: Option<ResourceLocation>,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs b/azalea-protocol/src/packets/game/c_server_data.rs
similarity index 56%
rename from azalea-protocol/src/packets/game/clientbound_server_data_packet.rs
rename to azalea-protocol/src/packets/game/c_server_data.rs
index a70a0aec5..221166855 100755
--- a/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs
+++ b/azalea-protocol/src/packets/game/c_server_data.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundServerDataPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundServerData {
     pub motd: FormattedText,
     pub icon_bytes: Option<Vec<u8>>,
 }
diff --git a/azalea-protocol/src/packets/game/c_server_links.rs b/azalea-protocol/src/packets/game/c_server_links.rs
new file mode 100644
index 000000000..80c444f02
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_server_links.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+use crate::common::server_links::ServerLinkEntry;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundServerLinks {
+    pub links: Vec<ServerLinkEntry>,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_action_bar_text.rs b/azalea-protocol/src/packets/game/c_set_action_bar_text.rs
new file mode 100755
index 000000000..d08c50218
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_action_bar_text.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_chat::FormattedText;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetActionBarText {
+    pub text: FormattedText,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_border_center.rs b/azalea-protocol/src/packets/game/c_set_border_center.rs
new file mode 100755
index 000000000..afc495565
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_border_center.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetBorderCenter {
+    pub new_center_x: f64,
+    pub new_center_z: f64,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_border_lerp_size_packet.rs b/azalea-protocol/src/packets/game/c_set_border_lerp_size.rs
similarity index 51%
rename from azalea-protocol/src/packets/game/clientbound_set_border_lerp_size_packet.rs
rename to azalea-protocol/src/packets/game/c_set_border_lerp_size.rs
index 5c80e897c..3c70a40e9 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_border_lerp_size_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_border_lerp_size.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetBorderLerpSizePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetBorderLerpSize {
     pub old_size: f64,
     pub new_size: f64,
     #[var]
diff --git a/azalea-protocol/src/packets/game/c_set_border_size.rs b/azalea-protocol/src/packets/game/c_set_border_size.rs
new file mode 100755
index 000000000..6884cde6d
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_border_size.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetBorderSize {
+    pub size: f64,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_border_warning_delay.rs b/azalea-protocol/src/packets/game/c_set_border_warning_delay.rs
new file mode 100755
index 000000000..e1126165b
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_border_warning_delay.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetBorderWarningDelay {
+    #[var]
+    pub warning_delay: u32,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_border_warning_distance.rs b/azalea-protocol/src/packets/game/c_set_border_warning_distance.rs
new file mode 100755
index 000000000..dbb2a742c
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_border_warning_distance.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetBorderWarningDistance {
+    #[var]
+    pub warning_blocks: u32,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_camera.rs b/azalea-protocol/src/packets/game/c_set_camera.rs
new file mode 100755
index 000000000..4ce4547c3
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_camera.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetCamera {
+    #[var]
+    pub camera_id: u32,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_chunk_cache_center.rs b/azalea-protocol/src/packets/game/c_set_chunk_cache_center.rs
new file mode 100755
index 000000000..4c66213c0
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_chunk_cache_center.rs
@@ -0,0 +1,10 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetChunkCacheCenter {
+    #[var]
+    pub x: i32,
+    #[var]
+    pub z: i32,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_chunk_cache_radius.rs b/azalea-protocol/src/packets/game/c_set_chunk_cache_radius.rs
new file mode 100755
index 000000000..b992e5728
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_chunk_cache_radius.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetChunkCacheRadius {
+    #[var]
+    pub radius: u32,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_cursor_item.rs b/azalea-protocol/src/packets/game/c_set_cursor_item.rs
new file mode 100644
index 000000000..2c10ae26a
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_cursor_item.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_inventory::ItemStack;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetCursorItem {
+    pub contents: Option<ItemStack>,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_default_spawn_position_packet.rs b/azalea-protocol/src/packets/game/c_set_default_spawn_position.rs
similarity index 50%
rename from azalea-protocol/src/packets/game/clientbound_set_default_spawn_position_packet.rs
rename to azalea-protocol/src/packets/game/c_set_default_spawn_position.rs
index b45b645de..b6262ac83 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_default_spawn_position_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_default_spawn_position.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetDefaultSpawnPositionPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetDefaultSpawnPosition {
     pub pos: BlockPos,
     pub angle: f32,
 }
diff --git a/azalea-protocol/src/packets/game/c_set_display_chat_preview.rs b/azalea-protocol/src/packets/game/c_set_display_chat_preview.rs
new file mode 100755
index 000000000..df2a62d4a
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_display_chat_preview.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetDisplayChatPreview {
+    pub enabled: bool,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_display_objective_packet.rs b/azalea-protocol/src/packets/game/c_set_display_objective.rs
similarity index 72%
rename from azalea-protocol/src/packets/game/clientbound_set_display_objective_packet.rs
rename to azalea-protocol/src/packets/game/c_set_display_objective.rs
index 7e5ed3171..12118772a 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_display_objective_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_display_objective.rs
@@ -1,13 +1,13 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetDisplayObjectivePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetDisplayObjective {
     pub slot: DisplaySlot,
     pub objective_name: String,
 }
 
-#[derive(Clone, Debug, Copy, McBuf)]
+#[derive(Clone, Debug, Copy, AzBuf)]
 pub enum DisplaySlot {
     List = 0,
     Sidebar,
diff --git a/azalea-protocol/src/packets/game/clientbound_set_entity_data_packet.rs b/azalea-protocol/src/packets/game/c_set_entity_data.rs
similarity index 57%
rename from azalea-protocol/src/packets/game/clientbound_set_entity_data_packet.rs
rename to azalea-protocol/src/packets/game/c_set_entity_data.rs
index 7d869650d..da6536fe5 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_entity_data_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_entity_data.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_entity::EntityMetadataItems;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetEntityDataPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetEntityData {
     #[var]
     pub id: u32,
     pub packed_items: EntityMetadataItems,
diff --git a/azalea-protocol/src/packets/game/c_set_entity_link.rs b/azalea-protocol/src/packets/game/c_set_entity_link.rs
new file mode 100755
index 000000000..c4ce8bdf4
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_entity_link.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetEntityLink {
+    pub source_id: u32,
+    pub dest_id: u32,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_entity_motion_packet.rs b/azalea-protocol/src/packets/game/c_set_entity_motion.rs
similarity index 51%
rename from azalea-protocol/src/packets/game/clientbound_set_entity_motion_packet.rs
rename to azalea-protocol/src/packets/game/c_set_entity_motion.rs
index 4dcd807db..d0dd76987 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_entity_motion_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_entity_motion.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetEntityMotionPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetEntityMotion {
     #[var]
     pub id: u32,
     pub xa: i16,
diff --git a/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs b/azalea-protocol/src/packets/game/c_set_equipment.rs
similarity index 67%
rename from azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs
rename to azalea-protocol/src/packets/game/c_set_equipment.rs
index 165d05dbf..637b2b52a 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_equipment.rs
@@ -1,12 +1,12 @@
 use std::io::Cursor;
 
-use azalea_buf::{BufReadError, McBuf};
-use azalea_buf::{McBufReadable, McBufWritable};
-use azalea_inventory::ItemSlot;
+use azalea_buf::{AzBuf, BufReadError};
+use azalea_buf::{AzaleaRead, AzaleaWrite};
+use azalea_inventory::ItemStack;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetEquipmentPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetEquipment {
     #[var]
     pub entity_id: u32,
     pub slots: EquipmentSlots,
@@ -14,22 +14,22 @@ pub struct ClientboundSetEquipmentPacket {
 
 #[derive(Clone, Debug)]
 pub struct EquipmentSlots {
-    pub slots: Vec<(EquipmentSlot, ItemSlot)>,
+    pub slots: Vec<(EquipmentSlot, ItemStack)>,
 }
 
-impl McBufReadable for EquipmentSlots {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for EquipmentSlots {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
         let mut slots = vec![];
 
         loop {
-            let equipment_byte = u8::read_from(buf)?;
+            let equipment_byte = u8::azalea_read(buf)?;
             let equipment_slot =
                 EquipmentSlot::from_byte(equipment_byte & 127).ok_or_else(|| {
                     BufReadError::UnexpectedEnumVariant {
                         id: equipment_byte.into(),
                     }
                 })?;
-            let item = ItemSlot::read_from(buf)?;
+            let item = ItemStack::azalea_read(buf)?;
             slots.push((equipment_slot, item));
             if equipment_byte & 128 == 0 {
                 break;
@@ -39,23 +39,23 @@ impl McBufReadable for EquipmentSlots {
         Ok(EquipmentSlots { slots })
     }
 }
-impl McBufWritable for EquipmentSlots {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for EquipmentSlots {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
         for i in 0..self.slots.len() {
             let (equipment_slot, item) = &self.slots[i];
             let mut equipment_byte = *equipment_slot as u8;
             if i != self.slots.len() - 1 {
                 equipment_byte |= 128;
             }
-            equipment_byte.write_into(buf)?;
-            item.write_into(buf)?;
+            equipment_byte.azalea_write(buf)?;
+            item.azalea_write(buf)?;
         }
 
         Ok(())
     }
 }
 
-#[derive(Clone, Debug, Copy, McBuf)]
+#[derive(Clone, Debug, Copy, AzBuf)]
 pub enum EquipmentSlot {
     MainHand = 0,
     OffHand = 1,
diff --git a/azalea-protocol/src/packets/game/clientbound_set_experience_packet.rs b/azalea-protocol/src/packets/game/c_set_experience.rs
similarity index 58%
rename from azalea-protocol/src/packets/game/clientbound_set_experience_packet.rs
rename to azalea-protocol/src/packets/game/c_set_experience.rs
index f9590e264..c11482a02 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_experience_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_experience.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetExperiencePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetExperience {
     pub experience_progress: f32,
     #[var]
     pub experience_level: u32,
diff --git a/azalea-protocol/src/packets/game/clientbound_set_health_packet.rs b/azalea-protocol/src/packets/game/c_set_health.rs
similarity index 52%
rename from azalea-protocol/src/packets/game/clientbound_set_health_packet.rs
rename to azalea-protocol/src/packets/game/c_set_health.rs
index 72b7554d9..56f3fe03b 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_health_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_health.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetHealthPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetHealth {
     pub health: f32,
     #[var]
     pub food: u32,
diff --git a/azalea-protocol/src/packets/game/c_set_held_slot.rs b/azalea-protocol/src/packets/game/c_set_held_slot.rs
new file mode 100644
index 000000000..81c21651d
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_held_slot.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetHeldSlot {
+    pub slot: u8,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_objective.rs b/azalea-protocol/src/packets/game/c_set_objective.rs
new file mode 100755
index 000000000..7ddb3f717
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_objective.rs
@@ -0,0 +1,82 @@
+use std::io::{Cursor, Write};
+
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite};
+use azalea_chat::{numbers::NumberFormat, FormattedText};
+use azalea_core::objectives::ObjectiveCriteria;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetObjective {
+    pub objective_name: String,
+    pub method: Method,
+}
+
+#[derive(Clone, Copy, Debug, AzBuf)]
+pub enum MethodKind {
+    Add,
+    Remove,
+    Change,
+}
+
+#[derive(Clone, Debug)]
+pub enum Method {
+    Add {
+        display_name: FormattedText,
+        render_type: ObjectiveCriteria,
+        number_format: NumberFormat,
+    },
+    Remove,
+    Change {
+        display_name: FormattedText,
+        render_type: ObjectiveCriteria,
+        number_format: NumberFormat,
+    },
+}
+
+impl AzaleaRead for Method {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+        let kind = MethodKind::azalea_read(buf)?;
+        match kind {
+            MethodKind::Add => Ok(Method::Add {
+                display_name: FormattedText::azalea_read(buf)?,
+                render_type: ObjectiveCriteria::azalea_read(buf)?,
+                number_format: NumberFormat::azalea_read(buf)?,
+            }),
+            MethodKind::Remove => Ok(Method::Remove),
+            MethodKind::Change => Ok(Method::Change {
+                display_name: FormattedText::azalea_read(buf)?,
+                render_type: ObjectiveCriteria::azalea_read(buf)?,
+                number_format: NumberFormat::azalea_read(buf)?,
+            }),
+        }
+    }
+}
+
+impl AzaleaWrite for Method {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        match self {
+            Method::Add {
+                display_name,
+                render_type,
+                number_format,
+            } => {
+                MethodKind::Add.azalea_write(buf)?;
+                display_name.azalea_write(buf)?;
+                render_type.azalea_write(buf)?;
+                number_format.azalea_write(buf)?;
+            }
+            Method::Remove => MethodKind::Remove.azalea_write(buf)?,
+            Method::Change {
+                display_name,
+                render_type,
+                number_format,
+            } => {
+                MethodKind::Change.azalea_write(buf)?;
+                display_name.azalea_write(buf)?;
+                render_type.azalea_write(buf)?;
+                number_format.azalea_write(buf)?;
+            }
+        }
+        Ok(())
+    }
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_passengers_packet.rs b/azalea-protocol/src/packets/game/c_set_passengers.rs
similarity index 51%
rename from azalea-protocol/src/packets/game/clientbound_set_passengers_packet.rs
rename to azalea-protocol/src/packets/game/c_set_passengers.rs
index ac337d6e6..76fc3ca02 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_passengers_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_passengers.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetPassengersPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetPassengers {
     #[var]
     pub vehicle: u32,
     #[var]
diff --git a/azalea-protocol/src/packets/game/c_set_player_inventory.rs b/azalea-protocol/src/packets/game/c_set_player_inventory.rs
new file mode 100644
index 000000000..ca8955ee7
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_player_inventory.rs
@@ -0,0 +1,10 @@
+use azalea_buf::AzBuf;
+use azalea_inventory::ItemStack;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetPlayerInventory {
+    #[var]
+    pub slot: i32,
+    pub contents: Option<ItemStack>,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_player_team.rs b/azalea-protocol/src/packets/game/c_set_player_team.rs
new file mode 100755
index 000000000..38249cf3d
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_player_team.rs
@@ -0,0 +1,74 @@
+use std::io::{Cursor, Write};
+
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError};
+use azalea_chat::{style::ChatFormatting, FormattedText};
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetPlayerTeam {
+    pub name: String,
+    pub method: Method,
+}
+
+#[derive(Clone, Debug)]
+pub enum Method {
+    Add((Parameters, PlayerList)),
+    Remove,
+    Change(Parameters),
+    Join(PlayerList),
+    Leave(PlayerList),
+}
+
+impl AzaleaRead for Method {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        Ok(match u8::azalea_read(buf)? {
+            0 => Method::Add((Parameters::azalea_read(buf)?, PlayerList::azalea_read(buf)?)),
+            1 => Method::Remove,
+            2 => Method::Change(Parameters::azalea_read(buf)?),
+            3 => Method::Join(PlayerList::azalea_read(buf)?),
+            4 => Method::Leave(PlayerList::azalea_read(buf)?),
+            id => return Err(BufReadError::UnexpectedEnumVariant { id: i32::from(id) }),
+        })
+    }
+}
+
+impl AzaleaWrite for Method {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        match self {
+            Method::Add((parameters, playerlist)) => {
+                0u8.azalea_write(buf)?;
+                parameters.azalea_write(buf)?;
+                playerlist.azalea_write(buf)?;
+            }
+            Method::Remove => {
+                1u8.azalea_write(buf)?;
+            }
+            Method::Change(parameters) => {
+                2u8.azalea_write(buf)?;
+                parameters.azalea_write(buf)?;
+            }
+            Method::Join(playerlist) => {
+                3u8.azalea_write(buf)?;
+                playerlist.azalea_write(buf)?;
+            }
+            Method::Leave(playerlist) => {
+                4u8.azalea_write(buf)?;
+                playerlist.azalea_write(buf)?;
+            }
+        }
+        Ok(())
+    }
+}
+
+#[derive(AzBuf, Clone, Debug)]
+pub struct Parameters {
+    pub display_name: FormattedText,
+    pub options: u8,
+    pub nametag_visibility: String,
+    pub collision_rule: String,
+    pub color: ChatFormatting,
+    pub player_prefix: FormattedText,
+    pub player_suffix: FormattedText,
+}
+
+type PlayerList = Vec<String>;
diff --git a/azalea-protocol/src/packets/game/clientbound_set_score_packet.rs b/azalea-protocol/src/packets/game/c_set_score.rs
similarity index 70%
rename from azalea-protocol/src/packets/game/clientbound_set_score_packet.rs
rename to azalea-protocol/src/packets/game/c_set_score.rs
index 6de53f749..5a16d1346 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_score_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_score.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::{numbers::NumberFormat, FormattedText};
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetScorePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetScore {
     pub owner: String,
     pub objective_name: String,
     #[var]
diff --git a/azalea-protocol/src/packets/game/c_set_simulation_distance.rs b/azalea-protocol/src/packets/game/c_set_simulation_distance.rs
new file mode 100755
index 000000000..2a80d1f15
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_simulation_distance.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetSimulationDistance {
+    #[var]
+    pub simulation_distance: u32,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_subtitle_text.rs b/azalea-protocol/src/packets/game/c_set_subtitle_text.rs
new file mode 100755
index 000000000..31405739f
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_subtitle_text.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_chat::FormattedText;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetSubtitleText {
+    pub text: FormattedText,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_time_packet.rs b/azalea-protocol/src/packets/game/c_set_time.rs
similarity index 53%
rename from azalea-protocol/src/packets/game/clientbound_set_time_packet.rs
rename to azalea-protocol/src/packets/game/c_set_time.rs
index b73f082dd..b1970eec2 100755
--- a/azalea-protocol/src/packets/game/clientbound_set_time_packet.rs
+++ b/azalea-protocol/src/packets/game/c_set_time.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetTimePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetTime {
     pub game_time: u64,
     pub day_time: u64,
     pub tick_day_time: bool,
diff --git a/azalea-protocol/src/packets/game/c_set_title_text.rs b/azalea-protocol/src/packets/game/c_set_title_text.rs
new file mode 100755
index 000000000..4ef3e590c
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_title_text.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_chat::FormattedText;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetTitleText {
+    pub text: FormattedText,
+}
diff --git a/azalea-protocol/src/packets/game/c_set_titles_animation.rs b/azalea-protocol/src/packets/game/c_set_titles_animation.rs
new file mode 100755
index 000000000..cc0c37fc0
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_set_titles_animation.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSetTitlesAnimation {
+    pub fade_in: u32,
+    pub stay: u32,
+    pub fade_out: u32,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_sound_packet.rs b/azalea-protocol/src/packets/game/c_sound.rs
similarity index 74%
rename from azalea-protocol/src/packets/game/clientbound_sound_packet.rs
rename to azalea-protocol/src/packets/game/c_sound.rs
index 4d2493ede..771617698 100755
--- a/azalea-protocol/src/packets/game/clientbound_sound_packet.rs
+++ b/azalea-protocol/src/packets/game/c_sound.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 use azalea_registry::SoundEvent;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSoundPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSound {
     pub sound: SoundEvent,
     pub source: SoundSource,
     pub x: i32,
@@ -14,7 +14,7 @@ pub struct ClientboundSoundPacket {
     pub seed: u64,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum SoundSource {
     Master = 0,
     Music = 1,
diff --git a/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs b/azalea-protocol/src/packets/game/c_sound_entity.rs
similarity index 70%
rename from azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs
rename to azalea-protocol/src/packets/game/c_sound_entity.rs
index 2e9252ae7..96b22cb88 100755
--- a/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs
+++ b/azalea-protocol/src/packets/game/c_sound_entity.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSoundEntityPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundSoundEntity {
     pub source: SoundSource,
     #[var]
     pub id: u32,
@@ -12,7 +12,7 @@ pub struct ClientboundSoundEntityPacket {
     pub seed: u64,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum SoundSource {
     Master = 0,
     Music = 1,
diff --git a/azalea-protocol/src/packets/game/c_start_configuration.rs b/azalea-protocol/src/packets/game/c_start_configuration.rs
new file mode 100644
index 000000000..6955b70d8
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_start_configuration.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundStartConfiguration {}
diff --git a/azalea-protocol/src/packets/game/clientbound_stop_sound_packet.rs b/azalea-protocol/src/packets/game/c_stop_sound.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/clientbound_stop_sound_packet.rs
rename to azalea-protocol/src/packets/game/c_stop_sound.rs
index 48c802371..0a01fa714 100755
--- a/azalea-protocol/src/packets/game/clientbound_stop_sound_packet.rs
+++ b/azalea-protocol/src/packets/game/c_stop_sound.rs
@@ -1,27 +1,27 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBufReadable, McBufWritable};
+use azalea_buf::{BufReadError, AzaleaRead, AzaleaWrite};
 use azalea_core::{bitset::FixedBitSet, resource_location::ResourceLocation};
 use azalea_protocol_macros::ClientboundGamePacket;
 
-use super::clientbound_sound_packet::SoundSource;
+use super::c_sound::SoundSource;
 
 #[derive(Clone, Debug, ClientboundGamePacket)]
-pub struct ClientboundStopSoundPacket {
+pub struct ClientboundStopSound {
     pub source: Option<SoundSource>,
     pub name: Option<ResourceLocation>,
 }
 
-impl McBufReadable for ClientboundStopSoundPacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let set = FixedBitSet::<2>::read_from(buf)?;
+impl AzaleaRead for ClientboundStopSound {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let set = FixedBitSet::<2>::azalea_read(buf)?;
         let source = if set.index(0) {
-            Some(SoundSource::read_from(buf)?)
+            Some(SoundSource::azalea_read(buf)?)
         } else {
             None
         };
         let name = if set.index(1) {
-            Some(ResourceLocation::read_from(buf)?)
+            Some(ResourceLocation::azalea_read(buf)?)
         } else {
             None
         };
@@ -30,8 +30,8 @@ impl McBufReadable for ClientboundStopSoundPacket {
     }
 }
 
-impl McBufWritable for ClientboundStopSoundPacket {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ClientboundStopSound {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<2>::new();
         if self.source.is_some() {
             set.set(0);
@@ -39,12 +39,12 @@ impl McBufWritable for ClientboundStopSoundPacket {
         if self.name.is_some() {
             set.set(1);
         }
-        set.write_into(buf)?;
+        set.azalea_write(buf)?;
         if let Some(source) = &self.source {
-            source.write_into(buf)?;
+            source.azalea_write(buf)?;
         }
         if let Some(name) = &self.name {
-            name.write_into(buf)?;
+            name.azalea_write(buf)?;
         }
         Ok(())
     }
diff --git a/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs b/azalea-protocol/src/packets/game/c_store_cookie.rs
similarity index 58%
rename from azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs
rename to azalea-protocol/src/packets/game/c_store_cookie.rs
index 1c8ada282..a1deee4f8 100644
--- a/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs
+++ b/azalea-protocol/src/packets/game/c_store_cookie.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundStoreCookiePacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundStoreCookie {
     pub key: ResourceLocation,
     pub payload: Vec<u8>,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_system_chat_packet.rs b/azalea-protocol/src/packets/game/c_system_chat.rs
similarity index 89%
rename from azalea-protocol/src/packets/game/clientbound_system_chat_packet.rs
rename to azalea-protocol/src/packets/game/c_system_chat.rs
index 691a62a15..14dfdcbfc 100755
--- a/azalea-protocol/src/packets/game/clientbound_system_chat_packet.rs
+++ b/azalea-protocol/src/packets/game/c_system_chat.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket, PartialEq)]
-pub struct ClientboundSystemChatPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket, PartialEq)]
+pub struct ClientboundSystemChat {
     pub content: FormattedText,
     pub overlay: bool,
 }
@@ -12,18 +12,18 @@ pub struct ClientboundSystemChatPacket {
 mod tests {
     use std::io::Cursor;
 
-    use azalea_buf::McBufReadable;
+    use azalea_buf::AzaleaRead;
 
     use super::*;
 
     #[test]
-    fn test_clientbound_system_chat_packet() {
+    fn test_c_system_chat_packet() {
         #[rustfmt::skip]
         let bytes = [
             10, 9, 0, 4, 119, 105, 116, 104, 10, 0, 0, 0, 2, 10, 0, 10, 104, 111, 118, 101, 114, 69, 118, 101, 110, 116, 10, 0, 8, 99, 111, 110, 116, 101, 110, 116, 115, 8, 0, 4, 110, 97, 109, 101, 0, 3, 112, 121, 53, 11, 0, 2, 105, 100, 0, 0, 0, 4, 101, 54, 191, 237, 134, 149, 72, 253, 131, 161, 236, 210, 76, 242, 160, 253, 8, 0, 4, 116, 121, 112, 101, 0, 16, 109, 105, 110, 101, 99, 114, 97, 102, 116, 58, 112, 108, 97, 121, 101, 114, 0, 8, 0, 6, 97, 99, 116, 105, 111, 110, 0, 11, 115, 104, 111, 119, 95, 101, 110, 116, 105, 116, 121, 0, 10, 0, 10, 99, 108, 105, 99, 107, 69, 118, 101, 110, 116, 8, 0, 6, 97, 99, 116, 105, 111, 110, 0, 15, 115, 117, 103, 103, 101, 115, 116, 95, 99, 111, 109, 109, 97, 110, 100, 8, 0, 5, 118, 97, 108, 117, 101, 0, 10, 47, 116, 101, 108, 108, 32, 112, 121, 53, 32, 0, 8, 0, 9, 105, 110, 115, 101, 114, 116, 105, 111, 110, 0, 3, 112, 121, 53, 8, 0, 4, 116, 101, 120, 116, 0, 3, 112, 121, 53, 0, 9, 0, 4, 119, 105, 116, 104, 10, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 1, 0, 10, 0, 10, 104, 111, 118, 101, 114, 69, 118, 101, 110, 116, 10, 0, 8, 99, 111, 110, 116, 101, 110, 116, 115, 8, 0, 2, 105, 100, 0, 25, 109, 105, 110, 101, 99, 114, 97, 102, 116, 58, 100, 105, 97, 109, 111, 110, 100, 95, 112, 105, 99, 107, 97, 120, 101, 8, 0, 3, 116, 97, 103, 0, 10, 123, 68, 97, 109, 97, 103, 101, 58, 48, 125, 0, 8, 0, 6, 97, 99, 116, 105, 111, 110, 0, 9, 115, 104, 111, 119, 95, 105, 116, 101, 109, 0, 9, 0, 4, 119, 105, 116, 104, 10, 0, 0, 0, 1, 9, 0, 5, 101, 120, 116, 114, 97, 10, 0, 0, 0, 1, 8, 0, 9, 116, 114, 97, 110, 115, 108, 97, 116, 101, 0, 30, 105, 116, 101, 109, 46, 109, 105, 110, 101, 99, 114, 97, 102, 116, 46, 100, 105, 97, 109, 111, 110, 100, 95, 112, 105, 99, 107, 97, 120, 101, 0, 8, 0, 4, 116, 101, 120, 116, 0, 0, 0, 8, 0, 5, 99, 111, 108, 111, 114, 0, 5, 119, 104, 105, 116, 101, 8, 0, 9, 116, 114, 97, 110, 115, 108, 97, 116, 101, 0, 20, 99, 104, 97, 116, 46, 115, 113, 117, 97, 114, 101, 95, 98, 114, 97, 99, 107, 101, 116, 115, 0, 10, 0, 10, 104, 111, 118, 101, 114, 69, 118, 101, 110, 116, 10, 0, 8, 99, 111, 110, 116, 101, 110, 116, 115, 8, 0, 4, 110, 97, 109, 101, 0, 3, 112, 121, 53, 11, 0, 2, 105, 100, 0, 0, 0, 4, 101, 54, 191, 237, 134, 149, 72, 253, 131, 161, 236, 210, 76, 242, 160, 253, 8, 0, 4, 116, 121, 112, 101, 0, 16, 109, 105, 110, 101, 99, 114, 97, 102, 116, 58, 112, 108, 97, 121, 101, 114, 0, 8, 0, 6, 97, 99, 116, 105, 111, 110, 0, 11, 115, 104, 111, 119, 95, 101, 110, 116, 105, 116, 121, 0, 10, 0, 10, 99, 108, 105, 99, 107, 69, 118, 101, 110, 116, 8, 0, 6, 97, 99, 116, 105, 111, 110, 0, 15, 115, 117, 103, 103, 101, 115, 116, 95, 99, 111, 109, 109, 97, 110, 100, 8, 0, 5, 118, 97, 108, 117, 101, 0, 10, 47, 116, 101, 108, 108, 32, 112, 121, 53, 32, 0, 8, 0, 9, 105, 110, 115, 101, 114, 116, 105, 111, 110, 0, 3, 112, 121, 53, 8, 0, 4, 116, 101, 120, 116, 0, 3, 112, 121, 53, 0, 8, 0, 9, 116, 114, 97, 110, 115, 108, 97, 116, 101, 0, 28, 99, 111, 109, 109, 97, 110, 100, 115, 46, 103, 105, 118, 101, 46, 115, 117, 99, 99, 101, 115, 115, 46, 115, 105, 110, 103, 108, 101, 0, 8, 0, 5, 99, 111, 108, 111, 114, 0, 4, 103, 114, 97, 121, 1, 0, 6, 105, 116, 97, 108, 105, 99, 1, 8, 0, 9, 116, 114, 97, 110, 115, 108, 97, 116, 101, 0, 15, 99, 104, 97, 116, 46, 116, 121, 112, 101, 46, 97, 100, 109, 105, 110, 0, 0
         ];
 
-        let packet = ClientboundSystemChatPacket::read_from(&mut Cursor::new(&bytes)).unwrap();
+        let packet = ClientboundSystemChat::azalea_read(&mut Cursor::new(&bytes)).unwrap();
         assert_eq!(
             packet.content.to_string(),
             "[py5: Gave 1 [Diamond Pickaxe] to py5]".to_string()
@@ -31,12 +31,12 @@ mod tests {
     }
 
     #[test]
-    fn test_translate_with_string_array_clientbound_system_chat_packet() {
+    fn test_translate_with_string_array_c_system_chat_packet() {
         #[rustfmt::skip]
         let bytes = [
             10, 9, 0, 4, 119, 105, 116, 104, 8, 0, 0, 0, 1, 0, 14, 109, 105, 110, 101, 99, 114, 97, 102, 116, 58, 100, 117, 115, 116, 8, 0, 9, 116, 114, 97, 110, 115, 108, 97, 116, 101, 0, 25, 99, 111, 109, 109, 97, 110, 100, 115, 46, 112, 97, 114, 116, 105, 99, 108, 101, 46, 115, 117, 99, 99, 101, 115, 115, 0, 0
         ];
-        let packet = ClientboundSystemChatPacket::read_from(&mut Cursor::new(&bytes)).unwrap();
+        let packet = ClientboundSystemChat::azalea_read(&mut Cursor::new(&bytes)).unwrap();
         assert_eq!(
             packet.content.to_string(),
             "Displaying particle minecraft:dust".to_string()
diff --git a/azalea-protocol/src/packets/game/clientbound_tab_list_packet.rs b/azalea-protocol/src/packets/game/c_tab_list.rs
similarity index 86%
rename from azalea-protocol/src/packets/game/clientbound_tab_list_packet.rs
rename to azalea-protocol/src/packets/game/c_tab_list.rs
index 03557f5aa..268351da5 100755
--- a/azalea-protocol/src/packets/game/clientbound_tab_list_packet.rs
+++ b/azalea-protocol/src/packets/game/c_tab_list.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundTabListPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundTabList {
     pub header: FormattedText,
     pub footer: FormattedText,
 }
@@ -12,7 +12,7 @@ pub struct ClientboundTabListPacket {
 mod tests {
     use std::io::Cursor;
 
-    use azalea_buf::McBufReadable;
+    use azalea_buf::AzaleaRead;
 
     use super::*;
 
@@ -22,7 +22,7 @@ mod tests {
         let mut bytes = Cursor::new(&[
             10, 9, 0, 5, 101, 120, 116, 114, 97, 10, 0, 0, 0, 3, 1, 0, 4, 98, 111, 108, 100, 1, 8, 0, 4, 116, 101, 120, 116, 0, 16, 50, 66, 85, 73, 76, 68, 69, 82, 83, 50, 84, 79, 79, 76, 83, 10, 8, 0, 5, 99, 111, 108, 111, 114, 0, 4, 103, 114, 97, 121, 0, 8, 0, 0, 0, 1, 10, 0, 8, 0, 5, 99, 111, 108, 111, 114, 0, 4, 103, 111, 108, 100, 8, 0, 4, 116, 101, 120, 116, 0, 27, 80, 101, 110, 100, 105, 110, 103, 32, 99, 111, 110, 110, 101, 99, 116, 105, 111, 110, 32, 116, 111, 32, 50, 98, 50, 116, 10, 0, 8, 0, 4, 116, 101, 120, 116, 0, 1, 10, 0, 10, 9, 0, 5, 101, 120, 116, 114, 97, 10, 0, 0, 0, 1, 8, 0, 5, 99, 111, 108, 111, 114, 0, 4, 103, 111, 108, 100, 8, 0, 4, 116, 101, 120, 116, 0, 72, 84, 104, 105, 115, 32, 97, 99, 99, 111, 117, 110, 116, 32, 104, 97, 115, 32, 112, 114, 105, 111, 114, 105, 116, 121, 32, 115, 116, 97, 116, 117, 115, 32, 97, 110, 100, 32, 119, 105, 108, 108, 32, 98, 101, 32, 112, 108, 97, 99, 101, 100, 32, 105, 110, 32, 97, 32, 115, 104, 111, 114, 116, 101, 114, 32, 113, 117, 101, 117, 101, 46, 10, 0, 8, 0, 4, 116, 101, 120, 116, 0, 1, 10, 0
         ][..]);
-        let _packet = ClientboundTabListPacket::read_from(&mut bytes).unwrap();
+        let _packet = ClientboundTabList::azalea_read(&mut bytes).unwrap();
         assert!(bytes.get_ref()[bytes.position() as usize..].is_empty());
     }
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_tag_query_packet.rs b/azalea-protocol/src/packets/game/c_tag_query.rs
similarity index 55%
rename from azalea-protocol/src/packets/game/clientbound_tag_query_packet.rs
rename to azalea-protocol/src/packets/game/c_tag_query.rs
index d1073cd59..efd94e32f 100755
--- a/azalea-protocol/src/packets/game/clientbound_tag_query_packet.rs
+++ b/azalea-protocol/src/packets/game/c_tag_query.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 use simdnbt::owned::NbtTag;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundTagQueryPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundTagQuery {
     #[var]
     pub transaction_id: u32,
     pub tag: NbtTag,
diff --git a/azalea-protocol/src/packets/game/clientbound_take_item_entity_packet.rs b/azalea-protocol/src/packets/game/c_take_item_entity.rs
similarity index 55%
rename from azalea-protocol/src/packets/game/clientbound_take_item_entity_packet.rs
rename to azalea-protocol/src/packets/game/c_take_item_entity.rs
index 9e29a0fe8..0dfc85521 100755
--- a/azalea-protocol/src/packets/game/clientbound_take_item_entity_packet.rs
+++ b/azalea-protocol/src/packets/game/c_take_item_entity.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundTakeItemEntityPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundTakeItemEntity {
     #[var]
     pub item_id: u32,
     #[var]
diff --git a/azalea-protocol/src/packets/game/clientbound_teleport_entity_packet.rs b/azalea-protocol/src/packets/game/c_teleport_entity.rs
similarity index 62%
rename from azalea-protocol/src/packets/game/clientbound_teleport_entity_packet.rs
rename to azalea-protocol/src/packets/game/c_teleport_entity.rs
index c8fbc7180..0f0261332 100755
--- a/azalea-protocol/src/packets/game/clientbound_teleport_entity_packet.rs
+++ b/azalea-protocol/src/packets/game/c_teleport_entity.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::Vec3;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundTeleportEntityPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundTeleportEntity {
     #[var]
     pub id: u32,
     pub position: Vec3,
diff --git a/azalea-protocol/src/packets/game/c_ticking_state.rs b/azalea-protocol/src/packets/game/c_ticking_state.rs
new file mode 100644
index 000000000..3e4e11c27
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_ticking_state.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundTickingState {
+    pub tick_rate: f32,
+    pub is_frozen: bool,
+}
diff --git a/azalea-protocol/src/packets/game/c_ticking_step.rs b/azalea-protocol/src/packets/game/c_ticking_step.rs
new file mode 100644
index 000000000..0a1511343
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_ticking_step.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundTickingStep {
+    #[var]
+    pub tick_steps: u32,
+}
diff --git a/azalea-protocol/src/packets/game/c_transfer.rs b/azalea-protocol/src/packets/game/c_transfer.rs
new file mode 100644
index 000000000..ad7de333f
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_transfer.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundTransfer {
+    pub host: String,
+    #[var]
+    pub port: u32,
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_update_advancements_packet.rs b/azalea-protocol/src/packets/game/c_update_advancements.rs
similarity index 73%
rename from azalea-protocol/src/packets/game/clientbound_update_advancements_packet.rs
rename to azalea-protocol/src/packets/game/c_update_advancements.rs
index 5934b4436..cd0c0b980 100755
--- a/azalea-protocol/src/packets/game/clientbound_update_advancements_packet.rs
+++ b/azalea-protocol/src/packets/game/c_update_advancements.rs
@@ -1,21 +1,21 @@
 use std::collections::HashMap;
 use std::io::Cursor;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_chat::FormattedText;
 use azalea_core::resource_location::ResourceLocation;
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundUpdateAdvancementsPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundUpdateAdvancements {
     pub reset: bool,
     pub added: Vec<AdvancementHolder>,
     pub removed: Vec<ResourceLocation>,
     pub progress: HashMap<ResourceLocation, AdvancementProgress>,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct Advancement {
     pub parent_id: Option<ResourceLocation>,
     pub display: Option<DisplayInfo>,
@@ -27,7 +27,7 @@ pub struct Advancement {
 pub struct DisplayInfo {
     pub title: FormattedText,
     pub description: FormattedText,
-    pub icon: ItemSlot,
+    pub icon: ItemStack,
     pub frame: FrameType,
     pub show_toast: bool,
     pub hidden: bool,
@@ -36,12 +36,12 @@ pub struct DisplayInfo {
     pub y: f32,
 }
 
-impl azalea_buf::McBufWritable for DisplayInfo {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
-        self.title.write_into(buf)?;
-        self.description.write_into(buf)?;
-        self.icon.write_into(buf)?;
-        self.frame.write_into(buf)?;
+impl azalea_buf::AzaleaWrite for DisplayInfo {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+        self.title.azalea_write(buf)?;
+        self.description.azalea_write(buf)?;
+        self.icon.azalea_write(buf)?;
+        self.frame.azalea_write(buf)?;
 
         let mut data: u32 = 0;
         if self.background.is_some() {
@@ -53,35 +53,35 @@ impl azalea_buf::McBufWritable for DisplayInfo {
         if self.hidden {
             data |= 0b100;
         }
-        data.write_into(buf)?;
+        data.azalea_write(buf)?;
 
         if let Some(background) = &self.background {
-            background.write_into(buf)?;
+            background.azalea_write(buf)?;
         }
-        self.x.write_into(buf)?;
-        self.y.write_into(buf)?;
+        self.x.azalea_write(buf)?;
+        self.y.azalea_write(buf)?;
         Ok(())
     }
 }
-impl azalea_buf::McBufReadable for DisplayInfo {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
-        let title = azalea_buf::McBufReadable::read_from(buf)?;
-        let description = azalea_buf::McBufReadable::read_from(buf)?;
-        let icon = azalea_buf::McBufReadable::read_from(buf)?;
-        let frame = azalea_buf::McBufReadable::read_from(buf)?;
-
-        let data = u32::read_from(buf)?;
+impl azalea_buf::AzaleaRead for DisplayInfo {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
+        let title = azalea_buf::AzaleaRead::azalea_read(buf)?;
+        let description = azalea_buf::AzaleaRead::azalea_read(buf)?;
+        let icon = azalea_buf::AzaleaRead::azalea_read(buf)?;
+        let frame = azalea_buf::AzaleaRead::azalea_read(buf)?;
+
+        let data = u32::azalea_read(buf)?;
         let has_background = (data & 0b1) != 0;
         let show_toast = (data & 0b10) != 0;
         let hidden = (data & 0b100) != 0;
 
         let background = if has_background {
-            Some(ResourceLocation::read_from(buf)?)
+            Some(ResourceLocation::azalea_read(buf)?)
         } else {
             None
         };
-        let x = azalea_buf::McBufReadable::read_from(buf)?;
-        let y = azalea_buf::McBufReadable::read_from(buf)?;
+        let x = azalea_buf::AzaleaRead::azalea_read(buf)?;
+        let y = azalea_buf::AzaleaRead::azalea_read(buf)?;
         Ok(DisplayInfo {
             title,
             description,
@@ -96,7 +96,7 @@ impl azalea_buf::McBufReadable for DisplayInfo {
     }
 }
 
-#[derive(Clone, Debug, Copy, McBuf)]
+#[derive(Clone, Debug, Copy, AzBuf)]
 pub enum FrameType {
     Task = 0,
     Challenge = 1,
@@ -105,12 +105,12 @@ pub enum FrameType {
 
 pub type AdvancementProgress = HashMap<String, CriterionProgress>;
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct CriterionProgress {
     pub date: Option<u64>,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct AdvancementHolder {
     pub id: ResourceLocation,
     pub value: Advancement,
@@ -118,13 +118,13 @@ pub struct AdvancementHolder {
 
 #[cfg(test)]
 mod tests {
-    use azalea_buf::{McBufReadable, McBufWritable};
+    use azalea_buf::{AzaleaRead, AzaleaWrite};
 
     use super::*;
 
     #[test]
     fn test() {
-        let packet = ClientboundUpdateAdvancementsPacket {
+        let packet = ClientboundUpdateAdvancements {
             reset: true,
             added: [AdvancementHolder {
                 id: ResourceLocation::new("minecraft:test"),
@@ -133,7 +133,7 @@ mod tests {
                     display: Some(DisplayInfo {
                         title: FormattedText::from("title".to_string()),
                         description: FormattedText::from("description".to_string()),
-                        icon: ItemSlot::Empty,
+                        icon: ItemStack::Empty,
                         frame: FrameType::Task,
                         show_toast: true,
                         hidden: false,
@@ -164,10 +164,10 @@ mod tests {
         };
 
         let mut data = Vec::new();
-        packet.write_into(&mut data).unwrap();
+        packet.azalea_write(&mut data).unwrap();
         let mut buf: Cursor<&[u8]> = Cursor::new(&data);
 
-        let read_packet = ClientboundUpdateAdvancementsPacket::read_from(&mut buf).unwrap();
+        let read_packet = ClientboundUpdateAdvancements::azalea_read(&mut buf).unwrap();
         assert_eq!(packet.reset, read_packet.reset);
         assert_eq!(packet.removed, read_packet.removed);
 
diff --git a/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs b/azalea-protocol/src/packets/game/c_update_attributes.rs
similarity index 68%
rename from azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs
rename to azalea-protocol/src/packets/game/c_update_attributes.rs
index 19d4a7159..2b800643b 100755
--- a/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs
+++ b/azalea-protocol/src/packets/game/c_update_attributes.rs
@@ -1,16 +1,16 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_entity::attributes::AttributeModifier;
 use azalea_protocol_macros::ClientboundGamePacket;
 use azalea_registry::Attribute;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundUpdateAttributesPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundUpdateAttributes {
     #[var]
     pub entity_id: u32,
     pub values: Vec<AttributeSnapshot>,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct AttributeSnapshot {
     pub attribute: Attribute,
     pub base: f64,
diff --git a/azalea-protocol/src/packets/game/clientbound_update_enabled_features_packet.rs b/azalea-protocol/src/packets/game/c_update_enabled_features.rs
similarity index 53%
rename from azalea-protocol/src/packets/game/clientbound_update_enabled_features_packet.rs
rename to azalea-protocol/src/packets/game/c_update_enabled_features.rs
index e08358f77..d4dac4836 100644
--- a/azalea-protocol/src/packets/game/clientbound_update_enabled_features_packet.rs
+++ b/azalea-protocol/src/packets/game/c_update_enabled_features.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundUpdateEnabledFeaturesPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundUpdateEnabledFeatures {
     pub features: Vec<ResourceLocation>,
 }
diff --git a/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs b/azalea-protocol/src/packets/game/c_update_mob_effect.rs
similarity index 67%
rename from azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs
rename to azalea-protocol/src/packets/game/c_update_mob_effect.rs
index 5c7abf3ae..6a31ccab0 100755
--- a/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs
+++ b/azalea-protocol/src/packets/game/c_update_mob_effect.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundGamePacket;
 use azalea_registry::MobEffect;
 
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundUpdateMobEffectPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundUpdateMobEffect {
     #[var]
     pub entity_id: u32,
     pub mob_effect: MobEffect,
diff --git a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs b/azalea-protocol/src/packets/game/c_update_recipes.rs
similarity index 66%
rename from azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs
rename to azalea-protocol/src/packets/game/c_update_recipes.rs
index 4c950f90a..38c4f37bf 100755
--- a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs
+++ b/azalea-protocol/src/packets/game/c_update_recipes.rs
@@ -1,33 +1,33 @@
 use std::collections::HashMap;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use azalea_protocol_macros::ClientboundGamePacket;
 use azalea_registry::HolderSet;
 
-#[derive(Clone, Debug, PartialEq, McBuf, ClientboundGamePacket)]
-pub struct ClientboundUpdateRecipesPacket {
+#[derive(Clone, Debug, PartialEq, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundUpdateRecipes {
     pub item_sets: HashMap<ResourceLocation, RecipePropertySet>,
     pub stonecutter_recipes: Vec<SingleInputEntry>,
 }
 
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct SingleInputEntry {
     pub input: Ingredient,
     pub recipe: SelectableRecipe,
 }
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct SelectableRecipe {
     pub option_display: SlotDisplayData,
 }
 
 /// [`azalea_registry::SlotDisplay`]
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub enum SlotDisplayData {
     Empty,
     AnyFuel,
-    Item(ItemSlotDisplay),
+    Item(ItemStackDisplay),
     ItemStack(ItemStackSlotDisplay),
     Tag(ResourceLocation),
     SmithingTrim(Box<SmithingTrimDemoSlotDisplay>),
@@ -35,40 +35,40 @@ pub enum SlotDisplayData {
     Composite(CompositeSlotDisplay),
 }
 
-#[derive(Clone, Debug, PartialEq, McBuf)]
-pub struct ItemSlotDisplay {
+#[derive(Clone, Debug, PartialEq, AzBuf)]
+pub struct ItemStackDisplay {
     pub item: azalea_registry::Item,
 }
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct ItemStackSlotDisplay {
-    pub stack: ItemSlot,
+    pub stack: ItemStack,
 }
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct TagSlotDisplay {
     pub tag: azalea_registry::Item,
 }
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct SmithingTrimDemoSlotDisplay {
     pub base: SlotDisplayData,
     pub material: SlotDisplayData,
     pub pattern: SlotDisplayData,
 }
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct WithRemainderSlotDisplay {
     pub input: SlotDisplayData,
     pub remainder: SlotDisplayData,
 }
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct CompositeSlotDisplay {
     pub contents: Vec<SlotDisplayData>,
 }
 
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct RecipePropertySet {
     pub items: Vec<azalea_registry::Item>,
 }
 
-#[derive(Clone, Debug, PartialEq, McBuf)]
+#[derive(Clone, Debug, PartialEq, AzBuf)]
 pub struct Ingredient {
     pub allowed: HolderSet<azalea_registry::Item, ResourceLocation>,
 }
diff --git a/azalea-protocol/src/packets/game/c_update_tags.rs b/azalea-protocol/src/packets/game/c_update_tags.rs
new file mode 100755
index 000000000..4b63ec8fc
--- /dev/null
+++ b/azalea-protocol/src/packets/game/c_update_tags.rs
@@ -0,0 +1,74 @@
+use std::io::Cursor;
+use std::ops::Deref;
+use std::{collections::HashMap, io::Write};
+
+use azalea_buf::{AzBuf, AzaleaReadVar, AzaleaWriteVar, BufReadError};
+use azalea_buf::{AzaleaRead, AzaleaWrite};
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ClientboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
+pub struct ClientboundUpdateTags {
+    pub tags: TagMap,
+}
+
+#[derive(Clone, Debug)]
+pub struct Tags {
+    pub name: ResourceLocation,
+    pub elements: Vec<i32>,
+}
+
+#[derive(Clone, Debug)]
+pub struct TagMap(pub HashMap<ResourceLocation, Vec<Tags>>);
+
+impl AzaleaRead for TagMap {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let length = u32::azalea_read_var(buf)? as usize;
+        let mut data = HashMap::with_capacity(length);
+        for _ in 0..length {
+            let tag_type = ResourceLocation::azalea_read(buf)?;
+            let tags_count = i32::azalea_read_var(buf)? as usize;
+            let mut tags_vec = Vec::with_capacity(tags_count);
+            for _ in 0..tags_count {
+                let tags = Tags::azalea_read(buf)?;
+                tags_vec.push(tags);
+            }
+            data.insert(tag_type, tags_vec);
+        }
+        Ok(TagMap(data))
+    }
+}
+
+impl AzaleaWrite for TagMap {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        (self.len() as u32).azalea_write_var(buf)?;
+        for (k, v) in &self.0 {
+            k.azalea_write(buf)?;
+            v.azalea_write(buf)?;
+        }
+        Ok(())
+    }
+}
+impl AzaleaRead for Tags {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let name = ResourceLocation::azalea_read(buf)?;
+        let elements = Vec::<i32>::azalea_read_var(buf)?;
+        Ok(Tags { name, elements })
+    }
+}
+
+impl AzaleaWrite for Tags {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.name.azalea_write(buf)?;
+        self.elements.azalea_write_var(buf)?;
+        Ok(())
+    }
+}
+
+impl Deref for TagMap {
+    type Target = HashMap<ResourceLocation, Vec<Tags>>;
+
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_block_changed_ack_packet.rs b/azalea-protocol/src/packets/game/clientbound_block_changed_ack_packet.rs
deleted file mode 100755
index e9e57c8d7..000000000
--- a/azalea-protocol/src/packets/game/clientbound_block_changed_ack_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundBlockChangedAckPacket {
-    #[var]
-    pub sequence: i32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_bundle_packet.rs b/azalea-protocol/src/packets/game/clientbound_bundle_packet.rs
deleted file mode 100644
index cad2eca3f..000000000
--- a/azalea-protocol/src/packets/game/clientbound_bundle_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundBundlePacket {}
diff --git a/azalea-protocol/src/packets/game/clientbound_chunk_batch_finished_packet.rs b/azalea-protocol/src/packets/game/clientbound_chunk_batch_finished_packet.rs
deleted file mode 100644
index 27bc2f252..000000000
--- a/azalea-protocol/src/packets/game/clientbound_chunk_batch_finished_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundChunkBatchFinishedPacket {
-    #[var]
-    pub batch_size: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_chunk_batch_start_packet.rs b/azalea-protocol/src/packets/game/clientbound_chunk_batch_start_packet.rs
deleted file mode 100644
index 308ba8c97..000000000
--- a/azalea-protocol/src/packets/game/clientbound_chunk_batch_start_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundChunkBatchStartPacket {}
diff --git a/azalea-protocol/src/packets/game/clientbound_clear_titles_packet.rs b/azalea-protocol/src/packets/game/clientbound_clear_titles_packet.rs
deleted file mode 100644
index 3bdc0c79e..000000000
--- a/azalea-protocol/src/packets/game/clientbound_clear_titles_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundClearTitlesPacket {
-    pub reset_times: bool,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_container_close_packet.rs b/azalea-protocol/src/packets/game/clientbound_container_close_packet.rs
deleted file mode 100644
index a59da450d..000000000
--- a/azalea-protocol/src/packets/game/clientbound_container_close_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundContainerClosePacket {
-    pub container_id: u8,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_container_set_content_packet.rs b/azalea-protocol/src/packets/game/clientbound_container_set_content_packet.rs
deleted file mode 100755
index 4e08232d8..000000000
--- a/azalea-protocol/src/packets/game/clientbound_container_set_content_packet.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_inventory::ItemSlot;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundContainerSetContentPacket {
-    pub container_id: i8,
-    #[var]
-    pub state_id: u32,
-    pub items: Vec<ItemSlot>,
-    pub carried_item: ItemSlot,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_container_set_data_packet.rs b/azalea-protocol/src/packets/game/clientbound_container_set_data_packet.rs
deleted file mode 100755
index dc53a0247..000000000
--- a/azalea-protocol/src/packets/game/clientbound_container_set_data_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundContainerSetDataPacket {
-    pub container_id: i8,
-    pub id: u16,
-    pub value: u16,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_container_set_slot_packet.rs b/azalea-protocol/src/packets/game/clientbound_container_set_slot_packet.rs
deleted file mode 100755
index 9b954fa0a..000000000
--- a/azalea-protocol/src/packets/game/clientbound_container_set_slot_packet.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_inventory::ItemSlot;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundContainerSetSlotPacket {
-    pub container_id: i8,
-    #[var]
-    pub state_id: u32,
-    pub slot: u16,
-    pub item_stack: ItemSlot,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_damage_event_packet.rs b/azalea-protocol/src/packets/game/clientbound_damage_event_packet.rs
deleted file mode 100644
index cf5d369ac..000000000
--- a/azalea-protocol/src/packets/game/clientbound_damage_event_packet.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use std::io::{Cursor, Write};
-
-use azalea_buf::{McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
-use azalea_core::position::Vec3;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundDamageEventPacket {
-    #[var]
-    pub entity_id: u32,
-    #[var]
-    pub source_type_id: u32,
-    pub source_cause_id: OptionalEntityId,
-    pub source_direct_id: OptionalEntityId,
-    pub source_position: Option<Vec3>,
-}
-
-#[derive(Clone, Debug)]
-pub struct OptionalEntityId(pub Option<u32>);
-impl McBufReadable for OptionalEntityId {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
-        match u32::var_read_from(buf)? {
-            0 => Ok(OptionalEntityId(None)),
-            id => Ok(OptionalEntityId(Some(id - 1))),
-        }
-    }
-}
-impl McBufWritable for OptionalEntityId {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        match self.0 {
-            Some(id) => (id + 1).var_write_into(buf),
-            None => 0u32.var_write_into(buf),
-        }
-    }
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs b/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs
deleted file mode 100755
index 641fd05e2..000000000
--- a/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-use super::serverbound_debug_sample_subscription::RemoteDebugSampleType;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundDebugSamplePacket {
-    pub sample: Vec<u64>,
-    pub debug_sample_type: RemoteDebugSampleType,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_delete_chat_packet.rs b/azalea-protocol/src/packets/game/clientbound_delete_chat_packet.rs
deleted file mode 100755
index eef9b561e..000000000
--- a/azalea-protocol/src/packets/game/clientbound_delete_chat_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-use super::clientbound_player_chat_packet::PackedMessageSignature;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundDeleteChatPacket {
-    pub signature: PackedMessageSignature,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_disconnect_packet.rs b/azalea-protocol/src/packets/game/clientbound_disconnect_packet.rs
deleted file mode 100755
index f8771c37d..000000000
--- a/azalea-protocol/src/packets/game/clientbound_disconnect_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundDisconnectPacket {
-    pub reason: FormattedText,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_entity_event_packet.rs b/azalea-protocol/src/packets/game/clientbound_entity_event_packet.rs
deleted file mode 100755
index 18076a334..000000000
--- a/azalea-protocol/src/packets/game/clientbound_entity_event_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundEntityEventPacket {
-    pub entity_id: u32,
-    pub event_id: u8,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_forget_level_chunk_packet.rs b/azalea-protocol/src/packets/game/clientbound_forget_level_chunk_packet.rs
deleted file mode 100755
index 027d41ee3..000000000
--- a/azalea-protocol/src/packets/game/clientbound_forget_level_chunk_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_core::position::ChunkPos;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundForgetLevelChunkPacket {
-    pub pos: ChunkPos,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_hurt_animation_packet.rs b/azalea-protocol/src/packets/game/clientbound_hurt_animation_packet.rs
deleted file mode 100644
index d4a79a275..000000000
--- a/azalea-protocol/src/packets/game/clientbound_hurt_animation_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundHurtAnimationPacket {
-    #[var]
-    pub id: u32,
-    pub yaw: f32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_keep_alive_packet.rs b/azalea-protocol/src/packets/game/clientbound_keep_alive_packet.rs
deleted file mode 100755
index 16fe33575..000000000
--- a/azalea-protocol/src/packets/game/clientbound_keep_alive_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundKeepAlivePacket {
-    pub id: u64,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_open_book_packet.rs b/azalea-protocol/src/packets/game/clientbound_open_book_packet.rs
deleted file mode 100755
index 1b450b80e..000000000
--- a/azalea-protocol/src/packets/game/clientbound_open_book_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-use super::serverbound_interact_packet::InteractionHand;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundOpenBookPacket {
-    pub hand: InteractionHand,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_ping_packet.rs b/azalea-protocol/src/packets/game/clientbound_ping_packet.rs
deleted file mode 100755
index 0bd2c8c3a..000000000
--- a/azalea-protocol/src/packets/game/clientbound_ping_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPingPacket {
-    pub id: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_player_chat_packet.rs b/azalea-protocol/src/packets/game/clientbound_player_chat_packet.rs
deleted file mode 100644
index 9cd20efcc..000000000
--- a/azalea-protocol/src/packets/game/clientbound_player_chat_packet.rs
+++ /dev/null
@@ -1,202 +0,0 @@
-use std::io::{Cursor, Write};
-
-use azalea_buf::{
-    BufReadError, McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable,
-};
-use azalea_chat::{
-    translatable_component::{StringOrComponent, TranslatableComponent},
-    FormattedText,
-};
-use azalea_core::bitset::BitSet;
-use azalea_crypto::MessageSignature;
-use azalea_protocol_macros::ClientboundGamePacket;
-use uuid::Uuid;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket, PartialEq)]
-pub struct ClientboundPlayerChatPacket {
-    pub sender: Uuid,
-    #[var]
-    pub index: u32,
-    pub signature: Option<MessageSignature>,
-    pub body: PackedSignedMessageBody,
-    pub unsigned_content: Option<FormattedText>,
-    pub filter_mask: FilterMask,
-    pub chat_type: ChatTypeBound,
-}
-
-#[derive(Clone, Debug, PartialEq, McBuf)]
-pub struct PackedSignedMessageBody {
-    // the error is here, for some reason it skipped a byte earlier and here
-    // it's reading `0` when it should be `11`
-    pub content: String,
-    pub timestamp: u64,
-    pub salt: u64,
-    pub last_seen: PackedLastSeenMessages,
-}
-
-#[derive(Clone, Debug, PartialEq, McBuf)]
-pub struct PackedLastSeenMessages {
-    pub entries: Vec<PackedMessageSignature>,
-}
-
-/// Messages can be deleted by either their signature or message id.
-#[derive(Clone, Debug, PartialEq)]
-pub enum PackedMessageSignature {
-    Signature(Box<MessageSignature>),
-    Id(u32),
-}
-
-#[derive(Clone, Debug, PartialEq, McBuf)]
-pub enum FilterMask {
-    PassThrough,
-    FullyFiltered,
-    PartiallyFiltered(BitSet),
-}
-
-#[derive(Copy, Clone, Debug, McBuf, PartialEq, Eq)]
-pub enum ChatType {
-    Chat = 0,
-    SayCommand = 1,
-    MsgCommandIncoming = 2,
-    MsgCommandOutgoing = 3,
-    TeamMsgCommandIncoming = 4,
-    TeamMsgCommandOutgoing = 5,
-    EmoteCommand = 6,
-}
-
-#[derive(Clone, Debug, McBuf, PartialEq)]
-pub struct ChatTypeBound {
-    pub chat_type: ChatType,
-    pub name: FormattedText,
-    pub target_name: Option<FormattedText>,
-}
-
-// must be in Client
-#[derive(Clone, Debug, PartialEq)]
-pub struct MessageSignatureCache {
-    pub entries: Vec<Option<MessageSignature>>,
-}
-
-// impl MessageSignatureCache {
-//     pub fn unpacker(&self) -> impl Fn(u32) -> Option<SignedMessageBody> {
-
-//     }
-// }
-
-// impl PackedSignedMessageBody {
-//     pub fn unpack(&self, unpacker: impl Fn(u32) -> Option<SignedMessageBody>)
-// {} }
-
-impl ClientboundPlayerChatPacket {
-    /// Returns the content of the message. If you want to get the FormattedText
-    /// for the whole message including the sender part, use
-    /// [`ClientboundPlayerChatPacket::message`].
-    #[must_use]
-    pub fn content(&self) -> FormattedText {
-        self.unsigned_content
-            .clone()
-            .unwrap_or_else(|| FormattedText::from(self.body.content.clone()))
-    }
-
-    /// Get the full message, including the sender part.
-    #[must_use]
-    pub fn message(&self) -> FormattedText {
-        let sender = self.chat_type.name.clone();
-        let content = self.content();
-        let target = self.chat_type.target_name.clone();
-
-        let translation_key = self.chat_type.chat_type.chat_translation_key();
-
-        let mut args = vec![
-            StringOrComponent::FormattedText(sender),
-            StringOrComponent::FormattedText(content),
-        ];
-        if let Some(target) = target {
-            args.push(StringOrComponent::FormattedText(target));
-        }
-
-        let component = TranslatableComponent::new(translation_key.to_string(), args);
-
-        FormattedText::Translatable(component)
-    }
-}
-
-impl ChatType {
-    #[must_use]
-    pub fn chat_translation_key(&self) -> &'static str {
-        match self {
-            ChatType::Chat => "chat.type.text",
-            ChatType::SayCommand => "chat.type.announcement",
-            ChatType::MsgCommandIncoming => "commands.message.display.incoming",
-            ChatType::MsgCommandOutgoing => "commands.message.display.outgoing",
-            ChatType::TeamMsgCommandIncoming => "chat.type.team.text",
-            ChatType::TeamMsgCommandOutgoing => "chat.type.team.sent",
-            ChatType::EmoteCommand => "chat.type.emote",
-        }
-    }
-
-    #[must_use]
-    pub fn narrator_translation_key(&self) -> &'static str {
-        match self {
-            ChatType::EmoteCommand => "chat.type.emote",
-            _ => "chat.type.text.narrate",
-        }
-    }
-}
-
-impl McBufReadable for PackedMessageSignature {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let id = u32::var_read_from(buf)?;
-        if id == 0 {
-            let full_signature = MessageSignature::read_from(buf)?;
-
-            Ok(PackedMessageSignature::Signature(Box::new(full_signature)))
-        } else {
-            Ok(PackedMessageSignature::Id(id - 1))
-        }
-    }
-}
-impl McBufWritable for PackedMessageSignature {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        match self {
-            PackedMessageSignature::Signature(full_signature) => {
-                0u32.var_write_into(buf)?;
-                full_signature.write_into(buf)?;
-            }
-            PackedMessageSignature::Id(id) => {
-                (id + 1).var_write_into(buf)?;
-            }
-        }
-        Ok(())
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn test_read_player_chat_packet() {
-        let mut bytes = Cursor::new(
-            &[
-                55, 186, 28, 76, 92, 167, 177, 75, 188, 158, 200, 179, 191, 227, 16, 171, 145, 0,
-                0, 4, 116, 101, 115, 116, 0, 0, 1, 140, 178, 225, 89, 103, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 10, 10, 0, 10, 104, 111, 118, 101, 114, 69, 118, 101, 110, 116, 10, 0,
-                8, 99, 111, 110, 116, 101, 110, 116, 115, 8, 0, 4, 110, 97, 109, 101, 0, 12, 75,
-                97, 115, 117, 109, 105, 77, 97, 114, 105, 115, 97, 11, 0, 2, 105, 100, 0, 0, 0, 4,
-                186, 28, 76, 92, 167, 177, 75, 188, 158, 200, 179, 191, 227, 16, 171, 145, 8, 0, 4,
-                116, 121, 112, 101, 0, 16, 109, 105, 110, 101, 99, 114, 97, 102, 116, 58, 112, 108,
-                97, 121, 101, 114, 0, 8, 0, 6, 97, 99, 116, 105, 111, 110, 0, 11, 115, 104, 111,
-                119, 95, 101, 110, 116, 105, 116, 121, 0, 10, 0, 10, 99, 108, 105, 99, 107, 69,
-                118, 101, 110, 116, 8, 0, 6, 97, 99, 116, 105, 111, 110, 0, 15, 115, 117, 103, 103,
-                101, 115, 116, 95, 99, 111, 109, 109, 97, 110, 100, 8, 0, 5, 118, 97, 108, 117,
-                101, 0, 19, 47, 116, 101, 108, 108, 32, 75, 97, 115, 117, 109, 105, 77, 97, 114,
-                105, 115, 97, 32, 0, 9, 0, 5, 101, 120, 116, 114, 97, 8, 0, 0, 0, 3, 0, 0, 0, 12,
-                75, 97, 115, 117, 109, 105, 77, 97, 114, 105, 115, 97, 0, 0, 8, 0, 9, 105, 110,
-                115, 101, 114, 116, 105, 111, 110, 0, 12, 75, 97, 115, 117, 109, 105, 77, 97, 114,
-                105, 115, 97, 8, 0, 4, 116, 101, 120, 116, 0, 0, 0, 0,
-            ][..],
-        );
-        let _packet = ClientboundPlayerChatPacket::read_from(&mut bytes).unwrap();
-    }
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_player_combat_enter_packet.rs b/azalea-protocol/src/packets/game/clientbound_player_combat_enter_packet.rs
deleted file mode 100755
index 42ee1838e..000000000
--- a/azalea-protocol/src/packets/game/clientbound_player_combat_enter_packet.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-/// Unused in vanilla.
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerCombatEnterPacket {}
diff --git a/azalea-protocol/src/packets/game/clientbound_player_info_remove_packet.rs b/azalea-protocol/src/packets/game/clientbound_player_info_remove_packet.rs
deleted file mode 100644
index bb620272b..000000000
--- a/azalea-protocol/src/packets/game/clientbound_player_info_remove_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-use uuid::Uuid;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerInfoRemovePacket {
-    pub profile_ids: Vec<Uuid>,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_player_rotation_packet.rs b/azalea-protocol/src/packets/game/clientbound_player_rotation_packet.rs
deleted file mode 100755
index a1ad9bbe8..000000000
--- a/azalea-protocol/src/packets/game/clientbound_player_rotation_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPlayerRotationPacket {
-    pub y_rot: f32,
-    pub x_rot: f32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_pong_response_packet.rs b/azalea-protocol/src/packets/game/clientbound_pong_response_packet.rs
deleted file mode 100755
index 0b48198e3..000000000
--- a/azalea-protocol/src/packets/game/clientbound_pong_response_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundPongResponsePacket {
-    pub time: u64,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_projectile_power_packet.rs b/azalea-protocol/src/packets/game/clientbound_projectile_power_packet.rs
deleted file mode 100644
index a665a2aa6..000000000
--- a/azalea-protocol/src/packets/game/clientbound_projectile_power_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundProjectilePowerPacket {
-    pub id: u32,
-    pub acceleration_power: f64,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_recipe_book_remove_packet.rs b/azalea-protocol/src/packets/game/clientbound_recipe_book_remove_packet.rs
deleted file mode 100755
index 678537ca5..000000000
--- a/azalea-protocol/src/packets/game/clientbound_recipe_book_remove_packet.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-use super::{
-    clientbound_entity_position_sync_packet::PositionMoveRotation,
-    clientbound_player_position_packet::RelativeMovements,
-};
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundRecipeBookRemovePacket {
-    #[var]
-    pub id: u32,
-    pub change: PositionMoveRotation,
-    pub relatives: RelativeMovements,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_remove_entities_packet.rs b/azalea-protocol/src/packets/game/clientbound_remove_entities_packet.rs
deleted file mode 100755
index 7b192333a..000000000
--- a/azalea-protocol/src/packets/game/clientbound_remove_entities_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundRemoveEntitiesPacket {
-    #[var]
-    pub entity_ids: Vec<u32>,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_reset_score_packet.rs b/azalea-protocol/src/packets/game/clientbound_reset_score_packet.rs
deleted file mode 100644
index 8b24bbdf2..000000000
--- a/azalea-protocol/src/packets/game/clientbound_reset_score_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundResetScorePacket {
-    pub owner: String,
-    pub objective_name: Option<String>,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_resource_pack_pop_packet.rs b/azalea-protocol/src/packets/game/clientbound_resource_pack_pop_packet.rs
deleted file mode 100644
index 34836c852..000000000
--- a/azalea-protocol/src/packets/game/clientbound_resource_pack_pop_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-use uuid::Uuid;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundResourcePackPopPacket {
-    pub id: Option<Uuid>,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_rotate_head_packet.rs b/azalea-protocol/src/packets/game/clientbound_rotate_head_packet.rs
deleted file mode 100755
index 2bc775401..000000000
--- a/azalea-protocol/src/packets/game/clientbound_rotate_head_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundRotateHeadPacket {
-    #[var]
-    pub entity_id: u32,
-    pub y_head_rot: i8,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_action_bar_text_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_action_bar_text_packet.rs
deleted file mode 100755
index 60b80fe9b..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_action_bar_text_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetActionBarTextPacket {
-    pub text: FormattedText,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_border_center_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_border_center_packet.rs
deleted file mode 100755
index d210b0ce6..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_border_center_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetBorderCenterPacket {
-    pub new_center_x: f64,
-    pub new_center_z: f64,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_border_size_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_border_size_packet.rs
deleted file mode 100755
index 3a86a720d..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_border_size_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetBorderSizePacket {
-    pub size: f64,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_border_warning_delay_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_border_warning_delay_packet.rs
deleted file mode 100755
index 4bf794ac6..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_border_warning_delay_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetBorderWarningDelayPacket {
-    #[var]
-    pub warning_delay: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_border_warning_distance_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_border_warning_distance_packet.rs
deleted file mode 100755
index ef1b6e17e..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_border_warning_distance_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetBorderWarningDistancePacket {
-    #[var]
-    pub warning_blocks: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_camera_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_camera_packet.rs
deleted file mode 100755
index 9da75dc7b..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_camera_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetCameraPacket {
-    #[var]
-    pub camera_id: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_chunk_cache_center_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_chunk_cache_center_packet.rs
deleted file mode 100755
index e9aecba9e..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_chunk_cache_center_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetChunkCacheCenterPacket {
-    #[var]
-    pub x: i32,
-    #[var]
-    pub z: i32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_chunk_cache_radius_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_chunk_cache_radius_packet.rs
deleted file mode 100755
index 9718ca567..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_chunk_cache_radius_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetChunkCacheRadiusPacket {
-    #[var]
-    pub radius: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_cursor_item_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_cursor_item_packet.rs
deleted file mode 100644
index 6a67b71ce..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_cursor_item_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_inventory::ItemSlot;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetCursorItemPacket {
-    pub contents: Option<ItemSlot>,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_display_chat_preview_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_display_chat_preview_packet.rs
deleted file mode 100755
index 5aee614e7..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_display_chat_preview_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetDisplayChatPreviewPacket {
-    pub enabled: bool,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_entity_link_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_entity_link_packet.rs
deleted file mode 100755
index ac9dd9447..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_entity_link_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetEntityLinkPacket {
-    pub source_id: u32,
-    pub dest_id: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_held_slot_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_held_slot_packet.rs
deleted file mode 100644
index a83ae3cbe..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_held_slot_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetHeldSlotPacket {
-    pub slot: u8,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_objective_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_objective_packet.rs
deleted file mode 100755
index a9481ad15..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_objective_packet.rs
+++ /dev/null
@@ -1,82 +0,0 @@
-use std::io::{Cursor, Write};
-
-use azalea_buf::{McBuf, McBufReadable, McBufWritable};
-use azalea_chat::{numbers::NumberFormat, FormattedText};
-use azalea_core::objectives::ObjectiveCriteria;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetObjectivePacket {
-    pub objective_name: String,
-    pub method: Method,
-}
-
-#[derive(Clone, Copy, Debug, McBuf)]
-pub enum MethodKind {
-    Add,
-    Remove,
-    Change,
-}
-
-#[derive(Clone, Debug)]
-pub enum Method {
-    Add {
-        display_name: FormattedText,
-        render_type: ObjectiveCriteria,
-        number_format: NumberFormat,
-    },
-    Remove,
-    Change {
-        display_name: FormattedText,
-        render_type: ObjectiveCriteria,
-        number_format: NumberFormat,
-    },
-}
-
-impl McBufReadable for Method {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
-        let kind = MethodKind::read_from(buf)?;
-        match kind {
-            MethodKind::Add => Ok(Method::Add {
-                display_name: FormattedText::read_from(buf)?,
-                render_type: ObjectiveCriteria::read_from(buf)?,
-                number_format: NumberFormat::read_from(buf)?,
-            }),
-            MethodKind::Remove => Ok(Method::Remove),
-            MethodKind::Change => Ok(Method::Change {
-                display_name: FormattedText::read_from(buf)?,
-                render_type: ObjectiveCriteria::read_from(buf)?,
-                number_format: NumberFormat::read_from(buf)?,
-            }),
-        }
-    }
-}
-
-impl McBufWritable for Method {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        match self {
-            Method::Add {
-                display_name,
-                render_type,
-                number_format,
-            } => {
-                MethodKind::Add.write_into(buf)?;
-                display_name.write_into(buf)?;
-                render_type.write_into(buf)?;
-                number_format.write_into(buf)?;
-            }
-            Method::Remove => MethodKind::Remove.write_into(buf)?,
-            Method::Change {
-                display_name,
-                render_type,
-                number_format,
-            } => {
-                MethodKind::Change.write_into(buf)?;
-                display_name.write_into(buf)?;
-                render_type.write_into(buf)?;
-                number_format.write_into(buf)?;
-            }
-        }
-        Ok(())
-    }
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_player_inventory_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_player_inventory_packet.rs
deleted file mode 100644
index c17fd3105..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_player_inventory_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_inventory::ItemSlot;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetPlayerInventoryPacket {
-    #[var]
-    pub slot: i32,
-    pub contents: Option<ItemSlot>,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_player_team_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_player_team_packet.rs
deleted file mode 100755
index 724b86aa8..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_player_team_packet.rs
+++ /dev/null
@@ -1,74 +0,0 @@
-use std::io::{Cursor, Write};
-
-use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable};
-use azalea_chat::{style::ChatFormatting, FormattedText};
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetPlayerTeamPacket {
-    pub name: String,
-    pub method: Method,
-}
-
-#[derive(Clone, Debug)]
-pub enum Method {
-    Add((Parameters, PlayerList)),
-    Remove,
-    Change(Parameters),
-    Join(PlayerList),
-    Leave(PlayerList),
-}
-
-impl McBufReadable for Method {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        Ok(match u8::read_from(buf)? {
-            0 => Method::Add((Parameters::read_from(buf)?, PlayerList::read_from(buf)?)),
-            1 => Method::Remove,
-            2 => Method::Change(Parameters::read_from(buf)?),
-            3 => Method::Join(PlayerList::read_from(buf)?),
-            4 => Method::Leave(PlayerList::read_from(buf)?),
-            id => return Err(BufReadError::UnexpectedEnumVariant { id: i32::from(id) }),
-        })
-    }
-}
-
-impl McBufWritable for Method {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        match self {
-            Method::Add((parameters, playerlist)) => {
-                0u8.write_into(buf)?;
-                parameters.write_into(buf)?;
-                playerlist.write_into(buf)?;
-            }
-            Method::Remove => {
-                1u8.write_into(buf)?;
-            }
-            Method::Change(parameters) => {
-                2u8.write_into(buf)?;
-                parameters.write_into(buf)?;
-            }
-            Method::Join(playerlist) => {
-                3u8.write_into(buf)?;
-                playerlist.write_into(buf)?;
-            }
-            Method::Leave(playerlist) => {
-                4u8.write_into(buf)?;
-                playerlist.write_into(buf)?;
-            }
-        }
-        Ok(())
-    }
-}
-
-#[derive(McBuf, Clone, Debug)]
-pub struct Parameters {
-    pub display_name: FormattedText,
-    pub options: u8,
-    pub nametag_visibility: String,
-    pub collision_rule: String,
-    pub color: ChatFormatting,
-    pub player_prefix: FormattedText,
-    pub player_suffix: FormattedText,
-}
-
-type PlayerList = Vec<String>;
diff --git a/azalea-protocol/src/packets/game/clientbound_set_simulation_distance_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_simulation_distance_packet.rs
deleted file mode 100755
index 3efd1fa6d..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_simulation_distance_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetSimulationDistancePacket {
-    #[var]
-    pub simulation_distance: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_subtitle_text_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_subtitle_text_packet.rs
deleted file mode 100755
index 9b25ac057..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_subtitle_text_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetSubtitleTextPacket {
-    pub text: FormattedText,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_title_text_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_title_text_packet.rs
deleted file mode 100755
index fb00a4e51..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_title_text_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetTitleTextPacket {
-    pub text: FormattedText,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_set_titles_animation_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_titles_animation_packet.rs
deleted file mode 100755
index 06faeb3c6..000000000
--- a/azalea-protocol/src/packets/game/clientbound_set_titles_animation_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundSetTitlesAnimationPacket {
-    pub fade_in: u32,
-    pub stay: u32,
-    pub fade_out: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_start_configuration_packet.rs b/azalea-protocol/src/packets/game/clientbound_start_configuration_packet.rs
deleted file mode 100644
index b6ad9615d..000000000
--- a/azalea-protocol/src/packets/game/clientbound_start_configuration_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundStartConfigurationPacket {}
diff --git a/azalea-protocol/src/packets/game/clientbound_ticking_state_packet.rs b/azalea-protocol/src/packets/game/clientbound_ticking_state_packet.rs
deleted file mode 100644
index a85429a2c..000000000
--- a/azalea-protocol/src/packets/game/clientbound_ticking_state_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundTickingStatePacket {
-    pub tick_rate: f32,
-    pub is_frozen: bool,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_ticking_step_packet.rs b/azalea-protocol/src/packets/game/clientbound_ticking_step_packet.rs
deleted file mode 100644
index 5a5e64406..000000000
--- a/azalea-protocol/src/packets/game/clientbound_ticking_step_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundTickingStepPacket {
-    #[var]
-    pub tick_steps: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs b/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs
deleted file mode 100644
index dbce36e04..000000000
--- a/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundTransferPacket {
-    pub host: String,
-    #[var]
-    pub port: u32,
-}
diff --git a/azalea-protocol/src/packets/game/clientbound_update_tags_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_tags_packet.rs
deleted file mode 100755
index bcdef64a9..000000000
--- a/azalea-protocol/src/packets/game/clientbound_update_tags_packet.rs
+++ /dev/null
@@ -1,74 +0,0 @@
-use std::io::Cursor;
-use std::ops::Deref;
-use std::{collections::HashMap, io::Write};
-
-use azalea_buf::{BufReadError, McBuf, McBufVarReadable, McBufVarWritable};
-use azalea_buf::{McBufReadable, McBufWritable};
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ClientboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundGamePacket)]
-pub struct ClientboundUpdateTagsPacket {
-    pub tags: TagMap,
-}
-
-#[derive(Clone, Debug)]
-pub struct Tags {
-    pub name: ResourceLocation,
-    pub elements: Vec<i32>,
-}
-
-#[derive(Clone, Debug)]
-pub struct TagMap(pub HashMap<ResourceLocation, Vec<Tags>>);
-
-impl McBufReadable for TagMap {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let length = u32::var_read_from(buf)? as usize;
-        let mut data = HashMap::with_capacity(length);
-        for _ in 0..length {
-            let tag_type = ResourceLocation::read_from(buf)?;
-            let tags_count = i32::var_read_from(buf)? as usize;
-            let mut tags_vec = Vec::with_capacity(tags_count);
-            for _ in 0..tags_count {
-                let tags = Tags::read_from(buf)?;
-                tags_vec.push(tags);
-            }
-            data.insert(tag_type, tags_vec);
-        }
-        Ok(TagMap(data))
-    }
-}
-
-impl McBufWritable for TagMap {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        (self.len() as u32).var_write_into(buf)?;
-        for (k, v) in &self.0 {
-            k.write_into(buf)?;
-            v.write_into(buf)?;
-        }
-        Ok(())
-    }
-}
-impl McBufReadable for Tags {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let name = ResourceLocation::read_from(buf)?;
-        let elements = Vec::<i32>::var_read_from(buf)?;
-        Ok(Tags { name, elements })
-    }
-}
-
-impl McBufWritable for Tags {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.name.write_into(buf)?;
-        self.elements.var_write_into(buf)?;
-        Ok(())
-    }
-}
-
-impl Deref for TagMap {
-    type Target = HashMap<ResourceLocation, Vec<Tags>>;
-
-    fn deref(&self) -> &Self::Target {
-        &self.0
-    }
-}
diff --git a/azalea-protocol/src/packets/game/mod.rs b/azalea-protocol/src/packets/game/mod.rs
index 55d6faaff..757dd27f1 100755
--- a/azalea-protocol/src/packets/game/mod.rs
+++ b/azalea-protocol/src/packets/game/mod.rs
@@ -1,394 +1,202 @@
-pub mod clientbound_add_entity_packet;
-pub mod clientbound_add_experience_orb_packet;
-pub mod clientbound_animate_packet;
-pub mod clientbound_award_stats_packet;
-pub mod clientbound_block_changed_ack_packet;
-pub mod clientbound_block_destruction_packet;
-pub mod clientbound_block_entity_data_packet;
-pub mod clientbound_block_event_packet;
-pub mod clientbound_block_update_packet;
-pub mod clientbound_boss_event_packet;
-pub mod clientbound_bundle_packet;
-pub mod clientbound_change_difficulty_packet;
-pub mod clientbound_chunk_batch_finished_packet;
-pub mod clientbound_chunk_batch_start_packet;
-pub mod clientbound_chunks_biomes_packet;
-pub mod clientbound_clear_titles_packet;
-pub mod clientbound_command_suggestions_packet;
-pub mod clientbound_commands_packet;
-pub mod clientbound_container_close_packet;
-pub mod clientbound_container_set_content_packet;
-pub mod clientbound_container_set_data_packet;
-pub mod clientbound_container_set_slot_packet;
-pub mod clientbound_cookie_request_packet;
-pub mod clientbound_cooldown_packet;
-pub mod clientbound_custom_chat_completions_packet;
-pub mod clientbound_custom_payload_packet;
-pub mod clientbound_custom_report_details_packet;
-pub mod clientbound_damage_event_packet;
-pub mod clientbound_debug_sample_packet;
-pub mod clientbound_delete_chat_packet;
-pub mod clientbound_disconnect_packet;
-pub mod clientbound_disguised_chat_packet;
-pub mod clientbound_entity_event_packet;
-pub mod clientbound_entity_position_sync_packet;
-pub mod clientbound_explode_packet;
-pub mod clientbound_forget_level_chunk_packet;
-pub mod clientbound_game_event_packet;
-pub mod clientbound_horse_screen_open_packet;
-pub mod clientbound_hurt_animation_packet;
-pub mod clientbound_initialize_border_packet;
-pub mod clientbound_keep_alive_packet;
-pub mod clientbound_level_chunk_with_light_packet;
-pub mod clientbound_level_event_packet;
-pub mod clientbound_level_particles_packet;
-pub mod clientbound_light_update_packet;
-pub mod clientbound_login_packet;
-pub mod clientbound_map_item_data_packet;
-pub mod clientbound_merchant_offers_packet;
-pub mod clientbound_move_entity_pos_packet;
-pub mod clientbound_move_entity_pos_rot_packet;
-pub mod clientbound_move_entity_rot_packet;
-pub mod clientbound_move_minecart_packet;
-pub mod clientbound_move_vehicle_packet;
-pub mod clientbound_open_book_packet;
-pub mod clientbound_open_screen_packet;
-pub mod clientbound_open_sign_editor_packet;
-pub mod clientbound_ping_packet;
-pub mod clientbound_place_ghost_recipe_packet;
-pub mod clientbound_player_abilities_packet;
-pub mod clientbound_player_chat_packet;
-pub mod clientbound_player_combat_end_packet;
-pub mod clientbound_player_combat_enter_packet;
-pub mod clientbound_player_combat_kill_packet;
-pub mod clientbound_player_info_remove_packet;
-pub mod clientbound_player_info_update_packet;
-pub mod clientbound_player_look_at_packet;
-pub mod clientbound_player_position_packet;
-pub mod clientbound_player_rotation_packet;
-pub mod clientbound_pong_response_packet;
-pub mod clientbound_projectile_power_packet;
-pub mod clientbound_recipe_book_add_packet;
-pub mod clientbound_recipe_book_remove_packet;
-pub mod clientbound_recipe_book_settings_packet;
-pub mod clientbound_remove_entities_packet;
-pub mod clientbound_remove_mob_effect_packet;
-pub mod clientbound_reset_score_packet;
-pub mod clientbound_resource_pack_pop_packet;
-pub mod clientbound_resource_pack_push_packet;
-pub mod clientbound_respawn_packet;
-pub mod clientbound_rotate_head_packet;
-pub mod clientbound_section_blocks_update_packet;
-pub mod clientbound_select_advancements_tab_packet;
-pub mod clientbound_server_data_packet;
-pub mod clientbound_server_links_packet;
-pub mod clientbound_set_action_bar_text_packet;
-pub mod clientbound_set_border_center_packet;
-pub mod clientbound_set_border_lerp_size_packet;
-pub mod clientbound_set_border_size_packet;
-pub mod clientbound_set_border_warning_delay_packet;
-pub mod clientbound_set_border_warning_distance_packet;
-pub mod clientbound_set_camera_packet;
-pub mod clientbound_set_chunk_cache_center_packet;
-pub mod clientbound_set_chunk_cache_radius_packet;
-pub mod clientbound_set_cursor_item_packet;
-pub mod clientbound_set_default_spawn_position_packet;
-pub mod clientbound_set_display_objective_packet;
-pub mod clientbound_set_entity_data_packet;
-pub mod clientbound_set_entity_link_packet;
-pub mod clientbound_set_entity_motion_packet;
-pub mod clientbound_set_equipment_packet;
-pub mod clientbound_set_experience_packet;
-pub mod clientbound_set_health_packet;
-pub mod clientbound_set_held_slot_packet;
-pub mod clientbound_set_objective_packet;
-pub mod clientbound_set_passengers_packet;
-pub mod clientbound_set_player_inventory_packet;
-pub mod clientbound_set_player_team_packet;
-pub mod clientbound_set_score_packet;
-pub mod clientbound_set_simulation_distance_packet;
-pub mod clientbound_set_subtitle_text_packet;
-pub mod clientbound_set_time_packet;
-pub mod clientbound_set_title_text_packet;
-pub mod clientbound_set_titles_animation_packet;
-pub mod clientbound_sound_entity_packet;
-pub mod clientbound_sound_packet;
-pub mod clientbound_start_configuration_packet;
-pub mod clientbound_stop_sound_packet;
-pub mod clientbound_store_cookie_packet;
-pub mod clientbound_system_chat_packet;
-pub mod clientbound_tab_list_packet;
-pub mod clientbound_tag_query_packet;
-pub mod clientbound_take_item_entity_packet;
-pub mod clientbound_teleport_entity_packet;
-pub mod clientbound_ticking_state_packet;
-pub mod clientbound_ticking_step_packet;
-pub mod clientbound_transfer_packet;
-pub mod clientbound_update_advancements_packet;
-pub mod clientbound_update_attributes_packet;
-pub mod clientbound_update_mob_effect_packet;
-pub mod clientbound_update_recipes_packet;
-pub mod clientbound_update_tags_packet;
-pub mod serverbound_accept_teleportation_packet;
-pub mod serverbound_block_entity_tag_query_packet;
-pub mod serverbound_change_difficulty_packet;
-pub mod serverbound_chat_ack_packet;
-pub mod serverbound_chat_command_packet;
-pub mod serverbound_chat_command_signed_packet;
-pub mod serverbound_chat_packet;
-pub mod serverbound_chat_session_update_packet;
-pub mod serverbound_chunk_batch_received_packet;
-pub mod serverbound_client_command_packet;
-pub mod serverbound_client_information_packet;
-pub mod serverbound_client_tick_end_packet;
-pub mod serverbound_command_suggestion_packet;
-pub mod serverbound_configuration_acknowledged_packet;
-pub mod serverbound_container_button_click_packet;
-pub mod serverbound_container_click_packet;
-pub mod serverbound_container_close_packet;
-pub mod serverbound_container_slot_state_changed_packet;
-pub mod serverbound_cookie_response_packet;
-pub mod serverbound_custom_payload_packet;
-pub mod serverbound_debug_sample_subscription;
-pub mod serverbound_edit_book_packet;
-pub mod serverbound_entity_tag_query_packet;
-pub mod serverbound_interact_packet;
-pub mod serverbound_jigsaw_generate_packet;
-pub mod serverbound_keep_alive_packet;
-pub mod serverbound_lock_difficulty_packet;
-pub mod serverbound_move_player_pos_packet;
-pub mod serverbound_move_player_pos_rot_packet;
-pub mod serverbound_move_player_rot_packet;
-pub mod serverbound_move_player_status_only_packet;
-pub mod serverbound_move_vehicle_packet;
-pub mod serverbound_paddle_boat_packet;
-pub mod serverbound_pick_item_packet;
-pub mod serverbound_ping_request_packet;
-pub mod serverbound_place_recipe_packet;
-pub mod serverbound_player_abilities_packet;
-pub mod serverbound_player_action_packet;
-pub mod serverbound_player_command_packet;
-pub mod serverbound_player_input_packet;
-pub mod serverbound_pong_packet;
-pub mod serverbound_recipe_book_change_settings_packet;
-pub mod serverbound_recipe_book_seen_recipe_packet;
-pub mod serverbound_rename_item_packet;
-pub mod serverbound_resource_pack_packet;
-pub mod serverbound_seen_advancements_packet;
-pub mod serverbound_select_bundle_item_packet;
-pub mod serverbound_select_trade_packet;
-pub mod serverbound_set_beacon_packet;
-pub mod serverbound_set_carried_item_packet;
-pub mod serverbound_set_command_block_packet;
-pub mod serverbound_set_command_minecart_packet;
-pub mod serverbound_set_creative_mode_slot_packet;
-pub mod serverbound_set_jigsaw_block_packet;
-pub mod serverbound_set_structure_block_packet;
-pub mod serverbound_sign_update_packet;
-pub mod serverbound_swing_packet;
-pub mod serverbound_teleport_to_entity_packet;
-pub mod serverbound_use_item_on_packet;
-pub mod serverbound_use_item_packet;
+// NOTE: This file is generated automatically by codegen/packet.py.
+// Don't edit it directly!
 
 use azalea_protocol_macros::declare_state_packets;
 
-// see GameProtocols.java in the decompiled vanilla source
-
-declare_state_packets!(
-    GamePacket,
-    Serverbound => {
-        0x00: serverbound_accept_teleportation_packet::ServerboundAcceptTeleportationPacket,
-        0x01: serverbound_block_entity_tag_query_packet::ServerboundBlockEntityTagQueryPacket,
-        0x02: serverbound_select_bundle_item_packet::ServerboundSelectBundleItemPacket,
-        0x03: serverbound_change_difficulty_packet::ServerboundChangeDifficultyPacket,
-        0x04: serverbound_chat_ack_packet::ServerboundChatAckPacket,
-        0x05: serverbound_chat_command_packet::ServerboundChatCommandPacket,
-        0x06: serverbound_chat_command_signed_packet::ServerboundChatCommandSignedPacket,
-        0x07: serverbound_chat_packet::ServerboundChatPacket,
-        0x08: serverbound_chat_session_update_packet::ServerboundChatSessionUpdatePacket,
-        0x09: serverbound_chunk_batch_received_packet::ServerboundChunkBatchReceivedPacket,
-        0x0a: serverbound_client_command_packet::ServerboundClientCommandPacket,
-        0x0b: serverbound_client_tick_end_packet::ServerboundTickEndPacket,
-        0x0c: serverbound_client_information_packet::ServerboundClientInformationPacket,
-        0x0d: serverbound_command_suggestion_packet::ServerboundCommandSuggestionPacket,
-        0x0e: serverbound_configuration_acknowledged_packet::ServerboundConfigurationAcknowledgedPacket,
-        0x0f: serverbound_container_button_click_packet::ServerboundContainerButtonClickPacket,
-        0x10: serverbound_container_click_packet::ServerboundContainerClickPacket,
-        0x11: serverbound_container_close_packet::ServerboundContainerClosePacket,
-        0x12: serverbound_container_slot_state_changed_packet::ServerboundContainerSlotStateChangedPacket,
-        0x13: serverbound_cookie_response_packet::ServerboundCookieResponsePacket,
-        0x14: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket,
-        0x15: serverbound_debug_sample_subscription::ServerboundDebugSampleSubscription,
-        0x16: serverbound_edit_book_packet::ServerboundEditBookPacket,
-        0x17: serverbound_entity_tag_query_packet::ServerboundEntityTagQueryPacket,
-        0x18: serverbound_interact_packet::ServerboundInteractPacket,
-        0x19: serverbound_jigsaw_generate_packet::ServerboundJigsawGeneratePacket,
-        0x1a: serverbound_keep_alive_packet::ServerboundKeepAlivePacket,
-        0x1b: serverbound_lock_difficulty_packet::ServerboundLockDifficultyPacket,
-        0x1c: serverbound_move_player_pos_packet::ServerboundMovePlayerPosPacket,
-        0x1d: serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket,
-        0x1e: serverbound_move_player_rot_packet::ServerboundMovePlayerRotPacket,
-        0x1f: serverbound_move_player_status_only_packet::ServerboundMovePlayerStatusOnlyPacket,
-        0x20: serverbound_move_vehicle_packet::ServerboundMoveVehiclePacket,
-        0x21: serverbound_paddle_boat_packet::ServerboundPaddleBoatPacket,
-        0x22: serverbound_pick_item_packet::ServerboundPickItemPacket,
-        0x23: serverbound_ping_request_packet::ServerboundPingRequestPacket,
-        0x24: serverbound_place_recipe_packet::ServerboundPlaceRecipePacket,
-        0x25: serverbound_player_abilities_packet::ServerboundPlayerAbilitiesPacket,
-        0x26: serverbound_player_action_packet::ServerboundPlayerActionPacket,
-        0x27: serverbound_player_command_packet::ServerboundPlayerCommandPacket,
-        0x28: serverbound_player_input_packet::ServerboundPlayerInputPacket,
-        0x29: serverbound_pong_packet::ServerboundPongPacket,
-        0x2a: serverbound_recipe_book_change_settings_packet::ServerboundRecipeBookChangeSettingsPacket,
-        0x2b: serverbound_recipe_book_seen_recipe_packet::ServerboundRecipeBookSeenRecipePacket,
-        0x2c: serverbound_rename_item_packet::ServerboundRenameItemPacket,
-        0x2d: serverbound_resource_pack_packet::ServerboundResourcePackPacket,
-        0x2e: serverbound_seen_advancements_packet::ServerboundSeenAdvancementsPacket,
-        0x2f: serverbound_select_trade_packet::ServerboundSelectTradePacket,
-        0x30: serverbound_set_beacon_packet::ServerboundSetBeaconPacket,
-        0x31: serverbound_set_carried_item_packet::ServerboundSetCarriedItemPacket,
-        0x32: serverbound_set_command_block_packet::ServerboundSetCommandBlockPacket,
-        0x33: serverbound_set_command_minecart_packet::ServerboundSetCommandMinecartPacket,
-        0x34: serverbound_set_creative_mode_slot_packet::ServerboundSetCreativeModeSlotPacket,
-        0x35: serverbound_set_jigsaw_block_packet::ServerboundSetJigsawBlockPacket,
-        0x36: serverbound_set_structure_block_packet::ServerboundSetStructureBlockPacket,
-        0x37: serverbound_sign_update_packet::ServerboundSignUpdatePacket,
-        0x38: serverbound_swing_packet::ServerboundSwingPacket,
-        0x39: serverbound_teleport_to_entity_packet::ServerboundTeleportToEntityPacket,
-        0x3a: serverbound_use_item_on_packet::ServerboundUseItemOnPacket,
-        0x3b: serverbound_use_item_packet::ServerboundUseItemPacket,
-    },
-    Clientbound => {
-        0x00: clientbound_bundle_packet::ClientboundBundlePacket,
-        0x01: clientbound_add_entity_packet::ClientboundAddEntityPacket,
-        0x02: clientbound_add_experience_orb_packet::ClientboundAddExperienceOrbPacket,
-        0x03: clientbound_animate_packet::ClientboundAnimatePacket,
-        0x04: clientbound_award_stats_packet::ClientboundAwardStatsPacket,
-        0x05: clientbound_block_changed_ack_packet::ClientboundBlockChangedAckPacket,
-        0x06: clientbound_block_destruction_packet::ClientboundBlockDestructionPacket,
-        0x07: clientbound_block_entity_data_packet::ClientboundBlockEntityDataPacket,
-        0x08: clientbound_block_event_packet::ClientboundBlockEventPacket,
-        0x09: clientbound_block_update_packet::ClientboundBlockUpdatePacket,
-        0x0a: clientbound_boss_event_packet::ClientboundBossEventPacket,
-        0x0b: clientbound_change_difficulty_packet::ClientboundChangeDifficultyPacket,
-        0x0c: clientbound_chunk_batch_finished_packet::ClientboundChunkBatchFinishedPacket,
-        0x0d: clientbound_chunk_batch_start_packet::ClientboundChunkBatchStartPacket,
-        0x0e: clientbound_chunks_biomes_packet::ClientboundChunksBiomesPacket,
-        0x0f: clientbound_clear_titles_packet::ClientboundClearTitlesPacket,
-        0x10: clientbound_command_suggestions_packet::ClientboundCommandSuggestionsPacket,
-        0x11: clientbound_commands_packet::ClientboundCommandsPacket,
-        0x12: clientbound_container_close_packet::ClientboundContainerClosePacket,
-        0x13: clientbound_container_set_content_packet::ClientboundContainerSetContentPacket,
-        0x14: clientbound_container_set_data_packet::ClientboundContainerSetDataPacket,
-        0x15: clientbound_container_set_slot_packet::ClientboundContainerSetSlotPacket,
-        0x16: clientbound_cookie_request_packet::ClientboundCookieRequestPacket,
-        0x17: clientbound_cooldown_packet::ClientboundCooldownPacket,
-        0x18: clientbound_custom_chat_completions_packet::ClientboundCustomChatCompletionsPacket,
-        0x19: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket,
-        0x1a: clientbound_damage_event_packet::ClientboundDamageEventPacket,
-        0x1b: clientbound_debug_sample_packet::ClientboundDebugSamplePacket,
-        0x1c: clientbound_delete_chat_packet::ClientboundDeleteChatPacket,
-        0x1d: clientbound_disconnect_packet::ClientboundDisconnectPacket,
-        0x1e: clientbound_disguised_chat_packet::ClientboundDisguisedChatPacket,
-        0x1f: clientbound_entity_event_packet::ClientboundEntityEventPacket,
-        0x20: clientbound_entity_position_sync_packet::ClientboundEntityPositionSyncPacket,
-        0x21: clientbound_explode_packet::ClientboundExplodePacket,
-        0x22: clientbound_forget_level_chunk_packet::ClientboundForgetLevelChunkPacket,
-        0x23: clientbound_game_event_packet::ClientboundGameEventPacket,
-        0x24: clientbound_horse_screen_open_packet::ClientboundHorseScreenOpenPacket,
-        0x25: clientbound_hurt_animation_packet::ClientboundHurtAnimationPacket,
-        0x26: clientbound_initialize_border_packet::ClientboundInitializeBorderPacket,
-        0x27: clientbound_keep_alive_packet::ClientboundKeepAlivePacket,
-        0x28: clientbound_level_chunk_with_light_packet::ClientboundLevelChunkWithLightPacket,
-        0x29: clientbound_level_event_packet::ClientboundLevelEventPacket,
-        0x2a: clientbound_level_particles_packet::ClientboundLevelParticlesPacket,
-        0x2b: clientbound_light_update_packet::ClientboundLightUpdatePacket,
-        0x2c: clientbound_login_packet::ClientboundLoginPacket,
-        0x2d: clientbound_map_item_data_packet::ClientboundMapItemDataPacket,
-        0x2e: clientbound_merchant_offers_packet::ClientboundMerchantOffersPacket,
-        0x2f: clientbound_move_entity_pos_packet::ClientboundMoveEntityPosPacket,
-        0x30: clientbound_move_entity_pos_rot_packet::ClientboundMoveEntityPosRotPacket,
-        0x31: clientbound_move_minecart_packet::ClientboundMoveMinecartPacket,
-        0x32: clientbound_move_entity_rot_packet::ClientboundMoveEntityRotPacket,
-        0x33: clientbound_move_vehicle_packet::ClientboundMoveVehiclePacket,
-        0x34: clientbound_open_book_packet::ClientboundOpenBookPacket,
-        0x35: clientbound_open_screen_packet::ClientboundOpenScreenPacket,
-        0x36: clientbound_open_sign_editor_packet::ClientboundOpenSignEditorPacket,
-        0x37: clientbound_ping_packet::ClientboundPingPacket,
-        0x38: clientbound_pong_response_packet::ClientboundPongResponsePacket,
-        0x39: clientbound_place_ghost_recipe_packet::ClientboundPlaceGhostRecipePacket,
-        0x3a: clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket,
-        0x3b: clientbound_player_chat_packet::ClientboundPlayerChatPacket,
-        0x3c: clientbound_player_combat_end_packet::ClientboundPlayerCombatEndPacket,
-        0x3d: clientbound_player_combat_enter_packet::ClientboundPlayerCombatEnterPacket,
-        0x3e: clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket,
-        0x3f: clientbound_player_info_remove_packet::ClientboundPlayerInfoRemovePacket,
-        0x40: clientbound_player_info_update_packet::ClientboundPlayerInfoUpdatePacket,
-        0x41: clientbound_player_look_at_packet::ClientboundPlayerLookAtPacket,
-        0x42: clientbound_player_position_packet::ClientboundPlayerPositionPacket,
-        0x43: clientbound_player_rotation_packet::ClientboundPlayerRotationPacket,
-        0x44: clientbound_recipe_book_add_packet::ClientboundRecipeBookAddPacket,
-        0x45: clientbound_recipe_book_remove_packet::ClientboundRecipeBookRemovePacket,
-        0x46: clientbound_recipe_book_settings_packet::ClientboundRecipeBookSettingsPacket,
-        0x47: clientbound_remove_entities_packet::ClientboundRemoveEntitiesPacket,
-        0x48: clientbound_remove_mob_effect_packet::ClientboundRemoveMobEffectPacket,
-        0x49: clientbound_reset_score_packet::ClientboundResetScorePacket,
-        0x4a: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket,
-        0x4b: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket,
-        0x4c: clientbound_respawn_packet::ClientboundRespawnPacket,
-        0x4d: clientbound_rotate_head_packet::ClientboundRotateHeadPacket,
-        0x4e: clientbound_section_blocks_update_packet::ClientboundSectionBlocksUpdatePacket,
-        0x4f: clientbound_select_advancements_tab_packet::ClientboundSelectAdvancementsTabPacket,
-        0x50: clientbound_server_data_packet::ClientboundServerDataPacket,
-        0x51: clientbound_set_action_bar_text_packet::ClientboundSetActionBarTextPacket,
-        0x52: clientbound_set_border_center_packet::ClientboundSetBorderCenterPacket,
-        0x53: clientbound_set_border_lerp_size_packet::ClientboundSetBorderLerpSizePacket,
-        0x54: clientbound_set_border_size_packet::ClientboundSetBorderSizePacket,
-        0x55: clientbound_set_border_warning_delay_packet::ClientboundSetBorderWarningDelayPacket,
-        0x56: clientbound_set_border_warning_distance_packet::ClientboundSetBorderWarningDistancePacket,
-        0x57: clientbound_set_camera_packet::ClientboundSetCameraPacket,
-        0x58: clientbound_set_chunk_cache_center_packet::ClientboundSetChunkCacheCenterPacket,
-        0x59: clientbound_set_chunk_cache_radius_packet::ClientboundSetChunkCacheRadiusPacket,
-        0x5a: clientbound_set_cursor_item_packet::ClientboundSetCursorItemPacket,
-        0x5b: clientbound_set_default_spawn_position_packet::ClientboundSetDefaultSpawnPositionPacket,
-        0x5c: clientbound_set_display_objective_packet::ClientboundSetDisplayObjectivePacket,
-        0x5d: clientbound_set_entity_data_packet::ClientboundSetEntityDataPacket,
-        0x5e: clientbound_set_entity_link_packet::ClientboundSetEntityLinkPacket,
-        0x5f: clientbound_set_entity_motion_packet::ClientboundSetEntityMotionPacket,
-        0x60: clientbound_set_equipment_packet::ClientboundSetEquipmentPacket,
-        0x61: clientbound_set_experience_packet::ClientboundSetExperiencePacket,
-        0x62: clientbound_set_health_packet::ClientboundSetHealthPacket,
-        0x63: clientbound_set_held_slot_packet::ClientboundSetHeldSlotPacket,
-        0x64: clientbound_set_objective_packet::ClientboundSetObjectivePacket,
-        0x65: clientbound_set_passengers_packet::ClientboundSetPassengersPacket,
-        0x66: clientbound_set_player_inventory_packet::ClientboundSetPlayerInventoryPacket,
-        0x67: clientbound_set_player_team_packet::ClientboundSetPlayerTeamPacket,
-        0x68: clientbound_set_score_packet::ClientboundSetScorePacket,
-        0x69: clientbound_set_simulation_distance_packet::ClientboundSetSimulationDistancePacket,
-        0x6a: clientbound_set_subtitle_text_packet::ClientboundSetSubtitleTextPacket,
-        0x6b: clientbound_set_time_packet::ClientboundSetTimePacket,
-        0x6c: clientbound_set_title_text_packet::ClientboundSetTitleTextPacket,
-        0x6d: clientbound_set_titles_animation_packet::ClientboundSetTitlesAnimationPacket,
-        0x6e: clientbound_sound_entity_packet::ClientboundSoundEntityPacket,
-        0x6f: clientbound_sound_packet::ClientboundSoundPacket,
-        0x70: clientbound_start_configuration_packet::ClientboundStartConfigurationPacket,
-        0x71: clientbound_stop_sound_packet::ClientboundStopSoundPacket,
-        0x72: clientbound_store_cookie_packet::ClientboundStoreCookiePacket,
-        0x73: clientbound_system_chat_packet::ClientboundSystemChatPacket,
-        0x74: clientbound_tab_list_packet::ClientboundTabListPacket,
-        0x75: clientbound_tag_query_packet::ClientboundTagQueryPacket,
-        0x76: clientbound_take_item_entity_packet::ClientboundTakeItemEntityPacket,
-        0x77: clientbound_teleport_entity_packet::ClientboundTeleportEntityPacket,
-        0x78: clientbound_ticking_state_packet::ClientboundTickingStatePacket,
-        0x79: clientbound_ticking_step_packet::ClientboundTickingStepPacket,
-        0x7a: clientbound_transfer_packet::ClientboundTransferPacket,
-        0x7b: clientbound_update_advancements_packet::ClientboundUpdateAdvancementsPacket,
-        0x7c: clientbound_update_attributes_packet::ClientboundUpdateAttributesPacket,
-        0x7d: clientbound_update_mob_effect_packet::ClientboundUpdateMobEffectPacket,
-        0x7e: clientbound_update_recipes_packet::ClientboundUpdateRecipesPacket,
-        0x7f: clientbound_update_tags_packet::ClientboundUpdateTagsPacket,
-        0x80: clientbound_projectile_power_packet::ClientboundProjectilePowerPacket,
-        0x81: clientbound_custom_report_details_packet::ClientboundCustomReportDetailsPacket,
-        0x82: clientbound_server_links_packet::ClientboundServerLinksPacket
-    }
+declare_state_packets!(GamePacket,
+    Clientbound => [
+        bundle_delimiter,
+        add_entity,
+        add_experience_orb,
+        animate,
+        award_stats,
+        block_changed_ack,
+        block_destruction,
+        block_entity_data,
+        block_event,
+        block_update,
+        boss_event,
+        change_difficulty,
+        chunk_batch_finished,
+        chunk_batch_start,
+        chunks_biomes,
+        clear_titles,
+        command_suggestions,
+        commands,
+        container_close,
+        container_set_content,
+        container_set_data,
+        container_set_slot,
+        cookie_request,
+        cooldown,
+        custom_chat_completions,
+        custom_payload,
+        damage_event,
+        debug_sample,
+        delete_chat,
+        disconnect,
+        disguised_chat,
+        entity_event,
+        entity_position_sync,
+        explode,
+        forget_level_chunk,
+        game_event,
+        horse_screen_open,
+        hurt_animation,
+        initialize_border,
+        keep_alive,
+        level_chunk_with_light,
+        level_event,
+        level_particles,
+        light_update,
+        login,
+        map_item_data,
+        merchant_offers,
+        move_entity_pos,
+        move_entity_pos_rot,
+        move_minecart_along_track,
+        move_entity_rot,
+        move_vehicle,
+        open_book,
+        open_screen,
+        open_sign_editor,
+        ping,
+        pong_response,
+        place_ghost_recipe,
+        player_abilities,
+        player_chat,
+        player_combat_end,
+        player_combat_enter,
+        player_combat_kill,
+        player_info_remove,
+        player_info_update,
+        player_look_at,
+        player_position,
+        player_rotation,
+        recipe_book_add,
+        recipe_book_remove,
+        recipe_book_settings,
+        remove_entities,
+        remove_mob_effect,
+        reset_score,
+        resource_pack_pop,
+        resource_pack_push,
+        respawn,
+        rotate_head,
+        section_blocks_update,
+        select_advancements_tab,
+        server_data,
+        set_action_bar_text,
+        set_border_center,
+        set_border_lerp_size,
+        set_border_size,
+        set_border_warning_delay,
+        set_border_warning_distance,
+        set_camera,
+        set_chunk_cache_center,
+        set_chunk_cache_radius,
+        set_cursor_item,
+        set_default_spawn_position,
+        set_display_objective,
+        set_entity_data,
+        set_entity_link,
+        set_entity_motion,
+        set_equipment,
+        set_experience,
+        set_health,
+        set_held_slot,
+        set_objective,
+        set_passengers,
+        set_player_inventory,
+        set_player_team,
+        set_score,
+        set_simulation_distance,
+        set_subtitle_text,
+        set_time,
+        set_title_text,
+        set_titles_animation,
+        sound_entity,
+        sound,
+        start_configuration,
+        stop_sound,
+        store_cookie,
+        system_chat,
+        tab_list,
+        tag_query,
+        take_item_entity,
+        teleport_entity,
+        ticking_state,
+        ticking_step,
+        transfer,
+        update_advancements,
+        update_attributes,
+        update_mob_effect,
+        update_recipes,
+        update_tags,
+        projectile_power,
+        custom_report_details,
+        server_links,
+    ],
+    Serverbound => [
+        accept_teleportation,
+        block_entity_tag_query,
+        bundle_item_selected,
+        change_difficulty,
+        chat_ack,
+        chat_command,
+        chat_command_signed,
+        chat,
+        chat_session_update,
+        chunk_batch_received,
+        client_command,
+        client_tick_end,
+        client_information,
+        command_suggestion,
+        configuration_acknowledged,
+        container_button_click,
+        container_click,
+        container_close,
+        container_slot_state_changed,
+        cookie_response,
+        custom_payload,
+        debug_sample_subscription,
+        edit_book,
+        entity_tag_query,
+        interact,
+        jigsaw_generate,
+        keep_alive,
+        lock_difficulty,
+        move_player_pos,
+        move_player_pos_rot,
+        move_player_rot,
+        move_player_status_only,
+        move_vehicle,
+        paddle_boat,
+        pick_item,
+        ping_request,
+        place_recipe,
+        player_abilities,
+        player_action,
+        player_command,
+        player_input,
+        pong,
+        recipe_book_change_settings,
+        recipe_book_seen_recipe,
+        rename_item,
+        resource_pack,
+        seen_advancements,
+        select_trade,
+        set_beacon,
+        set_carried_item,
+        set_command_block,
+        set_command_minecart,
+        set_creative_mode_slot,
+        set_jigsaw_block,
+        set_structure_block,
+        sign_update,
+        swing,
+        teleport_to_entity,
+        use_item_on,
+        use_item,
+    ]
 );
diff --git a/azalea-protocol/src/packets/game/s_accept_teleportation.rs b/azalea-protocol/src/packets/game/s_accept_teleportation.rs
new file mode 100755
index 000000000..dedc125a4
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_accept_teleportation.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundAcceptTeleportation {
+    #[var]
+    pub id: u32,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query.rs b/azalea-protocol/src/packets/game/s_block_entity_tag_query.rs
old mode 100755
new mode 100644
similarity index 61%
rename from azalea-protocol/src/packets/game/serverbound_block_entity_tag_query.rs
rename to azalea-protocol/src/packets/game/s_block_entity_tag_query.rs
index 4b396a677..159f12dc8
--- a/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query.rs
+++ b/azalea-protocol/src/packets/game/s_block_entity_tag_query.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
 pub struct ServerboundBlockEntityTagQuery {
     #[var]
-    pub transaction_id: i32,
+    pub transaction_id: u32,
     pub pos: BlockPos,
 }
diff --git a/azalea-protocol/src/packets/game/serverbound_select_bundle_item_packet.rs b/azalea-protocol/src/packets/game/s_bundle_item_selected.rs
similarity index 51%
rename from azalea-protocol/src/packets/game/serverbound_select_bundle_item_packet.rs
rename to azalea-protocol/src/packets/game/s_bundle_item_selected.rs
index 3a315183a..552e51f86 100644
--- a/azalea-protocol/src/packets/game/serverbound_select_bundle_item_packet.rs
+++ b/azalea-protocol/src/packets/game/s_bundle_item_selected.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSelectBundleItemPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundBundleItemSelected {
     #[var]
     pub slot_id: i32,
     #[var]
diff --git a/azalea-protocol/src/packets/game/serverbound_change_difficulty_packet.rs b/azalea-protocol/src/packets/game/s_change_difficulty.rs
similarity index 50%
rename from azalea-protocol/src/packets/game/serverbound_change_difficulty_packet.rs
rename to azalea-protocol/src/packets/game/s_change_difficulty.rs
index 460de5b25..7dcd3c830 100755
--- a/azalea-protocol/src/packets/game/serverbound_change_difficulty_packet.rs
+++ b/azalea-protocol/src/packets/game/s_change_difficulty.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::difficulty::Difficulty;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChangeDifficultyPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChangeDifficulty {
     pub difficulty: Difficulty,
 }
diff --git a/azalea-protocol/src/packets/game/serverbound_chat_packet.rs b/azalea-protocol/src/packets/game/s_chat.rs
similarity index 72%
rename from azalea-protocol/src/packets/game/serverbound_chat_packet.rs
rename to azalea-protocol/src/packets/game/s_chat.rs
index e0a1726c7..03bafd110 100755
--- a/azalea-protocol/src/packets/game/serverbound_chat_packet.rs
+++ b/azalea-protocol/src/packets/game/s_chat.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::bitset::FixedBitSet;
 use azalea_crypto::MessageSignature;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChatPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChat {
     pub message: String,
     pub timestamp: u64,
     pub salt: u64,
@@ -12,7 +12,7 @@ pub struct ServerboundChatPacket {
     pub last_seen_messages: LastSeenMessagesUpdate,
 }
 
-#[derive(Clone, Debug, McBuf, Default)]
+#[derive(Clone, Debug, AzBuf, Default)]
 pub struct LastSeenMessagesUpdate {
     #[var]
     pub messages: u32,
diff --git a/azalea-protocol/src/packets/game/s_chat_ack.rs b/azalea-protocol/src/packets/game/s_chat_ack.rs
new file mode 100755
index 000000000..d4b6efd67
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_chat_ack.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChatAck {
+    #[var]
+    pub messages: u32,
+}
diff --git a/azalea-protocol/src/packets/game/s_chat_command.rs b/azalea-protocol/src/packets/game/s_chat_command.rs
new file mode 100755
index 000000000..4fdab9f98
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_chat_command.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChatCommand {
+    pub command: String,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs b/azalea-protocol/src/packets/game/s_chat_command_signed.rs
similarity index 62%
rename from azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs
rename to azalea-protocol/src/packets/game/s_chat_command_signed.rs
index f64b79ccf..c20f3c6d4 100755
--- a/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs
+++ b/azalea-protocol/src/packets/game/s_chat_command_signed.rs
@@ -1,11 +1,11 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_crypto::MessageSignature;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-use super::serverbound_chat_packet::LastSeenMessagesUpdate;
+use super::s_chat::LastSeenMessagesUpdate;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChatCommandSignedPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChatCommandSigned {
     pub command: String,
     pub timestamp: u64,
     pub salt: u64,
@@ -13,7 +13,7 @@ pub struct ServerboundChatCommandSignedPacket {
     pub last_seen_messages: LastSeenMessagesUpdate,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct ArgumentSignature {
     pub name: String,
     pub signature: MessageSignature,
diff --git a/azalea-protocol/src/packets/game/s_chat_preview.rs b/azalea-protocol/src/packets/game/s_chat_preview.rs
new file mode 100755
index 000000000..3d2bf34ec
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_chat_preview.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChatPreview {
+    pub query_id: i32,
+    pub query: String,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_chat_session_update_packet.rs b/azalea-protocol/src/packets/game/s_chat_session_update.rs
similarity index 61%
rename from azalea-protocol/src/packets/game/serverbound_chat_session_update_packet.rs
rename to azalea-protocol/src/packets/game/s_chat_session_update.rs
index e56d2bc62..f3499983b 100644
--- a/azalea-protocol/src/packets/game/serverbound_chat_session_update_packet.rs
+++ b/azalea-protocol/src/packets/game/s_chat_session_update.rs
@@ -1,19 +1,19 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 use uuid::Uuid;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChatSessionUpdatePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChatSessionUpdate {
     pub chat_session: RemoteChatSessionData,
 }
 
-#[derive(Clone, Debug, PartialEq, Eq, McBuf)]
+#[derive(Clone, Debug, PartialEq, Eq, AzBuf)]
 pub struct RemoteChatSessionData {
     pub session_id: Uuid,
     pub profile_public_key: ProfilePublicKeyData,
 }
 
-#[derive(Clone, Debug, McBuf, PartialEq, Eq)]
+#[derive(Clone, Debug, AzBuf, PartialEq, Eq)]
 pub struct ProfilePublicKeyData {
     pub expires_at: u64,
     pub key: Vec<u8>,
diff --git a/azalea-protocol/src/packets/game/s_chunk_batch_received.rs b/azalea-protocol/src/packets/game/s_chunk_batch_received.rs
new file mode 100644
index 000000000..faa50932e
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_chunk_batch_received.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundChunkBatchReceived {
+    pub desired_chunks_per_tick: f32,
+}
diff --git a/azalea-protocol/src/packets/game/s_client_command.rs b/azalea-protocol/src/packets/game/s_client_command.rs
new file mode 100755
index 000000000..5742bdb44
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_client_command.rs
@@ -0,0 +1,13 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundClientCommand {
+    pub action: Action,
+}
+
+#[derive(AzBuf, Clone, Copy, Debug)]
+pub enum Action {
+    PerformRespawn = 0,
+    RequestStats = 1,
+}
diff --git a/azalea-protocol/src/packets/game/s_client_information.rs b/azalea-protocol/src/packets/game/s_client_information.rs
new file mode 100755
index 000000000..5861212c7
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_client_information.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+use crate::common::client_information::ClientInformation;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundClientInformation {
+    pub information: ClientInformation,
+}
diff --git a/azalea-protocol/src/packets/game/s_client_tick_end.rs b/azalea-protocol/src/packets/game/s_client_tick_end.rs
new file mode 100644
index 000000000..d8d930498
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_client_tick_end.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundClientTickEnd {}
diff --git a/azalea-protocol/src/packets/game/s_command_suggestion.rs b/azalea-protocol/src/packets/game/s_command_suggestion.rs
new file mode 100755
index 000000000..2e52a9691
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_command_suggestion.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundCommandSuggestion {
+    #[var]
+    pub id: u32,
+    pub command: String,
+}
diff --git a/azalea-protocol/src/packets/game/s_configuration_acknowledged.rs b/azalea-protocol/src/packets/game/s_configuration_acknowledged.rs
new file mode 100644
index 000000000..58e27abbe
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_configuration_acknowledged.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundConfigurationAcknowledged {}
diff --git a/azalea-protocol/src/packets/game/s_container_button_click.rs b/azalea-protocol/src/packets/game/s_container_button_click.rs
new file mode 100755
index 000000000..909772f3c
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_container_button_click.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundContainerButtonClick {
+    pub container_id: u8,
+    pub button_id: u8,
+}
diff --git a/azalea-protocol/src/packets/game/s_container_click.rs b/azalea-protocol/src/packets/game/s_container_click.rs
new file mode 100755
index 000000000..a6dee6972
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_container_click.rs
@@ -0,0 +1,17 @@
+use std::collections::HashMap;
+
+use azalea_buf::AzBuf;
+use azalea_inventory::{operations::ClickType, ItemStack};
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundContainerClick {
+    pub container_id: u8,
+    #[var]
+    pub state_id: u32,
+    pub slot_num: i16,
+    pub button_num: u8,
+    pub click_type: ClickType,
+    pub changed_slots: HashMap<u16, ItemStack>,
+    pub carried_item: ItemStack,
+}
diff --git a/azalea-protocol/src/packets/game/s_container_close.rs b/azalea-protocol/src/packets/game/s_container_close.rs
new file mode 100755
index 000000000..1cb88eabf
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_container_close.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundContainerClose {
+    pub container_id: u8,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_container_slot_state_changed_packet.rs b/azalea-protocol/src/packets/game/s_container_slot_state_changed.rs
similarity index 53%
rename from azalea-protocol/src/packets/game/serverbound_container_slot_state_changed_packet.rs
rename to azalea-protocol/src/packets/game/s_container_slot_state_changed.rs
index 8a83f4e2c..73ac02800 100644
--- a/azalea-protocol/src/packets/game/serverbound_container_slot_state_changed_packet.rs
+++ b/azalea-protocol/src/packets/game/s_container_slot_state_changed.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundContainerSlotStateChangedPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundContainerSlotStateChanged {
     #[var]
     pub slot_id: u32,
     #[var]
diff --git a/azalea-protocol/src/packets/game/s_cookie_response.rs b/azalea-protocol/src/packets/game/s_cookie_response.rs
new file mode 100644
index 000000000..5159d72ec
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_cookie_response.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundCookieResponse {
+    pub key: ResourceLocation,
+    pub payload: Option<Vec<u8>>,
+}
diff --git a/azalea-protocol/src/packets/game/s_custom_payload.rs b/azalea-protocol/src/packets/game/s_custom_payload.rs
new file mode 100755
index 000000000..b32f1d249
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_custom_payload.rs
@@ -0,0 +1,10 @@
+use azalea_buf::AzBuf;
+use azalea_buf::UnsizedByteArray;
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundCustomPayload {
+    pub identifier: ResourceLocation,
+    pub data: UnsizedByteArray,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs b/azalea-protocol/src/packets/game/s_debug_sample_subscription.rs
old mode 100755
new mode 100644
similarity index 63%
rename from azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs
rename to azalea-protocol/src/packets/game/s_debug_sample_subscription.rs
index 236972e06..450517933
--- a/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs
+++ b/azalea-protocol/src/packets/game/s_debug_sample_subscription.rs
@@ -1,12 +1,12 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
 pub struct ServerboundDebugSampleSubscription {
     pub sample_type: RemoteDebugSampleType,
 }
 
-#[derive(Clone, Copy, Debug, McBuf)]
+#[derive(Clone, Copy, Debug, AzBuf)]
 pub enum RemoteDebugSampleType {
     TickTime,
 }
diff --git a/azalea-protocol/src/packets/game/serverbound_edit_book_packet.rs b/azalea-protocol/src/packets/game/s_edit_book.rs
similarity index 55%
rename from azalea-protocol/src/packets/game/serverbound_edit_book_packet.rs
rename to azalea-protocol/src/packets/game/s_edit_book.rs
index 62d4b3182..af05a7cdb 100755
--- a/azalea-protocol/src/packets/game/serverbound_edit_book_packet.rs
+++ b/azalea-protocol/src/packets/game/s_edit_book.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundEditBookPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundEditBook {
     #[var]
     pub slot: u32,
     pub pages: Vec<String>,
diff --git a/azalea-protocol/src/packets/game/serverbound_entity_tag_query.rs b/azalea-protocol/src/packets/game/s_entity_tag_query.rs
old mode 100755
new mode 100644
similarity index 68%
rename from azalea-protocol/src/packets/game/serverbound_entity_tag_query.rs
rename to azalea-protocol/src/packets/game/s_entity_tag_query.rs
index 5b0c7db6d..619e9e54a
--- a/azalea-protocol/src/packets/game/serverbound_entity_tag_query.rs
+++ b/azalea-protocol/src/packets/game/s_entity_tag_query.rs
@@ -1,7 +1,7 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
 pub struct ServerboundEntityTagQuery {
     #[var]
     pub transaction_id: u32,
diff --git a/azalea-protocol/src/packets/game/serverbound_interact_packet.rs b/azalea-protocol/src/packets/game/s_interact.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/serverbound_interact_packet.rs
rename to azalea-protocol/src/packets/game/s_interact.rs
index e393920c9..cdd9cba5f 100755
--- a/azalea-protocol/src/packets/game/serverbound_interact_packet.rs
+++ b/azalea-protocol/src/packets/game/s_interact.rs
@@ -1,13 +1,13 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{McBuf, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar};
 use azalea_core::position::Vec3;
 use azalea_protocol_macros::ServerboundGamePacket;
 
 use crate::packets::BufReadError;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundInteractPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundInteract {
     #[var]
     pub entity_id: u32,
     pub action: ActionType,
@@ -27,42 +27,42 @@ pub enum ActionType {
     },
 }
 
-impl McBufWritable for ActionType {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ActionType {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
             ActionType::Interact { hand } => {
-                0u32.var_write_into(buf)?;
-                hand.write_into(buf)?;
+                0u32.azalea_write_var(buf)?;
+                hand.azalea_write(buf)?;
             }
             ActionType::Attack => {
-                1u32.var_write_into(buf)?;
+                1u32.azalea_write_var(buf)?;
             }
             ActionType::InteractAt { location, hand } => {
-                2u32.var_write_into(buf)?;
-                (location.x as f32).write_into(buf)?;
-                (location.y as f32).write_into(buf)?;
-                (location.z as f32).write_into(buf)?;
-                hand.write_into(buf)?;
+                2u32.azalea_write_var(buf)?;
+                (location.x as f32).azalea_write(buf)?;
+                (location.y as f32).azalea_write(buf)?;
+                (location.z as f32).azalea_write(buf)?;
+                hand.azalea_write(buf)?;
             }
         }
         Ok(())
     }
 }
 
-impl McBufReadable for ActionType {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let action_type = u32::var_read_from(buf)?;
+impl AzaleaRead for ActionType {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let action_type = u32::azalea_read_var(buf)?;
         match action_type {
             0 => {
-                let hand = InteractionHand::read_from(buf)?;
+                let hand = InteractionHand::azalea_read(buf)?;
                 Ok(ActionType::Interact { hand })
             }
             1 => Ok(ActionType::Attack),
             2 => {
-                let x = f32::read_from(buf)?;
-                let y = f32::read_from(buf)?;
-                let z = f32::read_from(buf)?;
-                let hand = InteractionHand::read_from(buf)?;
+                let x = f32::azalea_read(buf)?;
+                let y = f32::azalea_read(buf)?;
+                let z = f32::azalea_read(buf)?;
+                let hand = InteractionHand::azalea_read(buf)?;
                 Ok(ActionType::InteractAt {
                     location: Vec3 {
                         x: f64::from(x),
@@ -79,7 +79,7 @@ impl McBufReadable for ActionType {
     }
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum InteractionHand {
     MainHand = 0,
     OffHand = 1,
diff --git a/azalea-protocol/src/packets/game/serverbound_jigsaw_generate_packet.rs b/azalea-protocol/src/packets/game/s_jigsaw_generate.rs
similarity index 58%
rename from azalea-protocol/src/packets/game/serverbound_jigsaw_generate_packet.rs
rename to azalea-protocol/src/packets/game/s_jigsaw_generate.rs
index 34fd5985c..4a3b58ce1 100755
--- a/azalea-protocol/src/packets/game/serverbound_jigsaw_generate_packet.rs
+++ b/azalea-protocol/src/packets/game/s_jigsaw_generate.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundJigsawGeneratePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundJigsawGenerate {
     pub pos: BlockPos,
     #[var]
     pub levels: u32,
diff --git a/azalea-protocol/src/packets/game/s_keep_alive.rs b/azalea-protocol/src/packets/game/s_keep_alive.rs
new file mode 100755
index 000000000..a6806a929
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_keep_alive.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundKeepAlive {
+    pub id: u64,
+}
diff --git a/azalea-protocol/src/packets/game/s_lock_difficulty.rs b/azalea-protocol/src/packets/game/s_lock_difficulty.rs
new file mode 100755
index 000000000..72acb705e
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_lock_difficulty.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundLockDifficulty {
+    pub locked: bool,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_move_player_pos_packet.rs b/azalea-protocol/src/packets/game/s_move_player_pos.rs
similarity index 51%
rename from azalea-protocol/src/packets/game/serverbound_move_player_pos_packet.rs
rename to azalea-protocol/src/packets/game/s_move_player_pos.rs
index 4e3face43..2e2ec0c55 100755
--- a/azalea-protocol/src/packets/game/serverbound_move_player_pos_packet.rs
+++ b/azalea-protocol/src/packets/game/s_move_player_pos.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundMovePlayerPosPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundMovePlayerPos {
     pub x: f64,
     pub y: f64,
     pub z: f64,
diff --git a/azalea-protocol/src/packets/game/serverbound_move_player_pos_rot_packet.rs b/azalea-protocol/src/packets/game/s_move_player_pos_rot.rs
similarity index 57%
rename from azalea-protocol/src/packets/game/serverbound_move_player_pos_rot_packet.rs
rename to azalea-protocol/src/packets/game/s_move_player_pos_rot.rs
index 0ab9c885e..cb0e0633b 100755
--- a/azalea-protocol/src/packets/game/serverbound_move_player_pos_rot_packet.rs
+++ b/azalea-protocol/src/packets/game/s_move_player_pos_rot.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundMovePlayerPosRotPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundMovePlayerPosRot {
     pub x: f64,
     pub y: f64,
     pub z: f64,
diff --git a/azalea-protocol/src/packets/game/s_move_player_rot.rs b/azalea-protocol/src/packets/game/s_move_player_rot.rs
new file mode 100755
index 000000000..c3cda3ea1
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_move_player_rot.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundMovePlayerRot {
+    pub y_rot: f32,
+    pub x_rot: f32,
+    pub on_ground: bool,
+}
diff --git a/azalea-protocol/src/packets/game/s_move_player_status_only.rs b/azalea-protocol/src/packets/game/s_move_player_status_only.rs
new file mode 100755
index 000000000..155841f03
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_move_player_status_only.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundMovePlayerStatusOnly {
+    pub on_ground: bool,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_move_vehicle_packet.rs b/azalea-protocol/src/packets/game/s_move_vehicle.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/serverbound_move_vehicle_packet.rs
rename to azalea-protocol/src/packets/game/s_move_vehicle.rs
index 929ba7989..0452c9b02 100755
--- a/azalea-protocol/src/packets/game/serverbound_move_vehicle_packet.rs
+++ b/azalea-protocol/src/packets/game/s_move_vehicle.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundMoveVehiclePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundMoveVehicle {
     pub x: f64,
     pub y: f64,
     pub z: f64,
diff --git a/azalea-protocol/src/packets/game/s_paddle_boat.rs b/azalea-protocol/src/packets/game/s_paddle_boat.rs
new file mode 100755
index 000000000..eed7addc4
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_paddle_boat.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPaddleBoat {
+    pub left: bool,
+    pub right: bool,
+}
diff --git a/azalea-protocol/src/packets/game/s_pick_item.rs b/azalea-protocol/src/packets/game/s_pick_item.rs
new file mode 100755
index 000000000..289da6e70
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_pick_item.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPickItem {
+    #[var]
+    pub slot: u32,
+}
diff --git a/azalea-protocol/src/packets/game/s_pick_item_from_entity.rs b/azalea-protocol/src/packets/game/s_pick_item_from_entity.rs
new file mode 100644
index 000000000..420320631
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_pick_item_from_entity.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPickItemFromEntity {
+    #[var]
+    pub id: u32,
+    pub include_data: bool,
+}
diff --git a/azalea-protocol/src/packets/game/s_ping_request.rs b/azalea-protocol/src/packets/game/s_ping_request.rs
new file mode 100755
index 000000000..1ea7550fe
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_ping_request.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPingRequest {
+    pub time: u64,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_place_recipe_packet.rs b/azalea-protocol/src/packets/game/s_place_recipe.rs
similarity index 61%
rename from azalea-protocol/src/packets/game/serverbound_place_recipe_packet.rs
rename to azalea-protocol/src/packets/game/s_place_recipe.rs
index 03dd833b2..33456948b 100755
--- a/azalea-protocol/src/packets/game/serverbound_place_recipe_packet.rs
+++ b/azalea-protocol/src/packets/game/s_place_recipe.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundPlaceRecipePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPlaceRecipe {
     pub container_id: u8,
     pub recipe: ResourceLocation,
     pub shift_down: bool,
diff --git a/azalea-protocol/src/packets/game/s_player_abilities.rs b/azalea-protocol/src/packets/game/s_player_abilities.rs
new file mode 100755
index 000000000..fdf2d8a4e
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_player_abilities.rs
@@ -0,0 +1,31 @@
+use std::io::Cursor;
+
+use azalea_buf::{AzaleaRead, AzaleaWrite};
+use azalea_core::bitset::FixedBitSet;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+use crate::packets::BufReadError;
+
+#[derive(Clone, Debug, ServerboundGamePacket)]
+pub struct ServerboundPlayerAbilities {
+    pub is_flying: bool,
+}
+
+impl AzaleaRead for ServerboundPlayerAbilities {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let set = FixedBitSet::<2>::azalea_read(buf)?;
+        Ok(Self {
+            is_flying: set.index(1),
+        })
+    }
+}
+
+impl AzaleaWrite for ServerboundPlayerAbilities {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+        let mut set = FixedBitSet::<2>::new();
+        if self.is_flying {
+            set.set(1);
+        }
+        set.azalea_write(buf)
+    }
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_player_action_packet.rs b/azalea-protocol/src/packets/game/s_player_action.rs
similarity index 73%
rename from azalea-protocol/src/packets/game/serverbound_player_action_packet.rs
rename to azalea-protocol/src/packets/game/s_player_action.rs
index 6719202f7..5b65b7464 100755
--- a/azalea-protocol/src/packets/game/serverbound_player_action_packet.rs
+++ b/azalea-protocol/src/packets/game/s_player_action.rs
@@ -1,10 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::direction::Direction;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundPlayerActionPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPlayerAction {
     pub action: Action,
     pub pos: BlockPos,
     pub direction: Direction,
@@ -12,7 +12,7 @@ pub struct ServerboundPlayerActionPacket {
     pub sequence: u32,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Action {
     StartDestroyBlock = 0,
     AbortDestroyBlock = 1,
diff --git a/azalea-protocol/src/packets/game/serverbound_player_command_packet.rs b/azalea-protocol/src/packets/game/s_player_command.rs
similarity index 70%
rename from azalea-protocol/src/packets/game/serverbound_player_command_packet.rs
rename to azalea-protocol/src/packets/game/s_player_command.rs
index d7688092a..72a92310f 100755
--- a/azalea-protocol/src/packets/game/serverbound_player_command_packet.rs
+++ b/azalea-protocol/src/packets/game/s_player_command.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundPlayerCommandPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPlayerCommand {
     #[var]
     pub id: u32,
     pub action: Action,
@@ -10,7 +10,7 @@ pub struct ServerboundPlayerCommandPacket {
     pub data: u32,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Action {
     PressShiftKey = 0,
     ReleaseShiftKey = 1,
diff --git a/azalea-protocol/src/packets/game/serverbound_player_input_packet.rs b/azalea-protocol/src/packets/game/s_player_input.rs
similarity index 71%
rename from azalea-protocol/src/packets/game/serverbound_player_input_packet.rs
rename to azalea-protocol/src/packets/game/s_player_input.rs
index a461ddf50..bd4ba9709 100755
--- a/azalea-protocol/src/packets/game/serverbound_player_input_packet.rs
+++ b/azalea-protocol/src/packets/game/s_player_input.rs
@@ -1,12 +1,12 @@
 use std::io::Cursor;
 
 use azalea_buf::BufReadError;
-use azalea_buf::{McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite};
 use azalea_core::bitset::FixedBitSet;
 use azalea_protocol_macros::ServerboundGamePacket;
 
 #[derive(Clone, Debug, ServerboundGamePacket)]
-pub struct ServerboundPlayerInputPacket {
+pub struct ServerboundPlayerInput {
     pub forward: bool,
     pub backward: bool,
     pub left: bool,
@@ -16,9 +16,9 @@ pub struct ServerboundPlayerInputPacket {
     pub sprint: bool,
 }
 
-impl McBufReadable for ServerboundPlayerInputPacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let set = FixedBitSet::<7>::read_from(buf)?;
+impl AzaleaRead for ServerboundPlayerInput {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let set = FixedBitSet::<7>::azalea_read(buf)?;
         Ok(Self {
             forward: set.index(0),
             backward: set.index(1),
@@ -31,8 +31,8 @@ impl McBufReadable for ServerboundPlayerInputPacket {
     }
 }
 
-impl McBufWritable for ServerboundPlayerInputPacket {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ServerboundPlayerInput {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<7>::new();
         if self.forward {
             set.set(0);
@@ -55,6 +55,6 @@ impl McBufWritable for ServerboundPlayerInputPacket {
         if self.sprint {
             set.set(6);
         }
-        set.write_into(buf)
+        set.azalea_write(buf)
     }
 }
diff --git a/azalea-protocol/src/packets/game/s_player_loaded.rs b/azalea-protocol/src/packets/game/s_player_loaded.rs
new file mode 100644
index 000000000..3e809b269
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_player_loaded.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPlayerLoaded;
diff --git a/azalea-protocol/src/packets/game/s_pong.rs b/azalea-protocol/src/packets/game/s_pong.rs
new file mode 100755
index 000000000..10ce0fb7a
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_pong.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundPong {
+    pub id: u32,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_recipe_book_change_settings_packet.rs b/azalea-protocol/src/packets/game/s_recipe_book_change_settings.rs
similarity index 58%
rename from azalea-protocol/src/packets/game/serverbound_recipe_book_change_settings_packet.rs
rename to azalea-protocol/src/packets/game/s_recipe_book_change_settings.rs
index 6b3f015b3..a31ca173f 100755
--- a/azalea-protocol/src/packets/game/serverbound_recipe_book_change_settings_packet.rs
+++ b/azalea-protocol/src/packets/game/s_recipe_book_change_settings.rs
@@ -1,14 +1,14 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundRecipeBookChangeSettingsPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundRecipeBookChangeSettings {
     pub book_type: RecipeBookType,
     pub is_open: bool,
     pub is_filtering: bool,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum RecipeBookType {
     Crafting = 0,
     Furnace = 1,
diff --git a/azalea-protocol/src/packets/game/serverbound_recipe_book_seen_recipe_packet.rs b/azalea-protocol/src/packets/game/s_recipe_book_seen_recipe.rs
similarity index 52%
rename from azalea-protocol/src/packets/game/serverbound_recipe_book_seen_recipe_packet.rs
rename to azalea-protocol/src/packets/game/s_recipe_book_seen_recipe.rs
index 9923e3a6f..9eeffde9e 100755
--- a/azalea-protocol/src/packets/game/serverbound_recipe_book_seen_recipe_packet.rs
+++ b/azalea-protocol/src/packets/game/s_recipe_book_seen_recipe.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundRecipeBookSeenRecipePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundRecipeBookSeenRecipe {
     pub recipe: ResourceLocation,
 }
diff --git a/azalea-protocol/src/packets/game/s_rename_item.rs b/azalea-protocol/src/packets/game/s_rename_item.rs
new file mode 100755
index 000000000..4c913ba0f
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_rename_item.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundRenameItem {
+    pub name: String,
+}
diff --git a/azalea-protocol/src/packets/configuration/serverbound_resource_pack_packet.rs b/azalea-protocol/src/packets/game/s_resource_pack.rs
old mode 100644
new mode 100755
similarity index 50%
rename from azalea-protocol/src/packets/configuration/serverbound_resource_pack_packet.rs
rename to azalea-protocol/src/packets/game/s_resource_pack.rs
index 6f35525e6..7bdb7bb46
--- a/azalea-protocol/src/packets/configuration/serverbound_resource_pack_packet.rs
+++ b/azalea-protocol/src/packets/game/s_resource_pack.rs
@@ -1,14 +1,14 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundConfigurationPacket;
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
 use uuid::Uuid;
 
-#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)]
-pub struct ServerboundResourcePackPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundResourcePack {
     pub id: Uuid,
     pub action: Action,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Action {
     SuccessfullyLoaded = 0,
     Declined = 1,
diff --git a/azalea-protocol/src/packets/game/s_seen_advancements.rs b/azalea-protocol/src/packets/game/s_seen_advancements.rs
new file mode 100755
index 000000000..f46411f04
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_seen_advancements.rs
@@ -0,0 +1,41 @@
+use std::io::Cursor;
+
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite};
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+use crate::packets::BufReadError;
+
+#[derive(Clone, Debug, ServerboundGamePacket)]
+pub struct ServerboundSeenAdvancements {
+    pub action: Action,
+    pub tab: Option<ResourceLocation>,
+}
+
+#[derive(AzBuf, Clone, Copy, Debug, Eq, PartialEq)]
+pub enum Action {
+    OpenedTab = 0,
+    ClosedScreen = 1,
+}
+
+impl AzaleaRead for ServerboundSeenAdvancements {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let action = Action::azalea_read(buf)?;
+        let tab = if action == Action::OpenedTab {
+            Some(ResourceLocation::azalea_read(buf)?)
+        } else {
+            None
+        };
+        Ok(Self { action, tab })
+    }
+}
+
+impl AzaleaWrite for ServerboundSeenAdvancements {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+        self.action.azalea_write(buf)?;
+        if let Some(tab) = &self.tab {
+            tab.azalea_write(buf)?;
+        }
+        Ok(())
+    }
+}
diff --git a/azalea-protocol/src/packets/game/s_select_trade.rs b/azalea-protocol/src/packets/game/s_select_trade.rs
new file mode 100755
index 000000000..e0cc8aab4
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_select_trade.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSelectTrade {
+    #[var]
+    pub item: u32,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_set_beacon_packet.rs b/azalea-protocol/src/packets/game/s_set_beacon.rs
similarity index 54%
rename from azalea-protocol/src/packets/game/serverbound_set_beacon_packet.rs
rename to azalea-protocol/src/packets/game/s_set_beacon.rs
index db76cb9c5..b0b911a14 100755
--- a/azalea-protocol/src/packets/game/serverbound_set_beacon_packet.rs
+++ b/azalea-protocol/src/packets/game/s_set_beacon.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSetBeaconPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSetBeacon {
     #[var]
     pub primary: Option<u32>,
     #[var]
diff --git a/azalea-protocol/src/packets/game/s_set_carried_item.rs b/azalea-protocol/src/packets/game/s_set_carried_item.rs
new file mode 100755
index 000000000..5efa2d44f
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_set_carried_item.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSetCarriedItem {
+    pub slot: u16,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_set_command_block_packet.rs b/azalea-protocol/src/packets/game/s_set_command_block.rs
similarity index 52%
rename from azalea-protocol/src/packets/game/serverbound_set_command_block_packet.rs
rename to azalea-protocol/src/packets/game/s_set_command_block.rs
index db6557fd3..dacb79de4 100755
--- a/azalea-protocol/src/packets/game/serverbound_set_command_block_packet.rs
+++ b/azalea-protocol/src/packets/game/s_set_command_block.rs
@@ -1,13 +1,13 @@
 use std::io::Cursor;
 
-use azalea_buf::{BufReadError, McBuf, McBufReadable};
+use azalea_buf::{AzBuf, AzaleaRead, BufReadError};
 use azalea_core::{bitset::FixedBitSet, position::BlockPos};
 use azalea_protocol_macros::ServerboundGamePacket;
 
-use crate::packets::McBufWritable;
+use crate::packets::AzaleaWrite;
 
 #[derive(Clone, Debug, ServerboundGamePacket)]
-pub struct ServerboundSetCommandBlockPacket {
+pub struct ServerboundSetCommandBlock {
     pub pos: BlockPos,
     pub command: String,
     pub mode: Mode,
@@ -17,20 +17,20 @@ pub struct ServerboundSetCommandBlockPacket {
     pub automatic: bool,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Mode {
     Sequence = 0,
     Auto = 1,
     Redstone = 2,
 }
 
-impl McBufReadable for ServerboundSetCommandBlockPacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let pos = BlockPos::read_from(buf)?;
-        let command = String::read_from(buf)?;
-        let mode = Mode::read_from(buf)?;
+impl AzaleaRead for ServerboundSetCommandBlock {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let pos = BlockPos::azalea_read(buf)?;
+        let command = String::azalea_read(buf)?;
+        let mode = Mode::azalea_read(buf)?;
 
-        let set = FixedBitSet::<3>::read_from(buf)?;
+        let set = FixedBitSet::<3>::azalea_read(buf)?;
         Ok(Self {
             pos,
             command,
@@ -42,11 +42,11 @@ impl McBufReadable for ServerboundSetCommandBlockPacket {
     }
 }
 
-impl McBufWritable for ServerboundSetCommandBlockPacket {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
-        self.pos.write_into(buf)?;
-        self.command.write_into(buf)?;
-        self.mode.write_into(buf)?;
+impl AzaleaWrite for ServerboundSetCommandBlock {
+    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
+        self.pos.azalea_write(buf)?;
+        self.command.azalea_write(buf)?;
+        self.mode.azalea_write(buf)?;
 
         let mut set = FixedBitSet::<3>::new();
         if self.track_output {
@@ -58,6 +58,6 @@ impl McBufWritable for ServerboundSetCommandBlockPacket {
         if self.automatic {
             set.set(2);
         }
-        set.write_into(buf)
+        set.azalea_write(buf)
     }
 }
diff --git a/azalea-protocol/src/packets/game/serverbound_set_command_minecart_packet.rs b/azalea-protocol/src/packets/game/s_set_command_minecart.rs
similarity index 52%
rename from azalea-protocol/src/packets/game/serverbound_set_command_minecart_packet.rs
rename to azalea-protocol/src/packets/game/s_set_command_minecart.rs
index 7756c9240..0431a8658 100755
--- a/azalea-protocol/src/packets/game/serverbound_set_command_minecart_packet.rs
+++ b/azalea-protocol/src/packets/game/s_set_command_minecart.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSetCommandMinecartPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSetCommandMinecart {
     #[var]
     pub entity: u32,
     pub command: String,
diff --git a/azalea-protocol/src/packets/game/s_set_creative_mode_slot.rs b/azalea-protocol/src/packets/game/s_set_creative_mode_slot.rs
new file mode 100755
index 000000000..e4b26a64c
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_set_creative_mode_slot.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_inventory::ItemStack;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSetCreativeModeSlot {
+    pub slot_num: u16,
+    pub item_stack: ItemStack,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_set_jigsaw_block_packet.rs b/azalea-protocol/src/packets/game/s_set_jigsaw_block.rs
similarity index 57%
rename from azalea-protocol/src/packets/game/serverbound_set_jigsaw_block_packet.rs
rename to azalea-protocol/src/packets/game/s_set_jigsaw_block.rs
index 33a823112..1d97d4c75 100755
--- a/azalea-protocol/src/packets/game/serverbound_set_jigsaw_block_packet.rs
+++ b/azalea-protocol/src/packets/game/s_set_jigsaw_block.rs
@@ -1,17 +1,17 @@
 use std::io::Cursor;
 use std::io::Write;
 
-use azalea_buf::McBuf;
-use azalea_buf::McBufReadable;
+use azalea_buf::AzBuf;
+use azalea_buf::AzaleaRead;
 use azalea_core::position::BlockPos;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ServerboundGamePacket;
 
+use crate::packets::AzaleaWrite;
 use crate::packets::BufReadError;
-use crate::packets::McBufWritable;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSetJigsawBlockPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSetJigsawBlock {
     pub pos: BlockPos,
     pub name: ResourceLocation,
     pub target: ResourceLocation,
@@ -29,9 +29,9 @@ pub enum JointType {
     Aligned,
 }
 
-impl McBufReadable for JointType {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let name = String::read_from(buf)?;
+impl AzaleaRead for JointType {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let name = String::azalea_read(buf)?;
         match name.as_str() {
             "rollable" => Ok(JointType::Rollable),
             "aligned" => Ok(JointType::Aligned),
@@ -40,11 +40,11 @@ impl McBufReadable for JointType {
     }
 }
 
-impl McBufWritable for JointType {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for JointType {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
-            JointType::Rollable => "rollable".to_string().write_into(buf)?,
-            JointType::Aligned => "aligned".to_string().write_into(buf)?,
+            JointType::Rollable => "rollable".to_string().azalea_write(buf)?,
+            JointType::Aligned => "aligned".to_string().azalea_write(buf)?,
         };
         Ok(())
     }
diff --git a/azalea-protocol/src/packets/game/serverbound_set_structure_block_packet.rs b/azalea-protocol/src/packets/game/s_set_structure_block.rs
similarity index 69%
rename from azalea-protocol/src/packets/game/serverbound_set_structure_block_packet.rs
rename to azalea-protocol/src/packets/game/s_set_structure_block.rs
index c2872812b..7f05a3a7b 100755
--- a/azalea-protocol/src/packets/game/serverbound_set_structure_block_packet.rs
+++ b/azalea-protocol/src/packets/game/s_set_structure_block.rs
@@ -1,14 +1,14 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::McBuf;
-use azalea_buf::{McBufReadable, McBufWritable};
+use azalea_buf::AzBuf;
+use azalea_buf::{AzaleaRead, AzaleaWrite};
 use azalea_core::{bitset::FixedBitSet, position::BlockPos};
 use azalea_protocol_macros::ServerboundGamePacket;
 
 use crate::packets::BufReadError;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSetStructureBlockPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSetStructureBlock {
     pub pos: BlockPos,
     pub update_type: UpdateType,
     pub mode: StructureMode,
@@ -24,14 +24,14 @@ pub struct ServerboundSetStructureBlockPacket {
     pub flags: Flags,
 }
 
-#[derive(Clone, Debug, McBuf)]
+#[derive(Clone, Debug, AzBuf)]
 pub struct BytePosition {
     pub x: u8,
     pub y: u8,
     pub z: u8,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum UpdateType {
     UpdateData = 0,
     SaveArea = 1,
@@ -39,7 +39,7 @@ pub enum UpdateType {
     ScanArea = 3,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum StructureMode {
     Save = 0,
     Load = 1,
@@ -47,14 +47,14 @@ pub enum StructureMode {
     Data = 3,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Mirror {
     None = 0,
     LeftRight = 1,
     FrontBack = 2,
 }
 
-#[derive(McBuf, Clone, Copy, Debug)]
+#[derive(AzBuf, Clone, Copy, Debug)]
 pub enum Rotation {
     None = 0,
     Clockwise90 = 1,
@@ -69,9 +69,9 @@ pub struct Flags {
     pub show_bounding_box: bool,
 }
 
-impl McBufReadable for Flags {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let set = FixedBitSet::<3>::read_from(buf)?;
+impl AzaleaRead for Flags {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let set = FixedBitSet::<3>::azalea_read(buf)?;
         Ok(Self {
             ignore_entities: set.index(0),
             show_air: set.index(1),
@@ -80,8 +80,8 @@ impl McBufReadable for Flags {
     }
 }
 
-impl McBufWritable for Flags {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for Flags {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let mut set = FixedBitSet::<3>::new();
         if self.ignore_entities {
             set.set(0);
@@ -92,7 +92,7 @@ impl McBufWritable for Flags {
         if self.show_bounding_box {
             set.set(2);
         }
-        set.write_into(buf)?;
+        set.azalea_write(buf)?;
         Ok(())
     }
 }
diff --git a/azalea-protocol/src/packets/game/serverbound_sign_update_packet.rs b/azalea-protocol/src/packets/game/s_sign_update.rs
similarity index 59%
rename from azalea-protocol/src/packets/game/serverbound_sign_update_packet.rs
rename to azalea-protocol/src/packets/game/s_sign_update.rs
index 0547c7838..c43a09785 100755
--- a/azalea-protocol/src/packets/game/serverbound_sign_update_packet.rs
+++ b/azalea-protocol/src/packets/game/s_sign_update.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::position::BlockPos;
 use azalea_protocol_macros::ServerboundGamePacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSignUpdatePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSignUpdate {
     pub pos: BlockPos,
     pub is_front_text: bool,
     pub lines: [String; 4],
diff --git a/azalea-protocol/src/packets/game/s_swing.rs b/azalea-protocol/src/packets/game/s_swing.rs
new file mode 100755
index 000000000..68648ac6c
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_swing.rs
@@ -0,0 +1,9 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+use crate::packets::game::s_interact::InteractionHand;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundSwing {
+    pub hand: InteractionHand,
+}
diff --git a/azalea-protocol/src/packets/game/s_teleport_to_entity.rs b/azalea-protocol/src/packets/game/s_teleport_to_entity.rs
new file mode 100755
index 000000000..e88295300
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_teleport_to_entity.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+use uuid::Uuid;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundTeleportToEntity {
+    pub uuid: Uuid,
+}
diff --git a/azalea-protocol/src/packets/game/s_use_item.rs b/azalea-protocol/src/packets/game/s_use_item.rs
new file mode 100755
index 000000000..ac8ae217a
--- /dev/null
+++ b/azalea-protocol/src/packets/game/s_use_item.rs
@@ -0,0 +1,13 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundGamePacket;
+
+use crate::packets::game::s_interact::InteractionHand;
+
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundUseItem {
+    pub hand: InteractionHand,
+    #[var]
+    pub sequence: u32,
+    pub yaw: f32,
+    pub pitch: f32,
+}
diff --git a/azalea-protocol/src/packets/game/serverbound_use_item_on_packet.rs b/azalea-protocol/src/packets/game/s_use_item_on.rs
similarity index 60%
rename from azalea-protocol/src/packets/game/serverbound_use_item_on_packet.rs
rename to azalea-protocol/src/packets/game/s_use_item_on.rs
index 660483271..0ad23ad2b 100755
--- a/azalea-protocol/src/packets/game/serverbound_use_item_on_packet.rs
+++ b/azalea-protocol/src/packets/game/s_use_item_on.rs
@@ -1,16 +1,16 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable};
+use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError};
 use azalea_core::{
     direction::Direction,
     position::{BlockPos, Vec3},
 };
 use azalea_protocol_macros::ServerboundGamePacket;
 
-use crate::packets::game::serverbound_interact_packet::InteractionHand;
+use crate::packets::game::s_interact::InteractionHand;
 
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundUseItemOnPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
+pub struct ServerboundUseItemOn {
     pub hand: InteractionHand,
     pub block_hit: BlockHit,
     #[var]
@@ -31,35 +31,35 @@ pub struct BlockHit {
     pub inside: bool,
 }
 
-impl McBufWritable for BlockHit {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.block_pos.write_into(buf)?;
-        self.direction.write_into(buf)?;
-        f32::write_into(
+impl AzaleaWrite for BlockHit {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.block_pos.azalea_write(buf)?;
+        self.direction.azalea_write(buf)?;
+        f32::azalea_write(
             &((self.location.x - f64::from(self.block_pos.x)) as f32),
             buf,
         )?;
-        f32::write_into(
+        f32::azalea_write(
             &((self.location.y - f64::from(self.block_pos.y)) as f32),
             buf,
         )?;
-        f32::write_into(
+        f32::azalea_write(
             &((self.location.z - f64::from(self.block_pos.z)) as f32),
             buf,
         )?;
-        self.inside.write_into(buf)?;
+        self.inside.azalea_write(buf)?;
         Ok(())
     }
 }
 
-impl McBufReadable for BlockHit {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let block_pos = BlockPos::read_from(buf)?;
-        let direction = Direction::read_from(buf)?;
-        let cursor_x = f32::read_from(buf)?;
-        let cursor_y = f32::read_from(buf)?;
-        let cursor_z = f32::read_from(buf)?;
-        let inside = bool::read_from(buf)?;
+impl AzaleaRead for BlockHit {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let block_pos = BlockPos::azalea_read(buf)?;
+        let direction = Direction::azalea_read(buf)?;
+        let cursor_x = f32::azalea_read(buf)?;
+        let cursor_y = f32::azalea_read(buf)?;
+        let cursor_z = f32::azalea_read(buf)?;
+        let inside = bool::azalea_read(buf)?;
         Ok(Self {
             block_pos,
             direction,
diff --git a/azalea-protocol/src/packets/game/serverbound_accept_teleportation_packet.rs b/azalea-protocol/src/packets/game/serverbound_accept_teleportation_packet.rs
deleted file mode 100755
index 85311e489..000000000
--- a/azalea-protocol/src/packets/game/serverbound_accept_teleportation_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundAcceptTeleportationPacket {
-    #[var]
-    pub id: u32,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs b/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs
deleted file mode 100644
index d88566472..000000000
--- a/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_core::position::BlockPos;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundBlockEntityTagQueryPacket {
-    #[var]
-    pub transaction_id: u32,
-    pub pos: BlockPos,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_chat_ack_packet.rs b/azalea-protocol/src/packets/game/serverbound_chat_ack_packet.rs
deleted file mode 100755
index eaf285cbe..000000000
--- a/azalea-protocol/src/packets/game/serverbound_chat_ack_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChatAckPacket {
-    #[var]
-    pub messages: u32,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_chat_command_packet.rs b/azalea-protocol/src/packets/game/serverbound_chat_command_packet.rs
deleted file mode 100755
index 23a796d89..000000000
--- a/azalea-protocol/src/packets/game/serverbound_chat_command_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChatCommandPacket {
-    pub command: String,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_chat_preview_packet.rs b/azalea-protocol/src/packets/game/serverbound_chat_preview_packet.rs
deleted file mode 100755
index 50b447288..000000000
--- a/azalea-protocol/src/packets/game/serverbound_chat_preview_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChatPreviewPacket {
-    pub query_id: i32,
-    pub query: String,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_chunk_batch_received_packet.rs b/azalea-protocol/src/packets/game/serverbound_chunk_batch_received_packet.rs
deleted file mode 100644
index 9f18f9673..000000000
--- a/azalea-protocol/src/packets/game/serverbound_chunk_batch_received_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundChunkBatchReceivedPacket {
-    pub desired_chunks_per_tick: f32,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_client_command_packet.rs b/azalea-protocol/src/packets/game/serverbound_client_command_packet.rs
deleted file mode 100755
index 2f360cb94..000000000
--- a/azalea-protocol/src/packets/game/serverbound_client_command_packet.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundClientCommandPacket {
-    pub action: Action,
-}
-
-#[derive(McBuf, Clone, Copy, Debug)]
-pub enum Action {
-    PerformRespawn = 0,
-    RequestStats = 1,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_client_information_packet.rs b/azalea-protocol/src/packets/game/serverbound_client_information_packet.rs
deleted file mode 100755
index 37a101f5d..000000000
--- a/azalea-protocol/src/packets/game/serverbound_client_information_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-use crate::packets::configuration::serverbound_client_information_packet::ClientInformation;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundClientInformationPacket {
-    pub information: ClientInformation,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_client_tick_end_packet.rs b/azalea-protocol/src/packets/game/serverbound_client_tick_end_packet.rs
deleted file mode 100644
index c843066ed..000000000
--- a/azalea-protocol/src/packets/game/serverbound_client_tick_end_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundTickEndPacket {}
diff --git a/azalea-protocol/src/packets/game/serverbound_command_suggestion_packet.rs b/azalea-protocol/src/packets/game/serverbound_command_suggestion_packet.rs
deleted file mode 100755
index 0cca3ceb1..000000000
--- a/azalea-protocol/src/packets/game/serverbound_command_suggestion_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundCommandSuggestionPacket {
-    #[var]
-    pub id: u32,
-    pub command: String,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_configuration_acknowledged_packet.rs b/azalea-protocol/src/packets/game/serverbound_configuration_acknowledged_packet.rs
deleted file mode 100644
index c790972aa..000000000
--- a/azalea-protocol/src/packets/game/serverbound_configuration_acknowledged_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundConfigurationAcknowledgedPacket {}
diff --git a/azalea-protocol/src/packets/game/serverbound_container_button_click_packet.rs b/azalea-protocol/src/packets/game/serverbound_container_button_click_packet.rs
deleted file mode 100755
index 739e73905..000000000
--- a/azalea-protocol/src/packets/game/serverbound_container_button_click_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundContainerButtonClickPacket {
-    pub container_id: u8,
-    pub button_id: u8,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_container_click_packet.rs b/azalea-protocol/src/packets/game/serverbound_container_click_packet.rs
deleted file mode 100755
index e29547205..000000000
--- a/azalea-protocol/src/packets/game/serverbound_container_click_packet.rs
+++ /dev/null
@@ -1,17 +0,0 @@
-use std::collections::HashMap;
-
-use azalea_buf::McBuf;
-use azalea_inventory::{operations::ClickType, ItemSlot};
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundContainerClickPacket {
-    pub container_id: u8,
-    #[var]
-    pub state_id: u32,
-    pub slot_num: i16,
-    pub button_num: u8,
-    pub click_type: ClickType,
-    pub changed_slots: HashMap<u16, ItemSlot>,
-    pub carried_item: ItemSlot,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_container_close_packet.rs b/azalea-protocol/src/packets/game/serverbound_container_close_packet.rs
deleted file mode 100755
index dbaf59f3f..000000000
--- a/azalea-protocol/src/packets/game/serverbound_container_close_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundContainerClosePacket {
-    pub container_id: u8,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs b/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs
deleted file mode 100644
index d40a59a67..000000000
--- a/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundEntityTagQueryPacket {
-    #[var]
-    pub transaction_id: u32,
-    #[var]
-    pub entity_id: u32,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_keep_alive_packet.rs b/azalea-protocol/src/packets/game/serverbound_keep_alive_packet.rs
deleted file mode 100755
index 7485e11ec..000000000
--- a/azalea-protocol/src/packets/game/serverbound_keep_alive_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundKeepAlivePacket {
-    pub id: u64,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_lock_difficulty_packet.rs b/azalea-protocol/src/packets/game/serverbound_lock_difficulty_packet.rs
deleted file mode 100755
index 3c54a16a8..000000000
--- a/azalea-protocol/src/packets/game/serverbound_lock_difficulty_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundLockDifficultyPacket {
-    pub locked: bool,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_move_player_rot_packet.rs b/azalea-protocol/src/packets/game/serverbound_move_player_rot_packet.rs
deleted file mode 100755
index 11a77e734..000000000
--- a/azalea-protocol/src/packets/game/serverbound_move_player_rot_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundMovePlayerRotPacket {
-    pub y_rot: f32,
-    pub x_rot: f32,
-    pub on_ground: bool,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_move_player_status_only_packet.rs b/azalea-protocol/src/packets/game/serverbound_move_player_status_only_packet.rs
deleted file mode 100755
index fc91cacaf..000000000
--- a/azalea-protocol/src/packets/game/serverbound_move_player_status_only_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundMovePlayerStatusOnlyPacket {
-    pub on_ground: bool,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_paddle_boat_packet.rs b/azalea-protocol/src/packets/game/serverbound_paddle_boat_packet.rs
deleted file mode 100755
index 2db9ef2e5..000000000
--- a/azalea-protocol/src/packets/game/serverbound_paddle_boat_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundPaddleBoatPacket {
-    pub left: bool,
-    pub right: bool,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_pick_item_packet.rs b/azalea-protocol/src/packets/game/serverbound_pick_item_packet.rs
deleted file mode 100755
index 508e710b2..000000000
--- a/azalea-protocol/src/packets/game/serverbound_pick_item_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundPickItemPacket {
-    #[var]
-    pub slot: u32,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_ping_request_packet.rs b/azalea-protocol/src/packets/game/serverbound_ping_request_packet.rs
deleted file mode 100755
index 0966e9416..000000000
--- a/azalea-protocol/src/packets/game/serverbound_ping_request_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundPingRequestPacket {
-    pub time: u64,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_player_abilities_packet.rs b/azalea-protocol/src/packets/game/serverbound_player_abilities_packet.rs
deleted file mode 100755
index 900d18247..000000000
--- a/azalea-protocol/src/packets/game/serverbound_player_abilities_packet.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-use std::io::Cursor;
-
-use azalea_buf::{McBufReadable, McBufWritable};
-use azalea_core::bitset::FixedBitSet;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-use crate::packets::BufReadError;
-
-#[derive(Clone, Debug, ServerboundGamePacket)]
-pub struct ServerboundPlayerAbilitiesPacket {
-    pub is_flying: bool,
-}
-
-impl McBufReadable for ServerboundPlayerAbilitiesPacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let set = FixedBitSet::<2>::read_from(buf)?;
-        Ok(Self {
-            is_flying: set.index(1),
-        })
-    }
-}
-
-impl McBufWritable for ServerboundPlayerAbilitiesPacket {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
-        let mut set = FixedBitSet::<2>::new();
-        if self.is_flying {
-            set.set(1);
-        }
-        set.write_into(buf)
-    }
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_pong_packet.rs b/azalea-protocol/src/packets/game/serverbound_pong_packet.rs
deleted file mode 100755
index 17f1ac81e..000000000
--- a/azalea-protocol/src/packets/game/serverbound_pong_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundPongPacket {
-    pub id: u32,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_rename_item_packet.rs b/azalea-protocol/src/packets/game/serverbound_rename_item_packet.rs
deleted file mode 100755
index 8308ac319..000000000
--- a/azalea-protocol/src/packets/game/serverbound_rename_item_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundRenameItemPacket {
-    pub name: String,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_seen_advancements_packet.rs b/azalea-protocol/src/packets/game/serverbound_seen_advancements_packet.rs
deleted file mode 100755
index 54fd4cc9f..000000000
--- a/azalea-protocol/src/packets/game/serverbound_seen_advancements_packet.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-use std::io::Cursor;
-
-use azalea_buf::{McBuf, McBufReadable, McBufWritable};
-use azalea_core::resource_location::ResourceLocation;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-use crate::packets::BufReadError;
-
-#[derive(Clone, Debug, ServerboundGamePacket)]
-pub struct ServerboundSeenAdvancementsPacket {
-    pub action: Action,
-    pub tab: Option<ResourceLocation>,
-}
-
-#[derive(McBuf, Clone, Copy, Debug, Eq, PartialEq)]
-pub enum Action {
-    OpenedTab = 0,
-    ClosedScreen = 1,
-}
-
-impl McBufReadable for ServerboundSeenAdvancementsPacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let action = Action::read_from(buf)?;
-        let tab = if action == Action::OpenedTab {
-            Some(ResourceLocation::read_from(buf)?)
-        } else {
-            None
-        };
-        Ok(Self { action, tab })
-    }
-}
-
-impl McBufWritable for ServerboundSeenAdvancementsPacket {
-    fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
-        self.action.write_into(buf)?;
-        if let Some(tab) = &self.tab {
-            tab.write_into(buf)?;
-        }
-        Ok(())
-    }
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_select_trade_packet.rs b/azalea-protocol/src/packets/game/serverbound_select_trade_packet.rs
deleted file mode 100755
index b13e30d54..000000000
--- a/azalea-protocol/src/packets/game/serverbound_select_trade_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSelectTradePacket {
-    #[var]
-    pub item: u32,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_set_carried_item_packet.rs b/azalea-protocol/src/packets/game/serverbound_set_carried_item_packet.rs
deleted file mode 100755
index 044cdeb03..000000000
--- a/azalea-protocol/src/packets/game/serverbound_set_carried_item_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSetCarriedItemPacket {
-    pub slot: u16,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_set_creative_mode_slot_packet.rs b/azalea-protocol/src/packets/game/serverbound_set_creative_mode_slot_packet.rs
deleted file mode 100755
index 7730bf5af..000000000
--- a/azalea-protocol/src/packets/game/serverbound_set_creative_mode_slot_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_inventory::ItemSlot;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSetCreativeModeSlotPacket {
-    pub slot_num: u16,
-    pub item_stack: ItemSlot,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_swing_packet.rs b/azalea-protocol/src/packets/game/serverbound_swing_packet.rs
deleted file mode 100755
index 53b4a6c18..000000000
--- a/azalea-protocol/src/packets/game/serverbound_swing_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-use crate::packets::game::serverbound_interact_packet::InteractionHand;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundSwingPacket {
-    pub hand: InteractionHand,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_teleport_to_entity_packet.rs b/azalea-protocol/src/packets/game/serverbound_teleport_to_entity_packet.rs
deleted file mode 100755
index a7190ea5a..000000000
--- a/azalea-protocol/src/packets/game/serverbound_teleport_to_entity_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-use uuid::Uuid;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundTeleportToEntityPacket {
-    pub uuid: Uuid,
-}
diff --git a/azalea-protocol/src/packets/game/serverbound_use_item_packet.rs b/azalea-protocol/src/packets/game/serverbound_use_item_packet.rs
deleted file mode 100755
index b9f12f238..000000000
--- a/azalea-protocol/src/packets/game/serverbound_use_item_packet.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundGamePacket;
-
-use crate::packets::game::serverbound_interact_packet::InteractionHand;
-
-#[derive(Clone, Debug, McBuf, ServerboundGamePacket)]
-pub struct ServerboundUseItemPacket {
-    pub hand: InteractionHand,
-    #[var]
-    pub sequence: u32,
-    pub yaw: f32,
-    pub pitch: f32,
-}
diff --git a/azalea-protocol/src/packets/handshake/mod.rs b/azalea-protocol/src/packets/handshake/mod.rs
new file mode 100755
index 000000000..90a312e7e
--- /dev/null
+++ b/azalea-protocol/src/packets/handshake/mod.rs
@@ -0,0 +1,12 @@
+// NOTE: This file is generated automatically by codegen/packet.py.
+// Don't edit it directly!
+
+use azalea_protocol_macros::declare_state_packets;
+
+declare_state_packets!(HandshakePacket,
+    Clientbound => [
+    ],
+    Serverbound => [
+        intention,
+    ]
+);
diff --git a/azalea-protocol/src/packets/handshaking/client_intention_packet.rs b/azalea-protocol/src/packets/handshake/s_intention.rs
similarity index 66%
rename from azalea-protocol/src/packets/handshaking/client_intention_packet.rs
rename to azalea-protocol/src/packets/handshake/s_intention.rs
index c0b694c8a..566ada308 100755
--- a/azalea-protocol/src/packets/handshaking/client_intention_packet.rs
+++ b/azalea-protocol/src/packets/handshake/s_intention.rs
@@ -1,12 +1,12 @@
 use std::hash::Hash;
 
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundHandshakePacket;
 
 use crate::packets::ClientIntention;
 
-#[derive(Hash, Clone, Debug, McBuf, ServerboundHandshakePacket)]
-pub struct ClientIntentionPacket {
+#[derive(Hash, Clone, Debug, AzBuf, ServerboundHandshakePacket)]
+pub struct ServerboundIntention {
     #[var]
     pub protocol_version: i32,
     pub hostname: String,
diff --git a/azalea-protocol/src/packets/handshaking/mod.rs b/azalea-protocol/src/packets/handshaking/mod.rs
deleted file mode 100755
index f2e8810ed..000000000
--- a/azalea-protocol/src/packets/handshaking/mod.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-pub mod client_intention_packet;
-
-use azalea_protocol_macros::declare_state_packets;
-
-declare_state_packets!(
-    HandshakePacket,
-    Serverbound => {
-        0x00: client_intention_packet::ClientIntentionPacket,
-    },
-    Clientbound => {}
-);
diff --git a/azalea-protocol/src/packets/login/c_cookie_request.rs b/azalea-protocol/src/packets/login/c_cookie_request.rs
new file mode 100755
index 000000000..d0bb0cd7f
--- /dev/null
+++ b/azalea-protocol/src/packets/login/c_cookie_request.rs
@@ -0,0 +1,8 @@
+use azalea_buf::AzBuf;
+use azalea_core::resource_location::ResourceLocation;
+use azalea_protocol_macros::ClientboundLoginPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundLoginPacket)]
+pub struct ClientboundCookieRequest {
+    pub key: ResourceLocation,
+}
diff --git a/azalea-protocol/src/packets/login/clientbound_custom_query_packet.rs b/azalea-protocol/src/packets/login/c_custom_query.rs
similarity index 62%
rename from azalea-protocol/src/packets/login/clientbound_custom_query_packet.rs
rename to azalea-protocol/src/packets/login/c_custom_query.rs
index 75993fd9d..80c698e6f 100755
--- a/azalea-protocol/src/packets/login/clientbound_custom_query_packet.rs
+++ b/azalea-protocol/src/packets/login/c_custom_query.rs
@@ -1,11 +1,11 @@
 use std::hash::Hash;
 
-use azalea_buf::{McBuf, UnsizedByteArray};
+use azalea_buf::{AzBuf, UnsizedByteArray};
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ClientboundLoginPacket;
 
-#[derive(Hash, Clone, Debug, McBuf, ClientboundLoginPacket)]
-pub struct ClientboundCustomQueryPacket {
+#[derive(Hash, Clone, Debug, AzBuf, ClientboundLoginPacket)]
+pub struct ClientboundCustomQuery {
     #[var]
     pub transaction_id: u32,
     pub identifier: ResourceLocation,
diff --git a/azalea-protocol/src/packets/login/clientbound_hello_packet.rs b/azalea-protocol/src/packets/login/c_hello.rs
similarity index 50%
rename from azalea-protocol/src/packets/login/clientbound_hello_packet.rs
rename to azalea-protocol/src/packets/login/c_hello.rs
index 9beb499cd..6011ec23d 100755
--- a/azalea-protocol/src/packets/login/clientbound_hello_packet.rs
+++ b/azalea-protocol/src/packets/login/c_hello.rs
@@ -1,10 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundLoginPacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundLoginPacket)]
-pub struct ClientboundHelloPacket {
-    // TODO: make this len thing work
-    // #[len(20)]
+#[derive(Clone, Debug, AzBuf, ClientboundLoginPacket)]
+pub struct ClientboundHello {
+    #[limit(20)]
     pub server_id: String,
     pub public_key: Vec<u8>,
     pub challenge: Vec<u8>,
diff --git a/azalea-protocol/src/packets/login/c_login_compression.rs b/azalea-protocol/src/packets/login/c_login_compression.rs
new file mode 100755
index 000000000..c53e38294
--- /dev/null
+++ b/azalea-protocol/src/packets/login/c_login_compression.rs
@@ -0,0 +1,10 @@
+use std::hash::Hash;
+
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundLoginPacket;
+
+#[derive(Hash, Clone, Debug, ClientboundLoginPacket, AzBuf)]
+pub struct ClientboundLoginCompression {
+    #[var]
+    pub compression_threshold: i32,
+}
diff --git a/azalea-protocol/src/packets/login/clientbound_login_disconnect_packet.rs b/azalea-protocol/src/packets/login/c_login_disconnect.rs
similarity index 51%
rename from azalea-protocol/src/packets/login/clientbound_login_disconnect_packet.rs
rename to azalea-protocol/src/packets/login/c_login_disconnect.rs
index 416ec63b4..a0e50aa43 100755
--- a/azalea-protocol/src/packets/login/clientbound_login_disconnect_packet.rs
+++ b/azalea-protocol/src/packets/login/c_login_disconnect.rs
@@ -1,34 +1,32 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundLoginPacket;
 use serde::{Deserialize, Serialize};
 
 #[derive(Clone, Debug, ClientboundLoginPacket)]
-pub struct ClientboundLoginDisconnectPacket {
+pub struct ClientboundLoginDisconnect {
     pub reason: FormattedText,
 }
 
-impl McBufReadable for ClientboundLoginDisconnectPacket {
-    fn read_from(
-        buf: &mut Cursor<&[u8]>,
-    ) -> Result<ClientboundLoginDisconnectPacket, BufReadError> {
-        let disconnect_string = String::read_from(buf)?;
+impl AzaleaRead for ClientboundLoginDisconnect {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<ClientboundLoginDisconnect, BufReadError> {
+        let disconnect_string = String::azalea_read(buf)?;
         let disconnect_json: serde_json::Value = serde_json::from_str(disconnect_string.as_str())?;
 
-        Ok(ClientboundLoginDisconnectPacket {
+        Ok(ClientboundLoginDisconnect {
             reason: FormattedText::deserialize(disconnect_json)?,
         })
     }
 }
 
-impl McBufWritable for ClientboundLoginDisconnectPacket {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for ClientboundLoginDisconnect {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         let status_string = FormattedText::serialize(&self.reason, serde_json::value::Serializer)
             .unwrap()
             .to_string();
-        status_string.write_into(buf)?;
+        status_string.azalea_write(buf)?;
         Ok(())
     }
 }
diff --git a/azalea-protocol/src/packets/login/clientbound_login_finished_packet.rs b/azalea-protocol/src/packets/login/c_login_finished.rs
similarity index 52%
rename from azalea-protocol/src/packets/login/clientbound_login_finished_packet.rs
rename to azalea-protocol/src/packets/login/c_login_finished.rs
index f885f67ff..482ea53f8 100755
--- a/azalea-protocol/src/packets/login/clientbound_login_finished_packet.rs
+++ b/azalea-protocol/src/packets/login/c_login_finished.rs
@@ -1,8 +1,8 @@
 use azalea_auth::game_profile::GameProfile;
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ClientboundLoginPacket;
 
-#[derive(Clone, Debug, McBuf, ClientboundLoginPacket)]
-pub struct ClientboundLoginFinishedPacket {
+#[derive(Clone, Debug, AzBuf, ClientboundLoginPacket)]
+pub struct ClientboundLoginFinished {
     pub game_profile: GameProfile,
 }
diff --git a/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs
deleted file mode 100755
index 27ea0c09c..000000000
--- a/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_chat::FormattedText;
-use azalea_protocol_macros::ClientboundLoginPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundLoginPacket)]
-pub struct ClientboundCookieRequestPacket {
-    pub key: FormattedText,
-}
diff --git a/azalea-protocol/src/packets/login/clientbound_login_compression_packet.rs b/azalea-protocol/src/packets/login/clientbound_login_compression_packet.rs
deleted file mode 100755
index 4b8fb0c8b..000000000
--- a/azalea-protocol/src/packets/login/clientbound_login_compression_packet.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use std::hash::Hash;
-
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundLoginPacket;
-
-#[derive(Hash, Clone, Debug, ClientboundLoginPacket, McBuf)]
-pub struct ClientboundLoginCompressionPacket {
-    #[var]
-    pub compression_threshold: i32,
-}
diff --git a/azalea-protocol/src/packets/login/mod.rs b/azalea-protocol/src/packets/login/mod.rs
index 3d218cc12..9edf50cf2 100755
--- a/azalea-protocol/src/packets/login/mod.rs
+++ b/azalea-protocol/src/packets/login/mod.rs
@@ -1,32 +1,22 @@
-pub mod clientbound_cookie_request_packet;
-pub mod clientbound_custom_query_packet;
-pub mod clientbound_hello_packet;
-pub mod clientbound_login_compression_packet;
-pub mod clientbound_login_disconnect_packet;
-pub mod clientbound_login_finished_packet;
-pub mod serverbound_cookie_response_packet;
-pub mod serverbound_custom_query_answer_packet;
-pub mod serverbound_hello_packet;
-pub mod serverbound_key_packet;
-pub mod serverbound_login_acknowledged_packet;
+// NOTE: This file is generated automatically by codegen/packet.py.
+// Don't edit it directly!
 
 use azalea_protocol_macros::declare_state_packets;
 
-declare_state_packets!(
-    LoginPacket,
-    Serverbound => {
-        0x00: serverbound_hello_packet::ServerboundHelloPacket,
-        0x01: serverbound_key_packet::ServerboundKeyPacket,
-        0x02: serverbound_custom_query_answer_packet::ServerboundCustomQueryAnswerPacket,
-        0x03: serverbound_login_acknowledged_packet::ServerboundLoginAcknowledgedPacket,
-        0x04: serverbound_cookie_response_packet::ServerboundCookieResponsePacket,
-    },
-    Clientbound => {
-        0x00: clientbound_login_disconnect_packet::ClientboundLoginDisconnectPacket,
-        0x01: clientbound_hello_packet::ClientboundHelloPacket,
-        0x02: clientbound_login_finished_packet::ClientboundLoginFinishedPacket,
-        0x03: clientbound_login_compression_packet::ClientboundLoginCompressionPacket,
-        0x04: clientbound_custom_query_packet::ClientboundCustomQueryPacket,
-        0x05: clientbound_cookie_request_packet::ClientboundCookieRequestPacket,
-    }
+declare_state_packets!(LoginPacket,
+    Clientbound => [
+        login_disconnect,
+        hello,
+        login_finished,
+        login_compression,
+        custom_query,
+        cookie_request,
+    ],
+    Serverbound => [
+        hello,
+        key,
+        custom_query_answer,
+        login_acknowledged,
+        cookie_response,
+    ]
 );
diff --git a/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/login/s_cookie_response.rs
similarity index 58%
rename from azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs
rename to azalea-protocol/src/packets/login/s_cookie_response.rs
index 2074e2e71..5e7576003 100755
--- a/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs
+++ b/azalea-protocol/src/packets/login/s_cookie_response.rs
@@ -1,9 +1,9 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_core::resource_location::ResourceLocation;
 use azalea_protocol_macros::ServerboundLoginPacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundLoginPacket)]
-pub struct ServerboundCookieResponsePacket {
+#[derive(Clone, Debug, AzBuf, ServerboundLoginPacket)]
+pub struct ServerboundCookieResponse {
     pub key: ResourceLocation,
     pub payload: Option<Vec<u8>>,
 }
diff --git a/azalea-protocol/src/packets/login/s_custom_query.rs b/azalea-protocol/src/packets/login/s_custom_query.rs
new file mode 100755
index 000000000..39ecdceff
--- /dev/null
+++ b/azalea-protocol/src/packets/login/s_custom_query.rs
@@ -0,0 +1,9 @@
+use azalea_buf::{AzBuf, UnsizedByteArray};
+use azalea_protocol_macros::ServerboundLoginPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundLoginPacket)]
+pub struct ServerboundCustomQuery {
+    #[var]
+    pub transaction_id: u32,
+    pub data: Option<UnsizedByteArray>,
+}
diff --git a/azalea-protocol/src/packets/login/serverbound_custom_query_answer_packet.rs b/azalea-protocol/src/packets/login/s_custom_query_answer.rs
similarity index 50%
rename from azalea-protocol/src/packets/login/serverbound_custom_query_answer_packet.rs
rename to azalea-protocol/src/packets/login/s_custom_query_answer.rs
index fe9460a24..348202943 100644
--- a/azalea-protocol/src/packets/login/serverbound_custom_query_answer_packet.rs
+++ b/azalea-protocol/src/packets/login/s_custom_query_answer.rs
@@ -1,10 +1,10 @@
 use std::hash::Hash;
 
-use azalea_buf::{McBuf, UnsizedByteArray};
+use azalea_buf::{AzBuf, UnsizedByteArray};
 use azalea_protocol_macros::ServerboundLoginPacket;
 
-#[derive(Hash, Clone, Debug, McBuf, ServerboundLoginPacket)]
-pub struct ServerboundCustomQueryAnswerPacket {
+#[derive(Hash, Clone, Debug, AzBuf, ServerboundLoginPacket)]
+pub struct ServerboundCustomQueryAnswer {
     #[var]
     pub transaction_id: u32,
     pub data: Option<UnsizedByteArray>,
diff --git a/azalea-protocol/src/packets/login/serverbound_hello_packet.rs b/azalea-protocol/src/packets/login/s_hello.rs
similarity index 53%
rename from azalea-protocol/src/packets/login/serverbound_hello_packet.rs
rename to azalea-protocol/src/packets/login/s_hello.rs
index 51ff18306..bae1947ba 100755
--- a/azalea-protocol/src/packets/login/serverbound_hello_packet.rs
+++ b/azalea-protocol/src/packets/login/s_hello.rs
@@ -1,9 +1,10 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundLoginPacket;
 use uuid::Uuid;
 
-#[derive(Clone, Debug, PartialEq, Eq, McBuf, ServerboundLoginPacket)]
-pub struct ServerboundHelloPacket {
+#[derive(Clone, Debug, PartialEq, Eq, AzBuf, ServerboundLoginPacket)]
+pub struct ServerboundHello {
+    #[limit(16)]
     pub name: String,
     pub profile_id: Uuid,
 }
@@ -12,19 +13,19 @@ pub struct ServerboundHelloPacket {
 mod tests {
     use std::io::Cursor;
 
-    use azalea_buf::{McBufReadable, McBufWritable};
+    use azalea_buf::{AzaleaRead, AzaleaWrite};
 
     use super::*;
 
     #[test]
     fn test_read_write() {
-        let packet = ServerboundHelloPacket {
+        let packet = ServerboundHello {
             name: "test".to_string(),
             profile_id: Uuid::nil(),
         };
         let mut buf: Vec<u8> = Vec::new();
-        packet.write_into(&mut buf).unwrap();
-        let packet2 = ServerboundHelloPacket::read_from(&mut Cursor::new(&buf)).unwrap();
+        packet.azalea_write(&mut buf).unwrap();
+        let packet2 = ServerboundHello::azalea_read(&mut Cursor::new(&buf)).unwrap();
         assert_eq!(packet, packet2);
     }
 }
diff --git a/azalea-protocol/src/packets/login/serverbound_key_packet.rs b/azalea-protocol/src/packets/login/s_key.rs
similarity index 51%
rename from azalea-protocol/src/packets/login/serverbound_key_packet.rs
rename to azalea-protocol/src/packets/login/s_key.rs
index dc0abeac3..1b96d4451 100755
--- a/azalea-protocol/src/packets/login/serverbound_key_packet.rs
+++ b/azalea-protocol/src/packets/login/s_key.rs
@@ -1,8 +1,8 @@
-use azalea_buf::McBuf;
+use azalea_buf::AzBuf;
 use azalea_protocol_macros::ServerboundLoginPacket;
 
-#[derive(Clone, Debug, McBuf, ServerboundLoginPacket)]
-pub struct ServerboundKeyPacket {
+#[derive(Clone, Debug, AzBuf, ServerboundLoginPacket)]
+pub struct ServerboundKey {
     pub key_bytes: Vec<u8>,
     pub encrypted_challenge: Vec<u8>,
 }
diff --git a/azalea-protocol/src/packets/login/s_login_acknowledged.rs b/azalea-protocol/src/packets/login/s_login_acknowledged.rs
new file mode 100644
index 000000000..e36648b63
--- /dev/null
+++ b/azalea-protocol/src/packets/login/s_login_acknowledged.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundLoginPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundLoginPacket)]
+pub struct ServerboundLoginAcknowledged {}
diff --git a/azalea-protocol/src/packets/login/serverbound_custom_query_packet.rs b/azalea-protocol/src/packets/login/serverbound_custom_query_packet.rs
deleted file mode 100755
index 1d1885cf6..000000000
--- a/azalea-protocol/src/packets/login/serverbound_custom_query_packet.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use azalea_buf::{McBuf, UnsizedByteArray};
-use azalea_protocol_macros::ServerboundLoginPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundLoginPacket)]
-pub struct ServerboundCustomQueryPacket {
-    #[var]
-    pub transaction_id: u32,
-    pub data: Option<UnsizedByteArray>,
-}
diff --git a/azalea-protocol/src/packets/login/serverbound_login_acknowledged_packet.rs b/azalea-protocol/src/packets/login/serverbound_login_acknowledged_packet.rs
deleted file mode 100644
index c242a494f..000000000
--- a/azalea-protocol/src/packets/login/serverbound_login_acknowledged_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundLoginPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundLoginPacket)]
-pub struct ServerboundLoginAcknowledgedPacket {}
diff --git a/azalea-protocol/src/packets/mod.rs b/azalea-protocol/src/packets/mod.rs
index 1dabe1751..14ae7c71b 100755
--- a/azalea-protocol/src/packets/mod.rs
+++ b/azalea-protocol/src/packets/mod.rs
@@ -1,20 +1,18 @@
 pub mod common;
-pub mod configuration;
+pub mod config;
 pub mod game;
-pub mod handshaking;
+pub mod handshake;
 pub mod login;
 pub mod status;
 
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBufVarReadable, McBufVarWritable, McBufWritable};
+use azalea_buf::{AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 
 use crate::read::ReadPacketError;
 
-// TODO: rename the packet files to just like clientbound_add_entity instead of
-// clientbound_add_entity_packet
-
 pub const PROTOCOL_VERSION: i32 = 768;
+pub const VERSION_NAME: &str = "1.21.3";
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub enum ConnectionProtocol {
@@ -39,7 +37,7 @@ impl ConnectionProtocol {
     }
 }
 
-/// An enum of packets for a certain protocol
+/// An enum of packets for a certain protocol.
 pub trait ProtocolPacket
 where
     Self: Sized,
@@ -52,6 +50,10 @@ where
     fn write(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
 }
 
+pub trait Packet<Protocol> {
+    fn into_variant(self) -> Protocol;
+}
+
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub enum ClientIntention {
     Status = 1,
@@ -81,16 +83,16 @@ impl From<ClientIntention> for ConnectionProtocol {
     }
 }
 
-impl azalea_buf::McBufReadable for ClientIntention {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let id = i32::var_read_from(buf)?;
+impl azalea_buf::AzaleaRead for ClientIntention {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let id = i32::azalea_read_var(buf)?;
         id.try_into()
             .map_err(|_| BufReadError::UnexpectedEnumVariant { id })
     }
 }
 
-impl McBufWritable for ClientIntention {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        (*self as i32).var_write_into(buf)
+impl AzaleaWrite for ClientIntention {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        (*self as i32).azalea_write_var(buf)
     }
 }
diff --git a/azalea-protocol/src/packets/status/c_pong_response.rs b/azalea-protocol/src/packets/status/c_pong_response.rs
new file mode 100755
index 000000000..34a5e73b1
--- /dev/null
+++ b/azalea-protocol/src/packets/status/c_pong_response.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ClientboundStatusPacket;
+
+#[derive(Clone, Debug, AzBuf, ClientboundStatusPacket)]
+pub struct ClientboundPongResponse {
+    pub time: u64,
+}
diff --git a/azalea-protocol/src/packets/status/clientbound_status_response_packet.rs b/azalea-protocol/src/packets/status/c_status_response.rs
similarity index 66%
rename from azalea-protocol/src/packets/status/clientbound_status_response_packet.rs
rename to azalea-protocol/src/packets/status/c_status_response.rs
index 1316894ed..b30c75beb 100755
--- a/azalea-protocol/src/packets/status/clientbound_status_response_packet.rs
+++ b/azalea-protocol/src/packets/status/c_status_response.rs
@@ -1,6 +1,6 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
 use azalea_chat::FormattedText;
 use azalea_protocol_macros::ClientboundStatusPacket;
 use serde::{Deserialize, Serialize};
@@ -28,7 +28,7 @@ pub struct Players {
 
 // the entire packet is just json, which is why it has deserialize
 #[derive(Clone, Debug, Serialize, Deserialize, ClientboundStatusPacket)]
-pub struct ClientboundStatusResponsePacket {
+pub struct ClientboundStatusResponse {
     pub description: FormattedText,
     #[serde(default)]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -41,21 +41,21 @@ pub struct ClientboundStatusResponsePacket {
     pub enforces_secure_chat: Option<bool>,
 }
 
-impl McBufReadable for ClientboundStatusResponsePacket {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<ClientboundStatusResponsePacket, BufReadError> {
-        let status_string = String::read_from(buf)?;
+impl AzaleaRead for ClientboundStatusResponse {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<ClientboundStatusResponse, BufReadError> {
+        let status_string = String::azalea_read(buf)?;
         let status_json: serde_json::Value = serde_json::from_str(status_string.as_str())?;
 
-        Ok(ClientboundStatusResponsePacket::deserialize(status_json)?)
+        Ok(ClientboundStatusResponse::deserialize(status_json)?)
     }
 }
 
-impl McBufWritable for ClientboundStatusResponsePacket {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        let status_string = ClientboundStatusResponsePacket::serialize(self, Serializer)
+impl AzaleaWrite for ClientboundStatusResponse {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        let status_string = ClientboundStatusResponse::serialize(self, Serializer)
             .unwrap()
             .to_string();
-        status_string.write_into(buf)?;
+        status_string.azalea_write(buf)?;
         Ok(())
     }
 }
diff --git a/azalea-protocol/src/packets/status/clientbound_pong_response_packet.rs b/azalea-protocol/src/packets/status/clientbound_pong_response_packet.rs
deleted file mode 100755
index 8c8a7bb13..000000000
--- a/azalea-protocol/src/packets/status/clientbound_pong_response_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ClientboundStatusPacket;
-
-#[derive(Clone, Debug, McBuf, ClientboundStatusPacket)]
-pub struct ClientboundPongResponsePacket {
-    pub time: u64,
-}
diff --git a/azalea-protocol/src/packets/status/mod.rs b/azalea-protocol/src/packets/status/mod.rs
index 3c70c9b10..335600e31 100755
--- a/azalea-protocol/src/packets/status/mod.rs
+++ b/azalea-protocol/src/packets/status/mod.rs
@@ -1,18 +1,15 @@
-pub mod clientbound_pong_response_packet;
-pub mod clientbound_status_response_packet;
-pub mod serverbound_ping_request_packet;
-pub mod serverbound_status_request_packet;
+// NOTE: This file is generated automatically by codegen/packet.py.
+// Don't edit it directly!
 
 use azalea_protocol_macros::declare_state_packets;
 
-declare_state_packets!(
-    StatusPacket,
-    Serverbound => {
-        0x00: serverbound_status_request_packet::ServerboundStatusRequestPacket,
-        0x01: serverbound_ping_request_packet::ServerboundPingRequestPacket,
-    },
-    Clientbound => {
-        0x00: clientbound_status_response_packet::ClientboundStatusResponsePacket,
-        0x01: clientbound_pong_response_packet::ClientboundPongResponsePacket,
-    }
+declare_state_packets!(StatusPacket,
+    Clientbound => [
+        status_response,
+        pong_response,
+    ],
+    Serverbound => [
+        status_request,
+        ping_request,
+    ]
 );
diff --git a/azalea-protocol/src/packets/status/s_ping_request.rs b/azalea-protocol/src/packets/status/s_ping_request.rs
new file mode 100755
index 000000000..34f2e062d
--- /dev/null
+++ b/azalea-protocol/src/packets/status/s_ping_request.rs
@@ -0,0 +1,7 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundStatusPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundStatusPacket)]
+pub struct ServerboundPingRequest {
+    pub time: u64,
+}
diff --git a/azalea-protocol/src/packets/status/s_status_request.rs b/azalea-protocol/src/packets/status/s_status_request.rs
new file mode 100755
index 000000000..662d74bfd
--- /dev/null
+++ b/azalea-protocol/src/packets/status/s_status_request.rs
@@ -0,0 +1,5 @@
+use azalea_buf::AzBuf;
+use azalea_protocol_macros::ServerboundStatusPacket;
+
+#[derive(Clone, Debug, AzBuf, ServerboundStatusPacket)]
+pub struct ServerboundStatusRequest {}
diff --git a/azalea-protocol/src/packets/status/serverbound_ping_request_packet.rs b/azalea-protocol/src/packets/status/serverbound_ping_request_packet.rs
deleted file mode 100755
index c546081c5..000000000
--- a/azalea-protocol/src/packets/status/serverbound_ping_request_packet.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundStatusPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundStatusPacket)]
-pub struct ServerboundPingRequestPacket {
-    pub time: u64,
-}
diff --git a/azalea-protocol/src/packets/status/serverbound_status_request_packet.rs b/azalea-protocol/src/packets/status/serverbound_status_request_packet.rs
deleted file mode 100755
index 27fce3bfe..000000000
--- a/azalea-protocol/src/packets/status/serverbound_status_request_packet.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use azalea_buf::McBuf;
-use azalea_protocol_macros::ServerboundStatusPacket;
-
-#[derive(Clone, Debug, McBuf, ServerboundStatusPacket)]
-pub struct ServerboundStatusRequestPacket {}
diff --git a/azalea-protocol/src/read.rs b/azalea-protocol/src/read.rs
index 67ea9aeee..d75e3bad8 100755
--- a/azalea-protocol/src/read.rs
+++ b/azalea-protocol/src/read.rs
@@ -6,8 +6,8 @@ use std::{
     io::{Cursor, Read},
 };
 
+use azalea_buf::AzaleaReadVar;
 use azalea_buf::BufReadError;
-use azalea_buf::McBufVarReadable;
 use azalea_crypto::Aes128CfbDec;
 use bytes::Buf;
 use bytes::BytesMut;
@@ -86,7 +86,7 @@ fn parse_frame(buffer: &mut BytesMut) -> Result<BytesMut, FrameSplitterError> {
     // the packet is all good we read it fully
     let mut buffer_copy = Cursor::new(&buffer[..]);
     // Packet Length
-    let length = match u32::var_read_from(&mut buffer_copy) {
+    let length = match u32::azalea_read_var(&mut buffer_copy) {
         Ok(length) => length as usize,
         Err(err) => match err {
             BufReadError::Io { source } => return Err(FrameSplitterError::Io { source }),
@@ -134,7 +134,7 @@ pub fn deserialize_packet<P: ProtocolPacket + Debug>(
 ) -> Result<P, Box<ReadPacketError>> {
     // Packet ID
     let packet_id =
-        u32::var_read_from(stream).map_err(|e| ReadPacketError::ReadPacketId { source: e })?;
+        u32::azalea_read_var(stream).map_err(|e| ReadPacketError::ReadPacketId { source: e })?;
     P::read(packet_id, stream)
 }
 
@@ -171,7 +171,7 @@ pub fn compression_decoder(
     compression_threshold: u32,
 ) -> Result<Vec<u8>, DecompressionError> {
     // Data Length
-    let n = u32::var_read_from(stream)?;
+    let n = u32::azalea_read_var(stream)?;
     if n == 0 {
         // no data size, no compression
         let mut buf = vec![];
@@ -351,7 +351,7 @@ where
     }
 
     if log::log_enabled!(log::Level::Trace) {
-        const DO_NOT_CUT_OFF_PACKET_LOGS: bool = false;
+        const DO_NOT_CUT_OFF_PACKET_LOGS: bool = true;
 
         let buf_string: String = {
             if !DO_NOT_CUT_OFF_PACKET_LOGS && buf.len() > 500 {
diff --git a/azalea-protocol/src/write.rs b/azalea-protocol/src/write.rs
index 0ec4308bb..512d08ad7 100755
--- a/azalea-protocol/src/write.rs
+++ b/azalea-protocol/src/write.rs
@@ -1,8 +1,11 @@
 //! Write packets to a stream.
 
-use std::{fmt::Debug, io::Read};
+use std::{
+    fmt::Debug,
+    io::{self, Read},
+};
 
-use azalea_buf::McBufVarWritable;
+use azalea_buf::AzaleaWriteVar;
 use azalea_crypto::Aes128CfbEnc;
 use flate2::{bufread::ZlibEncoder, Compression};
 use thiserror::Error;
@@ -11,31 +14,26 @@ use tracing::trace;
 
 use crate::{packets::ProtocolPacket, read::MAXIMUM_UNCOMPRESSED_LENGTH};
 
-/// Prepend the length of the packet to it.
-fn frame_prepender(mut data: Vec<u8>) -> Result<Vec<u8>, std::io::Error> {
-    let mut buf = Vec::new();
-    (data.len() as u32).var_write_into(&mut buf)?;
-    buf.append(&mut data);
-    Ok(buf)
-}
-
-#[derive(Error, Debug)]
-pub enum PacketEncodeError {
-    #[error("{0}")]
-    Io(#[from] std::io::Error),
-    #[error("Packet too big (is {actual} bytes, should be less than {maximum}): {packet_string}")]
-    TooBig {
-        actual: usize,
-        maximum: usize,
-        packet_string: String,
-    },
+pub async fn write_packet<P, W>(
+    packet: &P,
+    stream: &mut W,
+    compression_threshold: Option<u32>,
+    cipher: &mut Option<Aes128CfbEnc>,
+) -> io::Result<()>
+where
+    P: ProtocolPacket + Debug,
+    W: AsyncWrite + Unpin + Send,
+{
+    trace!("Sending packet: {packet:?}");
+    let raw_packet = serialize_packet(packet).unwrap();
+    write_raw_packet(&raw_packet, stream, compression_threshold, cipher).await
 }
 
 pub fn serialize_packet<P: ProtocolPacket + Debug>(
     packet: &P,
 ) -> Result<Vec<u8>, PacketEncodeError> {
     let mut buf = Vec::new();
-    packet.id().var_write_into(&mut buf)?;
+    packet.id().azalea_write_var(&mut buf)?;
     packet.write(&mut buf)?;
     if buf.len() > MAXIMUM_UNCOMPRESSED_LENGTH as usize {
         return Err(PacketEncodeError::TooBig {
@@ -47,10 +45,26 @@ pub fn serialize_packet<P: ProtocolPacket + Debug>(
     Ok(buf)
 }
 
-#[derive(Error, Debug)]
-pub enum PacketCompressError {
-    #[error("{0}")]
-    Io(#[from] std::io::Error),
+pub async fn write_raw_packet<W>(
+    raw_packet: &[u8],
+    stream: &mut W,
+    compression_threshold: Option<u32>,
+    cipher: &mut Option<Aes128CfbEnc>,
+) -> io::Result<()>
+where
+    W: AsyncWrite + Unpin + Send,
+{
+    trace!("Writing raw packet: {raw_packet:?}");
+    let mut raw_packet = raw_packet.to_vec();
+    if let Some(threshold) = compression_threshold {
+        raw_packet = compression_encoder(&raw_packet, threshold).unwrap();
+    }
+    raw_packet = frame_prepender(raw_packet).unwrap();
+    // if we were given a cipher, encrypt the packet
+    if let Some(cipher) = cipher {
+        azalea_crypto::encrypt_packet(cipher, &mut raw_packet);
+    }
+    stream.write_all(&raw_packet).await
 }
 
 pub fn compression_encoder(
@@ -61,58 +75,48 @@ pub fn compression_encoder(
     // if it's less than the compression threshold, don't compress
     if n < compression_threshold as usize {
         let mut buf = Vec::new();
-        0.var_write_into(&mut buf)?;
-        std::io::Write::write_all(&mut buf, data)?;
+        0_u32.azalea_write_var(&mut buf)?;
+        io::Write::write_all(&mut buf, data)?;
         Ok(buf)
     } else {
         // otherwise, compress
         let mut deflater = ZlibEncoder::new(data, Compression::default());
+
         // write deflated data to buf
         let mut compressed_data = Vec::new();
         deflater.read_to_end(&mut compressed_data)?;
 
         // prepend the length
         let mut len_prepended_compressed_data = Vec::new();
-        (data.len() as u32).var_write_into(&mut len_prepended_compressed_data)?;
+        (data.len() as u32).azalea_write_var(&mut len_prepended_compressed_data)?;
         len_prepended_compressed_data.append(&mut compressed_data);
 
         Ok(len_prepended_compressed_data)
     }
 }
 
-pub async fn write_packet<P, W>(
-    packet: &P,
-    stream: &mut W,
-    compression_threshold: Option<u32>,
-    cipher: &mut Option<Aes128CfbEnc>,
-) -> std::io::Result<()>
-where
-    P: ProtocolPacket + Debug,
-    W: AsyncWrite + Unpin + Send,
-{
-    trace!("Sending packet: {packet:?}");
-    let raw_packet = serialize_packet(packet).unwrap();
-    write_raw_packet(&raw_packet, stream, compression_threshold, cipher).await
+/// Prepend the length of the packet to it.
+fn frame_prepender(mut data: Vec<u8>) -> Result<Vec<u8>, io::Error> {
+    let mut buf = Vec::new();
+    (data.len() as u32).azalea_write_var(&mut buf)?;
+    buf.append(&mut data);
+    Ok(buf)
 }
 
-pub async fn write_raw_packet<W>(
-    raw_packet: &[u8],
-    stream: &mut W,
-    compression_threshold: Option<u32>,
-    cipher: &mut Option<Aes128CfbEnc>,
-) -> std::io::Result<()>
-where
-    W: AsyncWrite + Unpin + Send,
-{
-    trace!("Writing raw packet: {raw_packet:?}");
-    let mut raw_packet = raw_packet.to_vec();
-    if let Some(threshold) = compression_threshold {
-        raw_packet = compression_encoder(&raw_packet, threshold).unwrap();
-    }
-    raw_packet = frame_prepender(raw_packet).unwrap();
-    // if we were given a cipher, encrypt the packet
-    if let Some(cipher) = cipher {
-        azalea_crypto::encrypt_packet(cipher, &mut raw_packet);
-    }
-    stream.write_all(&raw_packet).await
+#[derive(Error, Debug)]
+pub enum PacketEncodeError {
+    #[error("{0}")]
+    Io(#[from] io::Error),
+    #[error("Packet too big (is {actual} bytes, should be less than {maximum}): {packet_string}")]
+    TooBig {
+        actual: usize,
+        maximum: usize,
+        packet_string: String,
+    },
+}
+
+#[derive(Error, Debug)]
+pub enum PacketCompressError {
+    #[error("{0}")]
+    Io(#[from] io::Error),
 }
diff --git a/azalea-registry/Cargo.toml b/azalea-registry/Cargo.toml
index 0ded23c43..1afc14d07 100644
--- a/azalea-registry/Cargo.toml
+++ b/azalea-registry/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-registry"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-registry"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-registry/azalea-registry-macros/Cargo.toml b/azalea-registry/azalea-registry-macros/Cargo.toml
index ad088b421..147a21adf 100644
--- a/azalea-registry/azalea-registry-macros/Cargo.toml
+++ b/azalea-registry/azalea-registry-macros/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-registry-macros"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-registry/azalea-registry-macros"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 [lib]
 proc-macro = true
diff --git a/azalea-registry/azalea-registry-macros/src/lib.rs b/azalea-registry/azalea-registry-macros/src/lib.rs
index 50a9f1991..2b148fd2b 100755
--- a/azalea-registry/azalea-registry-macros/src/lib.rs
+++ b/azalea-registry/azalea-registry-macros/src/lib.rs
@@ -75,7 +75,7 @@ pub fn registry(input: TokenStream) -> TokenStream {
     let attributes = input.attributes;
     generated.extend(quote! {
         #(#attributes)*
-        #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, azalea_buf::McBuf, simdnbt::ToNbtTag, simdnbt::FromNbtTag)]
+        #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, azalea_buf::AzBuf, simdnbt::ToNbtTag, simdnbt::FromNbtTag)]
         #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
         #[repr(u32)]
         pub enum #name {
diff --git a/azalea-registry/src/extra.rs b/azalea-registry/src/extra.rs
index d5816e3b7..4b7e89a45 100644
--- a/azalea-registry/src/extra.rs
+++ b/azalea-registry/src/extra.rs
@@ -97,3 +97,37 @@ enum JukeboxSong {
     CreatorMusicBox => "creator_music_box",
 }
 }
+
+registry! {
+enum ChatType {
+    Chat => "chat",
+    SayCommand => "say_command",
+    MsgCommandIncoming => "msg_command_incoming",
+    MsgCommandOutgoing => "msg_command_outgoing",
+    TeamMsgCommandIncoming => "team_msg_command_incoming",
+    TeamMsgCommandOutgoing => "team_msg_command_outgoing",
+    EmoteCommand => "emote_command",
+}
+}
+impl ChatType {
+    #[must_use]
+    pub fn chat_translation_key(self) -> &'static str {
+        match self {
+            ChatType::Chat => "chat.type.text",
+            ChatType::SayCommand => "chat.type.announcement",
+            ChatType::MsgCommandIncoming => "commands.message.display.incoming",
+            ChatType::MsgCommandOutgoing => "commands.message.display.outgoing",
+            ChatType::TeamMsgCommandIncoming => "chat.type.team.text",
+            ChatType::TeamMsgCommandOutgoing => "chat.type.team.sent",
+            ChatType::EmoteCommand => "chat.type.emote",
+        }
+    }
+
+    #[must_use]
+    pub fn narrator_translation_key(self) -> &'static str {
+        match self {
+            ChatType::EmoteCommand => "chat.type.emote",
+            _ => "chat.type.text.narrate",
+        }
+    }
+}
diff --git a/azalea-registry/src/lib.rs b/azalea-registry/src/lib.rs
index e4287b1c1..e1fb2be5c 100755
--- a/azalea-registry/src/lib.rs
+++ b/azalea-registry/src/lib.rs
@@ -11,11 +11,11 @@ pub mod tags;
 use std::fmt::{self, Debug};
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_registry_macros::registry;
 pub use extra::*;
 
-pub trait Registry: McBufReadable + McBufWritable
+pub trait Registry: AzaleaRead + AzaleaWrite
 where
     Self: Sized,
 {
@@ -26,11 +26,11 @@ where
 /// A registry that might not be present. This is transmitted as a single
 /// varint in the protocol.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
-pub struct OptionalRegistry<T: Registry>(Option<T>);
+pub struct OptionalRegistry<T: Registry>(pub Option<T>);
 
-impl<T: Registry> McBufReadable for OptionalRegistry<T> {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        Ok(OptionalRegistry(match u32::var_read_from(buf)? {
+impl<T: Registry> AzaleaRead for OptionalRegistry<T> {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        Ok(OptionalRegistry(match u32::azalea_read_var(buf)? {
             0 => None,
             value => Some(
                 T::from_u32(value - 1)
@@ -39,49 +39,49 @@ impl<T: Registry> McBufReadable for OptionalRegistry<T> {
         }))
     }
 }
-impl<T: Registry> McBufWritable for OptionalRegistry<T> {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl<T: Registry> AzaleaWrite for OptionalRegistry<T> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match &self.0 {
-            None => 0u32.var_write_into(buf),
-            Some(value) => (value.to_u32() + 1).var_write_into(buf),
+            None => 0u32.azalea_write_var(buf),
+            Some(value) => (value.to_u32() + 1).azalea_write_var(buf),
         }
     }
 }
 
 /// A registry that will either take an ID or a resource location.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
-pub enum CustomRegistry<D: Registry, C: McBufReadable + McBufWritable> {
+pub enum CustomRegistry<D: Registry, C: AzaleaRead + AzaleaWrite> {
     Direct(D),
     Custom(C),
 }
 
-impl<D: Registry, C: McBufReadable + McBufWritable> McBufReadable for CustomRegistry<D, C> {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let direct_registry = OptionalRegistry::<D>::read_from(buf)?;
+impl<D: Registry, C: AzaleaRead + AzaleaWrite> AzaleaRead for CustomRegistry<D, C> {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let direct_registry = OptionalRegistry::<D>::azalea_read(buf)?;
         if let Some(direct_registry) = direct_registry.0 {
             return Ok(CustomRegistry::Direct(direct_registry));
         }
-        Ok(CustomRegistry::Custom(C::read_from(buf)?))
+        Ok(CustomRegistry::Custom(C::azalea_read(buf)?))
     }
 }
-impl<D: Registry, C: McBufReadable + McBufWritable> McBufWritable for CustomRegistry<D, C> {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl<D: Registry, C: AzaleaRead + AzaleaWrite> AzaleaWrite for CustomRegistry<D, C> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
             CustomRegistry::Direct(direct_registry) => {
                 // write the id + 1
-                (direct_registry.to_u32() + 1).var_write_into(buf)
+                (direct_registry.to_u32() + 1).azalea_write_var(buf)
             }
             CustomRegistry::Custom(custom_registry) => {
                 // write 0, then the custom registry
-                0u32.var_write_into(buf)?;
-                custom_registry.write_into(buf)
+                0u32.azalea_write_var(buf)?;
+                custom_registry.azalea_write(buf)
             }
         }
     }
 }
 
 #[derive(Clone, PartialEq)]
-pub enum HolderSet<D: Registry, ResourceLocation: McBufReadable + McBufWritable> {
+pub enum HolderSet<D: Registry, ResourceLocation: AzaleaRead + AzaleaWrite> {
     Direct {
         contents: Vec<D>,
     },
@@ -91,13 +91,13 @@ pub enum HolderSet<D: Registry, ResourceLocation: McBufReadable + McBufWritable>
     },
 }
 
-impl<D: Registry, ResourceLocation: McBufReadable + McBufWritable> McBufReadable
+impl<D: Registry, ResourceLocation: AzaleaRead + AzaleaWrite> AzaleaRead
     for HolderSet<D, ResourceLocation>
 {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let size = i32::var_read_from(buf)? - 1;
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let size = i32::azalea_read_var(buf)? - 1;
         if size == -1 {
-            let key = ResourceLocation::read_from(buf)?;
+            let key = ResourceLocation::azalea_read(buf)?;
             Ok(Self::Named {
                 key,
                 contents: Vec::new(),
@@ -105,32 +105,32 @@ impl<D: Registry, ResourceLocation: McBufReadable + McBufWritable> McBufReadable
         } else {
             let mut contents = Vec::new();
             for _ in 0..size {
-                contents.push(D::read_from(buf)?);
+                contents.push(D::azalea_read(buf)?);
             }
             Ok(Self::Direct { contents })
         }
     }
 }
-impl<D: Registry, ResourceLocation: McBufReadable + McBufWritable> McBufWritable
+impl<D: Registry, ResourceLocation: AzaleaRead + AzaleaWrite> AzaleaWrite
     for HolderSet<D, ResourceLocation>
 {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
             Self::Direct { contents } => {
-                (contents.len() as i32 + 1).var_write_into(buf)?;
+                (contents.len() as i32 + 1).azalea_write_var(buf)?;
                 for item in contents {
-                    item.write_into(buf)?;
+                    item.azalea_write(buf)?;
                 }
             }
             Self::Named { key, .. } => {
-                0i32.var_write_into(buf)?;
-                key.write_into(buf)?;
+                0i32.azalea_write_var(buf)?;
+                key.azalea_write(buf)?;
             }
         }
         Ok(())
     }
 }
-impl<D: Registry + Debug, ResourceLocation: McBufReadable + McBufWritable + Debug> Debug
+impl<D: Registry + Debug, ResourceLocation: AzaleaRead + AzaleaWrite + Debug> Debug
     for HolderSet<D, ResourceLocation>
 {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
diff --git a/azalea-world/Cargo.toml b/azalea-world/Cargo.toml
index c7b4680bc..37bcd5a59 100644
--- a/azalea-world/Cargo.toml
+++ b/azalea-world/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea-world"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-world"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/azalea-world/src/chunk_storage.rs b/azalea-world/src/chunk_storage.rs
index 1709a903f..7eb10471f 100755
--- a/azalea-world/src/chunk_storage.rs
+++ b/azalea-world/src/chunk_storage.rs
@@ -8,7 +8,7 @@ use std::{
 };
 
 use azalea_block::BlockState;
-use azalea_buf::{BufReadError, McBufReadable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
 use azalea_core::position::{BlockPos, ChunkBlockPos, ChunkPos, ChunkSectionBlockPos};
 use nohash_hasher::IntMap;
 use parking_lot::RwLock;
@@ -332,7 +332,7 @@ impl Chunk {
         let section_count = dimension_height / SECTION_HEIGHT;
         let mut sections = Vec::with_capacity(section_count as usize);
         for _ in 0..section_count {
-            let section = Section::read_from(buf)?;
+            let section = Section::azalea_read(buf)?;
             sections.push(section);
         }
 
@@ -416,10 +416,10 @@ pub fn get_block_state_from_sections(
     Some(section.get(chunk_section_pos))
 }
 
-impl McBufWritable for Chunk {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for Chunk {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         for section in &self.sections {
-            section.write_into(buf)?;
+            section.azalea_write(buf)?;
         }
         Ok(())
     }
@@ -437,9 +437,9 @@ impl Debug for PartialChunkStorage {
     }
 }
 
-impl McBufReadable for Section {
-    fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
-        let block_count = u16::read_from(buf)?;
+impl AzaleaRead for Section {
+    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+        let block_count = u16::azalea_read(buf)?;
 
         // this is commented out because the vanilla server is wrong
         // assert!(
@@ -467,11 +467,11 @@ impl McBufReadable for Section {
     }
 }
 
-impl McBufWritable for Section {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.block_count.write_into(buf)?;
-        self.states.write_into(buf)?;
-        self.biomes.write_into(buf)?;
+impl AzaleaWrite for Section {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.block_count.azalea_write(buf)?;
+        self.states.azalea_write(buf)?;
+        self.biomes.azalea_write(buf)?;
         Ok(())
     }
 }
diff --git a/azalea-world/src/palette.rs b/azalea-world/src/palette.rs
index 27e017c40..24dbe47a6 100755
--- a/azalea-world/src/palette.rs
+++ b/azalea-world/src/palette.rs
@@ -1,6 +1,6 @@
 use std::io::{Cursor, Write};
 
-use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
+use azalea_buf::{AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
 use azalea_core::math;
 use tracing::warn;
 
@@ -44,11 +44,11 @@ impl PalettedContainer {
         buf: &mut Cursor<&[u8]>,
         container_type: &'static PalettedContainerKind,
     ) -> Result<Self, BufReadError> {
-        let server_bits_per_entry = u8::read_from(buf)?;
+        let server_bits_per_entry = u8::azalea_read(buf)?;
         let palette_type = PaletteKind::from_bits_and_type(server_bits_per_entry, container_type);
         let palette = palette_type.read(buf)?;
         let size = container_type.size();
-        let data = Vec::<u64>::read_from(buf)?;
+        let data = Vec::<u64>::azalea_read(buf)?;
 
         // we can only trust the bits per entry that we're sent if there's enough data
         // that it'd be global. if it's not global, then we have to calculate it
@@ -224,11 +224,11 @@ impl PalettedContainer {
     }
 }
 
-impl McBufWritable for PalettedContainer {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
-        self.bits_per_entry.write_into(buf)?;
-        self.palette.write_into(buf)?;
-        self.storage.data.write_into(buf)?;
+impl AzaleaWrite for PalettedContainer {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+        self.bits_per_entry.azalea_write(buf)?;
+        self.palette.azalea_write(buf)?;
+        self.storage.data.azalea_write(buf)?;
         Ok(())
     }
 }
@@ -264,17 +264,17 @@ impl Palette {
     }
 }
 
-impl McBufWritable for Palette {
-    fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl AzaleaWrite for Palette {
+    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
         match self {
             Palette::SingleValue(value) => {
-                value.var_write_into(buf)?;
+                value.azalea_write_var(buf)?;
             }
             Palette::Linear(values) => {
-                values.var_write_into(buf)?;
+                values.azalea_write_var(buf)?;
             }
             Palette::Hashmap(values) => {
-                values.var_write_into(buf)?;
+                values.azalea_write_var(buf)?;
             }
             Palette::Global => {}
         }
@@ -301,9 +301,9 @@ impl PaletteKind {
 
     pub fn read(&self, buf: &mut Cursor<&[u8]>) -> Result<Palette, BufReadError> {
         Ok(match self {
-            PaletteKind::SingleValue => Palette::SingleValue(u32::var_read_from(buf)?),
-            PaletteKind::Linear => Palette::Linear(Vec::<u32>::var_read_from(buf)?),
-            PaletteKind::Hashmap => Palette::Hashmap(Vec::<u32>::var_read_from(buf)?),
+            PaletteKind::SingleValue => Palette::SingleValue(u32::azalea_read_var(buf)?),
+            PaletteKind::Linear => Palette::Linear(Vec::<u32>::azalea_read_var(buf)?),
+            PaletteKind::Hashmap => Palette::Hashmap(Vec::<u32>::azalea_read_var(buf)?),
             PaletteKind::Global => Palette::Global,
         })
     }
diff --git a/azalea/Cargo.toml b/azalea/Cargo.toml
index 2e2dd3452..c0953f540 100644
--- a/azalea/Cargo.toml
+++ b/azalea/Cargo.toml
@@ -4,7 +4,7 @@ edition = "2021"
 license = "MIT"
 name = "azalea"
 repository = "https://github.com/azalea-rs/azalea/tree/main/azalea"
-version = "0.10.3+mc1.21.1"
+version = "0.10.3+mc1.21.3"
 
 [package.metadata.release]
 pre-release-replacements = [
diff --git a/azalea/examples/steal.rs b/azalea/examples/steal.rs
index b0586f19c..f64fb8f38 100644
--- a/azalea/examples/steal.rs
+++ b/azalea/examples/steal.rs
@@ -4,7 +4,7 @@ use std::sync::Arc;
 
 use azalea::{prelude::*, BlockPos};
 use azalea_inventory::operations::QuickMoveClick;
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use parking_lot::Mutex;
 
 #[tokio::main]
@@ -59,7 +59,7 @@ async fn handle(mut bot: Client, event: Event, state: State) -> anyhow::Result<(
             .enumerate()
         {
             println!("Checking slot {index}: {slot:?}");
-            if let ItemSlot::Present(item) = slot {
+            if let ItemStack::Present(item) = slot {
                 if item.kind == azalea::registry::Item::Diamond {
                     println!("clicking slot ^");
                     chest.click(QuickMoveClick::Left { slot: index as u16 });
diff --git a/azalea/src/accept_resource_packs.rs b/azalea/src/accept_resource_packs.rs
index c9765c77e..f62d5ec0e 100644
--- a/azalea/src/accept_resource_packs.rs
+++ b/azalea/src/accept_resource_packs.rs
@@ -3,9 +3,7 @@ use azalea_client::inventory::InventorySet;
 use azalea_client::packet_handling::game::SendPacketEvent;
 use azalea_client::packet_handling::{death_event_on_0_health, game::ResourcePackEvent};
 use azalea_client::respawn::perform_respawn;
-use azalea_protocol::packets::game::serverbound_resource_pack_packet::{
-    self, ServerboundResourcePackPacket,
-};
+use azalea_protocol::packets::game::s_resource_pack::{self, ServerboundResourcePack};
 use bevy_app::Update;
 use bevy_ecs::prelude::*;
 
@@ -32,21 +30,19 @@ fn accept_resource_pack(
     mut send_packet_events: EventWriter<SendPacketEvent>,
 ) {
     for event in events.read() {
-        send_packet_events.send(SendPacketEvent {
-            entity: event.entity,
-            packet: ServerboundResourcePackPacket {
+        send_packet_events.send(SendPacketEvent::new(
+            event.entity,
+            ServerboundResourcePack {
                 id: event.id,
-                action: serverbound_resource_pack_packet::Action::Accepted,
-            }
-            .get(),
-        });
-        send_packet_events.send(SendPacketEvent {
-            entity: event.entity,
-            packet: ServerboundResourcePackPacket {
+                action: s_resource_pack::Action::Accepted,
+            },
+        ));
+        send_packet_events.send(SendPacketEvent::new(
+            event.entity,
+            ServerboundResourcePack {
                 id: event.id,
-                action: serverbound_resource_pack_packet::Action::SuccessfullyLoaded,
-            }
-            .get(),
-        });
+                action: s_resource_pack::Action::SuccessfullyLoaded,
+            },
+        ));
     }
 }
diff --git a/azalea/src/auto_tool.rs b/azalea/src/auto_tool.rs
index e5a627ba0..441f97917 100644
--- a/azalea/src/auto_tool.rs
+++ b/azalea/src/auto_tool.rs
@@ -1,7 +1,7 @@
 use azalea_block::{Block, BlockState};
 use azalea_client::{inventory::Inventory, Client};
 use azalea_entity::{FluidOnEyes, Physics};
-use azalea_inventory::{ItemSlot, Menu};
+use azalea_inventory::{ItemStack, Menu};
 use azalea_registry::{DataComponentKind, Fluid};
 
 #[derive(Debug)]
@@ -80,7 +80,7 @@ pub fn accurate_best_tool_in_hotbar_for_block(
     for (i, item_slot) in hotbar_slots.iter().enumerate() {
         let this_item_speed;
         match item_slot {
-            ItemSlot::Empty => {
+            ItemStack::Empty => {
                 this_item_speed = Some(azalea_entity::mining::get_mine_progress(
                     block.as_ref(),
                     azalea_registry::Item::Air,
@@ -89,7 +89,7 @@ pub fn accurate_best_tool_in_hotbar_for_block(
                     physics,
                 ));
             }
-            ItemSlot::Present(item_slot) => {
+            ItemStack::Present(item_slot) => {
                 // lazy way to avoid checking durability since azalea doesn't have durability
                 // data yet
                 if item_slot
@@ -119,7 +119,7 @@ pub fn accurate_best_tool_in_hotbar_for_block(
 
     // now check every item
     for (i, item_slot) in hotbar_slots.iter().enumerate() {
-        if let ItemSlot::Present(item_slot) = item_slot {
+        if let ItemStack::Present(item_slot) = item_slot {
             let this_item_speed = azalea_entity::mining::get_mine_progress(
                 block.as_ref(),
                 item_slot.kind,
diff --git a/azalea/src/container.rs b/azalea/src/container.rs
index 980210aea..df020dbec 100644
--- a/azalea/src/container.rs
+++ b/azalea/src/container.rs
@@ -7,7 +7,7 @@ use azalea_client::{
     Client,
 };
 use azalea_core::position::BlockPos;
-use azalea_inventory::{operations::ClickOperation, ItemSlot, Menu};
+use azalea_inventory::{operations::ClickOperation, ItemStack, Menu};
 use azalea_protocol::packets::game::ClientboundGamePacket;
 use bevy_app::{App, Plugin, Update};
 use bevy_ecs::{component::Component, prelude::EventReader, system::Commands};
@@ -168,7 +168,7 @@ impl ContainerHandleRef {
 
     /// Returns the item slots in the container, not including the player's
     /// inventory. If the container is closed, this will return `None`.
-    pub fn contents(&self) -> Option<Vec<ItemSlot>> {
+    pub fn contents(&self) -> Option<Vec<ItemStack>> {
         self.menu().map(|menu| menu.contents())
     }
 
@@ -222,7 +222,7 @@ impl ContainerHandle {
 
     /// Returns the item slots in the container, not including the player's
     /// inventory. If the container is closed, this will return `None`.
-    pub fn contents(&self) -> Option<Vec<ItemSlot>> {
+    pub fn contents(&self) -> Option<Vec<ItemStack>> {
         self.0.contents()
     }
 
diff --git a/azalea/src/pathfinder/debug.rs b/azalea/src/pathfinder/debug.rs
index a5e51cdf9..ca08cbc51 100644
--- a/azalea/src/pathfinder/debug.rs
+++ b/azalea/src/pathfinder/debug.rs
@@ -60,7 +60,7 @@ pub fn debug_render_path_with_particles(
             let start_vec3 = start.center();
             let end_vec3 = end.center();
 
-            let step_count = (start_vec3.distance_to_sqr(&end_vec3).sqrt() * 4.0) as usize;
+            let step_count = (start_vec3.distance_squared_to(&end_vec3).sqrt() * 4.0) as usize;
 
             let target_block_state = chunks.get_block_state(&movement.target).unwrap_or_default();
             let above_target_block_state = chunks
diff --git a/azalea/src/pathfinder/goals.rs b/azalea/src/pathfinder/goals.rs
index 7e33f7d80..531e40368 100644
--- a/azalea/src/pathfinder/goals.rs
+++ b/azalea/src/pathfinder/goals.rs
@@ -200,7 +200,7 @@ impl Goal for ReachBlockPosGoal {
         let max_pick_range = 6;
         let actual_pick_range = 4.5;
 
-        let distance = (self.pos - n).length_sqr();
+        let distance = (self.pos - n).length_squared();
         if distance > max_pick_range * max_pick_range {
             return false;
         }
diff --git a/azalea/src/pathfinder/mod.rs b/azalea/src/pathfinder/mod.rs
index 611ad5c50..88ae5da02 100644
--- a/azalea/src/pathfinder/mod.rs
+++ b/azalea/src/pathfinder/mod.rs
@@ -453,7 +453,7 @@ pub fn timeout_movement(
         // don't timeout if we're mining
         if let Some(mining) = mining {
             // also make sure we're close enough to the block that's being mined
-            if mining.pos.distance_to_sqr(&BlockPos::from(position)) < 6_i32.pow(2) {
+            if mining.pos.distance_squared_to(&BlockPos::from(position)) < 6_i32.pow(2) {
                 // also reset the last_node_reached_at so we don't timeout after we finish
                 // mining
                 executing_path.last_node_reached_at = Instant::now();
diff --git a/azalea/src/pathfinder/moves/basic.rs b/azalea/src/pathfinder/moves/basic.rs
index bb931caf9..89ba9acc6 100644
--- a/azalea/src/pathfinder/moves/basic.rs
+++ b/azalea/src/pathfinder/moves/basic.rs
@@ -228,9 +228,10 @@ fn execute_descend_move(mut ctx: ExecuteCtx) {
     let start_center = start.center();
     let center = target.center();
 
-    let horizontal_distance_from_target = (center - position).horizontal_distance_sqr().sqrt();
-    let horizontal_distance_from_start =
-        (start.center() - position).horizontal_distance_sqr().sqrt();
+    let horizontal_distance_from_target = (center - position).horizontal_distance_squared().sqrt();
+    let horizontal_distance_from_start = (start.center() - position)
+        .horizontal_distance_squared()
+        .sqrt();
 
     let dest_ahead = Vec3::new(
         start_center.x + (center.x - start_center.x) * 1.5,
@@ -401,8 +402,9 @@ fn execute_downward_move(mut ctx: ExecuteCtx) {
 
     let target_center = target.center();
 
-    let horizontal_distance_from_target =
-        (target_center - position).horizontal_distance_sqr().sqrt();
+    let horizontal_distance_from_target = (target_center - position)
+        .horizontal_distance_squared()
+        .sqrt();
 
     if horizontal_distance_from_target > 0.25 {
         ctx.look_at(target_center);
diff --git a/azalea/src/pathfinder/moves/mod.rs b/azalea/src/pathfinder/moves/mod.rs
index 289741322..1a435b5fe 100644
--- a/azalea/src/pathfinder/moves/mod.rs
+++ b/azalea/src/pathfinder/moves/mod.rs
@@ -157,7 +157,7 @@ impl ExecuteCtx<'_, '_, '_, '_, '_, '_, '_> {
     /// of the current node first.
     pub fn mine_while_at_start(&mut self, block: BlockPos) -> bool {
         let horizontal_distance_from_start = (self.start.center() - self.position)
-            .horizontal_distance_sqr()
+            .horizontal_distance_squared()
             .sqrt();
         let at_start_position =
             BlockPos::from(self.position) == self.start && horizontal_distance_from_start < 0.25;
diff --git a/codegen/README.md b/codegen/README.md
index 60b881ced..341a432d0 100755
--- a/codegen/README.md
+++ b/codegen/README.md
@@ -4,9 +4,9 @@ The directory name doesn't start with `azalea-` because it's not a Rust crate.
 
 ## Requirements
 
-- Python 3.8+
-- Java 17+
-- Maven
+-   Python 3.8+
+-   Java 17+
+-   Maven
 
 ## Usage
 
@@ -17,19 +17,20 @@ This will create a new file in the `azalea-protocol/src/packets/[state] director
 ## Updating to a new Minecraft version
 
 First, run `python migrate.py [new version]`. This will run a script that automatically updates as much as it can, including:
-- Adding, removing, and updating packets in azalea-protocol (limited)
-- Updating supported version in README.md
-- Updating the `PROTOCOL_VERSION` variable in azalea-protocol
-- Generating blocks in azalea-block
-- Generating block shapes in azalea-physics
-- Generating registries in azalea-registries
-- Updating en_us.json in azalea-language
-- Generating entity metadata structs and parsers in azalea-world
+
+-   Adding, removing, and updating packets in azalea-protocol (limited)
+-   Updating supported version in README.md
+-   Updating the `PROTOCOL_VERSION` variable in azalea-protocol
+-   Generating blocks in azalea-block
+-   Generating block shapes in azalea-physics
+-   Generating registries in azalea-registries
+-   Updating en_us.json in azalea-language
+-   Generating entity metadata structs and parsers in azalea-world
 
 If you're lucky, that's all you're going to have to do.
 Look at the diff (`git diff`) and type-check the code (`cargo check`) to make sure everything is right. In the diff, specifically look for new comments that have "TODO".
 
-If a packet is incorrect, you'll want to find it in the Minecraft source. The name of the struct should be the same or similar as the class in the vanilla source. Now, you'll have to manually write the struct for the packet. If the packet existed in the version before and it's just being updated, you can compare against that to see what was updated. Note that if a packet is particularly complicated, you may have to implement McBufReadable and McBufWritable, but most of the time the `#[derive(McBuf)]` macro will be able to generate the impls correctly. Look at other existing packets as reference if you're confused.
+If a packet is incorrect, you'll want to find it in the Minecraft source. The name of the struct should be the same or similar as the class in the vanilla source. Now, you'll have to manually write the struct for the packet. If the packet existed in the version before and it's just being updated, you can compare against that to see what was updated. Note that if a packet is particularly complicated, you may have to implement AzaleaRead and AzaleaWrite, but most of the time the `#[derive(AzBuf)]` macro will be able to generate the impls correctly. Look at other existing packets as reference if you're confused.
 
 Finally, test by making a bot join a world. Specifically, you'll want to test the things that were updated in the version. Setting the RUST_LOG environment variable to `debug` or `trace` may help you find the source of crashes (trace shows the first few hundred bytes for every packet received so it's typically more useful, but it may log more than you want).
 
@@ -39,9 +40,8 @@ If it all works, make a pull request. If the version you updated to is a snapsho
 
 At the time of writing, the following data generators are used:
 
-- [Vanilla data generator](https://wiki.vg/Data_Generators)
-- [Burger](https://github.com/mat-1/Burger)
-- [PixLyzer](https://gitlab.bixilon.de/bixilon/pixlyzer)
+-   [Vanilla data generator](https://wiki.vg/Data_Generators)
+-   [Burger](https://github.com/mat-1/Burger)
+-   [PixLyzer](https://gitlab.bixilon.de/bixilon/pixlyzer)
 
 Some things can be obtained from multiple generators. You should prefer them by the order above (the vanilla generator is the most reliable).
-
diff --git a/codegen/genblocks.py b/codegen/genblocks.py
index 1af0ad106..1024072a4 100755
--- a/codegen/genblocks.py
+++ b/codegen/genblocks.py
@@ -7,25 +7,27 @@
 import lib.extract
 import lib.utils
 
-version_id = lib.code.version.get_version_id()
+def generate(version_id):
+    # TODO: pixlyzer is broken so we use old data
+    shape_datas = lib.extract.get_pixlyzer_data(
+        '1.20.3-pre4', 'shapes')
+    pixlyzer_block_datas = lib.extract.get_pixlyzer_data(
+        '1.20.3-pre4', 'blocks')
 
-# TODO: pixlyzer is broken so we use old data
-shape_datas = lib.extract.get_pixlyzer_data(
-    '1.20.3-pre4', 'shapes')
-pixlyzer_block_datas = lib.extract.get_pixlyzer_data(
-    '1.20.3-pre4', 'blocks')
+    block_states_report = lib.extract.get_block_states_report(version_id)
+    registries = lib.extract.get_registries_report(version_id)
+    ordered_blocks = lib.code.blocks.get_ordered_blocks(registries)
 
-mappings = lib.download.get_mappings_for_version(version_id)
-block_states_burger = lib.extract.get_block_states_burger(version_id)
-ordered_blocks = lib.extract.get_ordered_blocks_burger(version_id)
-block_states_report = lib.extract.get_block_states_report(version_id)
+    lib.code.blocks.generate_blocks(
+        block_states_report, pixlyzer_block_datas, ordered_blocks)
 
-lib.code.blocks.generate_blocks(
-    block_states_burger, block_states_report, pixlyzer_block_datas, ordered_blocks, mappings)
+    lib.code.shapes.generate_block_shapes(
+        pixlyzer_block_datas, shape_datas['shapes'], shape_datas['aabbs'], block_states_report)
 
-lib.code.shapes.generate_block_shapes(
-    pixlyzer_block_datas, shape_datas['shapes'], shape_datas['aabbs'], block_states_report, block_states_burger, mappings)
+    lib.code.utils.fmt()
 
-lib.code.utils.fmt()
+    print('Done!')
 
-print('Done!')
+
+if __name__ == '__main__':
+    generate(lib.code.version.get_version_id())
diff --git a/codegen/genitemcomponents.py b/codegen/genitemcomponents.py
index 32923e7e7..73f03081d 100644
--- a/codegen/genitemcomponents.py
+++ b/codegen/genitemcomponents.py
@@ -144,12 +144,12 @@ def add_variant(variant: str):
         raise ValueError('Couldn\'t find end of match')
     
     code = code[:last_line_in_match] + [
-        f'        DataComponentKind::{variant} => Box::new({variant}::read_from(buf)?),',
+        f'        DataComponentKind::{variant} => Box::new({variant}::azalea_read(buf)?),',
     ] + code[last_line_in_match:]
 
     # now insert the struct
     code.append('')
-    code.append('#[derive(Clone, PartialEq, McBuf)]')
+    code.append('#[derive(Clone, PartialEq, AzBuf)]')
     code.append(f'pub struct {variant} {{')
     code.append('   pub todo: todo!(), // see DataComponents.java')
     code.append('}')
diff --git a/codegen/genpackets.py b/codegen/genpackets.py
new file mode 100755
index 000000000..0f724aebd
--- /dev/null
+++ b/codegen/genpackets.py
@@ -0,0 +1,18 @@
+import lib.code.version
+import lib.code.packet
+import lib.code.utils
+import lib.download
+import lib.extract
+
+def generate():
+    version_id = lib.code.version.get_version_id()
+    packets_report = lib.extract.get_packets_report(version_id)
+
+    lib.code.packet.set_packets(packets_report)
+
+    lib.code.utils.fmt()
+
+    print('Done!')
+
+if __name__ == '__main__':
+    generate()
diff --git a/codegen/genregistries.py b/codegen/genregistries.py
index b867903bf..175d1b207 100755
--- a/codegen/genregistries.py
+++ b/codegen/genregistries.py
@@ -14,7 +14,6 @@ def generate(version_id: str):
     lib.code.registry.generate_registries(registries)
     lib.code.inventory.update_menus(registries['minecraft:menu']['entries'])
 
-
     block_tags = lib.extract.get_registry_tags(version_id, 'block')
     item_tags = lib.extract.get_registry_tags(version_id, 'item')
     fluid_tags = lib.extract.get_registry_tags(version_id, 'fluid')
diff --git a/codegen/lib/code/blocks.py b/codegen/lib/code/blocks.py
index cda95339c..2733093bc 100755
--- a/codegen/lib/code/blocks.py
+++ b/codegen/lib/code/blocks.py
@@ -12,7 +12,7 @@
 # - Block: Has properties and states.
 
 
-def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_datas: dict, ordered_blocks: list[str], mappings: Mappings):
+def generate_blocks(blocks_report: dict, pixlyzer_block_datas: dict, ordered_blocks: list[str]):
     with open(BLOCKS_RS_DIR, 'r') as f:
         existing_code = f.read().splitlines()
 
@@ -25,25 +25,14 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat
     # This dict looks like { 'FloweringAzaleaLeavesDistance': 'distance' }
     property_struct_names_to_names = {}
     for block_id in ordered_blocks:
-        block_data_burger = blocks_burger[block_id]
         block_data_report = blocks_report[f'minecraft:{block_id}']
 
         block_properties = {}
-        for property_name in list(block_data_report.get('properties', {}).keys()):
-            property_burger = None
-            for property in block_data_burger.get('states', []):
-                if property['name'] == property_name:
-                    property_burger = property
-                    break
-
-            property_variants = block_data_report['properties'][property_name]
-
-            if property_burger is None:
-                print(
-                    f'Warning: The reports have states for a block, but Burger doesn\'t! (missing "{property_name}")', block_data_burger)
+        for property_id in list(block_data_report.get('properties', {}).keys()):
+            property_variants = block_data_report['properties'][property_id]
 
             property_struct_name = get_property_struct_name(
-                property_burger, block_data_burger, property_variants, mappings)
+                block_id, property_id, property_variants)
 
             if property_struct_name in properties:
                 if not properties[property_struct_name] == property_variants:
@@ -55,7 +44,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat
 
             block_properties[property_struct_name] = property_variants
 
-            property_struct_names_to_names[property_struct_name] = property_name
+            property_struct_names_to_names[property_struct_name] = property_id
 
         properties.update(block_properties)
 
@@ -67,7 +56,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat
         #     Wall,
         #     Ceiling,
         # },
-        property_name = property_struct_names_to_names[property_struct_name]
+        property_id = property_struct_names_to_names[property_struct_name]
 
         # if the only variants are true and false, we make it unit struct with a boolean instead of an enum
         if property_variants == ['true', 'false']:
@@ -79,38 +68,28 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat
             property_shape_code += '        }'
 
         new_make_block_states_macro_code.append(
-            f'        "{property_name}" => {property_shape_code},')
+            f'        "{property_id}" => {property_shape_code},')
 
     new_make_block_states_macro_code.append('    },')
 
     # Block codegen
     new_make_block_states_macro_code.append('    Blocks => {')
     for block_id in ordered_blocks:
-        block_data_burger = blocks_burger[block_id]
         block_data_report = blocks_report['minecraft:' + block_id]
         block_data_pixlyzer = pixlyzer_block_datas.get(f'minecraft:{block_id}', {})
 
-        block_properties = block_data_burger.get('states', [])
-        block_properties_burger = block_data_burger.get('states', [])
-
         default_property_variants: dict[str, str] = {}
         for state in block_data_report['states']:
             if state.get('default'):
                 default_property_variants = state.get('properties', {})
 
         properties_code = '{'
-        for property_name in list(block_data_report.get('properties', {}).keys()):
-            property_burger = None
-            for property in block_data_burger.get('states', []):
-                if property['name'] == property_name:
-                    property_burger = property
-                    break
-
-            property_default = default_property_variants.get(property_name)
-            property_variants = block_data_report['properties'][property_name]
+        for property_id in list(block_data_report.get('properties', {}).keys()):
+            property_default = default_property_variants.get(property_id)
+            property_variants = block_data_report['properties'][property_id]
 
             property_struct_name = get_property_struct_name(
-                property_burger, block_data_burger, property_variants, mappings)
+                block_id, property_id, property_variants)
 
             is_boolean_property = property_variants == ['true', 'false']
 
@@ -123,7 +102,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat
 
             assert property_default is not None
 
-            this_property_code = f'"{property_name}": {property_default_type}'
+            this_property_code = f'"{property_id}": {property_default_type}'
 
             properties_code += f'\n            {this_property_code},'
         # if there's nothing inside the properties, keep it in one line
@@ -177,8 +156,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat
     with open(BLOCKS_RS_DIR, 'w') as f:
         f.write('\n'.join(new_code))
 
-
-def get_property_struct_name(property: Optional[dict], block_data_burger: dict, property_variants: list[str], mappings: Mappings) -> str:
+def get_property_struct_name(block_id: str, property_id: str, property_variants: list[str]) -> str:
     # these are hardcoded because otherwise they cause conflicts
     # some names inspired by https://github.com/feather-rs/feather/blob/main/feather/blocks/src/generated/table.rs
     if property_variants == ['north', 'east', 'south', 'west', 'up', 'down']:
@@ -205,34 +183,34 @@ def get_property_struct_name(property: Optional[dict], block_data_burger: dict,
         return 'VaultState'
     if 'harp' in property_variants and 'didgeridoo' in property_variants:
         return 'Sound'
-
-    if property is None:
-        return ''.join(map(to_camel_case, property_variants))
-
-    if property_variants == ['true', 'false']:
-        # booleans are weird, so just return the string name minecraft uses
-        return to_camel_case(property['name'])
-
-    for class_name in [block_data_burger['class']] + block_data_burger['super']:
-        property_name = mappings.get_field(
-            class_name, property['field_name'])
-        if property_name:
-            break
-    if property_name is None:
-        if 'declared_in' in property:
-            property_name = mappings.get_field(
-                property['declared_in'], property['field_name'])
-    if property_name is None:
-        property_name = property['name']
-    assert property_name
-    property_name = to_camel_case(property_name.lower())
-    if property['type'] == 'int':
-        property_name = to_camel_case(
-            block_data_burger['text_id']) + property_name
-
-    # if property_variants == ['none', 'low', 'tall']:
-
+    if is_list_of_string_integers(property_variants):
+        # if the values are all integers, then prepend the block name
+        return to_camel_case(block_id) + to_camel_case(property_id)
     if property_variants == ['up', 'side', 'none']:
-        property_name = 'Wire' + to_camel_case(property_name)
-
-    return property_name
+        return 'Wire' + to_camel_case(property_id)
+    if property_variants == ['none', 'low', 'tall']:
+        return 'Wall' + to_camel_case(property_id)
+
+    return to_camel_case(property_id)
+
+def is_list_of_string_integers(l: list[str]) -> bool:
+    return all(map(str.isdigit, l))
+
+def get_ordered_blocks(registries_report: dict[str, dict]) -> list[str]:
+    '''
+    Returns a list of block ids (like ['air', 'stone', ...]) ordered by their protocol id.
+    '''
+    blocks_registry = registries_report['minecraft:block']
+
+    blocks_to_ids = {} 
+    for block_id, value in blocks_registry['entries'].items():
+        prefix = 'minecraft:'
+        assert block_id.startswith(prefix)
+        block_id = block_id[len(prefix):]
+        protocol_id = value['protocol_id']
+        blocks_to_ids[block_id] = protocol_id
+    
+    ordered_blocks = []
+    for block_id in sorted(blocks_to_ids, key=blocks_to_ids.get):
+        ordered_blocks.append(block_id)
+    return ordered_blocks
diff --git a/codegen/lib/code/entity.py b/codegen/lib/code/entity.py
index 5f0bc3d9e..a380d3d9a 100644
--- a/codegen/lib/code/entity.py
+++ b/codegen/lib/code/entity.py
@@ -111,7 +111,7 @@ def generate_entity_metadata(burger_entities_data: dict, mappings: Mappings):
     direction::Direction,
     position::{BlockPos, Vec3},
 };
-use azalea_inventory::ItemSlot;
+use azalea_inventory::ItemStack;
 use bevy_ecs::{bundle::Bundle, component::Component};
 use derive_more::{Deref, DerefMut};
 use thiserror::Error;
@@ -428,7 +428,7 @@ def generate_fields(this_entity_id: str):
                         elif type_name == 'OptionalUnsignedInt':
                             default = f'OptionalUnsignedInt(Some({default}))' if default != 'Empty' else 'OptionalUnsignedInt(None)'
                         elif type_name == 'ItemStack':
-                            default = f'ItemSlot::Present({default})' if default != 'Empty' else 'ItemSlot::Empty'
+                            default = f'ItemStack::Present({default})' if default != 'Empty' else 'ItemStack::Empty'
                         elif type_name == 'BlockState':
                             default = f'{default}' if default != 'Empty' else 'azalea_block::BlockState::AIR'
                         elif type_name == 'OptionalBlockState':
diff --git a/codegen/lib/code/packet.py b/codegen/lib/code/packet.py
index b34d3455f..71bc3a704 100755
--- a/codegen/lib/code/packet.py
+++ b/codegen/lib/code/packet.py
@@ -9,179 +9,80 @@
 def make_packet_mod_rs_line(packet_id: int, packet_class_name: str):
     return f'        {padded_hex(packet_id)}: {to_snake_case(packet_class_name)}::{to_camel_case(packet_class_name)},'
 
-
-def fix_state(state: str):
-    return {'PLAY': 'game'}.get(state, state.lower())
-
-
-def generate_packet(burger_packets, mappings: Mappings, target_packet_id, target_packet_direction, target_packet_state):
-    for packet in burger_packets.values():
-        if packet['id'] != target_packet_id:
-            continue
-
-        direction = packet['direction'].lower()  # serverbound or clientbound
-        state = fix_state(packet['state'])
-
-        if state != target_packet_state or direction != target_packet_direction:
-            continue
-
-        generated_packet_code = []
-        uses = set()
-        extra_code = []
-
-        packet_derive_name = f'{to_camel_case(direction)}{to_camel_case(state)}Packet'
-
-        generated_packet_code.append(
-            f'#[derive(Clone, Debug, McBuf, {packet_derive_name})]')
-        uses.add(f'azalea_protocol_macros::{packet_derive_name}')
-        uses.add(f'azalea_buf::McBuf')
-
-        obfuscated_class_name = packet['class'].split('.')[0]
-        class_name = mappings.get_class(
-            obfuscated_class_name).split('.')[-1]
-        if '$' in class_name:
-            class_name, extra_part = class_name.split('$')
-            if class_name.endswith('Packet'):
-                class_name = class_name[:-
-                                        len('Packet')] + extra_part + 'Packet'
-
-        generated_packet_code.append(
-            f'pub struct {to_camel_case(class_name)} {{')
-
-        # call burger_instruction_to_code for each instruction
-        i = -1
-        instructions = packet.get('instructions', [])
-        while (i + 1) < len(instructions):
-            i += 1
-
-            if instructions[i]['operation'] == 'write':
-                skip = burger_instruction_to_code(
-                    instructions, i, generated_packet_code, mappings, obfuscated_class_name, uses, extra_code)
-                if skip:
-                    i += skip
-            else:
-                generated_packet_code.append(f'// TODO: {instructions[i]}')
-
-        generated_packet_code.append('}')
-
-        if uses:
-            # empty line before the `use` statements
-            generated_packet_code.insert(0, '')
-        for use in uses:
-            generated_packet_code.insert(0, f'use {use};')
-        for line in extra_code:
-            generated_packet_code.append(line)
-
-        print(generated_packet_code)
-        write_packet_file(state, to_snake_case(class_name),
-                          '\n'.join(generated_packet_code))
-        print()
-
+MOJMAP_TO_AZALEA_STATE_NAME_MAPPING = {
+    # shorter name, i like it more
+    'configuration': 'config',
+    # in the files mojang calls the directory "game" so we do that too
+    'play': 'game'
+}
+AZALEA_TO_MOJMAP_STATE_NAME_MAPPING = {v: k for k, v in MOJMAP_TO_AZALEA_STATE_NAME_MAPPING.items()}
+
+def generate_packet(packets_report, packet_name, direction, state):
+    mojmap_state = AZALEA_TO_MOJMAP_STATE_NAME_MAPPING.get(state, state)
+    _packet_report = packets_report[mojmap_state][direction]['minecraft:' + packet_name]
+
+    code = []
+    uses = set()
+
+    packet_derive_name = f'{to_camel_case(direction)}{to_camel_case(state)}Packet'
+
+    packet_struct_name = to_camel_case(f'{direction}_{packet_name}')
+    packet_module_name = f'{direction[0]}_{packet_name}'
+
+    code.append(f'use azalea_buf::AzBuf;')
+    code.append(f'use azalea_protocol_macros::{packet_derive_name};')
+    code.append('')
+   
+    code.append(
+        f'#[derive(Clone, Debug, AzBuf, {packet_derive_name})]')
+    code.append(
+        f'pub struct {packet_struct_name} {{')
+    code.append('    TODO')
+    code.append('}')
+
+    print(code)
+    write_packet_file(state, packet_module_name, '\n'.join(code))
+
+    # this won't handle writing to the packets/{state}/mod.rs file since we'd need to know the full packet list
+
+def set_packets(packets_report):
+    for mojmap_state in packets_report:
+        state = MOJMAP_TO_AZALEA_STATE_NAME_MAPPING.get(mojmap_state, mojmap_state)
         mod_rs_dir = get_dir_location(
             f'../azalea-protocol/src/packets/{state}/mod.rs')
-        with open(mod_rs_dir, 'r') as f:
-            mod_rs = f.read().splitlines()
-
-        pub_mod_line = f'pub mod {to_snake_case(class_name)};'
-        if pub_mod_line not in mod_rs:
-            mod_rs.insert(0, pub_mod_line)
-            packet_mod_rs_line = make_packet_mod_rs_line(
-                packet['id'], class_name)
-
-            in_serverbound = False
-            in_clientbound = False
-            for i, line in enumerate(mod_rs):
-                if line.strip() == 'Serverbound => {':
-                    in_serverbound = True
-                    continue
-                elif line.strip() == 'Clientbound => {':
-                    in_clientbound = True
-                    continue
-                elif line.strip() in ('}', '},'):
-                    if (in_serverbound and direction == 'serverbound') or (in_clientbound and direction == 'clientbound'):
-                        mod_rs.insert(i, packet_mod_rs_line)
-                        break
-                    in_serverbound = in_clientbound = False
-                    continue
-
-                if line.strip() == '' or line.strip().startswith('//') or (not in_serverbound and direction == 'serverbound') or (not in_clientbound and direction == 'clientbound'):
-                    continue
-
-                line_packet_id_hex = line.strip().split(':')[0]
-                assert line_packet_id_hex.startswith('0x')
-                line_packet_id = int(line_packet_id_hex[2:], 16)
-                if line_packet_id > packet['id']:
-                    mod_rs.insert(i, packet_mod_rs_line)
-                    break
-
-            with open(mod_rs_dir, 'w') as f:
-                f.write('\n'.join(mod_rs))
-
-
-def set_packets(packet_ids: list[int], packet_class_names: list[str], direction: str, state: str):
-    assert len(packet_ids) == len(packet_class_names)
-
-    # ids are repeated
-    assert len(packet_ids) == len(set(packet_ids))
-
-    # sort the packets by id
-    packet_ids, packet_class_names = [list(x) for x in zip(
-        *sorted(zip(packet_ids, packet_class_names), key=lambda pair: pair[0]))]  # type: ignore
-
-    mod_rs_dir = get_dir_location(
-        f'../azalea-protocol/src/packets/{state}/mod.rs')
-    with open(mod_rs_dir, 'r') as f:
-        mod_rs = f.read().splitlines()
-    new_mod_rs = []
-
-    required_modules = []
-
-    ignore_lines = False
-
-    for line in mod_rs:
-        if line.strip() == 'Serverbound => {':
-            new_mod_rs.append(line)
-            if direction == 'serverbound':
-                ignore_lines = True
-                for packet_id, packet_class_name in zip(packet_ids, packet_class_names):
-                    new_mod_rs.append(
-                        make_packet_mod_rs_line(packet_id, packet_class_name)
-                    )
-                    required_modules.append(packet_class_name)
-            else:
-                ignore_lines = False
-            continue
-        elif line.strip() == 'Clientbound => {':
-            new_mod_rs.append(line)
-            if direction == 'clientbound':
-                ignore_lines = True
-                for packet_id, packet_class_name in zip(packet_ids, packet_class_names):
-                    new_mod_rs.append(
-                        make_packet_mod_rs_line(packet_id, packet_class_name)
-                    )
-                    required_modules.append(packet_class_name)
-            else:
-                ignore_lines = False
-            continue
-        elif line.strip() in ('}', '},'):
-            ignore_lines = False
-        elif line.strip().startswith('pub mod '):
-            continue
-
-        if not ignore_lines:
-            new_mod_rs.append(line)
-            # 0x00: clientbound_status_response_packet::ClientboundStatusResponsePacket,
-            if line.strip().startswith('0x'):
-                required_modules.append(
-                    line.strip().split(':')[1].split('::')[0].strip())
-
-    for i, required_module in enumerate(required_modules):
-        if required_module not in mod_rs:
-            new_mod_rs.insert(i, f'pub mod {required_module};')
-
-    with open(mod_rs_dir, 'w') as f:
-        f.write('\n'.join(new_mod_rs))
 
+        serverbound_packets = packet_direction_report_to_packet_names(packets_report[mojmap_state]['serverbound'])
+        clientbound_packets = packet_direction_report_to_packet_names(packets_report[mojmap_state].get('clientbound', {}))
+
+        code = []
+        code.append('// NOTE: This file is generated automatically by codegen/packet.py.')
+        code.append("// Don't edit it directly!")
+        code.append('')
+        code.append('use azalea_protocol_macros::declare_state_packets;')
+        code.append('')
+        code.append(f'declare_state_packets!({to_camel_case(state)}Packet,')
+        code.append('    Clientbound => [')
+        for packet_name in clientbound_packets:
+            code.append(f'        {packet_name},')
+        code.append('    ],')
+        code.append('    Serverbound => [')
+        for packet_name in serverbound_packets:
+            code.append(f'        {packet_name},')
+        code.append('    ]')
+        code.append(');')
+        code.append('')
+
+        with open(mod_rs_dir, 'w') as f:
+            f.write('\n'.join(code))
+
+def packet_direction_report_to_packet_names(report):
+    name_to_id = {}
+    for resource_location, packet in report.items():
+        packet_id = packet['protocol_id']
+        name_to_id[resource_location.split(':')[-1]] = packet_id
+    
+    names_sorted = [name for name in sorted(name_to_id, key=lambda x: name_to_id[x])]
+    return names_sorted
 
 def get_packets(direction: str, state: str):
     mod_rs_dir = get_dir_location(
diff --git a/codegen/lib/code/shapes.py b/codegen/lib/code/shapes.py
index 12b333d17..c4964fa68 100755
--- a/codegen/lib/code/shapes.py
+++ b/codegen/lib/code/shapes.py
@@ -5,11 +5,11 @@
     '../azalea-physics/src/collision/blocks.rs')
 
 
-def generate_block_shapes(blocks_pixlyzer: dict, shapes: dict, aabbs: dict, block_states_report, block_datas_burger, mappings: Mappings):
+def generate_block_shapes(blocks_pixlyzer: dict, shapes: dict, aabbs: dict, block_states_report):
     blocks, shapes = simplify_shapes(blocks_pixlyzer, shapes, aabbs)
 
     code = generate_block_shapes_code(
-        blocks, shapes, block_states_report, block_datas_burger, mappings)
+        blocks, shapes, block_states_report)
     with open(COLLISION_BLOCKS_RS_DIR, 'w') as f:
         f.write(code)
 
@@ -63,7 +63,7 @@ def simplify_shapes(blocks: dict, shapes: dict, aabbs: dict):
     return new_blocks, new_shapes
 
 
-def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report, block_datas_burger, mappings: Mappings):
+def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report):
     # look at __cache__/generator-mod-*/blockCollisionShapes.json for format of blocks and shapes
 
     generated_shape_code = ''
@@ -75,7 +75,9 @@ def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report,
     empty_shapes = []
     full_shapes = []
 
-    block_state_ids_to_shape_ids = []
+    # the index into this list is the block state id
+    shapes_map = []
+
     for block_id, shape_ids in blocks.items():
         if isinstance(shape_ids, int):
             shape_ids = [shape_ids]
@@ -89,17 +91,19 @@ def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report,
             elif shape_id == 1 :
                 full_shapes.append(block_state_id)
 
-            block_state_ids_to_shape_ids.append((block_state_id, shape_id))
-
+            while len(shapes_map) <= block_state_id:
+                # default to shape 1 for missing shapes (full block)
+                shapes_map.append(1)
+            shapes_map[block_state_id] = shape_id
 
-    generated_map_code = f'static SHAPES_MAP: [&LazyLock<VoxelShape>; {len(block_state_ids_to_shape_ids)}] = ['
+    
 
-    block_state_ids_to_shape_ids = sorted(block_state_ids_to_shape_ids, key=lambda x: x[0])
+    generated_map_code = f'static SHAPES_MAP: [&LazyLock<VoxelShape>; {len(shapes_map)}] = ['
 
     empty_shape_match_code = convert_ints_to_rust_ranges(empty_shapes)
     block_shape_match_code = convert_ints_to_rust_ranges(full_shapes)
 
-    for block_state_id, shape_id in block_state_ids_to_shape_ids:
+    for block_state_id, shape_id in enumerate(shapes_map):
         generated_map_code += f'&SHAPE{shape_id},\n'
     generated_map_code += '];'
 
@@ -109,7 +113,7 @@ def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report,
     return f'''
 //! Autogenerated block collisions for every block
 
-// This file is generated from codegen/lib/code/block_shapes.py. If you want to
+// This file is generated from codegen/lib/code/shapes.py. If you want to
 // modify it, change that file.
 
 #![allow(clippy::explicit_auto_deref)]
diff --git a/codegen/lib/code/utils.py b/codegen/lib/code/utils.py
index 29adc2472..1a87b7f6e 100755
--- a/codegen/lib/code/utils.py
+++ b/codegen/lib/code/utils.py
@@ -131,7 +131,7 @@ def burger_type_to_rust_type(burger_type, field_name: Optional[str] = None, inst
             field_type_rs = to_camel_case(
                 enum_name.split('.')[-1].split('$')[-1])
             extra_code.append('')
-            extra_code.append(f'#[derive(McBuf, Clone, Copy, Debug)]')
+            extra_code.append(f'#[derive(AzBuf, Clone, Copy, Debug)]')
             extra_code.append(f'pub enum {field_type_rs} {{')
             for index, variant in enumerate(enum_variants):
                 extra_code.append(
@@ -166,8 +166,8 @@ def burger_type_to_rust_type(burger_type, field_name: Optional[str] = None, inst
     return field_type_rs, is_var, uses, extra_code
 
 
-def write_packet_file(state, packet_name_snake_case, code):
-    with open(get_dir_location(f'../azalea-protocol/src/packets/{state}/{packet_name_snake_case}.rs'), 'w') as f:
+def write_packet_file(state, packet_module_name, code):
+    with open(get_dir_location(f'../azalea-protocol/src/packets/{state}/{packet_module_name}.rs'), 'w') as f:
         f.write(code)
 
 
diff --git a/codegen/lib/code/version.py b/codegen/lib/code/version.py
index c2053da3c..d4a37232d 100755
--- a/codegen/lib/code/version.py
+++ b/codegen/lib/code/version.py
@@ -31,7 +31,28 @@ def set_version_id(version_id: str) -> None:
 
     with open(README_DIR, 'wb') as f:
         f.write(readme_text.encode())
-
+    
+    # update the version in all Cargo.toml files
+    # version = "0.10.3+mc1.21.1"
+    for root, _, files in os.walk(get_dir_location('..')):
+        for file in files:
+            if file == 'Cargo.toml':
+                with open(os.path.join(root, file), 'r') as f:
+                    cargo_toml = f.read().splitlines()
+                for i, line in enumerate(cargo_toml):
+                    if line.strip().startswith('version = '):
+                        replaced = re.sub(r'\+mc[^"]+?"', f'+mc{version_id}"', line)
+                        cargo_toml[i] = replaced
+                        break
+                else:
+                    # didn't have a version line
+                    continue
+                if cargo_toml[-1] != '':
+                    # make sure there's always a trailing newline
+                    cargo_toml.append('')
+                with open(os.path.join(root, file), 'w') as f:
+                    f.write('\n'.join(cargo_toml))
+    print('Updated version in README.md and Cargo.toml files')
 
 def get_protocol_version() -> str:
     # azalea-protocol/src/packets/mod.rs
@@ -49,7 +70,7 @@ def set_protocol_version(protocol_version: str) -> None:
     with open(get_dir_location('../azalea-protocol/src/packets/mod.rs'), 'r') as f:
         mod_rs = f.read().splitlines()
     for i, line in enumerate(mod_rs):
-        if line.strip().startswith('pub const PROTOCOL_VERSION'):
+        if line.strip().startswith('pub const PROTOCOL_VERSION:'):
             mod_rs[i] = f'pub const PROTOCOL_VERSION: i32 = {protocol_version};'
             break
     else:
@@ -58,3 +79,16 @@ def set_protocol_version(protocol_version: str) -> None:
 
     with open(get_dir_location('../azalea-protocol/src/packets/mod.rs'), 'w') as f:
         f.write('\n'.join(mod_rs))
+def set_version_name(version_name: str) -> None:
+    with open(get_dir_location('../azalea-protocol/src/packets/mod.rs'), 'r') as f:
+        mod_rs = f.read().splitlines()
+    for i, line in enumerate(mod_rs):
+        if line.strip().startswith('pub const VERSION_NAME:'):
+            mod_rs[i] = f'pub const VERSION_NAME: &str = "{version_name}";'
+            break
+    else:
+        raise Exception(
+            'Could not find version name in azalea-protocol/src/packets/mod.rs')
+
+    with open(get_dir_location('../azalea-protocol/src/packets/mod.rs'), 'w') as f:
+        f.write('\n'.join(mod_rs))
diff --git a/codegen/lib/extract.py b/codegen/lib/extract.py
index da69b7534..4119ad559 100755
--- a/codegen/lib/extract.py
+++ b/codegen/lib/extract.py
@@ -1,7 +1,7 @@
 # Extracting data from the Minecraft jars
 
 from typing import TYPE_CHECKING
-from lib.download import get_mappings_for_version, get_server_jar, get_burger, get_client_jar, get_pixlyzer, get_yarn_data, get_fabric_api_versions, get_fabric_loader_versions
+from lib.download import get_server_jar, get_burger, get_client_jar, get_pixlyzer, get_yarn_data, get_fabric_api_versions, get_fabric_loader_versions
 from lib.utils import get_dir_location, to_camel_case, upper_first_letter
 from zipfile import ZipFile
 import subprocess
@@ -23,17 +23,16 @@ def generate_data_from_server_jar(version_id: str):
 
 
 def get_block_states_report(version_id: str):
-    generate_data_from_server_jar(version_id)
-    with open(get_dir_location(f'__cache__/generated-{version_id}/reports/blocks.json'), 'r') as f:
-        return json.load(f)
-
-
+    return get_report(version_id, 'blocks')
 def get_registries_report(version_id: str):
+    return get_report(version_id, 'registries')
+def get_packets_report(version_id: str):
+    return get_report(version_id, 'packets')
+def get_report(version_id: str, name: str):
     generate_data_from_server_jar(version_id)
-    with open(get_dir_location(f'__cache__/generated-{version_id}/reports/registries.json'), 'r') as f:
+    with open(get_dir_location(f'__cache__/generated-{version_id}/reports/{name}.json'), 'r') as f:
         return json.load(f)
 
-
 def get_registry_tags(version_id: str, name: str):
     generate_data_from_server_jar(version_id)
     tags_directory = get_dir_location(f'__cache__/generated-{version_id}/data/minecraft/tags/{name}')
@@ -50,17 +49,6 @@ def get_registry_tags(version_id: str, name: str):
                 tags[relative_path[:-5]] = json.load(f)
     return tags
 
-
-def get_block_states_burger(version_id: str):
-    burger_data = get_burger_data_for_version(version_id)
-    return burger_data[0]['blocks']['block']
-
-
-def get_ordered_blocks_burger(version_id: str):
-    burger_data = get_burger_data_for_version(version_id)
-    return burger_data[0]['blocks']['ordered_blocks']
-
-
 python_command = None
 
 
diff --git a/codegen/migrate.py b/codegen/migrate.py
index 3dcb854a4..53d5b588c 100755
--- a/codegen/migrate.py
+++ b/codegen/migrate.py
@@ -1,5 +1,3 @@
-from lib.code.packet import fix_state
-from lib.utils import PacketIdentifier, group_packets
 import lib.code.inventory
 import lib.code.language
 import lib.code.registry
@@ -31,104 +29,28 @@
 new_mappings = lib.download.get_mappings_for_version(new_version_id)
 new_burger_data = lib.extract.get_burger_data_for_version(new_version_id)
 
-old_packet_list = lib.extract.get_packet_list(old_version_id)
-new_packet_list = lib.extract.get_packet_list(new_version_id)
-
-
-# old_packets: dict[PacketIdentifier, str] = {}
-# old_packets_data: dict[PacketIdentifier, dict] = {}
-# new_packets: dict[PacketIdentifier, str] = {}
-# new_packets_data: dict[PacketIdentifier, dict] = {}
-
-# for packet in old_packet_list:
-#     assert packet['class'].endswith('.class')
-#     packet_name = old_mappings.get_class(packet['class'][:-6])
-#     packet_ident = PacketIdentifier(
-#         packet['id'], packet['direction'].lower(), fix_state(packet['state']))
-#     old_packets[packet_ident] = packet_name
-#     old_packets_data[packet_ident] = packet
-# for packet in new_packet_list:
-#     assert packet['class'].endswith('.class')
-#     packet_name = new_mappings.get_class(packet['class'][:-6])
-#     packet_ident = PacketIdentifier(
-#         packet['id'], packet['direction'].lower(), fix_state(packet['state']))
-#     new_packets[packet_ident] = packet_name
-#     new_packets_data[packet_ident] = packet
-
-# # find removed packets
-# removed_packets: list[PacketIdentifier] = []
-# for packet, packet_name in old_packets.items():
-#     if packet_name not in new_packets.values():
-#         removed_packets.append(packet)
-#         print('Removed packet:', packet, packet_name)
-# for (direction, state), packets in group_packets(removed_packets).items():
-#     lib.code.packet.remove_packet_ids(packets, direction, state)
-
-print()
-
-# # find packets that changed ids
-# changed_packets: dict[PacketIdentifier, int] = {}
-# for old_packet, old_packet_name in old_packets.items():
-#     for new_packet, new_packet_name in new_packets.items():
-#         if old_packet_name == new_packet_name and old_packet.direction == new_packet.direction and old_packet.state == new_packet.state and old_packet.packet_id != new_packet.packet_id:
-#             changed_packets[old_packet] = new_packet.packet_id
-#             print('Changed packet id:', old_packet, '->',
-#                   new_packet, f'({new_packet_name})')
-#             break
-# for (direction, state), packets in group_packets(list(changed_packets.keys())).items():
-#     id_map: dict[int, int] = {}
-#     for old_packet_id in packets:
-#         new_packet_id = changed_packets[PacketIdentifier(
-#             old_packet_id, direction, state)]
-#         id_map[old_packet_id] = new_packet_id
-#     lib.code.packet.change_packet_ids(id_map, direction, state)
-
-
-# print()
-
-# # find added/changed packets
-# added_or_changed_packets: list[PacketIdentifier] = []
-# for new_packet, packet_name in new_packets.items():
-#     old_packet = None
-#     for old_packet_tmp, old_packet_name in old_packets.items():
-#         if old_packet_name == packet_name:
-#             old_packet = old_packet_tmp
-#             break
-
-#     if packet_name not in old_packets.values():
-#         added_or_changed_packets.append(new_packet)
-#         print('Added packet:', new_packet, packet_name)
-#     elif old_packet and not lib.code.packet.are_packet_instructions_identical(new_packets_data[new_packet].get('instructions'), old_packets_data[old_packet].get('instructions')):
-#         added_or_changed_packets.append(new_packet)
-#         print('Changed packet:', new_packet, packet_name)
-# for packet in added_or_changed_packets:
-#     lib.code.packet.generate_packet(
-#         new_burger_data[0]['packets']['packet'], new_mappings, packet.packet_id, packet.direction, packet.state)
+new_packets_report = lib.extract.get_packets_report(new_version_id)
+lib.code.packet.set_packets(new_packets_report)
 
 lib.code.version.set_protocol_version(
     new_burger_data[0]['version']['protocol'])
-
-# print('Updated protocol!')
-
-
-# old_ordered_blocks = lib.extract.get_ordered_blocks_burger(old_version_id)
-# new_ordered_blocks = lib.extract.get_ordered_blocks_burger(new_version_id)
-# if old_ordered_blocks != new_ordered_blocks:
-#     print('Blocks changed, updating...')
-
-#     block_states_burger = lib.extract.get_block_states_burger(new_version_id)
-#     block_states_report = lib.extract.get_block_states_report(new_version_id)
-
-#     # TODO: pixlyzer is currently broken so uhhhh
-#     shape_datas = lib.extract.get_pixlyzer_data(
-#         '1.20.3-pre4', 'shapes')
-#     pixlyzer_block_datas = lib.extract.get_pixlyzer_data(
-#         '1.20.3-pre4', 'blocks')
-
-#     lib.code.blocks.generate_blocks(
-#         block_states_burger, block_states_report, pixlyzer_block_datas, new_ordered_blocks, new_mappings)
-#     lib.code.shapes.generate_block_shapes(
-#         pixlyzer_block_datas, shape_datas['shapes'], shape_datas['aabbs'], block_states_report, block_states_burger, new_mappings)
+lib.code.version.set_version_name(new_version_id)
+
+print('Updated protocol!')
+
+print('Generating blocks and shapes...')
+# TODO: pixlyzer is broken so we use old data
+new_shape_datas = lib.extract.get_pixlyzer_data(
+    '1.20.3-pre4', 'shapes')
+new_pixlyzer_block_datas = lib.extract.get_pixlyzer_data(
+    '1.20.3-pre4', 'blocks')
+new_block_states_report = lib.extract.get_block_states_report(new_version_id)
+new_registries = lib.extract.get_registries_report(new_version_id)
+new_ordered_blocks = lib.code.blocks.get_ordered_blocks(new_registries)
+lib.code.blocks.generate_blocks(
+    new_block_states_report, new_pixlyzer_block_datas, new_ordered_blocks)
+lib.code.shapes.generate_block_shapes(
+    new_pixlyzer_block_datas, new_shape_datas['shapes'], new_shape_datas['aabbs'], new_block_states_report)
 
 print('Getting en_us.json...')
 language = lib.extract.get_en_us_lang(new_version_id)
@@ -139,13 +61,12 @@
 genregistries.generate(new_version_id)
 
 # print('Generating entity metadata...')
-# burger_entities_data = new_burger_data[0]['entities']
-# lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings)
+burger_entities_data = new_burger_data[0]['entities']
+lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings)
 
 print('Finishing touches, setting version in README and formatting code...')
 lib.code.version.set_version_id(new_version_id)
 
-
 lib.code.utils.fmt()
 
 print('Done!')
diff --git a/codegen/newpacket.py b/codegen/newpacket.py
index d8edcde14..97408e051 100755
--- a/codegen/newpacket.py
+++ b/codegen/newpacket.py
@@ -5,18 +5,20 @@
 import lib.extract
 import sys
 
-version_id = lib.code.version.get_version_id()
+def generate():
+    version_id = lib.code.version.get_version_id()
 
-mappings = lib.download.get_mappings_for_version(version_id)
-burger_data = lib.extract.get_burger_data_for_version(version_id)
+    packets_report = lib.extract.get_packets_report(version_id)
 
-burger_packets_data = burger_data[0]['packets']['packet']
-packet_id, direction, state = int(sys.argv[1], 0), sys.argv[2], sys.argv[3]
-print(
-    f'Generating code for packet id: {packet_id} with direction {direction} and state {state}')
-lib.code.packet.generate_packet(burger_packets_data, mappings,
-                                packet_id, direction, state)
+    packet_id, direction, state = sys.argv[1], sys.argv[2], sys.argv[3]
+    print(
+        f'Generating code for packet id: {packet_id} with direction {direction} and state {state}')
+    lib.code.packet.generate_packet(packets_report, packet_id, direction, state)
+    lib.code.packet.set_packets(packets_report)
 
-lib.code.utils.fmt()
+    lib.code.utils.fmt()
 
-print('Done!')
+    print('Done!')
+
+if __name__ == '__main__':
+    generate()


Test patch: