diff --git a/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java b/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java index 31c1e3df..0947ef03 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java +++ b/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java @@ -59,10 +59,10 @@ public class NoCheat extends JavaPlugin implements CommandSender { private long serverLagInMilliSeconds = 0; private long lastServerTime = 0; - // Permissions 2.x, if available + // Permissions, if available private PermissionHandler permissions; - // CraftIRC 2.x, if available + // CraftIRC, if available private CraftIRC irc; private boolean allowFlightSet; @@ -260,7 +260,7 @@ public class NoCheat extends JavaPlugin implements CommandSender { private void logToChat(Level l, String message) { if(chatLevel.intValue() <= l.intValue()) { for(Player player : getServer().getOnlinePlayers()) { - if(hasPermission(player, PermissionData.PERMISSION_NOTIFY)) { + if(hasPermission(player, PermissionData.PERMISSION_NOTIFY, false)) { player.sendMessage("["+l.getName()+"] " + message); } } @@ -280,13 +280,19 @@ public class NoCheat extends JavaPlugin implements CommandSender { } - public boolean hasPermission(Player player, int permission) { + public boolean hasPermission(Player player, int permission, boolean checkOPs) { if(player == null) return false; try { - if(permissions == null) - return player.isOp(); + if(permissions == null) { + if(checkOPs) { + return true; + } + else { + return player.isOp(); + } + } else { PermissionData data = PermissionData.get(player); long time = System.currentTimeMillis(); @@ -375,11 +381,11 @@ public class NoCheat extends JavaPlugin implements CommandSender { s = s + (!c.isActive() ? c.getName() + "* " : (c.skipCheck(p) ? c.getName() + " " : "")); } - s = s + (!movingCheck.isActive() || movingCheck.allowFlying ? "flying* " : (hasPermission(p, PermissionData.PERMISSION_FLYING) ? "flying " : "")); - s = s + (!movingCheck.isActive() || movingCheck.allowFakeSneak ? "fakesneak* " : (hasPermission(p, PermissionData.PERMISSION_FAKESNEAK) ? "fakesneak " : "")); - s = s + (!movingCheck.isActive() || movingCheck.allowFastSwim ? "fastswim* " : (hasPermission(p, PermissionData.PERMISSION_FASTSWIM) ? "fastswim " : "")); + s = s + (!movingCheck.isActive() || movingCheck.allowFlying ? "flying* " : (hasPermission(p, PermissionData.PERMISSION_FLYING, movingCheck.checkOPs) ? "flying " : "")); + s = s + (!movingCheck.isActive() || movingCheck.allowFakeSneak ? "fakesneak* " : (hasPermission(p, PermissionData.PERMISSION_FAKESNEAK, movingCheck.checkOPs) ? "fakesneak " : "")); + s = s + (!movingCheck.isActive() || movingCheck.allowFastSwim ? "fastswim* " : (hasPermission(p, PermissionData.PERMISSION_FASTSWIM, movingCheck.checkOPs) ? "fastswim " : "")); - s = s + (hasPermission(p, PermissionData.PERMISSION_NOTIFY) ? "notify " : ""); + s = s + (hasPermission(p, PermissionData.PERMISSION_NOTIFY, false) ? "notify " : ""); return s; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java b/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java index 1156e3c7..2218b2ca 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java @@ -3,6 +3,7 @@ package cc.co.evenprime.bukkit.nocheat.checks; import org.bukkit.entity.Player; +import cc.co.evenprime.bukkit.nocheat.ConfigurationException; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration; @@ -18,18 +19,27 @@ public abstract class Check { private int permission; private String name; protected NoCheat plugin; + + // Should OPs be checked if Permissions plugin is not available? + protected boolean checkOPs = false; protected Check(NoCheat plugin, String name, int permission, NoCheatConfiguration config) { this.plugin = plugin; this.permission = permission; this.name = name; + try { + checkOPs = config.getBooleanValue(name + ".checkops"); + } catch (ConfigurationException e) { + checkOPs = false; + } + configure(config); } public boolean skipCheck(Player player) { // Should we check at all? - return !active || plugin.hasPermission(player, permission); + return !active || plugin.hasPermission(player, permission, checkOPs); } protected abstract void configure(NoCheatConfiguration config); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java index f6dff22b..739192e2 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java @@ -62,7 +62,7 @@ public class MovingCheck extends Check { public boolean allowFlying; public boolean allowFakeSneak; public boolean allowFastSwim; - + public boolean checkOPs; private boolean waterElevators; @@ -74,6 +74,10 @@ public class MovingCheck extends Check { public long statisticTotalEvents = 1; // Prevent accidental division by 0 at some point + private boolean enforceTeleport; + + + private static final double magic = 0.30000001192092896D; private static final double magic2 = 0.69999998807907103D; @@ -101,15 +105,13 @@ public class MovingCheck extends Check { // Get the two locations of the event final Location to = event.getTo(); - // the from location of the event may be different from the location the player - // actually was - choose appropriately - Location from = data.teleportTo != null ? data.teleportTo : event.getFrom(); - data.teleportTo = null; - + // use our self-defined from-location, instead of the one from the event + Location from = data.lastLocation; updateVelocity(player.getVelocity(), data); - if(shouldBeIgnored(player, data, from, to)) { + // event.getFrom() is intentional here + if(shouldBeIgnored(player, data, event.getFrom(), to)) { statisticElapsedTimeNano += System.nanoTime() - startTime; statisticTotalEvents++; return; @@ -180,7 +182,7 @@ public class MovingCheck extends Check { { final Location l; - final boolean canFly = allowFlying || plugin.hasPermission(player, PermissionData.PERMISSION_FLYING); + final boolean canFly = allowFlying || plugin.hasPermission(player, PermissionData.PERMISSION_FLYING, checkOPs); if(data.setBackPoint == null || canFly) l = from; @@ -257,7 +259,7 @@ public class MovingCheck extends Check { int violationLevelSneaking = -1; // Maybe the player is allowed to sneak faster than usual? - final boolean canFakeSneak = allowFakeSneak || plugin.hasPermission(player, PermissionData.PERMISSION_FAKESNEAK); + final boolean canFakeSneak = allowFakeSneak || plugin.hasPermission(player, PermissionData.PERMISSION_FAKESNEAK, checkOPs); if(!canFakeSneak) { @@ -297,7 +299,7 @@ public class MovingCheck extends Check { int violationLevelSwimming = -1; // Maybe the player is allowed to swim faster than usual? - final boolean canFastSwim = allowFastSwim || plugin.hasPermission(player, PermissionData.PERMISSION_FASTSWIM); + final boolean canFastSwim = allowFastSwim || plugin.hasPermission(player, PermissionData.PERMISSION_FASTSWIM, checkOPs); if(!canFastSwim) { @@ -454,14 +456,20 @@ public class MovingCheck extends Check { if(data.respawned) data.respawned = false; + // We can enforce a teleport, if that flag is explicitly set + if(event.isCancelled() && enforceTeleport && event.getTo().equals(data.teleportTo)) { + event.setCancelled(false); + } + if(!event.isCancelled()) { data.lastLocation = event.getTo(); - data.teleportTo = event.getTo(); data.jumpPhase = 0; data.setBackPoint = event.getTo(); data.worldChanged = !event.getFrom().getWorld().getName().equals(event.getTo().getWorld().getName()); } + + data.teleportTo = null; } /** @@ -567,6 +575,7 @@ public class MovingCheck extends Check { Location t = new Location(data.setBackPoint.getWorld(), data.setBackPoint.getX(), y, data.setBackPoint.getZ(), event.getTo().getYaw(), event.getTo().getPitch()); + data.teleportTo = t; // Only reset player and cancel event if teleport is successful if(event.getPlayer().teleport(t)) { @@ -576,6 +585,8 @@ public class MovingCheck extends Check { event.setCancelled(true); } + + data.teleportTo = null; } @@ -721,6 +732,9 @@ public class MovingCheck extends Check { actions[2] = config.getActionValue("moving.action.high"); setActive(config.getBooleanValue("active.moving")); + + enforceTeleport = config.getBooleanValue("moving.enforceteleport"); + } catch (ConfigurationException e) { setActive(false); e.printStackTrace(); diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/BooleanOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/BooleanOption.java index 5d709c61..e160331b 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/BooleanOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/BooleanOption.java @@ -10,9 +10,9 @@ public class BooleanOption extends ChildOption { private boolean value; - public BooleanOption(String name, boolean initialValue) { + public BooleanOption(String name, String parentName, boolean initialValue) { - super(name); + super(name, parentName); this.value = initialValue; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/ChildOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/ChildOption.java index 9d04c007..aa876a17 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/ChildOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/ChildOption.java @@ -7,9 +7,9 @@ public abstract class ChildOption extends Option { */ private static final long serialVersionUID = -4648294833934457776L; - public ChildOption(String identifier) { + public ChildOption(String identifier, String parentIdentifier) { - super(identifier); + super(identifier, parentIdentifier); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/CustomActionOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/CustomActionOption.java index 0f4afdc9..447eaadc 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/CustomActionOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/CustomActionOption.java @@ -9,9 +9,9 @@ public class CustomActionOption extends ChildOption { private String command; - public CustomActionOption(String identifier, String command) { + public CustomActionOption(String identifier, String parentName, String command) { - super(identifier); + super(identifier, parentName); this.parseCommand(command); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/IntegerOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/IntegerOption.java index 27f88eeb..41625189 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/IntegerOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/IntegerOption.java @@ -8,9 +8,9 @@ public class IntegerOption extends TextFieldOption { */ private static final long serialVersionUID = 2258827414736580449L; - public IntegerOption(String name, int initialValue) { + public IntegerOption(String name, String parentName, int initialValue) { - super(name, String.valueOf(initialValue), 5); + super(name, parentName, String.valueOf(initialValue), 5); } @Override diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/LevelOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/LevelOption.java index 771ba0a7..cdf03896 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/LevelOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/LevelOption.java @@ -56,9 +56,9 @@ public class LevelOption extends ChildOption { } } - public LevelOption(String identifier, LogLevel initialValue) { + public LevelOption(String identifier, String parentName, LogLevel initialValue) { - super(identifier); + super(identifier, parentName); this.option = initialValue; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/LongStringOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/LongStringOption.java index 4254ca75..c2c69094 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/LongStringOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/LongStringOption.java @@ -7,7 +7,7 @@ public class LongStringOption extends TextFieldOption { */ private static final long serialVersionUID = 2258827414736580449L; - public LongStringOption(String name, String initialValue) { - super(name, initialValue, 60); + public LongStringOption(String name, String parentName, String initialValue) { + super(name, parentName, initialValue, 60); } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/MediumStringOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/MediumStringOption.java index 6c57029f..8ac1c9c2 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/MediumStringOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/MediumStringOption.java @@ -7,7 +7,7 @@ public class MediumStringOption extends TextFieldOption { */ private static final long serialVersionUID = 2258827414736580449L; - public MediumStringOption(String name, String initialValue) { - super(name, initialValue, 30); + public MediumStringOption(String name, String parentName, String initialValue) { + super(name, parentName, initialValue, 30); } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/NoCheatConfiguration.java b/src/cc/co/evenprime/bukkit/nocheat/config/NoCheatConfiguration.java index 286f738f..38d47f52 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/NoCheatConfiguration.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/NoCheatConfiguration.java @@ -66,176 +66,196 @@ public class NoCheatConfiguration { } - root = new ParentOption("", false); + root = new ParentOption("", "", false); /*** LOGGING section ***/ { - ParentOption loggingNode = new ParentOption("logging", false); + ParentOption loggingNode = new ParentOption("logging", root.getFullIdentifier(), false); root.add(loggingNode); - loggingNode.add(new MediumStringOption("filename", + loggingNode.add(new MediumStringOption("filename", loggingNode.getFullIdentifier(), SimpleYaml.getString("logging.filename", "plugins/NoCheat/nocheat.log", yamlContent))); - loggingNode.add(new LevelOption("logtofile", + loggingNode.add(new LevelOption("logtofile", loggingNode.getFullIdentifier(), LogLevel.getLogLevelFromString(SimpleYaml.getString("logging.logtofile", LogLevel.LOW.asString(), yamlContent)))); - loggingNode.add(new LevelOption("logtoconsole", + loggingNode.add(new LevelOption("logtoconsole", loggingNode.getFullIdentifier(), LogLevel.getLogLevelFromString(SimpleYaml.getString("logging.logtoconsole", LogLevel.HIGH.asString(), yamlContent)))); - loggingNode.add(new LevelOption("logtochat", + loggingNode.add(new LevelOption("logtochat", loggingNode.getFullIdentifier(), LogLevel.getLogLevelFromString(SimpleYaml.getString("logging.logtochat", LogLevel.MED.asString(), yamlContent)))); - loggingNode.add(new LevelOption("logtoirc", + loggingNode.add(new LevelOption("logtoirc", loggingNode.getFullIdentifier(), LogLevel.getLogLevelFromString(SimpleYaml.getString("logging.logtoirc", LogLevel.MED.asString(), yamlContent)))); - loggingNode.add(new ShortStringOption("logtoirctag", + loggingNode.add(new ShortStringOption("logtoirctag", loggingNode.getFullIdentifier(), SimpleYaml.getString("logging.logtoirctag", "nocheat", yamlContent))); } /*** ACTIVE section ***/ { - ParentOption activeNode = new ParentOption("active", false); + ParentOption activeNode = new ParentOption("active", root.getFullIdentifier(), false); root.add(activeNode); - activeNode.add(new BooleanOption("speedhack", + activeNode.add(new BooleanOption("speedhack", activeNode.getFullIdentifier(), SimpleYaml.getBoolean("active.speedhack", true, yamlContent))); - activeNode.add(new BooleanOption("moving", + activeNode.add(new BooleanOption("moving", activeNode.getFullIdentifier(), SimpleYaml.getBoolean("active.moving", true, yamlContent))); - activeNode.add(new BooleanOption("airbuild", + activeNode.add(new BooleanOption("airbuild", activeNode.getFullIdentifier(), SimpleYaml.getBoolean("active.airbuild", false, yamlContent))); - activeNode.add(new BooleanOption("bedteleport", + activeNode.add(new BooleanOption("bedteleport", activeNode.getFullIdentifier(), SimpleYaml.getBoolean("active.bedteleport", true, yamlContent))); - activeNode.add(new BooleanOption("bogusitems", + activeNode.add(new BooleanOption("bogusitems", activeNode.getFullIdentifier(), SimpleYaml.getBoolean("active.bogusitems", false, yamlContent))); } /*** SPEEDHACK section ***/ { - ParentOption speedhackNode = new ParentOption("speedhack", false); + ParentOption speedhackNode = new ParentOption("speedhack", root.getFullIdentifier(), false); root.add(speedhackNode); - speedhackNode.add(new LongStringOption("logmessage", + speedhackNode.add(new LongStringOption("logmessage", speedhackNode.getFullIdentifier(), SimpleYaml.getString("speedhack.logmessage", "[player] sent [events] move events, but only [limit] were allowed. Speedhack?", yamlContent). replace("[player]", "%1$s").replace("[events]", "%2$d").replace("[limit]", "%3$d"))); + speedhackNode.add(new BooleanOption("checkops", speedhackNode.getFullIdentifier(), + SimpleYaml.getBoolean("speedhack.checkops", false, yamlContent))); + /*** SPEEDHACK LIMITS section ***/ { - ParentOption speedhackLimitsNode = new ParentOption("limits", false); + ParentOption speedhackLimitsNode = new ParentOption("limits", speedhackNode.getFullIdentifier(), false); speedhackNode.add(speedhackLimitsNode); - speedhackLimitsNode.add(new IntegerOption("low", + speedhackLimitsNode.add(new IntegerOption("low", speedhackLimitsNode.getFullIdentifier(), SimpleYaml.getInt("speedhack.limits.low", 22, yamlContent))); - speedhackLimitsNode.add(new IntegerOption("med", + speedhackLimitsNode.add(new IntegerOption("med", speedhackLimitsNode.getFullIdentifier(), SimpleYaml.getInt("speedhack.limits.med", 33, yamlContent))); - speedhackLimitsNode.add(new IntegerOption("high", + speedhackLimitsNode.add(new IntegerOption("high", speedhackLimitsNode.getFullIdentifier(), SimpleYaml.getInt("speedhack.limits.high", 44, yamlContent))); } /*** SPEEDHACK ACTIONS section ***/ { - ParentOption speedhackActionNode = new ParentOption("action", false); + ParentOption speedhackActionNode = new ParentOption("action", speedhackNode.getFullIdentifier(), false); speedhackNode.add(speedhackActionNode); - speedhackActionNode.add(new MediumStringOption("low", + speedhackActionNode.add(new MediumStringOption("low", speedhackActionNode.getFullIdentifier(), SimpleYaml.getString("speedhack.action.low", "loglow cancel", yamlContent))); - speedhackActionNode.add(new MediumStringOption("med", + speedhackActionNode.add(new MediumStringOption("med", speedhackActionNode.getFullIdentifier(), SimpleYaml.getString("speedhack.action.med", "logmed cancel", yamlContent))); - speedhackActionNode.add(new MediumStringOption("high", + speedhackActionNode.add(new MediumStringOption("high", speedhackActionNode.getFullIdentifier(), SimpleYaml.getString("speedhack.action.high", "loghigh cancel", yamlContent))); } } /*** MOVING section ***/ { - ParentOption movingNode = new ParentOption("moving", false); + ParentOption movingNode = new ParentOption("moving", root.getFullIdentifier(), false); root.add(movingNode); - movingNode.add(new LongStringOption("logmessage", + movingNode.add(new LongStringOption("logmessage", movingNode.getFullIdentifier(), SimpleYaml.getString("moving.logmessage", "Moving violation: [player] from [world] [from] to [to] distance [distance]", yamlContent). replace("[player]", "%1$s").replace("[world]", "%2$s"). replace("[from]", "(%4$.1f, %5$.1f, %6$.1f)"). replace("[to]", "(%7$.1f, %8$.1f, %9$.1f)"). replace("[distance]", "(%10$.1f, %11$.1f, %12$.1f)"))); - movingNode.add(new LongStringOption("summarymessage", + movingNode.add(new LongStringOption("summarymessage", movingNode.getFullIdentifier(), SimpleYaml.getString("moving.summarymessage", "Moving summary of last ~[timeframe] seconds: [player] total Violations: [violations]", yamlContent). replace("[timeframe]", "%2$d").replace("[player]", "%1$s"). replace("[violations]", "(%3$d,%4$d,%5$d)"))); - movingNode.add(new BooleanOption("allowflying", + movingNode.add(new BooleanOption("allowflying", movingNode.getFullIdentifier(), SimpleYaml.getBoolean("moving.allowflying", false, yamlContent))); - movingNode.add(new BooleanOption("allowfakesneak", + movingNode.add(new BooleanOption("allowfakesneak", movingNode.getFullIdentifier(), SimpleYaml.getBoolean("moving.allowfakesneak", true, yamlContent))); - movingNode.add(new BooleanOption("allowfastswim", + movingNode.add(new BooleanOption("allowfastswim", movingNode.getFullIdentifier(), SimpleYaml.getBoolean("moving.allowfastswim", false, yamlContent))); - movingNode.add(new BooleanOption("waterelevators", + movingNode.add(new BooleanOption("waterelevators", movingNode.getFullIdentifier(), SimpleYaml.getBoolean("moving.waterelevators", false, yamlContent))); + movingNode.add(new BooleanOption("checkops", movingNode.getFullIdentifier(), + SimpleYaml.getBoolean("moving.checkops", false, yamlContent))); + + movingNode.add(new BooleanOption("enforceteleport", movingNode.getFullIdentifier(), + SimpleYaml.getBoolean("moving.enforceteleport", false, yamlContent))); + /*** MOVING ACTION section ***/ { - ParentOption movingActionNode = new ParentOption("action", false); + ParentOption movingActionNode = new ParentOption("action", movingNode.getFullIdentifier(), false); movingNode.add(movingActionNode); - movingActionNode.add(new MediumStringOption("low", + movingActionNode.add(new MediumStringOption("low", movingActionNode.getFullIdentifier(), SimpleYaml.getString("moving.action.low", "loglow cancel", yamlContent))); - movingActionNode.add(new MediumStringOption("med", + movingActionNode.add(new MediumStringOption("med", movingActionNode.getFullIdentifier(), SimpleYaml.getString("moving.action.med", "logmed cancel", yamlContent))); - movingActionNode.add(new MediumStringOption("high", + movingActionNode.add(new MediumStringOption("high", movingActionNode.getFullIdentifier(), SimpleYaml.getString("moving.action.high", "loghigh cancel", yamlContent))); } } /*** AIRBUILD section ***/ { - ParentOption airbuildNode = new ParentOption("airbuild", false); + ParentOption airbuildNode = new ParentOption("airbuild", root.getFullIdentifier(), false); root.add(airbuildNode); + + airbuildNode.add(new BooleanOption("checkops", airbuildNode.getFullIdentifier(), + SimpleYaml.getBoolean("airbuild.checkops", false, yamlContent))); /*** AIRBUILD LIMITS section ***/ { - ParentOption airbuildLimitsNode = new ParentOption("limits", false); + ParentOption airbuildLimitsNode = new ParentOption("limits", airbuildNode.getFullIdentifier(), false); airbuildNode.add(airbuildLimitsNode); - airbuildLimitsNode.add(new IntegerOption("low", + airbuildLimitsNode.add(new IntegerOption("low", airbuildLimitsNode.getFullIdentifier(), SimpleYaml.getInt("airbuild.limits.low", 1, yamlContent))); - airbuildLimitsNode.add(new IntegerOption("med", + airbuildLimitsNode.add(new IntegerOption("med", airbuildLimitsNode.getFullIdentifier(), SimpleYaml.getInt("airbuild.limits.med", 3, yamlContent))); - airbuildLimitsNode.add(new IntegerOption("high", + airbuildLimitsNode.add(new IntegerOption("high", airbuildLimitsNode.getFullIdentifier(), SimpleYaml.getInt("airbuild.limits.high", 10, yamlContent))); } /*** AIRBUILD ACTION section ***/ { - ParentOption airbuildActionNode = new ParentOption("action", false); + ParentOption airbuildActionNode = new ParentOption("action", airbuildNode.getFullIdentifier(), false); airbuildNode.add(airbuildActionNode); - airbuildActionNode.add(new MediumStringOption("low", + airbuildActionNode.add(new MediumStringOption("low", airbuildActionNode.getFullIdentifier(), SimpleYaml.getString("airbuild.action.low", "loglow cancel", yamlContent))); - airbuildActionNode.add(new MediumStringOption("med", + airbuildActionNode.add(new MediumStringOption("med", airbuildActionNode.getFullIdentifier(), SimpleYaml.getString("airbuild.action.med", "logmed cancel", yamlContent))); - airbuildActionNode.add(new MediumStringOption("high", + airbuildActionNode.add(new MediumStringOption("high", airbuildActionNode.getFullIdentifier(), SimpleYaml.getString("airbuild.action.high", "loghigh cancel", yamlContent))); } + + } /*** BEDTELEPORT section ***/ { - ParentOption bedteleportNode = new ParentOption("bedteleport", false); + ParentOption bedteleportNode = new ParentOption("bedteleport", root.getFullIdentifier(), false); root.add(bedteleportNode); + + bedteleportNode.add(new BooleanOption("checkops", bedteleportNode.getFullIdentifier(), + SimpleYaml.getBoolean("bedteleport.checkops", false, yamlContent))); } /*** BOGUSITEMS section ***/ { - ParentOption bogusitemsNode = new ParentOption("bogusitems", false); + ParentOption bogusitemsNode = new ParentOption("bogusitems", root.getFullIdentifier(), false); root.add(bogusitemsNode); + + bogusitemsNode.add(new BooleanOption("checkops", bogusitemsNode.getFullIdentifier(), + SimpleYaml.getBoolean("bogusitems.checkops", false, yamlContent))); } /*** CUSTOMACTIONS section ***/ { - ParentOption customActionsNode = new ParentOption("customactions", true); + ParentOption customActionsNode = new ParentOption("customactions", root.getFullIdentifier(), true); root.add(customActionsNode); Set customs = SimpleYaml.getKeys("customactions", yamlContent); for(String s : customs) { - CustomActionOption o = new CustomActionOption(s, SimpleYaml.getString("customactions."+s, "unknown", yamlContent)); + CustomActionOption o = new CustomActionOption(s, customActionsNode.getFullIdentifier(), SimpleYaml.getString("customactions."+s, "unknown", yamlContent)); customActionsNode.add(o); actionMap.put(s, o.getCustomActionValue()); diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/Option.java b/src/cc/co/evenprime/bukkit/nocheat/config/Option.java index 219411c9..e02d0dca 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/Option.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/Option.java @@ -4,15 +4,21 @@ package cc.co.evenprime.bukkit.nocheat.config; public abstract class Option { private final String identifier; + private final String parentIdentifier; - public Option(String identifier) { + public Option(String identifier, String parentIdentifier) { this.identifier = identifier; + this.parentIdentifier = parentIdentifier; } public String getIdentifier() { return identifier; } + public String getFullIdentifier() { + return (parentIdentifier == null || parentIdentifier == "") ? identifier : parentIdentifier + "." + identifier; + } + public String toYAMLString(String prefix) { return prefix + "\r\n"; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/ParentOption.java b/src/cc/co/evenprime/bukkit/nocheat/config/ParentOption.java index c4442419..af9ff529 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/ParentOption.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/ParentOption.java @@ -15,8 +15,8 @@ public class ParentOption extends Option { private LinkedList