diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java index 2ef97fc..5a383d8 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java @@ -48,6 +48,7 @@ public abstract class ModAbstract implements Mod, Listener ModAbstract.logger = logger; registerMod(new ModToggledCauldron()); registerMod(new ModToggledPiston()); + registerMod(new ModToggledObserver()); registerMod(new ModToggledStep()); registerMod(new ModToggledTorch()); registerMod(new ModInventory("dropper", InventoryType.DROPPER)); diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java new file mode 100644 index 0000000..17c414b --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java @@ -0,0 +1,40 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.GameMode; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +/** + * A mod that makes placement of directional blocks act the way placement of logs does normally. + * Quartz pillar placement works like this too. + * + * Placed blocks face the block you clicked to place them. + */ +public abstract class ModToggledLogPlaceAbstract extends ModToggledAbstract { + + protected ModToggledLogPlaceAbstract(String name, boolean enabledByDefault) { + super(name, enabledByDefault); + } + + @SuppressWarnings("deprecation") + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) + { + Player player = event.getPlayer(); + Block block; + if (hasEnabled(player) && !player.isSneaking() && player.getGameMode() == GameMode.CREATIVE + && isApplicableToPlacedBlock(block = event.getBlock())) + { + block.setData((byte) getBlockDataForFacing(block.getFace(event.getBlockAgainst()))); + } + } + + protected abstract int getBlockDataForFacing(BlockFace direction); + + protected abstract boolean isApplicableToPlacedBlock(Block block); + +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java new file mode 100644 index 0000000..8084bf4 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java @@ -0,0 +1,43 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; + +public class ModToggledObserver extends ModToggledLogPlaceAbstract { + + protected ModToggledObserver() { + super("observer", false); + } + + @Override + public String getDescription() { + return "If active, observers face the block you place them against"; + } + + @Override + protected boolean isApplicableToPlacedBlock(Block block) { + return block.getType() == Material.OBSERVER; + } + + @Override + protected int getBlockDataForFacing(BlockFace direction) { + switch (direction) { + case UP: + return 0; + default: + case DOWN: + return 1; + case SOUTH: + return 2; + case NORTH: + return 3; + case EAST: + return 4; + case WEST: + return 5; + } + } + + +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java index 9561a34..29e810c 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java @@ -1,15 +1,10 @@ package com.redstoner.modules.blockplacemods.mods; -import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockPlaceEvent; -public class ModToggledPiston extends ModToggledAbstract +public class ModToggledPiston extends ModToggledLogPlaceAbstract { public ModToggledPiston() { @@ -22,28 +17,17 @@ public class ModToggledPiston extends ModToggledAbstract return "If active, pistons face the block you place them against"; } - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) - { - Player player = event.getPlayer(); - if (hasEnabled(player) && !player.isSneaking() && player.getGameMode() == GameMode.CREATIVE - && isPiston(event.getBlock().getType())) - { - Block block = event.getBlock(); - block.setData((byte) pistonDataForFace(block.getFace(event.getBlockAgainst()))); - } + @Override + protected boolean isApplicableToPlacedBlock(Block block) { + Material type = block.getType(); + return type == Material.PISTON_BASE || type == Material.PISTON_STICKY_BASE; } - private boolean isPiston(Material block) - { - return block == Material.PISTON_BASE || block == Material.PISTON_STICKY_BASE; - } - - private int pistonDataForFace(BlockFace face) - { - switch (face) + @Override + protected int getBlockDataForFacing(BlockFace direction) { + switch (direction) { + default: case DOWN: return 0; case UP: @@ -56,8 +40,7 @@ public class ModToggledPiston extends ModToggledAbstract return 4; case EAST: return 5; - default: - return 0; } } + }