From 59524fdb8045b51f4f059a91113ea4a1cf6a132a Mon Sep 17 00:00:00 2001
From: Bukkit/Spigot <noreply+git-bukkit@papermc.io>
Date: Sat, 15 Jan 2011 20:58:34 +0000
Subject: [PATCH] Added Button MaterialData

By: Dinnerbone <dinnerbone@dinnerbone.com>
---
 .../src/main/java/org/bukkit/Material.java    |  2 +-
 .../main/java/org/bukkit/material/Button.java | 58 +++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 paper-api/src/main/java/org/bukkit/material/Button.java

diff --git a/paper-api/src/main/java/org/bukkit/Material.java b/paper-api/src/main/java/org/bukkit/Material.java
index f15acb4073..83d096e4c9 100644
--- a/paper-api/src/main/java/org/bukkit/Material.java
+++ b/paper-api/src/main/java/org/bukkit/Material.java
@@ -79,7 +79,7 @@ public enum Material {
     GLOWING_REDSTONE_ORE(74),
     REDSTONE_TORCH_OFF(75, RedstoneTorch.class),
     REDSTONE_TORCH_ON(76, RedstoneTorch.class),
-    STONE_BUTTON(77),
+    STONE_BUTTON(77, Button.class),
     SNOW(78),
     ICE(79),
     SNOW_BLOCK(80),
diff --git a/paper-api/src/main/java/org/bukkit/material/Button.java b/paper-api/src/main/java/org/bukkit/material/Button.java
new file mode 100644
index 0000000000..75b4d3dad1
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/material/Button.java
@@ -0,0 +1,58 @@
+
+package org.bukkit.material;
+
+import org.bukkit.BlockFace;
+import org.bukkit.Material;
+
+/**
+ * Represents a button
+ */
+public class Button extends MaterialData implements Redstone, Attachable {
+    public Button(final int type) {
+        super(type);
+    }
+
+    public Button(final Material type) {
+        super(type);
+    }
+
+    public Button(final int type, final byte data) {
+        super(type, data);
+    }
+
+    public Button(final Material type, final byte data) {
+        super(type, data);
+    }
+
+    /**
+     * Gets the current state of this Material, indicating if it's powered or
+     * unpowered
+     *
+     * @return true if powered, otherwise false
+     */
+    public boolean isPowered() {
+        return (getData() & 0x8) == 0x8;
+    }
+
+    /**
+     * Gets the face that this block is attached on
+     *
+     * @return BlockFace attached to
+     */
+    public BlockFace getAttachedFace() {
+        byte data = (byte) (getData() ^ 0x8);
+
+        switch (data) {
+            case 0x1:
+                return BlockFace.NORTH;
+            case 0x2:
+                return BlockFace.SOUTH;
+            case 0x3:
+                return BlockFace.EAST;
+            case 0x4:
+                return BlockFace.WEST;
+        }
+
+        return null;
+    }
+}