diff --git a/CompatNoCheatPlus/plugin.yml b/CompatNoCheatPlus/plugin.yml
index 14a322b..0c6caab 100644
--- a/CompatNoCheatPlus/plugin.yml
+++ b/CompatNoCheatPlus/plugin.yml
@@ -1,6 +1,6 @@
name: CompatNoCheatPlus
main: me.asofold.bpl.cncp.CompatNoCheatPlus
-version: 4.0.0
+version: 5.0.0
depend:
- NoCheatPlus
softdepend:
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/CompatNoCheatPlus.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/CompatNoCheatPlus.java
index 9f7ac61..aecfab4 100644
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/CompatNoCheatPlus.java
+++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/CompatNoCheatPlus.java
@@ -12,31 +12,20 @@ import me.asofold.bpl.cncp.config.compatlayer.CompatConfig;
import me.asofold.bpl.cncp.config.compatlayer.NewConfig;
import me.asofold.bpl.cncp.hooks.Hook;
import me.asofold.bpl.cncp.hooks.generic.HookPlayerClass;
-import me.asofold.bpl.cncp.hooks.ncp.CheckType;
-import me.asofold.bpl.cncp.hooks.ncp.NCPHook;
-import me.asofold.bpl.cncp.hooks.ncp.NCPHookManager;
import me.asofold.bpl.cncp.setttings.Settings;
import me.asofold.bpl.cncp.utils.Utils;
import org.bukkit.Bukkit;
import org.bukkit.Server;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
-import fr.neatmonster.nocheatplus.checks.CheckEvent;
-import fr.neatmonster.nocheatplus.checks.blockbreak.Direction.DirectionEvent;
-import fr.neatmonster.nocheatplus.checks.blockbreak.FastBreak.FastBreakEvent;
-import fr.neatmonster.nocheatplus.checks.blockbreak.NoSwing.NoSwingEvent;
-import fr.neatmonster.nocheatplus.checks.fight.Angle.AngleEvent;
-import fr.neatmonster.nocheatplus.checks.fight.Speed.SpeedEvent;
-import fr.neatmonster.nocheatplus.checks.moving.CreativeFly.CreativeFlyEvent;
-import fr.neatmonster.nocheatplus.checks.moving.NoFall.NoFallEvent;
-import fr.neatmonster.nocheatplus.checks.moving.SurvivalFly.SurvivalFlyEvent;
+import fr.neatmonster.nocheatplus.checks.CheckType;
+import fr.neatmonster.nocheatplus.hooks.NCPHook;
+import fr.neatmonster.nocheatplus.hooks.NCPHookManager;
/**
* Quick attempt to provide compatibility to NoCheatPlus (by NeatMonster) for some other plugins that change the vanilla game mechanichs, for instance by fast block breaking.
@@ -245,25 +234,5 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
super.onDisable();
}
- @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled=true)
- final void onCheckFail(final CheckEvent event){
-
- // TODO: This will be replaced by NCP invoking NCPHookManager.should... directly.
-
- final CheckType checkId;
-
- // horrible :)
- if (event instanceof SurvivalFlyEvent) checkId = CheckType.MOVING_SURVIVALFLY;
- else if (event instanceof CreativeFlyEvent) checkId = CheckType.MOVING_CREATIVEFLY;
- else if (event instanceof NoFallEvent) checkId = CheckType.MOVING_NOFALL;
- else if (event instanceof FastBreakEvent) checkId = CheckType.BLOCKBREAK_FASTBREAK;
- else if (event instanceof NoSwingEvent) checkId = CheckType.BLOCKBREAK_NOSWING;
- else if (event instanceof DirectionEvent) checkId = CheckType.BLOCKBREAK_DIRECTION;
- else if (event instanceof SpeedEvent) checkId = CheckType.FIGHT_SPEED;
- else if (event instanceof AngleEvent) checkId = CheckType.FIGHT_ANGLE;
- else checkId = CheckType.UNKNOWN;
-
- if (NCPHookManager.shouldCancelVLProcessing(checkId, event.getPlayer())) event.setCancelled(true);
- }
}
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/AbstractHook.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/AbstractHook.java
index cfb2bf8..797ccf6 100644
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/AbstractHook.java
+++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/AbstractHook.java
@@ -1,10 +1,10 @@
package me.asofold.bpl.cncp.hooks;
-import me.asofold.bpl.cncp.hooks.ncp.CheckType;
-
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
+import fr.neatmonster.nocheatplus.checks.CheckType;
+
/**
* Extend this to make sure that future changes will not break your hooks.
* Probable changes:
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/Hook.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/Hook.java
index 43d9f4c..a07f20f 100644
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/Hook.java
+++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/Hook.java
@@ -1,10 +1,10 @@
package me.asofold.bpl.cncp.hooks;
-import me.asofold.bpl.cncp.hooks.ncp.CheckType;
-import me.asofold.bpl.cncp.hooks.ncp.NCPHook;
-
import org.bukkit.event.Listener;
+import fr.neatmonster.nocheatplus.checks.CheckType;
+import fr.neatmonster.nocheatplus.hooks.NCPHook;
+
/**
* Interface for hooking into another plugin.
* NOTE: You also have to implement the methods described in NCPHook.
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookPlayerClass.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookPlayerClass.java
index ba6a92f..20d3250 100644
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookPlayerClass.java
+++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/generic/HookPlayerClass.java
@@ -5,10 +5,11 @@ import java.util.HashSet;
import java.util.Set;
import me.asofold.bpl.cncp.hooks.AbstractHook;
-import me.asofold.bpl.cncp.hooks.ncp.CheckType;
import org.bukkit.entity.Player;
+import fr.neatmonster.nocheatplus.checks.CheckType;
+
public final class HookPlayerClass extends AbstractHook {
private final Set classNames = new HashSet();
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 0419f87..2f30687 100644
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookmcMMO.java
+++ b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/mcmmo/HookmcMMO.java
@@ -4,7 +4,6 @@ import java.util.HashMap;
import java.util.Map;
import me.asofold.bpl.cncp.hooks.AbstractHook;
-import me.asofold.bpl.cncp.hooks.ncp.CheckType;
import me.asofold.bpl.cncp.utils.PluginGetter;
import org.bukkit.entity.Entity;
@@ -18,6 +17,8 @@ import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
+import fr.neatmonster.nocheatplus.checks.CheckType;
+
public final class HookmcMMO extends AbstractHook implements Listener {
private static final Map cancelChecksBlockBreak = new HashMap();
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/AbstractNCPHook.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/AbstractNCPHook.java
deleted file mode 100644
index b6e783d..0000000
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/AbstractNCPHook.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package me.asofold.bpl.cncp.hooks.ncp;
-
-
-/**
- * Extend this class for maximum future compatibility.
- * Especially the onCheckFailure method might get extended with check specific arguments,
- * this class will provide compatibility with older method signatures, where possible.
- * @author mc_dev
- *
- */
-public abstract class AbstractNCPHook implements NCPHook {
-
-}
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/CheckType.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/CheckType.java
deleted file mode 100644
index 86d3ebb..0000000
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/CheckType.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package me.asofold.bpl.cncp.hooks.ncp;
-
-/**
- * Type of checks and their groups (potentially parents).
- * @author mc_dev
- *
- */
-public enum CheckType {
-
- // GENERAL
- /**
- * Use to register for all checks.
- */
- ALL,
-
- /**
- * Do not use to register, only for internals / compatibility issues,
- * it might be passed to NCPHook.onCheckFailure.
- */
- UNKNOWN,
-
- // MOVING
- MOVING,
- MOVING_NOFALL(MOVING),
- MOVING_SURVIVALFLY(MOVING),
- MOVING_CREATIVEFLY(MOVING),
- MOVING_MOREPACKETS(MOVING),
-
- // FIGHT
- FIGHT,
- FIGHT_SPEED(FIGHT),
- FIGHT_NOSWING(FIGHT),
- FIGHT_DIRECTION(FIGHT),
- FIGHT_REACH(FIGHT),
- FIGHT_ANGLE(FIGHT),
- FIGHT_CRITICAL(FIGHT),
- FIGHT_GODMODE(FIGHT),
- FIGHT_INSTANTHEAL(FIGHT),
- FIGHT_KNOCKBACK(FIGHT),
-
- // BLOCKBREAK
- BLOCKBREAK,
- BLOCKBREAK_FASTBREAK(BLOCKBREAK),
- BLOCKBREAK_NOSWING(BLOCKBREAK),
- BLOCKBREAK_DIRECTION(BLOCKBREAK),
- BLOCKBREAK_REACH(BLOCKBREAK),
-
- // BLOCKPLACE
- BLOCKPLACE,
- BLOCKPLACE_FASTPLACE(BLOCKPLACE),
- BLOCKPLACE_NOSWING(BLOCKPLACE),
- BLOCKPLACE_DIRECTION(BLOCKPLACE),
- BLOCKPLACE_SPEED(BLOCKPLACE),
- BLOCKPLACE_REACH(BLOCKPLACE),
-
- // BLOCKINTERACT
- BLOCKINTERACT,
- BLOCKINTERACT_NOSWING(BLOCKINTERACT),
- BLOCKINTERACT_DIRECTION(BLOCKINTERACT),
- BLOCKINTERACT_REACH(BLOCKINTERACT),
-
- // INVENTORY
- INVENTORY,
- INVENTORY_DROP(INVENTORY),
- INVENTORY_INSTANTBOW(INVENTORY),
- INVENTORY_INSTANTEAT(INVENTORY),
-
- // CHAT
- CHAT,
- CHAT_ARRIVALS(CHAT),
- CHAT_NOPWNAGE(CHAT),
-
- ; // end of members.
-
- /**
- * The check group, null if it is a group itself.
- */
- public final CheckType group;
-
- private CheckType(){
- group = null;
- }
-
- private CheckType(CheckType group){
- this.group = group;
- }
-}
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/NCPHook.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/NCPHook.java
deleted file mode 100644
index be5ccb8..0000000
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/NCPHook.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package me.asofold.bpl.cncp.hooks.ncp;
-
-import org.bukkit.entity.Player;
-
-/**
- * Compatibility hooks have to implement this.
- * To set VL etc they have to make use of another API,
- * be it in NCPHookManager or probably rather better in NCP or some NCPAPI class.
- * @author mc_dev
- *
- */
-public interface NCPHook{
-
- /**
- * For logging purposes.
- * @return
- */
- public String getHookName();
-
- /**
- * For logging purposes.
- * @return
- */
- public String getHookVersion();
-
- /**
- * This is called on failure of a check.
- * This is the minimal interface, it might later be extended by specific information
- * like (target) locations and VL, but with this a lot is possible already (see cncp).
- * See AbstractNCPHook for future compatibility questions.
- * @param checkType the check that failed.
- * @param player The player that failed the check.
- * @return If to cancel the check failure processing.
- */
- public boolean onCheckFailure(CheckType checkType, Player player);
-
-}
-
-
diff --git a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/NCPHookManager.java b/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/NCPHookManager.java
deleted file mode 100644
index f8da7f0..0000000
--- a/CompatNoCheatPlus/src/me/asofold/bpl/cncp/hooks/ncp/NCPHookManager.java
+++ /dev/null
@@ -1,328 +0,0 @@
-package me.asofold.bpl.cncp.hooks.ncp;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-
-
-/**
- * After-check-failure hook manager to be integrated into NoCheatPlus.
- *
- *
- * Questions: sync for registering, or extra map for chat ? [maybe setLocked flag with sync object just for changing and query from external thread]
- *
- * @author mc_dev
- *
- */
-public final class NCPHookManager {
-
-
- /* ----------------------------------------------------------------------- */
- /* Internal data: */
-
- /**
- * Ids given to hooks.
- */
- private static int maxHookId = 0;
-
- /**
- * Hook id to hook.
- */
- private final static Map allHooks = new HashMap();
-
- /**
- * Mapping the check types to the hooks.
- */
- private static final Map> hooksByChecks = new HashMap>();
-
- /* ----------------------------------------------------------------- */
- /* Internals: manage hooks internally */
-
- private static Integer getNewHookId(){
- maxHookId ++;
- return maxHookId;
- }
-
- /**
- * for registration purposes only.
- * @param hook
- * @return Unique id associated with that hook (returns an existing id if hook is already present).
- */
- private static Integer getId(NCPHook hook){
- if (hook == null) throw new NullPointerException("Hooks must not be null."); // just in case.
- Integer id = null;
- for (Integer refId : allHooks.keySet()){
- if (hook == allHooks.get(refId)){
- id = refId;
- break;
- }
- }
- if (id == null){
- id = getNewHookId();
- allHooks.put(id, hook);
- }
- return id;
- }
-
- /**
- * Add hook to the hooksByChecks mappings, for the check type and if present, group type.
- * assumes that the hook already has been registered in the allHooks map.
- * @param checkType
- * @param hook
- */
- private static void addToMappings(CheckType checkType, NCPHook hook) {
- addToMapping(checkType, hook);
- if (checkType.group != null) addToMapping(checkType.group, hook);
- }
-
- /**
- * Add to the mapping for given check type (only).
- * @param checkId
- * @param hook
- */
- private static void addToMapping(CheckType checkType, NCPHook hook) {
- List hooks = hooksByChecks.get(checkType);
- if (hooks == null){
- hooks = new ArrayList();
- hooks.add(hook);
- hooksByChecks.put(checkType, hooks);
- }
- else if (!hooks.contains(hook)) hooks.add(hook);
- }
-
- /**
- * Remove from internal mappings, both allHooks and hooksByChecks.
- * @param hook
- * @param hookId
- */
- private static void removeFromMappings(NCPHook hook, Integer hookId) {
- allHooks.remove(hookId);
- List rem = new LinkedList();
- for (CheckType checkId : hooksByChecks.keySet()){
- List hooks = hooksByChecks.get(checkId);
- if (hooks.remove(hook)){
- if (hooks.isEmpty()) rem.add(checkId);
- }
- }
- for (CheckType checkId : rem){
- hooksByChecks.remove(checkId);
- }
- }
-
- private static final String getHookDescription(final NCPHook hook){
- return hook.getHookName() + " [" + hook.getHookVersion() + "]";
- }
-
- private static final void logHookAdded(NCPHook hook){
- Bukkit.getLogger().info("[NoCheatPlus/Compat] Added hook: " + getHookDescription(hook));
- }
-
- private static final void logHookRemoved(NCPHook hook){
- Bukkit.getLogger().info("[NoCheatPlus/Compat] Removed hook: " + getHookDescription(hook));
- }
-
- private static final void logHookFailure(final CheckType checkType, final Player player, final NCPHook hook, final Throwable t){
- // TODO: might accumulate failure rate and only log every so and so seconds or disable hook if spamming (leads to ncp spam though)?
- final StringBuilder builder = new StringBuilder(1024);
- builder.append("[NoCheatPlus/Compat] Hook " + getHookDescription(hook) + " encountered an unexpected exception:\n");
- builder.append("Processing: ");
- if (checkType.group != null) builder.append("Group " + checkType.group + " ");
- builder.append("Check " + checkType);
- builder.append(" Player " + player.getName());
- builder.append("\n");
- builder.append("Exception (" + t.getClass().getSimpleName() + "): " + t.getMessage() + "\n");
- for (StackTraceElement el : t.getStackTrace()){
- builder.append(el.toString());
- }
-
- Bukkit.getLogger().severe(builder.toString());
- }
-
- private static final boolean applyHooks(final CheckType checkType, final Player player, final List hooks) {
- for (int i = 0; i < hooks.size(); i ++){
- final NCPHook hook = hooks.get(i);
- try{
- if (hook.onCheckFailure(checkType, player)) return true;
- }
- catch (Throwable t){
- // TODO: maybe distinguish some exceptions here (Interrupted ?).
- logHookFailure(checkType, player, hook, t);
- }
- }
- return false;
- }
-
- /* ------------------------------------------------------------------------------------- */
- /* Internal API for NCP */
- /*
- * Internally NCP will now instead of events call hooks:
- */
-
- /**
- * This is called by checks when players fail them.
- * @param checkId Id for the check, should be taken from the constants defined in this class.
- * @param player The player that fails the check.
- * @return if to cancel the VL processing.
- */
- public static final boolean shouldCancelVLProcessing(final CheckType checkType, final Player player){
-
- // checks for hooks registered for all events, only for the group and specifically for the check.
- // A Paradigm could be to return true as soon as one hook has returned true.
-
- // Most specific:
- final List hooksCheck = hooksByChecks.get(checkType);
- if (hooksCheck != null){
- if (applyHooks(checkType, player, hooksCheck)) return true;
- }
-
- // Group:
- if (checkType.group != null){
- final List hooksGroup= hooksByChecks.get(checkType);
- if (hooksCheck != null){
- if (applyHooks(checkType, player, hooksGroup)) return true;
- }
- }
-
- // general (all):
- final List hooksAll = hooksByChecks.get(CheckType.ALL);
- if (hooksAll != null){
- if (applyHooks(checkType, player, hooksAll)) return true;
- }
-
- return false;
- }
-
-
- /* ----------------------------------------------------------------- */
- /* External API for adding hooks etc. */
-
- /**
- * Register a hook for a specific check type (all, group, or an individual check).
- * @param checkType
- * @param hook
- * @return An id to identify the hook, will return the existing id if the hook was already present somewhere.
- */
- public static Integer addHook(CheckType checkType, NCPHook hook){
- Integer hookId = getId(hook);
- addToMappings(checkType, hook);
- logHookAdded(hook);
- return hookId;
- }
-
- /**
- * Register a hook for several individual checks ids (all, group, or an individual checks).
- * @param checkTypes Array of check types to register the hook for. If you pass null this hook will be registered for all checks.
- * @param hook
- * @return
- */
- public static Integer addHook(CheckType[] checkTypes, NCPHook hook){
- if (checkTypes == null) checkTypes = new CheckType[]{CheckType.ALL};
- Integer hookId = getId(hook);
- for (CheckType checkType : checkTypes){
- addToMappings(checkType, hook);
- }
- logHookAdded(hook);
- return hookId;
- }
-
- /**
- * Remove a hook.
- * @param hook
- * @return hook id if present, null otherwise.
- */
- public static Integer removeHook(NCPHook hook){
- Integer hookId = null;
- for (Integer refId : allHooks.keySet()){
- if (hook == allHooks.get(refId)){
- hookId = refId;
- break;
- }
- }
- if (hookId == null) return null;
- removeFromMappings(hook, hookId);
- logHookRemoved(hook);
- return hookId;
- }
-
-
- /**
- * Remove a hook by its hook id (returned on adding hooks).
- * @param hookId if present, null otherwise.
- * @return
- */
- public static NCPHook removeHook(Integer hookId){
- NCPHook hook = allHooks.get(hookId);
- if (hook == null) return null;
- removeFromMappings(hook, hookId);
- logHookRemoved(hook);
- return hook;
- }
-
- /**
- * Remove a hook by its name (case sensitive, exact match).
- * @param hookName
- * @return
- */
- public static Collection removeHooks(String hookName){
- Collection hooks = getHooksByName(hookName);
- if (hooks.isEmpty()) return null;
- removeHooks(hooks);
- return hooks;
- }
-
- /**
- * Remove a collection of hooks.
- * @param hooks
- * @return A set of the removed hooks ids.
- */
- public static Set removeHooks(Collection hooks){
- Set ids = new HashSet();
- for (NCPHook hook : hooks){
- Integer id = removeHook(hook);
- if (id != null) ids.add(id);
- }
- return ids;
- }
-
- public static Collection removeAllHooks(){
- Collection hooks = getAllHooks();
- for (NCPHook hook : hooks){
- removeHook(hook);
- }
- return hooks;
- }
-
- /**
- * Get the hook by the hook name.
- * @param hookName case sensitive (exact match).
- * @return NCPHook if found, null otherwise.
- */
- public static Collection getHooksByName(String hookName){
- List hooks = new LinkedList();
- for (Integer refId : allHooks.keySet()){
- NCPHook hook = allHooks.get(refId);
- if (hook.getHookName().equals(hookName) && !hooks.contains(hook)) hooks.add(hook);
- }
- return hooks;
- }
-
- /**
- * Get a collection of all hooks.
- * @return
- */
- public static Collection getAllHooks(){
- List hooks = new LinkedList();
- hooks.addAll(allHooks.values());
- return hooks;
- }
-
-}