Skip to content

Commit 6f49c59

Browse files
committed
illegal handling improvements
1 parent 43a2e15 commit 6f49c59

File tree

3 files changed

+91
-26
lines changed

3 files changed

+91
-26
lines changed

AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/illegals/items/IllegalItemModule.java

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import me.xginko.aef.modules.AEFModule;
1111
import me.xginko.aef.utils.ChunkUtil;
1212
import me.xginko.aef.utils.EntityUtil;
13+
import me.xginko.aef.utils.ItemUtil;
1314
import me.xginko.aef.utils.MaterialUtil;
1415
import me.xginko.aef.utils.enums.IllegalHandling;
1516
import me.xginko.aef.utils.enums.ItemLegality;
@@ -26,6 +27,7 @@
2627
import org.bukkit.event.Listener;
2728
import org.bukkit.event.block.BlockDispenseEvent;
2829
import org.bukkit.event.entity.EntityDamageByEntityEvent;
30+
import org.bukkit.event.inventory.InventoryAction;
2931
import org.bukkit.event.inventory.InventoryClickEvent;
3032
import org.bukkit.event.inventory.InventoryDragEvent;
3133
import org.bukkit.event.inventory.InventoryOpenEvent;
@@ -74,7 +76,7 @@ public IllegalItemModule(String configPath, boolean defEnabled, AEFPermission by
7476
try {
7577
handling = IllegalHandling.valueOf(configuredHandling);
7678
} catch (IllegalArgumentException e) {
77-
handling = IllegalHandling.PREVENT_USE_ONLY;
79+
handling = IllegalHandling.ACTION_ON_USE;
7880
warn("Handling option '" + configuredHandling + "' not recognized. Defaulting to " + handling.name());
7981
}
8082
this.illegalHandling = handling;
@@ -254,36 +256,59 @@ public void onBlockDispense(BlockDispenseEvent event) {
254256

255257
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
256258
public void onPlayerArmorChange(PlayerArmorChangeEvent event) {
257-
if (illegalHandling == IllegalHandling.PREVENT_USE_ONLY) return; // Cant cancel this event
259+
if (AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), bypassPermission.node()).toBoolean()) return;
260+
261+
ItemStack newItem = event.getPlayer().getInventory().getItem(ItemUtil.getEquipmentSlot(event.getSlotType()));
262+
if (newItem == null || MaterialUtil.AIR.get().contains(newItem.getType())) return;
263+
264+
ItemLegality legality = legalityOf(newItem);
265+
if (legality == ItemLegality.LEGAL) return;
258266

259-
if (!AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), bypassPermission.node()).toBoolean()) {
260-
handleItem(event.getNewItem(), legalityOf(event.getNewItem()));
261-
handleItem(event.getOldItem(), legalityOf(event.getOldItem()));
267+
// Revert item if configured to do so
268+
if (illegalHandling != IllegalHandling.PREVENT_USE_ONLY) {
269+
handleItem(newItem, legality);
262270
}
271+
272+
// Drop item at player location
273+
event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), newItem);
274+
// Ensure dropped item is voided
275+
event.getPlayer().getInventory().setItem(ItemUtil.getEquipmentSlot(event.getSlotType()), null);
276+
// Force update player inventory
277+
event.getPlayer().updateInventory();
263278
}
264279

265280
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
266281
public void onInventoryClick(InventoryClickEvent event) {
267-
if (illegalHandling == IllegalHandling.PREVENT_USE_ONLY) return;
268282
if (guiPluginsSupported && event.getInventory().getLocation() == null) return;
269283

284+
if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) {
285+
return;
286+
}
287+
270288
if (isCoolingDown(event, event.getWhoClicked().getUniqueId())) {
271289
event.setCancelled(true);
272290
return;
273291
}
274292

275-
if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) return;
276-
277293
ItemLegality clickedLegality = legalityOf(event.getCurrentItem());
294+
278295
if (clickedLegality != ItemLegality.LEGAL) {
279-
event.setCancelled(true);
280-
ItemStack currentItem = event.getCurrentItem().clone();
281-
handleItem(currentItem, clickedLegality);
282-
event.setCurrentItem(currentItem);
283-
setCoolingDown(event, event.getWhoClicked().getUniqueId());;
296+
if (illegalHandling == IllegalHandling.PREVENT_USE_ONLY) {
297+
// Prevent picking up illegal totems/shields with swap key
298+
if (event.getAction() == InventoryAction.HOTBAR_SWAP) {
299+
event.setCancelled(true);
300+
}
301+
} else {
302+
ItemStack currentItem = event.getCurrentItem().clone();
303+
event.setCancelled(true);
304+
handleItem(currentItem, clickedLegality);
305+
event.setCurrentItem(currentItem);
306+
setCoolingDown(event, event.getWhoClicked().getUniqueId());;
307+
}
284308
}
285309

286310
ItemLegality cursorLegality = legalityOf(event.getCursor());
311+
287312
if (cursorLegality != ItemLegality.LEGAL) {
288313
event.setCancelled(true);
289314
handleItem(event.getCursor(), cursorLegality);

AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/illegals/items/IllegalItemModule.java

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import me.xginko.aef.modules.AEFModule;
1010
import me.xginko.aef.utils.ChunkUtil;
1111
import me.xginko.aef.utils.EntityUtil;
12+
import me.xginko.aef.utils.ItemUtil;
1213
import me.xginko.aef.utils.MaterialUtil;
1314
import me.xginko.aef.utils.WorldUtil;
1415
import me.xginko.aef.utils.enums.IllegalHandling;
@@ -26,6 +27,7 @@
2627
import org.bukkit.event.Listener;
2728
import org.bukkit.event.block.BlockDispenseEvent;
2829
import org.bukkit.event.entity.EntityDamageByEntityEvent;
30+
import org.bukkit.event.inventory.InventoryAction;
2931
import org.bukkit.event.inventory.InventoryClickEvent;
3032
import org.bukkit.event.inventory.InventoryDragEvent;
3133
import org.bukkit.event.inventory.InventoryOpenEvent;
@@ -101,7 +103,7 @@ private void onInventoryOpen(InventoryOpenEvent event) {
101103
"Prevents Hopper32k mechanic of placing a shulker containing illegals on top\n" +
102104
"of a hopper, then using the illegal out of the hopper's inventory.\n" +
103105
"No longer hooks into InventoryMoveItemEvent and is therefore way less laggy.")
104-
&& illegalHandling != IllegalHandling.PREVENT_USE_ONLY) {
106+
&& illegalHandling != IllegalHandling.ACTION_ON_USE) {
105107
optionalListeners.add(new Listener() {
106108
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
107109
private void onPlayerItemHeld(PlayerItemHeldEvent event) { // Fired when a hot bar item selection changes
@@ -253,36 +255,59 @@ public void onBlockDispense(BlockDispenseEvent event) {
253255

254256
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
255257
public void onPlayerArmorChange(PlayerArmorChangeEvent event) {
256-
if (illegalHandling == IllegalHandling.PREVENT_USE_ONLY) return; // Cant cancel this event
258+
if (AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), bypassPermission.node()).toBoolean()) return;
259+
260+
ItemStack newItem = event.getPlayer().getInventory().getItem(ItemUtil.getEquipmentSlot(event.getSlotType()));
261+
if (newItem == null || MaterialUtil.AIR.get().contains(newItem.getType())) return;
262+
263+
ItemLegality legality = legalityOf(newItem);
264+
if (legality == ItemLegality.LEGAL) return;
257265

258-
if (!AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), bypassPermission.node()).toBoolean()) {
259-
handleItem(event.getNewItem(), legalityOf(event.getNewItem()));
260-
handleItem(event.getOldItem(), legalityOf(event.getOldItem()));
266+
// Revert item if configured to do so
267+
if (illegalHandling != IllegalHandling.PREVENT_USE_ONLY) {
268+
handleItem(newItem, legality);
261269
}
270+
271+
// Drop item at player location
272+
event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), newItem);
273+
// Ensure dropped item is voided
274+
event.getPlayer().getInventory().setItem(ItemUtil.getEquipmentSlot(event.getSlotType()), null);
275+
// Force update player inventory
276+
event.getPlayer().updateInventory();
262277
}
263278

264279
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
265280
public void onInventoryClick(InventoryClickEvent event) {
266-
if (illegalHandling == IllegalHandling.PREVENT_USE_ONLY) return;
267281
if (guiPluginsSupported && event.getInventory().getLocation() == null) return;
268282

283+
if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) {
284+
return;
285+
}
286+
269287
if (isCoolingDown(event, event.getWhoClicked().getUniqueId())) {
270288
event.setCancelled(true);
271289
return;
272290
}
273291

274-
if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) return;
275-
276292
ItemLegality clickedLegality = legalityOf(event.getCurrentItem());
293+
277294
if (clickedLegality != ItemLegality.LEGAL) {
278-
ItemStack currentItem = event.getCurrentItem().clone();
279-
event.setCancelled(true);
280-
handleItem(currentItem, clickedLegality);
281-
event.setCurrentItem(currentItem);
282-
setCoolingDown(event, event.getWhoClicked().getUniqueId());;
295+
if (illegalHandling == IllegalHandling.PREVENT_USE_ONLY) {
296+
// Prevent picking up illegal totems/shields with swap key
297+
if (event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || event.getAction() == InventoryAction.HOTBAR_SWAP) {
298+
event.setCancelled(true);
299+
}
300+
} else {
301+
ItemStack currentItem = event.getCurrentItem().clone();
302+
event.setCancelled(true);
303+
handleItem(currentItem, clickedLegality);
304+
event.setCurrentItem(currentItem);
305+
setCoolingDown(event, event.getWhoClicked().getUniqueId());;
306+
}
283307
}
284308

285309
ItemLegality cursorLegality = legalityOf(event.getCursor());
310+
286311
if (cursorLegality != ItemLegality.LEGAL) {
287312
event.setCancelled(true);
288313
handleItem(event.getCursor(), cursorLegality);

shared/src/main/java/me/xginko/aef/utils/ItemUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package me.xginko.aef.utils;
22

33
import com.cryptomorin.xseries.XMaterial;
4+
import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent;
45
import de.tr7zw.changeme.nbtapi.NBT;
56
import io.papermc.paper.datacomponent.DataComponentTypes;
67
import me.xginko.aef.utils.reflection.ReflectionUtil;
78
import net.kyori.adventure.text.Component;
89
import net.kyori.adventure.text.minimessage.MiniMessage;
910
import org.bukkit.Bukkit;
11+
import org.bukkit.inventory.EquipmentSlot;
1012
import org.bukkit.inventory.InventoryHolder;
1113
import org.bukkit.inventory.ItemStack;
1214
import org.bukkit.inventory.meta.BlockStateMeta;
@@ -18,11 +20,14 @@
1820
import org.jetbrains.annotations.UnmodifiableView;
1921

2022
import java.nio.charset.StandardCharsets;
23+
import java.util.EnumMap;
24+
import java.util.Map;
2125

2226
public final class ItemUtil {
2327

2428
public static final boolean MAP_SET_TRACKING_POS_AVAILABLE;
2529
private static final boolean BUNDLES_SUPPPORTED, USE_MINIMSG_BOOKMETA, COMPONENTS_SUPPORTED;
30+
private static final Map<PlayerArmorChangeEvent.SlotType, EquipmentSlot> EQUIPMENT_SLOT_MAP;
2631

2732
static {
2833
MAP_SET_TRACKING_POS_AVAILABLE
@@ -40,6 +45,16 @@ public final class ItemUtil {
4045
COMPONENTS_SUPPORTED
4146
= ReflectionUtil.hasClass("io.papermc.paper.datacomponent.DataComponentTypes")
4247
&& ReflectionUtil.hasMethod(ItemStack.class, "getData");
48+
49+
EQUIPMENT_SLOT_MAP = new EnumMap<>(PlayerArmorChangeEvent.SlotType.class);
50+
EQUIPMENT_SLOT_MAP.put(PlayerArmorChangeEvent.SlotType.HEAD, EquipmentSlot.HEAD);
51+
EQUIPMENT_SLOT_MAP.put(PlayerArmorChangeEvent.SlotType.CHEST, EquipmentSlot.CHEST);
52+
EQUIPMENT_SLOT_MAP.put(PlayerArmorChangeEvent.SlotType.LEGS, EquipmentSlot.LEGS);
53+
EQUIPMENT_SLOT_MAP.put(PlayerArmorChangeEvent.SlotType.FEET, EquipmentSlot.FEET);
54+
}
55+
56+
public static EquipmentSlot getEquipmentSlot(PlayerArmorChangeEvent.SlotType slotType) {
57+
return EQUIPMENT_SLOT_MAP.getOrDefault(slotType, EquipmentSlot.HAND);
4358
}
4459

4560
/**

0 commit comments

Comments
 (0)