2727import org .bukkit .event .Listener ;
2828import org .bukkit .event .block .BlockDispenseEvent ;
2929import org .bukkit .event .entity .EntityDamageByEntityEvent ;
30+ import org .bukkit .event .inventory .ClickType ;
3031import 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 ;
3333import org .bukkit .event .inventory .InventoryOpenEvent ;
3434import org .bukkit .event .player .PlayerAttemptPickupItemEvent ;
3535import org .bukkit .event .player .PlayerDropItemEvent ;
3636import org .bukkit .event .player .PlayerInteractEntityEvent ;
3737import org .bukkit .event .player .PlayerInteractEvent ;
3838import org .bukkit .event .player .PlayerItemConsumeEvent ;
39+ import org .bukkit .event .player .PlayerItemHeldEvent ;
40+ import org .bukkit .event .player .PlayerSwapHandItemsEvent ;
3941import org .bukkit .event .world .ChunkLoadEvent ;
4042import org .bukkit .inventory .InventoryHolder ;
4143import 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