diff --git a/src/fr/neatmonster/nocheatplus/CommandHandler.java b/src/fr/neatmonster/nocheatplus/CommandHandler.java index 729ae94b..c838dfa3 100644 --- a/src/fr/neatmonster/nocheatplus/CommandHandler.java +++ b/src/fr/neatmonster/nocheatplus/CommandHandler.java @@ -1,10 +1,13 @@ package fr.neatmonster.nocheatplus; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; import fr.neatmonster.nocheatplus.checks.blockbreak.BlockBreakConfig; import fr.neatmonster.nocheatplus.checks.blockinteract.BlockInteractConfig; @@ -38,6 +41,34 @@ import fr.neatmonster.nocheatplus.players.Permissions; * This the class handling all the commands. */ public class CommandHandler implements CommandExecutor { + + /** + * The event triggered when NoCheatPlus configuration is reloaded. + */ + public static class NCPReloadEvent extends Event { + + /** The handlers list. */ + private static final HandlerList handlers = new HandlerList(); + + /** + * Gets the handler list. + * + * @return the handler list + */ + public static HandlerList getHandlerList() { + return handlers; + } + + /* (non-Javadoc) + * @see org.bukkit.event.Event#getHandlers() + */ + @Override + public HandlerList getHandlers() { + return handlers; + } + } + + /** The plugin. */ private final NoCheatPlus plugin; /** @@ -73,6 +104,9 @@ public class CommandHandler implements CommandExecutor { InventoryConfig.clear(); MovingConfig.clear(); + // Say to the other plugins that we've reloaded the configuration. + Bukkit.getPluginManager().callEvent(new NCPReloadEvent()); + sender.sendMessage(ChatColor.RED + "NCP: " + ChatColor.WHITE + "Configuration reloaded!"); } else sender.sendMessage(ChatColor.RED + "You lack the " + Permissions.ADMINISTRATION_RELOAD diff --git a/src/fr/neatmonster/nocheatplus/checks/CheckType.java b/src/fr/neatmonster/nocheatplus/checks/CheckType.java index 0fc02dd9..f206d921 100644 --- a/src/fr/neatmonster/nocheatplus/checks/CheckType.java +++ b/src/fr/neatmonster/nocheatplus/checks/CheckType.java @@ -50,7 +50,6 @@ public enum CheckType { BLOCKPLACE_SPEED(BLOCKPLACE, "speed", Permissions.BLOCKPLACE_SPEED), CHAT(ChatConfig.class, ChatData.class), - CHAT_ARRIVALS(CHAT, "arrivals", Permissions.CHAT_ARRIVALS), CHAT_COLOR(CHAT, "color", Permissions.CHAT_COLOR), CHAT_NOPWNAGE(CHAT, "noPwnage", Permissions.CHAT_NOPWNAGE), diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/Arrivals.java b/src/fr/neatmonster/nocheatplus/checks/chat/Arrivals.java deleted file mode 100644 index 2c039249..00000000 --- a/src/fr/neatmonster/nocheatplus/checks/chat/Arrivals.java +++ /dev/null @@ -1,73 +0,0 @@ -package fr.neatmonster.nocheatplus.checks.chat; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.bukkit.entity.Player; - -import fr.neatmonster.nocheatplus.NoCheatPlus; -import fr.neatmonster.nocheatplus.checks.Check; -import fr.neatmonster.nocheatplus.checks.CheckType; - -/* - * MMP"""""""MM oo dP - * M' .mmmm MM 88 - * M `M 88d888b. 88d888b. dP dP .dP .d8888b. 88 .d8888b. - * M MMMMM MM 88' `88 88' `88 88 88 d8' 88' `88 88 Y8ooooo. - * M MMMMM MM 88 88 88 88 .88' 88. .88 88 88 - * M MMMMM MM dP dP dP 8888P' `88888P8 dP `88888P' - * MMMMMMMMMMMM - */ -/** - * The Arrivals check is used to limit the number of new players allowed to join in a specified time frame. - */ -public class Arrivals extends Check { - - /** The map containing the time and the name of the player, every time that one of them joins. */ - private final Map joins = new HashMap(); - - /** - * Instantiates a new arrivals check. - */ - public Arrivals() { - super(CheckType.CHAT_ARRIVALS); - } - - /** - * Checks a player. - * - * @param player - * the player - * @return true, if successful - */ - public boolean check(final Player player) { - final ChatConfig cc = ChatConfig.getConfig(player); - - // If the server has just restarted or if the player is a regular one, do not check it. - if (System.currentTimeMillis() - NoCheatPlus.time < 120000L - || System.currentTimeMillis() - player.getFirstPlayed() > cc.arrivalsJoinsLimit) - return false; - - boolean cancel = false; - - // Remove the old data from the map holding the joins. - final List toRemove = new ArrayList(); - for (final long time : joins.keySet()) - // If the data is too old or belong to the checked player. - if (System.currentTimeMillis() - time > cc.arrivalsTimeLimit && joins.get(time).equals(player.getName())) - toRemove.add(time); - for (final long time : toRemove) - joins.remove(time); - - // Add the new data. - joins.put(System.currentTimeMillis(), player.getName()); - - if (joins.size() > cc.arrivalsJoinsLimit) - // Find out if we should cancel the event or not. - cancel = executeActions(player); - - return cancel; - } -} diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java b/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java index 07de126c..154af0c6 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java @@ -51,12 +51,6 @@ public class ChatConfig { return worldsMap.get(player.getWorld().getName()); } - public final boolean arrivalsCheck; - public final int arrivalsJoinsLimit; - public final String arrivalsMessage; - public final long arrivalsTimeLimit; - public final ActionList arrivalsActions; - public final boolean colorCheck; public final ActionList colorActions; @@ -112,6 +106,8 @@ public class ChatConfig { public final ActionList noPwnageActions; + public final boolean opInConsoleOnly; + public final boolean protectPlugins; /** @@ -121,12 +117,6 @@ public class ChatConfig { * the data */ public ChatConfig(final ConfigFile data) { - arrivalsCheck = data.getBoolean(ConfPaths.CHAT_ARRIVALS_CHECK); - arrivalsJoinsLimit = data.getInt(ConfPaths.CHAT_ARRIVALS_JOINSLIMIT); - arrivalsMessage = data.getString(ConfPaths.CHAT_ARRIVALS_MESSAGE); - arrivalsTimeLimit = data.getLong(ConfPaths.CHAT_ARRIVALS_TIMELIMIT); - arrivalsActions = data.getActionList(ConfPaths.CHAT_ARRIVALS_ACTIONS, Permissions.CHAT_ARRIVALS); - colorCheck = data.getBoolean(ConfPaths.CHAT_COLOR_CHECK); colorActions = data.getActionList(ConfPaths.CHAT_COLOR_ACTIONS, Permissions.CHAT_COLOR); @@ -182,6 +172,8 @@ public class ChatConfig { noPwnageActions = data.getActionList(ConfPaths.CHAT_NOPWNAGE_ACTIONS, Permissions.CHAT_NOPWNAGE); + opInConsoleOnly = data.getBoolean(ConfPaths.MISCELLANEOUS_OPINCONSOLEONLY); + protectPlugins = data.getBoolean(ConfPaths.MISCELLANEOUS_PROTECTPLUGINS); } } diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java b/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java index b7c1150a..634da0f1 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java @@ -37,7 +37,6 @@ public class ChatData { } // Violation levels. - public double arrivalsVL; public double colorVL; public double noPwnageVL; diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java b/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java index 06ccd524..4190f3c8 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java @@ -26,7 +26,6 @@ import fr.neatmonster.nocheatplus.players.Permissions; * Central location to listen to events that are relevant for the chat checks. */ public class ChatListener implements Listener { - private final Arrivals arrivals = new Arrivals(); private final Color color = new Color(); private final NoPwnage noPwnage = new NoPwnage(); @@ -95,6 +94,14 @@ public class ChatListener implements Listener { return; } + // Prevent /op and /deop commands from being used in chat. + if (ChatConfig.getConfig(player).opInConsoleOnly && (command.equals("op") || command.equals("deop"))) { + event.getPlayer().sendMessage( + ChatColor.RED + "I'm sorry, but this command can't be executed in chat. Use the console instead!"); + event.setCancelled(true); + return; + } + // First the color check. if (color.isEnabled(player)) event.setMessage(color.check(player, event.getMessage())); @@ -124,13 +131,8 @@ public class ChatListener implements Listener { final Player player = event.getPlayer(); final ChatConfig cc = ChatConfig.getConfig(player); - // First the arrivals check, if enabled of course. - if (arrivals.isEnabled(player) && arrivals.check(player)) - // The player failed the check, disallow the login. - event.disallow(Result.KICK_OTHER, cc.arrivalsMessage); - - // Then the no pwnage check, if the login isn't already disallowed. - if (event.getResult() != Result.KICK_OTHER && noPwnage.isEnabled(player) && noPwnage.check(player)) + // Execute the no pwnage check. + if (noPwnage.isEnabled(player) && noPwnage.check(player)) event.disallow(Result.KICK_OTHER, cc.noPwnageReloginKickMessage); } } diff --git a/src/fr/neatmonster/nocheatplus/checks/fight/InstantHeal.java b/src/fr/neatmonster/nocheatplus/checks/fight/InstantHeal.java index 179924d9..d5c0edbc 100644 --- a/src/fr/neatmonster/nocheatplus/checks/fight/InstantHeal.java +++ b/src/fr/neatmonster/nocheatplus/checks/fight/InstantHeal.java @@ -44,7 +44,7 @@ public class InstantHeal extends Check { return false; } - final long delta = System.currentTimeMillis() - (data.instantHealLastTime + 3500L); + final long delta = System.currentTimeMillis() - (data.instantHealLastTime + 3000L); data.instantHealBuffer += delta; if (data.instantHealBuffer < 0) { diff --git a/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java b/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java index a2bf592e..a1d985ea 100644 --- a/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java +++ b/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java @@ -67,6 +67,9 @@ public class MovingListener implements Listener { /** The more packets vehicle check. */ private final MorePacketsVehicle morePacketsVehicle = new MorePacketsVehicle(); + /** The no fall check. */ + private final NoFall noFall = new NoFall(); + /** The survival fly check. */ private final SurvivalFly survivalFly = new SurvivalFly(); @@ -313,10 +316,13 @@ public class MovingListener implements Listener { if ((player.getGameMode() == GameMode.CREATIVE || player.getAllowFlight()) && creativeFly.isEnabled(player)) // If the player is handled by the creative fly check, execute it. newTo = creativeFly.check(player, from, to); - else if (survivalFly.isEnabled(player)) + else if (survivalFly.isEnabled(player)) { // If he is handled by the survival fly check, execute it. newTo = survivalFly.check(player, from, to); - else + if (newTo == null && noFall.isEnabled(player)) + // If he is handled by the no fall check, execute it. + noFall.check(player, from, to); + } else // He isn't handled by any fly check, clear his data. data.clearFlyData(); diff --git a/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java b/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java index 45c7c2c3..200bffef 100644 --- a/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java +++ b/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java @@ -54,6 +54,16 @@ public class NoFall extends Check { return; } + // if (player.getName().equals("NeatMonster")) { + // player.sendMessage("---"); + // player.sendMessage("bukkit = " + player.getFallDistance()); + // player.sendMessage("ncp = " + data.noFallDistance); + // player.sendMessage("fromIsOnGround = " + from.isOnGround()); + // player.sendMessage("fromIsOnStairs = " + from.isOnStairs()); + // player.sendMessage("toIsOnGround = " + to.isOnGround()); + // player.sendMessage("toIsOnStairs = " + to.isOnStairs()); + // } + // This check is pretty much always a step behind for technical reasons. if (from.isInLiquid() || from.isOnGround() || from.isOnLadder()) // Start with zero fall distance. @@ -104,7 +114,7 @@ public class NoFall extends Check { // feeling. if (from.getY() > to.getY()) { final float deltaY = (float) (from.getY() - to.getY()); - data.noFallDistance += deltaY * 0.75F; // Magic number. :) + data.noFallDistance += deltaY * 0.75D; // Magic number. :) if (deltaY > 1F) { data.noFallLastAddedDistance = deltaY; @@ -114,7 +124,7 @@ public class NoFall extends Check { } else data.noFallLastAddedDistance = 0F; - if (to.isOnGround()) + if (to.isOnGround() || from.isOnStairs()) data.noFallDistance = 0F; // Reduce violation level. diff --git a/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java b/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java index a475d745..ba3f1c09 100644 --- a/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java +++ b/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java @@ -84,7 +84,7 @@ public class SurvivalFly extends Check { private static final double SOULSAND_SPRINTING_MOVE = 0.18D; /** The horizontal speed limit when sprinting. */ - private static final double SPRINTING_MOVE = 0.37D; + private static final double SPRINTING_MOVE = 0.35D; /** The vertical speed limit when ascending into water. */ private static final double WATER_ASCEND = 0.13D + MARGIN; @@ -95,9 +95,6 @@ public class SurvivalFly extends Check { /** The horizontal speed limit when moving into water. */ private static final double WATER_MOVE = 0.18D; - /** The no fall check. */ - private final NoFall noFall = new NoFall(); - /** * Instantiates a new survival fly check. */ @@ -177,7 +174,7 @@ public class SurvivalFly extends Check { hAllowedDistance = cc.survivalFlyBlockingSpeed / 100D * BLOCKING_MOVE; else if (from.isInWater() && to.isInWater()) hAllowedDistance = cc.survivalFlyWaterSpeed / 100D * WATER_MOVE; - else if (player.isSprinting() && player.getFoodLevel() > 5) + else if (sprinting) hAllowedDistance = cc.survivalFlySprintingSpeed / 100D * SPRINTING_MOVE; if (data.survivalFlyOnIce > 0) @@ -221,6 +218,16 @@ public class SurvivalFly extends Check { hDistanceAboveLimit = Math.max(0D, hDistanceAboveLimit); + if (hDistanceAboveLimit == 0D && sprinting && !player.hasPermission(Permissions.MOVING_SURVIVALFLY_SPRINTING)) { + final double dX = to.getX() - from.getX(); + final double dZ = to.getZ() - from.getZ(); + final float yaw = from.getYaw(); + // Prevent players from sprinting if they're moving backwards. + if (dX < 0D && dZ > 0D && yaw > 180F && yaw < 270F || dX < 0D && dZ < 0D && yaw > 270F && yaw < 360F + || dX > 0D && dZ < 0D && yaw > 0F && yaw < 90F || dX > 0D && dZ > 0D && yaw > 90F && yaw < 180F) + hDistanceAboveLimit = hDistance; + } + // Potion effect "Jump". double jumpAmplifier = 1D; if (entity.hasEffect(MobEffectList.JUMP)) { @@ -288,7 +295,8 @@ public class SurvivalFly extends Check { data.survivalFlyLastDistances[1] = data.survivalFlyLastDistances[0]; data.survivalFlyLastDistances[0] = vDistance; - double vAllowedDistance = (data.verticalFreedom + 1.35D) * data.jumpAmplifier; + double vAllowedDistance = (data.verticalFreedom + (!from.isOnGround() && to.isOnGround() ? 1.5D : 1.35D)) + * data.jumpAmplifier; if (data.survivalFlyJumpPhase > JUMP_PHASE + data.jumpAmplifier) vAllowedDistance -= (data.survivalFlyJumpPhase - JUMP_PHASE) * JUMP_STEP; @@ -352,10 +360,6 @@ public class SurvivalFly extends Check { data.survivalFlyJumpPhase = 0; } - if (noFall.isEnabled(player)) - // Execute the NoFall check. - noFall.check(player, from, to); - return null; } diff --git a/src/fr/neatmonster/nocheatplus/config/ConfPaths.java b/src/fr/neatmonster/nocheatplus/config/ConfPaths.java index f35fd241..f397d28f 100644 --- a/src/fr/neatmonster/nocheatplus/config/ConfPaths.java +++ b/src/fr/neatmonster/nocheatplus/config/ConfPaths.java @@ -39,6 +39,7 @@ public abstract class ConfPaths { */ private static final String MISCELLANEOUS = "miscellaneous."; public static final String MISCELLANEOUS_ALLOWCLIENTMODS = MISCELLANEOUS + "allowclientmods"; + public static final String MISCELLANEOUS_OPINCONSOLEONLY = MISCELLANEOUS + "opinconsoleonly"; public static final String MISCELLANEOUS_PROTECTPLUGINS = MISCELLANEOUS + "protectplugins"; private static final String CHECKS = "checks."; @@ -129,13 +130,6 @@ public abstract class ConfPaths { */ private static final String CHAT = CHECKS + "chat."; - private static final String CHAT_ARRIVALS = CHAT + "arrivals."; - public static final String CHAT_ARRIVALS_CHECK = CHAT_ARRIVALS + "active"; - public static final String CHAT_ARRIVALS_JOINSLIMIT = CHAT_ARRIVALS + "joinslimit"; - public static final String CHAT_ARRIVALS_MESSAGE = CHAT_ARRIVALS + "message"; - public static final String CHAT_ARRIVALS_TIMELIMIT = CHAT_ARRIVALS + "timelimit"; - public static final String CHAT_ARRIVALS_ACTIONS = CHAT_ARRIVALS + "actions"; - private static final String CHAT_COLOR = CHAT + "color."; public static final String CHAT_COLOR_CHECK = CHAT_COLOR + "active"; public static final String CHAT_COLOR_ACTIONS = CHAT_COLOR + "actions"; diff --git a/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java b/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java index 215ae14f..953d23d6 100644 --- a/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java +++ b/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java @@ -47,6 +47,7 @@ public class DefaultConfig extends ConfigFile { * d888b Y8b Y8b 888 d,dP "88,e8' "YeeP" 888 888 "88 888 888 888 "YeeP" "88 88" "88 88" d,dP */ set(ConfPaths.MISCELLANEOUS_ALLOWCLIENTMODS, false); + set(ConfPaths.MISCELLANEOUS_OPINCONSOLEONLY, false); set(ConfPaths.MISCELLANEOUS_PROTECTPLUGINS, true); /* @@ -117,12 +118,6 @@ public class DefaultConfig extends ConfigFile { * Y888 ,d 888 888 ,ee 888 888 * "88,d88 888 888 "88 888 888 */ - set(ConfPaths.CHAT_ARRIVALS_CHECK, false); - set(ConfPaths.CHAT_ARRIVALS_JOINSLIMIT, 3); - set(ConfPaths.CHAT_ARRIVALS_MESSAGE, "Please try again later!"); - set(ConfPaths.CHAT_ARRIVALS_TIMELIMIT, 5000L); - set(ConfPaths.CHAT_ARRIVALS_ACTIONS, "cancel"); - set(ConfPaths.CHAT_COLOR_CHECK, true); set(ConfPaths.CHAT_COLOR_ACTIONS, "log:color:0:1:if cancel"); @@ -162,7 +157,7 @@ public class DefaultConfig extends ConfigFile { set(ConfPaths.CHAT_NOPWNAGE_RELOGIN_WARNING_MESSAGE, "&cYou relogged really fast! If you keep doing that, you're going to be banned."); set(ConfPaths.CHAT_NOPWNAGE_RELOGIN_WARNING_NUMBER, 1); - set(ConfPaths.CHAT_NOPWNAGE_RELOGIN_KICKMESSAGE, "Please try again later!"); + set(ConfPaths.CHAT_NOPWNAGE_RELOGIN_KICKMESSAGE, "You've relogged too fast, joining cancelled!"); set(ConfPaths.CHAT_NOPWNAGE_RELOGIN_WARNING_TIMEOUT, 60000L); set(ConfPaths.CHAT_NOPWNAGE_REPEAT_CHECK, true); diff --git a/src/fr/neatmonster/nocheatplus/players/Permissions.java b/src/fr/neatmonster/nocheatplus/players/Permissions.java index b1750f9e..9e3ab661 100644 --- a/src/fr/neatmonster/nocheatplus/players/Permissions.java +++ b/src/fr/neatmonster/nocheatplus/players/Permissions.java @@ -13,7 +13,7 @@ package fr.neatmonster.nocheatplus.players; * The various permission nodes used by NoCheatPlus. */ public class Permissions { - private static final String NOCHEATPLUS = "nocheatplus"; + private static final String NOCHEATPLUS = "nocheatplus"; /* * e Y8b 888 ,e, ,e, d8 d8 ,e, @@ -22,10 +22,10 @@ public class Permissions { * d888888888b Y888 888 888 888 888 888 888 888 888 Y88D 888 888 ,ee 888 888 888 Y888 888P 888 888 * d8888888b Y8b "88 888 888 888 888 888 888 888 888 d,dP 888 888 "88 888 888 888 "88 88" 888 888 */ - private static final String ADMINISTRATION = NOCHEATPLUS + ".admin"; - public static final String ADMINISTRATION_NOTIFY = ADMINISTRATION + ".notify"; - public static final String ADMINISTRATION_PLUGINS = ADMINISTRATION + ".plugins"; - public static final String ADMINISTRATION_RELOAD = ADMINISTRATION + ".reload"; + private static final String ADMINISTRATION = NOCHEATPLUS + ".admin"; + public static final String ADMINISTRATION_NOTIFY = ADMINISTRATION + ".notify"; + public static final String ADMINISTRATION_PLUGINS = ADMINISTRATION + ".plugins"; + public static final String ADMINISTRATION_RELOAD = ADMINISTRATION + ".reload"; /* * e e 888 ,e, dP,e, ,e, d8 ,e, @@ -34,36 +34,36 @@ public class Permissions { * d8b Y8b Y8b Y888 888P Y888 888 888 888 888 Y888 , ,ee 888 888 888 Y888 888P 888 888 Y88D * d888b Y8b Y8b "88 88" "88 888 888 888 888 "88,e8' "88 888 888 888 "88 88" 888 888 d,dP */ - private static final String MODS = NOCHEATPLUS + ".mods"; + private static final String MODS = NOCHEATPLUS + ".mods"; - private static final String CJB = MODS + ".cjb"; - public static final String CJB_FLY = CJB + ".fly"; - public static final String CJB_XRAY = CJB + ".xray"; - public static final String CJB_RADAR = CJB + ".radar"; + private static final String CJB = MODS + ".cjb"; + public static final String CJB_FLY = CJB + ".fly"; + public static final String CJB_XRAY = CJB + ".xray"; + public static final String CJB_RADAR = CJB + ".radar"; - private static final String MINECRAFTAUTOMAP = MODS + ".minecraftautomap"; - public static final String MINECRAFTAUTOMAP_ORES = MINECRAFTAUTOMAP + ".ores"; - public static final String MINECRAFTAUTOMAP_CAVE = MINECRAFTAUTOMAP + ".cave"; - public static final String MINECRAFTAUTOMAP_RADAR = MINECRAFTAUTOMAP + ".radar"; + private static final String MINECRAFTAUTOMAP = MODS + ".minecraftautomap"; + public static final String MINECRAFTAUTOMAP_ORES = MINECRAFTAUTOMAP + ".ores"; + public static final String MINECRAFTAUTOMAP_CAVE = MINECRAFTAUTOMAP + ".cave"; + public static final String MINECRAFTAUTOMAP_RADAR = MINECRAFTAUTOMAP + ".radar"; - private static final String REI = MODS + ".rei"; - public static final String REI_CAVE = REI + ".cave"; - public static final String REI_RADAR = REI + ".radar"; + private static final String REI = MODS + ".rei"; + public static final String REI_CAVE = REI + ".cave"; + public static final String REI_RADAR = REI + ".radar"; - private static final String SMARTMOVING = MODS + ".smartmoving"; - public static final String SMARTMOVING_CLIMBING = SMARTMOVING + ".climbing"; - public static final String SMARTMOVING_SWIMMING = SMARTMOVING + ".swimming"; - public static final String SMARTMOVING_CRAWLING = SMARTMOVING + ".crawling"; - public static final String SMARTMOVING_SLIDING = SMARTMOVING + ".sliding"; - public static final String SMARTMOVING_JUMPING = SMARTMOVING + ".jumping"; - public static final String SMARTMOVING_FLYING = SMARTMOVING + ".flying"; + private static final String SMARTMOVING = MODS + ".smartmoving"; + public static final String SMARTMOVING_CLIMBING = SMARTMOVING + ".climbing"; + public static final String SMARTMOVING_SWIMMING = SMARTMOVING + ".swimming"; + public static final String SMARTMOVING_CRAWLING = SMARTMOVING + ".crawling"; + public static final String SMARTMOVING_SLIDING = SMARTMOVING + ".sliding"; + public static final String SMARTMOVING_JUMPING = SMARTMOVING + ".jumping"; + public static final String SMARTMOVING_FLYING = SMARTMOVING + ".flying"; - private static final String ZOMBE = MODS + ".zombe"; - public static final String ZOMBE_FLY = ZOMBE + ".fly"; - public static final String ZOMBE_NOCLIP = ZOMBE + ".noclip"; - public static final String ZOMBE_CHEAT = ZOMBE + ".cheat"; + private static final String ZOMBE = MODS + ".zombe"; + public static final String ZOMBE_FLY = ZOMBE + ".fly"; + public static final String ZOMBE_NOCLIP = ZOMBE + ".noclip"; + public static final String ZOMBE_CHEAT = ZOMBE + ".cheat"; - private static final String CHECKS = NOCHEATPLUS + ".checks"; + private static final String CHECKS = NOCHEATPLUS + ".checks"; /* * 888 88b, 888 888 888 88b, 888 @@ -72,11 +72,11 @@ public class Permissions { * 888 88b, 888 Y888 888P Y888 , 888 b 888 88b, 888 888 , ,ee 888 888 b * 888 88P' 888 "88 88" "88,e8' 888 8b 888 88P' 888 "YeeP" "88 888 888 8b */ - private static final String BLOCKBREAK = CHECKS + ".blockbreak"; - public static final String BLOCKBREAK_DIRECTION = BLOCKBREAK + ".direction"; - public static final String BLOCKBREAK_FASTBREAK = BLOCKBREAK + ".fastbreak"; - public static final String BLOCKBREAK_NOSWING = BLOCKBREAK + ".noswing"; - public static final String BLOCKBREAK_REACH = BLOCKBREAK + ".reach"; + private static final String BLOCKBREAK = CHECKS + ".blockbreak"; + public static final String BLOCKBREAK_DIRECTION = BLOCKBREAK + ".direction"; + public static final String BLOCKBREAK_FASTBREAK = BLOCKBREAK + ".fastbreak"; + public static final String BLOCKBREAK_NOSWING = BLOCKBREAK + ".noswing"; + public static final String BLOCKBREAK_REACH = BLOCKBREAK + ".reach"; /* * 888 88b, 888 888 888 d8 d8 @@ -85,9 +85,9 @@ public class Permissions { * 888 88b, 888 Y888 888P Y888 , 888 b 888 888 888 888 888 , 888 ,ee 888 Y888 , 888 * 888 88P' 888 "88 88" "88,e8' 888 8b 888 888 888 888 "YeeP" 888 "88 888 "88,e8' 888 */ - private static final String BLOCKINTERACT = CHECKS + ".blockinteract"; - public static final String BLOCKINTERACT_DIRECTION = BLOCKINTERACT + ".direction"; - public static final String BLOCKINTERACT_REACH = BLOCKINTERACT + ".reach"; + private static final String BLOCKINTERACT = CHECKS + ".blockinteract"; + public static final String BLOCKINTERACT_DIRECTION = BLOCKINTERACT + ".direction"; + public static final String BLOCKINTERACT_REACH = BLOCKINTERACT + ".reach"; /* * 888 88b, 888 888 888 88e 888 @@ -96,12 +96,12 @@ public class Permissions { * 888 88b, 888 Y888 888P Y888 , 888 b 888 888 ,ee 888 Y888 , 888 , * 888 88P' 888 "88 88" "88,e8' 888 8b 888 888 "88 888 "88,e8' "YeeP" */ - private static final String BLOCKPLACE = CHECKS + ".blockplace"; - public static final String BLOCKPLACE_DIRECTION = BLOCKPLACE + ".direction"; - public static final String BLOCKPLACE_FASTPLACE = BLOCKPLACE + ".fastplace"; - public static final String BLOCKPLACE_NOSWING = BLOCKPLACE + ".noswing"; - public static final String BLOCKPLACE_REACH = BLOCKPLACE + ".reach"; - public static final String BLOCKPLACE_SPEED = BLOCKPLACE + ".speed"; + private static final String BLOCKPLACE = CHECKS + ".blockplace"; + public static final String BLOCKPLACE_DIRECTION = BLOCKPLACE + ".direction"; + public static final String BLOCKPLACE_FASTPLACE = BLOCKPLACE + ".fastplace"; + public static final String BLOCKPLACE_NOSWING = BLOCKPLACE + ".noswing"; + public static final String BLOCKPLACE_REACH = BLOCKPLACE + ".reach"; + public static final String BLOCKPLACE_SPEED = BLOCKPLACE + ".speed"; /* * e88'Y88 888 d8 @@ -110,10 +110,9 @@ public class Permissions { * Y888 ,d 888 888 ,ee 888 888 * "88,d88 888 888 "88 888 888 */ - private static final String CHAT = CHECKS + ".chat"; - public static final String CHAT_ARRIVALS = CHAT + ".arrivals"; - public static final String CHAT_COLOR = CHAT + ".color"; - public static final String CHAT_NOPWNAGE = CHAT + ".nopwnage"; + private static final String CHAT = CHECKS + ".chat"; + public static final String CHAT_COLOR = CHAT + ".color"; + public static final String CHAT_NOPWNAGE = CHAT + ".nopwnage"; /* * 888'Y88 ,e, 888 d8 @@ -124,16 +123,16 @@ public class Permissions { * , 88P * "8",P" */ - private static final String FIGHT = CHECKS + ".fight"; - public static final String FIGHT_ANGLE = FIGHT + ".angle"; - public static final String FIGHT_CRITICAL = FIGHT + ".critical"; - public static final String FIGHT_DIRECTION = FIGHT + ".direction"; - public static final String FIGHT_GODMODE = FIGHT + ".godmode"; - public static final String FIGHT_INSTANTHEAL = FIGHT + ".instantheal"; - public static final String FIGHT_KNOCKBACK = FIGHT + ".knockback"; - public static final String FIGHT_NOSWING = FIGHT + ".noswing"; - public static final String FIGHT_REACH = FIGHT + ".reach"; - public static final String FIGHT_SPEED = FIGHT + ".speed"; + private static final String FIGHT = CHECKS + ".fight"; + public static final String FIGHT_ANGLE = FIGHT + ".angle"; + public static final String FIGHT_CRITICAL = FIGHT + ".critical"; + public static final String FIGHT_DIRECTION = FIGHT + ".direction"; + public static final String FIGHT_GODMODE = FIGHT + ".godmode"; + public static final String FIGHT_INSTANTHEAL = FIGHT + ".instantheal"; + public static final String FIGHT_KNOCKBACK = FIGHT + ".knockback"; + public static final String FIGHT_NOSWING = FIGHT + ".noswing"; + public static final String FIGHT_REACH = FIGHT + ".reach"; + public static final String FIGHT_SPEED = FIGHT + ".speed"; /* * 888 d8 @@ -144,10 +143,10 @@ public class Permissions { * 888 * 888 */ - private static final String INVENTORY = CHECKS + ".inventory"; - public static final String INVENTORY_DROP = INVENTORY + ".drop"; - public static final String INVENTORY_INSTANTBOW = INVENTORY + ".instantbow"; - public static final String INVENTORY_INSTANTEAT = INVENTORY + ".instanteat"; + private static final String INVENTORY = CHECKS + ".inventory"; + public static final String INVENTORY_DROP = INVENTORY + ".drop"; + public static final String INVENTORY_INSTANTBOW = INVENTORY + ".instantbow"; + public static final String INVENTORY_INSTANTEAT = INVENTORY + ".instanteat"; /* * e e ,e, @@ -158,13 +157,14 @@ public class Permissions { * , 88P * "8",P" */ - private static final String MOVING = CHECKS + ".moving"; - public static final String MOVING_BOATSANYWHERE = MOVING + ".boatsanywhere"; - public static final String MOVING_CREATIVEFLY = MOVING + ".creativefly"; - public static final String MOVING_MOREPACKETS = MOVING + ".morepackets"; - public static final String MOVING_MOREPACKETSVEHICLE = MOVING + ".morepacketsvehicle"; - public static final String MOVING_NOFALL = MOVING + ".nofall"; - public static final String MOVING_SURVIVALFLY = MOVING + ".survivalfly"; - public static final String MOVING_SURVIVALFLY_BLOCKING = MOVING_SURVIVALFLY + ".blocking"; - public static final String MOVING_SURVIVALFLY_SNEAKING = MOVING_SURVIVALFLY + ".sneaking"; + private static final String MOVING = CHECKS + ".moving"; + public static final String MOVING_BOATSANYWHERE = MOVING + ".boatsanywhere"; + public static final String MOVING_CREATIVEFLY = MOVING + ".creativefly"; + public static final String MOVING_MOREPACKETS = MOVING + ".morepackets"; + public static final String MOVING_MOREPACKETSVEHICLE = MOVING + ".morepacketsvehicle"; + public static final String MOVING_NOFALL = MOVING + ".nofall"; + public static final String MOVING_SURVIVALFLY = MOVING + ".survivalfly"; + public static final String MOVING_SURVIVALFLY_BLOCKING = MOVING_SURVIVALFLY + ".blocking"; + public static final String MOVING_SURVIVALFLY_SNEAKING = MOVING_SURVIVALFLY + ".sneaking"; + public static final String MOVING_SURVIVALFLY_SPRINTING = MOVING_SURVIVALFLY + ".sprinting"; } diff --git a/src/fr/neatmonster/nocheatplus/utilities/PlayerLocation.java b/src/fr/neatmonster/nocheatplus/utilities/PlayerLocation.java index 257f2ba2..b459f066 100644 --- a/src/fr/neatmonster/nocheatplus/utilities/PlayerLocation.java +++ b/src/fr/neatmonster/nocheatplus/utilities/PlayerLocation.java @@ -102,6 +102,9 @@ public class PlayerLocation { /** Is the player on soul sand? */ private final CustomBoolean onSoulSand = new CustomBoolean(); + /** Is the player on stairs? */ + private final CustomBoolean onStairs = new CustomBoolean(); + /** The bounding box of the player. */ private final AxisAlignedBB boundingBox; @@ -348,4 +351,25 @@ public class PlayerLocation { } return onSoulSand.get(); } + + public boolean isOnStairs() { + if (!onStairs.isSet()) { + AxisAlignedBB boundingBoxGround = boundingBox.clone(); + boundingBoxGround = boundingBoxGround.d(0D, -0.5D, 0D); + for (final Object object : world.getCubes(entity, boundingBoxGround)) { + final AxisAlignedBB aabbCube = (AxisAlignedBB) object; + final int blockX = (int) Math.floor(aabbCube.a); + final int blockY = (int) Math.floor(aabbCube.b); + final int blockZ = (int) Math.floor(aabbCube.c); + final int id = world.getTypeId(blockX, blockY, blockZ); + if (!onStairs.get() + && (id == 53 || id == 67 || id == 108 || id == 109 || id == 114 || id == 128 || id == 134 + || id == 135 || id == 136)) + onStairs.set(true); + } + if (!onStairs.isSet()) + onStairs.set(false); + } + return onStairs.get(); + } }