From 5645f468b0eec6f6f4df9da2dd1fadf7ab00d67e Mon Sep 17 00:00:00 2001 From: asofold Date: Thu, 13 Sep 2012 19:01:39 +0200 Subject: [PATCH] (bugfix) critical: Insta break hook uses a stack now. --- CompatNoCheatPlus/cncp_lists.txt | 4 ++ .../cncp/hooks/generic/HookInstaBreak.java | 57 +++++++++++++++++-- .../bpl/cncp/hooks/mcmmo/HookFacadeImpl.java | 6 +- .../bpl/cncp/hooks/mcmmo/HookmcMMO.java | 2 +- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/CompatNoCheatPlus/cncp_lists.txt b/CompatNoCheatPlus/cncp_lists.txt index 0128108..211de58 100644 --- a/CompatNoCheatPlus/cncp_lists.txt +++ b/CompatNoCheatPlus/cncp_lists.txt @@ -40,10 +40,14 @@ add a good mechanism for adding external configurable hooks (read automatically ! try: insta break: keep exemption (unless cancelled) for next block break event (!). -> maybe ncp + +? HookInstaBreak : add static method to sset check types to exempt from for next break ? + VERSION HISTORY --------------------------- (6.2.2) +- (bugfix) critical: Insta break hook uses a stack now. - (adjust) Also exempt mcMMO from WrongBlock check, limit to 20 blockbreaks per second by default. (6.2.1) diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookInstaBreak.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookInstaBreak.java index 7445923..cc5b950 100644 --- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookInstaBreak.java +++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookInstaBreak.java @@ -1,5 +1,10 @@ package me.asofold.bpl.cncp.hooks.generic; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import me.asofold.bpl.cncp.config.compatlayer.CompatConfig; import me.asofold.bpl.cncp.config.compatlayer.CompatConfigFactory; import me.asofold.bpl.cncp.config.compatlayer.ConfigUtil; @@ -15,12 +20,23 @@ import org.bukkit.event.block.BlockDamageEvent; import fr.neatmonster.nocheatplus.checks.CheckType; public class HookInstaBreak extends AbstractHook implements ConfigurableHook, Listener { + + public static interface InstaExemption{ + public void addExemptNext(CheckType[] types); + public Set getExemptNext(); + } + + protected static InstaExemption runtime = null; + + public static void addExemptNext(final CheckType[] types){ + runtime.addExemptNext(types); + } protected final ExemptionManager exMan = new ExemptionManager(); protected boolean enabled = true; - protected boolean skipNext = false; + protected List stack = new ArrayList(); @Override public String getHookName() { @@ -56,29 +72,58 @@ public class HookInstaBreak extends AbstractHook implements ConfigurableHook, Li @Override public Listener[] getListeners() { + runtime = new InstaExemption() { + protected final Set types = new HashSet(); + @Override + public final void addExemptNext(final CheckType[] types) { + for (int i = 0; i < types.length; i++){ + this.types.add(types[i]); + } + } + @Override + public Set getExemptNext() { + return types; + } + }; return new Listener[]{this}; } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + protected CheckType[] fetchTypes(){ + final Set types = runtime.getExemptNext(); + final CheckType[] a = new CheckType[types.size()]; + if (!types.isEmpty()) types.toArray(a); + types.clear(); + return a; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false) public void onBlockDamage(final BlockDamageEvent event){ - if (event.getInstaBreak()) skipNext = true; + if (!event.isCancelled() && event.getInstaBreak()){ + stack.add(fetchTypes()); + } + else runtime.getExemptNext().clear(); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = false) public void onBlockBreakLowest(final BlockBreakEvent event){ - if (skipNext){ + if (!stack.isEmpty()){ final Player player = event.getPlayer(); exMan.addExemption(player, CheckType.BLOCKBREAK_FASTBREAK); + for (final CheckType type : stack.get(stack.size() - 1)){ + exMan.addExemption(player, type); + } } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false) public void onBlockBreakMONITOR(final BlockBreakEvent event){ - if (skipNext){ + if (!stack.isEmpty()){ final Player player = event.getPlayer(); exMan.removeExemption(player, CheckType.BLOCKBREAK_FASTBREAK); + for (final CheckType type : stack.remove(stack.size() - 1)){ + exMan.removeExemption(player, type); + } } - skipNext = false; } } diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookFacadeImpl.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookFacadeImpl.java index 70573b7..ab462cd 100644 --- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookFacadeImpl.java +++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookFacadeImpl.java @@ -8,6 +8,7 @@ import java.util.Map.Entry; import me.asofold.bpl.cncp.CompatNoCheatPlus; import me.asofold.bpl.cncp.hooks.generic.ExemptionManager; +import me.asofold.bpl.cncp.hooks.generic.HookInstaBreak; import me.asofold.bpl.cncp.hooks.mcmmo.HookmcMMO.HookFacade; import org.bukkit.Bukkit; @@ -189,7 +190,10 @@ public class HookFacadeImpl implements HookFacade, NCPHook { } addExemption(player, exemptBreakNormal); - if (!useInstaBreakHook && !isAxe){ + if (useInstaBreakHook){ + HookInstaBreak.addExemptNext(exemptBreakNormal); + } + else if (!isAxe){ setPlayer(player, cancelChecksBlockBreak); Bukkit.getScheduler().scheduleSyncDelayedTask(CompatNoCheatPlus.getInstance(), new Runnable() { @Override diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookmcMMO.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookmcMMO.java index 40478ad..684529b 100644 --- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookmcMMO.java +++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookmcMMO.java @@ -158,7 +158,7 @@ public final class HookmcMMO extends AbstractHook implements Listener, Configura public void applyConfig(CompatConfig cfg, String prefix) { enabled = cfg.getBoolean(prefix + configPrefix + "enabled", true); useInstaBreakHook = cfg.getBoolean(prefix + configPrefix + "use-insta-break-hook", true); - blocksPerSecond = cfg.getInt(prefix + configPrefix + "clickspersecond", 30); + blocksPerSecond = cfg.getInt(prefix + configPrefix + "clickspersecond", 20); } @Override