diff --git a/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java b/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java index 0ab56577..d3a321ba 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java +++ b/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java @@ -129,23 +129,23 @@ public class NoCheat extends JavaPlugin { log.log(level, message, cc); } - public BaseData getData(Player player) { - return data.getData(player); + public BaseData getData(String playerName) { + return data.getData(playerName); } - public void clearCriticalData(Player player) { - data.clearCriticalData(player); + public void clearCriticalData(String playerName) { + data.clearCriticalData(playerName); } - public void playerLeft(Player player) { + public void playerLeft(String playerName) { // Get rid of the critical data that's stored for player immediately - clearCriticalData(player); + clearCriticalData(playerName); - data.queueForRemoval(player); + data.queueForRemoval(playerName); } - public void playerJoined(Player player) { - data.unqueueForRemoval(player); + public void playerJoined(String playerName) { + data.unqueueForRemoval(playerName); } public Performance getPerformance(Type type) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/actions/ActionManager.java b/src/cc/co/evenprime/bukkit/nocheat/actions/ActionManager.java index ce13b38b..a4085e52 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/actions/ActionManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/actions/ActionManager.java @@ -30,7 +30,7 @@ public class ActionManager { boolean special = false; - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); // Always set this here "by hand" data.log.violationLevel = violationLevel; diff --git a/src/cc/co/evenprime/bukkit/nocheat/actions/types/ActionWithParameters.java b/src/cc/co/evenprime/bukkit/nocheat/actions/types/ActionWithParameters.java index be3cdaca..d8562c4c 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/actions/types/ActionWithParameters.java +++ b/src/cc/co/evenprime/bukkit/nocheat/actions/types/ActionWithParameters.java @@ -3,10 +3,13 @@ package cc.co.evenprime.bukkit.nocheat.actions.types; import java.util.ArrayList; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; +import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.data.LogData; +import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; public abstract class ActionWithParameters extends Action { @@ -99,29 +102,44 @@ public abstract class ActionWithParameters extends Action { // only equal switch (wildcard) { case PLAYER: - return data.player.getName(); + return data.playerName; case CHECK: return data.check; - case LOCATION: - Location l = data.player.getLocation(); - return String.format(Locale.US, "%.2f,%.2f,%.2f", l.getX(), l.getY(), l.getZ()); - - case WORLD: - return data.player.getWorld().getName(); + case LOCATION: { + Player player = Bukkit.getPlayer(data.playerName); + if(player != null) { + Location l = player.getLocation(); + return String.format(Locale.US, "%.2f,%.2f,%.2f", l.getX(), l.getY(), l.getZ()); + } + return "unknown"; + } + case WORLD: { + Player player = Bukkit.getPlayer(data.playerName); + if(player != null) { + return player.getWorld().getName(); + } + return "unknown"; + } case VIOLATIONS: return String.format(Locale.US, "%d", data.violationLevel); - case MOVEDISTANCE: - Location l2 = data.player.getLocation(); - Location t = data.toLocation; - if(t != null) { - return String.format(Locale.US, "%.2f,%.2f,%.2f", t.getX() - l2.getX(), t.getY() - l2.getY(), t.getZ() - l2.getZ()); - } else { - return "null"; + case MOVEDISTANCE: { + Player player = Bukkit.getPlayer(data.playerName); + if(player != null) { + Location l = player.getLocation(); + PreciseLocation t = data.toLocation; + if(t.isSet()) { + return String.format(Locale.US, "%.2f,%.2f,%.2f", t.x - l.getX(), t.y - l.getY(), t.z - l.getZ()); + } else { + return "null"; + } } + return "unknown"; + } + case REACHDISTANCE: return String.format(Locale.US, "%.2f", data.reachdistance); @@ -129,8 +147,12 @@ public abstract class ActionWithParameters extends Action { return String.format(Locale.US, "%.2f", data.falldistance); case LOCATION_TO: - Location to = data.toLocation; - return String.format(Locale.US, "%.2f,%.2f,%.2f", to.getX(), to.getY(), to.getZ()); + PreciseLocation to = data.toLocation; + if(to.isSet()) { + return String.format(Locale.US, "%.2f,%.2f,%.2f", to.x, to.y, to.z); + } else { + return "unknown"; + } case PACKETS: return String.valueOf(data.packets); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/CheckUtil.java b/src/cc/co/evenprime/bukkit/nocheat/checks/CheckUtil.java index 227d60b1..7cba9ba1 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/CheckUtil.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/CheckUtil.java @@ -9,11 +9,11 @@ import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; + /** * Some stuff that's used by different checks * - * @author Evenprime - * */ public class CheckUtil { @@ -21,7 +21,7 @@ public class CheckUtil { * Check if a player looks at a target of a specific size, with a specific * precision value (roughly) */ - public static double directionCheck(Player player, double targetX, double targetY, double targetZ, double targetWidth, double targetHeight, double precision) { + public static final double directionCheck(Player player, double targetX, double targetY, double targetZ, double targetWidth, double targetHeight, double precision) { // Eye location of the player Location eyes = player.getEyeLocation(); @@ -52,7 +52,7 @@ public class CheckUtil { return off; } - public static double reachCheck(Player player, double targetX, double targetY, double targetZ, double limit) { + public static final double reachCheck(Player player, double targetX, double targetY, double targetZ, double limit) { Location eyes = player.getEyeLocation(); @@ -108,10 +108,11 @@ public class CheckUtil { types[Material.TRAP_DOOR.getId()] |= SOLID | NONSOLID; } - public static boolean isSprinting(Player player) { - + public static final boolean isSprinting(final Player player) { + return !(player instanceof CraftPlayer) || (player.isSprinting() && player.getFoodLevel() > 5); } + /** * Check if certain coordinates are considered "on ground" * @@ -124,13 +125,13 @@ public class CheckUtil { * The precise location that was used for calculation of "values" * @return */ - public static int isLocationOnGround(final World world, final double x, final double y, final double z, boolean waterElevatorsAllowed) { + public static final int isLocationOnGround(final World world, final PreciseLocation location) { - final int lowerX = lowerBorder(x); - final int upperX = upperBorder(x); - final int Y = (int) Math.floor(y); - final int lowerZ = lowerBorder(z); - final int upperZ = upperBorder(z); + final int lowerX = lowerBorder(location.x); + final int upperX = upperBorder(location.x); + final int Y = (int) Math.floor(location.y); + final int lowerZ = lowerBorder(location.z); + final int upperZ = upperBorder(location.z); // Check the four borders of the players hitbox for something he could // be standing on @@ -145,20 +146,11 @@ public class CheckUtil { if(!isInGround(result)) { // Original location: X, Z (allow standing in walls this time) - if(isSolid(types[world.getBlockTypeIdAt(Location.locToBlock(x), Location.locToBlock(y), Location.locToBlock(z))])) { + if(isSolid(types[world.getBlockTypeIdAt(Location.locToBlock(location.x), Location.locToBlock(location.y), Location.locToBlock(location.z))])) { result |= INGROUND; } } - // Water elevators - optional "feature" - if(waterElevatorsAllowed && result == 0) { - result = types[world.getBlockTypeIdAt(lowerX + 1, Y + 1, lowerZ + 1)] | types[world.getBlockTypeIdAt(lowerX, Y + 1, lowerZ + 1)] | types[world.getBlockTypeIdAt(lowerX + 1, Y + 1, lowerZ)]; - - if((result & LIQUID) != 0) { - return INGROUND | ONGROUND; // WaterElevators don't really count - // as "water" - } - } return result; } @@ -171,10 +163,10 @@ public class CheckUtil { * @param z * @return */ - private static final int canStand(World world, int x, int y, int z) { + private static final int canStand(final World world, final int x, final int y, final int z) { - int standingIn = types[world.getBlockTypeIdAt(x, y, z)]; - int headIn = types[world.getBlockTypeIdAt(x, y + 1, z)]; + final int standingIn = types[world.getBlockTypeIdAt(x, y, z)]; + final int headIn = types[world.getBlockTypeIdAt(x, y + 1, z)]; int result = 0; @@ -187,7 +179,7 @@ public class CheckUtil { return LADDER; } - int standingOn = types[world.getBlockTypeIdAt(x, y - 1, z)]; + final int standingOn = types[world.getBlockTypeIdAt(x, y - 1, z)]; // Player standing with his feet in a (half) block? if((isSolid(standingIn) || standingOn == FENCE) && isNonSolid(headIn) && standingIn != FENCE) { @@ -202,27 +194,27 @@ public class CheckUtil { return result; } - public static final boolean isSolid(int value) { + public static final boolean isSolid(final int value) { return (value & SOLID) == SOLID; } - public static final boolean isLiquid(int value) { + public static final boolean isLiquid(final int value) { return (value & LIQUID) == LIQUID; } - private static final boolean isNonSolid(int value) { + private static final boolean isNonSolid(final int value) { return((value & NONSOLID) == NONSOLID); } - private static final boolean isLadder(int value) { + private static final boolean isLadder(final int value) { return((value & LADDER) == LADDER); } - public static boolean isOnGround(int fromType) { + public static final boolean isOnGround(final int fromType) { return isLadder(fromType) || (fromType & ONGROUND) == ONGROUND; } - public static boolean isInGround(int fromType) { + public static final boolean isInGround(final int fromType) { return isLadder(fromType) || isLiquid(fromType) || (fromType & INGROUND) == INGROUND; } @@ -233,17 +225,14 @@ public class CheckUtil { * @param d1 * @return */ - private static final int lowerBorder(double d1) { + private static final int lowerBorder(final double d1) { - double floor = Math.floor(d1); - double d4 = floor + magic; + final double floor = Math.floor(d1); - if(d4 <= d1) - d4 = 0; + if(floor + magic <= d1) + return (int) (floor); else - d4 = 1; - - return (int) (floor - d4); + return (int) (floor - 1); } /** @@ -253,20 +242,17 @@ public class CheckUtil { * @param d1 * @return */ - private static final int upperBorder(double d1) { + private static final int upperBorder(final double d1) { - double floor = Math.floor(d1); - double d4 = floor + magic2; + final double floor = Math.floor(d1); - if(d4 < d1) - d4 = -1; + if(floor + magic2 < d1) + return (int) (floor + 1); else - d4 = 0; - - return (int) (floor - d4); + return (int) floor; } - public static int getType(int typeId) { + public static int getType(final int typeId) { return types[typeId]; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java index d266a34d..6e7a40d6 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java @@ -23,10 +23,10 @@ public class DirectionCheck { public boolean check(Player player, Block brokenBlock, ConfigurationCache cc) { - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); // If the block is instabreak and we don't check instabreak, return - if(!cc.blockbreak.checkinstabreakblocks && brokenBlock.getLocation().equals(data.blockbreak.instaBrokeBlockLocation)) { + if(!cc.blockbreak.checkinstabreakblocks && data.blockbreak.instaBrokeBlockLocation.equals(brokenBlock)) { return false; } @@ -63,5 +63,4 @@ public class DirectionCheck { return cancel; } - } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java index 6881a333..61726408 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java @@ -30,7 +30,7 @@ public class ReachCheck { double distance = CheckUtil.reachCheck(player, brokenBlock.getX() + 0.5D, brokenBlock.getY() + 0.5D, brokenBlock.getZ() + 0.5D, player.getGameMode() == GameMode.CREATIVE ? cc.blockbreak.reachDistance + 2 : cc.blockbreak.reachDistance); - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); if(distance > 0D) { // Player failed the check diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/NoSwingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/NoSwingCheck.java new file mode 100644 index 00000000..9e75bd42 --- /dev/null +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/NoSwingCheck.java @@ -0,0 +1,32 @@ +package cc.co.evenprime.bukkit.nocheat.checks.blockplace; + +import org.bukkit.entity.Player; + +import cc.co.evenprime.bukkit.nocheat.NoCheat; +import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; +import cc.co.evenprime.bukkit.nocheat.data.BaseData; + +/** + * The noswingcheck will only identify if an action happened without a preceding "swing" + * + */ +public class NoSwingCheck { + + private final NoCheat plugin; + + public NoSwingCheck(NoCheat plugin) { + this.plugin = plugin; + } + + public boolean check(Player player, ConfigurationCache cc) { + + boolean cancel = false; + + BaseData data = plugin.getData(player.getName()); + + + + return cancel; + } + +} diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/OnLiquidCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/OnLiquidCheck.java index 7b8eaafd..366a018b 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/OnLiquidCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/OnLiquidCheck.java @@ -26,7 +26,7 @@ public class OnLiquidCheck { boolean cancel = false; - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); if(blockPlaced == null || blockPlaced.isEmpty() || (blockPlacedAgainst != null && isSolid(blockPlacedAgainst.getTypeId()))) { // all ok diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java index f7b22698..ba2527c8 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java @@ -29,7 +29,7 @@ public class ReachCheck { double distance = CheckUtil.reachCheck(player, placedAgainstBlock.getX() + 0.5D, placedAgainstBlock.getY() + 0.5D, placedAgainstBlock.getZ() + 0.5D, cc.blockplace.reachDistance); - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); if(distance > 0D) { // Player failed the check diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java index db081c17..6f443f15 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java @@ -37,7 +37,7 @@ public class ChatCheck { int time = plugin.getIngameSeconds(); - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); if(data.chat.spamLasttime + cc.chat.spamTimeframe <= time) { data.chat.spamLasttime = time; diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java index 9f8fda0e..76175ac5 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java @@ -44,7 +44,7 @@ public class FightCheck { // height to get the "center" of the hitbox double off = CheckUtil.directionCheck(player, entity.locX, entity.locY + 1.0D, entity.locZ, width, 2.0D, cc.fight.directionPrecision); - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); if(off < 0.1D) { // Player did probably nothing wrong diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java index 6c6d7d43..8970f292 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java @@ -4,14 +4,16 @@ import net.minecraft.server.EntityPlayer; import net.minecraft.server.MobEffectList; import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; +import cc.co.evenprime.bukkit.nocheat.config.cache.CCMoving; import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; import cc.co.evenprime.bukkit.nocheat.data.BaseData; +import cc.co.evenprime.bukkit.nocheat.data.MovingData; +import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; /** * A check designed for people that are allowed to fly. The complement to @@ -29,77 +31,82 @@ public class FlyingCheck { this.plugin = plugin; } - public Location check(Player player, Location from, Location to, ConfigurationCache cc) { + public PreciseLocation check(final Player player, final BaseData data, final ConfigurationCache cc) { - BaseData data = plugin.getData(player); + final MovingData moving = data.moving; + final PreciseLocation to = moving.to; + final PreciseLocation from = moving.from; + final PreciseLocation setBack = moving.runflySetBackPoint; - if(data.moving.runflySetBackPoint == null) { - data.moving.runflySetBackPoint = player.getLocation().clone(); + final CCMoving ccmoving = cc.moving; + + if(!setBack.isSet()) { + setBack.set(from); } - final double yDistance = to.getY() - from.getY(); + final double yDistance = to.y - from.y; // Calculate some distances - final double xDistance = to.getX() - from.getX(); - final double zDistance = to.getZ() - from.getZ(); + final double xDistance = to.x - from.x; + final double zDistance = to.z - from.z; final double horizontalDistance = Math.sqrt((xDistance * xDistance + zDistance * zDistance)); double result = 0; - Location newToLocation = null; + PreciseLocation newToLocation = null; // In case of creative gamemode, give at least 0.60 speed limit // horizontal - double speedLimitHorizontal = player.getGameMode() == GameMode.CREATIVE ? Math.max(creativeSpeed, cc.moving.flyingSpeedLimitHorizontal) : cc.moving.flyingSpeedLimitHorizontal; + double speedLimitHorizontal = player.getGameMode() == GameMode.CREATIVE ? Math.max(creativeSpeed, ccmoving.flyingSpeedLimitHorizontal) : ccmoving.flyingSpeedLimitHorizontal; EntityPlayer p = ((CraftPlayer) player).getHandle(); - + if(p.hasEffect(MobEffectList.FASTER_MOVEMENT)) { // Taken directly from Minecraft code, should work speedLimitHorizontal *= 1.0F + 0.2F * (float) (p.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier() + 1); } - - result += Math.max(0.0D, horizontalDistance - data.moving.horizFreedom - speedLimitHorizontal); + + result += Math.max(0.0D, horizontalDistance - moving.horizFreedom - speedLimitHorizontal); boolean sprinting = CheckUtil.isSprinting(player); - data.moving.bunnyhopdelay--; + moving.bunnyhopdelay--; // Did he go too far? if(result > 0 && sprinting) { // Try to treat it as a the "bunnyhop" problem - if(data.moving.bunnyhopdelay <= 0 && result < 0.4D) { - data.moving.bunnyhopdelay = 3; + if(moving.bunnyhopdelay <= 0 && result < 0.4D) { + moving.bunnyhopdelay = 3; result = 0; } } // super simple, just check distance compared to max distance - result += Math.max(0.0D, yDistance - data.moving.vertFreedom - cc.moving.flyingSpeedLimitVertical); + result += Math.max(0.0D, yDistance - moving.vertFreedom - ccmoving.flyingSpeedLimitVertical); result = result * 100; if(result > 0) { // Increment violation counter - data.moving.runflyViolationLevel += result; + moving.runflyViolationLevel += result; - data.log.toLocation = to; + data.log.toLocation.set(to); data.log.check = "flying/toofast"; - boolean cancel = plugin.execute(player, cc.moving.flyingActions, (int) data.moving.runflyViolationLevel, data.moving.history, cc); + boolean cancel = plugin.execute(player, ccmoving.flyingActions, (int) moving.runflyViolationLevel, moving.history, cc); // Was one of the actions a cancel? Then really do it if(cancel) { - newToLocation = data.moving.runflySetBackPoint; + newToLocation = setBack; } } // Slowly reduce the level with each event - data.moving.runflyViolationLevel *= 0.97; + moving.runflyViolationLevel *= 0.97; // Some other cleanup 'n' stuff if(newToLocation == null) { - data.moving.runflySetBackPoint = to.clone(); + setBack.set(to); } return newToLocation; diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java index 82a57046..e934b366 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java @@ -1,11 +1,12 @@ package cc.co.evenprime.bukkit.nocheat.checks.moving; -import org.bukkit.Location; import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; import cc.co.evenprime.bukkit.nocheat.data.BaseData; +import cc.co.evenprime.bukkit.nocheat.data.MovingData; +import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; /** * The morePacketsCheck (previously called SpeedhackCheck) will try to identify @@ -81,67 +82,63 @@ public class MorePacketsCheck { * 8. reset packetCounter, wait for next 20 ticks to pass by. * */ - public Location check(Player player, ConfigurationCache cc) { + public PreciseLocation check(final Player player, final BaseData data, final ConfigurationCache cc) { - Location newToLocation = null; + PreciseLocation newToLocation = null; - BaseData data = plugin.getData(player); + final MovingData moving = data.moving; - data.moving.morePacketsCounter++; - if(data.moving.morePacketsSetbackPoint == null) { - data.moving.morePacketsSetbackPoint = player.getLocation(); + moving.morePacketsCounter++; + if(!moving.morePacketsSetbackPoint.isSet()) { + moving.morePacketsSetbackPoint.set(moving.from); } int ingameSeconds = plugin.getIngameSeconds(); // Is at least a second gone by and has the server at least processed 20 // ticks since last time - if(ingameSeconds != data.moving.lastElapsedIngameSeconds) { + if(ingameSeconds != moving.lastElapsedIngameSeconds) { int limit = (int) ((packetsPerTimeframe * plugin.getIngameSecondDuration()) / 1000L); - int difference = limit - data.moving.morePacketsCounter; + int difference = limit - moving.morePacketsCounter; - data.moving.morePacketsBuffer += difference; - if(data.moving.morePacketsBuffer > bufferLimit) - data.moving.morePacketsBuffer = bufferLimit; + moving.morePacketsBuffer += difference; + if(moving.morePacketsBuffer > bufferLimit) + moving.morePacketsBuffer = bufferLimit; // Are we over the 22 event limit for that time frame now? (limit // increases with time) - int packetsAboveLimit = (int) -data.moving.morePacketsBuffer; + int packetsAboveLimit = (int) -moving.morePacketsBuffer; - if(data.moving.morePacketsBuffer < 0) - data.moving.morePacketsBuffer = 0; + if(moving.morePacketsBuffer < 0) + moving.morePacketsBuffer = 0; // Should we react? Only if the check doesn't get skipped and we // went over the limit if(!plugin.skipCheck() && packetsAboveLimit > 0) { - data.moving.morePacketsViolationLevel += packetsAboveLimit; + moving.morePacketsViolationLevel += packetsAboveLimit; // Packets above limit - data.log.packets = data.moving.morePacketsCounter - limit; + data.log.packets = moving.morePacketsCounter - limit; data.log.check = "moving/morepackets"; - boolean cancel = false; - cancel = plugin.execute(player, cc.moving.morePacketsActions, (int) data.moving.morePacketsViolationLevel, data.moving.history, cc); + final boolean cancel = plugin.execute(player, cc.moving.morePacketsActions, (int) moving.morePacketsViolationLevel, moving.history, cc); - // Only do the cancel if the player didn't change worlds - // inbetween - if(cancel && player.getWorld().equals(data.moving.morePacketsSetbackPoint.getWorld())) { - newToLocation = data.moving.morePacketsSetbackPoint; - } + if(cancel) + newToLocation = moving.morePacketsSetbackPoint; } // No new setbackLocation was chosen if(newToLocation == null) { - data.moving.morePacketsSetbackPoint = player.getLocation(); + moving.morePacketsSetbackPoint.set(player.getLocation()); } - if(data.moving.morePacketsViolationLevel > 0) + if(moving.morePacketsViolationLevel > 0) // Shrink the "over limit" value by 20 % every second - data.moving.morePacketsViolationLevel *= 0.8; + moving.morePacketsViolationLevel *= 0.8; - data.moving.morePacketsCounter = 0; // Count from zero again - data.moving.lastElapsedIngameSeconds = ingameSeconds; + moving.morePacketsCounter = 0; // Count from zero again + moving.lastElapsedIngameSeconds = ingameSeconds; } return newToLocation; diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java index 92bc9eaa..f28200c1 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java @@ -1,18 +1,16 @@ package cc.co.evenprime.bukkit.nocheat.checks.moving; -import org.bukkit.Location; import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; import cc.co.evenprime.bukkit.nocheat.data.BaseData; +import cc.co.evenprime.bukkit.nocheat.data.MovingData; /** * A check to see if people cheat by tricking the server to not deal them * fall damage. * - * @author Evenprime - * */ public class NoFallCheck { @@ -26,45 +24,42 @@ public class NoFallCheck { * Calculate if and how much the player "failed" this check. * */ - public void check(final Player player, final Location from, final boolean fromOnOrInGround, final Location to, final boolean toOnOrInGround, final ConfigurationCache cc) { + public void check(final Player player, final BaseData data, final boolean fromOnOrInGround, final boolean toOnOrInGround, final ConfigurationCache cc) { - double oldY = from.getY(); - double newY = to.getY(); - - BaseData data = plugin.getData(player); + final MovingData moving = data.moving; // This check is pretty much always a step behind for technical reasons. if(fromOnOrInGround) { // Start with zero fall distance - data.moving.fallDistance = 0F; + moving.fallDistance = 0F; } // If we increased fall height before for no good reason, reduce now by // the same amount - if(player.getFallDistance() > data.moving.lastAddedFallDistance) { - player.setFallDistance(player.getFallDistance() - data.moving.lastAddedFallDistance); + if(player.getFallDistance() > moving.lastAddedFallDistance) { + player.setFallDistance(player.getFallDistance() - moving.lastAddedFallDistance); } - data.moving.lastAddedFallDistance = 0; + moving.lastAddedFallDistance = 0; // We want to know if the fallDistance recorded by the game is smaller // than the fall distance recorded by the plugin - float difference = data.moving.fallDistance - player.getFallDistance(); + final float difference = moving.fallDistance - player.getFallDistance(); - if(difference > 1.0F && toOnOrInGround && data.moving.fallDistance > 2.0F) { - data.moving.nofallViolationLevel += difference; + if(difference > 1.0F && toOnOrInGround && moving.fallDistance > 2.0F) { + moving.nofallViolationLevel += difference; // Prepare some event-specific values for logging and custom actions - data.log.falldistance = data.moving.fallDistance; + data.log.falldistance = moving.fallDistance; data.log.check = "moving/nofall"; - boolean cancel = plugin.execute(player, cc.moving.nofallActions, (int) data.moving.nofallViolationLevel, data.moving.history, cc); + final boolean cancel = plugin.execute(player, cc.moving.nofallActions, (int) moving.nofallViolationLevel, moving.history, cc); // If "cancelled", the fall damage gets dealt in a way that's // visible to other plugins if(cancel) { // Increase the fall distance a bit :) - float totalDistance = data.moving.fallDistance + difference * (cc.moving.nofallMultiplier - 1.0F); + final float totalDistance = moving.fallDistance + difference * (cc.moving.nofallMultiplier - 1.0F); player.setFallDistance(totalDistance); } @@ -81,21 +76,25 @@ public class NoFallCheck { // to avoid falldamage. It is only added for big height differences // anyway, as to avoid to much deviation // from the original Minecraft feeling. + + final double oldY = moving.from.y; + final double newY = moving.to.y; + if(oldY > newY) { - float dist = (float) (oldY - newY); - data.moving.fallDistance += dist; + final float dist = (float) (oldY - newY); + moving.fallDistance += dist; if(dist > 1.0F) { - data.moving.lastAddedFallDistance = dist; + moving.lastAddedFallDistance = dist; player.setFallDistance(player.getFallDistance() + dist); } else { - data.moving.lastAddedFallDistance = 0.0F; + moving.lastAddedFallDistance = 0.0F; } } else { - data.moving.lastAddedFallDistance = 0.0F; + moving.lastAddedFallDistance = 0.0F; } // Reduce falldamage violation level - data.moving.nofallViolationLevel *= 0.99D; + moving.nofallViolationLevel *= 0.99D; } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunFlyCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunFlyCheck.java index 3675f34b..a8adda5e 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunFlyCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunFlyCheck.java @@ -1,15 +1,18 @@ package cc.co.evenprime.bukkit.nocheat.checks.moving; import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; import cc.co.evenprime.bukkit.nocheat.config.Permissions; +import cc.co.evenprime.bukkit.nocheat.config.cache.CCMoving; import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; import cc.co.evenprime.bukkit.nocheat.data.BaseData; +import cc.co.evenprime.bukkit.nocheat.data.MovingData; +import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; +import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; /** * The main Check class for Move event checking. It will decide which checks @@ -43,7 +46,7 @@ public class RunFlyCheck { * @param event * @return */ - public Location check(final Player player, final Location from, final Location to, final ConfigurationCache cc) { + public PreciseLocation check(final Player player, final BaseData data, final ConfigurationCache cc) { // Players in vehicles are of no interest if(player.isInsideVehicle()) @@ -52,47 +55,49 @@ public class RunFlyCheck { /** * If not null, this will be used as the new target location */ - Location newToLocation = null; + PreciseLocation newTo = null; - BaseData data = plugin.getData(player); + final MovingData moving = data.moving; /******** DO GENERAL DATA MODIFICATIONS ONCE FOR EACH EVENT *****/ - if(data.moving.horizVelocityCounter > 0) { - data.moving.horizVelocityCounter--; + if(moving.horizVelocityCounter > 0) { + moving.horizVelocityCounter--; } else { - data.moving.horizFreedom *= 0.90; + moving.horizFreedom *= 0.90; } - if(data.moving.vertVelocityCounter > 0) { - data.moving.vertVelocityCounter--; - data.moving.vertFreedom += data.moving.vertVelocity; - data.moving.vertVelocity *= 0.90; + if(moving.vertVelocityCounter > 0) { + moving.vertVelocityCounter--; + moving.vertFreedom += moving.vertVelocity; + moving.vertVelocity *= 0.90; } else { - data.moving.vertFreedom = 0; + moving.vertFreedom = 0; } + final CCMoving ccmoving = cc.moving; + /************* DECIDE WHICH CHECKS NEED TO BE RUN *************/ - final boolean runflyCheck = cc.moving.runflyCheck && !player.hasPermission(Permissions.MOVE_RUNFLY); - final boolean flyAllowed = cc.moving.allowFlying || player.hasPermission(Permissions.MOVE_FLY) || (player.getGameMode() == GameMode.CREATIVE && cc.moving.identifyCreativeMode); - final boolean morepacketsCheck = cc.moving.morePacketsCheck && !player.hasPermission(Permissions.MOVE_MOREPACKETS); + final boolean runflyCheck = ccmoving.runflyCheck && !player.hasPermission(Permissions.MOVE_RUNFLY); + final boolean flyAllowed = ccmoving.allowFlying || player.hasPermission(Permissions.MOVE_FLY) || (player.getGameMode() == GameMode.CREATIVE && ccmoving.identifyCreativeMode); + final boolean morepacketsCheck = ccmoving.morePacketsCheck && !player.hasPermission(Permissions.MOVE_MOREPACKETS); /********************* EXECUTE THE FLY/JUMP/RUNNING CHECK ********************/ // If the player is not allowed to fly and not allowed to run if(runflyCheck) { if(flyAllowed) { - newToLocation = flyingCheck.check(player, from, to, cc); + newTo = flyingCheck.check(player, data, cc); } else { - newToLocation = runningCheck.check(player, from, to, cc); + newTo = runningCheck.check(player, data, cc); } } /********* EXECUTE THE MOREPACKETS CHECK ********************/ - if(newToLocation == null && morepacketsCheck) { - newToLocation = morePacketsCheck.check(player, cc); + if(newTo == null && morepacketsCheck) { + newTo = morePacketsCheck.check(player, data, cc); } - return newToLocation; + return newTo; } /** @@ -102,21 +107,23 @@ public class RunFlyCheck { */ public void blockPlaced(Player player, Block blockPlaced) { - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(player.getName()); - if(blockPlaced == null || data.moving.runflySetBackPoint == null) { + if(blockPlaced == null || !data.moving.runflySetBackPoint.isSet()) { return; } - Location lblock = blockPlaced.getLocation(); - Location lplayer = player.getLocation(); + SimpleLocation lblock = new SimpleLocation(); + lblock.setLocation(blockPlaced); + SimpleLocation lplayer = new SimpleLocation(); + lplayer.setLocation(player.getLocation()); - if(Math.abs(lplayer.getBlockX() - lblock.getBlockX()) <= 1 && Math.abs(lplayer.getBlockZ() - lblock.getBlockZ()) <= 1 && lplayer.getBlockY() - lblock.getBlockY() >= 0 && lplayer.getBlockY() - lblock.getBlockY() <= 2) { + if(Math.abs(lplayer.x - lblock.x) <= 1 && Math.abs(lplayer.z - lblock.z) <= 1 && lplayer.y - lblock.y >= 0 && lplayer.y - lblock.y <= 2) { int type = CheckUtil.getType(blockPlaced.getTypeId()); if(CheckUtil.isSolid(type) || CheckUtil.isLiquid(type)) { - if(lblock.getBlockY() + 1 >= data.moving.runflySetBackPoint.getY()) { - data.moving.runflySetBackPoint.setY(lblock.getBlockY() + 1); + if(lblock.y + 1 >= data.moving.runflySetBackPoint.y) { + data.moving.runflySetBackPoint.y = (lblock.y + 1); data.moving.jumpPhase = 0; } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java index cdc8c262..935f8a70 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java @@ -3,15 +3,17 @@ package cc.co.evenprime.bukkit.nocheat.checks.moving; import net.minecraft.server.EntityPlayer; import net.minecraft.server.MobEffectList; -import org.bukkit.Location; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; import cc.co.evenprime.bukkit.nocheat.config.Permissions; +import cc.co.evenprime.bukkit.nocheat.config.cache.CCMoving; import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; import cc.co.evenprime.bukkit.nocheat.data.BaseData; +import cc.co.evenprime.bukkit.nocheat.data.MovingData; +import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; /** * The counterpart to the FlyingCheck. People that are not allowed to fly @@ -37,73 +39,77 @@ public class RunningCheck { this.noFallCheck = noFallCheck; } - public Location check(final Player player, final Location from, final Location to, final ConfigurationCache cc) { + public PreciseLocation check(final Player player, final BaseData data, final ConfigurationCache cc) { + + // Some shortcuts: + final MovingData moving = data.moving; + final PreciseLocation to = moving.to; + final PreciseLocation from = moving.from; + final PreciseLocation setBack = moving.runflySetBackPoint; + final CCMoving ccmoving = cc.moving; // Calculate some distances - final double xDistance = to.getX() - from.getX(); - final double zDistance = to.getZ() - from.getZ(); + final double xDistance = to.x - from.x; + final double zDistance = to.z - from.z; final double horizontalDistance = Math.sqrt((xDistance * xDistance + zDistance * zDistance)); - BaseData data = plugin.getData(player); - - if(data.moving.runflySetBackPoint == null) { - data.moving.runflySetBackPoint = from.clone(); + if(!setBack.isSet()) { + setBack.set(from); } // To know if a player "is on ground" is useful - final int fromType = CheckUtil.isLocationOnGround(from.getWorld(), from.getX(), from.getY(), from.getZ(), false); - final int toType = CheckUtil.isLocationOnGround(to.getWorld(), to.getX(), to.getY(), to.getZ(), false); + final int fromType = CheckUtil.isLocationOnGround(player.getWorld(), from); + final int toType = CheckUtil.isLocationOnGround(player.getWorld(), to); final boolean fromOnGround = CheckUtil.isOnGround(fromType); final boolean fromInGround = CheckUtil.isInGround(fromType); final boolean toOnGround = CheckUtil.isOnGround(toType); final boolean toInGround = CheckUtil.isInGround(toType); - Location newToLocation = null; + PreciseLocation newToLocation = null; - double resultHoriz = Math.max(0.0D, checkHorizontal(player, CheckUtil.isLiquid(fromType) && CheckUtil.isLiquid(toType), horizontalDistance, cc)); - double resultVert = Math.max(0.0D, checkVertical(player, from, fromOnGround, to, toOnGround, cc)); + final double resultHoriz = Math.max(0.0D, checkHorizontal(player, data, CheckUtil.isLiquid(fromType) && CheckUtil.isLiquid(toType), horizontalDistance, ccmoving)); + final double resultVert = Math.max(0.0D, checkVertical(moving, fromOnGround, toOnGround, ccmoving)); - double result = (resultHoriz + resultVert) * 100; + final double result = (resultHoriz + resultVert) * 100; - data.moving.jumpPhase++; + moving.jumpPhase++; // Slowly reduce the level with each event - data.moving.runflyViolationLevel *= 0.97; + moving.runflyViolationLevel *= 0.97; if(result > 0) { // Increment violation counter - data.moving.runflyViolationLevel += result; + moving.runflyViolationLevel += result; // Prepare some event-specific values for logging and custom actions - data.log.toLocation = to; + data.log.toLocation.set(to); if(resultHoriz > 0 && resultVert > 0) data.log.check = "runfly/both"; else if(resultHoriz > 0) { // We already set the correct value for this // data.log.check = "runfly/something" - } - else if(resultVert > 0) + } else if(resultVert > 0) data.log.check = "runfly/vertical"; - boolean cancel = plugin.execute(player, cc.moving.actions, (int) data.moving.runflyViolationLevel, data.moving.history, cc); + boolean cancel = plugin.execute(player, cc.moving.actions, (int) moving.runflyViolationLevel, moving.history, cc); // Was one of the actions a cancel? Then do it if(cancel) { - newToLocation = data.moving.runflySetBackPoint; + newToLocation = setBack; } } else { - if((toInGround && from.getY() >= to.getY()) || CheckUtil.isLiquid(toType)) { - data.moving.runflySetBackPoint = to.clone(); - data.moving.runflySetBackPoint.setY(Math.ceil(data.moving.runflySetBackPoint.getY())); - data.moving.jumpPhase = 0; - } else if(toOnGround && (from.getY() >= to.getY() || data.moving.runflySetBackPoint.getY() <= Math.floor(to.getY()))) { - data.moving.runflySetBackPoint = to.clone(); - data.moving.runflySetBackPoint.setY(Math.floor(data.moving.runflySetBackPoint.getY())); - data.moving.jumpPhase = 0; + if((toInGround && from.y >= to.y) || CheckUtil.isLiquid(toType)) { + setBack.set(to); + setBack.y = Math.ceil(setBack.y); + moving.jumpPhase = 0; + } else if(toOnGround && (from.y >= to.y || setBack.y <= Math.floor(to.y))) { + setBack.set(to); + setBack.y = Math.floor(setBack.y); + moving.jumpPhase = 0; } else if(fromOnGround || fromInGround || toOnGround || toInGround) { - data.moving.jumpPhase = 0; + moving.jumpPhase = 0; } } @@ -111,7 +117,7 @@ public class RunningCheck { final boolean checkNoFall = cc.moving.nofallCheck && !player.hasPermission(Permissions.MOVE_NOFALL); if(checkNoFall && newToLocation == null) { - noFallCheck.check(player, from, fromOnGround || fromInGround, to, toOnGround || toInGround, cc); + noFallCheck.check(player, data, fromOnGround || fromInGround, toOnGround || toInGround, cc); } return newToLocation; @@ -121,71 +127,73 @@ public class RunningCheck { * Calculate how much the player failed this check * */ - private double checkHorizontal(final Player player, final boolean isSwimming, final double totalDistance, final ConfigurationCache cc) { + private double checkHorizontal(final Player player, final BaseData data, final boolean isSwimming, final double totalDistance, final CCMoving ccmoving) { // How much further did the player move than expected?? double distanceAboveLimit = 0.0D; final boolean sprinting = CheckUtil.isSprinting(player); - BaseData data = plugin.getData(player); - double limit = 0.0D; - EntityPlayer p = ((CraftPlayer) player).getHandle(); + final EntityPlayer p = ((CraftPlayer) player).getHandle(); + final MovingData moving = data.moving; - if(cc.moving.sneakingCheck && player.isSneaking() && !player.hasPermission(Permissions.MOVE_SNEAK)) { - limit = cc.moving.sneakingSpeedLimit; + if(ccmoving.sneakingCheck && player.isSneaking() && !player.hasPermission(Permissions.MOVE_SNEAK)) { + limit = ccmoving.sneakingSpeedLimit; data.log.check = "runfly/sneak"; - } else if(cc.moving.swimmingCheck && isSwimming && !player.hasPermission(Permissions.MOVE_SWIM)) { - limit = cc.moving.swimmingSpeedLimit; + } else if(ccmoving.swimmingCheck && isSwimming && !player.hasPermission(Permissions.MOVE_SWIM)) { + limit = ccmoving.swimmingSpeedLimit; data.log.check = "runfly/swim"; } else if(!sprinting) { - limit = cc.moving.walkingSpeedLimit; + limit = ccmoving.walkingSpeedLimit; data.log.check = "runfly/walk"; } else { - limit = cc.moving.sprintingSpeedLimit; + limit = ccmoving.sprintingSpeedLimit; data.log.check = "runfly/sprint"; } - + if(p.hasEffect(MobEffectList.FASTER_MOVEMENT)) { // Taken directly from Minecraft code, should work - limit *= 1.0F + 0.2F * (float) (p.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier() + 1); + limit *= 1.0F + 0.2F * (float) (p.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier() + 1); } - - // Ignore slowdowns for now - /*if(p.hasEffect(MobEffectList.SLOWER_MOVEMENT)) { - limit *= 1.0F - 0.15F * (float) (p.getEffect(MobEffectList.SLOWER_MOVEMENT).getAmplifier() + 1); - }*/ - - distanceAboveLimit = totalDistance - limit - data.moving.horizFreedom; - data.moving.bunnyhopdelay--; + // Ignore slowdowns for now + /* + * if(p.hasEffect(MobEffectList.SLOWER_MOVEMENT)) { + * limit *= 1.0F - 0.15F * (float) + * (p.getEffect(MobEffectList.SLOWER_MOVEMENT).getAmplifier() + 1); + * } + */ + + distanceAboveLimit = totalDistance - limit - moving.horizFreedom; + + moving.bunnyhopdelay--; // Did he go too far? if(distanceAboveLimit > 0 && sprinting) { // Try to treat it as a the "bunnyhop" problem - if(data.moving.bunnyhopdelay <= 0 && distanceAboveLimit > 0.05D && distanceAboveLimit < 0.4D) { - data.moving.bunnyhopdelay = 3; + if(moving.bunnyhopdelay <= 0 && distanceAboveLimit > 0.05D && distanceAboveLimit < 0.4D) { + moving.bunnyhopdelay = 3; distanceAboveLimit = 0; } } if(distanceAboveLimit > 0) { // Try to consume the "buffer" - distanceAboveLimit -= data.moving.horizontalBuffer; - data.moving.horizontalBuffer = 0; + distanceAboveLimit -= moving.horizontalBuffer; + moving.horizontalBuffer = 0; // Put back the "overconsumed" buffer if(distanceAboveLimit < 0) { - data.moving.horizontalBuffer = -distanceAboveLimit; + moving.horizontalBuffer = -distanceAboveLimit; } } // He was within limits, give the difference as buffer else { - data.moving.horizontalBuffer = Math.min(maxBonus, data.moving.horizontalBuffer - distanceAboveLimit); + moving.horizontalBuffer = Math.min(maxBonus, moving.horizontalBuffer - distanceAboveLimit); } return distanceAboveLimit; @@ -195,21 +203,17 @@ public class RunningCheck { * Calculate if and how much the player "failed" this check. * */ - private double checkVertical(final Player player, final Location from, final boolean fromOnGround, final Location to, final boolean toOnGround, final ConfigurationCache cc) { + private double checkVertical(final MovingData moving, final boolean fromOnGround, final boolean toOnGround, final CCMoving ccmoving) { // How much higher did the player move than expected?? double distanceAboveLimit = 0.0D; - final double toY = to.getY(); + double limit = moving.vertFreedom + ccmoving.jumpheight; - BaseData data = plugin.getData(player); - - double limit = data.moving.vertFreedom + cc.moving.jumpheight; - - if(data.moving.jumpPhase > jumpingLimit) { - limit -= (data.moving.jumpPhase - jumpingLimit) * 0.15D; + if(moving.jumpPhase > jumpingLimit) { + limit -= (moving.jumpPhase - jumpingLimit) * 0.15D; } - distanceAboveLimit = toY - data.moving.runflySetBackPoint.getY() - limit; + distanceAboveLimit = moving.to.y - moving.runflySetBackPoint.y - limit; return distanceAboveLimit; diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java b/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java index d9382543..31389655 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java @@ -4,8 +4,6 @@ import cc.co.evenprime.bukkit.nocheat.config.Configuration; import cc.co.evenprime.bukkit.nocheat.config.util.ActionList; /** - * - * @author Evenprime * */ public class CCBlockPlace { diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCMoving.java b/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCMoving.java index 6c2bb220..c5fff1a1 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCMoving.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCMoving.java @@ -7,8 +7,6 @@ import cc.co.evenprime.bukkit.nocheat.config.util.ActionList; * Configurations specific for the Move Checks. Every world gets one of these * assigned to it. * - * @author Evenprime - * */ public class CCMoving { diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/cache/ConfigurationCache.java b/src/cc/co/evenprime/bukkit/nocheat/config/cache/ConfigurationCache.java index ff0df758..aa6c9b10 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/cache/ConfigurationCache.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/cache/ConfigurationCache.java @@ -8,10 +8,8 @@ import cc.co.evenprime.bukkit.nocheat.config.Configuration; * A class to keep all configurables of the plugin associated with * a world, everything unmodifiable for security/performance * - * @author Evenprime - * */ -public class ConfigurationCache { +public class ConfigurationCache { public final CCMoving moving; public final CCLogging logging; diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java b/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java index e7ef3e27..f7f5b185 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java @@ -1,7 +1,5 @@ package cc.co.evenprime.bukkit.nocheat.data; -import org.bukkit.entity.Player; - public class BaseData extends Data { public final BlockBreakData blockbreak; @@ -35,12 +33,6 @@ public class BaseData extends Data { } } - public void initialize(Player player) { - for(Data d : data) { - d.initialize(player); - } - } - public void markForRemoval(boolean removal) { if(removal) { // 1 minute in the future diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/BlockBreakData.java b/src/cc/co/evenprime/bukkit/nocheat/data/BlockBreakData.java index 35107613..bcfe15a4 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/BlockBreakData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/BlockBreakData.java @@ -1,7 +1,5 @@ package cc.co.evenprime.bukkit.nocheat.data; -import org.bukkit.Location; - /** * Playerspecific data for the blockbreak check group * @@ -12,7 +10,8 @@ public class BlockBreakData extends Data { public double directionViolationLevel = 0.0D; public long directionLastViolationTime = 0; - public Location instaBrokeBlockLocation = null; + public final SimpleLocation instaBrokeBlockLocation = new SimpleLocation(); + public final ExecutionHistory history = new ExecutionHistory(); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java b/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java index be86035f..b9ac70af 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java @@ -1,14 +1,11 @@ package cc.co.evenprime.bukkit.nocheat.data; - /** - * - * @author Evenprime * */ public class BlockPlaceData extends Data { - public double onliquidViolationLevel = 0.0D; - public double reachViolationLevel = 0.0D; + public double onliquidViolationLevel = 0.0D; + public double reachViolationLevel = 0.0D; public final ExecutionHistory history = new ExecutionHistory(); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/ChatData.java b/src/cc/co/evenprime/bukkit/nocheat/data/ChatData.java index 8c0af5a4..4d6f96aa 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/ChatData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/ChatData.java @@ -1,15 +1,12 @@ package cc.co.evenprime.bukkit.nocheat.data; - /** - * - * @author Evenprime * */ public class ChatData extends Data { - public int messageCount = 0; - public int spamLasttime = 0; + public int messageCount = 0; + public int spamLasttime = 0; public final ExecutionHistory history = new ExecutionHistory(); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/Data.java b/src/cc/co/evenprime/bukkit/nocheat/data/Data.java index 92cbf552..8ebfb93f 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/Data.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/Data.java @@ -1,20 +1,12 @@ package cc.co.evenprime.bukkit.nocheat.data; -import org.bukkit.entity.Player; - /** * * Every class that is extending this has to implement an empty Constructor() * - * @author Evenprime - * */ public abstract class Data { - public void initialize(Player player) { - - } - public void clearCriticalData() { } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/DataManager.java b/src/cc/co/evenprime/bukkit/nocheat/data/DataManager.java index d2067e82..6cc118a1 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/DataManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/DataManager.java @@ -6,8 +6,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import org.bukkit.entity.Player; - /** * Provide secure access to player-specific data objects for various checks or * check groups. @@ -15,19 +13,21 @@ import org.bukkit.entity.Player; public class DataManager { // Store data between Events - private final Map map; + private final Map map; + private final List removals; public DataManager() { - this.map = new HashMap(); + this.map = new HashMap(); + this.removals = new ArrayList(5); } /** * Get a data object of the specified class. If none is stored yet, create * one. */ - public BaseData getData(Player player) { + public BaseData getData(String playerName) { - BaseData data = this.map.get(player); + BaseData data = this.map.get(playerName); // intentionally not thread-safe, because bukkit events are handled // in sequence anyway, so zero chance of two events of the same @@ -36,8 +36,8 @@ public class DataManager { // losing data of one instance doesn't really hurt at all if(data == null) { data = new BaseData(); - data.initialize(player); - this.map.put(player, data); + data.log.playerName = playerName; + this.map.put(playerName, data); } return data; @@ -58,16 +58,16 @@ public class DataManager { * before) * */ - public void queueForRemoval(Player player) { - BaseData data = this.map.get(player); + public void queueForRemoval(String playerName) { + BaseData data = this.map.get(playerName); if(data != null) { data.markForRemoval(true); } } - public void unqueueForRemoval(Player player) { - BaseData data = this.map.get(player); + public void unqueueForRemoval(String playerName) { + BaseData data = this.map.get(playerName); if(data != null) { data.markForRemoval(false); @@ -80,24 +80,25 @@ public class DataManager { */ public void cleanDataMap() { try { - List removals = new ArrayList(); - - for(Entry p : this.map.entrySet()) { + for(Entry p : this.map.entrySet()) { if(p.getValue().shouldBeRemoved()) { removals.add(p.getKey()); } } - for(Player p : removals) { + for(String p : removals) { this.map.remove(p); } + + removals.clear(); } catch(Exception e) { // Ignore problems, as they really don't matter much } + } - public void clearCriticalData(Player player) { - BaseData data = this.map.get(player); + public void clearCriticalData(String playerName) { + BaseData data = this.map.get(playerName); if(data != null) { data.clearCriticalData(); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/ExecutionHistory.java b/src/cc/co/evenprime/bukkit/nocheat/data/ExecutionHistory.java index 1abf0ae2..3266fa37 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/ExecutionHistory.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/ExecutionHistory.java @@ -8,8 +8,6 @@ import cc.co.evenprime.bukkit.nocheat.actions.types.Action; /** * Store amount of action executions for last 60 seconds * - * @author Evenprime - * */ public class ExecutionHistory { diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/FightData.java b/src/cc/co/evenprime/bukkit/nocheat/data/FightData.java index 733848f9..2c637056 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/FightData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/FightData.java @@ -2,8 +2,8 @@ package cc.co.evenprime.bukkit.nocheat.data; public class FightData extends Data { - public double violationLevel = 0; - public long directionLastViolationTime = 0; + public double violationLevel = 0; + public long directionLastViolationTime = 0; public final ExecutionHistory history = new ExecutionHistory(); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/LogData.java b/src/cc/co/evenprime/bukkit/nocheat/data/LogData.java index 6ab1c1c0..6294f9b4 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/LogData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/LogData.java @@ -1,28 +1,21 @@ package cc.co.evenprime.bukkit.nocheat.data; -import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.entity.Player; /** * Everything that could be relevant for logging or consolecommand actions */ public class LogData extends Data { - public Player player; - public String check; - public int violationLevel; - public Location toLocation; - public int packets; - public String text; - public Block placed; - public Block placedAgainst; - public double reachdistance; - public float falldistance; + public String check; + public int violationLevel; + public final PreciseLocation toLocation = new PreciseLocation(); + public int packets; + public String text; + public Block placed; + public Block placedAgainst; + public double reachdistance; + public float falldistance; + public String playerName; - public void initialize(Player player) { - this.player = player; - this.check = ""; - this.toLocation = player.getLocation(); - } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java b/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java index 75273ea6..ab3f40c8 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java @@ -1,60 +1,53 @@ package cc.co.evenprime.bukkit.nocheat.data; -import org.bukkit.Location; -import org.bukkit.entity.Player; - /** * Player specific data for the moving check group */ public class MovingData extends Data { - public int jumpPhase; + public int jumpPhase; - public Location runflySetBackPoint; + public final PreciseLocation runflySetBackPoint = new PreciseLocation(); - public double runflyViolationLevel; + public double runflyViolationLevel; - public double vertFreedom; - public double vertVelocity; - public int vertVelocityCounter; - public double horizFreedom; - public int horizVelocityCounter; + public double vertFreedom; + public double vertVelocity; + public int vertVelocityCounter; + public double horizFreedom; + public int horizVelocityCounter; - public double nofallViolationLevel; - public float fallDistance; - public float lastAddedFallDistance; + public double nofallViolationLevel; + public float fallDistance; + public float lastAddedFallDistance; - public double horizontalBuffer; - public int bunnyhopdelay; + public double horizontalBuffer; + public int bunnyhopdelay; - public int morePacketsCounter; - public int morePacketsBuffer; - public Location morePacketsSetbackPoint; - public double morePacketsViolationLevel; + public int morePacketsCounter; + public int morePacketsBuffer = 50; + public final PreciseLocation morePacketsSetbackPoint = new PreciseLocation(); + public double morePacketsViolationLevel; - public Location teleportTo; + public final PreciseLocation teleportTo = new PreciseLocation(); - public int lastElapsedIngameSeconds; + public int lastElapsedIngameSeconds; - public final ExecutionHistory history = new ExecutionHistory(); + public final ExecutionHistory history = new ExecutionHistory(); - @Override - public void initialize(Player player) { - runflySetBackPoint = player.getLocation(); - morePacketsBuffer = 50; - morePacketsSetbackPoint = player.getLocation(); - } + public final PreciseLocation from = new PreciseLocation(); + public final PreciseLocation to = new PreciseLocation(); @Override public void clearCriticalData() { - teleportTo = null; + teleportTo.reset(); jumpPhase = 0; - runflySetBackPoint = null; + runflySetBackPoint.reset(); fallDistance = 0; lastAddedFallDistance = 0; bunnyhopdelay = 0; morePacketsBuffer = 50; - morePacketsSetbackPoint = null; + morePacketsSetbackPoint.reset(); lastElapsedIngameSeconds = 0; morePacketsCounter = 0; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/PreciseLocation.java b/src/cc/co/evenprime/bukkit/nocheat/data/PreciseLocation.java new file mode 100644 index 00000000..656220da --- /dev/null +++ b/src/cc/co/evenprime/bukkit/nocheat/data/PreciseLocation.java @@ -0,0 +1,39 @@ +package cc.co.evenprime.bukkit.nocheat.data; + +import org.bukkit.Location; + +public class PreciseLocation { + + public double x; + public double y; + public double z; + + public PreciseLocation() { + reset(); + } + + public void set(Location location) { + x = location.getX(); + y = location.getY(); + z = location.getZ(); + } + + public void set(PreciseLocation location) { + x = location.x; + y = location.y; + z = location.z; + } + + public boolean isSet() { + return x != Double.MAX_VALUE; + } + public void reset() { + x = Double.MAX_VALUE; + y = Double.MAX_VALUE; + z = Double.MAX_VALUE; + } + + public boolean equals(Location location) { + return location.getX() == x && location.getY() == y && location.getZ() == z; + } +} diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/SimpleLocation.java b/src/cc/co/evenprime/bukkit/nocheat/data/SimpleLocation.java new file mode 100644 index 00000000..00e3b0d8 --- /dev/null +++ b/src/cc/co/evenprime/bukkit/nocheat/data/SimpleLocation.java @@ -0,0 +1,47 @@ +package cc.co.evenprime.bukkit.nocheat.data; + +import org.bukkit.Location; +import org.bukkit.block.Block; + +/** + * To avoid constantly creating and referencing "Location" objects, which + * in turn reference a whole lot of other unnecessary stuff, rather use + * our own "Location" object which is easily reusable. + * + */ +public class SimpleLocation { + + public int x; + public int y; + public int z; + + public SimpleLocation() { + reset(); + } + + public boolean equals(Block block) { + return block.getX() == x && block.getY() == y && block.getZ() == z; + } + + public void setLocation(Block block) { + x = block.getX(); + y = block.getY(); + z = block.getZ(); + } + + public void setLocation(Location location) { + x = location.getBlockX(); + y = location.getBlockY(); + z = location.getBlockZ(); + } + + public boolean isSet() { + return x != Integer.MAX_VALUE; + } + public void reset() { + x = Integer.MAX_VALUE; + y = Integer.MAX_VALUE; + z = Integer.MAX_VALUE; + } + +} diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/BlockBreakEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/BlockBreakEventManager.java index c7c73c18..7778f654 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/BlockBreakEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/BlockBreakEventManager.java @@ -3,7 +3,6 @@ package cc.co.evenprime.bukkit.nocheat.events; import java.util.LinkedList; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; @@ -39,7 +38,7 @@ public class BlockBreakEventManager extends BlockListener implements EventManage this.blockBreakPerformance = plugin.getPerformance(Type.BLOCKBREAK); this.blockDamagePerformance = plugin.getPerformance(Type.BLOCKDAMAGE); - PluginManager pm = Bukkit.getServer().getPluginManager(); + PluginManager pm = plugin.getServer().getPluginManager(); pm.registerEvent(Event.Type.BLOCK_BREAK, this, Priority.Lowest, plugin); pm.registerEvent(Event.Type.BLOCK_DAMAGE, this, Priority.Monitor, plugin); @@ -94,13 +93,12 @@ public class BlockBreakEventManager extends BlockListener implements EventManage if(performanceCheck) nanoTimeStart = System.nanoTime(); - final Player player = event.getPlayer(); // Get the player-specific stored data that applies here - final BaseData data = plugin.getData(player); + final BaseData data = plugin.getData(event.getPlayer().getName()); // Remember this location. We ignore block breaks in the block-break // direction check that are insta-breaks - data.blockbreak.instaBrokeBlockLocation = event.getBlock().getLocation(); + data.blockbreak.instaBrokeBlockLocation.setLocation(event.getBlock()); // store performance time if(performanceCheck) diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java index 53bf9654..b60e35dc 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java @@ -3,7 +3,6 @@ package cc.co.evenprime.bukkit.nocheat.events; import java.util.LinkedList; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; @@ -41,7 +40,7 @@ public class BlockPlaceEventManager extends BlockListener implements EventManage this.blockPlacePerformance = p.getPerformance(Type.BLOCKPLACE); - PluginManager pm = Bukkit.getServer().getPluginManager(); + PluginManager pm = plugin.getServer().getPluginManager(); pm.registerEvent(Event.Type.BLOCK_PLACE, this, Priority.Lowest, plugin); diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/EntityDamageEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/EntityDamageEventManager.java index 54f82230..da222b06 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/EntityDamageEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/EntityDamageEventManager.java @@ -3,7 +3,6 @@ package cc.co.evenprime.bukkit.nocheat.events; import java.util.LinkedList; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Event; @@ -34,7 +33,7 @@ public class EntityDamageEventManager extends EntityListener implements EventMan this.fightPerformance = plugin.getPerformance(Type.FIGHT); - PluginManager pm = Bukkit.getServer().getPluginManager(); + PluginManager pm = plugin.getServer().getPluginManager(); pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.Lowest, plugin); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerChatEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerChatEventManager.java index e67a1d60..04212a88 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerChatEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerChatEventManager.java @@ -3,7 +3,6 @@ package cc.co.evenprime.bukkit.nocheat.events; import java.util.LinkedList; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; @@ -35,7 +34,7 @@ public class PlayerChatEventManager extends PlayerListener implements EventManag this.chatPerformance = plugin.getPerformance(Type.CHAT); - PluginManager pm = Bukkit.getServer().getPluginManager(); + PluginManager pm = plugin.getServer().getPluginManager(); pm.registerEvent(Event.Type.PLAYER_CHAT, this, Priority.Lowest, plugin); pm.registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, this, Priority.Lowest, plugin); diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerMoveEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerMoveEventManager.java index 4ba42916..5526abcc 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerMoveEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerMoveEventManager.java @@ -3,7 +3,6 @@ package cc.co.evenprime.bukkit.nocheat.events; import java.util.LinkedList; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.Event; @@ -19,6 +18,8 @@ import cc.co.evenprime.bukkit.nocheat.checks.moving.RunFlyCheck; import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; import cc.co.evenprime.bukkit.nocheat.data.BaseData; +import cc.co.evenprime.bukkit.nocheat.data.MovingData; +import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; import cc.co.evenprime.bukkit.nocheat.debug.Performance; import cc.co.evenprime.bukkit.nocheat.debug.PerformanceManager.Type; @@ -45,14 +46,14 @@ public class PlayerMoveEventManager extends PlayerListener implements EventManag this.movePerformance = plugin.getPerformance(Type.MOVING); this.velocityPerformance = plugin.getPerformance(Type.VELOCITY); - PluginManager pm = Bukkit.getServer().getPluginManager(); + PluginManager pm = plugin.getServer().getPluginManager(); pm.registerEvent(Event.Type.PLAYER_MOVE, this, Priority.Lowest, plugin); pm.registerEvent(Event.Type.PLAYER_VELOCITY, this, Priority.Monitor, plugin); } @Override - public void onPlayerMove(PlayerMoveEvent event) { + public void onPlayerMove(final PlayerMoveEvent event) { // Cancelled events are ignored if(event.isCancelled()) @@ -75,27 +76,25 @@ public class PlayerMoveEventManager extends PlayerListener implements EventManag // Get some data that's needed from this event, to avoid passing the // event itself on to the checks (and risk to // accidentally modifying the event there) - final Location from = event.getFrom(); + final BaseData data = plugin.getData(player.getName()); + final MovingData moving = data.moving; + final Location to = event.getTo(); + moving.from.set(event.getFrom()); + moving.to.set(to); + // This variable will have the modified data of the event (new // "to"-location) - Location newTo = null; - - // Currently only one check here. - newTo = movingCheck.check(player, from, to, cc); + final PreciseLocation newTo = movingCheck.check(player, data, cc); // Did the check(s) decide we need a new "to"-location? if(newTo != null) { // Compose a new location based on coordinates of "newTo" and // viewing direction of "event.getTo()" - Location l = new Location(newTo.getWorld(), newTo.getX(), newTo.getY(), newTo.getZ(), to.getYaw(), to.getPitch()); - event.setTo(l); + event.setTo(new Location(player.getWorld(), newTo.x, newTo.y, newTo.z, to.getYaw(), to.getPitch())); - // Get the player-specific stored data that applies here - final BaseData data = plugin.getData(player); - - data.moving.teleportTo = l; + data.moving.teleportTo.set(newTo); } } @@ -116,9 +115,7 @@ public class PlayerMoveEventManager extends PlayerListener implements EventManag if(performanceCheck) nanoTimeStart = System.nanoTime(); - Player player = event.getPlayer(); - - BaseData data = plugin.getData(player); + BaseData data = plugin.getData(event.getPlayer().getName()); Vector v = event.getVelocity(); diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerQuitEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerQuitEventManager.java index 301de48b..94198fb9 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerQuitEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerQuitEventManager.java @@ -3,7 +3,6 @@ package cc.co.evenprime.bukkit.nocheat.events; import java.util.Collections; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; import org.bukkit.event.player.PlayerJoinEvent; @@ -21,7 +20,7 @@ public class PlayerQuitEventManager extends PlayerListener implements EventManag public PlayerQuitEventManager(NoCheat plugin) { this.plugin = plugin; - PluginManager pm = Bukkit.getServer().getPluginManager(); + PluginManager pm = plugin.getServer().getPluginManager(); pm.registerEvent(Event.Type.PLAYER_QUIT, this, Priority.Monitor, plugin); pm.registerEvent(Event.Type.PLAYER_JOIN, this, Priority.Monitor, plugin); @@ -30,13 +29,13 @@ public class PlayerQuitEventManager extends PlayerListener implements EventManag @Override public void onPlayerQuit(PlayerQuitEvent event) { // But only after a certain time, get rid of the rest of the data - plugin.playerLeft(event.getPlayer()); + plugin.playerLeft(event.getPlayer().getName()); } @Override public void onPlayerJoin(PlayerJoinEvent event) { // A player came back early, so make sure that his data gets recycled - plugin.playerJoined(event.getPlayer()); + plugin.playerJoined(event.getPlayer().getName()); } public List getActiveChecks(ConfigurationCache cc) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerTeleportEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerTeleportEventManager.java index 99df62eb..d2251286 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/PlayerTeleportEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/PlayerTeleportEventManager.java @@ -3,9 +3,6 @@ package cc.co.evenprime.bukkit.nocheat.events; import java.util.Collections; import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; import org.bukkit.event.player.PlayerListener; @@ -32,7 +29,7 @@ public class PlayerTeleportEventManager extends PlayerListener implements EventM this.plugin = p; - PluginManager pm = Bukkit.getServer().getPluginManager(); + PluginManager pm = plugin.getServer().getPluginManager(); pm.registerEvent(Event.Type.PLAYER_MOVE, this, Priority.Monitor, plugin); pm.registerEvent(Event.Type.PLAYER_TELEPORT, this, Priority.Monitor, plugin); @@ -50,9 +47,9 @@ public class PlayerTeleportEventManager extends PlayerListener implements EventM return; } - final BaseData data = plugin.getData(event.getPlayer()); + final BaseData data = plugin.getData(event.getPlayer().getName()); - if(data.moving.teleportTo != null && data.moving.teleportTo.equals(event.getTo())) { + if(data.moving.teleportTo.isSet() && data.moving.teleportTo.equals(event.getTo())) { event.setCancelled(false); } } @@ -64,18 +61,18 @@ public class PlayerTeleportEventManager extends PlayerListener implements EventM if(event.isCancelled()) return; - handleTeleportation(event.getPlayer(), event.getTo()); + handleTeleportation(event.getPlayer().getName()); } public void onPlayerPortal(PlayerPortalEvent event) { if(event.isCancelled()) return; - handleTeleportation(event.getPlayer(), event.getTo()); + handleTeleportation(event.getPlayer().getName()); } public void onPlayerRespawn(PlayerRespawnEvent event) { - handleTeleportation(event.getPlayer(), event.getRespawnLocation()); + handleTeleportation(event.getPlayer().getName()); } // Workaround for buggy Playermove cancelling @@ -84,12 +81,12 @@ public class PlayerTeleportEventManager extends PlayerListener implements EventM return; } - handleTeleportation(event.getPlayer(), event.getFrom()); + handleTeleportation(event.getPlayer().getName()); } - private void handleTeleportation(Player player, Location newLocation) { + private void handleTeleportation(String playerName) { - plugin.clearCriticalData(player); + plugin.clearCriticalData(playerName); } public List getActiveChecks(ConfigurationCache cc) {