+ NoCheatPlus is now hidden from the /plugins command

= Fixed an issue with the fly tracker and water
This commit is contained in:
NeatMonster 2012-04-10 22:08:51 +02:00
parent 60802760f5
commit 4d99d24d64
7 changed files with 67 additions and 5 deletions

View File

@ -907,6 +907,12 @@
------------------------------- CHAT Subsection --------------------------------
Checks that at least technically have to do with chat or commands.
hidenocheatplus:
Setting this to true will hide NoCheatPlus for the /plugins (or /pl) command
of Bukkit (only if typed by a player). This command might be used by some
griefing clients to try to detect and to apply bypasses to NoCheatPlus.
1) COLOR:

View File

@ -4,7 +4,7 @@
<!-- Informations -->
<name>NoCheatPlus</name>
<version>3.5.5</version>
<version>3.5.5_1</version>
<description>Detect and fight the exploitation of various flaws/bugs in Minecraft.</description>
<url>http://dev.bukkit.org/server-mods/nocheatplus</url>

View File

@ -9,12 +9,15 @@ import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.config.ConfigurationCacheStore;
import me.neatmonster.nocheatplus.config.Permissions;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.Plugin;
/**
* Central location to listen to events that are
@ -86,6 +89,46 @@ public class ChatCheckListener implements Listener, EventManager {
@EventHandler(
priority = EventPriority.LOWEST)
public void commandPreprocess(final PlayerCommandPreprocessEvent event) {
final NoCheatPlusPlayer player = plugin.getPlayer(event.getPlayer());
final ChatConfig cc = ChatCheck.getConfig(player);
// If the command is /plugins or /pl
if ((event.getMessage().equalsIgnoreCase("/plugins")
|| event.getMessage().toLowerCase().startsWith("/plugins ")
|| event.getMessage().equalsIgnoreCase("/pl") || event.getMessage().toLowerCase().startsWith("/pl "))
&& cc.hideNoCheatPlus) {
// If the player isn't allowed to use this command
if (!event.getPlayer().hasPermission("bukkit.command.plugins"))
// Fake the permissions error message
event.getPlayer().sendMessage(
ChatColor.RED + "I'm sorry, but you do not have permission to perform this command. "
+ "Please contact the server administrators if you believe that this is in error.");
else {
// Fake the plugins list
final StringBuilder pluginList = new StringBuilder();
final Plugin[] plugins = Bukkit.getPluginManager().getPlugins();
for (final Plugin plugin : plugins) {
// But make sure to hide NoCheatPlus
if (plugin.getName().equals("NoCheatPlus"))
continue;
if (pluginList.length() > 0) {
pluginList.append(ChatColor.WHITE);
pluginList.append(", ");
}
pluginList.append(plugin.isEnabled() ? ChatColor.GREEN : ChatColor.RED);
pluginList.append(plugin.getDescription().getName());
}
// Of course decrease the number of plugins
event.getPlayer().sendMessage("Plugins (" + (plugins.length - 1) + "): " + pluginList.toString());
}
// Cancel the event, we have already replied to the player
event.setCancelled(true);
}
// This type of event is derived from PlayerChatEvent, therefore
// just treat it like that
chat(event);

View File

@ -17,6 +17,8 @@ import me.neatmonster.nocheatplus.config.Permissions;
*/
public class ChatConfig implements ConfigItem {
public final boolean hideNoCheatPlus;
public final boolean spamCheck;
public final String[] spamWhitelist;
public final long spamTimeframe;
@ -35,6 +37,7 @@ public class ChatConfig implements ConfigItem {
public ChatConfig(final NoCheatPlusConfiguration data) {
hideNoCheatPlus = data.getBoolean(ConfPaths.CHAT_HIDENOCHEATPLUS);
spamCheck = data.getBoolean(ConfPaths.CHAT_SPAM_CHECK);
spamWhitelist = splitWhitelist(data.getString(ConfPaths.CHAT_SPAM_WHITELIST));
spamTimeframe = data.getInt(ConfPaths.CHAT_SPAM_TIMEFRAME) * 1000L;

View File

@ -70,16 +70,22 @@ public class MovingCheckListener implements Listener, EventManager {
final MovingConfig cc = MovingCheck.getConfig(player);
final MovingData data = MovingCheck.getData(player);
final PreciseLocation location = new PreciseLocation();
location.x = bukkitPlayer.getLocation().getX();
location.y = bukkitPlayer.getLocation().getY();
location.z = bukkitPlayer.getLocation().getZ();
final int type = CheckUtil.evaluateLocation(bukkitPlayer.getWorld(), location);
final boolean isLiquid = CheckUtil.isLiquid(type);
// 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,
// if he is in water or in vines.
if (!cc.tracker || cc.allowFlying || bukkitPlayer.getGameMode() == GameMode.CREATIVE
|| bukkitPlayer.getAllowFlight() || bukkitPlayer.hasPermission(Permissions.MOVING_RUNFLY)
|| bukkitPlayer.hasPermission(Permissions.MOVING_FLYING)
|| bukkitPlayer.getLocation().getBlock().getType() == Material.WATER
|| bukkitPlayer.getLocation().getBlock().getType() == Material.STATIONARY_WATER
|| bukkitPlayer.hasPermission(Permissions.MOVING_FLYING) || isLiquid
|| bukkitPlayer.getLocation().getBlock().getType() == Material.LADDER
|| bukkitPlayer.getLocation().getBlock().getType() == Material.VINE) {
|| bukkitPlayer.getLocation().getBlock().getType() == Material.VINE
|| bukkitPlayer.getLocation().getX() < 0D) {
data.fallingSince = 0;
continue;
}

View File

@ -130,6 +130,8 @@ public abstract class ConfPaths {
private final static String CHAT = CHECKS + "chat.";
public final static String CHAT_HIDENOCHEATPLUS = CHAT + "hidenocheatplus";
private final static String CHAT_COLOR = CHAT + "color.";
public final static String CHAT_COLOR_CHECK = CHAT_COLOR + "active";
public final static String CHAT_COLOR_ACTIONS = CHAT_COLOR + "actions";

View File

@ -115,6 +115,8 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
/*** CHAT ***/
set(ConfPaths.CHAT_HIDENOCHEATPLUS, true);
set(ConfPaths.CHAT_COLOR_CHECK, true);
set(ConfPaths.CHAT_COLOR_ACTIONS, "log:color:0:1:if cancel");