diff --git a/src/com/massivecraft/factions/Conf.java b/src/com/massivecraft/factions/Conf.java index deace70b..b9895104 100644 --- a/src/com/massivecraft/factions/Conf.java +++ b/src/com/massivecraft/factions/Conf.java @@ -94,6 +94,7 @@ public class Conf // prevent some potential exploits public static boolean handleExploitObsidianGenerators = true; public static boolean handleExploitEnderPearlClipping = true; + public static boolean handleExploitInteractionSpam = true; public static boolean homesEnabled = true; public static boolean homesMustBeInClaimedTerritory = true; diff --git a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 8d16cf06..f793793c 100644 --- a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -1,11 +1,12 @@ package com.massivecraft.factions.listeners; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import org.bukkit.Location; 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; @@ -19,6 +20,7 @@ import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.util.NumberConversions; import com.massivecraft.factions.Board; import com.massivecraft.factions.Conf; @@ -224,6 +226,23 @@ public class FactionsPlayerListener implements Listener if ( ! canPlayerUseBlock(player, block, false)) { event.setCancelled(true); + if (Conf.handleExploitInteractionSpam) + { + String name = player.getName(); + InteractAttemptSpam attempt = interactSpammers.get(name); + if (attempt == null) + { + attempt = new InteractAttemptSpam(); + interactSpammers.put(name, attempt); + } + int count = attempt.increment(); + if (count >= 10) + { + FPlayer me = FPlayers.i.get(name); + me.msg("Ouch, that is starting to hurt. You should give it a rest."); + player.damage(NumberConversions.floor((double)count / 10)); + } + } return; } @@ -232,25 +251,6 @@ public class FactionsPlayerListener implements Listener return; // only interested on right-clicks for below } - // workaround fix for new CraftBukkit 1.1-R1 bug where half-step on half-step placement doesn't trigger BlockPlaceEvent - if ( - event.hasItem() - && - event.getItem().getType() == Material.STEP - && - block.getType() == Material.STEP - && - event.getBlockFace() == BlockFace.UP - && - event.getItem().getData().getData() == block.getData() - && - ! FactionsBlockListener.playerCanBuildDestroyBlock(player, block.getLocation(), "build", false) - ) - { - event.setCancelled(true); - return; - } - if ( ! playerCanUseItemHere(player, block.getLocation(), event.getMaterial(), false)) { event.setCancelled(true); @@ -258,6 +258,28 @@ public class FactionsPlayerListener implements Listener } } + + // for handling people who repeatedly spam attempts to open a door (or similar) in another faction's territory + private Map interactSpammers = new HashMap(); + private static class InteractAttemptSpam + { + private int attempts = 0; + private long lastAttempt = System.currentTimeMillis(); + + // returns the current attempt count + public int increment() + { + long Now = System.currentTimeMillis(); + if (Now > lastAttempt + 2000) + attempts = 1; + else + attempts++; + lastAttempt = Now; + return attempts; + } + } + + public static boolean playerCanUseItemHere(Player player, Location location, Material material, boolean justCheck) { String name = player.getName();