diff --git a/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java b/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java index f6d3818f..5f59fa45 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java +++ b/src/cc/co/evenprime/bukkit/nocheat/NoCheat.java @@ -274,11 +274,12 @@ public class NoCheat extends JavaPlugin { return player.isOp(); else { PermissionData data = PermissionData.get(player); - if(data.permissionsLastUpdate + 10000 < System.currentTimeMillis()) { - data.permissionsLastUpdate = System.currentTimeMillis(); - updatePermissions(player, data); + long time = System.currentTimeMillis(); + if(data.lastUpdate[permission] + 10000 < time) { + data.lastUpdate[permission] = time; + data.cache[permission] = permissions.has(player, PermissionData.permissionNames[permission]); } - return data.permissionsCache[permission]; + return data.cache[permission]; } } catch(Throwable e) { @@ -296,19 +297,6 @@ public class NoCheat extends JavaPlugin { } } - private void updatePermissions(Player player, PermissionData data) { - - data.permissionsCache[PermissionData.PERMISSION_AIRBUILD] = permissions.has(player, "nocheat.airbuild"); - data.permissionsCache[PermissionData.PERMISSION_BEDTELEPORT] = permissions.has(player, "nocheat.bedteleport"); - data.permissionsCache[PermissionData.PERMISSION_FLYING] = permissions.has(player, "nocheat.flying"); - data.permissionsCache[PermissionData.PERMISSION_MOVING] = permissions.has(player, "nocheat.moving"); - data.permissionsCache[PermissionData.PERMISSION_BOGUSITEMS] = permissions.has(player, "nocheat.bogusitems"); - data.permissionsCache[PermissionData.PERMISSION_SPEEDHACK] = permissions.has(player, "nocheat.speedhack"); - data.permissionsCache[PermissionData.PERMISSION_NOTIFY] = permissions.has(player, "nocheat.notify"); - data.permissionsCache[PermissionData.PERMISSION_ITEMDUPE] = permissions.has(player, "nocheat.itemdupe"); - - } - /** * Read the config file */ @@ -339,7 +327,7 @@ public class NoCheat extends JavaPlugin { String s = ""; for(Check c : checks) { - s = s + (!c.isActive() ? c.getName() + "* " : (c.hasPermission(p) ? c.getName() + " " : "")); + s = s + (!c.isActive() ? c.getName() + "* " : (c.skipCheck(p) ? c.getName() + " " : "")); } s = s + (!movingCheck.isActive() || movingCheck.allowFlying ? "flying* " : (hasPermission(p, PermissionData.PERMISSION_FLYING) ? "flying " : "")); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/AirbuildCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/AirbuildCheck.java index e7ee1503..d1d8855a 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/AirbuildCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/AirbuildCheck.java @@ -42,7 +42,7 @@ public class AirbuildCheck extends Check { public void check(BlockPlaceEvent event) { // Should we check at all? - if(hasPermission(event.getPlayer())) return; + if(skipCheck(event.getPlayer())) return; // Are all 6 sides "air-blocks" -> cancel the event if(event.getBlockAgainst().getType() == Material.AIR) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/BedteleportCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/BedteleportCheck.java index 2ac9acdb..885d2df6 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/BedteleportCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/BedteleportCheck.java @@ -25,7 +25,7 @@ public class BedteleportCheck extends Check { public void check(PlayerMoveEvent event) { // Should we check at all? - if(hasPermission(event.getPlayer())) + if(skipCheck(event.getPlayer())) return; if(event.getPlayer().isSleeping()) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/BogusitemsCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/BogusitemsCheck.java index f1f72ac4..dc764dbd 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/BogusitemsCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/BogusitemsCheck.java @@ -28,7 +28,7 @@ public class BogusitemsCheck extends Check { public void check(PlayerPickupItemEvent event) { // Should we check at all? - if(hasPermission(event.getPlayer())) return; + if(skipCheck(event.getPlayer())) return; Item i = event.getItem(); if(i != null) { @@ -47,7 +47,7 @@ public class BogusitemsCheck extends Check { public void check(PlayerInteractEvent event) { - if(hasPermission(event.getPlayer())) return; + if(skipCheck(event.getPlayer())) return; if(event.hasItem() && event.getItem().getAmount() <= 0) {// buggy item event.setCancelled(true); @@ -60,7 +60,7 @@ public class BogusitemsCheck extends Check { public void check(PlayerDropItemEvent event) { - if(hasPermission(event.getPlayer())) return; + if(skipCheck(event.getPlayer())) return; Item item = event.getItemDrop(); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java b/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java index a9323cbf..3826ae49 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java @@ -24,7 +24,7 @@ public abstract class Check { this.name = name; } - public boolean hasPermission(Player player) { + public boolean skipCheck(Player player) { // Should we check at all? return !active || plugin.hasPermission(player, permission); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/ItemdupeCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/ItemdupeCheck.java index 3aa91bf7..b5b092dd 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/ItemdupeCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/ItemdupeCheck.java @@ -22,7 +22,7 @@ public class ItemdupeCheck extends Check { public void check(EntityDeathEvent event) { if(event.getEntity() instanceof CraftPlayer) { - if(hasPermission((CraftPlayer)event.getEntity())) return; + if(skipCheck((CraftPlayer)event.getEntity())) return; ((CraftPlayer)event.getEntity()).getHandle().x(); // close all inventory screens } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java index 10154264..a49f73c4 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/MovingCheck.java @@ -22,6 +22,7 @@ import cc.co.evenprime.bukkit.nocheat.actions.CancelAction; import cc.co.evenprime.bukkit.nocheat.actions.CustomAction; import cc.co.evenprime.bukkit.nocheat.actions.LogAction; import cc.co.evenprime.bukkit.nocheat.data.MovingData; +import cc.co.evenprime.bukkit.nocheat.data.MovingData.BlockType; import cc.co.evenprime.bukkit.nocheat.data.PermissionData; import cc.co.evenprime.bukkit.nocheat.listeners.MovingEntityListener; import cc.co.evenprime.bukkit.nocheat.listeners.MovingPlayerListener; @@ -75,105 +76,6 @@ public class MovingCheck extends Check { private static final double magic = 0.30000001192092896D; private static final double magic2 = 0.69999998807907103D; - // Block types that may be treated specially - private enum BlockType { - SOLID, NONSOLID, LADDER, LIQUID, UNKNOWN, FENCE; - } - - // Until I can think of a better way to determine if a block is solid or not, this is what I'll do - private static BlockType types[] = new BlockType[256]; - static { - - for(int i = 0; i < types.length; i++) { - types[i] = BlockType.UNKNOWN; - } - - types[Material.AIR.getId()] = BlockType.NONSOLID; - types[Material.STONE.getId()] = BlockType.SOLID; - types[Material.GRASS.getId()] = BlockType.SOLID; - types[Material.DIRT.getId()] = BlockType.SOLID; - types[Material.COBBLESTONE.getId()] = BlockType.SOLID; - types[Material.WOOD.getId()] = BlockType.SOLID; - types[Material.SAPLING.getId()] = BlockType.NONSOLID; - types[Material.BEDROCK.getId()] = BlockType.SOLID; - types[Material.WATER.getId()] = BlockType.LIQUID; - types[Material.STATIONARY_WATER.getId()] = BlockType.LIQUID; - types[Material.LAVA.getId()] = BlockType.LIQUID; - types[Material.STATIONARY_LAVA.getId()] = BlockType.LIQUID; - types[Material.SAND.getId()] = BlockType.SOLID; - types[Material.GRAVEL.getId()] = BlockType.SOLID; - types[Material.GOLD_ORE.getId()] = BlockType.SOLID; - types[Material.IRON_ORE.getId()] = BlockType.SOLID; - types[Material.COAL_ORE.getId()] = BlockType.SOLID; - types[Material.LOG.getId()] = BlockType.SOLID; - types[Material.LEAVES.getId()] = BlockType.SOLID; - types[Material.SPONGE.getId()] = BlockType.SOLID; - types[Material.GLASS.getId()] = BlockType.SOLID; - types[Material.LAPIS_ORE.getId()] = BlockType.SOLID; - types[Material.LAPIS_BLOCK.getId()] = BlockType.SOLID; - types[Material.DISPENSER.getId()] = BlockType.SOLID; - types[Material.SANDSTONE.getId()] = BlockType.SOLID; - types[Material.NOTE_BLOCK.getId()]= BlockType.SOLID; - types[Material.WOOL.getId()]= BlockType.SOLID; - types[Material.YELLOW_FLOWER.getId()]= BlockType.NONSOLID; - types[Material.RED_ROSE.getId()]= BlockType.NONSOLID; - types[Material.BROWN_MUSHROOM.getId()]= BlockType.NONSOLID; - types[Material.RED_MUSHROOM.getId()]= BlockType.NONSOLID; - types[Material.GOLD_BLOCK.getId()]= BlockType.SOLID; - types[Material.IRON_BLOCK.getId()]= BlockType.SOLID; - types[Material.DOUBLE_STEP.getId()]= BlockType.UNKNOWN; - types[Material.STEP.getId()]= BlockType.UNKNOWN; - types[Material.BRICK.getId()]= BlockType.SOLID; - types[Material.TNT.getId()]= BlockType.SOLID; - types[Material.BOOKSHELF.getId()]= BlockType.SOLID; - types[Material.MOSSY_COBBLESTONE.getId()] = BlockType.SOLID; - types[Material.OBSIDIAN.getId()]= BlockType.SOLID; - types[Material.TORCH.getId()]= BlockType.NONSOLID; - types[Material.FIRE.getId()]= BlockType.NONSOLID; - types[Material.MOB_SPAWNER.getId()]= BlockType.SOLID; - types[Material.WOOD_STAIRS.getId()]= BlockType.UNKNOWN; - types[Material.CHEST.getId()]= BlockType.SOLID; - types[Material.REDSTONE_WIRE.getId()]= BlockType.NONSOLID; - types[Material.DIAMOND_ORE.getId()]= BlockType.SOLID; - types[Material.DIAMOND_BLOCK.getId()]= BlockType.SOLID; - types[Material.WORKBENCH.getId()]= BlockType.SOLID; - types[Material.CROPS.getId()]= BlockType.NONSOLID; - types[Material.SOIL.getId()]= BlockType.SOLID; - types[Material.FURNACE.getId()]= BlockType.SOLID; - types[Material.BURNING_FURNACE.getId()]= BlockType.SOLID; - types[Material.SIGN_POST.getId()]= BlockType.NONSOLID; - types[Material.WOODEN_DOOR.getId()]= BlockType.NONSOLID; - types[Material.LADDER.getId()]= BlockType.LADDER; - types[Material.RAILS.getId()]= BlockType.NONSOLID; - types[Material.COBBLESTONE_STAIRS.getId()]= BlockType.UNKNOWN; - types[Material.WALL_SIGN.getId()]= BlockType.NONSOLID; - types[Material.LEVER.getId()]= BlockType.NONSOLID; - types[Material.STONE_PLATE.getId()]= BlockType.UNKNOWN; - types[Material.IRON_DOOR_BLOCK.getId()]= BlockType.NONSOLID; - types[Material.WOOD_PLATE.getId()]= BlockType.NONSOLID; - types[Material.REDSTONE_ORE.getId()]= BlockType.SOLID; - types[Material.GLOWING_REDSTONE_ORE.getId()]= BlockType.SOLID; - types[Material.REDSTONE_TORCH_OFF.getId()]= BlockType.NONSOLID; - types[Material.REDSTONE_TORCH_ON.getId()]= BlockType.NONSOLID; - types[Material.STONE_BUTTON.getId()]= BlockType.NONSOLID; - types[Material.SNOW.getId()]= BlockType.UNKNOWN; - types[Material.ICE.getId()]= BlockType.UNKNOWN; - types[Material.SNOW_BLOCK.getId()]= BlockType.SOLID; - types[Material.CACTUS.getId()]= BlockType.SOLID; - types[Material.CLAY.getId()]= BlockType.SOLID; - types[Material.SUGAR_CANE_BLOCK.getId()]= BlockType.NONSOLID; - types[Material.JUKEBOX.getId()]= BlockType.SOLID; - types[Material.FENCE.getId()]= BlockType.FENCE; - types[Material.PUMPKIN.getId()]= BlockType.SOLID; - types[Material.NETHERRACK.getId()]= BlockType.SOLID; - types[Material.SOUL_SAND.getId()]= BlockType.UNKNOWN; - types[Material.GLOWSTONE.getId()]= BlockType.SOLID; - types[Material.PORTAL.getId()]= BlockType.NONSOLID; - types[Material.JACK_O_LANTERN.getId()]= BlockType.SOLID; - types[Material.CAKE_BLOCK.getId()]= BlockType.UNKNOWN; - } - - public void check(final PlayerMoveEvent event) { long startTime = System.nanoTime(); @@ -181,7 +83,7 @@ public class MovingCheck extends Check { final Player player = event.getPlayer(); // Should we check at all - if(hasPermission(player)) { + if(skipCheck(player)) { statisticElapsedTimeNano += System.nanoTime() - startTime; statisticTotalEvents++; return; @@ -565,6 +467,8 @@ public class MovingCheck extends Check { */ private static boolean playerIsOnGround(World w, int values[], Location l) { + BlockType types[] = MovingData.types; + // Check the four borders of the players hitbox for something he could be standing on if(types[w.getBlockTypeIdAt(values[0], values[2]-1, values[3])] != BlockType.NONSOLID || types[w.getBlockTypeIdAt(values[1], values[2]-1, values[3])] != BlockType.NONSOLID || diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/SpeedhackCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/SpeedhackCheck.java index 27f92367..45df040a 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/SpeedhackCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/SpeedhackCheck.java @@ -48,7 +48,7 @@ public class SpeedhackCheck extends Check { Player player = event.getPlayer(); // Should we check at all? - if(hasPermission(player)) return; + if(skipCheck(player)) return; // Ignore events of players in vehicles (these can be the cause of event spam between server and client) // Ignore events if the player has positive y-Velocity (these can be the cause of event spam between server and client) diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java b/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java index 404e71f4..de0ecc74 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/MovingData.java @@ -3,6 +3,7 @@ package cc.co.evenprime.bukkit.nocheat.data; import java.util.logging.Level; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.NoCheatData; @@ -28,6 +29,104 @@ public class MovingData { public Location teleportInitializedByMe = null; + // Block types that may be treated specially + public enum BlockType { + SOLID, NONSOLID, LADDER, LIQUID, UNKNOWN, FENCE; + } + + // Until I can think of a better way to determine if a block is solid or not, this is what I'll do + public static BlockType types[] = new BlockType[256]; + static { + + for(int i = 0; i < types.length; i++) { + types[i] = BlockType.UNKNOWN; + } + + types[Material.AIR.getId()] = BlockType.NONSOLID; + types[Material.STONE.getId()] = BlockType.SOLID; + types[Material.GRASS.getId()] = BlockType.SOLID; + types[Material.DIRT.getId()] = BlockType.SOLID; + types[Material.COBBLESTONE.getId()] = BlockType.SOLID; + types[Material.WOOD.getId()] = BlockType.SOLID; + types[Material.SAPLING.getId()] = BlockType.NONSOLID; + types[Material.BEDROCK.getId()] = BlockType.SOLID; + types[Material.WATER.getId()] = BlockType.LIQUID; + types[Material.STATIONARY_WATER.getId()] = BlockType.LIQUID; + types[Material.LAVA.getId()] = BlockType.LIQUID; + types[Material.STATIONARY_LAVA.getId()] = BlockType.LIQUID; + types[Material.SAND.getId()] = BlockType.SOLID; + types[Material.GRAVEL.getId()] = BlockType.SOLID; + types[Material.GOLD_ORE.getId()] = BlockType.SOLID; + types[Material.IRON_ORE.getId()] = BlockType.SOLID; + types[Material.COAL_ORE.getId()] = BlockType.SOLID; + types[Material.LOG.getId()] = BlockType.SOLID; + types[Material.LEAVES.getId()] = BlockType.SOLID; + types[Material.SPONGE.getId()] = BlockType.SOLID; + types[Material.GLASS.getId()] = BlockType.SOLID; + types[Material.LAPIS_ORE.getId()] = BlockType.SOLID; + types[Material.LAPIS_BLOCK.getId()] = BlockType.SOLID; + types[Material.DISPENSER.getId()] = BlockType.SOLID; + types[Material.SANDSTONE.getId()] = BlockType.SOLID; + types[Material.NOTE_BLOCK.getId()]= BlockType.SOLID; + types[Material.WOOL.getId()]= BlockType.SOLID; + types[Material.YELLOW_FLOWER.getId()]= BlockType.NONSOLID; + types[Material.RED_ROSE.getId()]= BlockType.NONSOLID; + types[Material.BROWN_MUSHROOM.getId()]= BlockType.NONSOLID; + types[Material.RED_MUSHROOM.getId()]= BlockType.NONSOLID; + types[Material.GOLD_BLOCK.getId()]= BlockType.SOLID; + types[Material.IRON_BLOCK.getId()]= BlockType.SOLID; + types[Material.DOUBLE_STEP.getId()]= BlockType.UNKNOWN; + types[Material.STEP.getId()]= BlockType.UNKNOWN; + types[Material.BRICK.getId()]= BlockType.SOLID; + types[Material.TNT.getId()]= BlockType.SOLID; + types[Material.BOOKSHELF.getId()]= BlockType.SOLID; + types[Material.MOSSY_COBBLESTONE.getId()] = BlockType.SOLID; + types[Material.OBSIDIAN.getId()]= BlockType.SOLID; + types[Material.TORCH.getId()]= BlockType.NONSOLID; + types[Material.FIRE.getId()]= BlockType.NONSOLID; + types[Material.MOB_SPAWNER.getId()]= BlockType.SOLID; + types[Material.WOOD_STAIRS.getId()]= BlockType.UNKNOWN; + types[Material.CHEST.getId()]= BlockType.SOLID; + types[Material.REDSTONE_WIRE.getId()]= BlockType.NONSOLID; + types[Material.DIAMOND_ORE.getId()]= BlockType.SOLID; + types[Material.DIAMOND_BLOCK.getId()]= BlockType.SOLID; + types[Material.WORKBENCH.getId()]= BlockType.SOLID; + types[Material.CROPS.getId()]= BlockType.NONSOLID; + types[Material.SOIL.getId()]= BlockType.SOLID; + types[Material.FURNACE.getId()]= BlockType.SOLID; + types[Material.BURNING_FURNACE.getId()]= BlockType.SOLID; + types[Material.SIGN_POST.getId()]= BlockType.NONSOLID; + types[Material.WOODEN_DOOR.getId()]= BlockType.NONSOLID; + types[Material.LADDER.getId()]= BlockType.LADDER; + types[Material.RAILS.getId()]= BlockType.NONSOLID; + types[Material.COBBLESTONE_STAIRS.getId()]= BlockType.UNKNOWN; + types[Material.WALL_SIGN.getId()]= BlockType.NONSOLID; + types[Material.LEVER.getId()]= BlockType.NONSOLID; + types[Material.STONE_PLATE.getId()]= BlockType.UNKNOWN; + types[Material.IRON_DOOR_BLOCK.getId()]= BlockType.NONSOLID; + types[Material.WOOD_PLATE.getId()]= BlockType.NONSOLID; + types[Material.REDSTONE_ORE.getId()]= BlockType.SOLID; + types[Material.GLOWING_REDSTONE_ORE.getId()]= BlockType.SOLID; + types[Material.REDSTONE_TORCH_OFF.getId()]= BlockType.NONSOLID; + types[Material.REDSTONE_TORCH_ON.getId()]= BlockType.NONSOLID; + types[Material.STONE_BUTTON.getId()]= BlockType.NONSOLID; + types[Material.SNOW.getId()]= BlockType.UNKNOWN; + types[Material.ICE.getId()]= BlockType.UNKNOWN; + types[Material.SNOW_BLOCK.getId()]= BlockType.SOLID; + types[Material.CACTUS.getId()]= BlockType.SOLID; + types[Material.CLAY.getId()]= BlockType.SOLID; + types[Material.SUGAR_CANE_BLOCK.getId()]= BlockType.NONSOLID; + types[Material.JUKEBOX.getId()]= BlockType.SOLID; + types[Material.FENCE.getId()]= BlockType.FENCE; + types[Material.PUMPKIN.getId()]= BlockType.SOLID; + types[Material.NETHERRACK.getId()]= BlockType.SOLID; + types[Material.SOUL_SAND.getId()]= BlockType.UNKNOWN; + types[Material.GLOWSTONE.getId()]= BlockType.SOLID; + types[Material.PORTAL.getId()]= BlockType.NONSOLID; + types[Material.JACK_O_LANTERN.getId()]= BlockType.SOLID; + types[Material.CAKE_BLOCK.getId()]= BlockType.UNKNOWN; + } + public static MovingData get(Player p) { NoCheatData data = NoCheatData.getPlayerData(p); diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/PermissionData.java b/src/cc/co/evenprime/bukkit/nocheat/data/PermissionData.java index b57608c2..6bf7986a 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/PermissionData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/PermissionData.java @@ -6,9 +6,11 @@ import cc.co.evenprime.bukkit.nocheat.NoCheatData; public class PermissionData { - public long permissionsLastUpdate = 0; - public boolean permissionsCache[] = new boolean[8]; - + public long lastUpdate[] = new long[8]; + public boolean cache[] = new boolean[8]; + + public static final String[] permissionNames = new String[8]; + public static final int PERMISSION_MOVING = 0; public static final int PERMISSION_FLYING = 1; public static final int PERMISSION_SPEEDHACK = 2; @@ -17,7 +19,18 @@ public class PermissionData { public static final int PERMISSION_BOGUSITEMS = 5; public static final int PERMISSION_NOTIFY = 6; public static final int PERMISSION_ITEMDUPE = 7; - + + static { + permissionNames[PERMISSION_AIRBUILD] = "nocheat.airbuild"; + permissionNames[PERMISSION_BEDTELEPORT] = "nocheat.bedteleport"; + permissionNames[PERMISSION_FLYING] = "nocheat.flying"; + permissionNames[PERMISSION_MOVING] = "nocheat.moving"; + permissionNames[PERMISSION_BOGUSITEMS] = "nocheat.bogusitems"; + permissionNames[PERMISSION_SPEEDHACK] = "nocheat.speedhack"; + permissionNames[PERMISSION_NOTIFY] = "nocheat.notify"; + permissionNames[PERMISSION_ITEMDUPE] = "nocheat.itemdupe"; + } + public static PermissionData get(Player p) { NoCheatData data = NoCheatData.getPlayerData(p);