mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2025-01-03 22:37:44 +01:00
New checks inventory.instantbow and inventory.instantfood
This commit is contained in:
parent
7f63028be0
commit
aed49a3f91
@ -128,6 +128,23 @@ checks:
|
|||||||
actions:
|
actions:
|
||||||
What should happen when a player goes beyond the set limit. Default settings log
|
What should happen when a player goes beyond the set limit. Default settings log
|
||||||
a message and kick the player from the server.
|
a message and kick the player from the server.
|
||||||
|
instantbow:
|
||||||
|
Players may attack extremely fast and with a fully charged bow without
|
||||||
|
waiting for it to be fully pulled back.
|
||||||
|
active:
|
||||||
|
Should players be checked for this behaviour.
|
||||||
|
actions:
|
||||||
|
What should happen if the player fails this check. Default is to stop
|
||||||
|
the attack ("cancel" it) and log messages.
|
||||||
|
instanteat:
|
||||||
|
Players may eat various kinds of food instantly instead of waiting the
|
||||||
|
usual time munching on the item.
|
||||||
|
active:
|
||||||
|
Should players be checked for this behaviour.
|
||||||
|
actions:
|
||||||
|
What should happen if the player fails this check. Default is to deny
|
||||||
|
them the food level gain ("cancel" it) and log messages. Sadly it's
|
||||||
|
not possible to prevent the food item to get lost anyway.
|
||||||
|
|
||||||
moving:
|
moving:
|
||||||
All checks that have to do with player movement
|
All checks that have to do with player movement
|
||||||
|
@ -87,3 +87,7 @@ permissions:
|
|||||||
children:
|
children:
|
||||||
nocheat.checks.inventory.drop:
|
nocheat.checks.inventory.drop:
|
||||||
description: Allow a player to drop more items in a short timeframe than the defined limit
|
description: Allow a player to drop more items in a short timeframe than the defined limit
|
||||||
|
nocheat.checks.inventory.instanteat:
|
||||||
|
description: Allow a player to eat food faster than normally possible
|
||||||
|
nocheat.checks.inventory.instantbow:
|
||||||
|
description: Allow a player to charge his bow faster than usual
|
||||||
|
2
pom.xml
2
pom.xml
@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>cc.co.evenprime.bukkit</groupId>
|
<groupId>cc.co.evenprime.bukkit</groupId>
|
||||||
<artifactId>NoCheat</artifactId>
|
<artifactId>NoCheat</artifactId>
|
||||||
<version>3.1.2</version>
|
<version>3.2.0</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>NoCheat</name>
|
<name>NoCheat</name>
|
||||||
<properties>
|
<properties>
|
||||||
|
@ -5,7 +5,7 @@ package cc.co.evenprime.bukkit.nocheat.actions;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public enum ParameterName {
|
public enum ParameterName {
|
||||||
PLAYER("player"), LOCATION("location"), WORLD("world"), VIOLATIONS("violations"), MOVEDISTANCE("movedistance"), REACHDISTANCE("reachdistance"), FALLDISTANCE("falldistance"), LOCATION_TO("locationto"), CHECK("check"), PACKETS("packets"), TEXT("text"), PLACE_LOCATION("placelocation"), PLACE_AGAINST("placeagainst"), BLOCK_TYPE("blocktype"), LIMIT("limit");
|
PLAYER("player"), LOCATION("location"), WORLD("world"), VIOLATIONS("violations"), MOVEDISTANCE("movedistance"), REACHDISTANCE("reachdistance"), FALLDISTANCE("falldistance"), LOCATION_TO("locationto"), CHECK("check"), PACKETS("packets"), TEXT("text"), PLACE_LOCATION("placelocation"), PLACE_AGAINST("placeagainst"), BLOCK_TYPE("blocktype"), LIMIT("limit"), FOOD("food");
|
||||||
|
|
||||||
private final String s;
|
private final String s;
|
||||||
|
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package cc.co.evenprime.bukkit.nocheat.checks;
|
package cc.co.evenprime.bukkit.nocheat.checks;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
import net.minecraft.server.Block;
|
import net.minecraft.server.Block;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
|
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
|
||||||
import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation;
|
import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation;
|
||||||
@ -68,27 +71,29 @@ public class CheckUtil {
|
|||||||
return Math.max(distance - limit, 0.0D);
|
return Math.max(distance - limit, 0.0D);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final static double magic = 0.45D;
|
private final static double magic = 0.45D;
|
||||||
private final static double magic2 = 0.55D;
|
private final static double magic2 = 0.55D;
|
||||||
|
|
||||||
private static final int NONSOLID = 1; // 0x00000001
|
private static final int NONSOLID = 1; // 0x00000001
|
||||||
private static final int SOLID = 2; // 0x00000010
|
private static final int SOLID = 2; // 0x00000010
|
||||||
|
|
||||||
// All liquids are "nonsolid" too
|
// All liquids are "nonsolid" too
|
||||||
private static final int LIQUID = 4 | NONSOLID; // 0x00000101
|
private static final int LIQUID = 4 | NONSOLID; // 0x00000101
|
||||||
|
|
||||||
// All ladders are "nonsolid" and "solid" too
|
// All ladders are "nonsolid" and "solid" too
|
||||||
private static final int LADDER = 8 | NONSOLID | SOLID; // 0x00001011
|
private static final int LADDER = 8 | NONSOLID | SOLID; // 0x00001011
|
||||||
|
|
||||||
// All fences are solid - fences are treated specially due
|
// All fences are solid - fences are treated specially due
|
||||||
// to being 1.5 blocks high
|
// to being 1.5 blocks high
|
||||||
private static final int FENCE = 16 | SOLID | NONSOLID; // 0x00010010
|
private static final int FENCE = 16 | SOLID | NONSOLID; // 0x00010010
|
||||||
|
|
||||||
private static final int INGROUND = 128;
|
private static final int INGROUND = 128;
|
||||||
private static final int ONGROUND = 256;
|
private static final int ONGROUND = 256;
|
||||||
// Until I can think of a better way to determine if a block is solid or
|
// Until I can think of a better way to determine if a block is solid or
|
||||||
// not, this is what I'll do
|
// not, this is what I'll do
|
||||||
private static final int types[];
|
private static final int types[];
|
||||||
|
|
||||||
|
private static final Set<Material> foods = new HashSet<Material>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
types = new int[256];
|
types = new int[256];
|
||||||
@ -162,6 +167,22 @@ public class CheckUtil {
|
|||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
|
foods.add(Material.APPLE);
|
||||||
|
foods.add(Material.BREAD);
|
||||||
|
foods.add(Material.COOKED_BEEF);
|
||||||
|
foods.add(Material.COOKED_CHICKEN);
|
||||||
|
foods.add(Material.COOKED_FISH);
|
||||||
|
foods.add(Material.COOKIE);
|
||||||
|
foods.add(Material.GOLDEN_APPLE);
|
||||||
|
foods.add(Material.GRILLED_PORK);
|
||||||
|
foods.add(Material.MELON);
|
||||||
|
foods.add(Material.MUSHROOM_SOUP);
|
||||||
|
foods.add(Material.PORK);
|
||||||
|
foods.add(Material.RAW_BEEF);
|
||||||
|
foods.add(Material.RAW_CHICKEN);
|
||||||
|
foods.add(Material.RAW_FISH);
|
||||||
|
foods.add(Material.ROTTEN_FLESH);
|
||||||
|
foods.add(Material.SPIDER_EYE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -326,4 +347,10 @@ public class CheckUtil {
|
|||||||
return types[typeId];
|
return types[typeId];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isFood(ItemStack item) {
|
||||||
|
if(item == null)
|
||||||
|
return false;
|
||||||
|
return foods.contains(item.getType());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ public class FightCheckListener implements Listener, EventManager {
|
|||||||
final NoCheatPlayer player = plugin.getPlayer(damager);
|
final NoCheatPlayer player = plugin.getPlayer(damager);
|
||||||
final FightConfig cc = FightCheck.getConfig(player.getConfigurationStore());
|
final FightConfig cc = FightCheck.getConfig(player.getConfigurationStore());
|
||||||
|
|
||||||
if(!cc.check || player.hasPermission(Permissions.FIGHT)) {
|
if(!cc.damageChecks || player.hasPermission(Permissions.FIGHT)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,13 +112,13 @@ public class FightCheckListener implements Listener, EventManager {
|
|||||||
|
|
||||||
FightConfig f = FightCheck.getConfig(cc);
|
FightConfig f = FightCheck.getConfig(cc);
|
||||||
|
|
||||||
if(f.check && f.directionCheck)
|
if(f.directionCheck)
|
||||||
s.add("fight.direction");
|
s.add("fight.direction");
|
||||||
if(f.check && f.noswingCheck)
|
if(f.noswingCheck)
|
||||||
s.add("fight.noswing");
|
s.add("fight.noswing");
|
||||||
if(f.check && f.reachCheck)
|
if(f.reachCheck)
|
||||||
s.add("fight.reach");
|
s.add("fight.reach");
|
||||||
if(f.check && f.speedCheck)
|
if(f.speedCheck)
|
||||||
s.add("fight.speed");
|
s.add("fight.speed");
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration;
|
|||||||
|
|
||||||
public class FightConfig implements ConfigItem {
|
public class FightConfig implements ConfigItem {
|
||||||
|
|
||||||
public final boolean check;
|
|
||||||
public final boolean directionCheck;
|
public final boolean directionCheck;
|
||||||
public final double directionPrecision;
|
public final double directionPrecision;
|
||||||
public final ActionList directionActions;
|
public final ActionList directionActions;
|
||||||
@ -22,6 +21,8 @@ public class FightConfig implements ConfigItem {
|
|||||||
public final ActionList speedActions;
|
public final ActionList speedActions;
|
||||||
public final boolean speedCheck;
|
public final boolean speedCheck;
|
||||||
|
|
||||||
|
public final boolean damageChecks;
|
||||||
|
|
||||||
public FightConfig(NoCheatConfiguration data) {
|
public FightConfig(NoCheatConfiguration data) {
|
||||||
|
|
||||||
directionCheck = data.getBoolean(ConfPaths.FIGHT_DIRECTION_CHECK);
|
directionCheck = data.getBoolean(ConfPaths.FIGHT_DIRECTION_CHECK);
|
||||||
@ -38,6 +39,6 @@ public class FightConfig implements ConfigItem {
|
|||||||
speedActions = data.getActionList(ConfPaths.FIGHT_SPEED_ACTIONS);
|
speedActions = data.getActionList(ConfPaths.FIGHT_SPEED_ACTIONS);
|
||||||
speedAttackLimit = data.getInt(ConfPaths.FIGHT_SPEED_ATTACKLIMIT);
|
speedAttackLimit = data.getInt(ConfPaths.FIGHT_SPEED_ATTACKLIMIT);
|
||||||
|
|
||||||
check = directionCheck || noswingCheck || reachCheck || speedCheck;
|
damageChecks = directionCheck || noswingCheck || reachCheck || speedCheck;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,9 @@ public class FightData implements DataItem {
|
|||||||
public double reachVL;
|
public double reachVL;
|
||||||
public double reachTotalVL;
|
public double reachTotalVL;
|
||||||
public int reachFailed;
|
public int reachFailed;
|
||||||
|
public int speedVL;
|
||||||
|
public int speedTotalVL;
|
||||||
|
public int speedFailed;
|
||||||
|
|
||||||
public long directionLastViolationTime;
|
public long directionLastViolationTime;
|
||||||
public long reachLastViolationTime;
|
public long reachLastViolationTime;
|
||||||
@ -25,17 +28,19 @@ public class FightData implements DataItem {
|
|||||||
|
|
||||||
public long speedTime;
|
public long speedTime;
|
||||||
public int speedAttackCount;
|
public int speedAttackCount;
|
||||||
public int speedVL;
|
|
||||||
public int speedTotalVL;
|
|
||||||
public int speedFailed;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void collectData(Map<String, Object> map) {
|
public void collectData(Map<String, Object> map) {
|
||||||
map.put("fight.direction.vl", (int) directionTotalVL);
|
map.put("fight.direction.vl", (int) directionTotalVL);
|
||||||
map.put("fight.noswing.vl", (int) noswingTotalVL);
|
map.put("fight.noswing.vl", (int) noswingTotalVL);
|
||||||
map.put("fight.reach.vl", (int) reachTotalVL);
|
map.put("fight.reach.vl", (int) reachTotalVL);
|
||||||
map.put("fight.direction.failed", directionFailed);
|
map.put("fight.speed.vl", (int) speedTotalVL);
|
||||||
map.put("fight.noswing.failed", noswingFailed);
|
|
||||||
|
|
||||||
|
map.put("fight.direction.failed", (int) directionFailed);
|
||||||
|
map.put("fight.noswing.failed", (int) noswingFailed);
|
||||||
map.put("fight.reach.failed", (int) reachFailed);
|
map.put("fight.reach.failed", (int) reachFailed);
|
||||||
|
map.put("fight.speed.failed", (int) speedFailed);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@ public class DropCheck extends InventoryCheck {
|
|||||||
super(plugin, "inventory.drop", Permissions.INVENTORY_DROP);
|
super(plugin, "inventory.drop", Permissions.INVENTORY_DROP);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean check(NoCheatPlayer player, InventoryData data, InventoryConfig cc) {
|
public boolean check(NoCheatPlayer player, InventoryData data, InventoryConfig cc) {
|
||||||
|
|
||||||
boolean cancel = false;
|
boolean cancel = false;
|
||||||
@ -42,11 +41,6 @@ public class DropCheck extends InventoryCheck {
|
|||||||
return cancel;
|
return cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(InventoryConfig cc) {
|
|
||||||
return cc.dropCheck;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getParameter(ParameterName wildcard, NoCheatPlayer player) {
|
public String getParameter(ParameterName wildcard, NoCheatPlayer player) {
|
||||||
|
|
||||||
if(wildcard == ParameterName.VIOLATIONS)
|
if(wildcard == ParameterName.VIOLATIONS)
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import org.bukkit.event.entity.EntityShootBowEvent;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.actions.ParameterName;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.config.Permissions;
|
||||||
|
|
||||||
|
public class InstantBowCheck extends InventoryCheck {
|
||||||
|
|
||||||
|
public InstantBowCheck(NoCheat plugin) {
|
||||||
|
super(plugin, "fight.instantbow", Permissions.INVENTORY_INSTANTBOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean check(NoCheatPlayer player, EntityShootBowEvent event, InventoryData data, InventoryConfig cc) {
|
||||||
|
|
||||||
|
boolean cancelled = false;
|
||||||
|
|
||||||
|
long time = System.currentTimeMillis();
|
||||||
|
float bowForce = event.getForce();
|
||||||
|
long expectedTimeWhenStringDrawn = data.lastBowInteractTime + (int) (bowForce * bowForce * 700F);
|
||||||
|
|
||||||
|
if(expectedTimeWhenStringDrawn < time) {
|
||||||
|
// Acceptable, reduce VL
|
||||||
|
data.instantBowVL *= 0.98D;
|
||||||
|
} else if(data.lastBowInteractTime > time) {
|
||||||
|
// Security, if time ran backwards, reset
|
||||||
|
data.lastBowInteractTime = 0;
|
||||||
|
} else {
|
||||||
|
// Seems fishy, increase violation level
|
||||||
|
int vl = ((int) (expectedTimeWhenStringDrawn - time)) / 100;
|
||||||
|
data.instantBowVL += vl;
|
||||||
|
data.instantBowTotalVL += vl;
|
||||||
|
data.instantBowFailed++;
|
||||||
|
cancelled = executeActions(player, cc.bowActions.getActions(data.instantBowVL));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParameter(ParameterName wildcard, NoCheatPlayer player) {
|
||||||
|
|
||||||
|
if(wildcard == ParameterName.VIOLATIONS)
|
||||||
|
return String.format(Locale.US, "%d", (int) getData(player.getDataStore()).instantBowVL);
|
||||||
|
else
|
||||||
|
return super.getParameter(wildcard, player);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.actions.ParameterName;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.config.Permissions;
|
||||||
|
|
||||||
|
public class InstantEatCheck extends InventoryCheck {
|
||||||
|
|
||||||
|
public InstantEatCheck(NoCheat plugin) {
|
||||||
|
super(plugin, "inventory.instanteat", Permissions.INVENTORY_INSTANTEAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean check(NoCheatPlayer player, FoodLevelChangeEvent event, InventoryData data, InventoryConfig cc) {
|
||||||
|
|
||||||
|
// Seems to be not the result of eating
|
||||||
|
if(data.foodMaterial == null || event.getFoodLevel() <= player.getPlayer().getFoodLevel())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
boolean cancelled = false;
|
||||||
|
|
||||||
|
long time = System.currentTimeMillis();
|
||||||
|
long expectedTimeWhenEatingFinished = data.lastEatInteractTime + 700;
|
||||||
|
|
||||||
|
if(expectedTimeWhenEatingFinished < time) {
|
||||||
|
// Acceptable, reduce VL
|
||||||
|
data.instantEatVL *= 0.98D;
|
||||||
|
} else if(data.lastEatInteractTime > time) {
|
||||||
|
// Security, if time ran backwards, reset
|
||||||
|
data.lastEatInteractTime = 0;
|
||||||
|
} else {
|
||||||
|
// Seems fishy, increase violation level
|
||||||
|
int vl = ((int) (expectedTimeWhenEatingFinished - time)) / 100;
|
||||||
|
data.instantEatVL += vl;
|
||||||
|
data.instantEatTotalVL += vl;
|
||||||
|
data.instantEatFailed++;
|
||||||
|
cancelled = executeActions(player, cc.eatActions.getActions(data.instantEatVL));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParameter(ParameterName wildcard, NoCheatPlayer player) {
|
||||||
|
|
||||||
|
if(wildcard == ParameterName.VIOLATIONS)
|
||||||
|
return String.format(Locale.US, "%d", getData(player.getDataStore()).instantEatVL);
|
||||||
|
else if(wildcard == ParameterName.FOOD)
|
||||||
|
return getData(player.getDataStore()).foodMaterial.toString();
|
||||||
|
else
|
||||||
|
return super.getParameter(wildcard, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
||||||
|
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
|
|
||||||
import cc.co.evenprime.bukkit.nocheat.checks.Check;
|
import cc.co.evenprime.bukkit.nocheat.checks.Check;
|
||||||
import cc.co.evenprime.bukkit.nocheat.config.ConfigurationCacheStore;
|
import cc.co.evenprime.bukkit.nocheat.config.ConfigurationCacheStore;
|
||||||
import cc.co.evenprime.bukkit.nocheat.data.DataStore;
|
import cc.co.evenprime.bukkit.nocheat.data.DataStore;
|
||||||
@ -14,10 +13,6 @@ public abstract class InventoryCheck extends Check {
|
|||||||
super(plugin, id, name, permission);
|
super(plugin, id, name, permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract boolean check(NoCheatPlayer player, InventoryData data, InventoryConfig cc);
|
|
||||||
|
|
||||||
public abstract boolean isEnabled(InventoryConfig cc);
|
|
||||||
|
|
||||||
public static InventoryData getData(DataStore base) {
|
public static InventoryData getData(DataStore base) {
|
||||||
InventoryData data = base.get(id);
|
InventoryData data = base.get(id);
|
||||||
if(data == null) {
|
if(data == null) {
|
||||||
|
@ -1,29 +1,37 @@
|
|||||||
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.entity.EntityShootBowEvent;
|
||||||
|
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import cc.co.evenprime.bukkit.nocheat.EventManager;
|
import cc.co.evenprime.bukkit.nocheat.EventManager;
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
|
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil;
|
||||||
import cc.co.evenprime.bukkit.nocheat.config.ConfigurationCacheStore;
|
import cc.co.evenprime.bukkit.nocheat.config.ConfigurationCacheStore;
|
||||||
import cc.co.evenprime.bukkit.nocheat.config.Permissions;
|
import cc.co.evenprime.bukkit.nocheat.config.Permissions;
|
||||||
|
|
||||||
public class InventoryCheckListener implements Listener, EventManager {
|
public class InventoryCheckListener implements Listener, EventManager {
|
||||||
|
|
||||||
private final List<InventoryCheck> checks;
|
private final DropCheck dropCheck;
|
||||||
private final NoCheat plugin;
|
private final InstantBowCheck instantBowCheck;
|
||||||
|
private final InstantEatCheck instantEatCheck;
|
||||||
|
|
||||||
|
private final NoCheat plugin;
|
||||||
|
|
||||||
public InventoryCheckListener(NoCheat plugin) {
|
public InventoryCheckListener(NoCheat plugin) {
|
||||||
|
|
||||||
this.checks = new ArrayList<InventoryCheck>(1);
|
this.dropCheck = new DropCheck(plugin);
|
||||||
|
this.instantBowCheck = new InstantBowCheck(plugin);
|
||||||
// Don't use this check now, it's buggy
|
this.instantEatCheck = new InstantEatCheck(plugin);
|
||||||
this.checks.add(new DropCheck(plugin));
|
|
||||||
|
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
@ -36,20 +44,17 @@ public class InventoryCheckListener implements Listener, EventManager {
|
|||||||
|
|
||||||
final NoCheatPlayer player = plugin.getPlayer(event.getPlayer());
|
final NoCheatPlayer player = plugin.getPlayer(event.getPlayer());
|
||||||
final InventoryConfig cc = InventoryCheck.getConfig(player.getConfigurationStore());
|
final InventoryConfig cc = InventoryCheck.getConfig(player.getConfigurationStore());
|
||||||
|
final InventoryData data = InventoryCheck.getData(player.getDataStore());
|
||||||
|
|
||||||
if(!cc.check || player.hasPermission(Permissions.INVENTORY) || player.isDead()) {
|
if(player.hasPermission(Permissions.INVENTORY) || player.isDead()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final InventoryData data = InventoryCheck.getData(player.getDataStore());
|
|
||||||
|
|
||||||
boolean cancelled = false;
|
boolean cancelled = false;
|
||||||
|
|
||||||
for(InventoryCheck check : checks) {
|
// If it should be executed, do it
|
||||||
// If it should be executed, do it
|
if(cc.dropCheck && !player.hasPermission(dropCheck.getPermission())) {
|
||||||
if(!cancelled && check.isEnabled(cc) && !player.hasPermission(check.getPermission())) {
|
cancelled = dropCheck.check(player, data, cc);
|
||||||
cancelled = check.check(player, data, cc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cancelled) {
|
if(cancelled) {
|
||||||
@ -59,12 +64,71 @@ public class InventoryCheckListener implements Listener, EventManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void interact(final PlayerInteractEvent event) {
|
||||||
|
|
||||||
|
if(!event.hasItem() || event.getAction() != Action.RIGHT_CLICK_AIR || event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
NoCheatPlayer player = plugin.getPlayer(event.getPlayer());
|
||||||
|
final InventoryData data = InventoryCheck.getData(player.getDataStore());
|
||||||
|
|
||||||
|
if(event.getItem().getType() == Material.BOW) {
|
||||||
|
data.lastBowInteractTime = System.currentTimeMillis();
|
||||||
|
} else if(CheckUtil.isFood(event.getItem())) {
|
||||||
|
// Remember food Material, because we don't have that info in the other event
|
||||||
|
data.foodMaterial = event.getItem().getType();
|
||||||
|
data.lastFoodInteractTime = System.currentTimeMillis();
|
||||||
|
} else {
|
||||||
|
data.lastBowInteractTime = 0;
|
||||||
|
data.lastFoodInteractTime = 0;
|
||||||
|
data.foodMaterial = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void foodchanged(final FoodLevelChangeEvent event) {
|
||||||
|
if(!event.isCancelled() && event.getEntity() instanceof Player) {
|
||||||
|
final NoCheatPlayer player = plugin.getPlayer((Player) event.getEntity());
|
||||||
|
final InventoryConfig cc = InventoryCheck.getConfig(player.getConfigurationStore());
|
||||||
|
final InventoryData data = InventoryCheck.getData(player.getDataStore());
|
||||||
|
|
||||||
|
if(cc.eatCheck && !player.hasPermission(instantEatCheck.getPermission())) {
|
||||||
|
|
||||||
|
boolean cancelled = instantEatCheck.check(player, event, data, cc);
|
||||||
|
event.setCancelled(cancelled);
|
||||||
|
}
|
||||||
|
|
||||||
|
data.foodMaterial = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void bowfired(final EntityShootBowEvent event) {
|
||||||
|
if(!event.isCancelled() && event.getEntity() instanceof Player) {
|
||||||
|
final NoCheatPlayer player = plugin.getPlayer((Player) event.getEntity());
|
||||||
|
final InventoryConfig cc = InventoryCheck.getConfig(player.getConfigurationStore());
|
||||||
|
|
||||||
|
if(cc.bowCheck && !player.hasPermission(instantBowCheck.getPermission())) {
|
||||||
|
final InventoryData data = InventoryCheck.getData(player.getDataStore());
|
||||||
|
boolean cancelled = instantBowCheck.check(player, event, data, cc);
|
||||||
|
|
||||||
|
event.setCancelled(cancelled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public List<String> getActiveChecks(ConfigurationCacheStore cc) {
|
public List<String> getActiveChecks(ConfigurationCacheStore cc) {
|
||||||
LinkedList<String> s = new LinkedList<String>();
|
LinkedList<String> s = new LinkedList<String>();
|
||||||
|
|
||||||
InventoryConfig i = InventoryCheck.getConfig(cc);
|
InventoryConfig i = InventoryCheck.getConfig(cc);
|
||||||
if(i.check && i.dropCheck)
|
if(i.dropCheck)
|
||||||
s.add("inventory.dropCheck");
|
s.add("inventory.dropCheck");
|
||||||
|
if(i.bowCheck)
|
||||||
|
s.add("inventory.instantbow");
|
||||||
|
if(i.eatCheck)
|
||||||
|
s.add("inventory.instanteat");
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,13 +7,17 @@ import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration;
|
|||||||
|
|
||||||
public class InventoryConfig implements ConfigItem {
|
public class InventoryConfig implements ConfigItem {
|
||||||
|
|
||||||
public final boolean check;
|
|
||||||
|
|
||||||
public final boolean dropCheck;
|
public final boolean dropCheck;
|
||||||
public final long dropTimeFrame;
|
public final long dropTimeFrame;
|
||||||
public final int dropLimit;
|
public final int dropLimit;
|
||||||
public final ActionList dropActions;
|
public final ActionList dropActions;
|
||||||
|
|
||||||
|
public final boolean bowCheck;
|
||||||
|
public final ActionList bowActions;
|
||||||
|
|
||||||
|
public final boolean eatCheck;
|
||||||
|
public final ActionList eatActions;
|
||||||
|
|
||||||
public InventoryConfig(NoCheatConfiguration data) {
|
public InventoryConfig(NoCheatConfiguration data) {
|
||||||
|
|
||||||
dropCheck = data.getBoolean(ConfPaths.INVENTORY_DROP_CHECK);
|
dropCheck = data.getBoolean(ConfPaths.INVENTORY_DROP_CHECK);
|
||||||
@ -21,6 +25,10 @@ public class InventoryConfig implements ConfigItem {
|
|||||||
dropLimit = data.getInt(ConfPaths.INVENTORY_DROP_LIMIT);
|
dropLimit = data.getInt(ConfPaths.INVENTORY_DROP_LIMIT);
|
||||||
dropActions = data.getActionList(ConfPaths.INVENTORY_DROP_ACTIONS);
|
dropActions = data.getActionList(ConfPaths.INVENTORY_DROP_ACTIONS);
|
||||||
|
|
||||||
check = dropCheck;
|
bowCheck = data.getBoolean(ConfPaths.INVENTORY_INSTANTBOW_CHECK);
|
||||||
|
bowActions = data.getActionList(ConfPaths.INVENTORY_INSTANTBOW_ACTIONS);
|
||||||
|
|
||||||
|
eatCheck = data.getBoolean(ConfPaths.INVENTORY_INSTANTEAT_CHECK);
|
||||||
|
eatActions = data.getActionList(ConfPaths.INVENTORY_INSTANTEAT_ACTIONS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,40 @@
|
|||||||
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
package cc.co.evenprime.bukkit.nocheat.checks.inventory;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import org.bukkit.Material;
|
||||||
import cc.co.evenprime.bukkit.nocheat.DataItem;
|
import cc.co.evenprime.bukkit.nocheat.DataItem;
|
||||||
|
|
||||||
public class InventoryData implements DataItem {
|
public class InventoryData implements DataItem {
|
||||||
|
|
||||||
public int dropVL = 0;
|
public int dropVL;
|
||||||
public double dropTotalVL = 0;
|
public double dropTotalVL;
|
||||||
public int dropFailed = 0;
|
public int dropFailed;
|
||||||
public long dropLastTime;
|
public long dropLastTime;
|
||||||
public int dropCount;
|
public int dropCount;
|
||||||
|
|
||||||
|
public int instantBowVL;
|
||||||
|
public int instantBowTotalVL;
|
||||||
|
public int instantBowFailed;
|
||||||
|
|
||||||
|
public double instantEatVL;
|
||||||
|
public int instantEatTotalVL;
|
||||||
|
public int instantEatFailed;
|
||||||
|
|
||||||
|
public long lastBowInteractTime;
|
||||||
|
public int lastEatInteractTime;
|
||||||
|
public Material foodMaterial;
|
||||||
|
public long lastFoodInteractTime;
|
||||||
|
public int newFoodLevel;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void collectData(Map<String, Object> map) {
|
public void collectData(Map<String, Object> map) {
|
||||||
map.put("inventory.drop.vl", (int) dropTotalVL);
|
map.put("inventory.drop.vl", (int) dropTotalVL);
|
||||||
map.put("inventory.drop.failed", (int) dropFailed);
|
map.put("inventory.drop.failed", (int) dropFailed);
|
||||||
|
|
||||||
|
map.put("inventory.instantbow.vl", (int) instantBowTotalVL);
|
||||||
|
map.put("inventory.instantbow.failed", (int) instantBowFailed);
|
||||||
|
|
||||||
|
map.put("inventory.instanteat.vl", (int) instantEatTotalVL);
|
||||||
|
map.put("inventory.instanteat.failed", (int) instantEatFailed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,23 @@ public abstract class ConfPaths {
|
|||||||
public final static String LOGGING_DEBUGMESSAGES = LOGGING + "debugmessages";
|
public final static String LOGGING_DEBUGMESSAGES = LOGGING + "debugmessages";
|
||||||
|
|
||||||
private final static String CHECKS = "checks.";
|
private final static String CHECKS = "checks.";
|
||||||
private final static String INVENTORY_DROP = CHECKS + "inventory.drop.";
|
|
||||||
|
private final static String INVENTORY = "CHECKS" + "inventory.";
|
||||||
|
|
||||||
|
private final static String INVENTORY_DROP = INVENTORY + "drop.";
|
||||||
public final static String INVENTORY_DROP_CHECK = INVENTORY_DROP + "active";
|
public final static String INVENTORY_DROP_CHECK = INVENTORY_DROP + "active";
|
||||||
public final static String INVENTORY_DROP_TIMEFRAME = INVENTORY_DROP + "time";
|
public final static String INVENTORY_DROP_TIMEFRAME = INVENTORY_DROP + "time";
|
||||||
public final static String INVENTORY_DROP_LIMIT = INVENTORY_DROP + "limit";
|
public final static String INVENTORY_DROP_LIMIT = INVENTORY_DROP + "limit";
|
||||||
public final static String INVENTORY_DROP_ACTIONS = INVENTORY_DROP + "actions";
|
public final static String INVENTORY_DROP_ACTIONS = INVENTORY_DROP + "actions";
|
||||||
|
|
||||||
|
private static final String INVENTORY_INSTANTBOW = INVENTORY + "instantbow.";
|
||||||
|
public final static String INVENTORY_INSTANTBOW_CHECK = INVENTORY_INSTANTBOW + "active";
|
||||||
|
public static final String INVENTORY_INSTANTBOW_ACTIONS = INVENTORY_INSTANTBOW + "actions";
|
||||||
|
|
||||||
|
private static final String INVENTORY_INSTANTEAT = INVENTORY + "instanteat.";
|
||||||
|
public final static String INVENTORY_INSTANTEAT_CHECK = INVENTORY_INSTANTEAT + "active";
|
||||||
|
public static final String INVENTORY_INSTANTEAT_ACTIONS = INVENTORY_INSTANTEAT + "actions";
|
||||||
|
|
||||||
private final static String MOVING = CHECKS + "moving.";
|
private final static String MOVING = CHECKS + "moving.";
|
||||||
|
|
||||||
private final static String MOVING_RUNFLY = MOVING + "runfly.";
|
private final static String MOVING_RUNFLY = MOVING + "runfly.";
|
||||||
|
@ -30,6 +30,12 @@ public class DefaultConfiguration extends NoCheatConfiguration {
|
|||||||
set(ConfPaths.INVENTORY_DROP_LIMIT, 100);
|
set(ConfPaths.INVENTORY_DROP_LIMIT, 100);
|
||||||
set(ConfPaths.INVENTORY_DROP_ACTIONS, "log:drop:0:1:cif cmd:kick");
|
set(ConfPaths.INVENTORY_DROP_ACTIONS, "log:drop:0:1:cif cmd:kick");
|
||||||
|
|
||||||
|
set(ConfPaths.INVENTORY_INSTANTBOW_CHECK, true);
|
||||||
|
set(ConfPaths.INVENTORY_INSTANTBOW_ACTIONS, "log:ibow:2:5:if cancel");
|
||||||
|
|
||||||
|
set(ConfPaths.INVENTORY_INSTANTEAT_CHECK, true);
|
||||||
|
set(ConfPaths.INVENTORY_INSTANTEAT_ACTIONS, "log:ieat:2:5:if cancel");
|
||||||
|
|
||||||
/*** MOVING ***/
|
/*** MOVING ***/
|
||||||
set(ConfPaths.MOVING_RUNFLY_CHECK, true);
|
set(ConfPaths.MOVING_RUNFLY_CHECK, true);
|
||||||
set(ConfPaths.MOVING_RUNFLY_ALLOWFASTSNEAKING, false);
|
set(ConfPaths.MOVING_RUNFLY_ALLOWFASTSNEAKING, false);
|
||||||
@ -118,6 +124,8 @@ public class DefaultConfiguration extends NoCheatConfiguration {
|
|||||||
set(ConfPaths.STRINGS + ".freach", "[player] failed [check]: tried to attack entity out of reach. VL [violations]");
|
set(ConfPaths.STRINGS + ".freach", "[player] failed [check]: tried to attack entity out of reach. VL [violations]");
|
||||||
set(ConfPaths.STRINGS + ".fspeed", "[player] failed [check]: tried to attack more than [limit] times per second. VL [violations]");
|
set(ConfPaths.STRINGS + ".fspeed", "[player] failed [check]: tried to attack more than [limit] times per second. VL [violations]");
|
||||||
set(ConfPaths.STRINGS + ".fnoswing", "[player] failed [check]: Didn't swing arm. VL [violations]");
|
set(ConfPaths.STRINGS + ".fnoswing", "[player] failed [check]: Didn't swing arm. VL [violations]");
|
||||||
|
set(ConfPaths.STRINGS + ".ibow", "[player] failed [check]: Fires bow to fast. VL [violations]");
|
||||||
|
set(ConfPaths.STRINGS + ".ieat", "[player] failed [check]: Eats food [food] too fast. VL [violations]");
|
||||||
set(ConfPaths.STRINGS + ".kick", "kick [player]");
|
set(ConfPaths.STRINGS + ".kick", "kick [player]");
|
||||||
|
|
||||||
// Update internal factory based on all the new entries to the "actions" section
|
// Update internal factory based on all the new entries to the "actions" section
|
||||||
|
@ -43,6 +43,8 @@ public class Permissions {
|
|||||||
|
|
||||||
public static final String INVENTORY = CHECKS + ".inventory";
|
public static final String INVENTORY = CHECKS + ".inventory";
|
||||||
public static final String INVENTORY_DROP = INVENTORY + ".drop";
|
public static final String INVENTORY_DROP = INVENTORY + ".drop";
|
||||||
|
public static final String INVENTORY_INSTANTBOW = INVENTORY + ".instantbow";
|
||||||
|
public static final String INVENTORY_INSTANTEAT = INVENTORY + ".instanteat";
|
||||||
|
|
||||||
private Permissions() {}
|
private Permissions() {}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user