From b8114ba0d30161717dced7170cbbd6126a5fbdbe Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sun, 6 Aug 2023 20:07:12 +0200 Subject: [PATCH] Added auto hiding bossbar --- .../alttd/altitudequests/config/Config.java | 4 +- .../alttd/altitudequests/objects/Quest.java | 36 ++++++++++---- .../objects/quests/BreedMobsQuest.java | 9 ++-- .../objects/quests/CollectDropsQuest.java | 8 ++-- .../objects/quests/KillMobsQuest.java | 8 ++-- .../objects/quests/MineQuest.java | 8 ++-- .../objects/quests/OtherQuest.java | 19 ++++---- .../altitudequests/util/AutoHideBossBar.java | 47 +++++++++++++++++++ 8 files changed, 100 insertions(+), 39 deletions(-) create mode 100644 src/main/java/com/alttd/altitudequests/util/AutoHideBossBar.java diff --git a/src/main/java/com/alttd/altitudequests/config/Config.java b/src/main/java/com/alttd/altitudequests/config/Config.java index 7637762..b34fec1 100644 --- a/src/main/java/com/alttd/altitudequests/config/Config.java +++ b/src/main/java/com/alttd/altitudequests/config/Config.java @@ -1,10 +1,10 @@ package com.alttd.altitudequests.config; import java.io.File; +import java.time.Duration; import java.util.List; public final class Config extends AbstractConfig { - static Config config; static int version; public Config() { @@ -58,9 +58,11 @@ public final class Config extends AbstractConfig { public static String NPC_NAME = "Scruff"; public static boolean DEBUG = false; + public static Duration BOSS_BAR_AUTO_HIDE; private static void loadSettings() { NPC_NAME = config.getString("settings.npc-name", NPC_NAME); DEBUG = config.getBoolean("settings.debug", DEBUG); + BOSS_BAR_AUTO_HIDE = Duration.ofSeconds(config.getInt("settings.boss-bar-auto-hide-seconds", 10)); } public static int MINE_QUEST_FREQ = 1; diff --git a/src/main/java/com/alttd/altitudequests/objects/Quest.java b/src/main/java/com/alttd/altitudequests/objects/Quest.java index 667f899..b0e9211 100644 --- a/src/main/java/com/alttd/altitudequests/objects/Quest.java +++ b/src/main/java/com/alttd/altitudequests/objects/Quest.java @@ -5,6 +5,7 @@ import com.alttd.altitudequests.config.Config; import com.alttd.altitudequests.config.MessagesConfig; import com.alttd.altitudequests.database.Database; import com.alttd.altitudequests.objects.quests.*; +import com.alttd.altitudequests.util.AutoHideBossBar; import com.alttd.altitudequests.util.Logger; import com.alttd.altitudequests.util.Utilities; import com.alttd.datalock.DataLockAPI; @@ -26,7 +27,7 @@ import java.util.stream.Collectors; public abstract class Quest { private static final HashMap dailyQuests = new HashMap<>(); -// private static Quest weeklyQuest = null; + // private static Quest weeklyQuest = null; private static final List> possibleQuests = new ArrayList<>(); static { // maybe make this make more sense idk @@ -49,6 +50,10 @@ public abstract class Quest { private boolean isDone; private boolean rewardReceived; private final int amount; + // private final BossBar barProgressOne; +// private final BossBar barProgressTwo; + private final AutoHideBossBar barProgressOne; + private final AutoHideBossBar barProgressTwo; public static synchronized void putDailyQuest(UUID uuid, Quest quest) { dailyQuests.put(uuid, quest); @@ -74,8 +79,8 @@ public abstract class Quest { dailyQuests.clear(); } - public Quest(UUID uuid, int step1, int step2, Variant variant, int amount, boolean rewardReceived) { - this.uuid = uuid; + public Quest(Player player, int step1, int step2, Variant variant, int amount, boolean rewardReceived) throws Exception { + this.uuid = player.getUniqueId(); this.step1 = step1; this.step2 = step2; this.variant = variant; @@ -83,11 +88,14 @@ public abstract class Quest { this.rewardReceived = rewardReceived; if (variant == null) { Logger.warning("Created % quest without a variant for %", this.getClass().getName(), uuid.toString()); + throw new Exception("Invalid variant"); } - if (variant != null && amount == -1) + if (amount == -1) this.amount = variant.calculateAmount(loadQuestsDoneThisMonth(uuid)); else this.amount = amount; + this.barProgressOne = new AutoHideBossBar(player, variant, "1"); + this.barProgressTwo = new AutoHideBossBar(player, variant, "2"); } private int loadQuestsDoneThisMonth(UUID uuid) { @@ -116,12 +124,17 @@ public abstract class Quest { Class questClass = possibleQuests.get(Utilities.randomOr0(possibleQuests.size() - 1)); try { - Constructor constructor = questClass.getDeclaredConstructor(UUID.class); - putDailyQuest(player.getUniqueId(), constructor.newInstance(player.getUniqueId())); - } catch (InvocationTargetException | IllegalAccessException | InstantiationException | NoSuchMethodException e) { + Constructor constructor = questClass.getDeclaredConstructor(Player.class); + putDailyQuest(player.getUniqueId(), constructor.newInstance(player)); + } catch (InvocationTargetException | IllegalAccessException | InstantiationException | + NoSuchMethodException e) { player.sendMiniMessage("Unable to create quest, contact an admin", null); e.printStackTrace(); - Logger.severe("% does not have a constructor with a UUID input or has improper access.", questClass.getName()); + Logger.severe("% does not have a constructor with a Player input or has improper access.", questClass.getName()); + } catch (Exception e) { + player.sendMiniMessage("Unable to create quest, contact an admin", null); + e.printStackTrace(); + Logger.severe("% could not be created due to invalid namespace key or variant.", questClass.getName()); } } @@ -129,7 +142,7 @@ public abstract class Quest { // Quest.weeklyQuest = newQuest; // } -// private static final HashSet queriedUsers = new HashSet<>(); + // private static final HashSet queriedUsers = new HashSet<>(); public static void tryLoadDailyQuest(UUID uuid) { // if (queriedUsers.contains(uuid)) // return; @@ -184,7 +197,8 @@ public abstract class Quest { constructor = aClass.getConstructor(UUID.class, int.class, int.class, String.class, int.class, boolean.class); Quest quest1 = constructor.newInstance(uuid, step_1_progress, step_2_progress, quest_variant, amount, turnedIn); putDailyQuest(uuid, quest1); - } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | + InvocationTargetException e) { e.printStackTrace(); return false; } @@ -289,6 +303,7 @@ public abstract class Quest { public void addStep1(int step1) { this.step1 += step1; + barProgressOne.show(((double) getAmount()) / getStep1()); } public int getStep2() { @@ -297,6 +312,7 @@ public abstract class Quest { public void addStep2(int step2) { this.step2 += step2; + barProgressTwo.show(((double) getAmount()) / getStep2()); } public void setDone(boolean done) { diff --git a/src/main/java/com/alttd/altitudequests/objects/quests/BreedMobsQuest.java b/src/main/java/com/alttd/altitudequests/objects/quests/BreedMobsQuest.java index d76e312..50644e9 100644 --- a/src/main/java/com/alttd/altitudequests/objects/quests/BreedMobsQuest.java +++ b/src/main/java/com/alttd/altitudequests/objects/quests/BreedMobsQuest.java @@ -18,15 +18,14 @@ import org.bukkit.entity.Player; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; public class BreedMobsQuest extends Quest { private final BreedMobsQuestObject breedMobsQuestObject; - public BreedMobsQuest(UUID uuid) { - super(uuid, 0, 0, + public BreedMobsQuest(Player player) throws Exception { + super(player, 0, 0, QuestsConfig.BREED_MOB_QUEST.get(Utilities.randomOr0(QuestsConfig.BREED_MOB_QUEST.size() - 1)), -1, false); if (getVariant() instanceof BreedMobsQuestObject breedMobsQuestObject) this.breedMobsQuestObject = breedMobsQuestObject; @@ -38,8 +37,8 @@ public class BreedMobsQuest extends Quest { } } - public BreedMobsQuest(UUID uuid, int step1, int step2, String variant, int amount, boolean rewardReceived) { - super(uuid, step1, step2, QuestsConfig.BREED_MOB_QUEST.stream() + public BreedMobsQuest(Player player, int step1, int step2, String variant, int amount, boolean rewardReceived) throws Exception { + super(player, step1, step2, QuestsConfig.BREED_MOB_QUEST.stream() .filter(object -> variant.equals(object.getInternalName())) .findAny().orElse(null), amount, rewardReceived); if (getVariant() instanceof BreedMobsQuestObject breedMobsQuestObject) diff --git a/src/main/java/com/alttd/altitudequests/objects/quests/CollectDropsQuest.java b/src/main/java/com/alttd/altitudequests/objects/quests/CollectDropsQuest.java index ed4334f..3446a82 100644 --- a/src/main/java/com/alttd/altitudequests/objects/quests/CollectDropsQuest.java +++ b/src/main/java/com/alttd/altitudequests/objects/quests/CollectDropsQuest.java @@ -28,8 +28,8 @@ public class CollectDropsQuest extends Quest { private final CollectDropsQuestObject collectDropsQuestObject; - public CollectDropsQuest(UUID uuid) { - super(uuid, 0, 0, + public CollectDropsQuest(Player player) throws Exception { + super(player, 0, 0, QuestsConfig.COLLECT_DROPS_QUEST.get(Utilities.randomOr0(QuestsConfig.COLLECT_DROPS_QUEST.size() - 1)), -1, false); if (getVariant() instanceof CollectDropsQuestObject collectDropsQuestObject) this.collectDropsQuestObject = collectDropsQuestObject; @@ -41,8 +41,8 @@ public class CollectDropsQuest extends Quest { } } - public CollectDropsQuest(UUID uuid, int step1, int step2, String variant, int amount, boolean rewardReceived) { - super(uuid, step1, step2, QuestsConfig.COLLECT_DROPS_QUEST.stream() + public CollectDropsQuest(Player player, int step1, int step2, String variant, int amount, boolean rewardReceived) throws Exception { + super(player, step1, step2, QuestsConfig.COLLECT_DROPS_QUEST.stream() .filter(object -> variant.equals(object.getInternalName())) .findAny().orElse(null), amount, rewardReceived); if (getVariant() instanceof CollectDropsQuestObject collectDropsQuestObject) diff --git a/src/main/java/com/alttd/altitudequests/objects/quests/KillMobsQuest.java b/src/main/java/com/alttd/altitudequests/objects/quests/KillMobsQuest.java index 2cc07c3..87ffc74 100644 --- a/src/main/java/com/alttd/altitudequests/objects/quests/KillMobsQuest.java +++ b/src/main/java/com/alttd/altitudequests/objects/quests/KillMobsQuest.java @@ -25,8 +25,8 @@ public class KillMobsQuest extends Quest { private final KillMobsQuestObject killMobsQuestObject; - public KillMobsQuest(UUID uuid) { - super(uuid, 0, 0, + public KillMobsQuest(Player player) throws Exception { + super(player, 0, 0, QuestsConfig.KILL_MOB_QUEST.get(Utilities.randomOr0(QuestsConfig.KILL_MOB_QUEST.size() - 1)), -1, false); if (getVariant() instanceof KillMobsQuestObject killMobsQuestObject) this.killMobsQuestObject = killMobsQuestObject; @@ -38,8 +38,8 @@ public class KillMobsQuest extends Quest { } } - public KillMobsQuest(UUID uuid, int step1, int step2, String variant, int amount, boolean rewardReceived) { - super(uuid, step1, step2, QuestsConfig.KILL_MOB_QUEST.stream() + public KillMobsQuest(Player player, int step1, int step2, String variant, int amount, boolean rewardReceived) throws Exception { + super(player, step1, step2, QuestsConfig.KILL_MOB_QUEST.stream() .filter(object -> variant.equals(object.getInternalName())) .findAny().orElse(null), amount, rewardReceived); if (getVariant() instanceof KillMobsQuestObject killMobsQuestObject) diff --git a/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java b/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java index e6f7fb4..431e865 100644 --- a/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java +++ b/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java @@ -27,8 +27,8 @@ public class MineQuest extends Quest { private final MineQuestObject mineQuestObject; - public MineQuest(UUID uuid) { - super(uuid, 0, 0, + public MineQuest(Player player) throws Exception { + super(player, 0, 0, QuestsConfig.MINE_QUESTS.get(Utilities.randomOr0(QuestsConfig.MINE_QUESTS.size() - 1)), -1, false); if (getVariant() instanceof MineQuestObject mineQuestObject) this.mineQuestObject = mineQuestObject; @@ -40,8 +40,8 @@ public class MineQuest extends Quest { } } - public MineQuest(UUID uuid, int mined, int turnedIn, String variant, int amount, boolean rewardReceived) { - super(uuid, mined, turnedIn, QuestsConfig.MINE_QUESTS.stream() + public MineQuest(Player player, int mined, int turnedIn, String variant, int amount, boolean rewardReceived) throws Exception { + super(player, mined, turnedIn, QuestsConfig.MINE_QUESTS.stream() .filter(object -> variant.equals(object.getInternalName())) .findAny().orElse(null), amount, rewardReceived); diff --git a/src/main/java/com/alttd/altitudequests/objects/quests/OtherQuest.java b/src/main/java/com/alttd/altitudequests/objects/quests/OtherQuest.java index 3eb10b6..9b3ccb2 100644 --- a/src/main/java/com/alttd/altitudequests/objects/quests/OtherQuest.java +++ b/src/main/java/com/alttd/altitudequests/objects/quests/OtherQuest.java @@ -25,15 +25,14 @@ import java.sql.SQLException; import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.UUID; import java.util.stream.Collectors; public class OtherQuest extends Quest { private final OtherQuestObject otherQuestObject; - public OtherQuest(UUID uuid) { - super(uuid, 0, 0, + public OtherQuest(Player player) throws Exception { + super(player, 0, 0, QuestsConfig.OTHER_QUEST.get(Utilities.randomOr0(QuestsConfig.OTHER_QUEST.size() - 1)), -1, false); if (getVariant() instanceof OtherQuestObject otherQuestObject) this.otherQuestObject = otherQuestObject; @@ -41,12 +40,11 @@ public class OtherQuest extends Quest { this.otherQuestObject = null; if (otherQuestObject == null) { Logger.warning("Tried to create OtherQuest but unable to find variant: %.", "unknown"); - return; } } - public OtherQuest(UUID uuid, int step1, int step2, String variant, int amount, boolean rewardReceived) { - super(uuid, step1, step2, QuestsConfig.OTHER_QUEST.stream() + public OtherQuest(Player player, int step1, int step2, String variant, int amount, boolean rewardReceived) throws Exception { + super(player, step1, step2, QuestsConfig.OTHER_QUEST.stream() .filter(object -> variant.equals(object.getInternalName())) .findAny().orElse(null), amount, rewardReceived); if (getVariant() instanceof OtherQuestObject otherQuestObject) @@ -148,7 +146,7 @@ public class OtherQuest extends Quest { @Override public Component getDisplayName() { - return MiniMessage.miniMessage().deserialize("%s".formatted( otherQuestObject.getCategory())); + return MiniMessage.miniMessage().deserialize("%s".formatted(otherQuestObject.getCategory())); } @Override @@ -156,7 +154,7 @@ public class OtherQuest extends Quest { return QuestsConfig.COLLECT_DROPS_COMMANDS; } - public void fish(ItemStack caughtItem){ + public void fish(ItemStack caughtItem) { if (isDone() || !caughtItem.getType().equals(otherQuestObject.getMaterial()) || getAmount() == getStep1()) { return; } @@ -169,8 +167,7 @@ public class OtherQuest extends Quest { return; } DyeColor color = getDyeColorFromItemStack(otherQuestObject.getMaterial()); - if (entity instanceof Sheep) { - Sheep sheep = (Sheep) entity; + if (entity instanceof Sheep sheep) { if (sheep.getColor() != color) { return; } @@ -187,7 +184,7 @@ public class OtherQuest extends Quest { checkDone(); } - public void raid(){ + public void raid() { if (isDone() || getAmount() == getStep1() || !Objects.equals(otherQuestObject.getCategory(), "Raid")) { //without checking the category, other players who have otherQuests active will also have a step added return; } diff --git a/src/main/java/com/alttd/altitudequests/util/AutoHideBossBar.java b/src/main/java/com/alttd/altitudequests/util/AutoHideBossBar.java new file mode 100644 index 0000000..5abd7e1 --- /dev/null +++ b/src/main/java/com/alttd/altitudequests/util/AutoHideBossBar.java @@ -0,0 +1,47 @@ +package com.alttd.altitudequests.util; + +import com.alttd.altitudequests.AQuest; +import com.alttd.altitudequests.config.Config; +import com.alttd.altitudequests.objects.Variant; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitScheduler; + +public class AutoHideBossBar extends BukkitRunnable { + + private final BossBar bossBar; + + public AutoHideBossBar(Player player, Variant variant, String suffix) throws Exception { + NamespacedKey namespacedKeyOne = NamespacedKey.fromString(player.getUniqueId() + variant.getInternalName() + suffix, AQuest.getInstance()); + if (namespacedKeyOne == null) { + Logger.warning("Unable to create nameSpacedKey with suffix % for quest for %", suffix, player.getName()); + throw new Exception("Failed to create namespace key"); + } + this.bossBar = Bukkit.createBossBar( + namespacedKeyOne, + "Step One Progress", + BarColor.GREEN, + BarStyle.SOLID); + bossBar.setVisible(false); + bossBar.addPlayer(player); + } + + public void show(double progress) { + BukkitScheduler scheduler = Bukkit.getScheduler(); + if (scheduler.isQueued(this.getTaskId())) + scheduler.cancelTask(this.getTaskId()); + bossBar.setVisible(true); + bossBar.setProgress(progress); + this.runTaskLater(AQuest.getInstance(), Config.BOSS_BAR_AUTO_HIDE.getSeconds() * 20); + } + + @Override + public void run() { + bossBar.setVisible(false); + } +}