From 99a197607b8d4acf30a567edcdf708635bc31e4b Mon Sep 17 00:00:00 2001 From: Evenprime Date: Sun, 30 Oct 2011 20:15:03 +0100 Subject: [PATCH] Removed blockplace.noswing check, because it causes problems Added blockplace.direction check --- plugin.yml | 4 +- .../checks/blockplace/BlockPlaceCheck.java | 29 ++++--- .../checks/blockplace/DirectionCheck.java | 87 +++++++++++++++++++ .../checks/blockplace/NoswingCheck.java | 36 -------- .../nocheat/checks/blockplace/ReachCheck.java | 7 +- .../bukkit/nocheat/config/Configuration.java | 10 ++- .../nocheat/config/DefaultConfiguration.java | 14 +-- .../bukkit/nocheat/config/Explainations.java | 6 +- .../bukkit/nocheat/config/Permissions.java | 2 +- .../nocheat/config/cache/CCBlockPlace.java | 13 ++- .../bukkit/nocheat/data/BaseData.java | 4 +- .../bukkit/nocheat/data/BlockPlaceData.java | 13 ++- .../events/BlockPlaceEventManager.java | 2 - 13 files changed, 147 insertions(+), 80 deletions(-) create mode 100644 src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java delete mode 100644 src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/NoswingCheck.java diff --git a/plugin.yml b/plugin.yml index 866d9d96..467dbb3b 100644 --- a/plugin.yml +++ b/plugin.yml @@ -62,8 +62,8 @@ permissions: description: Allow a player to place blocks at maximum range (about 6-7 blocks) nocheat.checks.blockplace.onliquid: description: Allow a player to place non-liquid blocks on liquids - nocheat.checks.blockplace.noswing: - description: Allow a player to place blocks without swinging their arm + nocheat.checks.blockplace.direction: + description: Allow a player to place blocks outside their line of view nocheat.checks.chat: description: Allow the player to bypass all chat checks children: diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java index f2b5506c..9dd8344a 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java @@ -13,10 +13,10 @@ import cc.co.evenprime.bukkit.nocheat.data.BaseData; */ public class BlockPlaceCheck { - private final ReachCheck reachCheck; - private final OnLiquidCheck onLiquidCheck; - private final NoswingCheck noswingCheck; - private final NoCheat plugin; + private final ReachCheck reachCheck; + private final OnLiquidCheck onLiquidCheck; + private final DirectionCheck directionCheck; + private final NoCheat plugin; public BlockPlaceCheck(NoCheat plugin) { @@ -24,7 +24,7 @@ public class BlockPlaceCheck { reachCheck = new ReachCheck(plugin); onLiquidCheck = new OnLiquidCheck(plugin); - noswingCheck = new NoswingCheck(plugin); + directionCheck = new DirectionCheck(plugin); } public boolean check(final Player player, final Block blockPlaced, final Block blockPlacedAgainst, final ConfigurationCache cc) { @@ -34,16 +34,21 @@ public class BlockPlaceCheck { // Which checks are going to be executed? final boolean onliquid = cc.blockplace.onliquidCheck && !player.hasPermission(Permissions.BLOCKPLACE_ONLIQUID); final boolean reach = cc.blockplace.reachCheck && !player.hasPermission(Permissions.BLOCKPLACE_REACH); - final boolean noswing = cc.blockplace.noswingCheck && !player.hasPermission(Permissions.BLOCKPLACE_NOSWING); - + final boolean direction = cc.blockplace.directionCheck && !player.hasPermission(Permissions.BLOCKPLACE_DIRECTION); final BaseData data = plugin.getData(player.getName()); - if(noswing) { - cancel = noswingCheck.check(player, data, cc); - } - if(!cancel && reach) { - cancel = reachCheck.check(player, data, blockPlacedAgainst, cc); + if(blockPlaced != null && blockPlacedAgainst != null) { + data.blockplace.blockPlaced.set(blockPlaced); + data.blockplace.blockPlacedAgainst.set(blockPlacedAgainst); + + if(!cancel && direction) { + cancel = directionCheck.check(player, data, cc); + } + + if(!cancel && reach) { + cancel = reachCheck.check(player, data, cc); + } } if(!cancel && onliquid) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java new file mode 100644 index 00000000..aabc21cd --- /dev/null +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java @@ -0,0 +1,87 @@ +package cc.co.evenprime.bukkit.nocheat.checks.blockplace; + +import org.bukkit.entity.Player; + +import cc.co.evenprime.bukkit.nocheat.NoCheat; +import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; +import cc.co.evenprime.bukkit.nocheat.config.cache.CCBlockPlace; +import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; +import cc.co.evenprime.bukkit.nocheat.data.BaseData; +import cc.co.evenprime.bukkit.nocheat.data.BlockPlaceData; +import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; + +public class DirectionCheck { + + private final NoCheat plugin; + + public DirectionCheck(NoCheat plugin) { + this.plugin = plugin; + } + + public boolean check(final Player player, final BaseData data, final ConfigurationCache cc) { + + boolean cancel = false; + + final CCBlockPlace ccblockplace = cc.blockplace; + final BlockPlaceData blockplace = data.blockplace; + + final SimpleLocation blockPlaced = blockplace.blockPlaced; + final SimpleLocation blockPlacedAgainst = blockplace.blockPlacedAgainst; + + // First check if the crosshair matches (roughly) the clicked block + double off = CheckUtil.directionCheck(player, blockPlacedAgainst.x + 0.5D, blockPlacedAgainst.y + 0.5D, blockPlacedAgainst.z + 0.5D, 1D, 1D, ccblockplace.directionPrecision); + + // now check if the player is looking at the block from the correct side + + double off2 = 0.0D; + + // Find out against which face the player tried to build, and if he + // stood on the correct side + if(blockPlaced.x > blockPlacedAgainst.x) { + off2 = blockPlacedAgainst.x + 0.5D - player.getEyeLocation().getX(); + } else if(blockPlaced.x < blockPlacedAgainst.x) { + off2 = -(blockPlacedAgainst.x + 0.5D - player.getEyeLocation().getX()); + } else if(blockPlaced.y > blockPlacedAgainst.y) { + off2 = blockPlacedAgainst.y + 0.5D - player.getEyeLocation().getY(); + } else if(blockPlaced.y < blockPlacedAgainst.y) { + off2 = -(blockPlacedAgainst.y + 0.5D - player.getEyeLocation().getY()); + } else if(blockPlaced.z > blockPlacedAgainst.z) { + off2 = blockPlacedAgainst.z + 0.5D - player.getEyeLocation().getZ(); + } else if(blockPlaced.z < blockPlacedAgainst.z) { + off2 = -(blockPlacedAgainst.z + 0.5D - player.getEyeLocation().getZ()); + } + + if(off2 > 0.0D) { + off += off2; + } + + final long time = System.currentTimeMillis(); + + if(off < 0.1D) { + // Player did nothing wrong + // reduce violation counter + blockplace.directionViolationLevel *= 0.9D; + } else { + // Player failed the check + // Increment violation counter + blockplace.directionViolationLevel += off; + + // Prepare some event-specific values for logging and custom actions + data.log.check = "blockplace.direction"; + + cancel = plugin.execute(player, ccblockplace.directionActions, (int) blockplace.directionViolationLevel, blockplace.history, cc); + + if(cancel) { + // Needed to calculate penalty times + blockplace.directionLastViolationTime = time; + } + } + + // If the player is still in penalty time, cancel the event anyway + if(blockplace.directionLastViolationTime + ccblockplace.directionPenaltyTime >= time) { + return true; + } + + return cancel; + } +} diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/NoswingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/NoswingCheck.java deleted file mode 100644 index cd260100..00000000 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/NoswingCheck.java +++ /dev/null @@ -1,36 +0,0 @@ -package cc.co.evenprime.bukkit.nocheat.checks.blockplace; - -import org.bukkit.entity.Player; - -import cc.co.evenprime.bukkit.nocheat.NoCheat; -import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; -import cc.co.evenprime.bukkit.nocheat.data.BaseData; - -public class NoswingCheck { - - private final NoCheat plugin; - - public NoswingCheck(NoCheat plugin) { - this.plugin = plugin; - } - - public boolean check(final Player player, final BaseData data, final ConfigurationCache cc) { - - boolean cancel = false; - - // did he swing his arm before? - if(data.armswung) { - data.armswung = false; - data.blockplace.noswingVL *= 0.90D; - } else { - data.blockplace.noswingVL += 1; - // Prepare some event-specific values for logging and custom - // actions - data.log.check = "blockplace.noswing"; - - cancel = plugin.execute(player, cc.blockplace.noswingActions, (int) data.blockplace.noswingVL, data.blockplace.history, cc); - } - - return cancel; - } -} diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java index 470cc2b3..284ae505 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java @@ -1,6 +1,5 @@ package cc.co.evenprime.bukkit.nocheat.checks.blockplace; -import org.bukkit.block.Block; import org.bukkit.entity.Player; import cc.co.evenprime.bukkit.nocheat.NoCheat; @@ -8,6 +7,7 @@ import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; import cc.co.evenprime.bukkit.nocheat.config.cache.ConfigurationCache; import cc.co.evenprime.bukkit.nocheat.data.BaseData; import cc.co.evenprime.bukkit.nocheat.data.BlockPlaceData; +import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; /** * The reach check will find out if a player interacts with something that's too @@ -22,11 +22,12 @@ public class ReachCheck { this.plugin = plugin; } - public boolean check(final Player player, final BaseData data, final Block placedAgainstBlock, final ConfigurationCache cc) { + public boolean check(final Player player, final BaseData data, final ConfigurationCache cc) { boolean cancel = false; + final SimpleLocation placedAgainstBlock = data.blockplace.blockPlacedAgainst; - final double distance = CheckUtil.reachCheck(player, placedAgainstBlock.getX() + 0.5D, placedAgainstBlock.getY() + 0.5D, placedAgainstBlock.getZ() + 0.5D, cc.blockplace.reachDistance); + final double distance = CheckUtil.reachCheck(player, placedAgainstBlock.x + 0.5D, placedAgainstBlock.y + 0.5D, placedAgainstBlock.z + 0.5D, cc.blockplace.reachDistance); BlockPlaceData blockplace = data.blockplace; diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/Configuration.java b/src/cc/co/evenprime/bukkit/nocheat/config/Configuration.java index f002d9ca..77b5f785 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/Configuration.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/Configuration.java @@ -69,7 +69,7 @@ public abstract class Configuration { public final static OptionNode BLOCKBREAK_DIRECTION_CHECK = new OptionNode("check", BLOCKBREAK_DIRECTION, DataType.BOOLEAN); public final static OptionNode BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS = new OptionNode("checkinstabreakblocks", BLOCKBREAK_DIRECTION, DataType.BOOLEAN); public final static OptionNode BLOCKBREAK_DIRECTION_PRECISION = new OptionNode("precision", BLOCKBREAK_DIRECTION, DataType.INTEGER); - public final static OptionNode BLOCKBREAK_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", BLOCKBREAK_DIRECTION, DataType.INTEGER); ; + public final static OptionNode BLOCKBREAK_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", BLOCKBREAK_DIRECTION, DataType.INTEGER); public final static OptionNode BLOCKBREAK_DIRECTION_ACTIONS = new OptionNode("actions", BLOCKBREAK_DIRECTION, DataType.ACTIONLIST); private final static OptionNode BLOCKBREAK_NOSWING = new OptionNode("noswing", BLOCKBREAK, DataType.PARENT); @@ -88,9 +88,11 @@ public abstract class Configuration { public final static OptionNode BLOCKPLACE_ONLIQUID_CHECK = new OptionNode("check", BLOCKPLACE_ONLIQUID, DataType.BOOLEAN); public final static OptionNode BLOCKPLACE_ONLIQUID_ACTIONS = new OptionNode("actions", BLOCKPLACE_ONLIQUID, DataType.ACTIONLIST); - private final static OptionNode BLOCKPLACE_NOSWING = new OptionNode("noswing", BLOCKPLACE, DataType.PARENT); - public final static OptionNode BLOCKPLACE_NOSWING_CHECK = new OptionNode("check", BLOCKPLACE_NOSWING, DataType.BOOLEAN); - public final static OptionNode BLOCKPLACE_NOSWING_ACTIONS = new OptionNode("actions", BLOCKPLACE_NOSWING, DataType.ACTIONLIST); + private final static OptionNode BLOCKPLACE_DIRECTION = new OptionNode("direction", BLOCKPLACE, DataType.PARENT); + public static final OptionNode BLOCKPLACE_DIRECTION_CHECK = new OptionNode("check", BLOCKPLACE_DIRECTION, DataType.BOOLEAN); ; + public static final OptionNode BLOCKPLACE_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", BLOCKPLACE_DIRECTION, DataType.INTEGER); + public final static OptionNode BLOCKPLACE_DIRECTION_PRECISION = new OptionNode("precision", BLOCKPLACE_DIRECTION, DataType.INTEGER); + public static final OptionNode BLOCKPLACE_DIRECTION_ACTIONS = new OptionNode("actions", BLOCKPLACE_DIRECTION, DataType.ACTIONLIST); private final static OptionNode CHAT = new OptionNode("chat", ROOT, DataType.PARENT); public final static OptionNode CHAT_CHECK = new OptionNode("check", CHAT, DataType.BOOLEAN); diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/DefaultConfiguration.java b/src/cc/co/evenprime/bukkit/nocheat/config/DefaultConfiguration.java index 4d2a7b88..0173c17e 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/DefaultConfiguration.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/DefaultConfiguration.java @@ -97,11 +97,9 @@ public class DefaultConfiguration extends Configuration { setValue(BLOCKBREAK_REACH_ACTIONS, reachActionList); setValue(BLOCKBREAK_DIRECTION_CHECK, true); - setValue(BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS, true); setValue(BLOCKBREAK_DIRECTION_PRECISION, 50); setValue(BLOCKBREAK_DIRECTION_PENALTYTIME, 300); - ActionList directionActionList = new ActionList(); directionActionList.setActions(0, action.getActions("blockbreakCancel".split(" "))); directionActionList.setActions(10, action.getActions("directionLog blockbreakCancel".split(" "))); @@ -132,11 +130,13 @@ public class DefaultConfiguration extends Configuration { onliquidActionList.setActions(3, action.getActions("onliquidLog blockplaceCancel".split(" "))); setValue(BLOCKPLACE_ONLIQUID_ACTIONS, onliquidActionList); - setValue(BLOCKPLACE_NOSWING_CHECK, true); - ActionList noswingActionList = new ActionList(); - noswingActionList.setActions(0, action.getActions("noswingLog blockplaceCancel".split(" "))); - setValue(BLOCKPLACE_NOSWING_ACTIONS, noswingActionList); - + setValue(BLOCKPLACE_DIRECTION_CHECK, true); + setValue(BLOCKPLACE_DIRECTION_PRECISION, 50); + setValue(BLOCKPLACE_DIRECTION_PENALTYTIME, 300); + ActionList directionActionList = new ActionList(); + directionActionList.setActions(0, action.getActions("blockplaceCancel".split(" "))); + directionActionList.setActions(10, action.getActions("directionLog blockplaceCancel".split(" "))); + setValue(BLOCKPLACE_DIRECTION_ACTIONS, directionActionList); } /*** CHAT ***/ diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/Explainations.java b/src/cc/co/evenprime/bukkit/nocheat/config/Explainations.java index bb15af8e..5201767c 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/Explainations.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/Explainations.java @@ -75,8 +75,10 @@ public class Explainations { set(Configuration.BLOCKPLACE_ONLIQUID_CHECK, "If true, check if a player is trying to place non-liquid blocks against liquid blocks\nIn a normal Minecraft game, it is impossible to place a block without it touching something that is considered solid (neither air nor a liquid).\nBut if people use a modified client, to can do that. This check tries to identify that trick."); set(Configuration.BLOCKPLACE_ONLIQUID_ACTIONS, "What should be done if a player is is trying to place non-liquid blocks against liquid blocks.\nUnit is number of place(attempt)s."); - set(Configuration.BLOCKPLACE_NOSWING_CHECK, "If true, check if a player swung his arm before placing a block, which he should have done."); - set(Configuration.BLOCKPLACE_NOSWING_ACTIONS, "What should be done if a player didn't swing his arm.\nUnit is number of blockplacing without armswinging."); + set(Configuration.BLOCKPLACE_DIRECTION_CHECK, "If true, check if a player is looking at the block that he's placing."); + set(Configuration.BLOCKPLACE_DIRECTION_PRECISION, "Define how precise a player has to be when placing blocks. Lower values mean more precision, higher values less precision."); + set(Configuration.BLOCKPLACE_DIRECTION_PENALTYTIME, "Define how long after a failed attempt to place blocks a player will be disallowed to place another block. \nUnit is milliseconds, default is 300."); + set(Configuration.BLOCKPLACE_DIRECTION_ACTIONS, "What should be done if a player is placing blocks that are not in his line of sight.\nUnit is number of place(attempt)s outside the line of sight."); set(Configuration.CHAT_CHECK, "If true, do various checks on PlayerChat events."); diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/Permissions.java b/src/cc/co/evenprime/bukkit/nocheat/config/Permissions.java index 76f7861a..6d4478e8 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/Permissions.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/Permissions.java @@ -26,7 +26,7 @@ public class Permissions { public final static String BLOCKPLACE = CHECKS + ".blockplace"; public final static String BLOCKPLACE_ONLIQUID = BLOCKPLACE + ".onliquid"; public final static String BLOCKPLACE_REACH = BLOCKPLACE + ".reach"; - public static final String BLOCKPLACE_NOSWING = BLOCKPLACE + ".noswing"; + public static final String BLOCKPLACE_DIRECTION = BLOCKPLACE + ".direction"; public final static String CHAT = CHECKS + ".chat"; public final static String CHAT_SPAM = CHAT + ".spam"; diff --git a/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java b/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java index 58b16f8d..250be542 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java +++ b/src/cc/co/evenprime/bukkit/nocheat/config/cache/CCBlockPlace.java @@ -16,8 +16,10 @@ public class CCBlockPlace { public final double reachDistance; public final ActionList reachActions; - public final boolean noswingCheck; - public final ActionList noswingActions; + public final boolean directionCheck; + public final ActionList directionActions; + public final long directionPenaltyTime; + public final double directionPrecision; public CCBlockPlace(Configuration data) { @@ -30,7 +32,10 @@ public class CCBlockPlace { reachDistance = data.getInteger(Configuration.BLOCKPLACE_REACH_LIMIT); reachActions = data.getActionList(Configuration.BLOCKPLACE_REACH_ACTIONS); - noswingCheck = data.getBoolean(Configuration.BLOCKPLACE_NOSWING_CHECK); - noswingActions = data.getActionList(Configuration.BLOCKPLACE_NOSWING_ACTIONS); + directionCheck = data.getBoolean(Configuration.BLOCKPLACE_DIRECTION_CHECK); + directionPenaltyTime = data.getInteger(Configuration.BLOCKPLACE_DIRECTION_PENALTYTIME); + directionPrecision = ((double) data.getInteger(Configuration.BLOCKPLACE_DIRECTION_PRECISION)) / 100D; + directionActions = data.getActionList(Configuration.BLOCKPLACE_DIRECTION_ACTIONS); + } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java b/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java index 8441b177..e2466a39 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/BaseData.java @@ -14,9 +14,7 @@ public class BaseData extends Data { public long lastUsedTime; - public boolean armswung; // This technically does belong to - // many other checks, so I'll put - // it here for convenience + public boolean armswung; public BaseData() { this.blockbreak = new BlockBreakData(); diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java b/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java index 7acbcd85..9e0962c9 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/BlockPlaceData.java @@ -5,8 +5,13 @@ package cc.co.evenprime.bukkit.nocheat.data; */ public class BlockPlaceData extends Data { - public double onliquidViolationLevel = 0.0D; - public double reachViolationLevel = 0.0D; - public final ExecutionHistory history = new ExecutionHistory(); - public double noswingVL = 0.0D; + public double onliquidViolationLevel = 0.0D; + public double reachViolationLevel = 0.0D; + public final ExecutionHistory history = new ExecutionHistory(); + public double noswingVL = 0.0D; + public double directionViolationLevel = 0.0D; + public long directionLastViolationTime = 0; + + public final SimpleLocation blockPlacedAgainst = new SimpleLocation(); + public final SimpleLocation blockPlaced = new SimpleLocation(); } diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java index 0c7b331d..b60e35dc 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/events/BlockPlaceEventManager.java @@ -99,8 +99,6 @@ public class BlockPlaceEventManager extends BlockListener implements EventManage s.add("blockplace.onliquid"); if(cc.blockplace.check && cc.blockplace.reachCheck) s.add("blockplace.reach"); - if(cc.blockplace.check && cc.blockplace.noswingCheck) - s.add("blockplace.noswing"); return s; }