diff --git a/src/main/java/de/fanta/challenges/challenges/BingoChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/BingoChallengeEvent.java index 3d8b09f..7dd2a7b 100644 --- a/src/main/java/de/fanta/challenges/challenges/BingoChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/BingoChallengeEvent.java @@ -3,6 +3,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; import de.fanta.challenges.guis.eventgui.EventItemsGui; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.teams.ChallengeTeam; import de.fanta.challenges.teams.TeamUtils; import de.fanta.challenges.utils.ChatSkullAPI.ChatSkull; @@ -176,11 +177,11 @@ items.add(material); playerMaterials.put(uuid, items); - plugin.getScoreManager().updateScore(player, 1); + plugin.getScoreManager().updateScore(new ChallengePlayer(player), 1); ChatUtil.sendNormalMessage(player, "Item: " + ChatUtil.BLUE + itemStack.getI18NDisplayName() + ChatUtil.GREEN + " wurde Registriert"); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 2.0F); - if (plugin.getScoreManager().getScore(player) == materials.size()) { + if (plugin.getScoreManager().getScore(new ChallengePlayer(player)) == materials.size()) { plugin.getTimer().stopTimer(); GUIUtils.sendTitleToAll("Event", ChatUtil.BLUE + player.getName() + ChatUtil.GREEN + " hat alle Items gefunden!", ChatUtil.BLUE); String[] lines = {"", "", "", " " + ChatUtil.BLUE + player.getName(), ChatUtil.GREEN + " hat alle Items gefunden!", "", "", ""}; @@ -204,13 +205,13 @@ playerMaterials.put(onlinePlayer.getUniqueId(), items); teamMaterials.put(team, items); if (!scoreset) { - plugin.getScoreManager().updateTeamScore(onlinePlayer, 1); + plugin.getScoreManager().updateScore(TeamUtils.getPlayerTeam(onlinePlayer), 1); scoreset = true; } ChatUtil.sendNormalMessage(onlinePlayer, "Item: " + ChatUtil.BLUE + itemStack.getI18NDisplayName() + ChatUtil.GREEN + " wurde Registriert"); onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 2.0F); - if (plugin.getScoreManager().getTeamScore(onlinePlayer) == materials.size()) { + if (plugin.getScoreManager().getScore(TeamUtils.getPlayerTeam(onlinePlayer)) == materials.size()) { if (eventend) { return; } diff --git a/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java index babe91e..1aba4a2 100644 --- a/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java @@ -2,6 +2,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.scoreboard.ScoreManager; import de.fanta.challenges.utils.ChatSkullAPI.ChatSkull; import de.fanta.challenges.utils.ChatUtil; @@ -53,7 +54,7 @@ if (!e.getTo().equals(e.getFrom())) { int distance = (int) p.getLocation().toVector().subtract(p.getWorld().getSpawnLocation().toVector()).length(); ScoreManager scoreManager = plugin.getScoreManager(); - scoreManager.setScore(p, distance); + scoreManager.setScore(new ChallengePlayer(p), distance); BossBar bossBar = bossBarMap.computeIfAbsent(p, player -> { BossBar newBossBar = Bukkit.createBossBar(ChatUtil.GREEN + "Position: " + ChatUtil.BLUE + (scoreManager.getPlayerPosition(p) + 1) + ChatUtil.RED + " | " + ChatUtil.GREEN + " Distanz zum Spawn: " + ChatUtil.BLUE + distance + " Blöcke", BarColor.GREEN, BarStyle.SOLID); @@ -137,7 +138,7 @@ public void onTimerChange(TimerChangedEvent e) { if (Objects.equals(plugin.getConfig().getString("event.type"), "deathrun")) { if (!e.isRunning()) { - Map.Entry maxEntry = plugin.getScoreManager().getScores().entrySet().stream().max(Map.Entry.comparingByValue()).get(); + Map.Entry maxEntry = null; //plugin.getScoreManager().getScores().entrySet().stream().max(Map.Entry.comparingByValue()).get(); //TODO: GANZ MACHEN OfflinePlayer p = (Bukkit.getServer().getOfflinePlayer(maxEntry.getKey())); if (p.isOnline()) { String[] lines = {"", "", "", " " + ChatUtil.BLUE + p.getName(), ChatUtil.GREEN + " ist " + maxEntry.getValue() + " Blöcke gelaufen und", ChatUtil.GREEN + " hat damit gewonnen!", "", ""}; diff --git a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java index 14d42b5..c912845 100644 --- a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java @@ -1,11 +1,22 @@ package de.fanta.challenges.challenges; import de.fanta.challenges.Challenges; +import de.fanta.challenges.events.PlayerCountChangedEvent; +import de.fanta.challenges.events.ServerStatusChangedEvent; import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.listeners.EventRegistration; +import de.fanta.challenges.scoreboard.ChallengePlayer; +import de.fanta.challenges.scoreboard.ScoreManager; +import de.fanta.challenges.utils.ChatUtil; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Sound; import org.bukkit.block.Block; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -13,40 +24,66 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; +import org.bukkit.event.player.PlayerAttemptPickupItemEvent; +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.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; import java.util.ArrayList; import java.util.HashMap; +import java.util.Map; import java.util.Objects; import java.util.Random; +import java.util.UUID; public class ForceItemChallengeEvent implements Listener { private static boolean running; private final Challenges plugin = Challenges.getPlugin(); - public static boolean isRunning() { + private static boolean isRunning() { return running; } - public void setRunning(boolean run) { + private void setRunning(boolean run) { running = run; } - public static ArrayList materials = new ArrayList<>(); + private static final ArrayList materials = new ArrayList<>(); - public static HashMap entityList = new HashMap<>(); - public static HashMap itemByPlayerList = new HashMap<>(); + private static final HashMap entityList = new HashMap<>(); + private static final HashMap itemByPlayerList = new HashMap<>(); + + private final Map bossBarMap = new HashMap<>(); private int taskId = -1; private final Random random = new Random(); + private ItemStack skipItem; + + private final NamespacedKey skipKey = new NamespacedKey(plugin, "SkipItem"); + @EventHandler public void onActivation(TimerChangedEvent event) { if (Objects.equals(plugin.getConfig().getString("event.type"), "forceitem")) { if (event.isRunning()) { + ItemStack stack = new ItemStack(Material.STRUCTURE_VOID, 3); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(ChatUtil.GREEN + "Skip Item"); + meta.getPersistentDataContainer().set(skipKey, PersistentDataType.STRING, "SkipItem"); + stack.setItemMeta(meta); + + skipItem = stack; + + for (Material material : Material.values()) { if (material.isItem() && !material.isAir() && !plugin.getNotAvailableMaterials().contains(material)) { materials.add(material); @@ -56,17 +93,9 @@ startUpdateTask(); for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { - if (pp.getPassengers().isEmpty()) { - Material material = materials.get(random.nextInt((materials.size() - 1) + 1)); - itemByPlayerList.put(pp, material); - ArmorStand stand = (ArmorStand) pp.getWorld().spawnEntity(pp.getLocation(), EntityType.ARMOR_STAND); - stand.setInvisible(true); - stand.getEquipment().setHelmet(new ItemStack(material)); - stand.setMarker(true); - entityList.remove(pp); - entityList.put(pp, stand); - pp.addPassenger(stand); - } + mountArmorStand(pp); + updateItem(pp); + pp.getInventory().addItem(stack); } setRunning(true); @@ -77,15 +106,28 @@ } } - @EventHandler - public void PlayerLeave(PlayerQuitEvent e) { + public void onPlayerLeave(PlayerQuitEvent e) { if (isRunning()) { Player player = e.getPlayer(); - Entity entity = entityList.get(player); + Entity entity = entityList.get(player.getUniqueId()); if (entity != null) { entity.remove(); - entityList.get(player).remove(); + entityList.get(player.getUniqueId()).remove(); + } + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + if (isRunning()) { + Player player = e.getPlayer(); + mountArmorStand(player); + if (itemByPlayerList.get(player.getUniqueId()) != null) { + updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); + } else { + player.getInventory().addItem(skipItem); + updateItem(player); } } } @@ -93,16 +135,95 @@ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPort(PlayerTeleportEvent e) { Player player = e.getPlayer(); - Entity entity = entityList.get(player); + Entity entity = entityList.get(player.getUniqueId()); if (entity != null) { Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { entity.teleport(player.getLocation()); - player.addPassenger(entityList.get(player)); + player.addPassenger(entityList.get(player.getUniqueId())); }, 3L); } } + @EventHandler + public void onPickUpItem(PlayerAttemptPickupItemEvent e) { + if (isRunning()) { + Player player = e.getPlayer(); + Material pickupItem = e.getItem().getItemStack().getType(); + selectItem(player, pickupItem); + } + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent e) { + if (isRunning()) { + ItemStack stack = e.getItemInHand(); + ItemMeta meta = stack.getItemMeta(); + + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } + } + } + + @EventHandler + public void onDropItem(PlayerDropItemEvent e) { + if (isRunning()) { + ItemStack stack = e.getItemDrop().getItemStack(); + ItemMeta meta = stack.getItemMeta(); + + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + e.setCancelled(true); + } + } + } + + @EventHandler + public void onMoveItem(InventoryMoveItemEvent e) { + if (isRunning()) { + ItemStack stack = e.getItem(); + ItemMeta meta = stack.getItemMeta(); + + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + if (e.getSource() != e.getDestination()) { + e.setCancelled(true); + } + } + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e) { + 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); + } + } + } + } + + @EventHandler + public void onClick(PlayerInteractEvent e) { + if (isRunning()) { + Player p = e.getPlayer(); + ItemStack stack = p.getInventory().getItemInMainHand(); + ItemMeta meta = stack.getItemMeta(); + Material playerItem = itemByPlayerList.get(p.getUniqueId()); + if (meta != null && meta.getPersistentDataContainer().has(skipKey)) { + ItemStack skipStack = skipItem.clone(); + skipStack.setAmount(1); + p.getInventory().removeItem(skipStack); + p.getInventory().addItem(new ItemStack(playerItem)); + selectItem(p, playerItem); + } + } + + } + public void startUpdateTask() { taskId = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this::tick, 1L, 1L)); } @@ -113,19 +234,22 @@ } private void tick() { - for (Player player : entityList.keySet()) { + for (UUID uuid : entityList.keySet()) { + if (!(Bukkit.getOfflinePlayer(uuid) instanceof Player player)) { + return; + } Location location = player.getLocation(); Block block = location.getBlock(); if (block.getType() == Material.NETHER_PORTAL || block.getType() == Material.END_PORTAL || block.getType() == Material.END_GATEWAY) { if (!player.getPassengers().isEmpty()) { Location standLocation = location.clone().add(0, 500, 0); - entityList.get(player).teleport(standLocation); + entityList.get(player.getUniqueId()).teleport(standLocation); } } else { if (player.getPassengers().isEmpty()) { - entityList.get(player).teleport(player.getLocation()); - player.addPassenger(entityList.get(player)); + entityList.get(player.getUniqueId()).teleport(player.getLocation()); + player.addPassenger(entityList.get(player.getUniqueId())); } } @@ -136,4 +260,57 @@ } } } + + public void mountArmorStand(Player player) { + if (player.getPassengers().isEmpty()) { + ArmorStand stand = (ArmorStand) player.getWorld().spawnEntity(player.getLocation(), EntityType.ARMOR_STAND); + stand.setInvisible(true); + stand.setMarker(true); + entityList.remove(player.getUniqueId()); + entityList.put(player.getUniqueId(), stand); + player.addPassenger(stand); + } + } + + public void updateArmorStand(Player player, Material material) { + if (entityList.containsKey(player.getUniqueId())) { + ArmorStand stand = (ArmorStand) entityList.get(player.getUniqueId()); + stand.getEquipment().setHelmet(new ItemStack(material)); + + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + stand.setInvisible(false); + stand.setInvisible(true); + }, 5L); + + updateBossBar(player); + } + } + + public void updateItem(Player player) { + Material item = materials.get(random.nextInt((materials.size() - 1) + 1)); + itemByPlayerList.put(player.getUniqueId(), item); + updateArmorStand(player, item); + } + + public void selectItem(Player player, Material pickupItem) { + Material playerItem = itemByPlayerList.get(player.getUniqueId()); + if (pickupItem.equals(playerItem)) { + updateItem(player); + player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 1.0F); + plugin.getScoreManager().updateScore(new ChallengePlayer(player), 1); + } + } + + public void updateBossBar(Player player) { + 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); + } } diff --git a/src/main/java/de/fanta/challenges/challenges/OreBattle.java b/src/main/java/de/fanta/challenges/challenges/OreBattle.java index fa1ae2d..e85aacd 100644 --- a/src/main/java/de/fanta/challenges/challenges/OreBattle.java +++ b/src/main/java/de/fanta/challenges/challenges/OreBattle.java @@ -2,6 +2,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.teams.ChallengeTeam; import de.fanta.challenges.teams.TeamUtils; import de.fanta.challenges.utils.ChatSkullAPI.ChatSkull; @@ -87,7 +88,7 @@ } else { setRunning(false); if (!plugin.getConfig().getBoolean("event.teams")) { - Map.Entry maxEntry = plugin.getScoreManager().getScores().entrySet().stream().max(Map.Entry.comparingByValue()).get(); + Map.Entry maxEntry = null; //plugin.getScoreManager().getScores().entrySet().stream().max(Map.Entry.comparingByValue()).get(); //TODO GANZ MACHEN OfflinePlayer p = (Bukkit.getServer().getOfflinePlayer(maxEntry.getKey())); if (p.isOnline()) { String[] lines = {"", "", "", " " + ChatUtil.BLUE + p.getName(), ChatUtil.GREEN + " hat " + maxEntry.getValue() + " Punkte und", ChatUtil.GREEN + " hat damit gewonnen!", "", ""}; @@ -97,7 +98,7 @@ } GUIUtils.sendTitleToAll("Event", ChatUtil.BLUE + p.getName() + ChatUtil.GREEN + " gewinnt mit " + ChatUtil.BLUE + maxEntry.getValue() + ChatUtil.GREEN + " Punkten", ChatUtil.GREEN); } else { - Map.Entry maxEntry = plugin.getScoreManager().getScores().entrySet().stream().max(Map.Entry.comparingByValue()).get(); + Map.Entry maxEntry = null; //plugin.getScoreManager().getScores().entrySet().stream().max(Map.Entry.comparingByValue()).get(); //TODO GANZ MACHEN ChallengeTeam team = TeamUtils.getTeam(maxEntry.getKey()); if (team != null) { GUIUtils.sendTitleToAll("Event", "Team " + team.getChatColor() + team.getName() + ChatUtil.GREEN + " gewinnt mit " + ChatUtil.BLUE + maxEntry.getValue() + ChatUtil.GREEN + " Punkten", ChatUtil.GREEN); @@ -118,9 +119,9 @@ if (isRunning()) { if (blocklist.containsKey(e.getBlock().getType())) { if (!plugin.getConfig().getBoolean("event.teams")) { - plugin.getScoreManager().updateScore(e.getPlayer(), blocklist.get(e.getBlock().getType())); + plugin.getScoreManager().updateScore(new ChallengePlayer(e.getPlayer()), blocklist.get(e.getBlock().getType())); } else { - plugin.getScoreManager().updateTeamScore(e.getPlayer(), blocklist.get(e.getBlock().getType())); + plugin.getScoreManager().updateScore(TeamUtils.getPlayerTeam(e.getPlayer()), blocklist.get(e.getBlock().getType())); } ChatUtil.sendTitleToPlayer(e.getPlayer(), "", ChatUtil.BLUE + new ItemStack(e.getBlock().getType()).getI18NDisplayName() + ChatUtil.GREEN + " +" + blocklist.get(e.getBlock().getType()), ChatUtil.GREEN, 3, 20, 3, false); } @@ -132,9 +133,9 @@ if (isRunning()) { if (blocklist.containsKey(e.getBlock().getType())) { if (!plugin.getConfig().getBoolean("event.teams")) { - plugin.getScoreManager().updateScore(e.getPlayer(), -blocklist.get(e.getBlock().getType())); + plugin.getScoreManager().updateScore(new ChallengePlayer(e.getPlayer()), -blocklist.get(e.getBlock().getType())); } else { - plugin.getScoreManager().updateTeamScore(e.getPlayer(), -blocklist.get(e.getBlock().getType())); + plugin.getScoreManager().updateScore(TeamUtils.getPlayerTeam(e.getPlayer()), -blocklist.get(e.getBlock().getType())); } ChatUtil.sendTitleToPlayer(e.getPlayer(), "", ChatUtil.BLUE + new ItemStack(e.getBlock().getType()).getI18NDisplayName() + ChatUtil.RED + " -" + blocklist.get(e.getBlock().getType()), ChatUtil.GREEN, 3, 20, 3, false); } diff --git a/src/main/java/de/fanta/challenges/challenges/SammelFieberChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/SammelFieberChallengeEvent.java index c687be9..a55539e 100644 --- a/src/main/java/de/fanta/challenges/challenges/SammelFieberChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/SammelFieberChallengeEvent.java @@ -3,6 +3,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; import de.fanta.challenges.guis.eventgui.SammelFieberSettingsGui; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.utils.ChatUtil; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -112,7 +113,7 @@ if (meta != null && meta.hasDisplayName()) { Player player = Bukkit.getPlayer(meta.getDisplayName()); count = count + stack.getAmount(); - plugin.getScoreManager().updateScore(player, stack.getAmount()); + plugin.getScoreManager().updateScore(new ChallengePlayer(player), stack.getAmount()); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 2.0F); bossBar.setTitle(ChatUtil.GREEN + "Es wurden " + ChatUtil.BLUE + count + " " + new ItemStack(getMaterial()).getI18NDisplayName() + ChatUtil.GREEN + " abgegeben. Das sind " + ChatUtil.BLUE + count * SammelFieberSettingsGui.MONEY + " Cubes"); } diff --git a/src/main/java/de/fanta/challenges/commands/event/EventGetScoreCommand.java b/src/main/java/de/fanta/challenges/commands/event/EventGetScoreCommand.java index cc4a559..3aec8ce 100644 --- a/src/main/java/de/fanta/challenges/commands/event/EventGetScoreCommand.java +++ b/src/main/java/de/fanta/challenges/commands/event/EventGetScoreCommand.java @@ -1,6 +1,7 @@ package de.fanta.challenges.commands.event; import de.fanta.challenges.Challenges; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.utils.ChatUtil; import de.iani.cubesideutils.bukkit.commands.SubCommand; import de.iani.cubesideutils.commands.ArgsParser; @@ -36,10 +37,10 @@ return true; } - ChatUtil.sendNormalMessage(sender, player.getName() + ": " + plugin.getScoreManager().getScore(player)); + ChatUtil.sendNormalMessage(sender, player.getName() + ": " + plugin.getScoreManager().getScore(new ChallengePlayer(player))); return true; } else { - ChatUtil.sendNormalMessage(sender, plugin.getScoreManager().getScores().entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()) * -1).collect(Collectors.toCollection(LinkedHashSet::new))); + ChatUtil.sendNormalMessage(sender, "Kapput");//plugin.getScoreManager().getScores().entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()) * -1).collect(Collectors.toCollection(LinkedHashSet::new))); //TODO GANZ MACHEN } } else { ChatUtil.sendErrorMessage(sender, "Keine Berechtigung!"); diff --git a/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java b/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java index 01d0f34..3cc5825 100644 --- a/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java +++ b/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java @@ -2,6 +2,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.ServerType; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.teams.ChallengeTeam; import de.fanta.challenges.teams.TeamUtils; import de.fanta.challenges.utils.ChatUtil; @@ -51,10 +52,10 @@ plugin.getTimer().startTimer(); if (!plugin.getConfig().getBoolean("event.teams")) { - Bukkit.getOnlinePlayers().forEach(p -> plugin.getScoreManager().updateScore(p, 0)); + Bukkit.getOnlinePlayers().forEach(p -> plugin.getScoreManager().updateScore(new ChallengePlayer(p), 0)); } else { TeamUtils.setAllPlayerWithoutTeamToTeam(); - Bukkit.getOnlinePlayers().forEach(p -> plugin.getScoreManager().updateTeamScore(p, 0)); + Bukkit.getOnlinePlayers().forEach(p -> plugin.getScoreManager().updateScore(TeamUtils.getPlayerTeam(p), 0)); for (ChallengeTeam team : TeamUtils.getTeams()) { diff --git a/src/main/java/de/fanta/challenges/guis/CheckItemsGUI.java b/src/main/java/de/fanta/challenges/guis/CheckItemsGUI.java index d2363e7..3385734 100644 --- a/src/main/java/de/fanta/challenges/guis/CheckItemsGUI.java +++ b/src/main/java/de/fanta/challenges/guis/CheckItemsGUI.java @@ -16,7 +16,9 @@ import org.bukkit.inventory.ItemStack; import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class CheckItemsGUI implements Listener { private static final Challenges plugin = Challenges.getPlugin(); @@ -26,7 +28,8 @@ private static final int NEIN_INDEX = 4; public static final int INVENTORY_SIZE = 5; - public static Inventory TEMP_GUI; + + private static final Map InventoryperPlayer = new HashMap<>(); public static void createCheckItemGUI(Player p) { if (plugin.getMaterials().isEmpty()) { @@ -34,7 +37,8 @@ ChatUtil.sendNormalMessage(p, "Lol fertig :>"); return; } - TEMP_GUI = Bukkit.createInventory(null, InventoryType.HOPPER, plugin.getGUIPREFIX() + " >> geht das?? (" + plugin.getMaterials().size() + ")"); + Inventory TEMP_GUI = Bukkit.createInventory(null, InventoryType.HOPPER, plugin.getGUIPREFIX() + " >> geht das?? (" + plugin.getMaterials().size() + ")"); + InventoryperPlayer.put(p, TEMP_GUI); ItemStack stack = new ItemStack(plugin.getMaterials().get(0)); try { TEMP_GUI.setItem(JA_INDEX, GUIUtils.createGuiItem(Material.LIME_CONCRETE, "Ja",true)); @@ -61,9 +65,9 @@ @EventHandler public void onInventoryClick(InventoryClickEvent e) { - if (TEMP_GUI.equals(e.getClickedInventory())) { + Player player = (Player) e.getWhoClicked(); + if (InventoryperPlayer.get(player).equals(e.getClickedInventory())) { int slot = e.getRawSlot(); - Player player = (Player) e.getWhoClicked(); if (slot == JA_INDEX) { plugin.getMaterials().remove(e.getClickedInventory().getItem(ITEM_INDEX).getType()); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 2.0F); diff --git a/src/main/java/de/fanta/challenges/listeners/BlockCreateListener.java b/src/main/java/de/fanta/challenges/listeners/BlockCreateListener.java index f3eb1c2..9981ea9 100644 --- a/src/main/java/de/fanta/challenges/listeners/BlockCreateListener.java +++ b/src/main/java/de/fanta/challenges/listeners/BlockCreateListener.java @@ -1,6 +1,7 @@ package de.fanta.challenges.listeners; import de.fanta.challenges.Challenges; +import de.fanta.challenges.scoreboard.ChallengePlayer; import org.bukkit.GameMode; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -17,7 +18,7 @@ e.setCancelled(true); } if (plugin.getConfig().getString("event.type").equals("build")) { - plugin.getScoreManager().updateScore(e.getPlayer(), -1); + plugin.getScoreManager().updateScore(new ChallengePlayer(e.getPlayer()), -1); } } diff --git a/src/main/java/de/fanta/challenges/listeners/BlockDestroyListener.java b/src/main/java/de/fanta/challenges/listeners/BlockDestroyListener.java index 0bd7301..3e94b8c 100644 --- a/src/main/java/de/fanta/challenges/listeners/BlockDestroyListener.java +++ b/src/main/java/de/fanta/challenges/listeners/BlockDestroyListener.java @@ -1,6 +1,7 @@ package de.fanta.challenges.listeners; import de.fanta.challenges.Challenges; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.utils.ItemTypeListUtil; import de.iani.cubesideutils.bukkit.items.ItemGroups; import org.bukkit.Bukkit; @@ -25,7 +26,7 @@ if (plugin.getConfig().getString("event.type").equals("build") && plugin.getTimer().isRunning()) { Material blockType = e.getBlock().getType(); if (!ItemTypeListUtil.isInstaBreakBlock(blockType) && !ItemGroups.isDoubleBlockPlant(blockType) && !ItemGroups.isSingleBlockPlant(blockType)) { - plugin.getScoreManager().updateScore(e.getPlayer(), 1); + plugin.getScoreManager().updateScore(new ChallengePlayer(e.getPlayer()), 1); } } } diff --git a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java index d6ce06a..1ce4764 100644 --- a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java +++ b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java @@ -3,6 +3,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.ServerType; import de.fanta.challenges.events.PlayerCountChangedEvent; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.utils.ChatUtil; import de.iani.cubesideutils.StringUtil; import de.iani.cubesideutils.commands.ArgsParser; @@ -101,7 +102,7 @@ @EventHandler public void onPlayerDeath(PlayerDeathEvent e) { if (Objects.equals(plugin.getConfig().getString("event.type"), "deathcounter") && plugin.getTimer().isRunning()) { - plugin.getScoreManager().updateScore(e.getEntity(), 1); + plugin.getScoreManager().updateScore(new ChallengePlayer(e.getEntity()), 1); } } @@ -115,7 +116,7 @@ @EventHandler public void onExpChangeEvent(PlayerLevelChangeEvent e) { if (Objects.equals(plugin.getConfig().getString("event.type"), "xp") && plugin.getTimer().isRunning()) { - plugin.getScoreManager().updateScore(e.getPlayer(), e.getNewLevel() - e.getOldLevel()); + plugin.getScoreManager().updateScore(new ChallengePlayer(e.getPlayer()), e.getNewLevel() - e.getOldLevel()); } } diff --git a/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java b/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java index 948d13f..8870396 100644 --- a/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java +++ b/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java @@ -5,6 +5,7 @@ import de.fanta.challenges.challenges.DeathrunChallengeEvent; import de.fanta.challenges.events.PlayerCountChangedEvent; import de.fanta.challenges.events.ServerStatusChangedEvent; +import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.SaveWorldUtils; import org.bukkit.Bukkit; @@ -45,8 +46,8 @@ if (!DeathrunChallengeEvent.getDeadPlayer().contains(p.getUniqueId().toString())) { plugin.getSBManager().setScoreboardtoPlayer(p); plugin.getSBManager().updateEventScoreboard(); - if (!plugin.getConfig().getBoolean("event.teams") && plugin.getScoreManager().getScores() != null && plugin.getScoreManager().getScore(e.getPlayer()) == 0) { - plugin.getScoreManager().updateScore(e.getPlayer(), 0); + if (!plugin.getConfig().getBoolean("event.teams") && plugin.getScoreManager().getScores() != null && plugin.getScoreManager().getScore(new ChallengePlayer(p)) == 0) { + plugin.getScoreManager().updateScore(new ChallengePlayer(e.getPlayer()), 0); } } } diff --git a/src/main/java/de/fanta/challenges/scoreboard/ChallengePlayer.java b/src/main/java/de/fanta/challenges/scoreboard/ChallengePlayer.java new file mode 100644 index 0000000..ea4394e --- /dev/null +++ b/src/main/java/de/fanta/challenges/scoreboard/ChallengePlayer.java @@ -0,0 +1,34 @@ +package de.fanta.challenges.scoreboard; + +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Scoreboard; + +public class ChallengePlayer implements Scorable { + + private Player player; + + public ChallengePlayer(Player player) { + this.player = player; + } + + public int hashCode() { + return player.hashCode(); + } + + public boolean equals(Object other) { + if (!(other instanceof ChallengePlayer cp)) { + return false; + } + return this.player.equals(cp.player); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + player.setScoreboard(scoreboard); + } + + @Override + public String getIdentifier() { + return player.getName(); + } +} diff --git a/src/main/java/de/fanta/challenges/scoreboard/Scorable.java b/src/main/java/de/fanta/challenges/scoreboard/Scorable.java new file mode 100644 index 0000000..9f4aba9 --- /dev/null +++ b/src/main/java/de/fanta/challenges/scoreboard/Scorable.java @@ -0,0 +1,11 @@ +package de.fanta.challenges.scoreboard; + +import org.bukkit.scoreboard.Scoreboard; + +public interface Scorable { + + public abstract void setScoreboard(Scoreboard scoreboard); + + public abstract String getIdentifier(); + +} diff --git a/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java b/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java index 23c9d96..f7a73c1 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java @@ -57,13 +57,6 @@ } team.addEntry(challengeTeam.getChatColor() + challengeTeam.getName()); - - for (OfflinePlayer pp : TeamUtils.getPlayersInTeam(challengeTeam)) { - Player tempPlayer = Bukkit.getPlayer(pp.getUniqueId()); - if (tempPlayer != null && tempPlayer.isOnline()) { - tempPlayer.setScoreboard(scoreboard); - } - } } public void removeScoreboard(Player p) { @@ -155,12 +148,12 @@ } } - void updateEventScore(Player player, int difference) { + void updateEventScore(Scorable s, int difference) { if (plugin.getServerType() == ServerType.ADVENTURE) { return; } if (this.event != null) { - Score score = event.getScore(player.getName()); + Score score = event.getScore(s.getIdentifier()); score.setScore(score.getScore() + difference); } } @@ -176,12 +169,12 @@ } - void setEventScore(Player player, int newScore) { + void setEventScore(Scorable s, int newScore) { if (plugin.getServerType() == ServerType.ADVENTURE) { return; } if (this.event != null) { - Score score = event.getScore(player.getName()); + Score score = event.getScore(s.getIdentifier()); score.setScore(newScore); } } diff --git a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java index 0fe9475..0bfd55d 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java @@ -13,6 +13,7 @@ import javax.annotation.Nullable; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashSet; @@ -25,59 +26,107 @@ public class ScoreManager { + public class ScoreData { + private Scorable scorable; + private int score; + private int position; + private int index; + + public ScoreData(Scorable scorable, int index) { + this.scorable = scorable; + this.index = index; + + this.score = 0; + this.position = 1; + } + + + public Scorable getScorable() { + return scorable; + } + + public int getPostition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } + + public void changeScore(int difference) { + this.score += difference; + } + } + private final Challenges plugin; - private final Map scores; + private final Map scores; + private final List positions; + public ScoreManager(Challenges plugin) { this.plugin = plugin; this.scores = new HashMap<>(); + this.positions = new ArrayList<>(); } - public void updateScore(Player player, int difference) { - int score = scores.getOrDefault(player.getName(), 0); - score += difference; - scores.put(player.getName(), score); - - this.plugin.getSBManager().updateEventScore(player, difference); - } - - public void updateTeamScore(Player player, int difference) { - ChallengeTeam team = TeamUtils.getPlayerTeam(player); - if (team == null) { + public void updateScore(Scorable s, int difference) { + if (difference == 0) { return; } - int score = scores.getOrDefault(team.getName(), 0); - score += difference; - scores.put(TeamUtils.getPlayerTeam(player).getName(), score); - this.plugin.getSBManager().updateEventScore(TeamUtils.getPlayerTeam(player), difference); - } + ScoreData data = scores.get(s); + data.changeScore(difference); - public void setScore(Player player, int score) { - scores.put(player.getName(), score); - this.plugin.getSBManager().setEventScore(player, score); - } + int current = data.getIndex(); + int dir = (int) Math.signum(difference * -1); - public void setTeamScore(Player player, int score) { - scores.put(TeamUtils.getPlayerTeam(player).getName(), score); - this.plugin.getSBManager().setEventScore(TeamUtils.getPlayerTeam(player), score); - } + for (;current > 0 && positions.get(current + dir).getScore() < data.getScore(); current += dir) { + ScoreData predecessor = positions.get(current + dir); - public int getScore(Player player) { - return scores.getOrDefault(player.getName(), 0); - } - - public int getTeamScore(Player player) { - ChallengeTeam team = TeamUtils.getPlayerTeam(player); - if (team != null) { - return scores.getOrDefault(team.getName(), 0); + positions.set(current + dir, data); + positions.set(current, predecessor); + data.setIndex(current + dir); + predecessor.setIndex(current); + data.setPosition(data.getPostition() + dir); + predecessor.setPosition(predecessor.getPostition() - dir); } - return 0; + + if (current > 0 && data.getScore() == positions.get(current + dir).getScore()) { + data.setPosition(positions.get(current + dir).getPostition()); + } + + this.plugin.getSBManager().updateEventScore(s, difference); + } + + public void setScore(Scorable s, int score) { + /*scores.put(s, score); + this.plugin.getSBManager().setEventScore(s, score);*/ + } + + public int getScore(Scorable s) { + return scores.get(s).getScore(); } public int getPlayerPosition(Player player) { - List indexes = scores.entrySet().stream().sorted(Map.Entry.comparingByValue((o1, o2) -> Integer.compare(o1, o2) * -1)).map(Map.Entry::getKey).toList(); - return indexes.indexOf(player.getName()); + List indexes = null; //scores.entrySet().stream().sorted(Map.Entry.comparingByValue((o1, o2) -> Integer.compare(o1, o2) * -1)).map(Map.Entry::getKey).toList(); //TODO: GANZ MACHEN + //return indexes.indexOf(player.getName()); + return 1; } public void saveScores(@Nullable Player player) { @@ -107,14 +156,14 @@ } sb.append("=".repeat(20)); sb.append('\n'); - Map participants = getScores(); + Map participants = getScores(); sb.append("Teilnehmer (").append(participants.size()).append("):\n"); if (this.scores.isEmpty()) { sb.append(" Das Event hatte keine Teilnehmer!\n"); } else { if (plugin.getConfig().getBoolean("event.teams")) { - Set> sorted = this.scores.entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()) * -1).collect(Collectors.toCollection(LinkedHashSet::new)); + Set> sorted = null; //this.scores.entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()) * -1).collect(Collectors.toCollection(LinkedHashSet::new)); //TODO GANZ MACHEN int i = 1; for (Map.Entry entry : sorted) { ChallengeTeam challengeTeam = TeamUtils.getTeam(entry.getKey()); @@ -126,7 +175,7 @@ } } } else { - Set> sorted = this.scores.entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()) * -1).collect(Collectors.toCollection(LinkedHashSet::new)); + Set> sorted = null; //this.scores.entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()) * -1).collect(Collectors.toCollection(LinkedHashSet::new)); //TODO GANZ MACHEN int i = 1; for (Map.Entry entry : sorted) { sb.append(i++).append(". ").append(entry.getKey()).append(" ").append(entry.getValue()).append("\n"); @@ -154,7 +203,7 @@ plugin.getSBManager().updateEventScoreboard(); } - public Map getScores() { + public Map getScores() { return scores; } } diff --git a/src/main/java/de/fanta/challenges/teams/ChallengeTeam.java b/src/main/java/de/fanta/challenges/teams/ChallengeTeam.java index 70dfe57..6f06c9e 100644 --- a/src/main/java/de/fanta/challenges/teams/ChallengeTeam.java +++ b/src/main/java/de/fanta/challenges/teams/ChallengeTeam.java @@ -1,10 +1,15 @@ package de.fanta.challenges.teams; +import de.fanta.challenges.scoreboard.Scorable; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.scoreboard.Scoreboard; -public class ChallengeTeam { +public class ChallengeTeam implements Scorable { private String name; private ChatColor chatColor; @@ -70,4 +75,19 @@ public void setDisplayItem(ItemStack displayItem) { this.displayItem = displayItem; } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + for (OfflinePlayer pp : TeamUtils.getPlayersInTeam(this)) { + Player tempPlayer = Bukkit.getPlayer(pp.getUniqueId()); + if (tempPlayer != null && tempPlayer.isOnline()) { + tempPlayer.setScoreboard(scoreboard); + } + } + } + + @Override + public String getIdentifier() { + return getChatColor() + getName(); + } } diff --git a/src/main/java/de/fanta/challenges/teams/TeamListener.java b/src/main/java/de/fanta/challenges/teams/TeamListener.java index f229fc1..56dce78 100644 --- a/src/main/java/de/fanta/challenges/teams/TeamListener.java +++ b/src/main/java/de/fanta/challenges/teams/TeamListener.java @@ -151,7 +151,7 @@ } else { if (plugin.getConfig().getBoolean("event.autoteams") && e.getPlayer().getGameMode() == GameMode.SURVIVAL) { TeamUtils.setAllPlayerWithoutTeamToTeam(); - plugin.getScoreManager().updateTeamScore(e.getPlayer(), 0); + plugin.getScoreManager().updateScore(TeamUtils.getPlayerTeam(e.getPlayer()), 0); if (TeamUtils.getPlayerTeam(e.getPlayer()) != null && TeamUtils.getPlayerTeam(e.getPlayer()).getSpawn() != null) { e.getPlayer().teleport(TeamUtils.getPlayerTeam(e.getPlayer()).getSpawn()); } @@ -160,8 +160,8 @@ } } } - if (plugin.getConfig().getBoolean("event.teams") && plugin.getScoreManager().getTeamScore(e.getPlayer()) == 0) { - plugin.getScoreManager().updateTeamScore(e.getPlayer(), 0); + if (plugin.getConfig().getBoolean("event.teams") && plugin.getScoreManager().getScore(TeamUtils.getPlayerTeam(e.getPlayer())) == 0) { + plugin.getScoreManager().updateScore(TeamUtils.getPlayerTeam(e.getPlayer()), 0); } }