From a9f9a3dceddd05f109e754aa35f9b1f84d4d3d9e Mon Sep 17 00:00:00 2001 From: asofold Date: Wed, 26 Nov 2014 17:03:52 +0100 Subject: [PATCH] Prepare more changes to fight checks using (location trace based). * Use a SharedContext for properties used in all checks. * Rename (locationTraceChecks). --- .../nocheatplus/checks/fight/Direction.java | 4 ++-- .../checks/fight/FightListener.java | 20 +++++++++++-------- .../nocheatplus/checks/fight/Reach.java | 4 ++-- .../checks/fight/ReachContext.java | 4 ++-- .../checks/fight/SharedContext.java | 13 ++++++++++++ 5 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/SharedContext.java diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Direction.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Direction.java index 5ab1281c..3f215ca3 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Direction.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Direction.java @@ -95,13 +95,13 @@ public class Direction extends Check { * @param cc * @return */ - public DirectionContext getContext(final Player player, final Location loc, final Entity damaged, final Location damagedLoc, final FightData data, final FightConfig cc) { + public DirectionContext getContext(final Player player, final Location loc, final Entity damaged, final Location damagedLoc, final FightData data, final FightConfig cc, final SharedContext sharedContext) { final DirectionContext context = new DirectionContext(); context.damagedComplex = mcAccess.isComplexPart(damaged); // Find out how wide the entity is. context.damagedWidth = mcAccess.getWidth(damaged); // entity.height is broken and will always be 0, therefore. Calculate height instead based on boundingBox. - context.damagedHeight = mcAccess.getHeight(damaged); + context.damagedHeight = sharedContext.damagedHeight; context.direction = loc.getDirection(); context.lengthDirection = context.direction.length(); return context; diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java index 1d1499e2..fc2e27ae 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java @@ -240,7 +240,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{ if (reachEnabled || directionEnabled) { if (damagedTrace != null) { // Checks that use the LocationTrace instance of the attacked entity/player. - cancelled = movingTraceChecks(player, loc, data, cc, damaged, damagedLoc, damagedTrace, tick, reachEnabled, directionEnabled); + cancelled = locationTraceChecks(player, loc, data, cc, damaged, damagedLoc, damagedTrace, tick, reachEnabled, directionEnabled); } else { // Still use the classic methods for non-players. maybe[] if (reachEnabled && reach.check(player, loc, damaged, damagedLoc, data, cc)) { @@ -323,7 +323,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{ } /** - * Quick split-off: Checks using a moving trace. + * Quick split-off: Checks using a location trace. * @param player * @param loc * @param data @@ -337,12 +337,15 @@ public class FightListener extends CheckListener implements JoinLeaveListener{ * @param directionEnabled * @return If to cancel (true) or not (false). */ - private boolean movingTraceChecks(Player player, Location loc, FightData data, FightConfig cc, Entity damaged, Location damagedLoc, LocationTrace damagedTrace, long tick, boolean reachEnabled, boolean directionEnabled) { + private boolean locationTraceChecks(Player player, Location loc, FightData data, FightConfig cc, Entity damaged, Location damagedLoc, LocationTrace damagedTrace, long tick, boolean reachEnabled, boolean directionEnabled) { + // TODO: Order / splitting off generic stuff. boolean cancelled = false; - // TODO: Order / splitting off generic stuff. - final ReachContext reachContext = reachEnabled ? reach.getContext(player, loc, damaged, damagedLoc, data, cc) : null; - final DirectionContext directionContext = directionEnabled ? direction.getContext(player, loc, damaged, damagedLoc, data, cc) : null; - + + // (Might pass generic context to factories, for shared + heavy properties.) + final SharedContext sharedContext = new SharedContext(damaged, mcAccess); + final ReachContext reachContext = reachEnabled ? reach.getContext(player, loc, damaged, damagedLoc, data, cc, sharedContext) : null; + final DirectionContext directionContext = directionEnabled ? direction.getContext(player, loc, damaged, damagedLoc, data, cc, sharedContext) : null; + final long traceOldest = tick; // - damagedTrace.getMaxSize(); // TODO: Set by window. // TODO: Iterating direction, which, static/dynamic choice. final Iterator traceIt = damagedTrace.maxAgeIterator(traceOldest); @@ -364,7 +367,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{ reachPassed = true; } } - // TODO: For efficiency one could omit checking at all if reach is failed all the time. + // TODO: Efficiency: don't check at all, if strict and !thisPassed. if (directionEnabled && (reachPassed || !directionPassed)) { if (direction.loopCheck(player, damagedLoc, damaged, entry, directionContext, data, cc)) { thisPassed = false; @@ -380,6 +383,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{ } // TODO: How to treat mixed state: violation && reachPassed && directionPassed [current: use min violation // thinkable: silent cancel, if actions have cancel (!)] // TODO: Adapt according to strictness settings? + // TODO: violation vs. reachPassed + directionPassed (current: fail one = fail all). if (reachEnabled) { // TODO: Might ignore if already cancelled by mixed/silent cancel. if (reach.loopFinish(player, loc, damaged, reachContext, violation, data, cc)) { diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Reach.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Reach.java index 3615dd31..9e4e1acb 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Reach.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Reach.java @@ -145,11 +145,11 @@ public class Reach extends Check { * @param cc * @return */ - public ReachContext getContext(final Player player, final Location pLoc, final Entity damaged, final Location damagedLoc, final FightData data, final FightConfig cc) { + public ReachContext getContext(final Player player, final Location pLoc, final Entity damaged, final Location damagedLoc, final FightData data, final FightConfig cc, final SharedContext sharedContext) { final ReachContext context = new ReachContext(); context.distanceLimit = player.getGameMode() == GameMode.CREATIVE ? CREATIVE_DISTANCE : cc.reachSurvivalDistance + getDistMod(damaged); context.distanceMin = (context.distanceLimit - cc.reachReduceDistance) / context.distanceLimit; - context.damagedHeight = mcAccess.getHeight(damaged); + context.damagedHeight = sharedContext.damagedHeight; //context.eyeHeight = player.getEyeHeight(); context.pY = pLoc.getY() + player.getEyeHeight(); return context; diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/ReachContext.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/ReachContext.java index ea95a01c..f1cbf881 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/ReachContext.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/ReachContext.java @@ -10,8 +10,8 @@ public class ReachContext { public double distanceLimit; public double distanceMin; public double damagedHeight; - /** Attacking player. */ - public double eyeHeight; +// /** Attacking player. */ +// public double eyeHeight; /** Eye location y of the attacking player. */ public double pY; /** Minimum value of lenpRel that was a violation. */ diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/SharedContext.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/SharedContext.java new file mode 100644 index 00000000..0f775835 --- /dev/null +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/fight/SharedContext.java @@ -0,0 +1,13 @@ +package fr.neatmonster.nocheatplus.checks.fight; + +import org.bukkit.entity.Entity; + +import fr.neatmonster.nocheatplus.compat.MCAccess; + +public class SharedContext { + public final double damagedHeight; + + public SharedContext(Entity damaged, MCAccess mcAccess) { + this.damagedHeight = mcAccess.getHeight(damaged); + } +}