mirror of
https://github.com/asofold/CompatNoCheatPlus.git
synced 2024-09-30 04:37:27 +02:00
Fix exemptions staying with player for too long.
This commit is contained in:
parent
0eb06e6178
commit
3acc9c4b2b
@ -23,6 +23,8 @@ public class HookBlockBreak extends ClassExemptionHook implements Listener {
|
||||
defaultClasses.addAll(Arrays.asList(new String[]{
|
||||
// MachinaCraft
|
||||
"ArtificialBlockBreakEvent",
|
||||
// mcMMO
|
||||
"FakeBlockBreakEvent",
|
||||
}));
|
||||
}
|
||||
|
||||
@ -33,7 +35,7 @@ public class HookBlockBreak extends ClassExemptionHook implements Listener {
|
||||
|
||||
@Override
|
||||
public String getHookVersion() {
|
||||
return "1.0";
|
||||
return "1.1";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2,6 +2,7 @@ package me.asofold.bpl.cncp.hooks.generic;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@ -18,6 +19,7 @@ import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockDamageEvent;
|
||||
|
||||
import fr.neatmonster.nocheatplus.checks.CheckType;
|
||||
import fr.neatmonster.nocheatplus.utilities.TickTask;
|
||||
|
||||
public class HookInstaBreak extends AbstractHook implements ConfigurableHook, Listener {
|
||||
|
||||
@ -26,6 +28,21 @@ public class HookInstaBreak extends AbstractHook implements ConfigurableHook, Li
|
||||
public Set<CheckType> getExemptNext();
|
||||
}
|
||||
|
||||
public static class StackEntry{
|
||||
public final CheckType[] checkTypes;
|
||||
public final int tick;
|
||||
public final Player player;
|
||||
public boolean used = false;
|
||||
public StackEntry(final Player player , final CheckType[] checkTypes){
|
||||
this.player = player;
|
||||
this.checkTypes = checkTypes;
|
||||
tick = TickTask.getTick();
|
||||
}
|
||||
public boolean isOutdated(final int tick){
|
||||
return tick > this.tick;
|
||||
}
|
||||
}
|
||||
|
||||
protected static InstaExemption runtime = null;
|
||||
|
||||
public static void addExemptNext(final CheckType[] types){
|
||||
@ -36,7 +53,7 @@ public class HookInstaBreak extends AbstractHook implements ConfigurableHook, Li
|
||||
|
||||
protected boolean enabled = true;
|
||||
|
||||
protected List<CheckType[]> stack = new ArrayList<CheckType[]>();
|
||||
protected final List<StackEntry> stack = new ArrayList<StackEntry>();
|
||||
|
||||
@Override
|
||||
public String getHookName() {
|
||||
@ -98,20 +115,22 @@ public class HookInstaBreak extends AbstractHook implements ConfigurableHook, Li
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false)
|
||||
public void onBlockDamage(final BlockDamageEvent event){
|
||||
checkStack();
|
||||
if (!event.isCancelled() && event.getInstaBreak()){
|
||||
stack.add(fetchTypes());
|
||||
stack.add(new StackEntry(event.getPlayer(), fetchTypes()));
|
||||
}
|
||||
else{
|
||||
runtime.getExemptNext().clear();
|
||||
}
|
||||
else runtime.getExemptNext().clear();
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = false)
|
||||
public void onBlockBreakLowest(final BlockBreakEvent event){
|
||||
if (!stack.isEmpty()){
|
||||
checkStack();
|
||||
final Player player = event.getPlayer();
|
||||
exMan.addExemption(player, CheckType.BLOCKBREAK_FASTBREAK);
|
||||
for (final CheckType type : stack.get(stack.size() - 1)){
|
||||
exMan.addExemption(player, type);
|
||||
}
|
||||
final StackEntry entry = stack.get(stack.size() - 1);
|
||||
if (player.equals(entry.player)) addExemption(entry);
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,10 +138,33 @@ public class HookInstaBreak extends AbstractHook implements ConfigurableHook, Li
|
||||
public void onBlockBreakMONITOR(final BlockBreakEvent event){
|
||||
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);
|
||||
}
|
||||
final StackEntry entry = stack.get(stack.size() - 1);
|
||||
if (player.equals(entry.player)) removeExemption(stack.remove(stack.size() - 1));
|
||||
}
|
||||
}
|
||||
|
||||
public void addExemption(final StackEntry entry){
|
||||
entry.used = true;
|
||||
for (final CheckType checkType : entry.checkTypes){
|
||||
exMan.addExemption(entry.player, checkType);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeExemption(final StackEntry entry){
|
||||
if (!entry.used) return;
|
||||
for (final CheckType checkType : entry.checkTypes){
|
||||
exMan.removeExemption(entry.player, checkType);
|
||||
}
|
||||
}
|
||||
|
||||
public void checkStack(){
|
||||
if (stack.isEmpty()) return;
|
||||
Iterator<StackEntry> it = stack.iterator();
|
||||
final int tick = TickTask.getTick();
|
||||
while (it.hasNext()){
|
||||
final StackEntry entry = it.next();
|
||||
if (entry.isOutdated(tick)) it.remove();
|
||||
if (entry.used) removeExemption(entry);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user