diff --git a/src/main/java/net/glowstone/block/blocktype/BlockNeedsAttached.java b/src/main/java/net/glowstone/block/blocktype/BlockNeedsAttached.java index b30e33b890..0f041f0a59 100644 --- a/src/main/java/net/glowstone/block/blocktype/BlockNeedsAttached.java +++ b/src/main/java/net/glowstone/block/blocktype/BlockNeedsAttached.java @@ -30,6 +30,14 @@ public void updatePhysics(GlowBlock me) { } } + /** + * Called to determine if the target block can be attached to + * when right clicking it. + * + * @param block The location the block is being placed at. + * @param against The face the block is being placed against. + * @return Whether the black can be attached to. + */ public boolean canAttachTo(GlowBlock block, BlockFace against) { return !(ItemTable.instance().getBlock( block.getRelative(against.getOppositeFace()).getType()) instanceof BlockNeedsAttached); diff --git a/src/main/java/net/glowstone/block/blocktype/BlockSign.java b/src/main/java/net/glowstone/block/blocktype/BlockSign.java index 8e979d677d..f25b972446 100644 --- a/src/main/java/net/glowstone/block/blocktype/BlockSign.java +++ b/src/main/java/net/glowstone/block/blocktype/BlockSign.java @@ -2,6 +2,7 @@ import net.glowstone.block.GlowBlock; import net.glowstone.block.GlowBlockState; +import net.glowstone.block.ItemTable; import net.glowstone.block.entity.BlockEntity; import net.glowstone.block.entity.SignEntity; import net.glowstone.chunk.GlowChunk; @@ -40,4 +41,12 @@ public void afterPlace(GlowPlayer player, GlowBlock block, ItemStack holding, GlowBlockState oldState) { player.openSignEditor(block.getLocation()); } + + @Override + public boolean canPlaceAt(GlowBlock block, BlockFace against) { + Material targetMat = ItemTable.instance().getBlock( + block.getRelative(against.getOppositeFace()).getType()).getMaterial(); + return canAttachTo(block, against) || targetMat == Material.SIGN_POST + || targetMat == Material.WALL_SIGN; + } } diff --git a/src/main/java/net/glowstone/block/blocktype/BlockType.java b/src/main/java/net/glowstone/block/blocktype/BlockType.java index 3b75a731c6..ab51256634 100644 --- a/src/main/java/net/glowstone/block/blocktype/BlockType.java +++ b/src/main/java/net/glowstone/block/blocktype/BlockType.java @@ -315,6 +315,8 @@ public void updatePhysics(GlowBlock block) { public final void rightClickBlock(GlowPlayer player, GlowBlock against, BlockFace face, ItemStack holding, Vector clickedLoc, EquipmentSlot hand) { GlowBlock target = against.getRelative(face); + final Material targetMat = ItemTable.instance().getBlock( + target.getRelative(face.getOppositeFace()).getType()).getMaterial(); // prevent building above the height limit if (target.getLocation().getY() >= target.getWorld().getMaxHeight()) { @@ -350,7 +352,19 @@ public final void rightClickBlock(GlowPlayer player, GlowBlock against, BlockFac } // call canBuild event - boolean canBuild = canPlaceAt(target, face); + boolean canBuild = true; + switch (targetMat) { + case SIGN_POST: + case WALL_SIGN: + if (player.isSneaking()) { + canBuild = canPlaceAt(target, face); + } else { + return; + } + break; + default: + canBuild = canPlaceAt(target, face); + } BlockCanBuildEvent canBuildEvent = new BlockCanBuildEvent(target, getId(), canBuild); if (!EventFactory.getInstance().callEvent(canBuildEvent).isBuildable()) { //revert(player, target);