Refactoring stage 1 (RAW): Get rid of some reflection, synchronization

questions.
This commit is contained in:
asofold 2012-08-09 17:56:48 +02:00
parent d5a4082fd4
commit ade3a9276d
63 changed files with 649 additions and 274 deletions

View File

@ -48,7 +48,7 @@ public class ActionList {
/**
* Get a list of actions that match the violation level. The only method that has to be called by a check.
*
* @param violationLevel
* @param VL
* The violation level that should be matched.
* @return The array of actions whose threshold was closest to the violation level but not bigger.
*/

View File

@ -2,11 +2,10 @@ package fr.neatmonster.nocheatplus.actions.types;
import java.util.ArrayList;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.Action;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.ViolationData;
/*
* MMP"""""""MM dP oo M""MMM""MMM""M oo dP dP
@ -53,7 +52,7 @@ public abstract class ActionWithParameters extends Action {
}
/**
* Get a string with all the wildcards replaced with data from LogData.
* Get a string with all the wildcards replaced with dataFactory from LogData.
*
* @param player
* the player
@ -61,7 +60,7 @@ public abstract class ActionWithParameters extends Action {
* the check
* @return the message
*/
protected String getMessage(final Player player, final Check check) {
protected String getMessage(final Check check, final ViolationData violationData) {
// Should be big enough most of the time.
final StringBuilder log = new StringBuilder(100);
@ -69,7 +68,7 @@ public abstract class ActionWithParameters extends Action {
if (part instanceof String)
log.append((String) part);
else
log.append(check.getParameter((ParameterName) part, player));
log.append(check.getParameter((ParameterName) part, violationData));
return log.toString();
}

View File

@ -1,8 +1,7 @@
package fr.neatmonster.nocheatplus.actions.types;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.ViolationData;
/*
* MM'""""'YMM dP
@ -48,17 +47,17 @@ public class CommandAction extends ActionWithParameters {
* that can be directly used as a command in the console.
*
* @param player
* The player that is used to fill in missing data.
* The player that is used to fill in missing dataFactory.
* @param check
* The check that is used to fill in missing data.
* The check that is used to fill in missing dataFactory.
* @return The complete, ready to use, command.
*/
public String getCommand(final Player player, final Check check) {
return super.getMessage(player, check);
public String getCommand(final Check check, final ViolationData violationData) {
return super.getMessage(check, violationData);
}
/**
* Convert the commands data into a string that can be used in the configuration files.
* Convert the commands dataFactory into a string that can be used in the configuration files.
*
* @return the string
*/

View File

@ -1,8 +1,7 @@
package fr.neatmonster.nocheatplus.actions.types;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.ViolationData;
/*
* M""MMMMMMMM MMP"""""""MM dP oo
@ -55,7 +54,7 @@ public class LogAction extends ActionWithParameters {
}
/**
* Parse the final log message out of various data from the player and check that triggered the action.
* Parse the final log message out of various dataFactory from the player and check that triggered the action.
*
* @param player
* The player that is used as a source for the log message.
@ -63,8 +62,8 @@ public class LogAction extends ActionWithParameters {
* The check that is used as a source for the log message.
* @return the log message
*/
public String getLogMessage(final Player player, final Check check) {
return super.getMessage(player, check);
public String getLogMessage(final Check check, final ViolationData violationData) {
return super.getMessage(check, violationData);
}
/**

View File

@ -101,6 +101,49 @@ public abstract class Check {
public Check(final CheckType type) {
this.type = type;
}
/**
* Execute actions in a thread safe manner if isMainThread is set to false.<br>
* @param player
* @param VL
* @param actions
* @param isMainThread
* @return
*/
public boolean executeActionsThreadSafe(final Player player, final double VL, final ActionList actions, final boolean isMainThread){
if (isMainThread){
// Just execute.
return executeActions(player, VL, actions);
}
else {
return executeActionsThreadSafe(player, VL, actions);
}
}
/**
* Execute actions in a thread safe manner.<br>
* @param player
* @param VL
* @param actions
* @return
*/
public boolean executeActionsThreadSafe(final Player player, final double VL, final ActionList actions){
// Sync it into the main thread by using an event.
final ExecuteActionsEvent event = new ExecuteActionsEvent(new ViolationData(this, player, VL, actions));
Bukkit.getPluginManager().callEvent(event);
return event.getCancel();
}
/**
* Convenience method.
* @param player
* @param VL
* @param actions
* @return
*/
protected boolean executeActions(final Player player, final double VL, final ActionList actions){
return executeActions(new ViolationData(this, player, VL, actions));
}
/**
* Execute some actions for the specified player.
@ -109,18 +152,21 @@ public abstract class Check {
* the player
* @return true, if successful
*/
protected boolean executeActions(final Player player) {
protected boolean executeActions(final ViolationData violationData) {
try {
boolean special = false;
final Object config = type.getConfig().getDeclaredMethod("getConfig", Player.class).invoke(null, player);
final Object data = type.getData().getDeclaredMethod("getData", Player.class).invoke(null, player);
final ActionList actionList = (ActionList) type.getConfig().getDeclaredField(type.getName() + "Actions")
.get(config);
final double violationLevel = type.getData().getDeclaredField(type.getName() + "VL").getDouble(data);
final Player player = violationData.player;
// final Object configFactory = type.getConfig().getDeclaredMethod("getConfig", Player.class).invoke(null, player);
// final Object dataFactory = type.getData().getDeclaredMethod("getData", Player.class).invoke(null, player);
// final ActionList actionList = (ActionList) type.getConfig().getDeclaredField(type.getName() + "Actions")
// .get(configFactory);
final ActionList actionList = violationData.actions;
final double violationLevel = violationData.VL;
// Dispatch the VL processing to the hook manager.
if (NCPHookManager.shouldCancelVLProcessing(type, player))
if (NCPHookManager.shouldCancelVLProcessing(violationData.check.type, player))
// One of the hooks has decided to cancel the VL processing, return false.
return false;
@ -130,15 +176,18 @@ public abstract class Check {
final long time = System.currentTimeMillis() / 1000L;
for (final Action ac : actions)
if (getHistory(player).executeAction(getClass().getName(), ac, time))
if (getHistory(player).executeAction(violationData.check.type.getName(), ac, time))
// The execution history said it really is time to execute the action, find out what it is and do
// what is needed.
// TODO: Check design: maybe ac.execute(this) without the instance checks ?
if (ac instanceof LogAction && !player.hasPermission(actionList.permissionSilent))
executeLogAction((LogAction) ac, this, player);
executeLogAction((LogAction) ac, violationData.check, violationData);
else if (ac instanceof CancelAction)
special = true;
else if (ac instanceof CommandAction)
executeConsoleCommand((CommandAction) ac, this, player);
executeConsoleCommand((CommandAction) ac, violationData.check, violationData);
else if (ac instanceof DummyAction) {
// Do nothing, it's a dummy action after all.
}
@ -160,8 +209,8 @@ public abstract class Check {
* @param player
* the player
*/
private void executeConsoleCommand(final CommandAction action, final Check check, final Player player) {
final String command = action.getCommand(player, check);
private void executeConsoleCommand(final CommandAction action, final Check check, final ViolationData violationData) {
final String command = action.getCommand(check, violationData);
try {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command);
@ -183,12 +232,12 @@ public abstract class Check {
* @param player
* the player
*/
private void executeLogAction(final LogAction logAction, final Check check, final Player player) {
private void executeLogAction(final LogAction logAction, final Check check, final ViolationData violationData) {
final ConfigFile configurationFile = ConfigManager.getConfigFile();
if (!configurationFile.getBoolean(ConfPaths.LOGGING_ACTIVE))
return;
final String message = logAction.getLogMessage(player, check);
final String message = logAction.getLogMessage(check, violationData);
if (configurationFile.getBoolean(ConfPaths.LOGGING_LOGTOCONSOLE) && logAction.toConsole())
// Console logs are not colored.
System.out.println("[NoCheatPlus] " + removeColors(message));
@ -212,15 +261,14 @@ public abstract class Check {
* the player
* @return the parameter
*/
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.CHECK)
return getClass().getSimpleName();
else if (wildcard == ParameterName.PLAYER)
return player.getName();
return violationData.player.getName();
else if (wildcard == ParameterName.VIOLATIONS) {
try {
final Object data = type.getData().getDeclaredMethod("getData", Player.class).invoke(null, player);
return "" + Math.round(type.getData().getDeclaredField(type.getName() + "VL").getDouble(data));
return "" + Math.round(violationData.VL);
} catch (final Exception e) {
Bukkit.broadcastMessage("getParameter " + type.getName());
e.printStackTrace();
@ -239,9 +287,7 @@ public abstract class Check {
*/
public boolean isEnabled(final Player player) {
try {
final Object config = type.getConfig().getDeclaredMethod("getConfig", Player.class).invoke(null, player);
return !player.hasPermission(type.getPermission())
&& type.getConfig().getDeclaredField(type.getName() + "Check").getBoolean(config);
return type.isEnabled(player) && !player.hasPermission(type.getPermission());
} catch (final Exception e) {
e.printStackTrace();
}

View File

@ -0,0 +1,7 @@
package fr.neatmonster.nocheatplus.checks;
public interface CheckConfig {
public boolean isEnabled(CheckType checkType);
}

View File

@ -0,0 +1,9 @@
package fr.neatmonster.nocheatplus.checks;
import org.bukkit.entity.Player;
public interface CheckConfigFactory {
public CheckConfig getConfig(Player player);
}

View File

@ -0,0 +1,15 @@
package fr.neatmonster.nocheatplus.checks;
/**
* This is for future purposes. Might remove...<br>
* Some checks in NoPwnage synchronize over data, so using this from exectueActions can deadlock (!).<br>
* One might think of making this an interface not for the internally used data, but for copy of data for external use only.
* Then sync could go over other objects for async access.
*
* @author mc_dev
*
*/
public interface CheckData {
}

View File

@ -0,0 +1,9 @@
package fr.neatmonster.nocheatplus.checks;
import org.bukkit.entity.Player;
public interface CheckDataFactory {
public CheckData getData(final Player player);
}

View File

@ -1,5 +1,7 @@
package fr.neatmonster.nocheatplus.checks;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.blockbreak.BlockBreakConfig;
import fr.neatmonster.nocheatplus.checks.blockbreak.BlockBreakData;
import fr.neatmonster.nocheatplus.checks.blockinteract.BlockInteractConfig;
@ -27,33 +29,33 @@ import fr.neatmonster.nocheatplus.players.Permissions;
* d8888P dP
*/
/**
* Type of checks (containing configuration and data classes, name and permission).
* Type of checks (containing configuration and dataFactory classes, name and permission).
*/
public enum CheckType {
ALL,
BLOCKBREAK(BlockBreakConfig.class, BlockBreakData.class),
BLOCKBREAK(BlockBreakConfig.factory, BlockBreakData.factory),
BLOCKBREAK_DIRECTION(BLOCKBREAK, "direction", Permissions.BLOCKBREAK_DIRECTION),
BLOCKBREAK_FASTBREAK(BLOCKBREAK, "fastBreak", Permissions.BLOCKBREAK_FASTBREAK),
BLOCKBREAK_NOSWING(BLOCKBREAK, "noSwing", Permissions.BLOCKBREAK_NOSWING),
BLOCKBREAK_REACH(BLOCKBREAK, "reach", Permissions.BLOCKBREAK_REACH),
BLOCKINTERACT(BlockInteractConfig.class, BlockInteractData.class),
BLOCKINTERACT(BlockInteractConfig.factory, BlockInteractData.factory),
BLOCKINTERACT_DIRECTION(BLOCKINTERACT, "direction", Permissions.BLOCKINTERACT_DIRECTION),
BLOCKINTERACT_REACH(BLOCKINTERACT, "reach", Permissions.BLOCKINTERACT_REACH),
BLOCKPLACE(BlockPlaceConfig.class, BlockPlaceData.class),
BLOCKPLACE(BlockPlaceConfig.factory, BlockPlaceData.factory),
BLOCKPLACE_DIRECTION(BLOCKPLACE, "direction", Permissions.BLOCKPLACE_DIRECTION),
BLOCKPLACE_FASTPLACE(BLOCKPLACE, "fastPlace", Permissions.BLOCKPLACE_FASTPLACE),
BLOCKPLACE_NOSWING(BLOCKPLACE, "noSwing", Permissions.BLOCKPLACE_NOSWING),
BLOCKPLACE_REACH(BLOCKPLACE, "reach", Permissions.BLOCKBREAK_REACH),
BLOCKPLACE_SPEED(BLOCKPLACE, "speed", Permissions.BLOCKPLACE_SPEED),
CHAT(ChatConfig.class, ChatData.class),
CHAT(ChatConfig.factory, ChatData.factory),
CHAT_COLOR(CHAT, "color", Permissions.CHAT_COLOR),
CHAT_NOPWNAGE(CHAT, "noPwnage", Permissions.CHAT_NOPWNAGE),
FIGHT(FightConfig.class, FightData.class),
FIGHT(FightConfig.factory, FightData.factory),
FIGHT_ANGLE(FIGHT, "angle", Permissions.FIGHT_ANGLE),
FIGHT_CRITICAL(FIGHT, "critical", Permissions.FIGHT_CRITICAL),
FIGHT_DIRECTION(FIGHT, "direction", Permissions.FIGHT_DIRECTION),
@ -64,12 +66,12 @@ public enum CheckType {
FIGHT_REACH(FIGHT, "reach", Permissions.FIGHT_REACH),
FIGHT_SPEED(FIGHT, "speed", Permissions.FIGHT_SPEED),
INVENTORY(InventoryConfig.class, InventoryData.class),
INVENTORY(InventoryConfig.factory, InventoryData.factory),
INVENTORY_DROP(INVENTORY, "drop", Permissions.INVENTORY_DROP),
INVENTORY_INSTANTBOW(INVENTORY, "instantBow", Permissions.INVENTORY_INSTANTBOW),
INVENTORY_INSTANTEAT(INVENTORY, "instantEat", Permissions.INVENTORY_INSTANTEAT),
MOVING(MovingConfig.class, MovingData.class),
MOVING(MovingConfig.factory, MovingData.factory),
MOVING_CREATIVEFLY(MOVING, "creativeFly", Permissions.MOVING_CREATIVEFLY),
MOVING_MOREPACKETS(MOVING, "morePackets", Permissions.MOVING_MOREPACKETS),
MOVING_MOREPACKETSVEHICLE(MOVING, "morePacketsVehicle", Permissions.MOVING_MOREPACKETSVEHICLE),
@ -81,11 +83,11 @@ public enum CheckType {
/** The group. */
public final CheckType group;
/** The config. */
public final Class<?> config;
/** The configFactory. */
public final CheckConfigFactory configFactory;
/** The data. */
public final Class<?> data;
/** The dataFactory. */
public final CheckDataFactory dataFactory;
/** The name. */
public final String name;
@ -105,20 +107,20 @@ public enum CheckType {
*
* @param group
* the group
* @param config
* the config class
* @param data
* the data class
* @param configFactory
* the configFactory class
* @param dataFactory
* the dataFactory class
* @param name
* the name
* @param permission
* the permission
*/
private CheckType(final CheckType group, final Class<?> config, final Class<?> data, final String name,
private CheckType(final CheckType group, final CheckConfigFactory configFactory, CheckDataFactory dataFactory, final String name,
final String permission) {
this.group = group;
this.config = config;
this.data = data;
this.configFactory = configFactory;
this.dataFactory = dataFactory;
this.name = name;
this.permission = permission;
}
@ -134,37 +136,37 @@ public enum CheckType {
* the permission
*/
private CheckType(final CheckType group, final String name, final String permission) {
this(group, group.getConfig(), group.getData(), name, permission);
this(group, group.getConfigFactory(), group.getDataFactory(), name, permission);
}
/**
* Instantiates a new check type.
*
* @param config
* the config
* @param data
* the data
* @param configFactory
* the configFactory
* @param dataFactory
* the dataFactory
*/
private CheckType(final Class<?> config, final Class<?> data) {
this(null, config, data, null, null);
private CheckType(final CheckConfigFactory configFactory, final CheckDataFactory dataFactory) {
this(null, configFactory, dataFactory, null, null);
}
/**
* Gets the config class.
* Gets the configFactory class.
*
* @return the config class
* @return the configFactory class
*/
public Class<?> getConfig() {
return config;
public CheckConfigFactory getConfigFactory() {
return configFactory;
}
/**
* Gets the data class.
* Gets the dataFactory class.
*
* @return the data class
* @return the dataFactory class
*/
public Class<?> getData() {
return data;
public CheckDataFactory getDataFactory() {
return dataFactory;
}
/**
@ -184,4 +186,15 @@ public enum CheckType {
public String getPermission() {
return permission;
}
/**
* Check if the check is enabled by configuration (no permission check).
* @param player
* @return
*/
public final boolean isEnabled(final Player player){
// if (configFactory == null) return true; // TODO: maybe leave this out.
return configFactory.getConfig(player).isEnabled(this);
}
}

View File

@ -1,6 +1,5 @@
package fr.neatmonster.nocheatplus.checks;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
@ -13,17 +12,15 @@ public class ExecuteActionsEvent extends Event {
private static final HandlerList handlers = new HandlerList();
private final Check check;
final Player player;
private final ViolationData violationData;
/**
* If the actions have been executed already.
*/
private boolean actionsExecuted = false;
private boolean cancel = false;
public ExecuteActionsEvent(final Check check, final Player player){
this.check = check;
this.player = player;
public ExecuteActionsEvent(final ViolationData violationData){
this.violationData = violationData;
}
@Override
@ -41,7 +38,7 @@ public class ExecuteActionsEvent extends Event {
public void executeActions(){
if (actionsExecuted) return;
cancel = check.executeActions(player);
cancel = violationData.check.executeActions(violationData);
actionsExecuted = true;
}

View File

@ -0,0 +1,27 @@
package fr.neatmonster.nocheatplus.checks;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
/**
* Violation specific dataFactory, for executing actions.<br>
* This is meant to capture a violation incident in a potentially thread safe way (!).
* @author mc_dev
*
*/
public class ViolationData {
public final Check check;
public final Player player;
public final double VL;
public final ActionList actions;
public ViolationData(final Check check, final Player player, final double VL, final ActionList actions){
this.check = check;
this.player = player;
this.VL = VL;
this.actions = actions;
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.CheckConfig;
import fr.neatmonster.nocheatplus.checks.CheckConfigFactory;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigFile;
import fr.neatmonster.nocheatplus.config.ConfigManager;
@ -33,7 +36,14 @@ import fr.neatmonster.nocheatplus.players.Permissions;
* Configurations specific for the block break checks. Every world gets one of these assigned to it, or if a world
* doesn't get it's own, it will use the "global" version.
*/
public class BlockBreakConfig {
public class BlockBreakConfig implements CheckConfig{
public static final CheckConfigFactory factory = new CheckConfigFactory(){
@Override
public final CheckConfig getConfig(final Player player) {
return BlockBreakConfig.getConfig(player);
}
};
/** The map containing the configurations per world. */
private static Map<String, BlockBreakConfig> worldsMap = new HashMap<String, BlockBreakConfig>();
@ -77,8 +87,8 @@ public class BlockBreakConfig {
/**
* Instantiates a new block break configuration.
*
* @param data
* the data
* @param dataFactory
* the dataFactory
*/
public BlockBreakConfig(final ConfigFile data) {
directionCheck = data.getBoolean(ConfPaths.BLOCKBREAK_DIRECTION_CHECK);
@ -96,4 +106,20 @@ public class BlockBreakConfig {
reachCheck = data.getBoolean(ConfPaths.BLOCKBREAK_REACH_CHECK);
reachActions = data.getActionList(ConfPaths.BLOCKBREAK_REACH_ACTIONS, Permissions.BLOCKBREAK_REACH);
}
@Override
public final boolean isEnabled(final CheckType checkType) {
switch(checkType){
case BLOCKBREAK_DIRECTION:
return directionCheck;
case BLOCKBREAK_FASTBREAK:
return fastBreakCheck;
case BLOCKBREAK_NOSWING:
return noSwingCheck;
case BLOCKBREAK_REACH:
return reachCheck;
default:
return true;
}
}
}

View File

@ -5,6 +5,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.CheckData;
import fr.neatmonster.nocheatplus.checks.CheckDataFactory;
/*
* M#"""""""'M dP dP M#"""""""'M dP
* ## mmmm. `M 88 88 ## mmmm. `M 88
@ -25,7 +28,14 @@ import org.bukkit.entity.Player;
/**
* Player specific data for the block break checks.
*/
public class BlockBreakData {
public class BlockBreakData implements CheckData {
public static final CheckDataFactory factory = new CheckDataFactory(){
@Override
public final CheckData getData(final Player player) {
return BlockBreakData.getData(player);
}
};
/** The map containing the data per players. */
private static Map<String, BlockBreakData> playersMap = new HashMap<String, BlockBreakData>();
@ -59,4 +69,6 @@ public class BlockBreakData {
// Data of the reach check.
public double reachDistance;
}

View File

@ -59,7 +59,7 @@ public class Direction extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.directionVL, BlockBreakConfig.getConfig(player).directionActions);
} else
// Player did likely nothing wrong, reduce violation counter to reward him.
data.directionVL *= 0.9D;

View File

@ -73,7 +73,7 @@ public class FastBreak extends Check {
data.fastBreakVL += Math.max(timeLimit - elapsedTime, 0D);
// Cancel the event if needed.
cancel = executeActions(player);
cancel = executeActions(player, data.fastBreakVL, cc.fastBreakActions);
} else
// Remove one from the buffer.
data.fastBreakBuffer--;

View File

@ -51,7 +51,7 @@ public class NoSwing extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.noSwingVL, BlockBreakConfig.getConfig(player).noSwingActions);
}
return cancel;

View File

@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.CheckUtils;
/*
@ -66,7 +67,7 @@ public class Reach extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.reachVL, BlockBreakConfig.getConfig(player).reachActions);
} else
// Player passed the check, reward him.
data.reachVL *= 0.9D;
@ -78,10 +79,10 @@ public class Reach extends Check {
* @see fr.neatmonster.nocheatplus.checks.Check#getParameter(fr.neatmonster.nocheatplus.actions.ParameterName, org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.REACH_DISTANCE)
return String.valueOf(Math.round(BlockBreakData.getData(player).reachDistance));
return String.valueOf(Math.round(BlockBreakData.getData(violationData.player).reachDistance));
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.CheckConfig;
import fr.neatmonster.nocheatplus.checks.CheckConfigFactory;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigFile;
import fr.neatmonster.nocheatplus.config.ConfigManager;
@ -33,7 +36,14 @@ import fr.neatmonster.nocheatplus.players.Permissions;
* Configurations specific for the block interact checks. Every world gets one of these assigned to it, or if a world
* doesn't get it's own, it will use the "global" version.
*/
public class BlockInteractConfig {
public class BlockInteractConfig implements CheckConfig {
public static final CheckConfigFactory factory = new CheckConfigFactory(){
@Override
public final CheckConfig getConfig(final Player player) {
return BlockInteractConfig.getConfig(player);
}
};
/** The map containing the configurations per world. */
private static Map<String, BlockInteractConfig> worldsMap = new HashMap<String, BlockInteractConfig>();
@ -68,8 +78,8 @@ public class BlockInteractConfig {
/**
* Instantiates a new block interact configuration.
*
* @param data
* the data
* @param dataFactory
* the dataFactory
*/
public BlockInteractConfig(final ConfigFile data) {
directionCheck = data.getBoolean(ConfPaths.BLOCKINTERACT_DIRECTION_CHECK);
@ -79,4 +89,16 @@ public class BlockInteractConfig {
reachCheck = data.getBoolean(ConfPaths.BLOCKINTERACT_REACH_CHECK);
reachActions = data.getActionList(ConfPaths.BLOCKINTERACT_REACH_ACTIONS, Permissions.BLOCKINTERACT_REACH);
}
@Override
public final boolean isEnabled(final CheckType checkType) {
switch(checkType){
case BLOCKINTERACT_DIRECTION:
return directionCheck;
case BLOCKINTERACT_REACH:
return reachCheck;
default:
return true;
}
}
}

View File

@ -5,6 +5,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.CheckData;
import fr.neatmonster.nocheatplus.checks.CheckDataFactory;
/*
* M#"""""""'M dP dP M""M dP dP
* ## mmmm. `M 88 88 M M 88 88
@ -23,19 +26,26 @@ import org.bukkit.entity.Player;
* MMMMMMMMMMM
*/
/**
* Player specific data for the block interact checks.
* Player specific dataFactory for the block interact checks.
*/
public class BlockInteractData {
public class BlockInteractData implements CheckData {
public static final CheckDataFactory factory = new CheckDataFactory(){
@Override
public final CheckData getData(final Player player) {
return BlockInteractData.getData(player);
}
};
/** The map containing the data per players. */
/** The map containing the dataFactory per players. */
private static Map<String, BlockInteractData> playersMap = new HashMap<String, BlockInteractData>();
/**
* Gets the data of a specified player.
* Gets the dataFactory of a specified player.
*
* @param player
* the player
* @return the data
* @return the dataFactory
*/
public static BlockInteractData getData(final Player player) {
if (!playersMap.containsKey(player.getName()))

View File

@ -59,7 +59,7 @@ public class Direction extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.directionVL, BlockInteractConfig.getConfig(player).directionActions);
} else
// Player did likely nothing wrong, reduce violation counter to reward him.
data.directionVL *= 0.9D;

View File

@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.CheckUtils;
/*
@ -66,7 +67,7 @@ public class Reach extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.reachVL, BlockInteractConfig.getConfig(player).reachActions);
} else
// Player passed the check, reward him.
data.reachVL *= 0.9D;
@ -78,10 +79,10 @@ public class Reach extends Check {
* @see fr.neatmonster.nocheatplus.checks.Check#getParameter(fr.neatmonster.nocheatplus.actions.ParameterName, org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.REACH_DISTANCE)
return String.valueOf(Math.round(BlockInteractData.getData(player).reachDistance));
return String.valueOf(Math.round(BlockInteractData.getData(violationData.player).reachDistance));
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.CheckConfig;
import fr.neatmonster.nocheatplus.checks.CheckConfigFactory;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigFile;
import fr.neatmonster.nocheatplus.config.ConfigManager;
@ -33,7 +36,14 @@ import fr.neatmonster.nocheatplus.players.Permissions;
* Configurations specific for the block place checks. Every world gets one of these assigned to it, or if a world
* doesn't get it's own, it will use the "global" version.
*/
public class BlockPlaceConfig {
public class BlockPlaceConfig implements CheckConfig {
public static final CheckConfigFactory factory = new CheckConfigFactory(){
@Override
public final CheckConfig getConfig(final Player player) {
return BlockPlaceConfig.getConfig(player);
}
};
/** The map containing the configurations per world. */
private static Map<String, BlockPlaceConfig> worldsMap = new HashMap<String, BlockPlaceConfig>();
@ -80,8 +90,8 @@ public class BlockPlaceConfig {
/**
* Instantiates a new block place configuration.
*
* @param data
* the data
* @param dataFactory
* the dataFactory
*/
public BlockPlaceConfig(final ConfigFile data) {
directionCheck = data.getBoolean(ConfPaths.BLOCKPLACE_DIRECTION_CHECK);
@ -102,4 +112,22 @@ public class BlockPlaceConfig {
speedInterval = data.getLong(ConfPaths.BLOCKPLACE_SPEED_INTERVAL);
speedActions = data.getActionList(ConfPaths.BLOCKPLACE_SPEED_ACTIONS, Permissions.BLOCKPLACE_SPEED);
}
@Override
public final boolean isEnabled(final CheckType checkType) {
switch(checkType){
case BLOCKPLACE_DIRECTION:
return directionCheck;
case BLOCKPLACE_FASTPLACE:
return fastPlaceCheck;
case BLOCKPLACE_NOSWING:
return noSwingCheck;
case BLOCKPLACE_REACH:
return reachCheck;
case BLOCKPLACE_SPEED:
return speedCheck;
default:
return true;
}
}
}

View File

@ -5,6 +5,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.CheckData;
import fr.neatmonster.nocheatplus.checks.CheckDataFactory;
/*
* M#"""""""'M dP dP MM"""""""`YM dP
* ## mmmm. `M 88 88 MM mmmmm M 88
@ -23,19 +26,26 @@ import org.bukkit.entity.Player;
* MMMMMMMMMMM
*/
/**
* Player specific data for the block place checks.
* Player specific dataFactory for the block place checks.
*/
public class BlockPlaceData {
public class BlockPlaceData implements CheckData {
public static final CheckDataFactory factory = new CheckDataFactory(){
@Override
public final CheckData getData(final Player player) {
return BlockPlaceData.getData(player);
}
};
/** The map containing the data per players. */
/** The map containing the dataFactory per players. */
private static Map<String, BlockPlaceData> playersMap = new HashMap<String, BlockPlaceData>();
/**
* Gets the data of a specified player.
* Gets the dataFactory of a specified player.
*
* @param player
* the player
* @return the data
* @return the dataFactory
*/
public static BlockPlaceData getData(final Player player) {
if (!playersMap.containsKey(player.getName()))

View File

@ -82,7 +82,7 @@ public class Direction extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.directionVL, BlockPlaceConfig.getConfig(player).directionActions);
} else
// Player did likely nothing wrong, reduce violation counter to reward him.
data.directionVL *= 0.9D;

View File

@ -52,7 +52,7 @@ public class FastPlace extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if
// we should cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.fastPlaceVL, cc.fastPlaceActions);
}
data.fastPlaceLastRefused = true;

View File

@ -51,7 +51,7 @@ public class NoSwing extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.noSwingVL, BlockPlaceConfig.getConfig(player).noSwingActions);
}
return cancel;

View File

@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.CheckUtils;
/*
@ -66,7 +67,7 @@ public class Reach extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.reachVL, BlockPlaceConfig.getConfig(player).reachActions);
} else
// Player passed the check, reward him.
data.reachVL *= 0.9D;
@ -78,10 +79,10 @@ public class Reach extends Check {
* @see fr.neatmonster.nocheatplus.checks.Check#getParameter(fr.neatmonster.nocheatplus.actions.ParameterName, org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.REACH_DISTANCE)
return String.valueOf(Math.round(BlockPlaceData.getData(player).reachDistance));
return String.valueOf(Math.round(BlockPlaceData.getData(violationData.player).reachDistance));
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -48,7 +48,7 @@ public class Speed extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we
// should cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.speedVL, cc.speedActions);
}
data.speedLastRefused = true;

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.CheckConfig;
import fr.neatmonster.nocheatplus.checks.CheckConfigFactory;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigFile;
import fr.neatmonster.nocheatplus.config.ConfigManager;
@ -25,11 +28,18 @@ import fr.neatmonster.nocheatplus.players.Permissions;
* Configurations specific for the "chat" checks. Every world gets one of these assigned to it, or if a world doesn't
* get it's own, it will use the "global" version.
*/
public class ChatConfig {
public class ChatConfig implements CheckConfig{
public static final CheckConfigFactory factory = new CheckConfigFactory(){
@Override
public final CheckConfig getConfig(final Player player) {
return ChatConfig.getConfig(player);
}
};
/** The map containing the configurations per world. */
private static Map<String, ChatConfig> worldsMap = new HashMap<String, ChatConfig>();
/**
* Clear all the configurations.
*/
@ -117,8 +127,8 @@ public class ChatConfig {
/**
* Instantiates a new chat configuration.
*
* @param data
* the data
* @param dataFactory
* the dataFactory
*/
public ChatConfig(final ConfigFile data) {
colorCheck = data.getBoolean(ConfPaths.CHAT_COLOR_CHECK);
@ -180,4 +190,16 @@ public class ChatConfig {
protectPlugins = data.getBoolean(ConfPaths.MISCELLANEOUS_PROTECTPLUGINS);
}
@Override
public boolean isEnabled(CheckType checkType) {
switch(checkType){
case CHAT_COLOR:
return colorCheck;
case CHAT_NOPWNAGE:
return noPwnageCheck;
default:
return true;
}
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.CheckData;
import fr.neatmonster.nocheatplus.checks.CheckDataFactory;
/*
* MM'""""'YMM dP dP M""""""'YMM dP
* M' .mmm. `M 88 88 M mmmm. `M 88
@ -16,19 +19,26 @@ import org.bukkit.entity.Player;
* MMMMMMMMMMM MMMMMMMMMMM
*/
/**
* Player specific data for the chat checks.
* Player specific dataFactory for the chat checks.
*/
public class ChatData {
public class ChatData implements CheckData{
public static final CheckDataFactory factory = new CheckDataFactory(){
@Override
public final CheckData getData(final Player player) {
return ChatData.getData(player);
}
};
/** The map containing the data per players. */
/** The map containing the dataFactory per players. */
private static Map<String, ChatData> playersMap = new HashMap<String, ChatData>();
/**
* Gets the data of a specified player.
* Gets the dataFactory of a specified player.
*
* @param player
* the player
* @return the data
* @return the dataFactory
*/
public synchronized static ChatData getData(final Player player) {
if (!playersMap.containsKey(player.getName()))
@ -56,12 +66,14 @@ public class ChatData {
public long noPwnageReloginWarningTime;
/**
* Clear the data of the no pwnage check.
* Clear the dataFactory of the no pwnage check.
*/
public synchronized void clearNoPwnageData() {
// TODO: re-think this sync [keep related to ChatData/NoPwnage/Color used lock.]
noPwnageCaptchTries = noPwnageReloginWarnings = 0;
noPwnageJoinTime = noPwnageLastMessageTime = noPwnageLastMovedTime = noPwnageLastWarningTime = noPwnageLeaveTime = noPwnageReloginWarningTime = 0L;
noPwnageGeneratedCaptcha = noPwnageLastMessage = "";
noPwnageLastLocation = null;
}
}

View File

@ -53,8 +53,8 @@ public class ChatListener implements Listener {
// First the color check.
if (color.isEnabled(player))
event.setMessage(color.check(player, event.getMessage()));
event.setMessage(color.check(player, event.getMessage(), false));
// Then the no pwnage check.
if (noPwnage.check(player, event, false))
player.kickPlayer(Check.removeColors(ChatConfig.getConfig(player).noPwnageKickMessage));
@ -107,7 +107,7 @@ public class ChatListener implements Listener {
// First the color check.
if (color.isEnabled(player))
event.setMessage(color.check(player, event.getMessage()));
event.setMessage(color.check(player, event.getMessage(), true));
// Then the no pwnage check.
if (noPwnage.check(player, event, true))
@ -135,7 +135,7 @@ public class ChatListener implements Listener {
final ChatConfig cc = ChatConfig.getConfig(player);
// Execute the no pwnage check.
if (noPwnage.isEnabled(player) && noPwnage.check(player))
if (noPwnage.isEnabled(player) && noPwnage.checkLogin(player))
event.disallow(Result.KICK_OTHER, cc.noPwnageReloginKickMessage);
}
}

View File

@ -35,18 +35,19 @@ public class Color extends Check {
* the message
* @return the string
*/
public String check(final Player player, final String message) {
public String check(final Player player, final String message, final boolean isMainThread) {
final ChatData data = ChatData.getData(player);
synchronized(data){ // [keep related to ChatData/NoPwnage/Color used lock.]
// If the message contains colors...
if (message.contains("\247")) {
// Increment the violation level of the player.
data.colorVL++;
// If the message contains colors...
if (message.contains("\247")) {
// Increment the violation level of the player.
data.colorVL++;
// Find out if we need to remove the colors or not.
if (executeActions(player))
// Remove color codes.
message.replaceAll("\302\247.", "").replaceAll("\247.", "");
// Find out if we need to remove the colors or not.
if (executeActionsThreadSafe(player, data.colorVL, ChatConfig.getConfig(player).colorActions, isMainThread))
// Remove color codes.
message.replaceAll("\302\247.", "").replaceAll("\247.", "");
}
}
return message;

View File

@ -9,9 +9,10 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerEvent;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ExecuteActionsEvent;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.CheckUtils;
/*
@ -67,15 +68,15 @@ public class NoPwnage extends Check {
* the player
* @return true, if successful
*/
public boolean check(final Player player) {
public boolean checkLogin(final Player player) {
if (!isEnabled(player)) return false;
final ChatConfig cc = ChatConfig.getConfig(player);
final ChatData data = ChatData.getData(player);
synchronized(data){
return unsafeCheck(player, cc, data);
synchronized(data){ // [keep related to ChatData/NoPwnage/Color used lock.]
return unsafeLoginCheck(player, cc, data);
}
}
@ -83,10 +84,10 @@ public class NoPwnage extends Check {
* Check (Join), only call from synchronized code.
* @param player
* @param cc
* @param data
* @param dataFactory
* @return
*/
private boolean unsafeCheck(final Player player, final ChatConfig cc, final ChatData data) {
private boolean unsafeLoginCheck(final Player player, final ChatConfig cc, final ChatData data) {
boolean cancel = false;
final long now = System.currentTimeMillis();
@ -103,10 +104,11 @@ public class NoPwnage extends Check {
data.noPwnageReloginWarnings++;
} else if (now - data.noPwnageReloginWarningTime < cc.noPwnageReloginWarningTimeout)
// Find out if we need to ban the player or not.
cancel = executeActionsThreadSafe(player, true);
// TODO: extra actions / VL ?
cancel = executeActionsThreadSafe(player, data.noPwnageVL, cc.noPwnageActions, true);
}
// Store his location and some other data.
// Store his location and some other dataFactory.
data.noPwnageLastLocation = player.getLocation();
data.noPwnageJoinTime = now;
@ -129,7 +131,7 @@ public class NoPwnage extends Check {
final ChatConfig cc = ChatConfig.getConfig(player);
final ChatData data = ChatData.getData(player);
synchronized(data){
synchronized(data){ // [keep related to ChatData/NoPwnage/Color used lock.]
return unsafeCheck(player, event, isMainThread, cc, data);
}
}
@ -140,7 +142,7 @@ public class NoPwnage extends Check {
* @param event
* @param isMainThread
* @param cc
* @param data
* @param dataFactory
* @return
*/
private boolean unsafeCheck(final Player player, final PlayerEvent event, final boolean isMainThread, final ChatConfig cc, final ChatData data) {
@ -160,7 +162,7 @@ public class NoPwnage extends Check {
if (cc.noPwnageCaptchaCheck && data.noPwnageHasStartedCaptcha) {
// Correct answer to the captcha?
if (message.equals(data.noPwnageGeneratedCaptcha)) {
// Yes, clear his data and do not worry anymore about him.
// Yes, clear his dataFactory and do not worry anymore about him.
data.clearNoPwnageData();
data.noPwnageHasFilledCaptcha = true;
player.sendMessage(replaceColors(cc.noPwnageCaptchaSuccess));
@ -168,7 +170,8 @@ public class NoPwnage extends Check {
// Does he failed too much times?
if (data.noPwnageCaptchTries > cc.noPwnageCaptchaTries)
// Find out if we need to ban the player or not.
cancel = executeActionsThreadSafe(player, isMainThread);
// TODO: Extra captcha actions / VL ?
cancel = executeActionsThreadSafe(player, data.noPwnageVL, cc.noPwnageActions, isMainThread);
// Increment his tries number counter.
data.noPwnageCaptchTries++;
@ -265,10 +268,10 @@ public class NoPwnage extends Check {
((PlayerCommandPreprocessEvent) event).setCancelled(true);
// Find out if we need to ban the player or not.
cancel = executeActionsThreadSafe(player, isMainThread);
cancel = executeActionsThreadSafe(player, data.noPwnageVL, cc.noPwnageActions, isMainThread);
}
// Store the message and some other data.
// Store the message and some other dataFactory.
data.noPwnageLastMessage = message;
data.noPwnageLastMessageTime = now;
lastGlobalMessage = message;
@ -277,51 +280,30 @@ public class NoPwnage extends Check {
return cancel;
}
@Override
public final boolean executeActions(final Player player){
// To be called from synchronized code (ChatData).
// Late check of bypass permissions:
// (One might use a bypass flag, set if its already been checked and then reset.)
if (!isEnabled(player)) return false;
return super.executeActions(player);
}
/**
* Execute actions from another thread (not the main thread).<br>
* This does not use extra synchronization.
* @param player
* @param actions
* @param VL
* @return
*/
public final boolean executeActionsThreadSafe(final Player player, boolean isMainThread){
if (isMainThread){
// Just execute.
if (executeActions(player)){
ChatData.getData(player).clearNoPwnageData();
return true;
}
else
return false;
}
else {
// Sync it into the main thread by using an event.
final ExecuteActionsEvent event = new ExecuteActionsEvent(this, player);
Bukkit.getPluginManager().callEvent(event);
final boolean cancel = event.getCancel();
if (cancel) ChatData.getData(player).clearNoPwnageData();
return cancel;
}
public final boolean executeActionsThreadSafe(final Player player, double VL, ActionList actions, boolean isMainThread){
final boolean cancel = super.executeActionsThreadSafe(player, VL, actions, isMainThread);
if (cancel) ChatData.getData(player).clearNoPwnageData();
return cancel;
}
/* (non-Javadoc)
* @see fr.neatmonster.nocheatplus.checks.Check#getParameter(fr.neatmonster.nocheatplus.actions.ParameterName, org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.IP)
return player.getAddress().toString().substring(1).split(":")[0];
return violationData.player.getAddress().toString().substring(1).split(":")[0];
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -54,7 +54,7 @@ public class Angle extends Check {
// Add the new location to the map.
data.angleHits.put(System.currentTimeMillis(), player.getLocation());
// Not enough data to calculate deltas.
// Not enough dataFactory to calculate deltas.
if (data.angleHits.size() < 2)
return false;
@ -118,7 +118,7 @@ public class Angle extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.angleVL, cc.angleActions);
} else
// Reward the player by lowering his violation level.
data.angleVL *= 0.98D;

View File

@ -67,7 +67,7 @@ public class Critical extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we
// should cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.criticalVL, cc.criticalActions);
}
return cancel;

View File

@ -75,7 +75,7 @@ public class Direction extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.directionVL, cc.directionActions);
if (cancel)
// If we should cancel, remember the current time too.

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.CheckConfig;
import fr.neatmonster.nocheatplus.checks.CheckConfigFactory;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigFile;
import fr.neatmonster.nocheatplus.config.ConfigManager;
@ -25,7 +28,14 @@ import fr.neatmonster.nocheatplus.players.Permissions;
* Configurations specific for the "fight" checks. Every world gets one of these assigned to it, or if a world doesn't
* get it's own, it will use the "global" version.
*/
public class FightConfig {
public class FightConfig implements CheckConfig {
public static final CheckConfigFactory factory = new CheckConfigFactory(){
@Override
public final CheckConfig getConfig(final Player player) {
return FightConfig.getConfig(player);
}
};
/** The map containing the configurations per world. */
private static Map<String, FightConfig> worldsMap = new HashMap<String, FightConfig>();
@ -88,8 +98,8 @@ public class FightConfig {
/**
* Instantiates a new fight configuration.
*
* @param data
* the data
* @param dataFactory
* the dataFactory
*/
public FightConfig(final ConfigFile data) {
angleCheck = data.getBoolean(ConfPaths.FIGHT_ANGLE_CHECK);
@ -126,4 +136,30 @@ public class FightConfig {
speedLimit = data.getInt(ConfPaths.FIGHT_SPEED_LIMIT);
speedActions = data.getActionList(ConfPaths.FIGHT_SPEED_ACTIONS, Permissions.FIGHT_SPEED);
}
@Override
public final boolean isEnabled(final CheckType checkType) {
switch(checkType){
case FIGHT_ANGLE:
return angleCheck;
case FIGHT_CRITICAL:
return criticalCheck;
case FIGHT_DIRECTION:
return directionCheck;
case FIGHT_GODMODE:
return godModeCheck;
case FIGHT_INSTANTHEAL:
return instantHealCheck;
case FIGHT_KNOCKBACK:
return knockbackCheck;
case FIGHT_NOSWING:
return noSwingCheck;
case FIGHT_REACH:
return reachCheck;
case FIGHT_SPEED:
return speedCheck;
default:
return true;
}
}
}

View File

@ -7,6 +7,9 @@ import java.util.TreeMap;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.CheckData;
import fr.neatmonster.nocheatplus.checks.CheckDataFactory;
/*
* MM""""""""`M oo dP dP M""""""'YMM dP
* MM mmmmmmmM 88 88 M mmmm. `M 88
@ -18,19 +21,26 @@ import org.bukkit.entity.Player;
* d8888P
*/
/**
* Player specific data for the fight checks.
* Player specific dataFactory for the fight checks.
*/
public class FightData {
public class FightData implements CheckData {
public static final CheckDataFactory factory = new CheckDataFactory(){
@Override
public final CheckData getData(final Player player) {
return FightData.getData(player);
}
};
/** The map containing the data per players. */
/** The map containing the dataFactory per players. */
private static Map<String, FightData> playersMap = new HashMap<String, FightData>();
/**
* Gets the data of a specified player.
* Gets the dataFactory of a specified player.
*
* @param player
* the player
* @return the data
* @return the dataFactory
*/
public static FightData getData(final Player player) {
if (!playersMap.containsKey(player.getName()))

View File

@ -63,7 +63,7 @@ public class GodMode extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if
// we should cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.godModeVL, FightConfig.getConfig(player).godModeActions);
}
} else {
// Give some new points, once a second.

View File

@ -56,7 +56,7 @@ public class InstantHeal extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.instantHealVL, FightConfig.getConfig(player).instantHealActions);
} else
// Decrease the violation level.
data.instantHealVL *= 0.9D;

View File

@ -56,7 +56,7 @@ public class Knockback extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.knockbackVL, cc.knockbackActions);
}
return cancel;

View File

@ -50,7 +50,7 @@ public class NoSwing extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.noSwingVL, FightConfig.getConfig(player).noSwingActions);
}
return cancel;

View File

@ -67,7 +67,7 @@ public class Reach extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.reachVL, cc.reachActions);
if (cancel)
// If we should cancel, remember the current time too.

View File

@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.LagMeasureTask;
/*
@ -60,7 +61,7 @@ public class Speed extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.speedVL, cc.speedActions);
}
return cancel;
@ -70,10 +71,10 @@ public class Speed extends Check {
* @see fr.neatmonster.nocheatplus.checks.Check#getParameter(fr.neatmonster.nocheatplus.actions.ParameterName, org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.LIMIT)
return String.valueOf(Math.round(FightConfig.getConfig(player).speedLimit));
return String.valueOf(Math.round(FightConfig.getConfig(violationData.player).speedLimit));
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -60,7 +60,7 @@ public class Drop extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.dropVL, cc.dropActions);
}
return cancel;

View File

@ -55,7 +55,7 @@ public class InstantBow extends Check {
// Execute whatever actions are associated with this check and the
// violation level and find out if we should cancel the event
cancel = executeActions(player);
cancel = executeActions(player, data.instantBowVL, InventoryConfig.getConfig(player).instantBowActions);
}
return cancel;

View File

@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
/*
* M""M dP dP MM""""""""`M dP
@ -60,7 +61,7 @@ public class InstantEat extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
cancel = executeActions(player);
cancel = executeActions(player, data.instantEatVL, InventoryConfig.getConfig(player).instantEatActions);
}
return cancel;
@ -70,10 +71,10 @@ public class InstantEat extends Check {
* @see fr.neatmonster.nocheatplus.checks.Check#getParameter(fr.neatmonster.nocheatplus.actions.ParameterName, org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.FOOD)
return InventoryData.getData(player).instantEatFood.toString();
return InventoryData.getData(violationData.player).instantEatFood.toString();
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.CheckConfig;
import fr.neatmonster.nocheatplus.checks.CheckConfigFactory;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigFile;
import fr.neatmonster.nocheatplus.config.ConfigManager;
@ -34,7 +37,14 @@ import fr.neatmonster.nocheatplus.players.Permissions;
* Configurations specific for the "inventory" checks. Every world gets one of these assigned to it, or if a world
* doesn't get it's own, it will use the "global" version.
*/
public class InventoryConfig {
public class InventoryConfig implements CheckConfig {
public static final CheckConfigFactory factory = new CheckConfigFactory(){
@Override
public final CheckConfig getConfig(final Player player) {
return InventoryConfig.getConfig(player);
}
};
/** The map containing the configurations per world. */
private static Map<String, InventoryConfig> worldsMap = new HashMap<String, InventoryConfig>();
@ -74,8 +84,8 @@ public class InventoryConfig {
/**
* Instantiates a new inventory configuration.
*
* @param data
* the data
* @param dataFactory
* the dataFactory
*/
public InventoryConfig(final ConfigFile data) {
dropCheck = data.getBoolean(ConfPaths.INVENTORY_DROP_CHECK);
@ -91,4 +101,20 @@ public class InventoryConfig {
instantEatActions = data
.getActionList(ConfPaths.INVENTORY_INSTANTEAT_ACTIONS, Permissions.INVENTORY_INSTANTEAT);
}
@Override
public final boolean isEnabled(final CheckType checkType) {
switch(checkType){
case INVENTORY_DROP:
return dropCheck;
case INVENTORY_INSTANTBOW:
return instantBowCheck;
case INVENTORY_INSTANTEAT:
return instantEatCheck;
default:
return true;
}
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.CheckData;
import fr.neatmonster.nocheatplus.checks.CheckDataFactory;
/*
* M""M dP M""""""'YMM dP
* M M 88 M mmmm. `M 88
@ -17,19 +20,26 @@ import org.bukkit.entity.Player;
* d8888P
*/
/**
* Player specific data for the inventory checks.
* Player specific dataFactory for the inventory checks.
*/
public class InventoryData {
public class InventoryData implements CheckData {
public static final CheckDataFactory factory = new CheckDataFactory(){
@Override
public final CheckData getData(final Player player) {
return InventoryData.getData(player);
}
};
/** The map containing the data per players. */
/** The map containing the dataFactory per players. */
private static Map<String, InventoryData> playersMap = new HashMap<String, InventoryData>();
/**
* Gets the data of a specified player.
* Gets the dataFactory of a specified player.
*
* @param player
* the player
* @return the data
* @return the dataFactory
*/
public static InventoryData getData(final Player player) {
if (!playersMap.containsKey(player.getName()))

View File

@ -150,7 +150,7 @@ public class InventoryListener implements Listener {
data.instantEatFood = event.getItem().getType();
data.instantEatLastTime = System.currentTimeMillis();
} else {
// Nothing that we are interested in, reset data.
// Nothing that we are interested in, reset dataFactory.
data.instantBowLastTime = 0;
data.instantEatLastTime = 0;
data.instantEatFood = null;

View File

@ -12,6 +12,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.PlayerLocation;
/*
@ -133,7 +134,7 @@ public class CreativeFly extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we
// should
// cancel the event.
if (executeActions(player))
if (executeActions(player, data.creativeFlyVL, cc.creativeFlyActions))
// Compose a new location based on coordinates of "newTo" and viewing direction of "event.getTo()"
// to allow the player to look somewhere else despite getting pulled back by NoCheatPlus.
return new Location(player.getWorld(), data.setBack.getX(), data.setBack.getY(),
@ -156,8 +157,8 @@ public class CreativeFly extends Check {
* org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
final MovingData data = MovingData.getData(player);
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
final MovingData data = MovingData.getData(violationData.player);
if (wildcard == ParameterName.LOCATION_FROM)
return String.format(Locale.US, "%.2f, %.2f, %.2f", data.from.getX(), data.from.getY(), data.from.getZ());
else if (wildcard == ParameterName.LOCATION_TO)
@ -165,6 +166,6 @@ public class CreativeFly extends Check {
else if (wildcard == ParameterName.DISTANCE)
return String.format(Locale.US, "%.2f", data.to.subtract(data.from).lengthSquared());
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.PlayerLocation;
/*
@ -79,7 +80,7 @@ public class MorePackets extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
if (executeActions(player))
if (executeActions(player, data.morePacketsVL, MovingConfig.getConfig(player).morePacketsActions))
newTo = data.teleported = data.morePacketsSetback;
}
@ -121,10 +122,10 @@ public class MorePackets extends Check {
* org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.PACKETS)
return String.valueOf(MovingData.getData(player).morePacketsPackets);
return String.valueOf(MovingData.getData(violationData.player).morePacketsPackets);
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
/*
* M"""""`'"""`YM MM"""""""`YM dP dP
@ -78,7 +79,7 @@ public class MorePacketsVehicle extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
if (executeActions(player))
if (executeActions(player, data.morePacketsVehicleVL, MovingConfig.getConfig(player).morePacketsVehicleActions))
newTo = data.morePacketsVehicleSetback;
}
@ -120,10 +121,10 @@ public class MorePacketsVehicle extends Check {
* org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.PACKETS)
return String.valueOf(MovingData.getData(player).morePacketsVehiclePackets);
return String.valueOf(MovingData.getData(violationData.player).morePacketsVehiclePackets);
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.types.ActionList;
import fr.neatmonster.nocheatplus.checks.CheckConfig;
import fr.neatmonster.nocheatplus.checks.CheckConfigFactory;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigFile;
import fr.neatmonster.nocheatplus.config.ConfigManager;
@ -24,7 +27,14 @@ import fr.neatmonster.nocheatplus.players.Permissions;
/**
* Configurations specific for the moving checks. Every world gets one of these assigned to it.
*/
public class MovingConfig {
public class MovingConfig implements CheckConfig {
public static final CheckConfigFactory factory = new CheckConfigFactory(){
@Override
public final CheckConfig getConfig(final Player player) {
return MovingConfig.getConfig(player);
}
};
/** The map containing the configurations per world. */
private static Map<String, MovingConfig> worldsMap = new HashMap<String, MovingConfig>();
@ -81,8 +91,8 @@ public class MovingConfig {
/**
* Instantiates a new moving configuration.
*
* @param data
* the data
* @param dataFactory
* the dataFactory
*/
public MovingConfig(final ConfigFile data) {
creativeFlyCheck = data.getBoolean(ConfPaths.MOVING_CREATIVEFLY_CHECK);
@ -115,4 +125,22 @@ public class MovingConfig {
survivalFlyWaterSpeed = data.getInt(ConfPaths.MOVING_SURVIVALFLY_WATERSPEED, 100);
survivalFlyActions = data.getActionList(ConfPaths.MOVING_SURVIVALFLY_ACTIONS, Permissions.MOVING_SURVIVALFLY);
}
@Override
public final boolean isEnabled(final CheckType checkType) {
switch(checkType){
case MOVING_NOFALL:
return noFallCheck;
case MOVING_SURVIVALFLY:
return survivalFlyCheck;
case MOVING_MOREPACKETS:
return morePacketsCheck;
case MOVING_MOREPACKETSVEHICLE:
return morePacketsVehicleCheck;
case MOVING_CREATIVEFLY:
return creativeFlyCheck;
default:
return true;
}
}
}

View File

@ -6,6 +6,9 @@ import java.util.Map;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.CheckData;
import fr.neatmonster.nocheatplus.checks.CheckDataFactory;
/*
* M"""""`'"""`YM oo M""""""'YMM dP
* M mm. mm. M M mmmm. `M 88
@ -17,19 +20,26 @@ import org.bukkit.entity.Player;
* d8888P
*/
/**
* Player specific data for the moving checks.
* Player specific dataFactory for the moving checks.
*/
public class MovingData {
public class MovingData implements CheckData {
public static final CheckDataFactory factory = new CheckDataFactory(){
@Override
public final CheckData getData(final Player player) {
return MovingData.getData(player);
}
};
/** The map containing the data per players. */
/** The map containing the dataFactory per players. */
private static Map<String, MovingData> playersMap = new HashMap<String, MovingData>();
/**
* Gets the data of a specified player.
* Gets the dataFactory of a specified player.
*
* @param player
* the player
* @return the data
* @return the dataFactory
*/
public static MovingData getData(final Player player) {
if (!playersMap.containsKey(player.getName()))
@ -91,7 +101,7 @@ public class MovingData {
public Location teleported;
/**
* Clear the data of the fly checks.
* Clear the dataFactory of the fly checks.
*/
public void clearFlyData() {
bunnyhopDelay = 0;
@ -102,7 +112,7 @@ public class MovingData {
}
/**
* Clear the data of the more packets checks.
* Clear the dataFactory of the more packets checks.
*/
public void clearMorePacketsData() {
morePacketsSetback = null;

View File

@ -176,7 +176,7 @@ public class MovingListener implements Listener {
}
/**
* Just for security, if a player switches between worlds, reset the fly and more packets checks data, because it is
* Just for security, if a player switches between worlds, reset the fly and more packets checks dataFactory, because it is
* definitely invalid now.
*
* @param event
@ -277,7 +277,7 @@ public class MovingListener implements Listener {
final Player player = event.getPlayer();
// Don't care for movements that are very high distance, to another world (such that it is very likely the event
// data was modified by another plugin before we got it) or if the player is inside a vehicle.
// dataFactory was modified by another plugin before we got it) or if the player is inside a vehicle.
if (!event.getFrom().getWorld().equals(event.getTo().getWorld())
|| event.getFrom().distanceSquared(event.getTo()) > 400D || player.isInsideVehicle())
return;
@ -285,7 +285,7 @@ public class MovingListener implements Listener {
final MovingData data = MovingData.getData(player);
// Just try to estimate velocities over time. Not very precise, but works good enough most of the time. Do
// general data modifications one for each event.
// general dataFactory modifications one for each event.
if (data.horizontalVelocityCounter > 0D)
data.horizontalVelocityCounter--;
else if (data.horizontalFreedom > 0.001D)
@ -323,14 +323,14 @@ public class MovingListener implements Listener {
// If he is handled by the no fall check, execute it.
noFall.check(player, from, to);
} else
// He isn't handled by any fly check, clear his data.
// He isn't handled by any fly check, clear his dataFactory.
data.clearFlyData();
if (newTo == null && morePackets.isEnabled(player))
// If he hasn't been stopped by any other check and is handled by the more packets check, execute it.
newTo = morePackets.check(player, from, to);
else
// Otherwise we need to clear his data.
// Otherwise we need to clear his dataFactory.
data.clearMorePacketsData();
// Did one of the checks decide we need a new "to"-location?
@ -388,9 +388,9 @@ public class MovingListener implements Listener {
/**
* If a player gets teleported, it may have two reasons. Either it was NoCheat or another plugin. If it was
* NoCheatPlus, the target location should match the "data.teleportedTo" value.
* NoCheatPlus, the target location should match the "dataFactory.teleportedTo" value.
*
* On teleports, reset some movement related data that gets invalid.
* On teleports, reset some movement related dataFactory that gets invalid.
*
* @param event
* the event
@ -413,11 +413,11 @@ public class MovingListener implements Listener {
if (data.teleported != null && data.teleported.equals(event.getTo()))
event.setCancelled(false);
else
// Only if it wasn't NoCheatPlus, drop data from more packets check. If it was NoCheatPlus, we don't want
// players to exploit the fly check teleporting to get rid of the "morepackets" data.
// Only if it wasn't NoCheatPlus, drop dataFactory from more packets check. If it was NoCheatPlus, we don't want
// players to exploit the fly check teleporting to get rid of the "morepackets" dataFactory.
data.clearMorePacketsData();
// Always drop data from fly checks, as it always loses its validity after teleports. Always!
// Always drop dataFactory from fly checks, as it always loses its validity after teleports. Always!
data.teleported = null;
data.clearFlyData();
}
@ -476,7 +476,7 @@ public class MovingListener implements Listener {
* \_/ \___|_| |_|_|\___|_|\___| |_| |_|\___/ \_/ \___|
*/
// Don't care if a player isn't inside the vehicle, for movements that are very high distance or to another
// world (such that it is very likely the event data was modified by another plugin before we got it).
// world (such that it is very likely the event dataFactory was modified by another plugin before we got it).
if (event.getVehicle().getPassenger() == null || !(event.getVehicle().getPassenger() instanceof Player)
|| !event.getFrom().getWorld().equals(event.getTo().getWorld())
|| event.getFrom().distanceSquared(event.getTo()) > 400D)
@ -490,7 +490,7 @@ public class MovingListener implements Listener {
// If the player is handled by the more packets vehicle check, execute it.
newTo = morePacketsVehicle.check(player, event.getFrom(), event.getTo());
else
// Otherwise we need to clear his data.
// Otherwise we need to clear his dataFactory.
MovingData.getData(player).clearMorePacketsData();
// Did one of the checks decide we need a new "to"-location?

View File

@ -9,6 +9,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.utilities.PlayerLocation;
/*
@ -69,7 +70,7 @@ public class NoFall extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event.
if (executeActions(player))
if (executeActions(player, data.noFallVL, cc.noFallActions))
// Deal fall damages to the player.
((CraftPlayer) player).getHandle().b(0D, true);
data.noFallDistance = 0F;
@ -91,7 +92,7 @@ public class NoFall extends Check {
// Execute whatever actions are associated with this check and the violation level and find out if we should
// cancel the event. If "cancelled", the fall damage gets dealt in a way that's visible to other plugins.
if (executeActions(player))
if (executeActions(player, data.noFallVL, cc.noFallActions))
// Increase the fall distance a bit. :)
player.setFallDistance(data.noFallDistance + difference);
data.noFallDistance = 0F;
@ -126,10 +127,10 @@ public class NoFall extends Check {
* org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
if (wildcard == ParameterName.FALL_DISTANCE)
return String.format(Locale.US, "%.2f", MovingData.getData(player).noFallDistance);
return String.format(Locale.US, "%.2f", MovingData.getData(violationData.player).noFallDistance);
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -12,6 +12,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.players.Permissions;
import fr.neatmonster.nocheatplus.utilities.PlayerLocation;
@ -118,7 +119,7 @@ public class SurvivalFly extends Check {
data.survivalFlyVL += 100D;
// And return if we need to do something or not.
return executeActions(player);
return executeActions(player, data.survivalFlyVL, MovingConfig.getConfig(player).survivalFlyActions);
} else
// He has, everything is alright.
data.survivalFlyWasInBed = false;
@ -326,7 +327,7 @@ public class SurvivalFly extends Check {
// If the other plugins haven't decided to cancel the execution of the actions, then do it. If one of the
// actions was a cancel, cancel it.
if (executeActions(player))
if (executeActions(player, data.survivalFlyVL, MovingConfig.getConfig(player).survivalFlyActions))
// Compose a new location based on coordinates of "newTo" and viewing direction of "event.getTo()" to
// allow the player to look somewhere else despite getting pulled back by NoCheatPlus.
return new Location(player.getWorld(), data.setBack.getX(), data.setBack.getY(), data.setBack.getZ(),
@ -368,8 +369,8 @@ public class SurvivalFly extends Check {
* org.bukkit.entity.Player)
*/
@Override
public String getParameter(final ParameterName wildcard, final Player player) {
final MovingData data = MovingData.getData(player);
public String getParameter(final ParameterName wildcard, final ViolationData violationData) {
final MovingData data = MovingData.getData(violationData.player);
if (wildcard == ParameterName.LOCATION_FROM)
return String.format(Locale.US, "%.2f, %.2f, %.2f", data.from.getX(), data.from.getY(), data.from.getZ());
else if (wildcard == ParameterName.LOCATION_TO)
@ -377,6 +378,6 @@ public class SurvivalFly extends Check {
else if (wildcard == ParameterName.DISTANCE)
return String.format(Locale.US, "%.2f", data.to.subtract(data.from).lengthSquared());
else
return super.getParameter(wildcard, player);
return super.getParameter(wildcard, violationData);
}
}

View File

@ -41,7 +41,7 @@ public class ConfigFile extends YamlConfiguration {
}
/**
* Do this after reading new data.
* Do this after reading new dataFactory.
*/
public void regenerateActionLists() {
factory = new ActionFactory(((MemorySection) this.get(ConfPaths.STRINGS)).getValues(false));

View File

@ -130,7 +130,7 @@ public class ConfigManager {
public static void init(final NoCheatPlus plugin) {
// First try to obtain and parse the global configuration file.
final File folder = plugin.getDataFolder();
final File globalFile = new File(folder, "config.yml");
final File globalFile = new File(folder, "configFactory.yml");
final ConfigFile global = new ConfigFile();
global.setDefaults(new DefaultConfig());

View File

@ -12,7 +12,7 @@ package fr.neatmonster.nocheatplus.config;
*/
/**
* These are the default settings for NoCheatPlus. They will be used in addition to/in replacement of configurations
* given in the config.yml file.
* given in the configFactory.yml file.
*/
public class DefaultConfig extends ConfigFile {

View File

@ -130,7 +130,7 @@ public class ExecutionHistory {
}
}
/** Store data between events (time + action + action-counter). **/
/** Store dataFactory between events (time + action + action-counter). **/
private final Map<String, Map<Action, ExecutionHistoryEntry>> executionHistories;
/**