|
9 | 9 | import me.xginko.aef.modules.AEFModule; |
10 | 10 | import me.xginko.aef.utils.ChunkUtil; |
11 | 11 | import me.xginko.aef.utils.EntityUtil; |
| 12 | +import me.xginko.aef.utils.ItemUtil; |
12 | 13 | import me.xginko.aef.utils.MaterialUtil; |
13 | 14 | import me.xginko.aef.utils.WorldUtil; |
14 | 15 | import me.xginko.aef.utils.enums.IllegalHandling; |
|
26 | 27 | import org.bukkit.event.Listener; |
27 | 28 | import org.bukkit.event.block.BlockDispenseEvent; |
28 | 29 | import org.bukkit.event.entity.EntityDamageByEntityEvent; |
| 30 | +import org.bukkit.event.inventory.InventoryAction; |
29 | 31 | import org.bukkit.event.inventory.InventoryClickEvent; |
30 | 32 | import org.bukkit.event.inventory.InventoryDragEvent; |
31 | 33 | import org.bukkit.event.inventory.InventoryOpenEvent; |
@@ -101,7 +103,7 @@ private void onInventoryOpen(InventoryOpenEvent event) { |
101 | 103 | "Prevents Hopper32k mechanic of placing a shulker containing illegals on top\n" + |
102 | 104 | "of a hopper, then using the illegal out of the hopper's inventory.\n" + |
103 | 105 | "No longer hooks into InventoryMoveItemEvent and is therefore way less laggy.") |
104 | | - && illegalHandling != IllegalHandling.PREVENT_USE_ONLY) { |
| 106 | + && illegalHandling != IllegalHandling.ACTION_ON_USE) { |
105 | 107 | optionalListeners.add(new Listener() { |
106 | 108 | @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |
107 | 109 | private void onPlayerItemHeld(PlayerItemHeldEvent event) { // Fired when a hot bar item selection changes |
@@ -253,36 +255,59 @@ public void onBlockDispense(BlockDispenseEvent event) { |
253 | 255 |
|
254 | 256 | @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) |
255 | 257 | 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; |
257 | 265 |
|
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); |
261 | 269 | } |
| 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(); |
262 | 277 | } |
263 | 278 |
|
264 | 279 | @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) |
265 | 280 | public void onInventoryClick(InventoryClickEvent event) { |
266 | | - if (illegalHandling == IllegalHandling.PREVENT_USE_ONLY) return; |
267 | 281 | if (guiPluginsSupported && event.getInventory().getLocation() == null) return; |
268 | 282 |
|
| 283 | + if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) { |
| 284 | + return; |
| 285 | + } |
| 286 | + |
269 | 287 | if (isCoolingDown(event, event.getWhoClicked().getUniqueId())) { |
270 | 288 | event.setCancelled(true); |
271 | 289 | return; |
272 | 290 | } |
273 | 291 |
|
274 | | - if (AnarchyExploitFixes.permissions().permissionValue(event.getWhoClicked(), bypassPermission.node()).toBoolean()) return; |
275 | | - |
276 | 292 | ItemLegality clickedLegality = legalityOf(event.getCurrentItem()); |
| 293 | + |
277 | 294 | 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 | + } |
283 | 307 | } |
284 | 308 |
|
285 | 309 | ItemLegality cursorLegality = legalityOf(event.getCursor()); |
| 310 | + |
286 | 311 | if (cursorLegality != ItemLegality.LEGAL) { |
287 | 312 | event.setCancelled(true); |
288 | 313 | handleItem(event.getCursor(), cursorLegality); |
|
0 commit comments