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 extends Quest> questClass = possibleQuests.get(Utilities.randomOr0(possibleQuests.size() - 1));
try {
- Constructor extends Quest> constructor = questClass.getDeclaredConstructor(UUID.class);
- putDailyQuest(player.getUniqueId(), constructor.newInstance(player.getUniqueId()));
- } catch (InvocationTargetException | IllegalAccessException | InstantiationException | NoSuchMethodException e) {
+ Constructor extends Quest> 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);
+ }
+}