From 5037847814fc948f3955416db51ac15787f1bc55 Mon Sep 17 00:00:00 2001 From: Ryan Hamshire Date: Mon, 16 Apr 2012 19:00:21 -0700 Subject: [PATCH] 3.3.2 --- plugin.yml | 16 ++- .../GriefPrevention/BlockEventHandler.java | 31 +++-- .../ryanhamshire/GriefPrevention/Claim.java | 2 + .../GriefPrevention/DataStore.java | 2 +- .../DeliverClaimBlocksTask.java | 8 +- .../GriefPrevention/EntityEventHandler.java | 25 ++-- .../GriefPrevention/GriefPrevention.java | 124 ++++++++++++------ .../GriefPrevention/PlayerEventHandler.java | 56 ++++++-- .../GriefPrevention/SiegeCheckupTask.java | 2 +- 9 files changed, 181 insertions(+), 85 deletions(-) diff --git a/plugin.yml b/plugin.yml index d2f51f9..5a3abc2 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,17 +1,20 @@ name: GriefPrevention main: me.ryanhamshire.GriefPrevention.GriefPrevention softdepend: [Vault] -version: 3.2 +version: 3.3.2 commands: abandonclaim: description: Deletes a claim. - usage: /abandonclaim + usage: /AbandonClaim + abandontoplevelclaim: + description: Deletes a claim and all its subdivisions. + usage: /AbandonTopLevelClaim abandonallclaims: description: Deletes ALL your claims. usage: /AbandonAllClaims trust: description: Grants a player full access to your claim(s). - usage: /Trust See also /UnTrust, /ContainerTrust, /AccessTrust, and /PermissionTrust. + usage: /Trust Graants a player permission to build. See also /UnTrust, /ContainerTrust, /AccessTrust, and /PermissionTrust. aliases: t untrust: description: Revokes a player's access to your claim(s). @@ -19,15 +22,15 @@ commands: aliases: ut containertrust: description: Grants a player access to your containers. - usage: /ContainerTrust + usage: /ContainerTrust . Grants a player access to your inventory, bed, and buttons/levers. aliases: ct accesstrust: description: Grants a player entry to your claim(s) and use of your bed. - usage: /AccessTrust + usage: /AccessTrust . Grants a player access to your bed, buttons, and levers. aliases: at permissiontrust: description: Grants a player permission to grant his level of permission to others. - usage: /PermissionTrust + usage: /PermissionTrust . Permits a player to share his permission level with others. aliases: pt subdivideclaims: description: Switches the shovel tool to subdivision mode, used to subdivide your claims. @@ -100,6 +103,7 @@ permissions: griefprevention.adjustclaimblocks: true griefprevention.deleteclaims: true griefprevention.spam: true + griefprevention.lava: true griefprevention.restorenature: description: Grants permission to use /RestoreNature. default: op diff --git a/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java b/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java index 5bf8326..5927487 100644 --- a/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/BlockEventHandler.java @@ -186,20 +186,18 @@ public class BlockEventHandler implements Listener Player player = placeEvent.getPlayer(); Block block = placeEvent.getBlock(); - //FEATURE: limit fire placement, to prevent PvP-by-fire and general fiery messes + //FEATURE: limit fire placement, to prevent PvP-by-fire - //if placed block is fire and pvp is off, block it apply limitations based on the block it's placed on - if(block.getType() == Material.FIRE && !block.getWorld().getPVP()) + //if placed block is fire and pvp is off, apply rules for proximity to other players + if(block.getType() == Material.FIRE && !block.getWorld().getPVP() && !player.hasPermission("griefprevention.lava")) { List players = block.getWorld().getPlayers(); for(int i = 0; i < players.size(); i++) { Player otherPlayer = players.get(i); Location location = otherPlayer.getLocation(); - if(!otherPlayer.equals(player) && block.getY() <= location.getBlockY() - 1 && location.distanceSquared(block.getLocation()) < 9) + if(!otherPlayer.equals(player) && location.distanceSquared(block.getLocation()) < 9) { - player.sendMessage(block.getY() + " " + otherPlayer.getLocation().getBlockY()); - GriefPrevention.sendMessage(player, TextMode.Err, "You can't start a fire this close to " + otherPlayer.getName() + "."); placeEvent.setCancelled(true); return; @@ -349,25 +347,34 @@ public class BlockEventHandler implements Listener } } - //blocks are ignited ONLY by flint and steel (not by being near lava, open flames, etc) + //blocks are ignited ONLY by flint and steel (not by being near lava, open flames, etc), unless configured otherwise @EventHandler(priority = EventPriority.HIGHEST) public void onBlockIgnite (BlockIgniteEvent igniteEvent) { - if(igniteEvent.getCause() != IgniteCause.FLINT_AND_STEEL) igniteEvent.setCancelled(true); + if(igniteEvent.getCause() != IgniteCause.FLINT_AND_STEEL && !GriefPrevention.instance.config_fireSpreads) igniteEvent.setCancelled(true); } - //fire doesn't spread, but other blocks still do (mushrooms and vines, for example) + //fire doesn't spread unless configured to, but other blocks still do (mushrooms and vines, for example) @EventHandler(priority = EventPriority.HIGHEST) public void onBlockSpread (BlockSpreadEvent spreadEvent) { - if(spreadEvent.getSource().getType() == Material.FIRE) spreadEvent.setCancelled(true); + if(spreadEvent.getSource().getType() == Material.FIRE && !GriefPrevention.instance.config_fireSpreads) spreadEvent.setCancelled(true); } - //blocks are not destroyed by fire + //blocks are not destroyed by fire, unless configured to do so @EventHandler(priority = EventPriority.HIGHEST) public void onBlockBurn (BlockBurnEvent burnEvent) { - burnEvent.setCancelled(true); + if(!GriefPrevention.instance.config_fireDestroys) + { + burnEvent.setCancelled(true); + } + + //never burn claimed blocks, regardless of settings + if(this.dataStore.getClaimAt(burnEvent.getBlock().getLocation(), false, null) != null) + { + burnEvent.setCancelled(true); + } } //ensures fluids don't flow into claims, unless out of another claim where the owner is trusted to build in the receiving claim diff --git a/src/me/ryanhamshire/GriefPrevention/Claim.java b/src/me/ryanhamshire/GriefPrevention/Claim.java index f949288..ba90251 100644 --- a/src/me/ryanhamshire/GriefPrevention/Claim.java +++ b/src/me/ryanhamshire/GriefPrevention/Claim.java @@ -515,6 +515,8 @@ public class Claim //NOTE: if trying to understand this makes your head hurt, don't feel bad - it hurts mine too. //try drawing pictures to visualize test cases. + if(!this.lesserBoundaryCorner.getWorld().equals(otherClaim.getLesserBoundaryCorner().getWorld())) return false; + //first, check the corners of this claim aren't inside any existing claims if(otherClaim.contains(this.lesserBoundaryCorner, true, false)) return true; if(otherClaim.contains(this.greaterBoundaryCorner, true, false)) return true; diff --git a/src/me/ryanhamshire/GriefPrevention/DataStore.java b/src/me/ryanhamshire/GriefPrevention/DataStore.java index 274ca6c..c564eb7 100644 --- a/src/me/ryanhamshire/GriefPrevention/DataStore.java +++ b/src/me/ryanhamshire/GriefPrevention/DataStore.java @@ -843,7 +843,7 @@ public class DataStore //why isn't this a "repeating" task? //because depending on the status of the siege at the time the task runs, there may or may not be a reason to run the task again SiegeCheckupTask task = new SiegeCheckupTask(siegeData); - siegeData.checkupTaskID = GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, task, 20L * 60); + siegeData.checkupTaskID = GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, task, 20L * 30); } //ends a siege diff --git a/src/me/ryanhamshire/GriefPrevention/DeliverClaimBlocksTask.java b/src/me/ryanhamshire/GriefPrevention/DeliverClaimBlocksTask.java index 28d4ecc..6837ea5 100644 --- a/src/me/ryanhamshire/GriefPrevention/DeliverClaimBlocksTask.java +++ b/src/me/ryanhamshire/GriefPrevention/DeliverClaimBlocksTask.java @@ -31,6 +31,10 @@ class DeliverClaimBlocksTask implements Runnable { Player [] players = GriefPrevention.instance.getServer().getOnlinePlayers(); + //ensure players get at least 1 block (if accrual is totally disabled, this task won't even be scheduled) + int accruedBlocks = GriefPrevention.instance.config_claims_blocksAccruedPerHour / 12; + if(accruedBlocks == 0) accruedBlocks = 1; + //for each online player for(int i = 0; i < players.length; i++) { @@ -43,8 +47,8 @@ class DeliverClaimBlocksTask implements Runnable { //if he's not in a vehicle and has moved at least three blocks since the last check if(!player.isInsideVehicle() && (lastLocation == null || lastLocation.distanceSquared(player.getLocation()) >= 9)) - { - playerData.accruedClaimBlocks += GriefPrevention.instance.config_claims_blocksAccruedPerHour / 12; + { + playerData.accruedClaimBlocks += accruedBlocks; //respect limits if(playerData.accruedClaimBlocks > GriefPrevention.instance.config_claims_maxAccruedBlocks) diff --git a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java index be61c84..07f3d0d 100644 --- a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java @@ -236,36 +236,39 @@ class EntityEventHandler implements Listener return; } - //FEATURE: prevent players who very recently participated in pvp combat from hiding inventory to protect it from looting - //FEATURE: prevent players who are in pvp combat from logging out to avoid being defeated + //FEATURE: prevent pvp in the first minute after spawn, and prevent pvp when one or both players have no inventory + Player defender = (Player)(event.getEntity()); - + PlayerData defenderData = this.dataStore.getPlayerData(((Player)event.getEntity()).getName()); PlayerData attackerData = this.dataStore.getPlayerData(attacker.getName()); - long now = Calendar.getInstance().getTimeInMillis(); - defenderData.lastPvpTimestamp = now; - defenderData.lastPvpPlayer = attacker.getName(); - attackerData.lastPvpTimestamp = now; - attackerData.lastPvpPlayer = defender.getName(); - - //FEATURE: prevent pvp in the first minute after spawn, and prevent pvp when one or both players have no inventory - //otherwise if protecting spawning players if(GriefPrevention.instance.config_pvp_protectFreshSpawns) { if(defenderData.pvpImmune) { event.setCancelled(true); + GriefPrevention.sendMessage(attacker, TextMode.Err, "You can't injure defenseless players."); return; } if(attackerData.pvpImmune) { event.setCancelled(true); + GriefPrevention.sendMessage(attacker, TextMode.Err, "You can't fight someone while you're protected from PvP."); return; } } + + //FEATURE: prevent players who very recently participated in pvp combat from hiding inventory to protect it from looting + //FEATURE: prevent players who are in pvp combat from logging out to avoid being defeated + + long now = Calendar.getInstance().getTimeInMillis(); + defenderData.lastPvpTimestamp = now; + defenderData.lastPvpPlayer = attacker.getName(); + attackerData.lastPvpTimestamp = now; + attackerData.lastPvpPlayer = defender.getName(); } //FEATURE: protect claimed animals, boats, minecarts diff --git a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java index e4a950a..96e25aa 100644 --- a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -97,6 +97,9 @@ public class GriefPrevention extends JavaPlugin public boolean config_creepersDontDestroySurface; //whether creeper explosions near or above the surface destroy blocks + public boolean config_fireSpreads; //whether fire spreads outside of claims + public boolean config_fireDestroys; //whether fire destroys blocks outside of claims + //reference to the economy plugin, if economy integration is enabled public static Economy economy = null; @@ -183,6 +186,9 @@ public class GriefPrevention extends JavaPlugin this.config_creepersDontDestroySurface = config.getBoolean("GriefPrevention.CreepersDontDestroySurface", true); + this.config_fireSpreads = config.getBoolean("GriefPrevention.FireSpreads", false); + this.config_fireDestroys = config.getBoolean("GriefPrevention.FireDestroys", false); + //default for claims worlds list ArrayList defaultSiegeWorldNames = new ArrayList(); @@ -218,6 +224,7 @@ public class GriefPrevention extends JavaPlugin this.config_siege_blocks.add(Material.GRAVEL); this.config_siege_blocks.add(Material.SAND); this.config_siege_blocks.add(Material.GLASS); + this.config_siege_blocks.add(Material.THIN_GLASS); this.config_siege_blocks.add(Material.WOOD); this.config_siege_blocks.add(Material.WOOL); this.config_siege_blocks.add(Material.SNOW); @@ -286,7 +293,10 @@ public class GriefPrevention extends JavaPlugin config.set("GriefPrevention.CreepersDontDestroySurface", this.config_creepersDontDestroySurface); - config.set("GriefPrevention.Siege.Enabled", siegeEnabledWorldNames); + config.set("GriefPrevention.FireSpreads", this.config_fireSpreads); + config.set("GriefPrevention.FireDestroys", this.config_fireDestroys); + + config.set("GriefPrevention.Siege.Worlds", siegeEnabledWorldNames); config.set("GriefPrevention.Siege.BreakableBlocks", breakableBlocksList); try @@ -311,8 +321,11 @@ public class GriefPrevention extends JavaPlugin //unless claim block accrual is disabled, start the recurring per 5 minute event to give claim blocks to online players //20L ~ 1 second - DeliverClaimBlocksTask task = new DeliverClaimBlocksTask(); - this.getServer().getScheduler().scheduleSyncRepeatingTask(this, task, 20L * 60 * 5, 20L * 60 * 5); + if(this.config_claims_blocksAccruedPerHour > 0) + { + DeliverClaimBlocksTask task = new DeliverClaimBlocksTask(); + this.getServer().getScheduler().scheduleSyncRepeatingTask(this, task, 20L * 60 * 5, 20L * 60 * 5); + } //register for events PluginManager pluginManager = this.getServer().getPluginManager(); @@ -378,35 +391,14 @@ public class GriefPrevention extends JavaPlugin //abandonclaim if(cmd.getName().equalsIgnoreCase("abandonclaim") && player != null) { - //which claim is being abandoned? - Claim claim = this.dataStore.getClaimAt(player.getLocation(), true /*ignore height*/, null); - if(claim == null) - { - GriefPrevention.sendMessage(player, TextMode.Instr, "Stand in the claim you want to delete, or consider /AbandonAllClaims."); - } - - //verify ownership - else if(claim.allowEdit(player) != null) - { - GriefPrevention.sendMessage(player, TextMode.Err, "This isn't your claim."); - } - - else - { - //delete it - this.dataStore.deleteClaim(claim); - - //tell the player how many claim blocks he has left - PlayerData playerData = this.dataStore.getPlayerData(player.getName()); - int remainingBlocks = playerData.getRemainingClaimBlocks(); - GriefPrevention.sendMessage(player, TextMode.Success, "Claim abandoned. You now have " + String.valueOf(remainingBlocks) + " available claim blocks."); - - //revert any current visualization - Visualization.Revert(player); - } - - return true; - } + this.abandonClaimHandler(player, false); + } + + //abandontoplevelclaim + if(cmd.getName().equalsIgnoreCase("abandontoplevelclaim") && player != null) + { + return this.abandonClaimHandler(player, true); + } //ignoreclaims if(cmd.getName().equalsIgnoreCase("ignoreclaims") && player != null) @@ -1014,7 +1006,7 @@ public class GriefPrevention extends JavaPlugin else if(cmd.getName().equalsIgnoreCase("siege") && player != null) { //error message for when siege mode is disabled - if(this.siegeEnabledForWorld(player.getWorld())) + if(!this.siegeEnabledForWorld(player.getWorld())) { GriefPrevention.sendMessage(player, TextMode.Err, "Siege is disabled here."); return true; @@ -1070,8 +1062,22 @@ public class GriefPrevention extends JavaPlugin return true; } + //victim must not be pvp immune + if(defenderData.pvpImmune) + { + GriefPrevention.sendMessage(player, TextMode.Err, defender.getName() + " is defenseless. Go pick on somebody else."); + return true; + } + Claim defenderClaim = this.dataStore.getClaimAt(defender.getLocation(), false, null); + //defender must have some level of permission there to be protected + if(defenderClaim == null || defenderClaim.allowAccess(defender) != null) + { + GriefPrevention.sendMessage(player, TextMode.Err, defender.getName() + " isn't protected there."); + return true; + } + //attacker must be close to the claim he wants to siege if(!defenderClaim.isNear(attacker.getLocation(), 25)) { @@ -1093,13 +1099,6 @@ public class GriefPrevention extends JavaPlugin return true; } - //defender must have some level of permission there to be protected - if(defenderClaim == null || defenderClaim.allowAccess(defender) != null) - { - GriefPrevention.sendMessage(player, TextMode.Err, defender.getName() + " isn't protected there."); - return true; - } - //can't be on cooldown if(dataStore.onCooldown(attacker, defender, defenderClaim)) { @@ -1111,13 +1110,53 @@ public class GriefPrevention extends JavaPlugin dataStore.startSiege(attacker, defender, defenderClaim); //confirmation message for attacker, warning message for defender - GriefPrevention.sendMessage(player, TextMode.Warn, "You're under siege! If you log out now, you will die. You must defeat " + attacker.getName() + ", wait for him to give up, or escape."); + GriefPrevention.sendMessage(defender, TextMode.Warn, "You're under siege! If you log out now, you will die. You must defeat " + attacker.getName() + ", wait for him to give up, or escape."); GriefPrevention.sendMessage(player, TextMode.Success, "The siege has begun! If you log out now, you will die. You must defeat " + defender.getName() + ", chase him away, or admit defeat and walk away."); } return false; } + private boolean abandonClaimHandler(Player player, boolean deleteTopLevelClaim) + { + //which claim is being abandoned? + Claim claim = this.dataStore.getClaimAt(player.getLocation(), true /*ignore height*/, null); + if(claim == null) + { + GriefPrevention.sendMessage(player, TextMode.Instr, "Stand in the claim you want to delete, or consider /AbandonAllClaims."); + } + + //verify ownership + else if(claim.allowEdit(player) != null) + { + GriefPrevention.sendMessage(player, TextMode.Err, "This isn't your claim."); + } + + //warn if has children and we're not explicitly deleting a top level claim + else if(claim.children.size() > 0 && !deleteTopLevelClaim) + { + GriefPrevention.sendMessage(player, TextMode.Instr, "To delete a subdivision, stand inside it. Otherwise, use /AbandonTopLevelClaim to delete this claim and all subdivisions."); + return true; + } + + else + { + //delete it + this.dataStore.deleteClaim(claim); + + //tell the player how many claim blocks he has left + PlayerData playerData = this.dataStore.getPlayerData(player.getName()); + int remainingBlocks = playerData.getRemainingClaimBlocks(); + GriefPrevention.sendMessage(player, TextMode.Success, "Claim abandoned. You now have " + String.valueOf(remainingBlocks) + " available claim blocks."); + + //revert any current visualization + Visualization.Revert(player); + } + + return true; + + } + //helper method keeps the trust commands consistent and eliminates duplicate code private void handleTrustCommand(Player player, ClaimPermission permissionLevel, String recipientName) { @@ -1314,8 +1353,7 @@ public class GriefPrevention extends JavaPlugin playerData.pvpImmune = true; //inform the player - GriefPrevention.sendMessage(player, TextMode.Info, "You have one minute of PvP protection, starting now."); - GriefPrevention.sendMessage(player, TextMode.Info, "After the minute, you can pick up items, but doing so will drop your PvP protection."); + GriefPrevention.sendMessage(player, TextMode.Success, "You're protected from attack by other players as long as your inventory is empty."); } //checks whether players can create claims in a world diff --git a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java index 0ef199d..cbc24b3 100644 --- a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java @@ -40,6 +40,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.*; import org.bukkit.event.player.PlayerLoginEvent.Result; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; @@ -314,6 +315,36 @@ class PlayerEventHandler implements Listener } } + //when a player teleports + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerTeleport(PlayerTeleportEvent event) + { + //FEATURE: prevent teleport abuse to win sieges + + //these rules only apply to non-ender-pearl teleportation + if(event.getCause() == TeleportCause.ENDER_PEARL) return; + + Player player = event.getPlayer(); + + Location source = event.getFrom(); + Claim sourceClaim = this.dataStore.getClaimAt(source, false, null); + if(sourceClaim != null && sourceClaim.siegeData != null) + { + GriefPrevention.sendMessage(player, TextMode.Err, "You can't teleport out of a besieged area."); + event.setCancelled(true); + return; + } + + Location destination = event.getTo(); + Claim destinationClaim = this.dataStore.getClaimAt(destination, false, null); + if(destinationClaim != null && destinationClaim.siegeData != null) + { + GriefPrevention.sendMessage(player, TextMode.Err, "You can't teleport into a besieged area."); + event.setCancelled(true); + return; + } + } + //when a player interacts with an entity... @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPlayerInteractEntity(PlayerInteractEntityEvent event) @@ -397,10 +428,10 @@ class PlayerEventHandler implements Listener PlayerData playerData = this.dataStore.getPlayerData(event.getPlayer().getName()); if(playerData.pvpImmune) { - //if it's been at least a minute since the last time he spawned, don't pick up the item + //if it's been less than 10 seconds since the last time he spawned, don't pick up the item long now = Calendar.getInstance().getTimeInMillis(); long elapsedSinceLastSpawn = now - playerData.lastSpawn; - if(elapsedSinceLastSpawn < 60000) + if(elapsedSinceLastSpawn < 10000) { event.setCancelled(true); return; @@ -408,7 +439,7 @@ class PlayerEventHandler implements Listener //otherwise take away his immunity. he may be armed now. at least, he's worth killing for some loot playerData.pvpImmune = false; - GriefPrevention.sendMessage(player, TextMode.Warn, "You're now vulnerable to damage from other players."); + GriefPrevention.sendMessage(player, TextMode.Warn, "Now you can fight with other players."); } } } @@ -481,7 +512,7 @@ class PlayerEventHandler implements Listener public void onPlayerBucketEmpty (PlayerBucketEmptyEvent bucketEvent) { Player player = bucketEvent.getPlayer(); - Block block = bucketEvent.getBlockClicked(); + Block block = bucketEvent.getBlockClicked().getRelative(bucketEvent.getBlockFace()); int minLavaDistance = 10; //if the bucket is being used in a claim @@ -520,7 +551,7 @@ class PlayerEventHandler implements Listener } //lava buckets can't be dumped near other players unless pvp is on - if(!block.getWorld().getPVP()) + if(!block.getWorld().getPVP() && !player.hasPermission("griefprevention.lava")) { if(bucketEvent.getBucket() == Material.LAVA_BUCKET) { @@ -531,8 +562,6 @@ class PlayerEventHandler implements Listener Location location = otherPlayer.getLocation(); if(!otherPlayer.equals(player) && block.getY() >= location.getBlockY() - 1 && location.distanceSquared(block.getLocation()) < minLavaDistance * minLavaDistance) { - player.sendMessage(block.getY() + " " + otherPlayer.getLocation().getBlockY()); - GriefPrevention.sendMessage(player, TextMode.Err, "You can't place lava this close to " + otherPlayer.getName() + "."); bucketEvent.setCancelled(true); return; @@ -611,6 +640,7 @@ class PlayerEventHandler implements Listener event.getAction() == Action.RIGHT_CLICK_BLOCK && ( clickedBlock.getState() instanceof InventoryHolder || clickedBlockType == Material.BREWING_STAND || + clickedBlockType == Material.WORKBENCH || clickedBlockType == Material.JUKEBOX || clickedBlockType == Material.ENCHANTMENT_TABLE))) { @@ -639,12 +669,20 @@ class PlayerEventHandler implements Listener if(noContainersReason != null) { event.setCancelled(true); - player.sendMessage(noContainersReason); + GriefPrevention.sendMessage(player, TextMode.Err, noContainersReason); } } + + //if the event hasn't been cancelled, then the player is allowed to use the container + //so drop any pvp protection + if(playerData.pvpImmune) + { + playerData.pvpImmune = false; + GriefPrevention.sendMessage(player, TextMode.Warn, "Now you can fight with other players."); + } } - //apply rule for players trampling dirt (never allow it) + //apply rule for players trampling tilled soil back to dirt (never allow it) //NOTE: that this event applies only to players. monsters and animals can still trample. else if(event.getAction() == Action.PHYSICAL && clickedBlockType == Material.SOIL) { diff --git a/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java b/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java index 732af23..d680417 100644 --- a/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java +++ b/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java @@ -105,6 +105,6 @@ class SiegeCheckupTask implements Runnable //schedules another checkup later private void scheduleAnotherCheck() { - this.siegeData.checkupTaskID = GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, this, 20L * 60); + this.siegeData.checkupTaskID = GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, this, 20L * 30); } }