+ Introduced the Unpushable check

= Changed the FastPlace's default settings
= Fixed some issues with commands
This commit is contained in:
NeatMonster 2012-04-18 20:33:07 +02:00
parent 44f4da5080
commit 4a3d4d4cac
13 changed files with 253 additions and 129 deletions

View File

@ -152,6 +152,10 @@
In combination with "nocheatplus.admin.commands", the player gets access to the
"/nocheatplus reload" command, which will cause NoCheatPlus to reread its config
files.
- nocheatplus.admin.plugins
Give this permissions to the players you want to be able to see the plugins your
server is using.
--------------------------------------------------------------------------------
@ -205,6 +209,13 @@
normally possible. Doing more movements will result in faster overall movement
speed and causes the server to spent a lot of additional time for processing
these movements.
- nocheatplus.checks.moving.waterwalk
Allows players to walk on water (by using a griefing client). This functionality
is also called Jesus mode.
- nocheatplus.checks.moving.unpushable
Allows players to be unpushable (they can't be pushed by an other player).
- nocheatplus.checks.moving.boatonground
Allows players to place boats on the ground (and not only on the water).
@ -482,6 +493,12 @@
opbyconsoleonly:
Only allow the commands /op and /deop to be executed by the console.
protectplugins:
Don't not allow your players to access the /plugins, /pl, /? commands by
default. Of course, the players having the explicit permisssion to use them
won't be blocked.
--------------------------------------------------------------------------------
@ -742,7 +759,7 @@
active:
Should players be checked for this kind of cheating. If you are not
interested in players that cheat that way, set this to false. It is a
good idea to have this active, because player won't be able to cross
good idea to have this active, because players won't be able to cross
easily the oceans.
actions:
@ -752,6 +769,17 @@
the distance between the player and the surface or how far away he is from
the normal position if a player climbing a block. The VL increases with
every failed check and slowly decreases for every passed check.
5) UNPUSHABLE:
This check is designed to prevent players from being unpushable. It'll handle
"pushs" server-side instead of letting the client calculates them for the server.
active:
Should players be checked for this kind of cheating. If you are not
interested in players that cheat that way, set this to false. It is a
good idea to have this active, because players won't be able to stay on
a block and to do not fall when pushed by other players.
---------------------------- BLOCKBREAK Subsection -----------------------------
@ -946,117 +974,117 @@
The instructions for this check comes directly from NoPwnage's instructions
file. You can find the project at http://dev.bukkit.org/server-mods/nopwnage/.
warnPlayers:
Should a player that reaches the "warnLevel" get a text message telling
him that he is under suspicion of being a bot.
warnPlayers:
Should a player that reaches the "warnLevel" get a text message telling
him that he is under suspicion of being a bot.
warnOthers:
Should all players get warned when a player gets banned for spambot-like
activity?
warnOthers:
Should all players get warned when a player gets banned for spambot-like
activity?
warnLevel:
How much suspicion must a message earn to issue a warning for the player
warnLevel:
How much suspicion must a message earn to issue a warning for the player
warnTimeout:
After what time (in ms) should a player be considered "unwarned" again.
warnTimeout:
After what time (in ms) should a player be considered "unwarned" again.
banLevel:
How much suspicion must a message earn to execute the "commands" (usually
ban the player). If warnings for players are enabled and the player hasn't
been warned yet, he'll get warned instead.
banLevel:
How much suspicion must a message earn to execute the "commands" (usually
ban the player). If warnings for players are enabled and the player hasn't
been warned yet, he'll get warned instead.
move.enabled:
move.weightbonus:
move.weightmalus:
move.timeout:
NoPwnage will check if a player moved within the "timeout" timeframe. If
he did move, the suspicion will be reduced by the "weightbonus" value. If
he did not move, the suspicion will be increased by "weightmalus" value.
Only used if "enabled".
move.enabled:
move.weightbonus:
move.weightmalus:
move.timeout:
NoPwnage will check if a player moved within the "timeout" timeframe. If
he did move, the suspicion will be reduced by the "weightbonus" value. If
he did not move, the suspicion will be increased by "weightmalus" value.
Only used if "enabled".
messageRepeat.enabled:
messageRepeat.weight:
messageRepeat.timeout:
NoPwnage will check if a player repeats his messages within the "timeout"
timeframe. Even if the message is a bit different, it will be counted as
being a repetition. The suspicion is increased by "weight" and for each
additional repetition by "weight/2". This means that multiple repetitions
will increase suspicion, but not as much as the first repetition.
Only used if "enabled".
messageRepeat.enabled:
messageRepeat.weight:
messageRepeat.timeout:
NoPwnage will check if a player repeats his messages within the "timeout"
timeframe. Even if the message is a bit different, it will be counted as
being a repetition. The suspicion is increased by "weight" and for each
additional repetition by "weight/2". This means that multiple repetitions
will increase suspicion, but not as much as the first repetition.
Only used if "enabled".
messageSpeed.enabled:
messageSpeed.weight:
messageSpeed.timeout:
NoPwnage will check if a player sends messages too fast. If a message is
sent within "timout" ms after the previous message, increase suspicion by
"weight". For each additional message that is sent within "timeout",
the suspicion is increased by "weight/2". This means that multiple
too fast sent messages in a row will increase suspicion, but not as much as
the first.
Only used if "enabled".
messageSpeed.enabled:
messageSpeed.weight:
messageSpeed.timeout:
NoPwnage will check if a player sends messages too fast. If a message is
sent within "timout" ms after the previous message, increase suspicion by
"weight". For each additional message that is sent within "timeout",
the suspicion is increased by "weight/2". This means that multiple
too fast sent messages in a row will increase suspicion, but not as much as
the first.
Only used if "enabled".
messageFirst.enabled:
messageFirst.weight:
messageFirst.timeout:
NoPwnage will check if a player sends his first message within "timeout"
ms after his login. If he does, increase supspicion by "weight".
Only used if "enabled".
messageFirst.enabled:
messageFirst.weight:
messageFirst.timeout:
NoPwnage will check if a player sends his first message within "timeout"
ms after his login. If he does, increase supspicion by "weight".
Only used if "enabled".
globalMessageRepeat.enabled:
globalMessageRepeat.weight:
globalMessageRepeat.timeout:
NoPwnage will check if a player repeats a message that has been sent by
another player just before, within "timeout". If he does, suspicion will
be increased by "weight" and for each additional repetition by "weight/2",
independent of by which player. This means that multiple repetitions will
increase suspicion, but not as much as the first repetition.
Only used if "enabled".
globalMessageRepeat.enabled:
globalMessageRepeat.weight:
globalMessageRepeat.timeout:
NoPwnage will check if a player repeats a message that has been sent by
another player just before, within "timeout". If he does, suspicion will
be increased by "weight" and for each additional repetition by "weight/2",
independent of by which player. This means that multiple repetitions will
increase suspicion, but not as much as the first repetition.
Only used if "enabled".
bannedMessageRepeat.enabled:
bannedMessageRepeat.weight:
bannedMessageRepeat.timeout:
NoPwnage will remember the last message that caused someone to get banned.
If a player repeats that message within "timeout" ms, the suspicion will
be increased by "weight".
Only used if "enabled".
bannedMessageRepeat.enabled:
bannedMessageRepeat.weight:
bannedMessageRepeat.timeout:
NoPwnage will remember the last message that caused someone to get banned.
If a player repeats that message within "timeout" ms, the suspicion will
be increased by "weight".
Only used if "enabled".
relog.enabled:
relog.time:
relog.warnings:
relog.timeout:
NoPwnage will remember the time when a player leaves the server. If he
returns within "time" ms, he will get warned. If he has been warned
"warnings" times already, the "commands" will be executed for him. Warnings
get removed if the time of the last warning was more than "timeout" ms ago.
relog.enabled:
relog.time:
relog.warnings:
relog.timeout:
NoPwnage will remember the time when a player leaves the server. If he
returns within "time" ms, he will get warned. If he has been warned
"warnings" times already, the "commands" will be executed for him. Warnings
get removed if the time of the last warning was more than "timeout" ms ago.
actions:
NoPwnage allows you to decide what should happen when a player reaches
"banLevel" or relogged too fast. The default is to kick him and ban IP and
name. You'll also get a log message to console stating how exactly he
reached the "banLevel" (how much suspicion was added by each check).
actions:
NoPwnage allows you to decide what should happen when a player reaches
"banLevel" or relogged too fast. The default is to kick him and ban IP and
name. You'll also get a log message to console stating how exactly he
reached the "banLevel" (how much suspicion was added by each check).
Commands have to be seperated by ";" and the "[player]" and "[ip]"
wildcards will be replaced by the actual data during execution.
Commands have to be seperated by ";" and the "[player]" and "[ip]"
wildcards will be replaced by the actual data during execution.
captcha.enabled:
Should players that get to "banlevel" be presented with a captcha first
instead of running the commands immediatly?
captcha.enabled:
Should players that get to "banlevel" be presented with a captcha first
instead of running the commands immediatly?
captcha.question:
How should the question be worded. Use & to create colors. The text
[captcha] will be replaced with the actual captcha.
captcha.question:
How should the question be worded. Use & to create colors. The text
[captcha] will be replaced with the actual captcha.
tries:
How many attempts will a player have to give the correct answer. A failed
attempt will display the question again. Be generous here, as players may
not be fast enough to read the question the first few times or be otherwise
distracted.
tries:
How many attempts will a player have to give the correct answer. A failed
attempt will display the question again. Be generous here, as players may
not be fast enough to read the question the first few times or be otherwise
distracted.
length:
How many characters should the captcha have.
length:
How many characters should the captcha have.
characters:
The characters for the captcha are randomly drawn from this string
characters:
The characters for the captcha are randomly drawn from this string
2) ARRIVALSLIMIT:

View File

@ -28,9 +28,11 @@ permissions:
nocheatplus.admin.chatlog:
description: Player can see NoCheatPlus' log messages in the ingame chat
nocheatplus.admin.commands:
description: allow use of the "nocheatplus" commands (may be given to players to allow them to check statistics)
description: Allow use of the "nocheatplus" commands (may be given to players to allow them to check statistics)
nocheatplus.admin.reload:
description: allow access to the special "nocheatplus reload" command (only intended for the actual server administrator)
description: Allow access to the special "nocheatplus reload" command (only intended for the actual server administrator)
nocheatplus.admin.plugins:
description: Allow the player to see the plugins installed on the server
nocheatplus.checks:
description: Allow the player to bypass all checks
children:
@ -51,6 +53,10 @@ permissions:
description: Allow a player to send more move-event-packets than normal, causing him to move faster than normal
nocheatplus.checks.moving.morepacketsvehicle:
description: Allow a player to send more vehicule-move-event-packets than normal, causing him to move faster than normal
nocheatplus.checks.moving.waterwalk:
description: Allow a player to walk on the water
nocheatplus.checks.moving.unpushable:
description: Allow a player to be unpushable by the other players
nocheatplus.checks.moving.boatonground:
description: Allow a player to place a boat on the ground (not only on the water)
nocheatplus.checks.moving.respawntrick:

View File

@ -4,7 +4,7 @@
<!-- Informations -->
<name>NoCheatPlus</name>
<version>3.5.7</version>
<version>3.5.7_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

@ -33,15 +33,17 @@ public class FastBreakCheck extends BlockBreakCheck {
// Has the player broken the blocks too quickly
if (data.lastBreakTime != 0 && elapsedTime < breakTime) {
if (data.previousRefused) {
// He failed, increase vl and statistics
data.fastBreakVL += breakTime - elapsedTime;
incrementStatistics(player, Id.BB_FASTBREAK, breakTime - elapsedTime);
// Execute whatever actions are associated with this check and the
// violation level and find out if we should cancel the event
cancel = executeActions(player, cc.fastBreakActions, data.fastBreakVL);
if (!plugin.skipCheck()) {
if (data.previousRefused) {
// He failed, increase vl and statistics
data.fastBreakVL += breakTime - elapsedTime;
incrementStatistics(player, Id.BB_FASTBREAK, breakTime - elapsedTime);
// Execute whatever actions are associated with this check and the
// violation level and find out if we should cancel the event
cancel = executeActions(player, cc.fastBreakActions, data.fastBreakVL);
}
data.previousRefused = true;
}
data.previousRefused = true;
} else {
// Reward with lowering of the violation level
data.fastBreakVL *= 0.90D;

View File

@ -23,17 +23,19 @@ public class FastPlaceCheck extends BlockPlaceCheck {
// Has the player placed blocks too quickly
if (data.lastPlaceTime != 0 && System.currentTimeMillis() - data.lastPlaceTime < cc.fastPlaceInterval) {
if (data.previousRefused) {
// He failed, increase vl and statistics
data.fastPlaceVL += cc.fastPlaceInterval - System.currentTimeMillis() + data.lastPlaceTime;
incrementStatistics(player, Id.BP_FASTPLACE, cc.fastPlaceInterval - System.currentTimeMillis()
+ data.lastPlaceTime);
if (!plugin.skipCheck()) {
if (data.previousRefused) {
// He failed, increase vl and statistics
data.fastPlaceVL += cc.fastPlaceInterval - System.currentTimeMillis() + data.lastPlaceTime;
incrementStatistics(player, Id.BP_FASTPLACE, cc.fastPlaceInterval - System.currentTimeMillis()
+ data.lastPlaceTime);
// Execute whatever actions are associated with this check and the
// violation level and find out if we should cancel the event
cancel = executeActions(player, cc.fastPlaceActions, data.fastPlaceVL);
// Execute whatever actions are associated with this check and the
// violation level and find out if we should cancel the event
cancel = executeActions(player, cc.fastPlaceActions, data.fastPlaceVL);
}
data.previousRefused = true;
}
data.previousRefused = true;
} else {
// Reward with lowering of the violation level
data.fastPlaceVL *= 0.90D;

View File

@ -7,7 +7,6 @@ import java.util.List;
import me.neatmonster.nocheatplus.EventManager;
import me.neatmonster.nocheatplus.NoCheatPlus;
import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.config.ConfPaths;
import me.neatmonster.nocheatplus.config.ConfigurationCacheStore;
import me.neatmonster.nocheatplus.config.Permissions;
@ -99,14 +98,29 @@ public class ChatCheckListener implements Listener, EventManager {
priority = EventPriority.LOWEST)
public void commandPreprocess(final PlayerCommandPreprocessEvent event) {
final NoCheatPlusPlayer player = plugin.getPlayer(event.getPlayer());
final ChatConfig cc = ChatCheck.getConfig(player);
final String command = event.getMessage().split(" ")[0].substring(1).toLowerCase();
// Protect the /plugins, /pl, /? commands to prevent players for seeing which plugins are installed
if (cc.protectPlugins && (command.equals("plugins") || command.equals("pl") || command.equals("?"))
&& !event.getPlayer().hasPermission(Permissions.ADMIN_PLUGINS)) {
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.");
event.setCancelled(true);
return;
}
// If OP by console only is enabled, prevent the op/deop commands
// to be used by a player who is OP or has the required permissions
if (plugin.getConfig(event.getPlayer()).getConfiguration().getBoolean(ConfPaths.MISCELLANEOUS_OPBYCONSOLEONLY)
&& (event.getMessage().startsWith("/op")
&& (event.getPlayer().isOp() || event.getPlayer().hasPermission("bukkit.command.op.give")) || event
.getMessage().startsWith("/deop")
if (cc.opByConsoleOnly
&& (command.equals("op")
&& (event.getPlayer().isOp() || event.getPlayer().hasPermission("bukkit.command.op.give")) || command
.equals("deop")
&& (event.getPlayer().isOp() || event.getPlayer().hasPermission("bukkit.command.op.take")))) {
event.getPlayer().sendMessage(ChatColor.RED + "This command can be executed from the console!");
event.getPlayer().sendMessage(ChatColor.RED + "This command can only be executed from the console!");
event.setCancelled(true);
return;
}

View File

@ -14,7 +14,8 @@ import me.neatmonster.nocheatplus.config.Permissions;
*/
public class ChatConfig implements ConfigItem {
public final boolean hideCommands;
public final boolean opByConsoleOnly;
public final boolean protectPlugins;
public final boolean noPwnageCheck;
public final boolean noPwnageWarnPlayers;
@ -72,7 +73,8 @@ public class ChatConfig implements ConfigItem {
public ChatConfig(final NoCheatPlusConfiguration data) {
hideCommands = data.getBoolean(ConfPaths.CHAT_HIDECOMMANDS);
opByConsoleOnly = data.getBoolean(ConfPaths.MISCELLANEOUS_OPBYCONSOLEONLY);
protectPlugins = data.getBoolean(ConfPaths.MISCELLANEOUS_PROTECTPLUGINS);
noPwnageCheck = data.getBoolean(ConfPaths.CHAT_NOPWNAGE_CHECK);
noPwnageWarnPlayers = data.getBoolean(ConfPaths.CHAT_NOPWNAGE_WARNPLAYERS);

View File

@ -10,10 +10,13 @@ import me.neatmonster.nocheatplus.checks.CheckUtil;
import me.neatmonster.nocheatplus.config.ConfigurationCacheStore;
import me.neatmonster.nocheatplus.config.Permissions;
import me.neatmonster.nocheatplus.data.PreciseLocation;
import net.minecraft.server.Entity;
import net.minecraft.server.EntityLiving;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -133,6 +136,43 @@ public class MovingCheckListener implements Listener, EventManager {
event.setCancelled(true);
}
private PreciseLocation collide(final PreciseLocation to, final Player collider, final Player collided) {
// Calculate some distances
double moveX = collider.getLocation().getX() - collided.getLocation().getX();
double moveZ = collider.getLocation().getZ() - collided.getLocation().getZ();
double move = Math.max(Math.abs(moveX), Math.abs(moveZ));
// If the two players are close enough
if (move >= 0.009999999776482582D) {
// Calculate the move
move = Math.sqrt(move);
moveX /= move;
moveZ /= move;
double moveInv = 1D / move;
if (moveInv > 1D)
moveInv = 1D;
// More magic numbers...
moveX *= moveInv * 0.05000000074505806D;
moveZ *= moveInv * 0.05000000074505806D;
// Teleport the collided player to his new location
// if he hasn't the required permission
if (!collided.hasPermission(Permissions.MOVING_UNPUSHABLE))
collided.teleport(collided.getLocation().add(-moveX, 0, -moveZ));
// Same for the collider, check his permissions
to.x = to.x + moveX;
to.z = to.z + moveZ;
if (!collider.hasPermission(Permissions.MOVING_UNPUSHABLE))
return to;
}
return null;
}
@Override
public List<String> getActiveChecks(final ConfigurationCacheStore cc) {
final LinkedList<String> s = new LinkedList<String>();
@ -260,6 +300,27 @@ public class MovingCheckListener implements Listener, EventManager {
else if (newTo == null)
newTo = morePacketsCheck.check(player, data, cc);
/** UNPUSHABLE CHECK SECTION **/
if (newTo == null && cc.unpushableCheck) {
final EntityLiving entity = ((CraftPlayer) event.getPlayer()).getHandle();
// List of the entities the player is colliding with
final List<?> collisions = entity.world.getEntities(entity,
entity.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D));
for (int i = 0; i < collisions.size(); i++) {
final Entity collidedEntity = (Entity) collisions.get(i);
// Check if the entity is a player
if (collidedEntity.getBukkitEntity() instanceof Player) {
final Player collidedPlayer = (Player) collidedEntity.getBukkitEntity();
// Collide the two players
newTo = collide(data.to, event.getPlayer(), collidedPlayer);
}
}
}
// Did one of the check(s) decide we need a new "to"-location?
if (newTo != null) {
// Compose a new location based on coordinates of "newTo" and

View File

@ -43,6 +43,8 @@ public class MovingConfig implements ConfigItem {
public final boolean waterWalkCheck;
public final ActionList waterWalkActions;
public final boolean unpushableCheck;
public final int flyingHeightLimit;
public MovingConfig(final NoCheatPlusConfiguration data) {
@ -85,5 +87,7 @@ public class MovingConfig implements ConfigItem {
waterWalkCheck = data.getBoolean(ConfPaths.MOVING_WATERWALK_CHECK);
waterWalkActions = data.getActionList(ConfPaths.MOVING_WATERWALK_ACTIONS, Permissions.MOVING_WATERWALK);
unpushableCheck = data.getBoolean(ConfPaths.MOVING_UNPUSHABLE_CHECK);
}
}

View File

@ -71,7 +71,7 @@ public class CommandHandler {
final ChatConfig cc = ChatCheck.getConfig(player);
// Hide NoCheatPlus's commands if the player doesn't have the required permission
if (cc.hideCommands && !sender.hasPermission("nocheatplus.admin.commands")) {
if (cc.protectPlugins && !sender.hasPermission("nocheatplus.admin.commands")) {
sender.sendMessage("Unknown command. Type \"help\" for help.");
return true;
}

View File

@ -21,6 +21,7 @@ public abstract class ConfPaths {
private static final String MISCELLANEOUS = "miscellaneous.";
public static final String MISCELLANEOUS_ALLOWCLIENTMODS = MISCELLANEOUS + "allowclientmods";
public static final String MISCELLANEOUS_OPBYCONSOLEONLY = MISCELLANEOUS + "opbyconsoleonly";
public static final String MISCELLANEOUS_PROTECTPLUGINS = MISCELLANEOUS + "protectplugins";
private static final String CHECKS = "checks.";
@ -82,6 +83,9 @@ public abstract class ConfPaths {
public static final String MOVING_WATERWALK_CHECK = MOVING_WATERWALK + "active";
public static final String MOVING_WATERWALK_ACTIONS = MOVING_WATERWALK + "actions";
private static final String MOVING_UNPUSHABLE = MOVING + "unpushable.";
public static final String MOVING_UNPUSHABLE_CHECK = MOVING_UNPUSHABLE + "active";
private static final String BLOCKBREAK = CHECKS + "blockbreak.";
private static final String BLOCKBREAK_FASTBREAK = BLOCKBREAK + "fastbreak.";
@ -128,8 +132,6 @@ public abstract class ConfPaths {
private static final String CHAT = CHECKS + "chat.";
public static final String CHAT_HIDECOMMANDS = CHAT + "hidecommands";
private static final String CHAT_NOPWNAGE = CHAT + "nopwnage.";
public static final String CHAT_NOPWNAGE_CHECK = CHAT_NOPWNAGE + "active";
public static final String CHAT_NOPWNAGE_WARNPLAYERS = CHAT_NOPWNAGE + "warnplayers";

View File

@ -29,6 +29,7 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
set(ConfPaths.MISCELLANEOUS_ALLOWCLIENTMODS, false);
set(ConfPaths.MISCELLANEOUS_OPBYCONSOLEONLY, true);
set(ConfPaths.MISCELLANEOUS_PROTECTPLUGINS, true);
/*** INVENTORY ***/
@ -73,6 +74,8 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
set(ConfPaths.MOVING_WATERWALK_ACTIONS,
"log:waterwalk:3:5:f cancel vl>100 log:waterwalk:0:5:if cancel vl>400 log:waterwalk:0:5:cif cancel");
set(ConfPaths.MOVING_UNPUSHABLE_CHECK, true);
/*** BLOCKBREAK ***/
set(ConfPaths.BLOCKBREAK_FASTBREAK_CHECK, true);
@ -95,7 +98,7 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
/*** BLOCKPLACE ***/
set(ConfPaths.BLOCKPLACE_FASTPLACE_CHECK, true);
set(ConfPaths.BLOCKPLACE_FASTPLACE_INTERVAL, 145);
set(ConfPaths.BLOCKPLACE_FASTPLACE_INTERVAL, 95);
set(ConfPaths.BLOCKPLACE_FASTPLACE_ACTIONS,
"cancel vl>100 log:bpfastplace:3:5:cif cancel vl>2000 log:bpfastplace:3:5:cif cmd:kick cancel");
@ -114,8 +117,6 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
/*** CHAT ***/
set(ConfPaths.CHAT_HIDECOMMANDS, false);
set(ConfPaths.CHAT_NOPWNAGE_CHECK, true);
set(ConfPaths.CHAT_NOPWNAGE_WARNPLAYERS, false);
set(ConfPaths.CHAT_NOPWNAGE_WARNOTHERS, false);

View File

@ -15,6 +15,7 @@ public class Permissions {
public static final String ADMIN_CHATLOG = ADMIN + ".chatlog";
public static final String ADMIN_COMMANDS = ADMIN + ".commands";
public static final String ADMIN_RELOAD = ADMIN + ".reload";
public static final String ADMIN_PLUGINS = ADMIN + ".plugins";
/** CHECKS **/
private static final String BLOCKBREAK = CHECKS + ".blockbreak";
@ -57,9 +58,10 @@ public class Permissions {
public static final String MOVING_NOFALL = MOVING + ".nofall";
public static final String MOVING_MOREPACKETS = MOVING + ".morepackets";
public static final String MOVING_MOREPACKETSVEHICLE = MOVING + ".morepacketsvehicle";
public static final String MOVING_BOATONGROUND = MOVING + ".boatonground";
public static final String MOVING_WATERWALK = MOVING + ".waterwalk";
public static final String MOVING_UNPUSHABLE = MOVING + ".unpushable";
public static final String MOVING_RESPAWNTRICK = MOVING + ".respawntrick";
public static final String MOVING_BOATONGROUND = MOVING + ".boatonground";
/** MODS **/
private static final String CJB = MODS + ".cjb";