diff --git a/Challenge/src/main/java/de/fanta/challenge/challenges/ChallengeEvents/forcequest/ForceQuestChallengeEvent.java b/Challenge/src/main/java/de/fanta/challenge/challenges/ChallengeEvents/forcequest/ForceQuestChallengeEvent.java index c585373..131c144 100644 --- a/Challenge/src/main/java/de/fanta/challenge/challenges/ChallengeEvents/forcequest/ForceQuestChallengeEvent.java +++ b/Challenge/src/main/java/de/fanta/challenge/challenges/ChallengeEvents/forcequest/ForceQuestChallengeEvent.java @@ -17,7 +17,6 @@ import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -75,6 +74,7 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; import org.kitteh.vanish.event.VanishStatusChangeEvent; import java.util.ArrayList; @@ -129,6 +129,8 @@ private final Collection initPlayers = new ArrayList<>(); public static final Collection activeQuestTypes = new ArrayList<>(); + private final HashMap playerStructureMessage = new HashMap<>(); + @EventHandler public void onActivation(TimerChangedEvent event) { if (Objects.equals(Config.getString("event.type"), "forcequest")) { @@ -182,6 +184,9 @@ startUpdateTask(); setRunning(true); } else { + if (!isRunning()) { + return; + } stopUpdateTask(); for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { @@ -227,8 +232,13 @@ updateArmorStand(player); } - private static void createNewQuest(Player player) { + private static boolean createNewQuest(Player player) { QuestType questType = getRandomQuest(player); + if (questType == null) { + plugin.getTimer().stopTimer(); + plugin.getComponentUtil().sendBrodCastMessage(player.name().color(Color.BLUE).append(Component.text(" hat alle Quests erledigt. Und hat damit Gewonnen!").color(Color.GREEN))); + return false; + } playerQuest.put(player.getUniqueId(), questType); switch (questType) { @@ -240,7 +250,7 @@ for (ItemStack stack : player.getInventory().getContents()) { if (stack != null) { if (selectItem(player, stack.getType())) { - return; + return true; } } } @@ -280,16 +290,56 @@ structureTypeByPlayerList.put(player.getUniqueId(), structureType); } } + return true; } private static QuestType getRandomQuest(Player player) { - TreeMap PROBABILITY_MAP; - int MAX_PROBABILITY; + TreeMap PROBABILITY_MAP = new TreeMap<>(Comparator.reverseOrder()); + int MAX_PROBABILITY = 0; - PROBABILITY_MAP = new TreeMap<>(Comparator.reverseOrder()); - MAX_PROBABILITY = 0; - + Collection playerQuestTypes = new ArrayList<>(); for (QuestType questType : activeQuestTypes) { + switch (questType) { + case ForceItem -> { + if (!playerMaterials.get(player.getUniqueId()).isEmpty()) { + playerQuestTypes.add(questType); + } + } + case ForceBiome -> { + if (!playerBiomes.get(player.getUniqueId()).isEmpty()) { + playerQuestTypes.add(questType); + } + } + case ForceMob -> { + if (!playerEntityTypes.get(player.getUniqueId()).isEmpty()) { + playerQuestTypes.add(questType); + } + } + case ForceEffect -> { + if (!playerPotionEffectTypes.get(player.getUniqueId()).isEmpty()) { + playerQuestTypes.add(questType); + } + } + case ForceDeath -> { + if (!playerDamageCauses.get(player.getUniqueId()).isEmpty()) { + playerQuestTypes.add(questType); + } + } + case ForceLocation -> playerQuestTypes.add(questType); + case ForceStructure -> { + if (!playerStructureTypes.get(player.getUniqueId()).isEmpty()) { + playerQuestTypes.add(questType); + } + } + } + } + + if (playerQuestTypes.isEmpty()) { + return null; + } + + + for (QuestType questType : playerQuestTypes) { PROBABILITY_MAP.put(MAX_PROBABILITY, questType); MAX_PROBABILITY += questType.getProbability(); } @@ -298,48 +348,7 @@ for (Map.Entry entry : PROBABILITY_MAP.entrySet()) { if (entry.getKey() <= result) { - QuestType questType = entry.getValue(); - switch (questType) { - case ForceItem -> { - if (playerMaterials.get(player.getUniqueId()).isEmpty()) { - return getRandomQuest(player); - } - return entry.getValue(); - } - case ForceBiome -> { - if (playerBiomes.get(player.getUniqueId()).isEmpty()) { - return getRandomQuest(player); - } - return entry.getValue(); - } - case ForceMob -> { - if (playerEntityTypes.get(player.getUniqueId()).isEmpty()) { - return getRandomQuest(player); - } - return entry.getValue(); - } - case ForceEffect -> { - if (playerPotionEffectTypes.get(player.getUniqueId()).isEmpty()) { - return getRandomQuest(player); - } - return entry.getValue(); - } - case ForceDeath -> { - if (playerDamageCauses.get(player.getUniqueId()).isEmpty()) { - return getRandomQuest(player); - } - return entry.getValue(); - } - case ForceLocation -> { - return entry.getValue(); - } - case ForceStructure -> { - if (playerStructureTypes.get(player.getUniqueId()).isEmpty()) { - return getRandomQuest(player); - } - return entry.getValue(); - } - } + return entry.getValue(); } } @@ -773,9 +782,17 @@ if (questType == QuestType.ForceStructure) { for (GeneratedStructure generatedStructure : player.getChunk().getStructures()) { - if (generatedStructure.getBoundingBox().overlaps(player.getBoundingBox())) { - selectStructure(player, generatedStructure.getStructure()); - } + generatedStructure.getPieces().forEach(structurePiece -> { + if (structurePiece.getBoundingBox().overlaps(player.getBoundingBox())) { + selectStructure(player, generatedStructure.getStructure()); + + Vector lastStructure = playerStructureMessage.getOrDefault(player.getUniqueId(), new Vector(0, 1000, 0)); + if (!lastStructure.equals(generatedStructure.getBoundingBox().getCenter())) { + plugin.getComponentUtil().sendTitleToPlayer(player, Component.empty(), Component.translatable(generatedStructure.getStructure().key().asMinimalString(), Color.GREEN), 10, 100, 10, false); + } + playerStructureMessage.put(player.getUniqueId(), generatedStructure.getBoundingBox().getCenter()); + } + }); } } } @@ -836,8 +853,10 @@ } public void stopUpdateTask() { - playerTasks.cancel(); - playerTasks = null; + if (playerTasks != null) { + playerTasks.cancel(); + playerTasks = null; + } } private void tick() { @@ -1011,16 +1030,19 @@ plugin.getScoreManager().updateScore(new ChallengePlayer(player.getUniqueId()), 1); CubesideModUtils.sendFlashScreenToCubesideMod(plugin, player, 50, Color.GREEN); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 1.0F); - createNewQuest(player); + if (!createNewQuest(player)) { + updateBossBar(); + return; + } addArmorStand(player); updateArmorStand(player); updateBossBar(); } private static void updateBossBar() { - ScoreManager scoreManager = plugin.getScoreManager(); for (Player player : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { - TextComponent bossBarTitle = Component.text("Es ist ein Fehler aufgetreten :(").color(Color.RED).decoration(TextDecoration.ITALIC, false); + ChallengePlayer challengePlayer = new ChallengePlayer(player.getUniqueId()); + TextComponent bossBarTitle = getBossBarTitle(">> Alle Quests erledigt.", Component.empty(), challengePlayer); QuestType questType = playerQuest.get(player.getUniqueId()); switch (questType) { case ForceItem -> { @@ -1028,31 +1050,31 @@ if (material != null) { Component component = Component.empty().append(plugin.getComponentUtil().getTrasnlateItemComponent(material)); - bossBarTitle = getBossBarTitle(">> ForceItem: ", component, scoreManager.getPosition(new ChallengePlayer(player.getUniqueId()))); + bossBarTitle = getBossBarTitle(">> ForceItem: ", component, challengePlayer); } } case ForceBiome -> { Biome biome = biomeByPlayerList.get(player.getUniqueId()); if (biome != null) { - bossBarTitle = getBossBarTitle(">> ForceBiome: ", Component.translatable(biome.translationKey()), scoreManager.getPosition(new ChallengePlayer(player.getUniqueId()))); + bossBarTitle = getBossBarTitle(">> ForceBiome: ", Component.translatable(biome.translationKey()), challengePlayer); } } case ForceMob -> { EntityType entityType = entityTypeByPlayerList.get(player.getUniqueId()); if (entityType != null) { - bossBarTitle = getBossBarTitle(">> ForceMob: ", Component.translatable(entityType.translationKey()), scoreManager.getPosition(new ChallengePlayer(player.getUniqueId()))); + bossBarTitle = getBossBarTitle(">> ForceMob: ", Component.translatable(entityType.translationKey()), challengePlayer); } } case ForceEffect -> { PotionEffectType potionEffectType = potionEffectTypeByPlayerList.get(player.getUniqueId()); if (potionEffectType != null) { - bossBarTitle = getBossBarTitle(">> ForceEffect: ", Component.translatable(potionEffectType.translationKey()), scoreManager.getPosition(new ChallengePlayer(player.getUniqueId()))); + bossBarTitle = getBossBarTitle(">> ForceEffect: ", Component.translatable(potionEffectType.translationKey()), challengePlayer); } } case ForceDeath -> { EntityDamageEvent.DamageCause damageCause = damageCauseByPlayerList.get(player.getUniqueId()); if (damageCause != null) { - bossBarTitle = getBossBarTitle(">> ForceDeath: ", Component.translatable(StringUtil.capitalizeFirstLetter(damageCause.name(), true)), scoreManager.getPosition(new ChallengePlayer(player.getUniqueId()))); + bossBarTitle = getBossBarTitle(">> ForceDeath: ", Component.translatable(StringUtil.capitalizeFirstLetter(damageCause.name(), true)), challengePlayer); } } case ForceLocation -> { @@ -1060,13 +1082,13 @@ if (location != null) { Block block = location.getBlock(); String locationString = "Welt: " + StringUtil.capitalizeFirstLetter(location.getWorld().getName(), true) + " X: " + block.getX() + ", Y: " + block.getY() + ", Z: " + block.getZ(); - bossBarTitle = getBossBarTitle(">> ForceLocation: ", Component.translatable(locationString), scoreManager.getPosition(new ChallengePlayer(player.getUniqueId()))); + bossBarTitle = getBossBarTitle(">> ForceLocation: ", Component.translatable(locationString), challengePlayer); } } case ForceStructure -> { Structure structureType = structureTypeByPlayerList.get(player.getUniqueId()); if (structureType != null) { - bossBarTitle = getBossBarTitle(">> ForceStructure: ", Component.translatable(structureType.key().asMinimalString()), scoreManager.getPosition(new ChallengePlayer(player.getUniqueId()))); + bossBarTitle = getBossBarTitle(">> ForceStructure: ", Component.translatable(structureType.key().asMinimalString()), challengePlayer); } } } @@ -1082,8 +1104,11 @@ } } - private static TextComponent getBossBarTitle(String title, Component name, int pos) { - return Component.text(title).color(Color.GREEN).append(name.color(Color.BLUE).append(Component.text(" << | Position: ").color(Color.GREEN)).append(Component.text(pos).color(Color.BLUE))); + private static TextComponent getBossBarTitle(String title, Component name, ChallengePlayer challengePlayer) { + ScoreManager scoreManager = plugin.getScoreManager(); + int pos = scoreManager.getPosition(challengePlayer); + int score = scoreManager.getScore(challengePlayer); + return Component.text(title).color(Color.GREEN).append(name.color(Color.BLUE).append(Component.text(" << | Position: ", Color.GREEN)).append(Component.text(pos, Color.BLUE).append(Component.text(" Punkte: ", Color.GREEN).append(Component.text(score, Color.BLUE))))); } public void removeArmorStand(Player player) {