mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-09-03 19:00:30 +02:00
Improved itemdupe check + reliable fix for the underlying problem
This commit is contained in:
parent
d0ba809f2a
commit
85a52c5fbf
|
@ -3,7 +3,7 @@ name: NoCheat
|
||||||
author: Evenprime
|
author: Evenprime
|
||||||
|
|
||||||
main: cc.co.evenprime.bukkit.nocheat.NoCheat
|
main: cc.co.evenprime.bukkit.nocheat.NoCheat
|
||||||
version: 0.8.9
|
version: 0.9
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
nocheat:
|
nocheat:
|
||||||
|
|
|
@ -3,17 +3,24 @@ package cc.co.evenprime.bukkit.nocheat.checks;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.craftbukkit.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Item;
|
import org.bukkit.entity.Item;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.Event.Priority;
|
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.PlayerInteractEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInventoryEvent;
|
||||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.plugin.PluginManager;
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
import cc.co.evenprime.bukkit.nocheat.NoCheat;
|
||||||
import cc.co.evenprime.bukkit.nocheat.data.PermissionData;
|
import cc.co.evenprime.bukkit.nocheat.data.PermissionData;
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.listeners.ItemdupeEntityListener;
|
||||||
import cc.co.evenprime.bukkit.nocheat.listeners.ItemdupePlayerListener;
|
import cc.co.evenprime.bukkit.nocheat.listeners.ItemdupePlayerListener;
|
||||||
|
|
||||||
public class ItemdupeCheck extends Check {
|
public class ItemdupeCheck extends Check {
|
||||||
|
@ -34,7 +41,9 @@ public class ItemdupeCheck extends Check {
|
||||||
if(s.getAmount() <= 0) {// buggy item
|
if(s.getAmount() <= 0) {// buggy item
|
||||||
event.getItem().remove();
|
event.getItem().remove();
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to pick up an invalid item. Item will be removed now.");
|
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to pick up an invalid item. Item was removed.");
|
||||||
|
|
||||||
|
cleanPlayerInventory(event.getPlayer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,8 +55,43 @@ public class ItemdupeCheck extends Check {
|
||||||
|
|
||||||
if(event.hasItem() && event.getItem().getAmount() <= 0) {// buggy item
|
if(event.hasItem() && event.getItem().getAmount() <= 0) {// buggy item
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to use an invalid item. Item will be removed now.");
|
plugin.log(Level.WARNING, event.getPlayer().getName() + " tried to use an invalid item. Item was removed.");
|
||||||
event.getPlayer().getInventory().remove(event.getItem());
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,8 +104,18 @@ public class ItemdupeCheck extends Check {
|
||||||
|
|
||||||
// Register listeners for itemdupe check
|
// Register listeners for itemdupe check
|
||||||
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, itemdupePlayerListener, Priority.Lowest, plugin);
|
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);
|
pm.registerEvent(Event.Type.PLAYER_INTERACT, itemdupePlayerListener, Priority.Lowest, plugin);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void check(EntityDeathEvent event) {
|
||||||
|
|
||||||
|
if(event.getEntity() instanceof CraftPlayer) {
|
||||||
|
if(hasPermission((CraftPlayer)event.getEntity())) return;
|
||||||
|
|
||||||
|
((CraftPlayer)event.getEntity()).getHandle().x(); // close all inventory screens
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
package cc.co.evenprime.bukkit.nocheat.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
|
import org.bukkit.event.entity.EntityListener;
|
||||||
|
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.checks.ItemdupeCheck;
|
||||||
|
|
||||||
|
public class ItemdupeEntityListener extends EntityListener {
|
||||||
|
|
||||||
|
ItemdupeCheck check;
|
||||||
|
|
||||||
|
public ItemdupeEntityListener(ItemdupeCheck itemdupeCheck) {
|
||||||
|
check = itemdupeCheck;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEntityDeath(EntityDeathEvent event) {
|
||||||
|
|
||||||
|
check.check(event);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package cc.co.evenprime.bukkit.nocheat.listeners;
|
package cc.co.evenprime.bukkit.nocheat.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.event.player.PlayerListener;
|
import org.bukkit.event.player.PlayerListener;
|
||||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
|
@ -20,9 +21,17 @@ public class ItemdupePlayerListener extends PlayerListener {
|
||||||
if(!event.isCancelled()) check.check(event);
|
if(!event.isCancelled()) check.check(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||||
|
|
||||||
|
check.check(event);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
|
||||||
if(!event.isCancelled()) check.check(event);
|
if(!event.isCancelled()) check.check(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user