From 23b276843f15ed5f081892f0e06a3feefcd88fdf Mon Sep 17 00:00:00 2001 From: CraftBukkit/Spigot Date: Sat, 13 Dec 2014 17:26:00 +0100 Subject: [PATCH] Fix the spawning of HangingEntities by picking the right direction Related to SPIGOT-206. Currently HangingEntities should be located next to the block they are hanging on. With the direction set to the opposite of the block they are hanging from. This code is modified to find the correct direction. By: Stefan --- .../org/bukkit/craftbukkit/CraftWorld.java | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 83efd6ae15..a7d3e5fa59 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -1018,32 +1018,18 @@ public class CraftWorld implements World { } else if (Hanging.class.isAssignableFrom(clazz)) { Block block = getBlockAt(location); BlockFace face = BlockFace.SELF; - if (block.getRelative(BlockFace.EAST).getTypeId() == 0) { - face = BlockFace.EAST; - } else if (block.getRelative(BlockFace.NORTH).getTypeId() == 0) { - face = BlockFace.NORTH; - } else if (block.getRelative(BlockFace.WEST).getTypeId() == 0) { - face = BlockFace.WEST; - } else if (block.getRelative(BlockFace.SOUTH).getTypeId() == 0) { - face = BlockFace.SOUTH; - } - EnumDirection dir; - switch (face) { - case SOUTH: - default: - dir = EnumDirection.SOUTH; - break; - case WEST: - dir = EnumDirection.WEST; - break; - case NORTH: - dir = EnumDirection.NORTH; - break; - case EAST: - dir = EnumDirection.EAST; - break; + + BlockFace[] faces = new BlockFace[]{BlockFace.EAST,BlockFace.NORTH,BlockFace.WEST,BlockFace.SOUTH}; + for(BlockFace dir : faces){ + net.minecraft.server.Block nmsBlock = CraftMagicNumbers.getBlock(block.getRelative(dir)); + if(nmsBlock.getMaterial().isBuildable() || BlockDiodeAbstract.d(nmsBlock)) { + face = dir; + break; + } } + EnumDirection dir = CraftBlock.blockFaceToNotch(face).opposite(); + if (Painting.class.isAssignableFrom(clazz)) { entity = new EntityPainting(world, new BlockPosition((int) x, (int) y, (int) z), dir); } else if (ItemFrame.class.isAssignableFrom(clazz)) {