mirror of
https://github.com/asofold/CompatNoCheatPlus.git
synced 2024-09-30 04:37:27 +02:00
(bugfix) critical: Insta break hook uses a stack now.
This commit is contained in:
parent
122848d04b
commit
5645f468b0
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user