From 8344102ed52fd99a0d6cd2097f2ee97bcf99806d Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Sat, 6 Sep 2014 21:42:11 -0700 Subject: [PATCH] Prevent theft using hoppers. Disallowing placing a hopper or rail beneath a land claim unless the placer has container trust. --- .../GriefPrevention/BlockEventHandler.java | 47 ++++++++++++++++--- .../GriefPrevention/EntityEventHandler.java | 4 ++ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java b/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java index b760cc0..03b3df0 100644 --- a/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java @@ -274,17 +274,50 @@ public class BlockEventHandler implements Listener return; } - //if the block is being placed within an existing claim + //if the block is being placed within or under an existing claim PlayerData playerData = this.dataStore.getPlayerData(player.getName()); Claim claim = this.dataStore.getClaimAt(block.getLocation(), true, playerData.lastClaim); if(claim != null) { - //warn about TNT not destroying claimed blocks - if(block.getType() == Material.TNT && !claim.areExplosivesAllowed) - { - GriefPrevention.sendMessage(player, TextMode.Warn, Messages.NoTNTDamageClaims); - GriefPrevention.sendMessage(player, TextMode.Instr, Messages.ClaimExplosivesAdvertisement); - } + //FEATURE: prevent theft from container using a hopper when the container is at the very bottom of a land claim + + if(block.getType() == Material.HOPPER) + { + //is the above block inside the land claim? + Block aboveBlock = block.getRelative(BlockFace.UP); + if(claim.contains(aboveBlock.getLocation(), false, false)) + { + //then the player needs container trust to place the hopper + String failureMessage = claim.allowContainers(player); + if(failureMessage != null) + { + placeEvent.setCancelled(true); + GriefPrevention.sendMessage(player, TextMode.Err, failureMessage); + return; + } + } + } + + //rails can't be placed ANYWHERE under a claim, because they could be pushed up to the + //target container using pistons + if(block.getType().name().contains("RAIL")) + { + //then the player needs container trust to place the hopper + String failureMessage = claim.allowContainers(player); + if(failureMessage != null) + { + placeEvent.setCancelled(true); + GriefPrevention.sendMessage(player, TextMode.Err, failureMessage); + return; + } + } + + //warn about TNT not destroying claimed blocks + if(block.getType() == Material.TNT && !claim.areExplosivesAllowed) + { + GriefPrevention.sendMessage(player, TextMode.Warn, Messages.NoTNTDamageClaims); + GriefPrevention.sendMessage(player, TextMode.Instr, Messages.ClaimExplosivesAdvertisement); + } //if the player has permission for the claim and he's placing UNDER the claim if(block.getY() < claim.lesserBoundaryCorner.getBlockY() && claim.allowBuild(player) == null) diff --git a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java index 18db894..2927423 100644 --- a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java @@ -25,6 +25,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World.Environment; import org.bukkit.block.Block; +import org.bukkit.block.Hopper; import org.bukkit.entity.Arrow; import org.bukkit.entity.Creature; import org.bukkit.entity.Creeper; @@ -54,7 +55,10 @@ import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.vehicle.VehicleDamageEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; //handles events related to entities class EntityEventHandler implements Listener