diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java
index 93a125867..723b1c19a 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java
@@ -2,13 +2,19 @@ package net.minecraft.client.gui;
 
 import com.mojang.logging.LogUtils;
 import net.minecraft.client.gui.modelviewer.elements.ListenerButtonElement;
+import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.render.Scissor;
+import net.minecraft.client.render.font.Alignment;
 import net.minecraft.client.render.renderer.GLRenderer;
 import net.minecraft.client.render.renderer.Shaders;
 import net.minecraft.client.render.tessellator.TessellatorGeneral;
+import net.minecraft.client.sound.SoundEngine;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
 import org.slf4j.Logger;
@@ -51,7 +57,10 @@ public class ScreenCredits extends Screen {
 
     private List<String> lines;
 
-    private float hue = 0;
+    private final List<CreditElement> creditElements = new ArrayList<>();
+    private int creditsHeight = 0;
+    private @Nullable CreditElement overlayElement = null;
+
 
     public ScreenCredits(Screen parent) {
         super(parent);
@@ -75,6 +84,37 @@ public class ScreenCredits extends Screen {
             this.lines = new ArrayList<>();
             this.lines.add("An error occurred while loading the credits.");
         }
+
+        this.creditsHeight = 0;
+        for (int i = 0, size = this.lines.size(); i < size; i++) {
+            String line = this.lines.get(i);
+
+            CreditElement element = null;
+            if (line.startsWith("*")) {
+                element = new Category(line.substring(1));
+            } else if (line.startsWith("!")) {
+                element = new Thanks(line.substring(1));
+            } else {
+                StringBuilder contributions = new StringBuilder();
+                int j = i;
+                while (j + 1 < size) {
+                    String credit = this.lines.get(j + 1);
+                    if (credit.startsWith("--")) {
+                        if (contributions.isEmpty()) contributions.append("Contributions: \n");
+                        contributions.append(" • ").append(credit.substring(2).strip()).append("\n");
+                        j++;
+                    } else {
+                        break;
+                    }
+                }
+                i = j;
+                element = new Credit(line, contributions.toString());
+            }
+            if (element != null) {
+                this.creditsHeight += element.height(this);
+                this.creditElements.add(element);
+            }
+        }
     }
 
     @Override
@@ -92,7 +132,7 @@ public class ScreenCredits extends Screen {
 
     @Override
     public void tick() {
-        if (!this.playing) {
+        if (!this.playing || !SoundEngine.getSoundSystem().playing(SoundEngine.STREAMING)) {
             this.mc.sndManager.playMusic(SONGS[(int) (Math.random() * SONGS.length)], 0, 0, 0, 1.0f, 1.0f);
             this.playing = true;
         }
@@ -123,31 +163,37 @@ public class ScreenCredits extends Screen {
         drawStringCenteredNoShadow(this.fontRenderer, I18n.getInstance().translateKey("gui.credits.label.title"), this.width / 2, 5, 0xFFFFFF);
 
         Scissor.enable(0, this.top, this.width, this.bottom - this.top);
-        drawContent();
+        drawContent(mx, my, partialTick);
         Scissor.disable();
-
-        this.hue = (this.hue + 1) % 360f;
     }
 
-    private void drawContent() {
+    private void drawContent(int mx, int my, float partialTick) {
         this.mc.textureManager.loadTexture("/assets/minecraft/textures/gui/title/mclogo.png").bind();
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         drawTexturedModalRect(this.width / 2 - 274 / 2, 30 - (int) this.scrollAmount, 0, 0, 274, 50, 1d / 274, 1d / 50);
 
-        for (int i = 0; i < this.lines.size(); i++) {
-            String line = this.lines.get(i);
-            if (line.startsWith("*")) {
-                line = TextFormatting.BOLD + line.substring(1);
-                int lineWidth = MathHelper.ceil(this.fontRenderer.stringWidthDouble(line)) + line.length();
-                drawStringNoShadow(this.fontRenderer, line, this.width / 2 - lineWidth / 2, 100 + i * 12 - (int) this.scrollAmount, 0xFFFFFF);
-            } else if (line.startsWith("!")) {
-                int rgb = Color.HSBtoRGB(this.hue / 360f, 1.0f, 1.0f);
-                line = TextFormatting.BOLD + line.substring(1);
-                int lineWidth = MathHelper.ceil(this.fontRenderer.stringWidthDouble(line)) + line.length();
-                drawStringNoShadow(this.fontRenderer, line, this.width / 2 - lineWidth / 2, 100 + i * 12 - (int) this.scrollAmount, rgb);
-            } else {
-                drawStringNoShadow(this.fontRenderer, line, MathHelper.ceil((this.width - this.fontRenderer.stringWidthDouble(line)) / 2), 100 + i * 12 - (int) this.scrollAmount, 0x7F7F7F);
-            }
+        int y = (int) (100 - this.scrollAmount);
+        for (int i = 0, size = this.creditElements.size(); i < size; i++) {
+            CreditElement element = this.creditElements.get(i);
+
+            int elemWidth = element.width(this);
+            int elemHeight = element.height(this);
+
+            int minX = (this.width - elemWidth)/2;
+            int maxX = (this.width + elemWidth)/2;
+            int minY = y;
+            int maxY = y + elemHeight;
+
+//            drawBox(minX, minY, maxX, maxY, 0xFFAAAAAA, 1); // Render clickable box bounds
+
+            boolean hovered = minX <= mx && mx <= maxX && minY <= my && my <= maxY;
+
+            element.render(this, y, hovered, partialTick);
+            y += elemHeight + 1;
+        }
+
+        if (this.overlayElement != null) {
+            this.overlayElement.overlayRender(this, mx, my, partialTick);
         }
     }
 
@@ -200,6 +246,39 @@ public class ScreenCredits extends Screen {
 
         this.clickX = mx;
         this.clickY = my;
+
+        if (buttonNum == 0) {
+            if (this.overlayElement != null) {
+                int elemWidth = this.overlayElement.overlayWidth(this);
+                int elemHeight = this.overlayElement.overlayHeight(this);
+
+                int minX = this.overlayElement.overlayX(this);
+                int maxX = minX + elemWidth;
+                int minY = this.overlayElement.overlayY(this);
+                int maxY = minY + elemHeight;
+                if (minX > mx || mx > maxX || minY > my || my > maxY) {
+                    this.overlayElement = null;
+                }
+            } else {
+                int y = (int) (100 - this.scrollAmount);
+                for (int i = 0, size = this.creditElements.size(); i < size; i++) {
+                    CreditElement element = this.creditElements.get(i);
+
+                    int elemWidth = element.width(this);
+                    int elemHeight = element.height(this);
+
+                    int minX = (this.width - elemWidth)/2;
+                    int maxX = (this.width + elemWidth)/2;
+                    int minY = y;
+                    int maxY = y + elemHeight;
+                    if (minX <= mx && mx <= maxX && minY <= my && my <= maxY) {
+                        element.onClick(this);
+                        break;
+                    }
+                    y += elemHeight + 1;
+                }
+            }
+        }
     }
 
     @Override
@@ -254,7 +333,7 @@ public class ScreenCredits extends Screen {
     }
 
     private int getTotalPageHeight() {
-        return 100 + this.lines.size() * 12;
+        return 150 + this.creditsHeight;
     }
 
     @Override
@@ -266,4 +345,176 @@ public class ScreenCredits extends Screen {
             this.clickY = null;
         }
     }
+
+    @Override
+    public void keyPressed(char eventCharacter, int eventKey, int mx, int my) {
+        if (this.overlayElement != null) {
+            if (eventKey == Keyboard.KEY_BACK) {
+                this.overlayElement = null;
+            }
+            if (eventKey == Keyboard.KEY_ESCAPE) {
+                this.overlayElement = null;
+            }
+        } else {
+            super.keyPressed(eventCharacter, eventKey, mx, my);
+        }
+    }
+
+    public interface CreditElement {
+        void render(@NotNull ScreenCredits screenCredits, int y, boolean hovered, float partialTick);
+        void onClick(@NotNull ScreenCredits screenCredits);
+        int height(@NotNull ScreenCredits screenCredits);
+        int width(@NotNull ScreenCredits screenCredits);
+
+        default void overlayRender(@NotNull ScreenCredits screenCredits, int mx, int my, float partialTick) {}
+        default int overlayX(@NotNull ScreenCredits screenCredits) { return 0; }
+        default int overlayY(@NotNull ScreenCredits screenCredits) { return 0; }
+        default int overlayWidth(@NotNull ScreenCredits screenCredits) { return 0; }
+        default int overlayHeight(@NotNull ScreenCredits screenCredits) { return 0; }
+    }
+    public record Category(@NotNull String name) implements CreditElement {
+
+        @Override
+        public void render(@NotNull ScreenCredits screenCredits, int y, boolean hovered, float partialTick) {
+            screenCredits.fontRenderer.renderCentered(this.name, (screenCredits.width - this.name.length())/2, y).setZ(screenCredits.zLevel).setColor(0xFFFFFF).setBold().call();
+        }
+
+        @Override
+        public void onClick(@NotNull ScreenCredits screenCredits) {
+
+        }
+
+        @Override
+        public int height(@NotNull ScreenCredits screenCredits) {
+            return screenCredits.fontRenderer.getFont().fontHeight() + 1;
+        }
+
+        @Override
+        public int width(@NotNull ScreenCredits screenCredits) {
+            return MathHelper.ceil(screenCredits.fontRenderer.stringWidthDouble(this.name)) + this.name.length();
+        }
+    }
+    public record Credit(@NotNull String name, @NotNull String contributions) implements CreditElement{
+        @Override
+        public void render(@NotNull ScreenCredits screenCredits, int y, boolean hovered, float partialTick) {
+            screenCredits.fontRenderer.renderCentered(this.name, screenCredits.width/2, y).setZ(screenCredits.zLevel).setColor(hovered ? 0xFFFFA0 : 0x7F7F7F).call();
+        }
+
+        @Override
+        public void onClick(@NotNull ScreenCredits screenCredits) {
+            screenCredits.overlayElement = this;
+            screenCredits.mc.sndManager.playSound("random.click", SoundCategory.GUI_SOUNDS, 1.0F, 1.0F);
+        }
+
+        @Override
+        public int height(@NotNull ScreenCredits screenCredits) {
+            return screenCredits.fontRenderer.getFont().fontHeight() + 1;
+        }
+
+        @Override
+        public int width(@NotNull ScreenCredits screenCredits) {
+            return MathHelper.ceil(screenCredits.fontRenderer.stringWidthDouble(this.name));
+        }
+
+        @Override
+        public void overlayRender(@NotNull ScreenCredits screenCredits, int mx, int my, float partialTick) {
+            final int color = GameSettings.GUI_BACKGROUND_COLOR.value.getARGB();
+            screenCredits.drawGradientRect(0, 0, screenCredits.width, screenCredits.height, color, color);
+
+            int width = overlayWidth(screenCredits);
+            int height = overlayHeight(screenCredits);
+            int x = overlayX(screenCredits);
+            int y = overlayY(screenCredits);
+
+            int top = y + topSize(screenCredits);
+            int bottom = y + height - bottomSize(screenCredits);
+
+            screenCredits.drawRect(x - 1, y - 1, x + width + 1, y + height + 1, 0xFFA0A0A0);
+
+            TessellatorGeneral t = GLRenderer.getTessellator();
+            final float f = 32F;
+            t.startDrawingQuads();
+            screenCredits.mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
+            t.setColorOpaque1i(0x404040);
+            t.addVertexWithUV(x, y + height, 0.0D, 0.0D, (float) height / f);
+            t.addVertexWithUV(x + width, y + height, 0.0D, (float) width / f, (float) height / f);
+            t.addVertexWithUV(x + width, y, 0.0D, (float) width / f, 0);
+            t.addVertexWithUV(x, y, 0.0D, 0.0D, 0);
+
+            t.setColorOpaque1i(0x202020);
+            t.addVertexWithUV(x, bottom, 0.0D, 0, (float) (top - bottom) / f);
+            t.addVertexWithUV(x + width, bottom, 0.0D, (float) width / f, (float) (top - bottom) / f);
+            t.addVertexWithUV(x + width, top, 0.0D, (float) width / f, 0);
+            t.addVertexWithUV(x, top, 0.0D, 0, 0);
+
+            t.draw();
+
+            screenCredits.fontRenderer.renderWidthConstrained(this.name, (screenCredits.width - width)/2, y + 2, width - 20).setAlignment(Alignment.CENTERED).setZ(screenCredits.zLevel).setColor(0xFFFFFF).setBold().call();
+            screenCredits.fontRenderer.renderWidthConstrained(this.contributions, x + 1, y + topSize(screenCredits) + 2, width - 2).setColor(0x7F7F7F).call();
+        }
+
+        @Override
+        public int overlayX(@NotNull ScreenCredits screenCredits) {
+            return (screenCredits.width - overlayWidth(screenCredits))/2;
+        }
+
+        @Override
+        public int overlayY(@NotNull ScreenCredits screenCredits) {
+            return (screenCredits.height - overlayHeight(screenCredits))/2;
+        }
+
+        private int topSize(@NotNull ScreenCredits screenCredits) {
+            return (int) screenCredits.fontRenderer.heightOfConstrainedChars(this.name, overlayWidth(screenCredits) - 20) + 4;
+        }
+
+        private int bottomSize(@NotNull ScreenCredits screenCredits) {
+            return 0;
+        }
+
+        private int contentSize(@NotNull ScreenCredits screenCredits) {
+            if (this.contributions.isBlank()) return 0;
+            int width = overlayWidth(screenCredits);
+            return (int) screenCredits.fontRenderer.heightOfConstrainedChars(this.contributions, width) + 4;
+        }
+
+        @Override
+        public int overlayWidth(@NotNull ScreenCredits screenCredits) {
+            return 200;
+        }
+
+        @Override
+        public int overlayHeight(@NotNull ScreenCredits screenCredits) {
+            return topSize(screenCredits) + contentSize(screenCredits) + bottomSize(screenCredits);
+        }
+    }
+    public static class Thanks implements CreditElement {
+        private final @NotNull String message;
+
+        public Thanks(@NotNull String message) {
+            this.message = message;
+        }
+
+        private float hue = 0;
+        @Override
+        public void render(@NotNull ScreenCredits screenCredits, int y, boolean hovered, float partialTick) {
+            int rgb = Color.HSBtoRGB(this.hue / 360f, 1.0f, 1.0f);
+            screenCredits.fontRenderer.renderCentered(this.message, (screenCredits.width - this.message.length())/2, y).setZ(screenCredits.zLevel).setColor(rgb).setBold().call();
+            this.hue = (this.hue + 1) % 360f;
+        }
+
+        @Override
+        public void onClick(@NotNull ScreenCredits screenCredits) {
+
+        }
+
+        @Override
+        public int height(@NotNull ScreenCredits screenCredits) {
+            return screenCredits.fontRenderer.getFont().fontHeight() + 1;
+        }
+
+        @Override
+        public int width(@NotNull ScreenCredits screenCredits) {
+            return MathHelper.ceil(screenCredits.fontRenderer.stringWidthDouble(this.message)) - this.message.length();
+        }
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
index e75c5ebd0..5fe4cd627 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
@@ -374,15 +374,38 @@ public final class BlockModelDispatcher
         addDispatch(new BlockModelGenericTorch<>(Blocks.TORCH_REDSTONE_IDLE, "minecraft:block/torch_redstone_idle").render3D(false));
         addDispatch(new BlockModelGenericTorch<>(Blocks.TORCH_REDSTONE_ACTIVE, "minecraft:block/torch_redstone_active").render3D(false));
 
-        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_STONE, "minecraft:block/button/stone"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_STONE, "minecraft:block/button/stone/stone"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_BASALT, "minecraft:block/button/stone/basalt"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_LIMESTONE, "minecraft:block/button/stone/limestone"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_GRANITE, "minecraft:block/button/stone/granite"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_PERMAFROST, "minecraft:block/button/stone/permafrost"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_NETHERRACK, "minecraft:block/button/stone/netherrack"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_GLOOMSTONE, "minecraft:block/button/stone/gloomstone"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_SANDSTONE, "minecraft:block/button/stone/sandstone"));
+        addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_BRIMSTONE, "minecraft:block/button/stone/brimstone"));
         addDispatch(new BlockModelGenericButton<>(Blocks.BUTTON_PLANKS, "minecraft:block/button/planks/oak"));
         addDispatch(new BlockModelGenericButtonPainted<>(Blocks.BUTTON_PLANKS_PAINTED));
 
         addDispatch(new BlockModelGenericLever<>(Blocks.LEVER_COBBLE_STONE).render3D(false));
 
-        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_STONE, "minecraft:block/pressure_plate/stone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_STONE, "minecraft:block/pressure_plate/stone/stone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_BASALT, "minecraft:block/pressure_plate/stone/basalt"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_LIMESTONE, "minecraft:block/pressure_plate/stone/limestone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_GRANITE, "minecraft:block/pressure_plate/stone/granite"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_PERMAFROST, "minecraft:block/pressure_plate/stone/permafrost"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_NETHERRACK, "minecraft:block/pressure_plate/stone/netherrack"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_GLOOMSTONE, "minecraft:block/pressure_plate/stone/gloomstone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_SANDSTONE, "minecraft:block/pressure_plate/stone/sandstone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_BRIMSTONE, "minecraft:block/pressure_plate/stone/brimstone"));
+
         addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_PLANKS_OAK, "minecraft:block/pressure_plate/planks/oak"));
-        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_STONE, "minecraft:block/pressure_plate/cobbled_stone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_STONE, "minecraft:block/pressure_plate/cobbled/stone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_BASALT, "minecraft:block/pressure_plate/cobbled/basalt"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_LIMESTONE, "minecraft:block/pressure_plate/cobbled/limestone"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_GRANITE, "minecraft:block/pressure_plate/cobbled/granite"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_PERMAFROST, "minecraft:block/pressure_plate/cobbled/permafrost"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_NETHERRACK, "minecraft:block/pressure_plate/cobbled/netherrack"));
+        addDispatch(new BlockModelGenericPressurePlate<>(Blocks.PRESSURE_PLATE_COBBLE_GLOOMSTONE, "minecraft:block/pressure_plate/cobbled/gloomstone"));
         addDispatch(new BlockModelGenericPressurePlatePainted<>(Blocks.PRESSURE_PLATE_PLANKS_OAK_PAINTED));
 
         addDispatch(new BlockModelGenericVeryRotatable<>(Blocks.MOTION_SENSOR_IDLE, loadDataModel("minecraft:block/motion_sensor_idle")));
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/active.json
new file mode 100644
index 000000000..ec9406da9
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/idle.json
new file mode 100644
index 000000000..1d00ac2f3
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/inventory.json
new file mode 100644
index 000000000..1979eff8f
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/basalt/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/active.json
new file mode 100644
index 000000000..2b1f8486f
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/brimstone/top"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/idle.json
new file mode 100644
index 000000000..1b6e9b297
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/brimstone/top"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/inventory.json
new file mode 100644
index 000000000..7f9bf3f0b
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/brimstone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/brimstone/top"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/active.json
new file mode 100644
index 000000000..3d25d0f86
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/idle.json
new file mode 100644
index 000000000..4fcc65b00
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/inventory.json
new file mode 100644
index 000000000..0e1b6af20
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/gloomstone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/active.json
new file mode 100644
index 000000000..7f0e84e79
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/idle.json
new file mode 100644
index 000000000..9e8144b8a
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/inventory.json
new file mode 100644
index 000000000..a0366180c
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/granite/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/active.json
new file mode 100644
index 000000000..15d114b81
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/idle.json
new file mode 100644
index 000000000..165f0bc11
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/inventory.json
new file mode 100644
index 000000000..8f68bedce
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/limestone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/active.json
new file mode 100644
index 000000000..8fa60c78e
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/netherrack"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/idle.json
new file mode 100644
index 000000000..d3e91e918
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/netherrack"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/inventory.json
new file mode 100644
index 000000000..8e009c83f
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/netherrack/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/netherrack"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/active.json
new file mode 100644
index 000000000..925151f59
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/idle.json
new file mode 100644
index 000000000..64cd5d28f
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/inventory.json
new file mode 100644
index 000000000..72808d2db
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/permafrost/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/active.json
new file mode 100644
index 000000000..b3f9c6095
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/active",
+  "textures": {
+    "texture": "minecraft:block/sandstone/top"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/idle.json
new file mode 100644
index 000000000..a6e29bb70
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/idle",
+  "textures": {
+    "texture": "minecraft:block/sandstone/top"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/inventory.json
new file mode 100644
index 000000000..12c3371d0
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/sandstone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/button/inventory",
+  "textures": {
+    "texture": "minecraft:block/sandstone/top"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/stone/active.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/button/stone/active.json
rename to game/client/src/main/resources/assets/minecraft/models/block/button/stone/stone/active.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/stone/idle.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/button/stone/idle.json
rename to game/client/src/main/resources/assets/minecraft/models/block/button/stone/stone/idle.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/button/stone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/button/stone/stone/inventory.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/button/stone/inventory.json
rename to game/client/src/main/resources/assets/minecraft/models/block/button/stone/stone/inventory.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/active.json
new file mode 100644
index 000000000..e993f008b
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/cobbled_basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/idle.json
new file mode 100644
index 000000000..0c9728c8e
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/cobbled_basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/inventory.json
new file mode 100644
index 000000000..b471911d2
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/basalt/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/cobbled_basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/active.json
new file mode 100644
index 000000000..1861476f2
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/cobbled_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/idle.json
new file mode 100644
index 000000000..b3a02a69a
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/cobbled_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/inventory.json
new file mode 100644
index 000000000..793558e8c
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/gloomstone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/cobbled_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/active.json
new file mode 100644
index 000000000..3c317d36b
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/cobbled_granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/idle.json
new file mode 100644
index 000000000..6478c1941
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/cobbled_granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/inventory.json
new file mode 100644
index 000000000..88f64bea6
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/granite/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/cobbled_granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/active.json
new file mode 100644
index 000000000..2d625bbe8
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/cobbled_limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/idle.json
new file mode 100644
index 000000000..462d15788
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/cobbled_limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/inventory.json
new file mode 100644
index 000000000..8395213c8
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/limestone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/cobbled_limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/active.json
new file mode 100644
index 000000000..2a969b5b7
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/cobbled_netherrack/normal"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/idle.json
new file mode 100644
index 000000000..757e2c367
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/cobbled_netherrack/normal"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/inventory.json
new file mode 100644
index 000000000..ebf858d73
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/netherrack/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/cobbled_netherrack/normal"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/active.json
new file mode 100644
index 000000000..c31b5f1e6
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/cobbled_permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/idle.json
new file mode 100644
index 000000000..96957441a
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/cobbled_permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/inventory.json
new file mode 100644
index 000000000..ebc2580bf
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/permafrost/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/cobbled_permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled_stone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/stone/active.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled_stone/active.json
rename to game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/stone/active.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled_stone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/stone/idle.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled_stone/idle.json
rename to game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/stone/idle.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled_stone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/stone/inventory.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled_stone/inventory.json
rename to game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/cobbled/stone/inventory.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/active.json
new file mode 100644
index 000000000..b57b9847c
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/idle.json
new file mode 100644
index 000000000..682313c9d
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/inventory.json
new file mode 100644
index 000000000..1979a92ac
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/basalt/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/active.json
new file mode 100644
index 000000000..639df149e
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/active.json
@@ -0,0 +1,27 @@
+{
+    "textures": {
+        "texture": "minecraft:block/brimstone/side",
+        "top": "minecraft:block/brimstone/top",
+        "bottom": "minecraft:block/brimstone/bottom",
+        "overlay": "#texture",
+        "particle_up": "#texture",
+        "particle_down": "#texture",
+        "particle_north": "#texture",
+        "particle_south": "#texture",
+        "particle_west": "#texture",
+        "particle_east": "#texture"
+    },
+    "elements": [
+        {   "from": [ 1, 0, 1 ],
+            "to": [ 15, 0.5, 15 ],
+            "faces": {
+                "down":  { "uv": [ 1,    1, 15, 15 ], "texture": "#bottom", "cullface": "down" },
+                "up":    { "uv": [ 1,    1, 15, 15 ], "texture": "#top" },
+                "north": { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" },
+                "south": { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" },
+                "west":  { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" },
+                "east":  { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" }
+            }
+        }
+    ]
+}
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/idle.json
new file mode 100644
index 000000000..b929e64fe
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/idle.json
@@ -0,0 +1,27 @@
+{   "parent": "block/block_thin",
+    "textures": {
+        "texture": "minecraft:block/brimstone/side",
+        "top": "minecraft:block/brimstone/top",
+        "bottom": "minecraft:block/brimstone/bottom",
+        "overlay": "#texture",
+        "particle_up": "#texture",
+        "particle_down": "#texture",
+        "particle_north": "#texture",
+        "particle_south": "#texture",
+        "particle_west": "#texture",
+        "particle_east": "#texture"
+    },
+    "elements": [
+        {   "from": [ 1, 0, 1 ],
+            "to": [ 15, 1, 15 ],
+            "faces": {
+                "down":  { "uv": [ 1,  1, 15, 15 ], "texture": "#bottom", "cullface": "down" },
+                "up":    { "uv": [ 1,  1, 15, 15 ], "texture": "#top" },
+                "north": { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" },
+                "south": { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" },
+                "west":  { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" },
+                "east":  { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" }
+            }
+        }
+    ]
+}
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/inventory.json
new file mode 100644
index 000000000..b51977735
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/brimstone/inventory.json
@@ -0,0 +1,54 @@
+{
+	"format_version": "1.21.6",
+	"credit": "Made with Blockbench",
+	"parent": "block/block",
+	"display": {
+		"gui": {
+			"rotation": [ 30, 225, 0 ],
+			"translation": [ 0, 2, 0],
+			"scale":[ 0.625, 0.625, 0.625 ]
+		},
+		"thirdperson_righthand": {
+			"rotation": [ 75, 45, 0 ],
+			"translation": [ 0, 0.5, 2],
+			"scale": [ 0.375, 0.375, 0.375 ]
+		},
+		"firstperson_righthand": {
+			"rotation": [ 0, 45, 0 ],
+			"translation": [ 0, 2.2, 0 ],
+			"scale": [ 0.40, 0.40, 0.40 ]
+		},
+		"firstperson_lefthand": {
+			"rotation": [ 0, 225, 0 ],
+			"translation": [ 0, 2.2, 0 ],
+			"scale": [ 0.40, 0.40, 0.40 ]
+		}
+	},
+	"textures": {
+		"texture": "minecraft:block/brimstone/side",
+		"top": "minecraft:block/brimstone/top",
+		"bottom": "minecraft:block/brimstone/bottom",
+		"overlay": "#texture",
+		"particle_up": "#texture",
+		"particle_down": "#texture",
+		"particle_north": "#texture",
+		"particle_south": "#texture",
+		"particle_west": "#texture",
+		"particle_east": "#texture"
+	},
+	"elements": [
+		{
+			"from": [0, 0, 0],
+			"to": [16, 4, 16],
+			"rotation": {"angle": 0, "axis": "y", "origin": [-1, 0, -1]},
+			"faces": {
+				"north": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"east": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"south": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"west": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"up": {"uv": [0, 0, 16, 16], "texture": "#top"},
+				"down": {"uv": [0, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/active.json
new file mode 100644
index 000000000..0d0bb8b40
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/idle.json
new file mode 100644
index 000000000..f267786ac
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/inventory.json
new file mode 100644
index 000000000..2f7cc5e66
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/gloomstone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/active.json
new file mode 100644
index 000000000..fbfe790d4
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/idle.json
new file mode 100644
index 000000000..ee1281c76
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/inventory.json
new file mode 100644
index 000000000..ee4e43a5c
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/granite/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/granite"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/active.json
new file mode 100644
index 000000000..92e50eabe
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/idle.json
new file mode 100644
index 000000000..9766c790a
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/inventory.json
new file mode 100644
index 000000000..c69fc049c
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/limestone/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/limestone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/active.json
new file mode 100644
index 000000000..ea2d9ec49
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/netherrack"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/idle.json
new file mode 100644
index 000000000..18efe477f
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/netherrack"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/inventory.json
new file mode 100644
index 000000000..835ce70fa
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/netherrack/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/netherrack"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/active.json
new file mode 100644
index 000000000..296a2ce20
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/active.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/active",
+  "textures": {
+    "texture": "minecraft:block/permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/idle.json
new file mode 100644
index 000000000..cc1b05c01
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/idle.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/idle",
+  "textures": {
+    "texture": "minecraft:block/permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/inventory.json
new file mode 100644
index 000000000..62e1078ab
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/permafrost/inventory.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/pressure_plate/inventory",
+  "textures": {
+    "texture": "minecraft:block/permafrost"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/active.json
new file mode 100644
index 000000000..f4521b7e2
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/active.json
@@ -0,0 +1,27 @@
+{
+    "textures": {
+        "texture": "minecraft:block/sandstone/side",
+        "top": "minecraft:block/sandstone/top",
+        "bottom": "minecraft:block/sandstone/bottom",
+        "overlay": "#texture",
+        "particle_up": "#texture",
+        "particle_down": "#texture",
+        "particle_north": "#texture",
+        "particle_south": "#texture",
+        "particle_west": "#texture",
+        "particle_east": "#texture"
+    },
+    "elements": [
+        {   "from": [ 1, 0, 1 ],
+            "to": [ 15, 0.5, 15 ],
+            "faces": {
+                "down":  { "uv": [ 1,    1, 15, 15 ], "texture": "#bottom", "cullface": "down" },
+                "up":    { "uv": [ 1,    1, 15, 15 ], "texture": "#top" },
+                "north": { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" },
+                "south": { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" },
+                "west":  { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" },
+                "east":  { "uv": [ 1, 15, 15, 15.5 ], "texture": "#texture" }
+            }
+        }
+    ]
+}
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/idle.json
new file mode 100644
index 000000000..249121500
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/idle.json
@@ -0,0 +1,27 @@
+{   "parent": "block/block_thin",
+    "textures": {
+        "texture": "minecraft:block/sandstone/side",
+        "top": "minecraft:block/sandstone/top",
+        "bottom": "minecraft:block/sandstone/bottom",
+        "overlay": "#texture",
+        "particle_up": "#texture",
+        "particle_down": "#texture",
+        "particle_north": "#texture",
+        "particle_south": "#texture",
+        "particle_west": "#texture",
+        "particle_east": "#texture"
+    },
+    "elements": [
+        {   "from": [ 1, 0, 1 ],
+            "to": [ 15, 1, 15 ],
+            "faces": {
+                "down":  { "uv": [ 1,  1, 15, 15 ], "texture": "#bottom", "cullface": "down" },
+                "up":    { "uv": [ 1,  1, 15, 15 ], "texture": "#top" },
+                "north": { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" },
+                "south": { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" },
+                "west":  { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" },
+                "east":  { "uv": [ 1, 15, 15, 16 ], "texture": "#texture" }
+            }
+        }
+    ]
+}
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/inventory.json
new file mode 100644
index 000000000..978e1f42c
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/sandstone/inventory.json
@@ -0,0 +1,54 @@
+{
+	"format_version": "1.21.6",
+	"credit": "Made with Blockbench",
+	"parent": "block/block",
+	"display": {
+		"gui": {
+			"rotation": [ 30, 225, 0 ],
+			"translation": [ 0, 2, 0],
+			"scale":[ 0.625, 0.625, 0.625 ]
+		},
+		"thirdperson_righthand": {
+			"rotation": [ 75, 45, 0 ],
+			"translation": [ 0, 0.5, 2],
+			"scale": [ 0.375, 0.375, 0.375 ]
+		},
+		"firstperson_righthand": {
+			"rotation": [ 0, 45, 0 ],
+			"translation": [ 0, 2.2, 0 ],
+			"scale": [ 0.40, 0.40, 0.40 ]
+		},
+		"firstperson_lefthand": {
+			"rotation": [ 0, 225, 0 ],
+			"translation": [ 0, 2.2, 0 ],
+			"scale": [ 0.40, 0.40, 0.40 ]
+		}
+	},
+	"textures": {
+		"texture": "minecraft:block/sandstone/side",
+		"top": "minecraft:block/sandstone/top",
+		"bottom": "minecraft:block/sandstone/bottom",
+		"overlay": "#texture",
+		"particle_up": "#texture",
+		"particle_down": "#texture",
+		"particle_north": "#texture",
+		"particle_south": "#texture",
+		"particle_west": "#texture",
+		"particle_east": "#texture"
+	},
+	"elements": [
+		{
+			"from": [0, 0, 0],
+			"to": [16, 4, 16],
+			"rotation": {"angle": 0, "axis": "y", "origin": [-1, 0, -1]},
+			"faces": {
+				"north": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"east": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"south": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"west": {"uv": [0, 12, 16, 16], "texture": "#texture"},
+				"up": {"uv": [0, 0, 16, 16], "texture": "#top"},
+				"down": {"uv": [0, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/active.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/stone/active.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/active.json
rename to game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/stone/active.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/idle.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/stone/idle.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/idle.json
rename to game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/stone/idle.json
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/inventory.json b/game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/stone/inventory.json
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/inventory.json
rename to game/client/src/main/resources/assets/minecraft/models/block/pressure_plate/stone/stone/inventory.json
diff --git a/game/client/src/main/resources/credits.txt b/game/client/src/main/resources/credits.txt
index c5369ac55..6a970dbbe 100644
--- a/game/client/src/main/resources/credits.txt
+++ b/game/client/src/main/resources/credits.txt
@@ -6,6 +6,7 @@ jonkadelic
 Bestsoft100
 Bigjango
 Flamarine
+Kirisamé Soup (@kirisoup)
 Martin (@sunsetsatellite)
 MelonMojito (@watermelonmojito)
 NebulaBC
@@ -19,31 +20,69 @@ thaboar
 *Community Moderators
 Jej Chainstar
 Orknarok_666 (@derperu)
+Silvycakes (@sx22.)
 
 *Community Helpers
-bones (@frazzelbones)
-Crowbar
 Cruxy
-Silveon (sx22.)
+phoebruary
 
 *Special Thanks
 AndroidDr (@Pedro270707)
+--Brigadier command parser implementation
 Astronomical360
+--Eucalyptus log texture tweak
+bones (@frazzelbones)
+--Retired BTA helper
+Celeste
+--Alternate current mod implementation
 cloud54
+--Gloomstone textures
+--Marigold flower textures
+--Stacked flower textures
+--Timer texture
+Crowbar
+--Retired BTA helper
 DirtPiper
 Doop (@brokendoop)
+--Netherrack Textures
+--Steel fence
+--Cobbled gloomstone
+--Gloomstone bricks
+--Sorched Logs
 Gungun974
+--Improved packet processing
+--Bug fixes
 H2_AIL
+--Permafrost block sound
+--Achievement unlocked sound effect
+--Page turn sound effect
 LukeisStuff
+--Retired BTA helper
+--Textures
+--Nether update work
 mzov4j
+--Log top texture adjustments
+--Bone shale texture
+--Mossy cobblestone variants
+--Deer model
+PedroThePanda64 (@agreathornedowl)
+--Shader fixes and improvements
+--Dog music track fix
+ph
+--Venison texture
+phosphean
+--Rubyglass bud texture
+Rikai
+--Alternate current mod implementation
 Snowman64
+--7.2 Trailer
 Tocinin
+--Painting iron frame texture
+--Soul slate texture
+--Additional noteblock instruments
+--Reverse flag button texture
 Vivian (@vivianfox.)
 Zaraz7
-ph
-Rikai
-Celeste
-gregwoods
 
 !Thank you for playing
 !Better than Adventure!
\ No newline at end of file
diff --git a/game/client/src/main/resources/shaders/particle.vsh b/game/client/src/main/resources/shaders/particle.vsh
index 8e00c2704..fe9e62ba4 100644
--- a/game/client/src/main/resources/shaders/particle.vsh
+++ b/game/client/src/main/resources/shaders/particle.vsh
@@ -29,5 +29,5 @@ void main() {
     LightMapCoord = unpackLightCoord();
 
     TexCoord = aUv + (((aMesh * vec2(1, -1)) + vec2(1, 1))/2.0) * aUvSizes;
-    gl_Position = matrices.projection * matrices.view * model * (vec4(aPos, 1) + matrices.viewInv * vec4(aMesh.x,  aMesh.y, 0.0, 1.0) * aScale);
+    gl_Position = matrices.projection * matrices.view * model * (vec4(aPos, 1) + matrices.viewInv * vec4(aMesh, 0.0, 0.0) * aScale);
 }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java
index 9784c72c7..09d99f924 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java
@@ -87,7 +87,9 @@ public class BlockLogicRail extends BlockLogic implements ISupportable {
 
     @Override
     public void onPlacedByWorld(@NotNull World world, @NotNull TilePosc tilePos) {
+        world.noNeighborUpdate = true; // TODO: this should just be a temporary solution. refactor rails later!
         performRailTurn(world, tilePos, true);
+        world.noNeighborUpdate = false;
         if (this.block == Blocks.RAIL_POWERED) {
             onNeighborChanged(world, tilePos, this.block);
         }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicTorch.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicTorch.java
index 540fa475e..41b10f73c 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicTorch.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicTorch.java
@@ -5,7 +5,9 @@ import net.minecraft.core.block.support.ISupport;
 import net.minecraft.core.block.support.ISupportable;
 import net.minecraft.core.block.support.PartialSupport;
 import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
@@ -73,47 +75,23 @@ public class BlockLogicTorch extends BlockLogic implements ISupportable {
     }
 
     @Override
-    public void onPlacedByMob(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side, @NotNull Mob mob, double xHit, double yHit) {
-        if (side.isHorizontal()) side = side.opposite();
-        onPlacedOnSide(world, tilePos, side, xHit, yHit);
-    }
+    public int getPlacedData(
+        @Nullable Player player, @NotNull ItemStack itemStack, @NotNull World world,
+        @NotNull TilePosc tilePos, @NotNull Side side, double xHit, double yHit
+    ) {
+        if (player == null && side.isHorizontal()) side = side.opposite();
 
-    @Override
-    public void onPlacedOnSide(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side, double xHit, double yHit) {
         int orientation = SIDE_NONE;
-        if (side.isHorizontal()) side = side.opposite();
-        switch (side) {
-            case TOP:
-                if (isSupported(world, tilePos, Side.BOTTOM)) {
-                    orientation = SIDE_BOTTOM;
-                }
-                break;
-            case NORTH:
-                if (isSupported(world, tilePos, Side.SOUTH)) {
-                    orientation = SIDE_SOUTH;
-                }
-                break;
-            case SOUTH:
-                if (isSupported(world, tilePos, Side.NORTH)) {
-                    orientation = SIDE_NORTH;
-                }
-                break;
-            case WEST:
-                if (isSupported(world, tilePos, Side.EAST)) {
-                    orientation = SIDE_EAST;
-                }
-                break;
-            case EAST:
-                if (isSupported(world, tilePos, Side.WEST)) {
-                    orientation = SIDE_WEST;
-                }
-                break;
-        }
-        if (orientation == SIDE_NONE) {
-            orientation = getDefaultOrientation(world, tilePos);
-        }
-        world.setBlockDataNotify(tilePos, orientation);
-        dropTorchIfCantStay(world, tilePos);
+        if (isSupported(world, tilePos, side.opposite())) orientation = switch (side) {
+            default -> SIDE_NONE;
+            case TOP ->  SIDE_BOTTOM;
+            case NORTH ->  SIDE_SOUTH;
+            case SOUTH ->  SIDE_NORTH;
+            case WEST ->  SIDE_EAST;
+            case EAST ->  SIDE_WEST;
+        };
+        if (orientation == SIDE_NONE) orientation = getDefaultOrientation(world, tilePos);
+        return orientation;
     }
 
     public int getDefaultOrientation(@NotNull World world, @NotNull TilePosc tilePos) {
@@ -141,9 +119,12 @@ public class BlockLogicTorch extends BlockLogic implements ISupportable {
 
     @Override
     public void onPlacedByWorld(@NotNull World world, @NotNull TilePosc tilePos) {
-        int orientation = getDefaultOrientation(world, tilePos);
-        if (orientation != SIDE_NONE) {
-            world.setBlockDataNotify(tilePos, orientation);
+        int data = world.getBlockData(tilePos);
+        if (data == SIDE_NONE) {
+            int orientation = getDefaultOrientation(world, tilePos);
+            if (orientation != SIDE_NONE) {
+                world.setBlockDataNotify(tilePos, orientation);
+            }
         }
         dropTorchIfCantStay(world, tilePos);
     }
diff --git a/game/core/src/main/java/net/minecraft/core/block/Blocks.java b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
index ba2da2dcf..64ba75c1b 100644
--- a/game/core/src/main/java/net/minecraft/core/block/Blocks.java
+++ b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
@@ -1516,6 +1516,76 @@ public final class Blocks {
         .withSound(BlockSounds.SAND).withHardness(0.5f).withOverrideColor(MaterialColor.paintedYellow)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NETHER_SURFACE_BLOCK, BlockTags.NETHER_MOBS_SPAWN, BlockTags.CAVES_CUT_THROUGH, BlockTags.INFINITE_BURN_SULFURIC);
 
+    public static final @NotNull Block<?> PRESSURE_PLATE_COBBLE_BASALT = register("pressureplate.cobble.basalt", "minecraft:block/pressure_plate_cobble_basalt", 1100, (b) -> new BlockLogicPressurePlate<>(b, Player.class, Materials.BASALT))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_COBBLE_LIMESTONE = register("pressureplate.cobble.limestone", "minecraft:block/pressure_plate_cobble_limestone", 1101, (b) -> new BlockLogicPressurePlate<>(b, Player.class, Materials.LIMESTONE))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_COBBLE_GRANITE = register("pressureplate.cobble.granite", "minecraft:block/pressure_plate_cobble_granite", 1102, (b) -> new BlockLogicPressurePlate<>(b, Player.class, Materials.GRANITE))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_COBBLE_PERMAFROST = register("pressureplate.cobble.permafrost", "minecraft:block/pressure_plate_cobble_permafrost", 1103, (b) -> new BlockLogicPressurePlate<>(b, Player.class, Materials.PERMAFROST))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_COBBLE_NETHERRACK = register("pressureplate.cobble.netherrack", "minecraft:block/pressure_plate_cobble_netherrack", 1104, (b) -> new BlockLogicPressurePlate<>(b, Player.class, Materials.NETHERRACK))
+        .withSound(BlockSounds.STONE).withHardness(0.1F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_COBBLE_GLOOMSTONE = register("pressureplate.cobble.gloomstone", "minecraft:block/pressure_plate_cobble_gloomstone", 1105, (b) -> new BlockLogicPressurePlate<>(b, Player.class, Materials.GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    // 1106 and 1107 reserved for cobbled sandstone and brimstone
+
+    public static final @NotNull Block<?> PRESSURE_PLATE_BASALT = register("pressureplate.basalt", "minecraft:block/pressure_plate_basalt", 1110, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.BASALT))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_LIMESTONE = register("pressureplate.limestone", "minecraft:block/pressure_plate_limestone", 1111, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.LIMESTONE))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_GRANITE = register("pressureplate.granite", "minecraft:block/pressure_plate_granite", 1112, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.GRANITE))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_PERMAFROST = register("pressureplate.permafrost", "minecraft:block/pressure_plate_permafrost", 1113, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.PERMAFROST))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_NETHERRACK = register("pressureplate.netherrack", "minecraft:block/pressure_plate_netherrack", 1114, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.NETHERRACK))
+        .withSound(BlockSounds.STONE).withHardness(0.1F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_GLOOMSTONE = register("pressureplate.gloomstone", "minecraft:block/pressure_plate_gloomstone", 1115, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_SANDSTONE = register("pressureplate.sandstone", "minecraft:block/pressure_plate_sandstone", 1116, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.STONE))
+        .withSound(BlockSounds.STONE).withHardness(0.4F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> PRESSURE_PLATE_BRIMSTONE = register("pressureplate.brimstone", "minecraft:block/pressure_plate_brimstone", 1117, (b) -> new BlockLogicPressurePlate<>(b, Mob.class, Materials.STONE))
+        .withSound(BlockSounds.STONE).withHardness(0.9F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+
+    public static final @NotNull Block<?> BUTTON_BASALT = register("button.basalt", "minecraft:block/button_basalt", 1120, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> BUTTON_LIMESTONE = register("button.limestone", "minecraft:block/button_limestone", 1121, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> BUTTON_GRANITE = register("button.granite", "minecraft:block/button_granite", 1122, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> BUTTON_PERMAFROST = register("button.permafrost", "minecraft:block/button_permafrost", 1123, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> BUTTON_NETHERRACK = register("button.netherrack", "minecraft:block/button_netherrack", 1124, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.1F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> BUTTON_GLOOMSTONE = register("button.gloomstone", "minecraft:block/button_gloomstone", 1125, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> BUTTON_SANDSTONE = register("button.sandstone", "minecraft:block/button_sandstone", 1126, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.4F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+    public static final @NotNull Block<?> BUTTON_BRIMSTONE = register("button.brimstone", "minecraft:block/button_brimstone", 1127, BlockLogicButton::new)
+        .withSound(BlockSounds.STONE).withHardness(0.9F).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+
     public static <T extends BlockLogic> Block<T> register(String key, String namespaceId, int id, BlockLogicSupplier<T> logicSupplier) {
         Block<T> container = new Block<>(id, key, namespaceId, logicSupplier);
 
diff --git a/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBase.java b/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBase.java
index 5235ee1cb..596da0a28 100644
--- a/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBase.java
+++ b/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBase.java
@@ -512,8 +512,6 @@ public class BlockLogicPistonBase extends BlockLogic {
     @Override
     public void onPlacedByWorld(@NotNull World world, @NotNull TilePosc tilePos) {
         if (world.isClientSide) return;
-        final var d = NEW_FORMAT_SIGNATURE.set(world.getBlockData(tilePos), 1);
-        world.setBlockData(tilePos, d);
         this.signalUpdate(world, tilePos);
     }
 
@@ -584,6 +582,12 @@ public class BlockLogicPistonBase extends BlockLogic {
             : super.getPistonPushReaction(world, tilePos);
     }
 
+    @Override
+    public void onMoveComplete(@NotNull World world, @NotNull TilePosc tilePos) {
+        if (world.isClientSide) return;
+        this.signalUpdate(world, tilePos);
+    }
+
     @Override
     public void onRemoved(@NotNull World world, @NotNull TilePosc tilePos, int data) {
         data = fixLegacyBaseData(world, tilePos, this, data);
diff --git a/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java b/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
index 6d0139818..1ec5676fe 100644
--- a/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
+++ b/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
@@ -125,8 +125,30 @@ public class Registries extends Registry<Registry<?>> {
             woodenButtonsList.add(Blocks.BUTTON_PLANKS.getDefaultStack());
             woodenPressurePlatesList.add(Blocks.PRESSURE_PLATE_PLANKS_OAK.getDefaultStack());
             buttonsList.add(Blocks.BUTTON_STONE.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_BASALT.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_LIMESTONE.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_GRANITE.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_PERMAFROST.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_NETHERRACK.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_GLOOMSTONE.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_SANDSTONE.getDefaultStack());
+            buttonsList.add(Blocks.BUTTON_BRIMSTONE.getDefaultStack());
             pressurePlatesList.add(Blocks.PRESSURE_PLATE_STONE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_BASALT.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_LIMESTONE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_GRANITE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_PERMAFROST.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_NETHERRACK.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_GLOOMSTONE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_SANDSTONE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_BRIMSTONE.getDefaultStack());
             pressurePlatesList.add(Blocks.PRESSURE_PLATE_COBBLE_STONE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_COBBLE_BASALT.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_COBBLE_LIMESTONE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_COBBLE_GRANITE.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_COBBLE_PERMAFROST.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_COBBLE_NETHERRACK.getDefaultStack());
+            pressurePlatesList.add(Blocks.PRESSURE_PLATE_COBBLE_GLOOMSTONE.getDefaultStack());
 
             for (final DyeColor color : DyeColor.values()) {
                 plankStackList.add(new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, color.blockMeta));
diff --git a/game/core/src/main/java/net/minecraft/core/item/ItemPebble.java b/game/core/src/main/java/net/minecraft/core/item/ItemPebble.java
index 1cecb614d..2625ad6ef 100644
--- a/game/core/src/main/java/net/minecraft/core/item/ItemPebble.java
+++ b/game/core/src/main/java/net/minecraft/core/item/ItemPebble.java
@@ -94,7 +94,7 @@ public class ItemPebble extends Item implements IDispensable {
         }
 
         // Regular placement, as all else fails
-        if (world.canBlockIdBePlacedAt(Blocks.OVERLAY_PEBBLES.id(), blockPos, false, side) && !pebble.isSupported(world, blockPos, Side.BOTTOM)) {
+        if (world.canBlockIdBePlacedAt(Blocks.OVERLAY_PEBBLES.id(), blockPos, false, side) && pebble.isSupported(world, blockPos, Side.BOTTOM)) {
             if (world.setBlockTypeNotify(blockPos, Blocks.OVERLAY_PEBBLES)) {
                 Blocks.OVERLAY_PEBBLES.onPlacedByMob(world, blockPos, side, player, xHit, yHit);
                 world.playBlockSoundEffect(player, blockPos.x() + 0.5F, blockPos.y() + 0.5F, blockPos.z() + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
diff --git a/game/core/src/main/java/net/minecraft/core/item/block/ItemBlock.java b/game/core/src/main/java/net/minecraft/core/item/block/ItemBlock.java
index b49f0c2e6..ce196dd97 100644
--- a/game/core/src/main/java/net/minecraft/core/item/block/ItemBlock.java
+++ b/game/core/src/main/java/net/minecraft/core/item/block/ItemBlock.java
@@ -38,6 +38,12 @@ public class ItemBlock<T extends BlockLogic> extends Item {
         @NotNull ItemStack selfStack, @NotNull World world, @Nullable Player player,
         @NotNull TilePosc blockPos, @NotNull Side side, double xHit, double yHit
     ) {
+        final boolean placeNextToExisting = !world.canPlaceInsideBlock(blockPos) ||
+            (this.block.hasTag(BlockTags.PLACE_OVERWRITES) && this.block == world.getBlockType(blockPos));
+
+        if (placeNextToExisting) blockPos = blockPos.add(side.direction(), new TilePos());
+        if (!world.canBlockIdBePlacedAt(this.block.id(), blockPos, false, side)) return false;
+
         final int meta = getPlacedData(selfStack, world, player, blockPos, side, xHit, yHit);
         return this.placeWithMeta(selfStack, world, player, blockPos, meta, side, xHit, yHit);
     }
@@ -46,16 +52,7 @@ public class ItemBlock<T extends BlockLogic> extends Item {
         @NotNull ItemStack selfStack, @NotNull World world, @Nullable Player player,
         @NotNull TilePosc blockPos, int meta, @NotNull Side side, double xHit, double yHit
     ) {
-        if (selfStack.stackSize <= 0) {
-            return false;
-        }
-        final boolean placeNextToExisting = !world.canPlaceInsideBlock(blockPos) ||
-            (this.block.hasTag(BlockTags.PLACE_OVERWRITES) && this.block == world.getBlockType(blockPos));
-
-        if (placeNextToExisting) blockPos = blockPos.add(side.direction(), new TilePos());
-
-        if (!world.canBlockIdBePlacedAt(this.block.id(), blockPos, false, side)) return false;
-
+        if (selfStack.stackSize <= 0) return false;
         final var pbloc = world.getBlockType(blockPos);
         final int pdata = world.getBlockData(blockPos);
 
diff --git a/game/core/src/main/java/net/minecraft/core/player/inventory/CreativeBlocks.java b/game/core/src/main/java/net/minecraft/core/player/inventory/CreativeBlocks.java
index 3382db5d9..5056f4e21 100644
--- a/game/core/src/main/java/net/minecraft/core/player/inventory/CreativeBlocks.java
+++ b/game/core/src/main/java/net/minecraft/core/player/inventory/CreativeBlocks.java
@@ -431,11 +431,33 @@ public final class CreativeBlocks {
 		add(list, Blocks.LEVER_COBBLE_STONE);
 
 		add(list, Blocks.BUTTON_STONE);
+		add(list, Blocks.BUTTON_BASALT);
+		add(list, Blocks.BUTTON_LIMESTONE);
+		add(list, Blocks.BUTTON_GRANITE);
+		add(list, Blocks.BUTTON_PERMAFROST);
+		add(list, Blocks.BUTTON_NETHERRACK);
+		add(list, Blocks.BUTTON_GLOOMSTONE);
+		add(list, Blocks.BUTTON_SANDSTONE);
+		add(list, Blocks.BUTTON_BRIMSTONE);
 		add(list, Blocks.BUTTON_PLANKS);
 		addPainted(list, Blocks.BUTTON_PLANKS_PAINTED, painted(Blocks.BUTTON_PLANKS_PAINTED));
 
 		add(list, Blocks.PRESSURE_PLATE_STONE);
+		add(list, Blocks.PRESSURE_PLATE_BASALT);
+		add(list, Blocks.PRESSURE_PLATE_LIMESTONE);
+		add(list, Blocks.PRESSURE_PLATE_GRANITE);
+		add(list, Blocks.PRESSURE_PLATE_PERMAFROST);
+		add(list, Blocks.PRESSURE_PLATE_NETHERRACK);
+		add(list, Blocks.PRESSURE_PLATE_GLOOMSTONE);
+		add(list, Blocks.PRESSURE_PLATE_SANDSTONE);
+		add(list, Blocks.PRESSURE_PLATE_BRIMSTONE);
 		add(list, Blocks.PRESSURE_PLATE_COBBLE_STONE);
+		add(list, Blocks.PRESSURE_PLATE_COBBLE_BASALT);
+		add(list, Blocks.PRESSURE_PLATE_COBBLE_LIMESTONE);
+		add(list, Blocks.PRESSURE_PLATE_COBBLE_GRANITE);
+		add(list, Blocks.PRESSURE_PLATE_COBBLE_PERMAFROST);
+		add(list, Blocks.PRESSURE_PLATE_COBBLE_NETHERRACK);
+		add(list, Blocks.PRESSURE_PLATE_COBBLE_GLOOMSTONE);
 		add(list, Blocks.PRESSURE_PLATE_PLANKS_OAK);
 		addPainted(list, Blocks.PRESSURE_PLATE_PLANKS_OAK_PAINTED, painted(Blocks.PRESSURE_PLATE_PLANKS_OAK_PAINTED));
 
diff --git a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuTrommel.java b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuTrommel.java
index 05a3ef5ea..39b2c7c8b 100644
--- a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuTrommel.java
+++ b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuTrommel.java
@@ -113,7 +113,7 @@ public class MenuTrommel extends MenuAbstract {
 		if(action == InventoryAction.MOVE_SIMILAR) {
 			if(slot.index >= INVENTORY_SLOTS_START && slot.index < HOTBAR_SLOTS_START + ContainerInventory.HOTBAR_SIZE) {
 				// Full ContainerInventory
-				return getSlots(HOTBAR_SLOTS_START, ContainerInventory.MAIN_INVENTORY_SIZE, false);
+				return getSlots(INVENTORY_SLOTS_START, ContainerInventory.MAIN_INVENTORY_SIZE, false);
 			}
 		}
 		return null;
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java
index 9581f8d1c..f922fa452 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java
@@ -3,7 +3,7 @@ package net.minecraft.core.world.generate.feature;
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.block.BlockLogicChest;
-import net.minecraft.core.block.BlockLogicRotatable;
+import net.minecraft.core.block.BlockLogicSlab;
 import net.minecraft.core.block.entity.TileEntityChest;
 import net.minecraft.core.block.entity.TileEntityDispenser;
 import net.minecraft.core.block.entity.TileEntityMobSpawner;
@@ -14,6 +14,7 @@ import net.minecraft.core.enums.HumanArmorShape;
 import net.minecraft.core.item.IArmorItem;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.Items;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
@@ -37,10 +38,13 @@ public class WorldFeatureLabyrinth extends WorldFeature
     int brickBlockA = Blocks.BRICK_STONE_POLISHED.id();
     int brickBlockB = Blocks.BRICK_STONE_POLISHED_MOSSY.id();
     int slabBlock = Blocks.SLAB_STONE_POLISHED.id();
+    int pressurePlateBlock = Blocks.PRESSURE_PLATE_COBBLE_STONE.id();
     public ItemStack treasureItem;
     public WeightedRandomBag<WeightedRandomLootObject> chestLoot;
     public WeightedRandomBag<WeightedRandomLootObject> dispenserLoot;
     public WeightedRandomBag<String> spawnerMonsters;
+    public static final int wallTrapChanceInv = 32;
+    public static final int floorTrapChanceInv = 64;
 
     private int @Nullable[] platformPos = null;
     private int @Nullable[] lastDungeon = null;
@@ -61,6 +65,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
             brickBlockA = Blocks.BRICK_SANDSTONE.id();
             brickBlockB = Blocks.BRICK_SANDSTONE.id();
             slabBlock = Blocks.SLAB_SANDSTONE.id();
+            pressurePlateBlock = Blocks.PRESSURE_PLATE_SANDSTONE.id();
         }
         else if (biome == Biomes.OVERWORLD_TAIGA || biome == Biomes.OVERWORLD_TUNDRA || biome == Biomes.OVERWORLD_GLACIER)
         {
@@ -68,6 +73,8 @@ public class WorldFeatureLabyrinth extends WorldFeature
             wallBlockB = Blocks.COBBLE_PERMAFROST.id();
             brickBlockA = Blocks.BRICK_PERMAFROST.id();
             brickBlockB = Blocks.BRICK_PERMAFROST.id();
+            slabBlock = Blocks.SLAB_PERMAFROST_POLISHED.id();
+            pressurePlateBlock = Blocks.PRESSURE_PLATE_COBBLE_PERMAFROST.id();
             isCold = true;
         }
         else
@@ -88,6 +95,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
                 wallBlockB = Blocks.COBBLE_LIMESTONE_MOSSY.id();
                 brickBlockA = brickBlockB = Blocks.BRICK_LIMESTONE.id();
                 slabBlock = Blocks.SLAB_LIMESTONE_POLISHED.id();
+                pressurePlateBlock = Blocks.PRESSURE_PLATE_COBBLE_LIMESTONE.id();
             }
             else if (design == 2) // Granite
             {
@@ -95,6 +103,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
                 wallBlockB = Blocks.COBBLE_GRANITE_MOSSY.id();
                 brickBlockA = brickBlockB = Blocks.BRICK_GRANITE.id();
                 slabBlock = Blocks.SLAB_GRANITE_POLISHED.id();
+                pressurePlateBlock = Blocks.PRESSURE_PLATE_COBBLE_GRANITE.id();
             }
             else if (design == 3) // Basalt
             {
@@ -102,6 +111,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
                 wallBlockB = Blocks.COBBLE_BASALT_MOSSY.id();
                 brickBlockA = brickBlockB = Blocks.BRICK_BASALT.id();
                 slabBlock = Blocks.SLAB_BASALT_POLISHED.id();
+                pressurePlateBlock = Blocks.PRESSURE_PLATE_COBBLE_BASALT.id();
             }
         }
 
@@ -172,44 +182,37 @@ public class WorldFeatureLabyrinth extends WorldFeature
 
     public void generateBranch(World world, Random random, int blockX, int blockY, int blockZ)
     {
-        boolean generateTrapOnWall = false;
+        int xDir = Direction.EAST.id;
         for(int x = blockX - 2; x <= blockX + 2; x++) {
             boolean xWallCheck = x == blockX - 2 || x == blockX + 2;
+            if (x == blockX) xDir ^= 1;
+            
             for (int y = blockY - 2; y <= blockY + 1; y++) {
                 boolean yWallCheck = y == blockY - 2;
+                
+                int zDir = Direction.SOUTH.id;
                 for (int z = blockZ - 2; z <= blockZ + 2; z++) {
                     boolean zWallCheck = z == blockZ - 2 || z == blockZ + 2;
+                    if (z == blockZ) zDir ^= 1;
 
-                    if(canReplace(world, x, y, z)) {
-                        if (xWallCheck && zWallCheck) {
-                            world.setBlockWithNotify(x, y, z, random.nextInt(4) == 0 ? brickBlockB : brickBlockA);
-                        }
-                        else if (xWallCheck || zWallCheck) {
-                            world.setBlockWithNotify(x, y, z, wallBlockB);
-                        }
-                        else
-                        if (yWallCheck)
-                            world.setBlockWithNotify(x, y, z, wallBlockB);
-                        else world.setBlockWithNotify(x, y, z, 0);
+                    if (!canReplace(world, x, y, z)) continue;
 
-                        //generate traps
-                        if (!generateTrapOnWall && (xWallCheck || zWallCheck)) {
-                            if ((x == blockZ || z == blockZ) && y == blockY) {
-                                world.setBlockWithNotify(x, y, z, Blocks.MOTION_SENSOR_IDLE.id());
-                                BlockLogicRotatable.setDefaultDirection(world, new TilePos(x, y, z));
-                                world.setBlockWithNotify(x, y - 1, z, Blocks.DISPENSER_COBBLE_STONE.id());
-                                BlockLogicRotatable.setDefaultDirection(world, new TilePos(x, y - 1, z));
-                                TileEntityDispenser tileEntityDispenser = (TileEntityDispenser) world.getTileEntity(x, blockY - 1, z);
-                                int k4 = 0;
-                                while (k4 < 3) {
-                                    ItemStack itemstack = pickDispenserLootItem(random);
-                                    if (itemstack != null)
-                                        tileEntityDispenser.setItem(random.nextInt(tileEntityDispenser.getContainerSize()), itemstack);
-                                    k4++;
-                                }
-                                generateTrapOnWall = true;
+                    int block = 0;
+                    if (xWallCheck && zWallCheck) block = random.nextInt(4) == 0 ? brickBlockB : brickBlockA;
+                    else if (xWallCheck || zWallCheck || yWallCheck) block = wallBlockB;
 
-                            }
+                    world.setBlockWithNotify(x, y, z, block);
+                    
+                    switch (y - blockY) {
+                        case 0 -> {
+                            if (block == 0) break;
+                            if (random.nextInt(wallTrapChanceInv) != 0) break;
+                            placeWallTrap(world, random, x, y, z, (xWallCheck) ? xDir : zDir);
+                        }
+                        case -1 -> {
+                            if (block != 0) break;
+                            if (random.nextInt(floorTrapChanceInv) != 0) break;
+                            placeFloorTrap(world, random, x, y, z);
                         }
                     }
                 }
@@ -225,6 +228,28 @@ public class WorldFeatureLabyrinth extends WorldFeature
         }
     }
 
+    private void placeWallTrap(World world, Random random, int x, int y, int z, int dir) {
+        world.setBlockAndMetadataWithNotify(x, y, z, Blocks.MOTION_SENSOR_IDLE.id(), dir);
+        world.setBlockAndMetadataWithNotify(x, y-1, z, Blocks.DISPENSER_COBBLE_STONE.id(), dir);
+        final var dispenser = (TileEntityDispenser) world.getTileEntity(x, y-1, z);
+        for (int i = 0; i < 3; i++) {
+            ItemStack itemstack = pickDispenserLootItem(random);
+            if (itemstack != null)
+                dispenser.setItem(random.nextInt(dispenser.getContainerSize()), itemstack);
+        }
+    }
+
+    private void placeFloorTrap(World world, Random random, int x, int y, int z) {
+        world.setBlockAndMetadataWithNotify(x, y-1, z, Blocks.DISPENSER_COBBLE_STONE.id(), Direction.UP.id);
+        world.setBlockRaw(x, y, z, pressurePlateBlock);
+        final var dispenser = (TileEntityDispenser) world.getTileEntity(x, y-1, z);
+        for (int i = 0; i < 3; i++) {
+            ItemStack itemstack = pickDispenserLootItem(random);
+            if (itemstack != null)
+                dispenser.setItem(random.nextInt(dispenser.getContainerSize()), itemstack);
+        }
+    }
+
     public void generateDrop(World world, Random random, int blockX, int blockY, int blockZ)
     {
         if (random.nextBoolean()) generateDungeon(world, random, blockX, blockY, blockZ, false);
@@ -268,95 +293,90 @@ public class WorldFeatureLabyrinth extends WorldFeature
     private boolean canReplace(World world, int x, int y, int z){
         if(y <= 11)
             return false;
-        if(world.getBlockId(x, y, z) == (brickBlockA) || world.getBlockId(x, y, z) == Blocks.PLANKS_OAK.id() || world.getBlockId(x, y, z) == Blocks.COBWEB.id() || world.getBlockId(x, y, z) == Blocks.BOOKSHELF_PLANKS_OAK.id() || world.getBlockId(x, y, z) == Blocks.MOBSPAWNER.id() || world.getBlockId(x, y, z) == brickBlockB )
+        final var block = world.getBlockId(x, y, z);
+        if (block == (brickBlockA) || block == Blocks.PLANKS_OAK.id() || block == Blocks.COBWEB.id() || block == Blocks.BOOKSHELF_PLANKS_OAK.id() || block == Blocks.MOBSPAWNER.id() || block == brickBlockB )
             return false;
-        if(world.getBlockId(x, y, z) == Blocks.MOTION_SENSOR_IDLE.id() || world.getBlockId(x, y, z) == Blocks.DISPENSER_COBBLE_STONE.id() || world.getBlockId(x, y, z) == Blocks.MOTION_SENSOR_ACTIVE.id()) {
+        if (block == Blocks.MOTION_SENSOR_IDLE.id() || block == Blocks.MOTION_SENSOR_ACTIVE.id() || block == Blocks.DISPENSER_COBBLE_STONE.id()) {
             world.removeBlockTileEntity(x, y, z);
+            if (block == Blocks.DISPENSER_COBBLE_STONE.id()) remove_plate: {
+                if ((world.getBlockMetadata(x, y, z) & 0b111) != Direction.UP.id) break remove_plate;
+                if (world.getBlockId(x, y+1, z) != this.pressurePlateBlock) break remove_plate;
+                world.setBlockWithNotify(x, y+1, z, 0);
+            }
             world.setBlockWithNotify(x, y, z, 0);
             return true;
         }
-        return BlockTags.CAVES_CUT_THROUGH.appliesTo(world.getBlock(x, y, z)) ||
-                world.getBlockMaterial(x, y, z) == Materials.GRASS ||
-                world.getBlockMaterial(x, y, z) == Materials.DIRT ||
-                world.getBlockMaterial(x, y, z).isStone() ||
-                world.getBlockMaterial(x, y, z) == Materials.SAND ||
-                world.getBlockMaterial(x, y, z) == Materials.MOSS;
+        final var material = world.getBlockMaterial(x, y, z);
+        return BlockTags.CAVES_CUT_THROUGH.appliesTo(Blocks.getBlock(block)) ||
+            material == Materials.GRASS ||
+            material == Materials.DIRT ||
+            material.isStone() ||
+            material == Materials.SAND ||
+            material == Materials.MOSS;
     }
 
     private void generateCorridor(World world, Random random, int blockX, int blockY, int blockZ, int rot, int corridorIteration){
+        final int height = 2;
+        final int width = 2;
+        final int length = 2;
+
+        // imagine if java has `ref`
+        final int[] xz = new int[2];
+        final boolean[] xzWallCheck = new boolean[2];
+        final int[] xzDir = new int[2];
+        final int xOrZ = rot & 1;
+        final int zOrX = xOrZ ^ 1;
+        final int xzCenter = (xOrZ != 0) ? blockX : blockZ;
+        final int xzWidth = switch (rot) {
+            default -> 0;
+            case 0 -> +length;
+            case 2 -> -length;
+            case 1 -> -width;
+            case 3 -> +width;
+        };
+
+        xzDir[0] = Direction.EAST.id;
+        for (xz[0] = blockX - width; xz[0] <= blockX + width; xz[0]++) {
+            if (xz[0] == blockX) xzDir[0] ^= 1;
+            xzWallCheck[0] = Math.abs(xz[0] - blockX) == width;
+            for (int y = blockY - height; y <= blockY + (height - 1); y++) {
+                final boolean yWallCheck = y == blockY - height;
+                xzDir[1] = Direction.SOUTH.id;
+                for (xz[1] = blockZ - length; xz[1] <= blockZ + length; xz[1]++) {
+                    if (xz[1] == blockZ) xzDir[1] ^= 1;
+                    xzWallCheck[1] = Math.abs(xz[1] - blockZ) == width;
+
+                    if (!canReplace(world, xz[0], y, xz[1])) continue;
+                    if (xzWallCheck[0] || xzWallCheck[1] || yWallCheck) {
+                        final var isHollow = world.getBlockId(xz[0], y+1, xz[1]) == 0;
+                        if (isHollow && random.nextInt(3) > 0) continue;
+                    }
 
-        byte height = 2;
-        int width = 2;
-        int length = 2;
+                    int block = 0;
+                    if (yWallCheck) block = (random.nextInt(3) == 0) ? wallBlockB : wallBlockA;
+                    else if (xzWallCheck[xOrZ]) block = wallBlockA;
+                    else if (xz[zOrX] == xzCenter + xzWidth) block = wallBlockA;
 
-        for (int x = blockX - width; x <= blockX + width; x++) {
-            boolean xWallCheck = x == blockX - width || x == blockX + width;
-            for (int y = blockY - height; y <= blockY + (height - 1); y++) {
-                boolean yWallCheck = y == blockY - height;
-                for (int z = blockZ - length; z <= blockZ + length; z++) {
-                    boolean zWallCheck = z == blockZ - length || z == blockZ + length;
-                    //east
-                    if(canReplace(world, x, y, z)) {
-                        if((xWallCheck || zWallCheck || yWallCheck) && world.getBlockId(x, y+1, z) == 0 && random.nextInt(3) > 0)
-                            continue;
-                        if (rot == 0) {
-                            if (xWallCheck) {
-                                    world.setBlockWithNotify(x, y, z, wallBlockA);
-                            }
-                            else if (z == blockZ + length)
-                                world.setBlockWithNotify(x, y, z, wallBlockA);
-                            else if (yWallCheck) {
-                                if (random.nextInt(3) == 0)
-                                    world.setBlockWithNotify(x, y, z, wallBlockB);
-                                else
-                                    world.setBlockWithNotify(x, y, z, wallBlockA);
-                            }
-                            else world.setBlockWithNotify(x, y, z, 0);
-                        }
-                        //south
-                        else if (rot == 1) {
-                            if (x == blockX - width)
-                                world.setBlockWithNotify(x, y, z, wallBlockA);
-                            else if (zWallCheck)
-                                world.setBlockWithNotify(x, y, z, wallBlockA);
-                            else if (yWallCheck) {
-                                if (random.nextInt(3) == 0)
-                                    world.setBlockWithNotify(x, y, z, wallBlockB);
-                                else
-                                    world.setBlockWithNotify(x, y, z, wallBlockA);
-                            }
-                            else world.setBlockWithNotify(x, y, z, 0);
-                        }
-                        //west
-                        else if (rot == 2) {
-                            if (xWallCheck)
-                                world.setBlockWithNotify(x, y, z, wallBlockA);
-                            else if (z == blockZ - length)
-                                world.setBlockWithNotify(x, y, z, wallBlockA);
-                            else if (yWallCheck){
-                                if (random.nextInt(3) == 0)
-                                    world.setBlockWithNotify(x, y, z, wallBlockB);
-                                else
-                                    world.setBlockWithNotify(x, y, z, wallBlockA);
-                            }
-                            else world.setBlockWithNotify(x, y, z, 0);
+                    boolean isHollowSection = block == 0;
+
+                    if (isHollowSection) cobweb: {
+                        if (xzWallCheck[0] || xzWallCheck[1]) break cobweb;
+                        if (y != blockY + height - 1) break cobweb;
+                        if (random.nextInt(20) == 0) block = Blocks.COBWEB.id();
+                    }
+                    world.setBlockWithNotify(xz[0], y, xz[1], block);
+
+                    switch (y - blockY) {
+                        case 0 -> {
+                            if (isHollowSection) break;
+                            if (random.nextInt(wallTrapChanceInv) != 0) break;
+                            placeWallTrap(world, random, xz[0], y, xz[1], xzDir[xOrZ]);
                         }
-                        //north
-                        else {
-                            if (x == blockX + width)
-                                world.setBlockWithNotify(x, y, z, wallBlockA);
-                            else if (zWallCheck)
-                                world.setBlockWithNotify(x, y, z, wallBlockA);
-                            else if (yWallCheck){
-                                if (random.nextInt(3) == 0)
-                                    world.setBlockWithNotify(x, y, z, wallBlockB);
-                                else
-                                    world.setBlockWithNotify(x, y, z, wallBlockA);
-                            }
-                            else world.setBlockWithNotify(x, y, z, 0);
+                        case -height + 1 -> {
+                            if (!isHollowSection) break;
+                            if (random.nextInt(floorTrapChanceInv) != 0) break;
+                            placeFloorTrap(world, random, xz[0], y, xz[1]);
                         }
-                        if(y == blockY + (height - 1) && !zWallCheck && !xWallCheck && random.nextInt(20)==0)
-                            world.setBlockWithNotify(x, y, z, Blocks.COBWEB.id());
                     }
                 }
             }
@@ -500,8 +520,14 @@ public class WorldFeatureLabyrinth extends WorldFeature
                                     else
                                         world.setBlockWithNotify(x, y, z, Blocks.LOG_OAK.id());
                             }
-                            else
-                                world.setBlockWithNotify(x, y, z, 0);
+                            else {
+                                final var placesTrap =
+                                    y == blockY - 1 &&
+                                    Math.min(Math.abs(x - blockX), Math.abs(z - blockZ)) >= 2 &&
+                                    random.nextInt(floorTrapChanceInv) == 0;
+                                if (placesTrap) placeFloorTrap(world, random, x, y, z);
+                                else world.setBlockWithNotify(x, y, z, 0);
+                            }
                         } else
                             world.setBlockWithNotify(x, y, z, 0);
                         if (zRoom % 2 == 0
@@ -547,7 +573,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
                                 if (x == blockX || z == blockZ) {
                                     world.setBlockWithNotify(x, y, z, isCold ? Blocks.OBSIDIAN.id() : Blocks.FLUID_LAVA_FLOWING.id());
                                 } else {
-                                    world.setBlockWithNotify(x, y, z, slabBlock);
+                                    world.setBlockAndMetadataWithNotify(x, y, z, slabBlock, BlockLogicSlab.STATE_DOUBLE);
                                 }
                             else if (random.nextInt(5) == 0)
                                 world.setBlockWithNotify(x, y, z, wallBlockB);
@@ -581,7 +607,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
         for (int x = blockX - 1; x <= blockX + 1; x++) {
             for (int z = blockZ - 1; z <= blockZ + 1; z++) {
                 if (x == blockX && z == blockZ) {
-                    world.setBlockAndMetadataWithNotify(x, blockY - 1, z, slabBlock, 1);
+                    world.setBlockAndMetadataWithNotify(x, blockY - 1, z, slabBlock, BlockLogicSlab.STATE_DOUBLE);
                 } else {
                     world.setBlockWithNotify(x, blockY - 1, z, slabBlock);
                 }
diff --git a/game/core/src/main/resources/assets/minecraft/lang/en_US/tile.lang b/game/core/src/main/resources/assets/minecraft/lang/en_US/tile.lang
index f337b2865..4b50a3e00 100644
--- a/game/core/src/main/resources/assets/minecraft/lang/en_US/tile.lang
+++ b/game/core/src/main/resources/assets/minecraft/lang/en_US/tile.lang
@@ -719,6 +719,23 @@ tile.torch.redstone.active.desc=Emits a constant redstone signal.
 
 tile.button.stone.name=Stone Button
 tile.button.stone.desc=Emits a brief redstone signal when pressed.
+tile.button.basalt.name=Basalt Button
+tile.button.basalt.desc=Emits a brief redstone signal when pressed.
+tile.button.limestone.name=Limestnoe Button
+tile.button.limestone.desc=Emits a brief redstone signal when pressed.
+tile.button.granite.name=Granite Button
+tile.button.granite.desc=Emits a brief redstone signal when pressed.
+tile.button.permafrost.name=Permafrost Button
+tile.button.permafrost.desc=Emits a brief redstone signal when pressed.
+tile.button.netherrack.name=Netherrack Button
+tile.button.netherrack.desc=Emits a brief redstone signal when pressed.
+tile.button.gloomstone.name=Gloomstone Button
+tile.button.gloomstone.desc=Emits a brief redstone signal when pressed.
+tile.button.sandstone.name=Sandstone Button
+tile.button.sandstone.desc=Emits a brief redstone signal when pressed.
+tile.button.brimstone.name=Brimstone Button
+tile.button.brimstone.desc=Emits a brief redstone signal when pressed.
+
 tile.button.planks.name=Wooden Button
 tile.button.planks.desc=Emits a brief redstone signal when pressed.
 
@@ -762,10 +779,40 @@ tile.lever.cobble.stone.desc=Allows turning a redstone signal on or off.
 
 tile.pressureplate.stone.name=Stone Pressure Plate
 tile.pressureplate.stone.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.basalt.name=Basalt Pressure Plate
+tile.pressureplate.basalt.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.limestone.name=Limestone Pressure Plate
+tile.pressureplate.limestone.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.granite.name=Granite Pressure Plate
+tile.pressureplate.granite.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.permafrost.name=Permafrost Pressure Plate
+tile.pressureplate.permafrost.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.netherrack.name=Netherrack Pressure Plate
+tile.pressureplate.netherrack.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.gloomstone.name=Gloomstone Pressure Plate
+tile.pressureplate.gloomstone.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.sandstone.name=Sandstone Pressure Plate
+tile.pressureplate.sandstone.desc=Emits a redstone signal when living creatures step on it.
+tile.pressureplate.brimstone.name=Brimstone Pressure Plate
+tile.pressureplate.brimstone.desc=Emits a redstone signal when living creatures step on it.
+
 tile.pressureplate.planks.oak.name=Wooden Pressure Plate
 tile.pressureplate.planks.oak.desc=Emits a redstone signal when anything steps on it.
+
 tile.pressureplate.cobble.stone.name=Cobblestone Pressure Plate
 tile.pressureplate.cobble.stone.desc=Emits a redstone signal when players step on it.
+tile.pressureplate.cobble.basalt.name=Cobbled Basalt Pressure Plate
+tile.pressureplate.cobble.basalt.desc=Emits a redstone signal when players step on it.
+tile.pressureplate.cobble.limestone.name=Cobbled Limestone Pressure Plate
+tile.pressureplate.cobble.limestone.desc=Emits a redstone signal when players step on it.
+tile.pressureplate.cobble.granite.name=Cobbled Granite Pressure Plate
+tile.pressureplate.cobble.granite.desc=Emits a redstone signal when players step on it.
+tile.pressureplate.cobble.permafrost.name=Cobbled Permafrost Pressure Plate
+tile.pressureplate.cobble.permafrost.desc=Emits a redstone signal when players step on it.
+tile.pressureplate.cobble.netherrack.name=Cobbled Netherrack Pressure Plate
+tile.pressureplate.cobble.netherrack.desc=Emits a redstone signal when players step on it.
+tile.pressureplate.cobble.gloomstone.name=Cobbled Gloomstone Pressure Plate
+tile.pressureplate.cobble.gloomstone.desc=Emits a redstone signal when players step on it.
 
 tile.pressureplate.planks.oak.painted.name=Mystery Wooden Plate
 tile.pressureplate.planks.oak.painted.desc=Emits a redstone signal when anything steps on it.
