From 589377e3543097e09680c9f6275319e9154c88f4 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 1 Nov 2018 16:43:25 -0400 Subject: [PATCH] Consider Multi-block Blocks as a Single Unit (#61) block: Implement Multiblocks for better block handling * Implement CreeperMultiblock for some blocks * Fixed double chests/other containers * Shulkers will eventually need to be revisited - drop should drop full shulker, not contents separately. * Reduced redundant explosion replacement entries for "dependent" multiblocks --- lib/PlayerHeads.jar | Bin 68404 -> 0 bytes pom.xml | 13 +- .../nitnelave/CreeperHeal/PluginHandler.java | 13 +- .../CreeperHeal/block/CreeperBed.java | 1 + .../CreeperHeal/block/CreeperBlock.java | 37 ++-- .../CreeperHeal/block/CreeperBrick.java | 4 +- .../CreeperHeal/block/CreeperButton.java | 2 +- .../CreeperHeal/block/CreeperChest.java | 197 ------------------ .../CreeperHeal/block/CreeperContainer.java | 118 +++++++++++ .../CreeperHeal/block/CreeperDoor.java | 64 ++---- .../CreeperHeal/block/CreeperExplosion.java | 64 +++--- .../CreeperHeal/block/CreeperFlower.java | 44 +--- .../CreeperHeal/block/CreeperGrass.java | 2 +- .../CreeperHeal/block/CreeperMultiblock.java | 88 ++++++++ .../block/CreeperPhysicsBlock.java | 2 +- .../CreeperHeal/block/CreeperPiston.java | 1 + .../CreeperHeal/block/CreeperSign.java | 2 +- .../CreeperHeal/block/CreeperStone.java | 4 +- .../block/ExplodedBlockManager.java | 10 +- .../CreeperHeal/block/NeighborChest.java | 87 -------- .../listeners/CreeperListener.java | 1 - src/main/resources/plugin.yml | 5 +- 22 files changed, 307 insertions(+), 452 deletions(-) delete mode 100644 lib/PlayerHeads.jar delete mode 100644 src/main/java/com/nitnelave/CreeperHeal/block/CreeperChest.java create mode 100644 src/main/java/com/nitnelave/CreeperHeal/block/CreeperContainer.java create mode 100644 src/main/java/com/nitnelave/CreeperHeal/block/CreeperMultiblock.java delete mode 100644 src/main/java/com/nitnelave/CreeperHeal/block/NeighborChest.java diff --git a/lib/PlayerHeads.jar b/lib/PlayerHeads.jar deleted file mode 100644 index bbd3484ac2b1639d0b6bc159e970f6f80613d8e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68404 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 We1QD+VlV)fKBrwVpig%P;Qs)g%M5V< diff --git a/pom.xml b/pom.xml index 350371e..ba04db8 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,12 @@ jar https://github.com/nitnelave/CreeperHeal + + + src/main/resources + true + + org.apache.maven.plugins @@ -171,12 +177,5 @@ 1.11-R0.1-SNAPSHOT provided - - - org.bukkit - bukkit - 1.11-R0.1-SNAPSHOT - provided - diff --git a/src/main/java/com/nitnelave/CreeperHeal/PluginHandler.java b/src/main/java/com/nitnelave/CreeperHeal/PluginHandler.java index 65d8c0c..99c9724 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/PluginHandler.java +++ b/src/main/java/com/nitnelave/CreeperHeal/PluginHandler.java @@ -21,8 +21,6 @@ public class PluginHandler private static MobArenaHandler maHandler = null; private static LWC lwc = null; - private static final boolean spout; - static { Plugin lwcp = detectPlugin("LWC"); @@ -32,7 +30,6 @@ public class PluginHandler if (detectPlugin("MobArena") != null) maHandler = new MobArenaHandler(); - spout = detectPlugin("Spout") != null; } /* @@ -68,10 +65,7 @@ public static boolean isProtected(Block block) */ public static boolean isInArena(Location location) { - if (maHandler != null) - if (maHandler.inRegion(location)) - return true; //Explosion inside a mob arena - return false; + return maHandler != null && maHandler.inRegion(location); } /** @@ -84,9 +78,4 @@ public static boolean isFactionsEnabled() return detectPlugin("Factions") != null; } - public static boolean isSpoutEnabled() - { - return spout; - } - } diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBed.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBed.java index 0d00c22..12571c8 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBed.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBed.java @@ -28,6 +28,7 @@ class CreeperBed extends CreeperBlock */ CreeperBed(BlockState blockState) { + super(blockState); Bed bedData = castData(blockState, Bed.class); orientation = bedData.getFacing(); Block block = blockState.getBlock(); diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBlock.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBlock.java index a78b451..8f74044 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBlock.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBlock.java @@ -2,8 +2,8 @@ import com.nitnelave.CreeperHeal.config.CfgVal; import com.nitnelave.CreeperHeal.config.CreeperConfig; -import com.nitnelave.CreeperHeal.utils.CreeperLog; import com.nitnelave.CreeperHeal.utils.CreeperUtils; +import com.nitnelave.CreeperHeal.utils.ShortLocation; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -85,10 +85,8 @@ public class CreeperBlock implements Replaceable public static CreeperBlock newBlock(BlockState state) { CreeperConfig.getWorld(state.getWorld()).getReplacement(state); - //if (PluginHandler.isSpoutEnabled () && SpoutBlock.isCustomBlock (blockState)) - // return new SpoutBlock (blockState); if (state instanceof InventoryHolder) - return new CreeperChest(state); + return new CreeperContainer(state); if (state.getType().hasGravity()) return new CreeperPhysicsBlock(state); switch (state.getType()) @@ -96,7 +94,7 @@ public static CreeperBlock newBlock(BlockState state) case BED_BLOCK: return new CreeperBed(state); case DOUBLE_PLANT: - return new CreeperFlower(state); + return new CreeperFlower(state); case RAILS: case POWERED_RAIL: case DETECTOR_RAIL: @@ -156,14 +154,11 @@ protected CreeperBlock(BlockState blockState) this.blockState = blockState; } - protected CreeperBlock() - {} - /* * Get whether the block is empty, i.e. if a player can breathe inside it * and if it can be replaced by other blocks (snow, water...) */ - private static boolean isEmpty(Material type) + protected static boolean isEmpty(Material type) { return EMPTY_BLOCKS.contains(type); } @@ -243,7 +238,6 @@ public static boolean isDependent(Material type) */ public void update() { - getLocation().getChunk().load(); blockState.update(true, false); getWorld().playSound(getLocation(), CreeperConfig.getSound(), CreeperConfig.getInt(CfgVal.SOUND_VOLUME) / 10F, random.nextFloat() * 2); } @@ -259,16 +253,6 @@ public Material getType() return blockState.getType(); } - /** - * Get the block's raw data. - * - * @return The block's raw data. - */ - public byte getRawData() - { - return blockState.getRawData(); - } - /** * Drop the corresponding items on the ground. * @@ -302,7 +286,7 @@ public boolean drop(boolean forced) @Override public final boolean replace(boolean shouldDrop) { - if (checkForDrop(getBlock())) + if (checkForDrop()) return true; if (!shouldDrop && isDependent(getType()) @@ -327,8 +311,10 @@ public static boolean isSolid(Block block) return block.getType().isSolid(); } - protected boolean checkForDrop(Block block) + protected boolean checkForDrop() { + + Block block = blockState.getBlock(); Material type = block.getType(); if (!CreeperConfig.getBool(CfgVal.OVERWRITE_BLOCKS) && !isEmpty(type)) @@ -341,7 +327,7 @@ protected boolean checkForDrop(Block block) { CreeperBlock b = CreeperBlock.newBlock(block.getState()); if (b == null) - throw new IllegalArgumentException("Null block for: " + block.getState().getType().toString()); + throw new IllegalArgumentException("Null block for: " + block.getType().toString()); b.drop(true); b.remove(); } @@ -427,6 +413,11 @@ public List getDependentNeighbors() return neighbors; } + void record(Collection checked) + { + checked.add(new ShortLocation(getLocation())); + } + protected T castData(BlockState b, Class c) { MaterialData data = b.getData(); diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBrick.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBrick.java index 35ea1cb..99896e5 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBrick.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperBrick.java @@ -8,11 +8,11 @@ class CreeperBrick extends CreeperBlock { - protected CreeperBrick(BlockState blockState) + CreeperBrick(BlockState blockState) { super(blockState); - if (CreeperConfig.getBool(CfgVal.CRACK_DESTROYED_BRICKS) && getRawData() == (byte) 0) + if (CreeperConfig.getBool(CfgVal.CRACK_DESTROYED_BRICKS) && blockState.getRawData() == (byte) 0) blockState.setRawData((byte) 2); } diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperButton.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperButton.java index cb9d65b..4f115d9 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperButton.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperButton.java @@ -9,6 +9,6 @@ protected CreeperButton(BlockState b) { super(b); - b.setRawData((byte) (getRawData() & 7)); + b.setRawData((byte) (b.getRawData() & 7)); } } diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperChest.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperChest.java deleted file mode 100644 index 2b92d88..0000000 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperChest.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.nitnelave.CreeperHeal.block; - -import com.nitnelave.CreeperHeal.config.CreeperConfig; -import com.nitnelave.CreeperHeal.config.WCfgVal; -import com.nitnelave.CreeperHeal.utils.CreeperLog; -import com.nitnelave.CreeperHeal.utils.CreeperUtils; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.DoubleChestInventory; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; - -/** - * InventoryHolder implementation of CreeperBlock. - * - * @author nitnelave - * - */ -class CreeperChest extends CreeperBlock -{ - - private final Block chest; - - private NeighborChest neighbor = null; - - private ItemStack[] storedInventory = null, neighborInventory = null; - - /* - * Constructor. - */ - CreeperChest(BlockState blockState) - { - super(blockState); - chest = getBlock(); - Inventory inv = ((InventoryHolder) blockState).getInventory(); - storedInventory = inv.getContents(); - if (inv.getType() == InventoryType.CHEST) - { - neighbor = scanForNeighborChest(chest.getState()); - if (neighbor != null) - { - Inventory otherInv = neighbor.isRight() ? ((DoubleChestInventory) inv).getLeftSide() - : ((DoubleChestInventory) inv).getRightSide(); - Inventory mainInv = neighbor.isRight() ? ((DoubleChestInventory) inv).getRightSide() - : ((DoubleChestInventory) inv).getLeftSide(); - - storedInventory = mainInv.getContents(); - neighborInventory = otherInv.getContents(); - } - } - } - - /* - * (non-Javadoc) - * - * @see com.nitnelave.CreeperHeal.block.CreeperBlock#remove() - */ - @Override - public void remove() - { - if (CreeperConfig.getWorld(getWorld()).getBool(WCfgVal.DROP_CHEST_CONTENTS)) - { - World w = getWorld(); - Location loc = getLocation(); - for (ItemStack st : ((InventoryHolder) blockState).getInventory().getContents()) - if (st != null) - w.dropItemNaturally(loc, st); - } - ((InventoryHolder) blockState).getInventory().clear(); - getBlock().setType(Material.AIR); - if (neighbor != null) - neighbor.getBlock().setType(Material.AIR); - } - - /* - * (non-Javadoc) - * - * @see com.nitnelave.CreeperHeal.block.CreeperBlock#dropBlock() - */ - @Override - public boolean drop(boolean forced) - { - ItemStack[] stacks = getTotalInventory(); - if (stacks != null) - for (ItemStack stack : stacks) - if (stack != null) - getWorld().dropItemNaturally(getLocation(), stack); - return super.drop(forced); - } - - /* - * Get the total inventory : it is either the normal one, or in case of a - * double chest, the combined inventory of both chests. - */ - private ItemStack[] getTotalInventory() - { - if (!hasNeighbor()) - return storedInventory; - ItemStack[] otherInv = neighborInventory; - ItemStack[] newInv = storedInventory; - if (neighbor.isRight()) - return CreeperUtils.concat(otherInv, newInv); - return CreeperUtils.concat(newInv, otherInv); - } - - /* - * Get whether the chest has a neighbor (double chest). - */ - private boolean hasNeighbor() - { - return neighbor != null; - } - - /* - * (non-Javadoc) - * - * @see com.nitnelave.CreeperHeal.block.CreeperBlock#update(boolean) - */ - @Override - public void update() - { - super.update(); - getBlock().setType(blockState.getType()); - getBlock().setData(blockState.getRawData()); - if (!CreeperConfig.getWorld(getWorld()).getBool(WCfgVal.DROP_CHEST_CONTENTS)) - try - { - if (hasNeighbor()) - { - neighbor.update(true); - Inventory i = ((InventoryHolder) chest.getState()).getInventory(); - ItemStack[] both; - ItemStack[] otherInv = neighborInventory; - ItemStack[] newInv = storedInventory; - if (neighbor.isRight()) - both = CreeperUtils.concat(otherInv, newInv); - else - both = CreeperUtils.concat(newInv, otherInv); - i.setContents(both); - - } - else - ((InventoryHolder) chest.getState()).getInventory().setContents(storedInventory); - } catch (java.lang.ClassCastException e) - { - CreeperLog.warning("Error detected, please report the whole message"); - CreeperLog.warning("ClassCastException when replacing a chest : "); - CreeperLog.warning(chest.getClass().getCanonicalName()); - CreeperLog.displayBlockLocation(chest, true); - e.printStackTrace(); - } - else if (hasNeighbor()) - neighbor.getChest().update(true); - - } - - /* - * Get the other chest of the double chest. null if it is a simple chest. - */ - private static NeighborChest scanForNeighborChest(BlockState block) - { - return scanForNeighborChest(block.getWorld(), block.getX(), block.getY(), block.getZ(), block.getRawData(), block.getType()); - } - - /* - * Get the other chest of the double chest. null if it is a simple chest. - */ - private static NeighborChest scanForNeighborChest(World world, int x, int y, int z, short d, - Material material) - { - Block neighbor; - if (d <= 3) - { - neighbor = world.getBlockAt(x - 1, y, z); - if (neighbor.getType().equals(material)) - return new NeighborChest(neighbor, d == 3); - neighbor = world.getBlockAt(x + 1, y, z); - if (neighbor.getType().equals(material)) - return new NeighborChest(neighbor, d == 2); - } - else - { - neighbor = world.getBlockAt(x, y, z - 1); - if (neighbor.getType().equals(material)) - return new NeighborChest(neighbor, d == 4); - neighbor = world.getBlockAt(x, y, z + 1); - if (neighbor.getType().equals(material)) - return new NeighborChest(neighbor, d == 5); - } - return null; - } -} diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperContainer.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperContainer.java new file mode 100644 index 0000000..b45ae69 --- /dev/null +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperContainer.java @@ -0,0 +1,118 @@ +package com.nitnelave.CreeperHeal.block; + +import com.nitnelave.CreeperHeal.config.CreeperConfig; +import com.nitnelave.CreeperHeal.config.WCfgVal; +import com.nitnelave.CreeperHeal.utils.CreeperUtils; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.BlockState; +import org.bukkit.inventory.DoubleChestInventory; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; + +/** + * InventoryHolder implementation of a CreeperMultiblock. + * + * @author Jikoo + */ +class CreeperContainer extends CreeperMultiblock +{ + + private ItemStack[] storedInventory, neighborInventory = null; + + CreeperContainer(BlockState blockState) + { + super(blockState); + + Inventory inv = ((InventoryHolder) blockState).getInventory(); + storedInventory = inv.getContents(); + + if ((inv instanceof DoubleChestInventory)) + { + + DoubleChestInventory doubleChest = ((DoubleChestInventory) inv); + + BlockState right = doubleChest.getRightSide().getLocation().getBlock().getState(); + + // Left side is primary chest inventory + this.blockState = doubleChest.getLeftSide().getLocation().getBlock().getState(); + this.dependents.add(right); + + this.storedInventory = doubleChest.getLeftSide().getContents(); + this.neighborInventory = doubleChest.getRightSide().getContents(); + } + + } + + @Override + public void remove() + { + if (CreeperConfig.getWorld(getWorld()).getBool(WCfgVal.DROP_CHEST_CONTENTS)) + { + World world = getWorld(); + Location location = getLocation(); + for (ItemStack itemStack : ((InventoryHolder) blockState).getInventory().getContents()) + if (itemStack != null) + world.dropItemNaturally(location, itemStack); + } + + ((InventoryHolder) blockState).getInventory().clear(); + for (BlockState dependent : dependents) + if (dependent instanceof InventoryHolder) + ((InventoryHolder) dependent).getInventory().clear(); + + super.remove(); + } + + @Override + public boolean drop(boolean forced) + { + ItemStack[] inventory = getTotalInventory(); + if (inventory != null) + for (ItemStack itemStack : inventory) + if (itemStack != null) + getWorld().dropItemNaturally(getLocation(), itemStack); + return super.drop(forced); + } + + private ItemStack[] getTotalInventory() + { + if (neighborInventory == null) + return storedInventory; + + return CreeperUtils.concat(storedInventory, neighborInventory); + } + + @Override + public void update() + { + super.update(); + + if (CreeperConfig.getWorld(getWorld()).getBool(WCfgVal.DROP_CHEST_CONTENTS)) + return; + + // Hacky 1.11 workaround - stored BlockState does not properly update primary inventory. + BlockState newState = blockState.getBlock().getState(); + if (newState instanceof InventoryHolder) + { + Inventory newInv = ((InventoryHolder) newState).getInventory(); + if (newInv instanceof DoubleChestInventory) + ((DoubleChestInventory) newInv).getLeftSide().setContents(storedInventory); + else + newInv.setContents(storedInventory); + } + + Inventory inv = ((InventoryHolder) blockState).getInventory(); + if (!(inv instanceof DoubleChestInventory)) + { + return; + } + + // Setting secondary half is not problematic. + DoubleChestInventory doubleChest = ((DoubleChestInventory) inv); + doubleChest.getRightSide().setContents(neighborInventory); + + } + +} diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperDoor.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperDoor.java index c64c620..d2fd86f 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperDoor.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperDoor.java @@ -1,7 +1,5 @@ package com.nitnelave.CreeperHeal.block; -import org.bukkit.Material; -import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.material.Door; @@ -15,54 +13,36 @@ * @author nitnelave * */ -class CreeperDoor extends CreeperBlock +class CreeperDoor extends CreeperMultiblock { - private final Door data; - /* * Constructor. */ CreeperDoor(BlockState blockState) { - data = castData(blockState, Door.class); - Block block = blockState.getBlock(); + super(blockState); + Door data = castData(blockState, Door.class); + if (data.isTopHalf()) - block = block.getRelative(BlockFace.DOWN); - this.blockState = block.getState(); - } - - /* - * (non-Javadoc) - * - * @see com.nitnelave.CreeperHeal.block.CreeperBlock#update() - */ - @Override - public void update() - { - Block blockUp = blockState.getBlock().getRelative(BlockFace.UP); - if (checkForDrop(blockUp)) - return; - - super.update(); - blockUp.setType(blockState.getType(), false); - Door d = data; - d.setTopHalf(true); - BlockState s = blockUp.getState(); - s.setData(d); - s.update(true); - } - - /* - * (non-Javadoc) - * - * @see com.nitnelave.CreeperHeal.block.CreeperBlock#remove() - */ - @Override - public void remove() - { - getBlock().setType(Material.AIR); - getBlock().getRelative(BlockFace.UP).setType(Material.AIR); + { + BlockState bottom = blockState.getBlock().getRelative(BlockFace.DOWN).getState(); + if (bottom.getData() instanceof Door && !((Door) bottom.getData()).isTopHalf()) + { + this.blockState = bottom; + this.dependents.add(blockState); + } + } + else + { + BlockState top = blockState.getBlock().getRelative(BlockFace.UP).getState(); + if (top.getData() instanceof Door && ((Door) top.getData()).isTopHalf()) + { + this.blockState = blockState; + this.dependents.add(top); + } + + } } /* diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperExplosion.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperExplosion.java index 80549a8..ffc9d61 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperExplosion.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperExplosion.java @@ -147,8 +147,6 @@ protected void replace_blocks(boolean shouldDrop, CHBlockHealReason reason) /** * Replace the first block of the list. - * - * @return False if the list is now empty. */ private void replace_one_block() { @@ -206,12 +204,12 @@ private void recordBlocks(List blocks) Block b = iter.next(); if (CreeperBlock.isDependent(b.getType())) { - record(b); + recordBlock(b); iter.remove(); } } for (Block b : blocks) - record(b); + recordBlock(b); } } @@ -238,7 +236,7 @@ private void checkForObsidian() continue; Block b = l.getBlock(); if (isObsidianLike(b.getType(), table) && r.nextDouble() < chance) - record(b); + recordBlock(b); } } @@ -255,59 +253,63 @@ private boolean isObsidianLike(Material m, boolean table) * @param block * The block to record. */ - public void record(Block block) + public void recordBlock(Block block) { - if (block.getType() == Material.PORTAL) - return; - - CreeperBlock cBlock = CreeperBlock.newBlock(block.getState()); + if (block.getType() == Material.PORTAL || checked.contains(new ShortLocation(block))) + return; + + CreeperBlock creeperBlock = CreeperBlock.newBlock(block.getState()); - if (cBlock == null || checked.contains(new ShortLocation(block))) + if (creeperBlock == null || creeperBlock.getType() == Material.PORTAL) return; - checked.add(new ShortLocation(block)); + ShortLocation location = new ShortLocation(creeperBlock.getLocation()); + + if (checked.contains(location)) + return; - if ((CreeperConfig.getBool(CfgVal.PREVENT_CHAIN_REACTION) && block.getType().equals(Material.TNT)) - || world.isProtected(block)) + creeperBlock.record(checked); + + if ((CreeperConfig.getBool(CfgVal.PREVENT_CHAIN_REACTION) && creeperBlock.getType().equals(Material.TNT)) + || world.isProtected(creeperBlock.getBlock())) { - ToReplaceList.addToReplace(cBlock); - cBlock.remove(); + ToReplaceList.addToReplace(creeperBlock); + creeperBlock.remove(); return; } - BlockId id = new BlockId(block); + BlockId id = new BlockId(creeperBlock.getBlock()); if (!world.isBlackListed(id)) { // The block should be replaced. - for (NeighborBlock b : cBlock.getDependentNeighbors()) - if (b.isNeighbor()) - record(b.getBlock()); + for (NeighborBlock neighborBlock : creeperBlock.getDependentNeighbors()) + if (neighborBlock.isNeighbor()) + recordBlock(neighborBlock.getBlock()); - blockList.add(cBlock); - cBlock.remove(); + blockList.add(creeperBlock); + creeperBlock.remove(); } else if (CreeperConfig.getBool(CfgVal.DROP_DESTROYED_BLOCKS)) { - cBlock.drop(false); - cBlock.remove(); + creeperBlock.drop(false); + creeperBlock.remove(); } - } /** * Add a Replaceable to the list, and remove it from the world. - * - * @param block + * + * @param replaceable * The Replaceable to add. */ - public void record(Replaceable block) + public void recordEntity(Replaceable replaceable) { - if (block != null) + if (replaceable != null) { - blockList.add(block); - block.remove(); + blockList.add(replaceable); + replaceable.remove(); } } diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperFlower.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperFlower.java index bcda24d..8e18230 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperFlower.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperFlower.java @@ -1,6 +1,5 @@ package com.nitnelave.CreeperHeal.block; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; @@ -8,53 +7,22 @@ import java.util.ArrayList; import java.util.List; -class CreeperFlower extends CreeperBlock +class CreeperFlower extends CreeperMultiblock { - /* - * The Relative Flower blocks. - */ - private final boolean relative; - /* * Constructor. */ CreeperFlower(BlockState blockState) { - Block block = blockState.getBlock(); + super(blockState); + Block block = blockState.getBlock(); if ((blockState.getRawData() & 8) != 0) block = block.getRelative(BlockFace.DOWN); this.blockState = block.getState(); - relative = (block.getRelative(BlockFace.UP).getState().getRawData() & 1) == 0; - } - - /* - * (non-Javadoc) - * - * @see com.nitnelave.CreeperHeal.block.CreeperBlock#update() - */ - @Override - public void update() - { - Block blockUp = blockState.getBlock().getRelative(BlockFace.UP); - if (checkForDrop(blockUp)) - return; - - super.update(); - byte b = (byte) (8 + (relative ? 0 : 1)); - blockUp.setTypeIdAndData(getType().getId(), b, false); - } - - /* - * (non-Javadoc) - * - * @see com.nitnelave.CreeperHeal.block.CreeperBlock#remove() - */ - @Override - public void remove() - { - getBlock().setType(Material.AIR); - getBlock().getRelative(BlockFace.UP).setType(Material.AIR); + BlockState relative = block.getRelative(BlockFace.UP).getState(); + if ((relative.getRawData() & 1) == 0) + this.dependents.add(relative); } /* diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperGrass.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperGrass.java index 9fbfeb9..500d103 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperGrass.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperGrass.java @@ -9,7 +9,7 @@ class CreeperGrass extends CreeperBlock { - protected CreeperGrass(BlockState blockState) + CreeperGrass(BlockState blockState) { super(blockState); if (CreeperConfig.getWorld(getWorld()).getBool(WCfgVal.GRASS_TO_DIRT)) diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperMultiblock.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperMultiblock.java new file mode 100644 index 0000000..d90794d --- /dev/null +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperMultiblock.java @@ -0,0 +1,88 @@ +package com.nitnelave.CreeperHeal.block; + +import com.nitnelave.CreeperHeal.config.CfgVal; +import com.nitnelave.CreeperHeal.config.CreeperConfig; +import com.nitnelave.CreeperHeal.utils.ShortLocation; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * Abstract CreeperBlock representing an item that may span multiple blocks. + * + * @author Jikoo + */ +public abstract class CreeperMultiblock extends CreeperBlock +{ + + final Set dependents; + + CreeperMultiblock(BlockState blockState) + { + super(blockState); + this.dependents = new HashSet(); + } + + @Override + public void update() + { + super.update(); + for (BlockState dependent : dependents) + dependent.update(true, false); + } + + @Override + protected boolean checkForDrop() + { + if (checkForDropHelper(getBlock())) + return true; + + for (BlockState dependent : dependents) + if (checkForDropHelper(dependent.getBlock())) + return true; + + return false; + + } + + private boolean checkForDropHelper(Block block) + { + Material type = block.getType(); + + if (!CreeperConfig.getBool(CfgVal.OVERWRITE_BLOCKS) && !isEmpty(type)) + { + if (CreeperConfig.getBool(CfgVal.DROP_DESTROYED_BLOCKS)) + drop(true); + return true; + } else if (CreeperConfig.getBool(CfgVal.OVERWRITE_BLOCKS) && !isEmpty(type) + && CreeperConfig.getBool(CfgVal.DROP_DESTROYED_BLOCKS)) + { + CreeperBlock b = CreeperBlock.newBlock(block.getState()); + if (b == null) + throw new IllegalArgumentException("Null block for: " + block.getState().getType().toString()); + b.drop(true); + b.remove(); + } + return false; + } + + @Override + public void remove() + { + this.blockState.getBlock().setType(Material.AIR, false); + for (BlockState dependent : dependents) + dependent.getBlock().setType(Material.AIR, false); + } + + @Override + void record(Collection checked) + { + super.record(checked); + for (BlockState dependent : dependents) + checked.add(new ShortLocation(dependent.getLocation())); + } +} diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPhysicsBlock.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPhysicsBlock.java index a1d136d..295ec99 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPhysicsBlock.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPhysicsBlock.java @@ -17,7 +17,7 @@ class CreeperPhysicsBlock extends CreeperBlock /* * Constructor. */ - protected CreeperPhysicsBlock(BlockState blockState) + CreeperPhysicsBlock(BlockState blockState) { super(blockState); } diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPiston.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPiston.java index 58edd7a..551d3dc 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPiston.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperPiston.java @@ -24,6 +24,7 @@ class CreeperPiston extends CreeperBlock */ CreeperPiston(BlockState blockState) { + super(blockState); Block block = blockState.getBlock(); if (blockState.getType().equals(Material.PISTON_EXTENSION)) block = block.getRelative(castData(blockState, PistonExtensionMaterial.class).getAttachedFace()); diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperSign.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperSign.java index e9544d9..7d5f538 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperSign.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperSign.java @@ -14,7 +14,7 @@ class CreeperSign extends CreeperBlock /* * Constructor. */ - protected CreeperSign(Sign sign) + CreeperSign(Sign sign) { super(sign); } diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperStone.java b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperStone.java index 4001716..7920866 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/CreeperStone.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/CreeperStone.java @@ -6,10 +6,10 @@ import com.nitnelave.CreeperHeal.config.CfgVal; import com.nitnelave.CreeperHeal.config.CreeperConfig; -public class CreeperStone extends CreeperBlock +class CreeperStone extends CreeperBlock { - protected CreeperStone(BlockState blockState) + CreeperStone(BlockState blockState) { super(blockState); diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/ExplodedBlockManager.java b/src/main/java/com/nitnelave/CreeperHeal/block/ExplodedBlockManager.java index 6ab324b..6ebeb18 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/block/ExplodedBlockManager.java +++ b/src/main/java/com/nitnelave/CreeperHeal/block/ExplodedBlockManager.java @@ -193,9 +193,11 @@ public static void processExplosion(List originalBlockList, Location loca for(Block b : event.getProtectedBlocks()) { CreeperBlock cb = CreeperBlock.newBlock(b.getState()); - assert cb != null; - ToReplaceList.addToReplace(cb); - cb.remove(); + if (cb != null) + { + ToReplaceList.addToReplace(cb); + cb.remove(); + } } CreeperExplosion cEx = null; @@ -215,7 +217,7 @@ public static void processExplosion(List originalBlockList, Location loca cEx.addBlocks(processList, location); for (Replaceable h : brokenEntityList) - cEx.record(h); + cEx.recordEntity(h); brokenEntityList.clear(); /* diff --git a/src/main/java/com/nitnelave/CreeperHeal/block/NeighborChest.java b/src/main/java/com/nitnelave/CreeperHeal/block/NeighborChest.java deleted file mode 100644 index 618d013..0000000 --- a/src/main/java/com/nitnelave/CreeperHeal/block/NeighborChest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.nitnelave.CreeperHeal.block; - -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; - -/** - * Represents the second part of a double chest, the first one being a - * CreeperChest. - * - * @author nitnelave - * - */ -public class NeighborChest -{ - - /* - * The chest itself. - */ - private final BlockState chest; - /* - * Whether it is the right part of the double chest or the left one. - */ - private final boolean right; - - /** - * Constructor. - * - * @param chest - * The block where the chest is. - * @param right - * Whether the block is the right part of the double chest. - */ - public NeighborChest(Block chest, boolean right) - { - this(chest.getState(), right); - } - - /** - * Constructor. - * - * @param chest - * The blockState representing the chest. - * @param right - * Whether the block is the right part of the double chest. - */ - public NeighborChest(BlockState chest, boolean right) - { - this.chest = chest; - this.right = right; - } - - /** - * Get whether the block is the right part of the double chest. - * - * @return Whether the block is the right part of the double chest. - */ - public boolean isRight() - { - return right; - } - - /** - * Get the blockState representing the chest. - * - * @return The blockState representing the chest. - */ - public BlockState getChest() - { - return chest; - } - - /** - * Gets the block where the chest is. - * - * @return The block. - */ - public Block getBlock() - { - return chest.getBlock(); - } - - public void update(boolean b) - { - chest.update(true); - chest.getBlock().setType(chest.getType()); - } -} diff --git a/src/main/java/com/nitnelave/CreeperHeal/listeners/CreeperListener.java b/src/main/java/com/nitnelave/CreeperHeal/listeners/CreeperListener.java index 7054264..6edfaf1 100644 --- a/src/main/java/com/nitnelave/CreeperHeal/listeners/CreeperListener.java +++ b/src/main/java/com/nitnelave/CreeperHeal/listeners/CreeperListener.java @@ -9,7 +9,6 @@ import com.nitnelave.CreeperHeal.config.CreeperConfig; import com.nitnelave.CreeperHeal.config.WCfgVal; import com.nitnelave.CreeperHeal.config.WorldConfig; -import com.nitnelave.CreeperHeal.events.CHExplosionRecordEvent; import com.nitnelave.CreeperHeal.utils.CreeperLog; import com.nitnelave.CreeperHeal.utils.CreeperUtils; import com.nitnelave.CreeperHeal.utils.FactionHandler; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 358850b..251e93e 100755 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,9 +1,10 @@ name: CreeperHeal main: com.nitnelave.CreeperHeal.CreeperHeal -version: 7.0.5 +version: ${project.version} author: nitnelave +authors: [Jikoo] description: Replaces terrain destroyed by creeper explosions -softdepend: [LWC, MobArena, Factions, bPermissions] +softdepend: [LWC, MobArena, Factions] commands: CreeperHeal: