diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java index 107a624..0a5280e 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java @@ -25,6 +25,7 @@ import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -33,8 +34,10 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.DragType; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerArmorStandManipulateEvent; @@ -282,35 +285,87 @@ return; } ItemStack stack = e.getCurrentItem(); + ItemStack stackInHand = e.getCursor(); + Player player = (Player) e.getWhoClicked(); + ItemMeta meta = null; + ItemMeta metaInHand = null; + if (stack != null) { - ItemMeta meta = stack.getItemMeta(); - if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { - switch (e.getAction()) { - case NOTHING: - case PICKUP_ALL: - case PICKUP_HALF: - case PICKUP_ONE: - case PICKUP_SOME: - case PLACE_ALL: - case PLACE_ONE: - case PLACE_SOME: - case SWAP_WITH_CURSOR: - case COLLECT_TO_CURSOR: - case HOTBAR_SWAP: - break; - default: - e.setCancelled(true); - return; + meta = stack.getItemMeta(); + } + + if (stackInHand != null) { + metaInHand = stackInHand.getItemMeta(); + } + + if (e.getClick() == ClickType.NUMBER_KEY) { + int slot = e.getHotbarButton(); + if (slot >= 0 && slot < 9) { + if (!e.getWhoClicked().getInventory().equals(e.getInventory())) { + ItemStack swap = e.getWhoClicked().getInventory().getItem(slot); + if (swap != null) { + ItemMeta swapItemMeta = swap.getItemMeta(); + if (swapItemMeta != null && swapItemMeta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } + } } } } + if (meta != null && meta.getPersistentDataContainer().has(skipKey) || metaInHand != null && metaInHand.getPersistentDataContainer().has(skipKey)) { + switch (e.getAction()) { + case NOTHING: + case PICKUP_ALL: + case PICKUP_HALF: + case PICKUP_ONE: + case PICKUP_SOME: + case PLACE_ALL: + case PLACE_ONE: + case PLACE_SOME: + case SWAP_WITH_CURSOR: + case COLLECT_TO_CURSOR: + case HOTBAR_SWAP: + if (!e.getClickedInventory().equals(player.getInventory())) { + e.setCancelled(true); + } + break; + default: + e.setCancelled(true); + return; + } + } + ItemStack itemStack = e.getCurrentItem(); if (itemStack != null && itemStack.getType() != Material.AIR) { selectItem((Player) e.getWhoClicked(), itemStack.getType()); } } + @EventHandler + public void onItemDrag(InventoryDragEvent e) { + if (!isRunning()) { + return; + } + ItemStack stack = e.getCursor(); + ItemMeta stackMeta = null; + ItemStack oldStack = e.getOldCursor(); + ItemMeta oldStackMeta = null; + if (stack != null) { + if (stack.getItemMeta() != null) { + stackMeta = stack.getItemMeta(); + } + } + + if (oldStack.getItemMeta() != null) { + oldStackMeta = oldStack.getItemMeta(); + } + + if (stackMeta != null && stackMeta.getPersistentDataContainer().has(skipKey) || oldStackMeta != null && oldStackMeta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerInteractEntity(PlayerArmorStandManipulateEvent e) { Player p = e.getPlayer();