From a9fa5bd1553a49136f5bd02cdcb57f844625f78e Mon Sep 17 00:00:00 2001
From: BuildTools <unconfigured@null.spigotmc.org>
Date: Sun, 4 Apr 2021 20:16:05 +0200
Subject: [PATCH] Added Shulker Peek and AttachedFace Methods


diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityShulker.java b/src/main/java/net/minecraft/world/entity/monster/EntityShulker.java
index bfecaa56..4cf9be60 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityShulker.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityShulker.java
@@ -1,6 +1,7 @@
 package net.minecraft.world.entity.monster;
 
 import java.util.EnumSet;
+
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
@@ -57,7 +58,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
 
     private static final UUID bp = UUID.fromString("7E0292F2-9434-48D5-A29F-9583AF7DF27F");
     private static final AttributeModifier bq = new AttributeModifier(EntityShulker.bp, "Covered armor bonus", 20.0D, AttributeModifier.Operation.ADDITION);
-    protected static final DataWatcherObject<EnumDirection> b = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.n);
+    public static final DataWatcherObject<EnumDirection> ATTACHFACE = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.n);
     protected static final DataWatcherObject<Optional<BlockPosition>> c = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.m);
     protected static final DataWatcherObject<Byte> d = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.a);
     public static final DataWatcherObject<Byte> COLOR = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.a);
@@ -118,7 +119,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
     @Override
     protected void initDatawatcher() {
         super.initDatawatcher();
-        this.datawatcher.register(EntityShulker.b, EnumDirection.DOWN);
+        this.datawatcher.register(EntityShulker.ATTACHFACE, EnumDirection.DOWN);
         this.datawatcher.register(EntityShulker.c, Optional.empty());
         this.datawatcher.register(EntityShulker.d, (byte) 0);
         this.datawatcher.register(EntityShulker.COLOR, (byte) 16);
@@ -136,7 +137,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
     @Override
     public void loadData(NBTTagCompound nbttagcompound) {
         super.loadData(nbttagcompound);
-        this.datawatcher.set(EntityShulker.b, EnumDirection.fromType1(nbttagcompound.getByte("AttachFace")));
+        this.datawatcher.set(EntityShulker.ATTACHFACE, EnumDirection.fromType1(nbttagcompound.getByte("AttachFace")));
         this.datawatcher.set(EntityShulker.d, nbttagcompound.getByte("Peek"));
         this.datawatcher.set(EntityShulker.COLOR, nbttagcompound.getByte("Color"));
         if (nbttagcompound.hasKey("APX")) {
@@ -154,7 +155,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
     @Override
     public void saveData(NBTTagCompound nbttagcompound) {
         super.saveData(nbttagcompound);
-        nbttagcompound.setByte("AttachFace", (byte) ((EnumDirection) this.datawatcher.get(EntityShulker.b)).c());
+        nbttagcompound.setByte("AttachFace", (byte) ((EnumDirection) this.datawatcher.get(EntityShulker.ATTACHFACE)).c());
         nbttagcompound.setByte("Peek", (Byte) this.datawatcher.get(EntityShulker.d));
         nbttagcompound.setByte("Color", (Byte) this.datawatcher.get(EntityShulker.COLOR));
         BlockPosition blockposition = this.eM();
@@ -217,7 +218,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
                 EnumDirection enumdirection1 = this.g(blockposition);
 
                 if (enumdirection1 != null) {
-                    this.datawatcher.set(EntityShulker.b, enumdirection1);
+                    this.datawatcher.set(EntityShulker.ATTACHFACE, enumdirection1);
                 } else {
                     this.eK();
                 }
@@ -335,7 +336,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
                             return false;
                         }
                         // CraftBukkit end
-                        this.datawatcher.set(EntityShulker.b, enumdirection);
+                        this.datawatcher.set(EntityShulker.ATTACHFACE, enumdirection);
                         this.playSound(SoundEffects.ENTITY_SHULKER_TELEPORT, 1.0F, 1.0F);
                         this.datawatcher.set(EntityShulker.c, Optional.of(blockposition1));
                         this.datawatcher.set(EntityShulker.d, (byte) 0);
@@ -413,7 +414,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
     }
 
     public EnumDirection eL() {
-        return (EnumDirection) this.datawatcher.get(EntityShulker.b);
+        return (EnumDirection) this.datawatcher.get(EntityShulker.ATTACHFACE);
     }
 
     @Nullable
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java
index 6fc7d2a0..d2caa33d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java
@@ -1,7 +1,9 @@
 package org.bukkit.craftbukkit.entity;
 
+import net.minecraft.core.EnumDirection;
 import net.minecraft.world.entity.monster.EntityShulker;
 import org.bukkit.DyeColor;
+import org.bukkit.block.BlockFace;
 import org.bukkit.craftbukkit.CraftServer;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Shulker;
@@ -36,4 +38,101 @@ public class CraftShulker extends CraftGolem implements Shulker {
     public void setColor(DyeColor color) {
         getHandle().getDataWatcher().set(EntityShulker.COLOR, (color == null) ? 16 : color.getWoolData());
     }
+
+	@Override
+	public boolean isPeeking() {
+		int v = getHandle().eN();
+		return v > 0 && v <= 30;
+	}
+
+	@Override
+	public boolean isClosed() {
+		return getHandle().eN() == 0;
+	}
+
+	@Override
+	public boolean isOpen() {
+		return getHandle().eN() > 30;
+	}
+
+	@Override
+	public void setPeeking() {
+		getHandle().a(30);
+	}
+
+	@Override
+	public void setOpen() {
+		getHandle().a(100);
+	}
+
+	@Override
+	public void setClosed() {
+		getHandle().a(0);
+	}
+
+	@Override
+	public void setCustomPeek(byte b) {
+		getHandle().a(b);
+	}
+
+	@Override
+	public BlockFace getAttachedFace() {
+		EnumDirection ed = getHandle().eL();
+		
+		switch(ed) {
+			case DOWN: return BlockFace.DOWN;
+			case UP: return BlockFace.UP;
+			case NORTH: return BlockFace.NORTH;
+			case EAST: return BlockFace.EAST;
+			case SOUTH: return BlockFace.SOUTH;
+			case WEST: return BlockFace.WEST;
+		}
+		
+		return null;
+	}
+
+	@Override
+	public void setAttachedFace(BlockFace bf) {
+		
+		EnumDirection ed = null;
+		
+		switch(bf) {
+			case DOWN: 
+				ed = EnumDirection.DOWN; 
+				break;
+			case UP: 
+				ed = EnumDirection.UP;
+				break;
+			case NORTH: 
+				ed = EnumDirection.NORTH;
+				break;
+			case EAST: 
+				ed = EnumDirection.EAST;
+				break;
+			case SOUTH: 
+				ed = EnumDirection.SOUTH;
+				break;
+			case WEST: 
+				ed = EnumDirection.WEST;
+				break;
+			default:
+				throw new IllegalArgumentException("The BlockFace " + bf.name() + " is not valid for Shulkers!");
+		}
+		
+		getHandle().getDataWatcher().set(EntityShulker.ATTACHFACE, ed);
+		
+	}
+	
+	
+	
+	
 }
+
+
+
+
+
+
+
+
+
-- 
2.31.1.windows.1