Skip to content

Commit 8a4793e

Browse files
committed
improve handling of inventory clicks
rewrite hopper32 patch to way less lag
1 parent 35ea3d6 commit 8a4793e

File tree

2 files changed

+66
-27
lines changed

2 files changed

+66
-27
lines changed

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

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,17 @@
2727
import org.bukkit.event.Listener;
2828
import org.bukkit.event.block.BlockDispenseEvent;
2929
import org.bukkit.event.entity.EntityDamageByEntityEvent;
30+
import org.bukkit.event.inventory.ClickType;
3031
import org.bukkit.event.inventory.InventoryClickEvent;
31-
import org.bukkit.event.inventory.InventoryInteractEvent;
32-
import org.bukkit.event.inventory.InventoryMoveItemEvent;
32+
import org.bukkit.event.inventory.InventoryDragEvent;
3333
import org.bukkit.event.inventory.InventoryOpenEvent;
3434
import org.bukkit.event.player.PlayerAttemptPickupItemEvent;
3535
import org.bukkit.event.player.PlayerDropItemEvent;
3636
import org.bukkit.event.player.PlayerInteractEntityEvent;
3737
import org.bukkit.event.player.PlayerInteractEvent;
3838
import org.bukkit.event.player.PlayerItemConsumeEvent;
39+
import org.bukkit.event.player.PlayerItemHeldEvent;
40+
import org.bukkit.event.player.PlayerSwapHandItemsEvent;
3941
import org.bukkit.event.world.ChunkLoadEvent;
4042
import org.bukkit.inventory.InventoryHolder;
4143
import org.bukkit.inventory.ItemStack;
@@ -104,13 +106,20 @@ private void onInventoryOpen(InventoryOpenEvent event) {
104106
if (config.getBoolean(configPath + ".prevent-hopper32k-mechanic", false, """
105107
Prevents Hopper32k mechanic of placing a shulker containing illegals on top\s
106108
of a hopper, then using the illegal out of the hopper's inventory.\s
107-
WARNING: Hooks into InventoryMoveItemEvent, which can become VERY resource\s
108-
intense as the event fires in high frequencies as soon as players start using\s
109-
farms or item sorters. Recommended to leave off if not necessary.""")) {
109+
No longer hooks into InventoryMoveItemEvent and is therefore way less laggy.""")) {
110110
optionalListeners.add(new Listener() {
111-
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
112-
private void onItemGoesThroughHopper(InventoryMoveItemEvent event) {
113-
if (legalityOf(event.getItem()) != ItemLegality.LEGAL) {
111+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
112+
private void onPlayerItemHeld(PlayerItemHeldEvent event) { // Fired when a hot bar item selection changes
113+
if (legalityOf(event.getPlayer().getInventory().getItem(event.getNewSlot())) != ItemLegality.LEGAL
114+
|| legalityOf(event.getPlayer().getInventory().getItem(event.getPreviousSlot())) != ItemLegality.LEGAL) {
115+
event.setCancelled(true);
116+
}
117+
}
118+
119+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
120+
private void onPlayerItemHeld(PlayerSwapHandItemsEvent event) { // Fired when swapped between off and main hand
121+
if (legalityOf(event.getMainHandItem()) != ItemLegality.LEGAL
122+
|| legalityOf(event.getOffHandItem()) != ItemLegality.LEGAL) {
114123
event.setCancelled(true);
115124
}
116125
}
@@ -248,20 +257,31 @@ public void onPlayerArmorChange(PlayerArmorChangeEvent event) {
248257

249258
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
250259
public void onInventoryClick(InventoryClickEvent event) {
251-
if (event.isCancelled() && handling == IllegalHandling.PREVENT_USE_ONLY) return;
252260
if (guiPluginsSupported && event.getInventory().getLocation() == null) return;
253261

262+
if (handling == IllegalHandling.PREVENT_USE_ONLY) {
263+
if ( event.isCancelled()
264+
|| event.getClick() == ClickType.DROP
265+
|| event.getClick() == ClickType.CONTROL_DROP
266+
|| event.getClick() == ClickType.WINDOW_BORDER_LEFT
267+
|| event.getClick() == ClickType.WINDOW_BORDER_RIGHT) {
268+
return;
269+
}
270+
}
271+
254272
if (listenerCooldowns.get(event.getClass(), createIfAbsent).contains(event.getWhoClicked().getUniqueId())) {
255273
event.setCancelled(true);
256274
return;
257275
}
258276

259277
if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) return;
260278

261-
ItemLegality clickedLegality = legalityOf(event.getCurrentItem());
279+
ItemStack currentItem = event.getCurrentItem();
280+
ItemLegality clickedLegality = legalityOf(currentItem);
262281
if (clickedLegality != ItemLegality.LEGAL) {
263282
event.setCancelled(true);
264-
handleItem(event.getCurrentItem(), clickedLegality);
283+
handleItem(currentItem, clickedLegality);
284+
event.setCurrentItem(currentItem);
265285
listenerCooldowns.get(event.getClass(), createIfAbsent).add(event.getWhoClicked().getUniqueId());
266286
}
267287

@@ -274,8 +294,8 @@ public void onInventoryClick(InventoryClickEvent event) {
274294
}
275295

276296
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
277-
public void onInventoryInteract(InventoryInteractEvent event) {
278-
if (event.isCancelled() && handling == IllegalHandling.PREVENT_USE_ONLY) return;
297+
public void onInventoryDrag(InventoryDragEvent event) {
298+
if (handling == IllegalHandling.PREVENT_USE_ONLY) return;
279299
if (guiPluginsSupported && event.getInventory().getLocation() == null) return;
280300

281301
if (listenerCooldowns.get(event.getClass(), createIfAbsent).contains(event.getWhoClicked().getUniqueId())) {

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

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,17 @@
2727
import org.bukkit.event.Listener;
2828
import org.bukkit.event.block.BlockDispenseEvent;
2929
import org.bukkit.event.entity.EntityDamageByEntityEvent;
30+
import org.bukkit.event.inventory.ClickType;
3031
import org.bukkit.event.inventory.InventoryClickEvent;
31-
import org.bukkit.event.inventory.InventoryInteractEvent;
32-
import org.bukkit.event.inventory.InventoryMoveItemEvent;
32+
import org.bukkit.event.inventory.InventoryDragEvent;
3333
import org.bukkit.event.inventory.InventoryOpenEvent;
3434
import org.bukkit.event.player.PlayerAttemptPickupItemEvent;
3535
import org.bukkit.event.player.PlayerDropItemEvent;
3636
import org.bukkit.event.player.PlayerInteractEntityEvent;
3737
import org.bukkit.event.player.PlayerInteractEvent;
3838
import org.bukkit.event.player.PlayerItemConsumeEvent;
39+
import org.bukkit.event.player.PlayerItemHeldEvent;
40+
import org.bukkit.event.player.PlayerSwapHandItemsEvent;
3941
import org.bukkit.event.world.ChunkLoadEvent;
4042
import org.bukkit.inventory.InventoryHolder;
4143
import org.bukkit.inventory.ItemStack;
@@ -104,13 +106,20 @@ private void onInventoryOpen(InventoryOpenEvent event) {
104106
if (config.getBoolean(configPath + ".prevent-hopper32k-mechanic", false,
105107
"Prevents Hopper32k mechanic of placing a shulker containing illegals on top\n" +
106108
"of a hopper, then using the illegal out of the hopper's inventory.\n" +
107-
"WARNING: Hooks into InventoryMoveItemEvent, which can become VERY resource\n" +
108-
"intense as the event fires in high frequencies as soon as players start using\n" +
109-
"farms or item sorters. Recommended to leave off if not necessary.")) {
109+
"No longer hooks into InventoryMoveItemEvent and is therefore way less laggy.")) {
110110
optionalListeners.add(new Listener() {
111-
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
112-
private void onItemGoesThroughHopper(InventoryMoveItemEvent event) {
113-
if (legalityOf(event.getItem()) != ItemLegality.LEGAL) {
111+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
112+
private void onPlayerItemHeld(PlayerItemHeldEvent event) { // Fired when a hot bar item selection changes
113+
if (legalityOf(event.getPlayer().getInventory().getItem(event.getNewSlot())) != ItemLegality.LEGAL
114+
|| legalityOf(event.getPlayer().getInventory().getItem(event.getPreviousSlot())) != ItemLegality.LEGAL) {
115+
event.setCancelled(true);
116+
}
117+
}
118+
119+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
120+
private void onPlayerItemHeld(PlayerSwapHandItemsEvent event) { // Fired when swapped between off and main hand
121+
if (legalityOf(event.getMainHandItem()) != ItemLegality.LEGAL
122+
|| legalityOf(event.getOffHandItem()) != ItemLegality.LEGAL) {
114123
event.setCancelled(true);
115124
}
116125
}
@@ -247,21 +256,31 @@ public void onPlayerArmorChange(PlayerArmorChangeEvent event) {
247256

248257
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
249258
public void onInventoryClick(InventoryClickEvent event) {
250-
if (event.isCancelled() && handling == IllegalHandling.PREVENT_USE_ONLY) return;
251-
252259
if (guiPluginsSupported && event.getInventory().getLocation() == null) return;
253260

261+
if (handling == IllegalHandling.PREVENT_USE_ONLY) {
262+
if ( event.isCancelled()
263+
|| event.getClick() == ClickType.DROP
264+
|| event.getClick() == ClickType.CONTROL_DROP
265+
|| event.getClick() == ClickType.WINDOW_BORDER_LEFT
266+
|| event.getClick() == ClickType.WINDOW_BORDER_RIGHT) {
267+
return;
268+
}
269+
}
270+
254271
if (listenerCooldowns.get(event.getClass(), createIfAbsent).contains(event.getWhoClicked().getUniqueId())) {
255272
event.setCancelled(true);
256273
return;
257274
}
258275

259276
if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) return;
260277

261-
ItemLegality clickedLegality = legalityOf(event.getCurrentItem());
278+
ItemStack currentItem = event.getCurrentItem();
279+
ItemLegality clickedLegality = legalityOf(currentItem);
262280
if (clickedLegality != ItemLegality.LEGAL) {
263281
event.setCancelled(true);
264-
handleItem(event.getCurrentItem(), clickedLegality);
282+
handleItem(currentItem, clickedLegality);
283+
event.setCurrentItem(currentItem);
265284
listenerCooldowns.get(event.getClass(), createIfAbsent).add(event.getWhoClicked().getUniqueId());
266285
}
267286

@@ -274,8 +293,8 @@ public void onInventoryClick(InventoryClickEvent event) {
274293
}
275294

276295
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
277-
public void onInventoryInteract(InventoryInteractEvent event) {
278-
if (event.isCancelled() && handling == IllegalHandling.PREVENT_USE_ONLY) return;
296+
public void onInventoryDrag(InventoryDragEvent event) {
297+
if (handling == IllegalHandling.PREVENT_USE_ONLY) return;
279298
if (guiPluginsSupported && event.getInventory().getLocation() == null) return;
280299

281300
if (listenerCooldowns.get(event.getClass(), createIfAbsent).contains(event.getWhoClicked().getUniqueId())) {

0 commit comments

Comments
 (0)