diff --git a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java index 3db2e17..36ef06f 100644 --- a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java @@ -2,6 +2,8 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.scoreboard.ChallengePlayer; +import de.fanta.challenges.scoreboard.Scorable; import de.fanta.challenges.scoreboard.ScoreManager; import de.fanta.challenges.utils.ChatSkullAPI.ChatSkull; import de.fanta.challenges.utils.ChatUtil; @@ -11,6 +13,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.NamespacedKey; +import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.boss.BarColor; @@ -26,13 +29,19 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; +import org.bukkit.event.player.PlayerArmorStandManipulateEvent; import org.bukkit.event.player.PlayerAttemptPickupItemEvent; +import org.bukkit.event.player.PlayerBucketEntityEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -49,6 +58,7 @@ public class ForceItemChallengeEvent implements Listener { private static boolean running; + private final Challenges plugin = Challenges.getPlugin(); private static boolean isRunning() { @@ -62,11 +72,12 @@ private static final ArrayList materials = new ArrayList<>(); private static final HashMap entityList = new HashMap<>(); + private static final HashMap itemByPlayerList = new HashMap<>(); private static final HashMap> playerMaterials = new HashMap<>(); - private final Map bossBarMap = new HashMap<>(); + private final Map bossBarMap = new HashMap<>(); private int taskId = -1; @@ -102,15 +113,30 @@ startUpdateTask(); for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + plugin.getScoreManager().join(new ChallengePlayer(pp)); mountArmorStand(pp); updateItem(pp); - pp.getInventory().addItem(stack); + pp.getInventory().setItem(8, skipItem); } setRunning(true); } else { stopUpdateTask(); setRunning(false); + + for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + pp.setGameMode(GameMode.SPECTATOR); + } + + for (Scorable scorable : plugin.getScoreManager().getByPositon(1)) { + OfflinePlayer p = (Bukkit.getServer().getOfflinePlayer(scorable.getName())); + if (p.isOnline()) { + String[] lines = {"", "", "", " " + ChatUtil.BLUE + p.getName(), ChatUtil.GREEN + " hat " + plugin.getScoreManager().getScore(scorable) + " Items gesammelt", ChatUtil.GREEN + " und hat damit gewonnen!", "", ""}; + ChatSkull.sendAll((Player) p, lines); + } else { + ChatUtil.sendBrodcastMessage(ChatUtil.BLUE + scorable.getName() + ChatUtil.GREEN + " hat " + plugin.getScoreManager().getScore(scorable) + " Items gesammelt und hat damit gewonnen!", ChatUtil.BLUE); + } + } } } } @@ -124,6 +150,7 @@ entity.remove(); entityList.get(player.getUniqueId()).remove(); } + plugin.getScoreManager().leave(new ChallengePlayer(player)); } } @@ -131,11 +158,12 @@ public void onPlayerJoin(PlayerJoinEvent e) { if (isRunning()) { Player player = e.getPlayer(); + plugin.getScoreManager().join(new ChallengePlayer(player)); mountArmorStand(player); if (itemByPlayerList.get(player.getUniqueId()) != null) { updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); } else { - player.getInventory().addItem(skipItem); + player.getInventory().setItem(8, skipItem); updateItem(player); } } @@ -156,10 +184,29 @@ @EventHandler public void onPickUpItem(PlayerAttemptPickupItemEvent e) { + ItemStack itemStack = e.getItem().getItemStack(); + Player player = e.getPlayer(); if (isRunning()) { - Player player = e.getPlayer(); - Material pickupItem = e.getItem().getItemStack().getType(); - selectItem(player, pickupItem); + selectItem(player, itemStack.getType()); + } + } + + @EventHandler + public void onBucketFill(PlayerBucketFillEvent e) { + ItemStack itemStack = e.getItemStack(); + Player player = e.getPlayer(); + if (isRunning()) { + if (itemStack != null) { + selectItem(player, itemStack.getType()); + } + } + } + + @EventHandler + public void onBucketChatchFish(PlayerBucketEntityEvent e) { + ItemStack itemStack = e.getEntityBucket(); + if (isRunning()) { + selectItem(e.getPlayer(), itemStack.getType()); } } @@ -188,6 +235,19 @@ } @EventHandler + public void onSwapItem(PlayerSwapHandItemsEvent e) { + if (!isRunning()) { + return; + } + Player p = e.getPlayer(); + ItemStack stack = p.getInventory().getItemInMainHand(); + ItemMeta meta = stack.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } + } + + @EventHandler public void onItemMove(InventoryMoveItemEvent e) { if (!isRunning()) { return; @@ -200,17 +260,55 @@ } @EventHandler - public void onDrag(InventoryDragEvent e) { + public void onInventoryClick(InventoryClickEvent e) { if (!isRunning()) { return; } - ItemStack stack = e.getCursor(); + ItemStack stack = e.getCurrentItem(); if (stack != null) { ItemMeta meta = stack.getItemMeta(); if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { e.setCancelled(true); } } + + if (e.getClick() == ClickType.NUMBER_KEY) { + int slot = e.getHotbarButton(); + if (slot >= 0 && slot < 9) { + ItemStack swap = e.getWhoClicked().getInventory().getItem(slot); + if (swap != null) { + ItemMeta meta = swap.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } + } + } + } + + if (e.getAction() == InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) { + ItemStack otherSlot = (e.getClick() == ClickType.SWAP_OFFHAND) ? e.getWhoClicked().getInventory().getItemInOffHand() : e.getWhoClicked().getInventory().getItem(e.getHotbarButton()); + if (otherSlot != null) { + ItemMeta otherSlotMeta = otherSlot.getItemMeta(); + if (otherSlotMeta != null && otherSlotMeta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } + } + } + + ItemStack itemStack = e.getCurrentItem(); + if (itemStack != null && itemStack.getType() != Material.AIR) { + selectItem((Player) e.getWhoClicked(), itemStack.getType()); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerInteractEntity(PlayerArmorStandManipulateEvent e) { + Player p = e.getPlayer(); + ItemStack stack = p.getInventory().getItemInMainHand(); + ItemMeta meta = stack.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } } @EventHandler @@ -218,10 +316,12 @@ if (isRunning()) { ItemStack[] inv = e.getEntity().getInventory().getContents(); for (ItemStack stack : inv) { - ItemMeta meta = stack.getItemMeta(); - if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { - e.getItemsToKeep().add(stack); - e.getDrops().remove(stack); + if (stack != null) { + ItemMeta meta = stack.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + e.getItemsToKeep().add(stack); + e.getDrops().remove(stack); + } } } } @@ -311,7 +411,7 @@ stand.setInvisible(true); }, 5L); - updateBossBar(player); + updateBossBar(); } } @@ -341,22 +441,29 @@ ArrayList itemList = playerMaterials.getOrDefault(player.getUniqueId(), materials); itemList.remove(pickupItem); playerMaterials.put(player.getUniqueId(), itemList); - updateItem(player); + plugin.getScoreManager().updateScore(new ChallengePlayer(player), 1); + ChatUtil.sendNormalMessage(player, "Item: " + ChatUtil.BLUE + new ItemStack(pickupItem).getI18NDisplayName() + ChatUtil.GREEN + " wurde Registriert"); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 1.0F); - //plugin.getScoreManager().updateScore(new ChallengePlayer(player), 1); //TODO GANZ MACHEN + updateItem(player); + } } - public void updateBossBar(Player player) { + public void updateBossBar() { ScoreManager scoreManager = plugin.getScoreManager(); - Material playerItem = itemByPlayerList.get(player.getUniqueId()); - String bossBarTitle = ChatUtil.GREEN + ">> " + ChatUtil.BLUE + playerItem.toString().replace("_", " ") + ChatUtil.GREEN + " <<" + " | " + ChatUtil.GREEN + "Position: " + ChatUtil.BLUE + (scoreManager.getPlayerPosition(player) + 1); - BossBar bossBar = bossBarMap.computeIfAbsent(player, bossBarPlayer -> { - BossBar newBossBar = Bukkit.createBossBar(bossBarTitle, BarColor.GREEN, BarStyle.SOLID); - newBossBar.setVisible(true); - newBossBar.addPlayer(player); - return newBossBar; - }); - bossBar.setTitle(bossBarTitle); + for (Player player : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + Material playerItem = itemByPlayerList.get(player.getUniqueId()); + if (playerItem == null) { + return; + } + String bossBarTitle = ChatUtil.GREEN + ">> " + ChatUtil.BLUE + playerItem.toString().replace("_", " ") + ChatUtil.GREEN + " <<" + " | " + ChatUtil.GREEN + "Position: " + ChatUtil.BLUE + (scoreManager.getPosition(new ChallengePlayer(player))); + BossBar bossBar = bossBarMap.computeIfAbsent(player.getUniqueId(), bossbarPlayer -> { + BossBar newBossBar = Bukkit.createBossBar(bossBarTitle, BarColor.GREEN, BarStyle.SOLID); + newBossBar.setVisible(true); + newBossBar.addPlayer(player); + return newBossBar; + }); + bossBar.setTitle(bossBarTitle); + } } }