(bugfix) critical: Insta break hook uses a stack now.

This commit is contained in:
asofold 2012-09-13 19:01:39 +02:00
parent 122848d04b
commit 5645f468b0
4 changed files with 61 additions and 8 deletions

View File

@ -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)

View File

@ -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<CheckType> 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<CheckType[]> stack = new ArrayList<CheckType[]>();
@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<CheckType> types = new HashSet<CheckType>();
@Override
public final void addExemptNext(final CheckType[] types) {
for (int i = 0; i < types.length; i++){
this.types.add(types[i]);
}
}
@Override
public Set<CheckType> getExemptNext() {
return types;
}
};
return new Listener[]{this};
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
protected CheckType[] fetchTypes(){
final Set<CheckType> 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;
}
}

View File

@ -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

View File

@ -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