Split itemdupe check into itemdupe and bogusitems checks + logging

instead of just System.out.println
This commit is contained in:
Evenprime 2011-04-27 11:17:51 +02:00
parent 85a52c5fbf
commit 6a5b9f2a20
8 changed files with 141 additions and 105 deletions

View File

@ -3,7 +3,7 @@ name: NoCheat
author: Evenprime
main: cc.co.evenprime.bukkit.nocheat.NoCheat
version: 0.9
version: 0.9.1
commands:
nocheat:

View File

@ -15,6 +15,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import cc.co.evenprime.bukkit.nocheat.actions.Action;
import cc.co.evenprime.bukkit.nocheat.checks.AirbuildCheck;
import cc.co.evenprime.bukkit.nocheat.checks.BedteleportCheck;
import cc.co.evenprime.bukkit.nocheat.checks.BogusitemsCheck;
import cc.co.evenprime.bukkit.nocheat.checks.Check;
import cc.co.evenprime.bukkit.nocheat.checks.ItemdupeCheck;
import cc.co.evenprime.bukkit.nocheat.checks.MovingCheck;
@ -41,6 +42,7 @@ public class NoCheat extends JavaPlugin {
public SpeedhackCheck speedhackCheck;
public AirbuildCheck airbuildCheck;
public ItemdupeCheck itemdupeCheck;
public BogusitemsCheck bogusitemsCheck;
public Check[] checks;
@ -68,12 +70,12 @@ public class NoCheat extends JavaPlugin {
@Override
public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args)
{
if(sender instanceof Player) {
/*if(sender instanceof Player) {
if(!hasPermission((Player)sender, PermissionData.PERMISSION_P)) {
sender.sendMessage("NC: You are not allowed to use this command.");
return false;
}
}
}*/
if(args.length == 0) {
sender.sendMessage("NC: Using "+ ((permissions == null) ? "isOp()" : "Permissions") + ". Activated checks/bugfixes: " + getActiveChecksAsString() + ". Total time used for moving check so far: " + (movingCheck.statisticElapsedTimeNano / 1000000L + " ms. Average time per move event: " + (movingCheck.statisticElapsedTimeNano/1000L)/movingCheck.statisticTotalEvents + " us"));
@ -126,9 +128,10 @@ public class NoCheat extends JavaPlugin {
speedhackCheck = new SpeedhackCheck(this);
airbuildCheck = new AirbuildCheck(this);
itemdupeCheck = new ItemdupeCheck(this);
bogusitemsCheck = new BogusitemsCheck(this);
// just for convenience
checks = new Check[] { movingCheck, bedteleportCheck, speedhackCheck, airbuildCheck, itemdupeCheck };
checks = new Check[] { movingCheck, bedteleportCheck, speedhackCheck, airbuildCheck, itemdupeCheck, bogusitemsCheck };
// parse the nocheat.yml config file
setupConfig();
@ -299,7 +302,7 @@ public class NoCheat extends JavaPlugin {
data.permissionsCache[PermissionData.PERMISSION_BEDTELEPORT] = permissions.has(player, "nocheat.bedteleport");
data.permissionsCache[PermissionData.PERMISSION_FLYING] = permissions.has(player, "nocheat.flying");
data.permissionsCache[PermissionData.PERMISSION_MOVING] = permissions.has(player, "nocheat.moving");
data.permissionsCache[PermissionData.PERMISSION_P] = permissions.has(player, "nocheat.p");
data.permissionsCache[PermissionData.PERMISSION_BOGUSITEMS] = permissions.has(player, "nocheat.bogusitems");
data.permissionsCache[PermissionData.PERMISSION_SPEEDHACK] = permissions.has(player, "nocheat.speedhack");
data.permissionsCache[PermissionData.PERMISSION_NOTIFY] = permissions.has(player, "nocheat.notify");
data.permissionsCache[PermissionData.PERMISSION_ITEMDUPE] = permissions.has(player, "nocheat.itemdupe");

View File

@ -122,7 +122,8 @@ public class NoCheatConfiguration {
plugin.movingCheck.setActive(c.getBoolean("active.moving", true));
plugin.airbuildCheck.setActive(c.getBoolean("active.airbuild", false));
plugin.bedteleportCheck.setActive(c.getBoolean("active.bedteleport", true));
plugin.itemdupeCheck.setActive(c.getBoolean("active.itemdupe", false));
plugin.itemdupeCheck.setActive(c.getBoolean("active.itemdupe", true));
plugin.bogusitemsCheck.setActive(c.getBoolean("active.bogusitems", false));
}
public void cleanup() {
@ -245,7 +246,8 @@ public class NoCheatConfiguration {
w.write(" moving: true"); w.newLine();
w.write(" airbuild: false"); w.newLine();
w.write(" bedteleport: true"); w.newLine();
w.write(" itemdupe: false"); w.newLine();
w.write(" itemdupe: true"); w.newLine();
w.write(" bogusitems: false"); w.newLine();
w.write("# Speedhack specific options"); w.newLine();
w.write("speedhack:"); w.newLine();
w.write(" logmessage: \"" + plugin.speedhackCheck.logMessage+"\""); w.newLine();
@ -285,6 +287,8 @@ public class NoCheatConfiguration {
w.write("bedteleport:"); w.newLine();
w.write("# Itemdupe specific options (none exist yet)"); w.newLine();
w.write("itemdupe:"); w.newLine();
w.write("# Bogusitems specific options (none exist yet)"); w.newLine();
w.write("bogusitems:"); w.newLine();
w.flush(); w.close();
} catch (IOException e) {

View File

@ -0,0 +1,107 @@
package cc.co.evenprime.bukkit.nocheat.checks;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager;
import cc.co.evenprime.bukkit.nocheat.NoCheat;
import cc.co.evenprime.bukkit.nocheat.data.PermissionData;
import cc.co.evenprime.bukkit.nocheat.listeners.BogusitemsPlayerListener;
public class BogusitemsCheck extends Check {
public BogusitemsCheck(NoCheat plugin){
super(plugin, "bogusitems", PermissionData.PERMISSION_BOGUSITEMS);
}
public void check(PlayerPickupItemEvent event) {
// Should we check at all?
if(hasPermission(event.getPlayer())) return;
Item i = event.getItem();
if(i != null) {
ItemStack s = i.getItemStack();
if(s != null) {
if(s.getAmount() <= 0) {// buggy item
event.getItem().remove();
event.setCancelled(true);
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to pick up an invalid item. Item was removed.");
cleanPlayerInventory(event.getPlayer());
}
}
}
}
public void check(PlayerInteractEvent event) {
if(hasPermission(event.getPlayer())) return;
if(event.hasItem() && event.getItem().getAmount() <= 0) {// buggy item
event.setCancelled(true);
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to use an invalid item. Item was removed.");
event.getPlayer().getInventory().remove(event.getItem());
cleanPlayerInventory(event.getPlayer());
}
}
public void check(PlayerDropItemEvent event) {
if(hasPermission(event.getPlayer())) return;
Item item = event.getItemDrop();
if(item.getItemStack() != null) {
ItemStack stack = item.getItemStack();
if(stack.getAmount() <= 0) {
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to drop an invalid item. Dropped item was changed to dirt.");
stack.setTypeId(3); // dirt
stack.setAmount(1);
cleanPlayerInventory(event.getPlayer());
}
}
}
private void cleanPlayerInventory(Player player) {
Inventory inv = player.getInventory();
ItemStack stacks[] = inv.getContents();
for(int i = 0; i < stacks.length; i++) {
if(stacks[i] != null && stacks[i].getAmount() <= 0) {
inv.clear(i);
plugin.log(Level.WARNING, "Removed illegal item from inventory of " + player.getName());
}
}
}
@Override
protected void registerListeners() {
PluginManager pm = Bukkit.getServer().getPluginManager();
// Register listeners for itemdupe check
Listener bogusitemsPlayerListener = new BogusitemsPlayerListener(this);
// Register listeners for itemdupe check
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, bogusitemsPlayerListener, Priority.Lowest, plugin);
pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, bogusitemsPlayerListener, Priority.Lowest, plugin);
pm.registerEvent(Event.Type.PLAYER_INTERACT, bogusitemsPlayerListener, Priority.Lowest, plugin);
}
}

View File

@ -1,27 +1,16 @@
package cc.co.evenprime.bukkit.nocheat.checks;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerInventoryEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager;
import cc.co.evenprime.bukkit.nocheat.NoCheat;
import cc.co.evenprime.bukkit.nocheat.data.PermissionData;
import cc.co.evenprime.bukkit.nocheat.listeners.ItemdupeEntityListener;
import cc.co.evenprime.bukkit.nocheat.listeners.ItemdupePlayerListener;
public class ItemdupeCheck extends Check {
@ -29,86 +18,6 @@ public class ItemdupeCheck extends Check {
super(plugin, "itemdupe", PermissionData.PERMISSION_ITEMDUPE);
}
public void check(PlayerPickupItemEvent event) {
// Should we check at all?
if(hasPermission(event.getPlayer())) return;
Item i = event.getItem();
if(i != null) {
ItemStack s = i.getItemStack();
if(s != null) {
if(s.getAmount() <= 0) {// buggy item
event.getItem().remove();
event.setCancelled(true);
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to pick up an invalid item. Item was removed.");
cleanPlayerInventory(event.getPlayer());
}
}
}
}
public void check(PlayerInteractEvent event) {
if(hasPermission(event.getPlayer())) return;
if(event.hasItem() && event.getItem().getAmount() <= 0) {// buggy item
event.setCancelled(true);
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to use an invalid item. Item was removed.");
event.getPlayer().getInventory().remove(event.getItem());
cleanPlayerInventory(event.getPlayer());
}
}
public void check(PlayerDropItemEvent event) {
if(hasPermission(event.getPlayer())) return;
Item item = event.getItemDrop();
if(item.getItemStack() != null) {
ItemStack stack = item.getItemStack();
if(stack.getAmount() <= 0) {
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to drop an invalid item. Dropped item was changed to dirt.");
stack.setTypeId(3); // dirt
stack.setAmount(1);
cleanPlayerInventory(event.getPlayer());
}
}
}
private void cleanPlayerInventory(Player player) {
Inventory inv = player.getInventory();
ItemStack stacks[] = inv.getContents();
for(int i = 0; i < stacks.length; i++) {
if(stacks[i] != null && stacks[i].getAmount() <= 0) {
inv.clear(i);
System.out.println("Removed illegal item from inventory of " + player.getName());
}
}
}
@Override
protected void registerListeners() {
PluginManager pm = Bukkit.getServer().getPluginManager();
// Register listeners for itemdupe check
Listener itemdupePlayerListener = new ItemdupePlayerListener(this);
// Register listeners for itemdupe check
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, itemdupePlayerListener, Priority.Lowest, plugin);
pm.registerEvent(Event.Type.ENTITY_DEATH, new ItemdupeEntityListener(this), Priority.Lowest, plugin);
pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, itemdupePlayerListener, Priority.Lowest, plugin);
pm.registerEvent(Event.Type.PLAYER_INTERACT, itemdupePlayerListener, Priority.Lowest, plugin);
}
public void check(EntityDeathEvent event) {
@ -118,4 +27,17 @@ public class ItemdupeCheck extends Check {
((CraftPlayer)event.getEntity()).getHandle().x(); // close all inventory screens
}
}
@Override
protected void registerListeners() {
PluginManager pm = Bukkit.getServer().getPluginManager();
// Register listeners for itemdupe check
Listener itemdupePlayerListener = new ItemdupeEntityListener(this);
// Register listeners for itemdupe check
pm.registerEvent(Event.Type.ENTITY_DEATH, itemdupePlayerListener, Priority.Lowest, plugin);
}
}

View File

@ -653,6 +653,6 @@ public class MovingCheck extends Check {
pm.registerEvent(Event.Type.PLAYER_MOVE, movingPlayerMonitor, Priority.Monitor, plugin);
pm.registerEvent(Event.Type.PLAYER_RESPAWN, movingPlayerMonitor, Priority.Monitor, plugin);
pm.registerEvent(Event.Type.ENTITY_DAMAGE, new MovingEntityListener(this), Priority.Monitor, plugin);
pm.registerEvent(Event.Type.PLAYER_TELEPORT, new MovingPlayerMonitor(this), Priority.Monitor, plugin);
pm.registerEvent(Event.Type.PLAYER_TELEPORT, new MovingPlayerMonitor(this), Priority.Monitor, plugin);
}
}

View File

@ -14,7 +14,7 @@ public class PermissionData {
public static final int PERMISSION_SPEEDHACK = 2;
public static final int PERMISSION_AIRBUILD = 3;
public static final int PERMISSION_BEDTELEPORT = 4;
public static final int PERMISSION_P = 5;
public static final int PERMISSION_BOGUSITEMS = 5;
public static final int PERMISSION_NOTIFY = 6;
public static final int PERMISSION_ITEMDUPE = 7;

View File

@ -5,14 +5,14 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerPickupItemEvent;
import cc.co.evenprime.bukkit.nocheat.checks.ItemdupeCheck;
import cc.co.evenprime.bukkit.nocheat.checks.BogusitemsCheck;
public class ItemdupePlayerListener extends PlayerListener {
public class BogusitemsPlayerListener extends PlayerListener {
ItemdupeCheck check;
BogusitemsCheck check;
public ItemdupePlayerListener(ItemdupeCheck itemdupeCheck) {
check = itemdupeCheck;
public BogusitemsPlayerListener(BogusitemsCheck bogusitemsCheck) {
check = bogusitemsCheck;
}
@Override