mirror of
https://github.com/asofold/CompatNoCheatPlus.git
synced 2025-02-02 23:11:48 +01:00
(adapt) Adjust mcMMO hook to build 84 of NCP. Use exemption mechanisms
where possible for better performance.
This commit is contained in:
parent
5d4a2ac5cb
commit
c9d1b1e490
@ -32,15 +32,20 @@ Generic abstract class for the mcMMO style cancelling of next x events + ticks a
|
|||||||
|
|
||||||
add stats hook ?
|
add stats hook ?
|
||||||
|
|
||||||
|
add a good mechanism for adding external configurable hooks (read automatically from the cncp config).
|
||||||
|
|
||||||
*** 6.1.X
|
*** 6.1.X
|
||||||
!(add) Use some exemption mechanism for npcs (generic player class hook + citizens).
|
!(add) Use some exemption mechanism for npcs (generic player class hook + citizens).
|
||||||
? add event before reading config (for better hook integration).
|
!consider remove: clearing the VL ? => probably not, needs redesign to also monitor block break. + only clear the necessary bits (not frequency)
|
||||||
|
|
||||||
|
! try: insta break: keep exemption (unless cancelled) for next block break event (!). -> maybe ncp
|
||||||
|
|
||||||
VERSION HISTORY
|
VERSION HISTORY
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
(6.1.3)
|
||||||
|
- (adapt) Adjust mcMMO hook to build 84 of NCP. Use exemption mechanisms where possible for better performance.
|
||||||
|
|
||||||
(6.1.2)
|
(6.1.2)
|
||||||
- (adapt) To NoCheatPlus build 82 and up.
|
- (adapt) To NoCheatPlus build 82 and up.
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ import fr.neatmonster.nocheatplus.hooks.NCPHookManager;
|
|||||||
*/
|
*/
|
||||||
public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
||||||
|
|
||||||
|
private static CompatNoCheatPlus instance = null;
|
||||||
|
|
||||||
private final Settings settings = new Settings();
|
private final Settings settings = new Settings();
|
||||||
|
|
||||||
@ -89,6 +90,14 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin instance.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static CompatNoCheatPlus getInstance(){
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API to add a hook. Adds the hook AND registers listeners if enabled. Also respects the configuration for preventing hooks.<br>
|
* API to add a hook. Adds the hook AND registers listeners if enabled. Also respects the configuration for preventing hooks.<br>
|
||||||
* If you want to not register the listeners use NCPHookManager.
|
* If you want to not register the listeners use NCPHookManager.
|
||||||
@ -144,16 +153,27 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called before loading settings.
|
* Called before loading settings, adds available hooks into a list, so they will be able to read config.
|
||||||
*/
|
*/
|
||||||
private void setupBuiltinHooks() {
|
private void setupBuiltinHooks() {
|
||||||
builtinHooks.clear();
|
builtinHooks.clear();
|
||||||
// Might-fail hooks:
|
// Might-fail hooks:
|
||||||
|
// Set speed
|
||||||
try{
|
try{
|
||||||
builtinHooks.add(new me.asofold.bpl.cncp.hooks.generic.HookSetSpeed());
|
builtinHooks.add(new me.asofold.bpl.cncp.hooks.generic.HookSetSpeed());
|
||||||
}
|
}
|
||||||
catch (Throwable t){}
|
catch (Throwable t){}
|
||||||
// Simple hooks:
|
// Citizens 2
|
||||||
|
try{
|
||||||
|
builtinHooks.add(new me.asofold.bpl.cncp.hooks.citizens2.HookCitizens2());
|
||||||
|
}
|
||||||
|
catch (Throwable t){}
|
||||||
|
// mcMMO
|
||||||
|
try{
|
||||||
|
builtinHooks.add(new me.asofold.bpl.cncp.hooks.mcmmo.HookmcMMO());
|
||||||
|
}
|
||||||
|
catch (Throwable t){}
|
||||||
|
// Simple generic hooks
|
||||||
for (Hook hook : new Hook[]{
|
for (Hook hook : new Hook[]{
|
||||||
new HookPlayerClass(),
|
new HookPlayerClass(),
|
||||||
new HookBlockBreak(),
|
new HookBlockBreak(),
|
||||||
@ -164,7 +184,7 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add standard hooks if available.
|
* Add standard hooks if enabled.
|
||||||
*/
|
*/
|
||||||
private void addAvailableHooks() {
|
private void addAvailableHooks() {
|
||||||
|
|
||||||
@ -181,22 +201,12 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
|||||||
catch (Throwable t){}
|
catch (Throwable t){}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Citizens 2
|
|
||||||
try{
|
|
||||||
addHook(new me.asofold.bpl.cncp.hooks.citizens2.HookCitizens2());
|
|
||||||
}
|
|
||||||
catch (Throwable t){}
|
|
||||||
// mcMMO
|
|
||||||
try{
|
|
||||||
addHook(new me.asofold.bpl.cncp.hooks.mcmmo.HookmcMMO());
|
|
||||||
}
|
|
||||||
catch (Throwable t){}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
enabled = false; // make sure
|
enabled = false; // make sure
|
||||||
|
instance = this;
|
||||||
// (no cleanup)
|
// (no cleanup)
|
||||||
|
|
||||||
// Settings:
|
// Settings:
|
||||||
@ -299,6 +309,7 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
|||||||
enabled = false;
|
enabled = false;
|
||||||
// remove all registered cncp hooks:
|
// remove all registered cncp hooks:
|
||||||
unregisterHooks();
|
unregisterHooks();
|
||||||
|
instance = null; // Set last.
|
||||||
super.onDisable();
|
super.onDisable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package me.asofold.bpl.cncp.hooks.citizens2;
|
package me.asofold.bpl.cncp.hooks.citizens2;
|
||||||
|
|
||||||
|
import me.asofold.bpl.cncp.config.compatlayer.CompatConfig;
|
||||||
|
import me.asofold.bpl.cncp.config.compatlayer.CompatConfigFactory;
|
||||||
|
import me.asofold.bpl.cncp.config.compatlayer.ConfigUtil;
|
||||||
import me.asofold.bpl.cncp.hooks.AbstractHook;
|
import me.asofold.bpl.cncp.hooks.AbstractHook;
|
||||||
|
import me.asofold.bpl.cncp.hooks.generic.ConfigurableHook;
|
||||||
import net.citizensnpcs.api.CitizensAPI;
|
import net.citizensnpcs.api.CitizensAPI;
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -8,9 +12,13 @@ import org.bukkit.entity.Player;
|
|||||||
import fr.neatmonster.nocheatplus.checks.CheckType;
|
import fr.neatmonster.nocheatplus.checks.CheckType;
|
||||||
import fr.neatmonster.nocheatplus.hooks.NCPHook;
|
import fr.neatmonster.nocheatplus.hooks.NCPHook;
|
||||||
|
|
||||||
public class HookCitizens2 extends AbstractHook {
|
public class HookCitizens2 extends AbstractHook implements ConfigurableHook{
|
||||||
|
|
||||||
private Object ncpHook = null;
|
protected Object ncpHook = null;
|
||||||
|
|
||||||
|
protected boolean enabled = true;
|
||||||
|
|
||||||
|
protected String configPrefix = "citizens2.";
|
||||||
|
|
||||||
public HookCitizens2(){
|
public HookCitizens2(){
|
||||||
assertPluginPresent("Citizens");
|
assertPluginPresent("Citizens");
|
||||||
@ -50,4 +58,21 @@ public class HookCitizens2 extends AbstractHook {
|
|||||||
return (NCPHook) ncpHook;
|
return (NCPHook) ncpHook;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyConfig(CompatConfig cfg, String prefix) {
|
||||||
|
enabled = cfg.getBoolean(prefix + configPrefix + "enabled", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateConfig(CompatConfig cfg, String prefix) {
|
||||||
|
CompatConfig defaults = CompatConfigFactory.getConfig(null);
|
||||||
|
defaults.set(prefix + configPrefix + "enabled", true);
|
||||||
|
return ConfigUtil.forceDefaults(defaults, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -137,6 +137,7 @@ public class ExemptionManager{
|
|||||||
public boolean addExemption(final Player player, final CheckType type){
|
public boolean addExemption(final Player player, final CheckType type){
|
||||||
final Status status = addExemption(player.getName(), type, NCPExemptionManager.isExempted(player, type));
|
final Status status = addExemption(player.getName(), type, NCPExemptionManager.isExempted(player, type));
|
||||||
if (status == Status.NEEDS_EXEMPTION) NCPExemptionManager.exemptPermanently(player, type);
|
if (status == Status.NEEDS_EXEMPTION) NCPExemptionManager.exemptPermanently(player, type);
|
||||||
|
// System.out.println("add: " + type.toString() + " -> " + status);
|
||||||
return status == Status.EXEMPTED;
|
return status == Status.EXEMPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,6 +171,7 @@ public class ExemptionManager{
|
|||||||
final Status status = removeExemption(player.getName(), type, NCPExemptionManager.isExempted(player, type));
|
final Status status = removeExemption(player.getName(), type, NCPExemptionManager.isExempted(player, type));
|
||||||
if (status == Status.NEEDS_EXEMPTION) NCPExemptionManager.exemptPermanently(player, type);
|
if (status == Status.NEEDS_EXEMPTION) NCPExemptionManager.exemptPermanently(player, type);
|
||||||
else if (status == Status.NEEDS_UNEXEMPTION) NCPExemptionManager.unexempt(player, type);
|
else if (status == Status.NEEDS_UNEXEMPTION) NCPExemptionManager.unexempt(player, type);
|
||||||
|
// System.out.println("remove: " + type.toString() + " -> " + status);
|
||||||
return status == Status.EXEMPTED || status == Status.NEEDS_EXEMPTION;
|
return status == Status.EXEMPTED || status == Status.NEEDS_EXEMPTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,34 +1,80 @@
|
|||||||
package me.asofold.bpl.cncp.hooks.mcmmo;
|
package me.asofold.bpl.cncp.hooks.mcmmo;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
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.mcmmo.HookmcMMO.HookFacade;
|
import me.asofold.bpl.cncp.hooks.mcmmo.HookmcMMO.HookFacade;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import fr.neatmonster.nocheatplus.checks.CheckType;
|
import fr.neatmonster.nocheatplus.checks.CheckType;
|
||||||
import fr.neatmonster.nocheatplus.hooks.NCPHook;
|
import fr.neatmonster.nocheatplus.hooks.NCPHook;
|
||||||
|
import fr.neatmonster.nocheatplus.utilities.ActionFrequency;
|
||||||
|
import fr.neatmonster.nocheatplus.utilities.BlockUtils;
|
||||||
|
import fr.neatmonster.nocheatplus.utilities.BlockUtils.ToolProps;
|
||||||
|
import fr.neatmonster.nocheatplus.utilities.BlockUtils.ToolType;
|
||||||
|
|
||||||
public class HookFacadeImpl implements HookFacade, NCPHook {
|
public class HookFacadeImpl implements HookFacade, NCPHook {
|
||||||
|
|
||||||
private final Map<CheckType, Integer> cancelChecksBlockBreak = new HashMap<CheckType, Integer>();
|
|
||||||
private final Map<CheckType, Integer> cancelChecksBlockDamage = new HashMap<CheckType, Integer>();
|
|
||||||
private final Map<CheckType, Integer> cancelChecksDamage = new HashMap<CheckType, Integer>();
|
|
||||||
|
|
||||||
private String cancel = null;
|
protected final ExemptionManager exMan = new ExemptionManager();
|
||||||
private long cancelTicks = 0;
|
|
||||||
|
|
||||||
private final Map<CheckType, Integer> cancelChecks = new HashMap<CheckType, Integer>();
|
/** Normal click per block skills. */
|
||||||
|
protected final CheckType[] exemptBreakNormal = new CheckType[]{
|
||||||
|
CheckType.BLOCKBREAK_FASTBREAK, CheckType.BLOCKBREAK_FREQUENCY,
|
||||||
|
CheckType.BLOCKBREAK_NOSWING,
|
||||||
|
};
|
||||||
|
|
||||||
public HookFacadeImpl(){
|
|
||||||
|
protected final CheckType[] exemptBreakMany = new CheckType[]{
|
||||||
|
CheckType.BLOCKBREAK, CheckType.COMBINED_IMPROBABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Fighting damage of effects such as bleeding or area (potentially). */
|
||||||
|
protected final CheckType[] exemptFightEffect = new CheckType[]{
|
||||||
|
CheckType.FIGHT_SPEED, CheckType.FIGHT_DIRECTION,
|
||||||
|
CheckType.FIGHT_ANGLE, CheckType.FIGHT_NOSWING,
|
||||||
|
CheckType.FIGHT_REACH, CheckType.COMBINED_IMPROBABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Presets for after failure exemption.
|
||||||
|
protected final Map<CheckType, Integer> cancelChecksBlockBreak = new HashMap<CheckType, Integer>();
|
||||||
|
// protected final Map<CheckType, Integer> cancelChecksBlockDamage = new HashMap<CheckType, Integer>();
|
||||||
|
// protected final Map<CheckType, Integer> cancelChecksDamage = new HashMap<CheckType, Integer>();
|
||||||
|
|
||||||
|
protected int clicksPerSecond;
|
||||||
|
protected String cancel = null;
|
||||||
|
protected long cancelTicks = 0;
|
||||||
|
|
||||||
|
protected final Map<CheckType, Integer> cancelChecks = new HashMap<CheckType, Integer>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last block breaking time
|
||||||
|
*/
|
||||||
|
protected final Map<String, ActionFrequency> lastBreak = new HashMap<String, ActionFrequency>(50);
|
||||||
|
|
||||||
|
/** Counter for nested events to cancel break counting. */
|
||||||
|
protected int breakCancel = 0;
|
||||||
|
|
||||||
|
protected int lastBreakAddCount = 0;
|
||||||
|
protected long lastBreakCleanup = 0;
|
||||||
|
|
||||||
|
public HookFacadeImpl(int clicksPerSecond){
|
||||||
|
this.clicksPerSecond = clicksPerSecond;
|
||||||
cancelChecksBlockBreak.put(CheckType.BLOCKBREAK_NOSWING, 1);
|
cancelChecksBlockBreak.put(CheckType.BLOCKBREAK_NOSWING, 1);
|
||||||
cancelChecksBlockBreak.put(CheckType.BLOCKBREAK_FASTBREAK, 2);
|
cancelChecksBlockBreak.put(CheckType.BLOCKBREAK_FASTBREAK, 1);
|
||||||
cancelChecksBlockDamage.put(CheckType.BLOCKBREAK_FASTBREAK, 1);
|
//
|
||||||
|
// cancelChecksBlockDamage.put(CheckType.BLOCKBREAK_FASTBREAK, 1);
|
||||||
cancelChecksDamage.put(CheckType.FIGHT_ANGLE, 1);
|
//
|
||||||
cancelChecksDamage.put(CheckType.FIGHT_SPEED, 1);
|
// cancelChecksDamage.put(CheckType.FIGHT_ANGLE, 1);
|
||||||
|
// cancelChecksDamage.put(CheckType.FIGHT_SPEED, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -38,14 +84,15 @@ public class HookFacadeImpl implements HookFacade, NCPHook {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getHookVersion() {
|
public String getHookVersion() {
|
||||||
return "1.0.0";
|
return "2.0";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean onCheckFailure(CheckType checkType, final Player player) {
|
public final boolean onCheckFailure(CheckType checkType, final Player player) {
|
||||||
// System.out.println("[cncp] Handle event: " + event.getEventName());
|
// System.out.println(player.getName() + " -> " + checkType + "---------------------------");
|
||||||
|
// Somewhat generic canceling mechanism (within the same tick).
|
||||||
|
// Might later fail, if block break event gets scheduled after block damage having set insta break, instead of letting them follow directly.
|
||||||
if (cancel == null){
|
if (cancel == null){
|
||||||
// System.out.println("[cncp] Return on cancel == null: "+event.getPlayer().getName());
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,22 +100,17 @@ public class HookFacadeImpl implements HookFacade, NCPHook {
|
|||||||
if (cancel.equals(name)){
|
if (cancel.equals(name)){
|
||||||
|
|
||||||
if (player.getTicksLived() != cancelTicks){
|
if (player.getTicksLived() != cancelTicks){
|
||||||
// System.out.println("[cncp] No cancel (ticks/player): "+event.getPlayer().getName());
|
|
||||||
cancel = null;
|
cancel = null;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
final Integer n = cancelChecks.get(checkType);
|
final Integer n = cancelChecks.get(checkType);
|
||||||
if (n == null){
|
if (n == null){
|
||||||
// System.out.println("[cncp] Expired("+check+"): "+event.getPlayer().getName());
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (n > 0){
|
else if (n > 0){
|
||||||
// System.out.println("Check with n = "+n);
|
|
||||||
if (n == 1) cancelChecks.remove(checkType);
|
if (n == 1) cancelChecks.remove(checkType);
|
||||||
else cancelChecks.put(checkType, n - 1);
|
else cancelChecks.put(checkType, n - 1);
|
||||||
}
|
}
|
||||||
// else: allow arbitrary numbers
|
|
||||||
// System.out.println("[cncp] Cancel: "+event.getPlayer().getName());
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,25 +124,114 @@ public class HookFacadeImpl implements HookFacade, NCPHook {
|
|||||||
this.cancelChecks.putAll(cancelChecks);
|
this.cancelChecks.putAll(cancelChecks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public ToolProps getToolProps(final ItemStack stack){
|
||||||
public final void setPlayerDamage(final Player player) {
|
if (stack == null) return BlockUtils.noTool;
|
||||||
setPlayer(player, cancelChecksDamage);
|
else return BlockUtils.getToolProps(stack.getTypeId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addExemption(final Player player, final CheckType[] types){
|
||||||
|
for (final CheckType type : types){
|
||||||
|
exMan.addExemption(player, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeExemption(final Player player, final CheckType[] types){
|
||||||
|
for (final CheckType type : types){
|
||||||
|
exMan.removeExemption(player, type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void setPlayerBlockDamage(final Player player) {
|
public final void damageLowest(final Player player) {
|
||||||
setPlayer(player, cancelChecksBlockDamage);
|
// System.out.println("damage lowest");
|
||||||
|
// setPlayer(player, cancelChecksDamage);
|
||||||
|
addExemption(player, exemptFightEffect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void setPlayerBlockBreak(final Player player) {
|
public final void blockDamageLowest(final Player player) {
|
||||||
setPlayer(player, cancelChecksBlockBreak);
|
// System.out.println("block damage lowest");
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("CompatNoCheatPlus"), new Runnable() {
|
// setPlayer(player, cancelChecksBlockDamage);
|
||||||
@Override
|
if (getToolProps(player.getItemInHand()).toolType == ToolType.AXE) addExemption(player, exemptBreakMany);
|
||||||
public void run() {
|
else addExemption(player, exemptBreakNormal);
|
||||||
CheckType.removeData(player.getName(), CheckType.BLOCKBREAK_FASTBREAK);
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean blockBreakLowest(final Player player) {
|
||||||
|
// System.out.println("block break lowest");
|
||||||
|
final boolean isAxe = getToolProps(player.getItemInHand()).toolType == ToolType.AXE;
|
||||||
|
if (breakCancel > 0){
|
||||||
|
breakCancel ++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
final String name = player.getName();
|
||||||
|
ActionFrequency freq = lastBreak.get(name);
|
||||||
|
final long now = System.currentTimeMillis();
|
||||||
|
if (freq == null){
|
||||||
|
freq = new ActionFrequency(3, 333);
|
||||||
|
freq.add(now, 1f);
|
||||||
|
lastBreak.put(name, freq);
|
||||||
|
lastBreakAddCount ++;
|
||||||
|
if (lastBreakAddCount > 100){
|
||||||
|
lastBreakAddCount = 0;
|
||||||
|
cleanupLastBreaks();
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
else if (!isAxe){
|
||||||
|
freq.add(now, 1f);
|
||||||
|
if (freq.getScore(1f) > (float) clicksPerSecond){
|
||||||
|
breakCancel ++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addExemption(player, exemptBreakNormal);
|
||||||
|
if (!isAxe){
|
||||||
|
setPlayer(player, cancelChecksBlockBreak);
|
||||||
|
Bukkit.getScheduler().scheduleSyncDelayedTask(CompatNoCheatPlus.getInstance(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
CheckType.removeData(player.getName(), CheckType.BLOCKBREAK_FASTBREAK);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void cleanupLastBreaks() {
|
||||||
|
final long ts = System.currentTimeMillis();
|
||||||
|
if (ts - lastBreakCleanup < 30000) return;
|
||||||
|
lastBreakCleanup = ts;
|
||||||
|
final List<String> rem = new LinkedList<String>();
|
||||||
|
for (final Entry<String, ActionFrequency> entry : lastBreak.entrySet()){
|
||||||
|
if (entry.getValue().getScore(1f) == 0f) rem.add(entry.getKey());
|
||||||
|
}
|
||||||
|
for (final String key :rem){
|
||||||
|
lastBreak.remove(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void damageMonitor(Player player) {
|
||||||
|
// System.out.println("damage monitor");
|
||||||
|
removeExemption(player, exemptFightEffect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void blockDamageMonitor(Player player) {
|
||||||
|
// System.out.println("block damage monitor");
|
||||||
|
if (getToolProps(player.getItemInHand()).toolType == ToolType.AXE) addExemption(player, exemptBreakMany);
|
||||||
|
else removeExemption(player, exemptBreakNormal);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void blockBreakMontitor(Player player) {
|
||||||
|
if (breakCancel > 0){
|
||||||
|
breakCancel --;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// System.out.println("block break monitor");
|
||||||
|
removeExemption(player, exemptBreakNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package me.asofold.bpl.cncp.hooks.mcmmo;
|
package me.asofold.bpl.cncp.hooks.mcmmo;
|
||||||
|
|
||||||
|
import me.asofold.bpl.cncp.config.compatlayer.CompatConfig;
|
||||||
|
import me.asofold.bpl.cncp.config.compatlayer.CompatConfigFactory;
|
||||||
|
import me.asofold.bpl.cncp.config.compatlayer.ConfigUtil;
|
||||||
import me.asofold.bpl.cncp.hooks.AbstractHook;
|
import me.asofold.bpl.cncp.hooks.AbstractHook;
|
||||||
|
import me.asofold.bpl.cncp.hooks.generic.ConfigurableHook;
|
||||||
import me.asofold.bpl.cncp.utils.PluginGetter;
|
import me.asofold.bpl.cncp.utils.PluginGetter;
|
||||||
|
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
@ -17,7 +21,7 @@ import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
|
|||||||
import fr.neatmonster.nocheatplus.checks.CheckType;
|
import fr.neatmonster.nocheatplus.checks.CheckType;
|
||||||
import fr.neatmonster.nocheatplus.hooks.NCPHook;
|
import fr.neatmonster.nocheatplus.hooks.NCPHook;
|
||||||
|
|
||||||
public final class HookmcMMO extends AbstractHook implements Listener {
|
public final class HookmcMMO extends AbstractHook implements Listener, ConfigurableHook {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To let the listener access this.
|
* To let the listener access this.
|
||||||
@ -25,13 +29,24 @@ public final class HookmcMMO extends AbstractHook implements Listener {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public static interface HookFacade{
|
public static interface HookFacade{
|
||||||
public void setPlayerDamage(Player player);
|
public void damageLowest(Player player);
|
||||||
public void setPlayerBlockDamage(Player player);
|
public void damageMonitor(Player player);
|
||||||
public void setPlayerBlockBreak(Player player);
|
public void blockDamageLowest(Player player);
|
||||||
|
public void blockDamageMonitor(Player player);
|
||||||
|
/**
|
||||||
|
* If to cancel the event.
|
||||||
|
* @param player
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean blockBreakLowest(Player player);
|
||||||
|
public void blockBreakMontitor(Player player);
|
||||||
}
|
}
|
||||||
|
|
||||||
private HookFacade ncpHook = null;
|
protected HookFacade ncpHook = null;
|
||||||
|
|
||||||
|
protected boolean enabled = true;
|
||||||
|
|
||||||
|
protected String configPrefix = "mcmmo.";
|
||||||
|
|
||||||
|
|
||||||
public HookmcMMO(){
|
public HookmcMMO(){
|
||||||
@ -39,7 +54,9 @@ public final class HookmcMMO extends AbstractHook implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private final PluginGetter<mcMMO> fetch = new PluginGetter<mcMMO>("mcMMO");
|
protected final PluginGetter<mcMMO> fetch = new PluginGetter<mcMMO>("mcMMO");
|
||||||
|
|
||||||
|
protected int blocksPerSecond = 30;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -50,14 +67,21 @@ public final class HookmcMMO extends AbstractHook implements Listener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getHookVersion() {
|
public String getHookVersion() {
|
||||||
return "1.2";
|
return "2.0";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CheckType[] getCheckTypes() {
|
public CheckType[] getCheckTypes() {
|
||||||
return new CheckType[]{
|
return new CheckType[]{
|
||||||
CheckType.BLOCKBREAK_FASTBREAK, CheckType.BLOCKBREAK_NOSWING,
|
CheckType.BLOCKBREAK_FASTBREAK, CheckType.BLOCKBREAK_NOSWING, // old ones
|
||||||
CheckType.FIGHT_ANGLE, CheckType.FIGHT_SPEED,
|
|
||||||
|
// CheckType.BLOCKBREAK_DIRECTION, CheckType.BLOCKBREAK_FREQUENCY,
|
||||||
|
// CheckType.BLOCKBREAK_WRONGBLOCK, CheckType.BLOCKBREAK_REACH,
|
||||||
|
//
|
||||||
|
// CheckType.FIGHT_ANGLE, CheckType.FIGHT_SPEED, // old ones
|
||||||
|
//
|
||||||
|
// CheckType.FIGHT_DIRECTION, CheckType.FIGHT_NOSWING,
|
||||||
|
// CheckType.FIGHT_REACH,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,33 +91,84 @@ public final class HookmcMMO extends AbstractHook implements Listener {
|
|||||||
return new Listener[]{this, fetch};
|
return new Listener[]{this, fetch};
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority=EventPriority.LOWEST)
|
|
||||||
final void onDamageLowest(final FakeEntityDamageByEntityEvent event){
|
|
||||||
// TODO might change with API
|
|
||||||
final Entity entity = event.getDamager();
|
|
||||||
if (entity instanceof Player)
|
|
||||||
ncpHook.setPlayerDamage((Player) entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@EventHandler(priority=EventPriority.LOWEST)
|
|
||||||
final void onBlockBreakLowest(final FakeBlockBreakEvent event){
|
|
||||||
ncpHook.setPlayerBlockBreak(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority=EventPriority.LOWEST)
|
|
||||||
final void onBlockDamageLowest(final FakeBlockDamageEvent event){
|
|
||||||
ncpHook.setPlayerBlockDamage(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NCPHook getNCPHook() {
|
public NCPHook getNCPHook() {
|
||||||
if (ncpHook == null){
|
if (ncpHook == null){
|
||||||
ncpHook = new HookFacadeImpl();
|
ncpHook = new HookFacadeImpl(blocksPerSecond);
|
||||||
}
|
}
|
||||||
return (NCPHook) ncpHook;
|
return (NCPHook) ncpHook;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////
|
||||||
|
// Damage (fight)
|
||||||
|
//////////////////////////
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.LOWEST)
|
||||||
|
final void onDamageLowest(final FakeEntityDamageByEntityEvent event){
|
||||||
|
final Entity entity = event.getDamager();
|
||||||
|
if (entity instanceof Player)
|
||||||
|
ncpHook.damageLowest((Player) entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.MONITOR)
|
||||||
|
final void onDamageMonitor(final FakeEntityDamageByEntityEvent event){
|
||||||
|
final Entity entity = event.getDamager();
|
||||||
|
if (entity instanceof Player)
|
||||||
|
ncpHook.damageMonitor((Player) entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////
|
||||||
|
// Block damage
|
||||||
|
//////////////////////////
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.LOWEST)
|
||||||
|
final void onBlockDamageLowest(final FakeBlockDamageEvent event){
|
||||||
|
ncpHook.blockDamageLowest(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.LOWEST)
|
||||||
|
final void onBlockDamageMonitor(final FakeBlockDamageEvent event){
|
||||||
|
ncpHook.blockDamageMonitor(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////
|
||||||
|
// Block break
|
||||||
|
//////////////////////////
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.LOWEST)
|
||||||
|
final void onBlockBreakLowest(final FakeBlockBreakEvent event){
|
||||||
|
if (ncpHook.blockBreakLowest(event.getPlayer())){
|
||||||
|
event.setCancelled(true);
|
||||||
|
// System.out.println("Cancelled for frequency.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.MONITOR)
|
||||||
|
final void onBlockBreakLMonitor(final FakeBlockBreakEvent event){
|
||||||
|
ncpHook.blockBreakMontitor(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////
|
||||||
|
// Config
|
||||||
|
/////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyConfig(CompatConfig cfg, String prefix) {
|
||||||
|
enabled = cfg.getBoolean(prefix + configPrefix + "enabled", true);
|
||||||
|
blocksPerSecond = cfg.getInt(prefix + configPrefix + "clickspersecond", 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateConfig(CompatConfig cfg, String prefix) {
|
||||||
|
CompatConfig defaults = CompatConfigFactory.getConfig(null);
|
||||||
|
defaults.set(prefix + configPrefix + "enabled", true);
|
||||||
|
defaults.set(prefix + configPrefix + "clickspersecond", 30);
|
||||||
|
return ConfigUtil.forceDefaults(defaults, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user