mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2025-01-19 05:51:29 +01:00
= Fixed checking when a player's velocity is modified by a plugin
= Fixed NoCheat+ hiding issues (with external plugins)
This commit is contained in:
parent
27c79ac30c
commit
82b5dbc5b1
@ -598,6 +598,12 @@
|
|||||||
swimming speed of players at all (NoCheatPlus knows when players sprint,
|
swimming speed of players at all (NoCheatPlus knows when players sprint,
|
||||||
use Swiftness potions etc and will already adapt the speed based on
|
use Swiftness potions etc and will already adapt the speed based on
|
||||||
that data).
|
that data).
|
||||||
|
|
||||||
|
maxcooldown:
|
||||||
|
How much time the player can spend in the air if his velocity has been
|
||||||
|
modified by an external plugin (PreciousStones for example). The default
|
||||||
|
delay is 10 seconds because it sounds like a player won't spend more
|
||||||
|
than 10 seconds in the air.
|
||||||
|
|
||||||
allowfastsneaking:
|
allowfastsneaking:
|
||||||
Should sneaking players be allowed to move as fast as normal players.
|
Should sneaking players be allowed to move as fast as normal players.
|
||||||
|
@ -3,7 +3,7 @@ version: ${project.version}
|
|||||||
description: ${project.description}
|
description: ${project.description}
|
||||||
|
|
||||||
author: NeatMonster
|
author: NeatMonster
|
||||||
authors: [Eventprime, Juliui]
|
authors: [Evenprime, Juliui, craftingmania]
|
||||||
website: ${project.url}
|
website: ${project.url}
|
||||||
|
|
||||||
main: me.neatmonster.nocheatplus.NoCheatPlus
|
main: me.neatmonster.nocheatplus.NoCheatPlus
|
||||||
|
2
pom.xml
2
pom.xml
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<!-- Informations -->
|
<!-- Informations -->
|
||||||
<name>NoCheatPlus</name>
|
<name>NoCheatPlus</name>
|
||||||
<version>3.5.5_4</version>
|
<version>3.5.5_5</version>
|
||||||
<description>Detect and fight the exploitation of various flaws/bugs in Minecraft.</description>
|
<description>Detect and fight the exploitation of various flaws/bugs in Minecraft.</description>
|
||||||
<url>http://dev.bukkit.org/server-mods/nocheatplus</url>
|
<url>http://dev.bukkit.org/server-mods/nocheatplus</url>
|
||||||
|
|
||||||
|
@ -98,7 +98,10 @@ public class ChatCheckListener implements Listener, EventManager {
|
|||||||
if ((event.getMessage().equalsIgnoreCase("/plugins")
|
if ((event.getMessage().equalsIgnoreCase("/plugins")
|
||||||
|| event.getMessage().toLowerCase().startsWith("/plugins ")
|
|| event.getMessage().toLowerCase().startsWith("/plugins ")
|
||||||
|| event.getMessage().equalsIgnoreCase("/pl") || event.getMessage().toLowerCase().startsWith("/pl "))
|
|| event.getMessage().equalsIgnoreCase("/pl") || event.getMessage().toLowerCase().startsWith("/pl "))
|
||||||
&& Bukkit.getPluginManager().getPlugin("PluginList") == null && cc.hideNoCheatPlus) {
|
// Exception for 'PluginList'...
|
||||||
|
&& Bukkit.getPluginManager().getPlugin("PluginList") == null
|
||||||
|
// ...and CommandHelper
|
||||||
|
&& Bukkit.getPluginManager().getPlugin("CommandHelper") == null && cc.hideNoCheatPlus) {
|
||||||
// If the player isn't allowed to use this command
|
// If the player isn't allowed to use this command
|
||||||
if (!event.getPlayer().hasPermission("bukkit.command.plugins"))
|
if (!event.getPlayer().hasPermission("bukkit.command.plugins"))
|
||||||
// Fake the permissions error message
|
// Fake the permissions error message
|
||||||
@ -111,7 +114,7 @@ public class ChatCheckListener implements Listener, EventManager {
|
|||||||
final Plugin[] plugins = Bukkit.getPluginManager().getPlugins();
|
final Plugin[] plugins = Bukkit.getPluginManager().getPlugins();
|
||||||
|
|
||||||
for (final Plugin plugin : plugins) {
|
for (final Plugin plugin : plugins) {
|
||||||
// But make sure to hide NoCheatPlus
|
// But make sure to hide NoCheatPlus from the plugins list
|
||||||
if (plugin.getName().equals("NoCheatPlus"))
|
if (plugin.getName().equals("NoCheatPlus"))
|
||||||
continue;
|
continue;
|
||||||
if (pluginList.length() > 0) {
|
if (pluginList.length() > 0) {
|
||||||
@ -126,6 +129,7 @@ public class ChatCheckListener implements Listener, EventManager {
|
|||||||
// Of course decrease the number of plugins
|
// Of course decrease the number of plugins
|
||||||
event.getPlayer().sendMessage("Plugins (" + (plugins.length - 1) + "): " + pluginList.toString());
|
event.getPlayer().sendMessage("Plugins (" + (plugins.length - 1) + "): " + pluginList.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cancel the event, we have already replied to the player
|
// Cancel the event, we have already replied to the player
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ public class FlyingCheck extends MovingCheck {
|
|||||||
result = resultHoriz + resultVert;
|
result = resultHoriz + resultVert;
|
||||||
|
|
||||||
// The player went to far, either horizontal or vertical
|
// The player went to far, either horizontal or vertical
|
||||||
if (result > 0) {
|
if (result > 0 && !data.velocityChanged) {
|
||||||
|
|
||||||
// Increment violation counter and statistics
|
// Increment violation counter and statistics
|
||||||
data.runflyVL += result;
|
data.runflyVL += result;
|
||||||
|
@ -169,6 +169,8 @@ public class MovingCheckListener implements Listener, EventManager {
|
|||||||
s.add("moving.sneaking");
|
s.add("moving.sneaking");
|
||||||
if (m.nofallCheck)
|
if (m.nofallCheck)
|
||||||
s.add("moving.nofall");
|
s.add("moving.nofall");
|
||||||
|
if (m.trackerCheck)
|
||||||
|
s.add("moving.tracker");
|
||||||
if (m.waterWalkCheck)
|
if (m.waterWalkCheck)
|
||||||
s.add("moving.waterwalk");
|
s.add("moving.waterwalk");
|
||||||
} else
|
} else
|
||||||
@ -245,6 +247,16 @@ public class MovingCheckListener implements Listener, EventManager {
|
|||||||
data.lastSafeLocations[1] = event.getFrom();
|
data.lastSafeLocations[1] = event.getFrom();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if the player is on/in the ground
|
||||||
|
final int toType = CheckUtil.evaluateLocation(event.getPlayer().getWorld(), data.to);
|
||||||
|
if (data.velocityChanged
|
||||||
|
&& (System.currentTimeMillis() - data.velocityChangedSince > 500L
|
||||||
|
&& (CheckUtil.isOnGround(toType) || CheckUtil.isInGround(toType)) || cc.maxCooldown != -1
|
||||||
|
&& System.currentTimeMillis() - data.velocityChangedSince > cc.maxCooldown)) {
|
||||||
|
data.velocityChanged = false;
|
||||||
|
data.velocityChangedSince = 0L;
|
||||||
|
}
|
||||||
|
|
||||||
PreciseLocation newTo = null;
|
PreciseLocation newTo = null;
|
||||||
|
|
||||||
/** RUNFLY CHECK SECTION **/
|
/** RUNFLY CHECK SECTION **/
|
||||||
@ -457,8 +469,9 @@ public class MovingCheckListener implements Listener, EventManager {
|
|||||||
|
|
||||||
final MovingData data = MovingCheck.getData(plugin.getPlayer(event.getPlayer()));
|
final MovingData data = MovingCheck.getData(plugin.getPlayer(event.getPlayer()));
|
||||||
|
|
||||||
// Reset the tracker's data
|
// Remeber that a plugin changed the player's velocity
|
||||||
data.fallingSince = 0L;
|
data.velocityChanged = true;
|
||||||
|
data.velocityChangedSince = System.currentTimeMillis();
|
||||||
|
|
||||||
final Vector v = event.getVelocity();
|
final Vector v = event.getVelocity();
|
||||||
|
|
||||||
|
@ -21,9 +21,10 @@ public class MovingConfig implements ConfigItem {
|
|||||||
public final double swimmingSpeedLimit;
|
public final double swimmingSpeedLimit;
|
||||||
public final boolean sneakingCheck;
|
public final boolean sneakingCheck;
|
||||||
public final double sneakingSpeedLimit;
|
public final double sneakingSpeedLimit;
|
||||||
|
public final int maxCooldown;
|
||||||
public final ActionList actions;
|
public final ActionList actions;
|
||||||
|
|
||||||
public final boolean tracker;
|
public final boolean trackerCheck;
|
||||||
public final ActionList trackerActions;
|
public final ActionList trackerActions;
|
||||||
|
|
||||||
public final boolean allowFlying;
|
public final boolean allowFlying;
|
||||||
@ -64,9 +65,10 @@ public class MovingConfig implements ConfigItem {
|
|||||||
jumpheight = 135 / 100D;
|
jumpheight = 135 / 100D;
|
||||||
|
|
||||||
sneakingCheck = !data.getBoolean(ConfPaths.MOVING_RUNFLY_ALLOWFASTSNEAKING);
|
sneakingCheck = !data.getBoolean(ConfPaths.MOVING_RUNFLY_ALLOWFASTSNEAKING);
|
||||||
|
maxCooldown = data.getInt(ConfPaths.MOVING_RUNFLY_MAXCOOLDOWN);
|
||||||
actions = data.getActionList(ConfPaths.MOVING_RUNFLY_ACTIONS, Permissions.MOVING_RUNFLY);
|
actions = data.getActionList(ConfPaths.MOVING_RUNFLY_ACTIONS, Permissions.MOVING_RUNFLY);
|
||||||
|
|
||||||
tracker = data.getBoolean(ConfPaths.MOVING_RUNFLY_TRACKER_CHECK);
|
trackerCheck = data.getBoolean(ConfPaths.MOVING_RUNFLY_TRACKER_CHECK);
|
||||||
trackerActions = data.getActionList(ConfPaths.MOVING_RUNFLY_TRACKER_ACTIONS, Permissions.MOVING_FLYING);
|
trackerActions = data.getActionList(ConfPaths.MOVING_RUNFLY_TRACKER_ACTIONS, Permissions.MOVING_FLYING);
|
||||||
|
|
||||||
allowFlying = data.getBoolean(ConfPaths.MOVING_RUNFLY_FLYING_ALLOWALWAYS);
|
allowFlying = data.getBoolean(ConfPaths.MOVING_RUNFLY_FLYING_ALLOWALWAYS);
|
||||||
|
@ -48,6 +48,12 @@ public class MovingData implements DataItem {
|
|||||||
// Keep in mind since when the player in falling/jumping
|
// Keep in mind since when the player in falling/jumping
|
||||||
public long fallingSince = 0L;
|
public long fallingSince = 0L;
|
||||||
|
|
||||||
|
// Is the player flying because of a plugin has modified his velocity
|
||||||
|
public boolean velocityChanged = false;
|
||||||
|
|
||||||
|
// If yes, since when?
|
||||||
|
public long velocityChangedSince = 0L;
|
||||||
|
|
||||||
// Remember if the player has already been on the ground
|
// Remember if the player has already been on the ground
|
||||||
public boolean hasAlreadyBeenOnTheGround = false;
|
public boolean hasAlreadyBeenOnTheGround = false;
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ public class RunningCheck extends MovingCheck {
|
|||||||
data.runflyVL *= 0.95;
|
data.runflyVL *= 0.95;
|
||||||
|
|
||||||
// Did the player move in unexpected ways?
|
// Did the player move in unexpected ways?
|
||||||
if (result > 0) {
|
if (result > 0 && !data.velocityChanged) {
|
||||||
// Increment violation counter
|
// Increment violation counter
|
||||||
data.runflyVL += result;
|
data.runflyVL += result;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ public class TrackerCheck extends MovingCheck {
|
|||||||
// Do not do the check if it's disabled, if flying is allowed, if the player is
|
// Do not do the check if it's disabled, if flying is allowed, if the player is
|
||||||
// allowed to fly because of its game mode, if he has the required permission,
|
// allowed to fly because of its game mode, if he has the required permission,
|
||||||
// if he is in water, on a ladder or in vines.
|
// if he is in water, on a ladder or in vines.
|
||||||
if (!cc.tracker || cc.allowFlying || player.getPlayer().getGameMode() == GameMode.CREATIVE
|
if (!cc.trackerCheck || cc.allowFlying || player.getPlayer().getGameMode() == GameMode.CREATIVE
|
||||||
|| player.getPlayer().getAllowFlight() || player.getPlayer().hasPermission(Permissions.MOVING_RUNFLY)
|
|| player.getPlayer().getAllowFlight() || player.getPlayer().hasPermission(Permissions.MOVING_RUNFLY)
|
||||||
|| player.getPlayer().hasPermission(Permissions.MOVING_FLYING) || isLiquid
|
|| player.getPlayer().hasPermission(Permissions.MOVING_FLYING) || isLiquid
|
||||||
|| player.getPlayer().getLocation().getBlock().getType() == Material.LADDER
|
|| player.getPlayer().getLocation().getBlock().getType() == Material.LADDER
|
||||||
@ -46,7 +46,7 @@ public class TrackerCheck extends MovingCheck {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If the player isn't static or jumping
|
// If the player isn't static or jumping
|
||||||
if (Math.abs(player.getPlayer().getVelocity().getY()) > 0.1D) {
|
if (Math.abs(player.getPlayer().getVelocity().getY()) > 0.1D && !data.velocityChanged) {
|
||||||
|
|
||||||
// Only do something if the player has already been on the ground
|
// Only do something if the player has already been on the ground
|
||||||
if (!data.hasAlreadyBeenOnTheGround)
|
if (!data.hasAlreadyBeenOnTheGround)
|
||||||
|
@ -8,6 +8,9 @@ import java.util.Map;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import me.neatmonster.nocheatplus.NoCheatPlus;
|
import me.neatmonster.nocheatplus.NoCheatPlus;
|
||||||
|
import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
|
||||||
|
import me.neatmonster.nocheatplus.checks.chat.ChatCheck;
|
||||||
|
import me.neatmonster.nocheatplus.checks.chat.ChatConfig;
|
||||||
import me.neatmonster.nocheatplus.config.Permissions;
|
import me.neatmonster.nocheatplus.config.Permissions;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@ -63,10 +66,15 @@ public class CommandHandler {
|
|||||||
public boolean handleCommand(final NoCheatPlus plugin, final CommandSender sender, final Command command,
|
public boolean handleCommand(final NoCheatPlus plugin, final CommandSender sender, final Command command,
|
||||||
final String label, final String[] args) {
|
final String label, final String[] args) {
|
||||||
|
|
||||||
// Hide NoCheatPlus's commands if the player doesn't have the required permission
|
if (sender instanceof Player) {
|
||||||
if (sender instanceof Player && !sender.hasPermission("nocheatplus.admin.commands")) {
|
final NoCheatPlusPlayer player = plugin.getPlayer((Player) sender);
|
||||||
sender.sendMessage("Unknown command. Type \"help\" for help.");
|
final ChatConfig cc = ChatCheck.getConfig(player);
|
||||||
return true;
|
|
||||||
|
// Hide NoCheatPlus's commands if the player doesn't have the required permission
|
||||||
|
if (!sender.hasPermission("nocheatplus.admin.commands") && cc.hideNoCheatPlus) {
|
||||||
|
sender.sendMessage("Unknown command. Type \"help\" for help.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
|
@ -51,6 +51,7 @@ public abstract class ConfPaths {
|
|||||||
public final static String MOVING_RUNFLY_SPRINTSPEED = MOVING_RUNFLY + "sprintspeed";
|
public final static String MOVING_RUNFLY_SPRINTSPEED = MOVING_RUNFLY + "sprintspeed";
|
||||||
|
|
||||||
public final static String MOVING_RUNFLY_ALLOWFASTSNEAKING = MOVING_RUNFLY + "allowfastsneaking";
|
public final static String MOVING_RUNFLY_ALLOWFASTSNEAKING = MOVING_RUNFLY + "allowfastsneaking";
|
||||||
|
public final static String MOVING_RUNFLY_MAXCOOLDOWN = MOVING_RUNFLY + "maxcooldown";
|
||||||
public final static String MOVING_RUNFLY_ACTIONS = MOVING_RUNFLY + "actions";
|
public final static String MOVING_RUNFLY_ACTIONS = MOVING_RUNFLY + "actions";
|
||||||
|
|
||||||
public final static String MOVING_RUNFLY_CHECKNOFALL = MOVING_RUNFLY + "checknofall";
|
public final static String MOVING_RUNFLY_CHECKNOFALL = MOVING_RUNFLY + "checknofall";
|
||||||
|
@ -46,6 +46,7 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
|
|||||||
|
|
||||||
set(ConfPaths.MOVING_RUNFLY_CHECK, true);
|
set(ConfPaths.MOVING_RUNFLY_CHECK, true);
|
||||||
set(ConfPaths.MOVING_RUNFLY_ALLOWFASTSNEAKING, false);
|
set(ConfPaths.MOVING_RUNFLY_ALLOWFASTSNEAKING, false);
|
||||||
|
set(ConfPaths.MOVING_RUNFLY_MAXCOOLDOWN, 10000);
|
||||||
set(ConfPaths.MOVING_RUNFLY_ACTIONS,
|
set(ConfPaths.MOVING_RUNFLY_ACTIONS,
|
||||||
"log:moveshort:3:5:f cancel vl>100 log:moveshort:0:5:if cancel vl>400 log:movelong:0:5:cif cancel");
|
"log:moveshort:3:5:f cancel vl>100 log:moveshort:0:5:if cancel vl>400 log:movelong:0:5:cif cancel");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user