diff --git a/settings.gradle.kts b/settings.gradle.kts
index ababa3d..ffb8ee6 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -4,7 +4,10 @@ dependencyResolutionManagement {
repositories {
mavenLocal()
mavenCentral()
- maven("https://papermc.io/repo/repository/maven-public/") // Paper
+ maven("https://repo.destro.xyz/snapshots") // Altitude - Galaxy
+ maven("https://jitpack.io") { // Vault
+ content { includeGroup("com.github.milkbowl") }
+ }
}
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
}
diff --git a/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandCreateScruff.java b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandCreateScruff.java
index dcb5f34..c2f02e8 100644
--- a/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandCreateScruff.java
+++ b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandCreateScruff.java
@@ -4,6 +4,7 @@ import com.alttd.altitudequests.commands.SubCommand;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.LocalConfig;
import com.alttd.altitudequests.config.MessagesConfig;
+import com.alttd.altitudequests.util.Logger;
import com.alttd.altitudequests.util.Utilities;
import net.kyori.adventure.text.minimessage.Template;
import net.kyori.adventure.text.minimessage.template.TemplateResolver;
@@ -15,6 +16,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.*;
import org.bukkit.event.entity.CreatureSpawnEvent;
+import java.text.ParseException;
import java.util.*;
public class CommandCreateScruff extends SubCommand {
@@ -31,8 +33,14 @@ public class CommandCreateScruff extends SubCommand {
commandSender.sendMiniMessage(getHelpMessage(), null);
return true;
}
- Location location = new Location(world, Double.parseDouble(args[2]),Double.parseDouble(args[3]), Double.parseDouble(args[4]),
- Float.parseFloat(args[5]), Float.parseFloat(args[6]));
+ Location location;
+ try {
+ location = new Location(world, Double.parseDouble(args[2]), Double.parseDouble(args[3]), Double.parseDouble(args[4]),
+ Float.parseFloat(args[5]), Float.parseFloat(args[6]));
+ } catch (NumberFormatException exception) {
+ commandSender.sendMiniMessage("Invalid arguments.", null);
+ return true;
+ }
Wolf wolf = (Wolf) world.spawnEntity(location, EntityType.WOLF, CreatureSpawnEvent.SpawnReason.CUSTOM);
wolf.setPersistent(true);
wolf.setInvulnerable(true);
diff --git a/src/main/java/com/alttd/altitudequests/config/QuestsConfig.java b/src/main/java/com/alttd/altitudequests/config/QuestsConfig.java
new file mode 100644
index 0000000..5894709
--- /dev/null
+++ b/src/main/java/com/alttd/altitudequests/config/QuestsConfig.java
@@ -0,0 +1,59 @@
+package com.alttd.altitudequests.config;;
+
+import com.alttd.altitudequests.objects.MineQuestObject;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+import net.kyori.adventure.text.minimessage.Template;
+import net.kyori.adventure.text.minimessage.template.TemplateResolver;
+import org.bukkit.Material;
+import org.bukkit.configuration.ConfigurationSection;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class QuestsConfig extends AbstractConfig {
+ static QuestsConfig config;
+ static int version;
+
+ public QuestsConfig() {
+ super(new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "AltitudeQuests"), "quests.yml");
+ }
+
+ public static void reload() {
+ config = new QuestsConfig();
+
+ version = config.getInt("config-version", 1);
+ config.set("config-version", 1);
+
+ config.readConfig(QuestsConfig.class, null);
+ }
+
+ String getString(String path, String def) {
+ yaml.addDefault(path, def);
+ return yaml.getString(path, yaml.getString(path));
+ }
+
+ public static List MINE_QUESTS = new ArrayList<>();
+ private static void loadMineQuests() {
+ MINE_QUESTS.clear();
+ ConfigurationSection configurationSection = config.getConfigurationSection("mining.possible_tasks");
+ Set keys = configurationSection.getKeys(false);
+ MiniMessage miniMessage = MiniMessage.miniMessage();
+ for (String key : keys) {
+ Material material = Material.valueOf(configurationSection.getString(key + "material"));
+
+ TemplateResolver resolver = TemplateResolver.resolving(Template.template("block", material.name().toLowerCase()));
+ List collect = configurationSection.getStringList(key + "pages").stream()
+ .map(page -> miniMessage.deserialize(page, resolver))
+ .collect(Collectors.toList());
+ MINE_QUESTS.add(new MineQuestObject(key,
+ configurationSection.getString(key + "name"),
+ material,
+ configurationSection.getInt(key + "amount"),
+ collect));
+ }
+ }
+}
diff --git a/src/main/java/com/alttd/altitudequests/database/Queries.java b/src/main/java/com/alttd/altitudequests/database/Queries.java
index b3df60c..63f6681 100644
--- a/src/main/java/com/alttd/altitudequests/database/Queries.java
+++ b/src/main/java/com/alttd/altitudequests/database/Queries.java
@@ -1,6 +1,5 @@
package com.alttd.altitudequests.database;
-import com.alttd.altitudequests.objects.GoalType;
import com.alttd.altitudequests.util.Logger;
import java.sql.PreparedStatement;
@@ -9,19 +8,17 @@ import java.util.UUID;
public class Queries {
- public static int setUserProgress(UUID uuid, GoalType goalType, int progress) {
- String sql = "INSERT VALUES (?, ?, ?) INTO user_seen " +
- "WHERE uuid = ? AND goal_type = ? " +
+ public static int setUserProgress(UUID uuid, int progress) {
+ String sql = "INSERT VALUES (?, ?) INTO user_seen " +
+ "WHERE uuid = ?" +
"ON DUPLICATE KEY UPDATE progress = ?";
long time;
try {
PreparedStatement preparedStatement = Database.connection.prepareStatement(sql);
preparedStatement.setString(1, uuid.toString());
- preparedStatement.setString(2, goalType.name());
preparedStatement.setInt(3, progress);
preparedStatement.setString(4, uuid.toString());
- preparedStatement.setString(5, goalType.name());
preparedStatement.setInt(6, progress);
preparedStatement.execute();
diff --git a/src/main/java/com/alttd/altitudequests/events/MineBlocks.java b/src/main/java/com/alttd/altitudequests/events/MineBlocks.java
index 2e8bedf..78301ae 100644
--- a/src/main/java/com/alttd/altitudequests/events/MineBlocks.java
+++ b/src/main/java/com/alttd/altitudequests/events/MineBlocks.java
@@ -20,7 +20,7 @@ public class MineBlocks implements Listener {
if (quest == null || quest.isDone())
return;
if (quest instanceof MineQuest mineQuest)
- mineQuest.mine(event.getBlock(), player);
+ mineQuest.mine(event.getBlock());
}
}
diff --git a/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java b/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java
index dd2e51b..fe15d68 100644
--- a/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java
+++ b/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java
@@ -1,38 +1,54 @@
package com.alttd.altitudequests.events;
+import com.alttd.altitudequests.AQuests;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.LocalConfig;
import net.kyori.adventure.inventory.Book;
import net.kyori.adventure.text.minimessage.MiniMessage;
+import net.kyori.adventure.text.minimessage.Template;
+import net.kyori.adventure.text.minimessage.template.TemplateResolver;
+import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEntityEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+import java.util.List;
import java.util.stream.Collectors;
public class TalkToQuest implements Listener {
- private static final Book book;
- static {
- MiniMessage miniMessage = MiniMessage.miniMessage();
- book = Book.builder()
- .author(miniMessage.deserialize(Config.QUEST_BOOK_AUTHOR))
- .title(miniMessage.deserialize(Config.QUEST_BOOK_TITLE))
- .pages(Config.QUEST_PAGES.stream()
- .map(miniMessage::deserialize)
- .collect(Collectors.toList()))
- .build();
- }
+ private static final MiniMessage miniMessage = MiniMessage.miniMessage();
@EventHandler(priority = EventPriority.HIGH)
public void onEntityInteract(PlayerInteractEntityEvent event) {
if (LocalConfig.activeNPC == null || !LocalConfig.activeNPC.equals(event.getRightClicked().getUniqueId()))
return;
event.setCancelled(true);
- event.getPlayer().openBook(book);
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ event.getPlayer().openBook(getBook(event));
+ }
+ }.runTaskTimerAsynchronously(AQuests.getInstance(), 0, 0);
//TODO make it so there can be one book config per quest
//TODO make it so everything can be done with commands and just don't let them tab complete and do them through the book instead
//TODO in config allow a multitude of events to be prepared and randomly select from them at certain times of day?
}
+
+ private Book getBook (PlayerInteractEntityEvent event) {
+ Player player = event.getPlayer();
+ return Book.builder()
+ .author(miniMessage.deserialize(Config.QUEST_BOOK_AUTHOR))
+ .title(miniMessage.deserialize(Config.QUEST_BOOK_TITLE))
+ .pages(getPages(player).stream()
+ .map(page -> miniMessage.deserialize(page, TemplateResolver.templates(Template.template("player", player.getName()))))
+ .collect(Collectors.toList()))
+ .build();
+ }
+
+ private List getPages(Player player) {
+ return (Config.QUEST_PAGES);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/alttd/altitudequests/objects/GoalType.java b/src/main/java/com/alttd/altitudequests/objects/GoalType.java
deleted file mode 100644
index 63b375d..0000000
--- a/src/main/java/com/alttd/altitudequests/objects/GoalType.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.alttd.altitudequests.objects;
-
-public enum GoalType {
- TALK,
- MONEY,
- MINE,
- WALK
-}
diff --git a/src/main/java/com/alttd/altitudequests/objects/MineQuestObject.java b/src/main/java/com/alttd/altitudequests/objects/MineQuestObject.java
new file mode 100644
index 0000000..508c784
--- /dev/null
+++ b/src/main/java/com/alttd/altitudequests/objects/MineQuestObject.java
@@ -0,0 +1,43 @@
+package com.alttd.altitudequests.objects;
+
+import net.kyori.adventure.text.Component;
+import org.bukkit.Material;
+
+import java.util.List;
+
+public class MineQuestObject {
+
+ String internalName;
+ String name;
+ Material material;
+ int amount;
+ List pages;
+
+ public MineQuestObject(String internalName, String name, Material material, int amount, List pages) {
+ this.internalName = internalName;
+ this.name = name;
+ this.material = material;
+ this.amount = amount;
+ this.pages = pages;
+ }
+
+ public String getInternalName() {
+ return internalName;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Material getMaterial() {
+ return material;
+ }
+
+ public int getAmount() {
+ return amount;
+ }
+
+ public List getPages() {
+ return pages;
+ }
+}
diff --git a/src/main/java/com/alttd/altitudequests/objects/Quest.java b/src/main/java/com/alttd/altitudequests/objects/Quest.java
index db8d2d7..ee7ce51 100644
--- a/src/main/java/com/alttd/altitudequests/objects/Quest.java
+++ b/src/main/java/com/alttd/altitudequests/objects/Quest.java
@@ -1,38 +1,52 @@
package com.alttd.altitudequests.objects;
+import com.alttd.altitudequests.config.QuestsConfig;
+import com.alttd.altitudequests.objects.quests.MineQuest;
+import org.bukkit.entity.Player;
+
import java.util.HashMap;
+import java.util.Random;
import java.util.UUID;
public abstract class Quest {
- private static Quest dailyQuest = null;
private static final HashMap dailyQuests = new HashMap<>();
private static Quest weeklyQuest = null;
+ private static final String[] possibleQuests;
- private String name;
- private GoalType goalType;
//TODO add all data every quest needs
+ static {
+ possibleQuests = new String[]{"MineQuest"};
+ }
- public Quest(String name, GoalType goalType) {
- this.name = name;
- this.goalType = goalType;
+ public Quest() {
+ }
+
+ public static void createDailyQuest(Player player) {
+ Random random = new Random();
+ String questName = possibleQuests[random.nextInt(0, possibleQuests.length - 1)];
+ Quest quest = null;
+ switch (questName) {
+ case "MineQuest" -> {
+ quest = new MineQuest(QuestsConfig.MINE_QUESTS.get(random.nextInt(0, QuestsConfig.MINE_QUESTS.size() - 1)));
+ }
+ }
+ if (quest == null)
+ return; //TODO error
+ dailyQuests.put(player.getUniqueId(), quest);
}
public static Quest getDailyQuest(UUID uuid) {
- if (!dailyQuests.containsKey(uuid))
- dailyQuests.put(uuid, dailyQuest.initQuest());
+ if (!dailyQuests.containsKey(uuid)) {
+ return null;
+ }
return dailyQuests.get(uuid);
}
- public static void setActiveDailyQuest(Quest newQuest) {
- Quest.dailyQuest = newQuest;
- }
public static void setActiveWeeklyQuest(Quest newQuest) {
Quest.weeklyQuest = newQuest;
}
public abstract boolean isDone();
-
- public abstract Quest initQuest();
}
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 be29b40..f495058 100644
--- a/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java
+++ b/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java
@@ -1,27 +1,44 @@
package com.alttd.altitudequests.objects.quests;
-import com.alttd.altitudequests.objects.GoalType;
+import com.alttd.altitudequests.config.QuestsConfig;
+import com.alttd.altitudequests.objects.MineQuestObject;
import com.alttd.altitudequests.objects.Quest;
import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
+
+import java.util.Optional;
public class MineQuest extends Quest {
- public MineQuest(String name, GoalType goalType) {
- super(name, goalType);
+ int mined;
+ int turnedIn;
+ MineQuestObject mineQuestObject;
+ boolean isDone = false;
+
+ public MineQuest(MineQuestObject mineQuestObject) {
+ mined = 0;
+ turnedIn = 0;
+ this.mineQuestObject = mineQuestObject;
+ }
+
+ public MineQuest(int mined, int turnedIn, String internalName) {
+ this.mined = mined;
+ this.turnedIn = turnedIn;
+ Optional any = QuestsConfig.MINE_QUESTS.stream().filter(object -> internalName.equals(object.getInternalName())).findAny();
+ if (any.isEmpty())
+ return; //TODO error
+ this.mineQuestObject = any.get();
}
@Override
public boolean isDone() {
- return false;
+ return isDone;
}
- @Override
- public Quest initQuest() {
- return new MineQuest("Mine", GoalType.MINE);
- }
-
- public void mine(Block block, Player player) {
-
+ public void mine(Block block) {
+ if (!isDone && !block.getType().equals(mineQuestObject.getMaterial()))
+ return;
+ mined += 1;
+ if (mined == mineQuestObject.getAmount())
+ isDone = true;
}
}