From 39900153d860f9fbb47031bebf0b2b64a1f5b889 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Thu, 2 Jun 2022 22:12:29 +0200 Subject: [PATCH] Added a way to open books outside of the interact with entity event open book after turning in item moved more things from MineQuest to just Quest Made Variant and made MineQuestObject extend Variant Made quests reset if they aren't from (irl) today Made quests reset when a new (irl) day starts Basically made everything work --- .../java/com/alttd/altitudequests/AQuest.java | 19 ++- .../commands/CommandManager.java | 4 +- .../commands/subcommands/CommandSetQuest.java | 61 ++++++++++ .../commands/subcommands/CommandTurnIn.java | 2 + .../alttd/altitudequests/config/Config.java | 14 ++- .../altitudequests/config/QuestsConfig.java | 9 +- .../altitudequests/database/Database.java | 1 + .../altitudequests/events/LogoutEvent.java | 3 - .../events/PluginMessageListener.java | 3 +- .../altitudequests/events/TalkToQuest.java | 41 +------ .../objects/MineQuestObject.java | 42 ------- .../alttd/altitudequests/objects/Quest.java | 115 ++++++++++++++++-- .../alttd/altitudequests/objects/Variant.java | 43 +++++++ .../objects/quests/MineQuest.java | 113 +++++++++-------- .../objects/variants/MineQuestObject.java | 21 ++++ .../alttd/altitudequests/util/BookOpener.java | 53 ++++++++ .../alttd/altitudequests/util/Utilities.java | 8 ++ 17 files changed, 389 insertions(+), 163 deletions(-) create mode 100644 src/main/java/com/alttd/altitudequests/commands/subcommands/CommandSetQuest.java delete mode 100644 src/main/java/com/alttd/altitudequests/objects/MineQuestObject.java create mode 100644 src/main/java/com/alttd/altitudequests/objects/Variant.java create mode 100644 src/main/java/com/alttd/altitudequests/objects/variants/MineQuestObject.java create mode 100644 src/main/java/com/alttd/altitudequests/util/BookOpener.java diff --git a/src/main/java/com/alttd/altitudequests/AQuest.java b/src/main/java/com/alttd/altitudequests/AQuest.java index b0e7a64..1c466f5 100644 --- a/src/main/java/com/alttd/altitudequests/AQuest.java +++ b/src/main/java/com/alttd/altitudequests/AQuest.java @@ -5,6 +5,7 @@ import com.alttd.altitudequests.config.*; import com.alttd.altitudequests.events.*; import com.alttd.altitudequests.objects.Quest; import com.alttd.altitudequests.util.Logger; +import com.alttd.altitudequests.util.Utilities; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; @@ -35,7 +36,9 @@ public final class AQuest extends JavaPlugin { @Override public void onDisable() { - // Plugin shutdown logic + if (Config.DEBUG) + Logger.info("Syncing users."); + Quest.saveAll(); } public void reloadConfigs() { @@ -56,6 +59,7 @@ public final class AQuest extends JavaPlugin { getServer().getMessenger().registerIncomingPluginChannel(this, "aquest:player-data", new PluginMessageListener()); } + private static int yearDay = Utilities.getYearDay(); private void scheduleTasks() { new BukkitRunnable() { @Override @@ -64,6 +68,17 @@ public final class AQuest extends JavaPlugin { Logger.info("Syncing users."); Quest.saveAll(); } - }.runTaskTimerAsynchronously(getInstance(), 10 * 60 * 20L, 10 * 60 * 20L); + }.runTaskTimerAsynchronously(getInstance(), 10 * 60 * 20L, 10 * 60 * 20L); //every 10 minutes + + new BukkitRunnable() { + @Override + public void run() { + int tmp = Utilities.getYearDay(); + if (tmp == yearDay) + return; + yearDay = tmp; + Quest.resetQuests(); + } + }.runTaskTimerAsynchronously(getInstance(), 100, 100); //every 5 seconds } } diff --git a/src/main/java/com/alttd/altitudequests/commands/CommandManager.java b/src/main/java/com/alttd/altitudequests/commands/CommandManager.java index 6bc7388..51978a1 100644 --- a/src/main/java/com/alttd/altitudequests/commands/CommandManager.java +++ b/src/main/java/com/alttd/altitudequests/commands/CommandManager.java @@ -33,7 +33,8 @@ public class CommandManager implements CommandExecutor, TabExecutor { new CommandReload(AQuest.getInstance()), new CommandCreateScruff(), new CommandChangeQuest(), - new CommandTurnIn()); + new CommandTurnIn(), + new CommandSetQuest()); } @Override @@ -58,6 +59,7 @@ public class CommandManager implements CommandExecutor, TabExecutor { if (args.length <= 1) { res.addAll(subCommands.stream() + .filter(SubCommand::shouldTabComplete) .filter(subCommand -> commandSender.hasPermission(subCommand.getPermission())) .map(SubCommand::getName) .filter(name -> args.length == 0 || name.startsWith(args[0])) diff --git a/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandSetQuest.java b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandSetQuest.java new file mode 100644 index 0000000..6da4d58 --- /dev/null +++ b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandSetQuest.java @@ -0,0 +1,61 @@ +package com.alttd.altitudequests.commands.subcommands; + +import com.alttd.altitudequests.commands.SubCommand; +import com.alttd.altitudequests.objects.Quest; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class CommandSetQuest extends SubCommand { + + @Override + public boolean onCommand(CommandSender commandSender, String[] args) { + if (args.length != 4) + return true;//TODO Error invalid length + Player player = Bukkit.getServer().getPlayer(args[1]); + if (player == null || !player.hasPlayedBefore()) + return true; //TODO error invalid player; + if (!Quest.loadDailyQuest(args[2], args[3], 0, 0, player.getUniqueId())) + commandSender.sendMiniMessage("Unable to create quest of variant .", + TagResolver.resolver(Placeholder.parsed("quest", args[2]), + Placeholder.parsed("variant", args[3]))); + commandSender.sendMiniMessage("Created quest of variant .", + TagResolver.resolver(Placeholder.parsed("quest", args[2]), + Placeholder.parsed("variant", args[3]))); + return true; + } + + @Override + public String getName() { + return "setquest"; + } + + @Override + public List getTabComplete(CommandSender commandSender, String[] args) { + List res = new ArrayList<>(); + switch (args.length) { + case 2 -> res.addAll(Bukkit.getServer().getOnlinePlayers().stream() + .map(Player::getName) + .collect(Collectors.toList())); + case 3 -> res.addAll(Quest.getTypes()); + case 4 -> res.add("enter quest type"); + } + return res; + } + + @Override + public String getHelpMessage() { + return "tmp help message"; //TODO fix + } + + @Override + public boolean shouldTabComplete() { + return true; + } +} diff --git a/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandTurnIn.java b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandTurnIn.java index b08bee2..d917333 100644 --- a/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandTurnIn.java +++ b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandTurnIn.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.objects.Quest; +import com.alttd.altitudequests.util.BookOpener; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -30,6 +31,7 @@ public class CommandTurnIn extends SubCommand { return true; } dailyQuest.turnIn(player); + BookOpener.openBook(player); return true; } diff --git a/src/main/java/com/alttd/altitudequests/config/Config.java b/src/main/java/com/alttd/altitudequests/config/Config.java index a2572be..cd1cc9e 100644 --- a/src/main/java/com/alttd/altitudequests/config/Config.java +++ b/src/main/java/com/alttd/altitudequests/config/Config.java @@ -28,7 +28,17 @@ public final class Config extends AbstractConfig { public static String QUEST_BOOK_AUTHOR = "Scruff"; public static String QUEST_BOOK_TITLE = "Quest Title"; - public static List QUEST_PAGES = List.of("Example"); + public static List QUEST_PAGES = List.of(""" + Hey + + Here is a quick summary of your quest progress so far! + * Quest: + * Variant: + * Items obtained: / + * Items turned in: / + + Click here to turn in more items + """); private static void loadBook() { QUEST_BOOK_AUTHOR = config.getString("book.author", QUEST_BOOK_AUTHOR); QUEST_BOOK_TITLE = config.getString("book.title", QUEST_BOOK_TITLE); @@ -37,9 +47,11 @@ public final class Config extends AbstractConfig { public static String TOO_FAR_FROM_NPC = "You are too far from Scruff";//TODO replace scruff with ? public static String DAILY_ALREADY_DONE = "You already completed your daily quest"; + public static String RESETTING_QUESTS = "[Mascot] Scruff: Thank you everyone that completed their daily quest! I will be handing out new ones now so come visit me at /spawn!"; private static void loadMessages() { TOO_FAR_FROM_NPC = config.getString("messages.too-far-from-npc", TOO_FAR_FROM_NPC); DAILY_ALREADY_DONE = config.getString("messages.daily-already-done", DAILY_ALREADY_DONE); + RESETTING_QUESTS = config.getString("messages.resetting-quests", RESETTING_QUESTS); } private static void loadGUIText() { diff --git a/src/main/java/com/alttd/altitudequests/config/QuestsConfig.java b/src/main/java/com/alttd/altitudequests/config/QuestsConfig.java index e929d3b..921a5f8 100644 --- a/src/main/java/com/alttd/altitudequests/config/QuestsConfig.java +++ b/src/main/java/com/alttd/altitudequests/config/QuestsConfig.java @@ -1,6 +1,6 @@ package com.alttd.altitudequests.config;; -import com.alttd.altitudequests.objects.MineQuestObject; +import com.alttd.altitudequests.objects.variants.MineQuestObject; import com.alttd.altitudequests.util.Logger; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; @@ -24,6 +24,7 @@ public class QuestsConfig extends AbstractConfig { } public static List MINE_QUESTS = new ArrayList<>(); + public static String MINE_QUEST_NAME = "Mine quest"; private static void loadMineQuests() { MINE_QUESTS.clear(); @@ -35,13 +36,13 @@ public class QuestsConfig extends AbstractConfig { Set keys = configurationSection.getKeys(false); for (String key : keys) { Material material = Material.valueOf(configurationSection.getString(key + ".material")); -//TODO maybe have pages for in progress and pages for done??? - List collect = configurationSection.getStringList(key + ".pages"); MINE_QUESTS.add(new MineQuestObject(key, configurationSection.getString(key + ".name"), material, configurationSection.getInt(key + ".amount"), - collect)); + configurationSection.getStringList(key + ".quest-pages"), + configurationSection.getStringList(key + ".done-pages"))); } + MINE_QUEST_NAME = config.getString("mining.name", MINE_QUEST_NAME); } } diff --git a/src/main/java/com/alttd/altitudequests/database/Database.java b/src/main/java/com/alttd/altitudequests/database/Database.java index 8cd946a..250bebf 100644 --- a/src/main/java/com/alttd/altitudequests/database/Database.java +++ b/src/main/java/com/alttd/altitudequests/database/Database.java @@ -91,6 +91,7 @@ public class Database { private static void createUserPointsTable() { try { String sql = "CREATE TABLE IF NOT EXISTS generic_quest_progress(" + + "year_day INT NOT NULL, " + "uuid VARCHAR(36) NOT NULL, " + "quest VARCHAR(36) NOT NULL, " + "quest_variant VARCHAR(36) NOT NULL, " + diff --git a/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java b/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java index 7161e5a..0caf485 100644 --- a/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java +++ b/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java @@ -24,9 +24,6 @@ public class LogoutEvent implements Listener { public void run() { if (Config.DEBUG) Logger.info("Syncing %", event.getPlayer().getName()); - Quest dailyQuest = Quest.getDailyQuest(uuid); - if (dailyQuest != null) - dailyQuest.save(); Quest.unloadUser(uuid); ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("try-unlock"); diff --git a/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java b/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java index aeb878c..f80de2d 100644 --- a/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java +++ b/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java @@ -5,6 +5,7 @@ import com.alttd.altitudequests.config.Config; import com.alttd.altitudequests.database.Database; import com.alttd.altitudequests.objects.Quest; import com.alttd.altitudequests.util.Logger; +import com.alttd.altitudequests.util.Utilities; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; import org.bukkit.Bukkit; @@ -70,7 +71,7 @@ public class PluginMessageListener implements org.bukkit.plugin.messaging.Plugin PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql); statement.setString(1, uuid.toString()); ResultSet resultSet = statement.executeQuery(); - if (resultSet.next()) { + if (resultSet.next() && resultSet.getInt("year_day") < Utilities.getYearDay()) { Quest.loadDailyQuest( resultSet.getString("quest"), resultSet.getString("quest_variant"), diff --git a/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java b/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java index b600eed..24409ef 100644 --- a/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java +++ b/src/main/java/com/alttd/altitudequests/events/TalkToQuest.java @@ -1,14 +1,8 @@ package com.alttd.altitudequests.events; import com.alttd.altitudequests.AQuest; -import com.alttd.altitudequests.config.Config; import com.alttd.altitudequests.config.LocalConfig; -import com.alttd.altitudequests.objects.Quest; -import net.kyori.adventure.inventory.Book; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import com.alttd.altitudequests.util.BookOpener; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -17,15 +11,11 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; public class TalkToQuest implements Listener { - private static final MiniMessage miniMessage = MiniMessage.miniMessage(); - private static final Set inProcess = new HashSet<>(); @EventHandler(priority = EventPriority.HIGH) @@ -42,38 +32,11 @@ public class TalkToQuest implements Listener { new BukkitRunnable() { @Override public void run() { - player.openBook(getBook(event)); + BookOpener.openBook(player); inProcess.remove(uniqueId); } }.runTaskAsynchronously(AQuest.getInstance()); //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)) - .build(); - } - - private static final Component error = MiniMessage.miniMessage().deserialize("Error retrieving quest data"); - private List getPages(Player player) { - Quest dailyQuest = Quest.getDailyQuest(player.getUniqueId()); - if (dailyQuest == null) - return List.of(error); - TagResolver tagResolver = TagResolver.resolver( - TagResolver.resolver(Placeholder.component("player", player.name())), - TagResolver.resolver(Placeholder.parsed("br", "\n")), - dailyQuest.getTagResolvers() - ); - //TODO add weekly quest? - List pages = dailyQuest.getPages().stream() - .map(page -> miniMessage.deserialize(page, tagResolver)) - .collect(Collectors.toList()); - return (pages); - } } \ No newline at end of file diff --git a/src/main/java/com/alttd/altitudequests/objects/MineQuestObject.java b/src/main/java/com/alttd/altitudequests/objects/MineQuestObject.java deleted file mode 100644 index fc031f2..0000000 --- a/src/main/java/com/alttd/altitudequests/objects/MineQuestObject.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.alttd.altitudequests.objects; - -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 2efcb2f..4d489f9 100644 --- a/src/main/java/com/alttd/altitudequests/objects/Quest.java +++ b/src/main/java/com/alttd/altitudequests/objects/Quest.java @@ -7,6 +7,8 @@ import com.alttd.altitudequests.util.Logger; import com.alttd.altitudequests.util.Utilities; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -15,6 +17,7 @@ import org.bukkit.scheduler.BukkitRunnable; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.*; +import java.util.stream.Collectors; public abstract class Quest { @@ -28,6 +31,20 @@ public abstract class Quest { possibleQuests.add(MineQuest.class); } + private final UUID uuid; + private int step1; + private int step2; + private final Variant variant; + private boolean isDone; + + public Quest(UUID uuid, int step1, int step2, Variant variant) { + this.uuid = uuid; + this.step1 = step1; + this.step2 = step2; + this.variant = variant; + this.isDone = false; + } + public static void createDailyQuest(Player player) { if (possibleQuests.size() == 0) { player.sendMiniMessage("Unable to create quest, no quests in config", null); @@ -76,17 +93,12 @@ public abstract class Quest { }.runTaskAsynchronously(AQuest.getInstance()); } - public static void unloadUser(UUID uuid) { + public static void unloadUser(UUID uuid) { //Pls only run async queriedUsers.remove(uuid); Quest quest = dailyQuests.remove(uuid); if (quest == null) return; - new BukkitRunnable() { - @Override - public void run() { - quest.save(); - } - }.runTaskAsynchronously(AQuest.getInstance()); + quest.save(); } public static void saveAll() { @@ -95,11 +107,11 @@ public abstract class Quest { } } - public static void loadDailyQuest(String quest, String quest_variant, int step_1_progress, int step_2_progress, UUID uuid) { + public static boolean loadDailyQuest(String quest, String quest_variant, int step_1_progress, int step_2_progress, UUID uuid) { Optional> any = possibleQuests.stream().filter(q -> q.getSimpleName().equals(quest)).findAny(); if (any.isEmpty()) { //TODO error - return; + return false; } Class aClass = any.get(); Constructor constructor; @@ -109,16 +121,93 @@ public abstract class Quest { dailyQuests.put(uuid, quest1); } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { e.printStackTrace(); + return false; } + return true; + } + + public static Collection getTypes() { + return possibleQuests.stream().map(Class::getSimpleName).collect(Collectors.toList()); + } + + public static void resetQuests() { + new BukkitRunnable() { + @Override + public void run() { + Bukkit.getServer().sendMessage(MiniMessage.miniMessage().deserialize(Config.RESETTING_QUESTS)); + dailyQuests.clear(); + for (Player player : Bukkit.getOnlinePlayers()) { + createDailyQuest(player); + } + } + }.runTaskAsynchronously(AQuest.getInstance()); } public abstract void save(); - public abstract boolean isDone(); - - public abstract List getPages(); - public abstract TagResolver getTagResolvers(); public abstract int turnIn(Player player); + + public abstract Component getDisplayName(); + + public List getQuestPages() { + return variant.getQuestPages(); + } + + public List getDonePages() { + return variant.getDonePages(); + } + + protected void checkDone() { + if (isDone()) + return; + if (getStep1() == variant.getAmount() && getStep2() == variant.getAmount()) { + setDone(true); + } + } + + public void checkDone(Player player) { + checkDone(); + if (!isDone) + return; + QuestCompleteEvent event = new QuestCompleteEvent(player, this, true); + event.callEvent(); + } + + public Variant getVariant() { + return variant; + } + + public UUID getUuid() { + return uuid; + } + + public int getStep1() { + return step1; + } + + public void addStep1(int step1) { + this.step1 += step1; + } + + public int getStep2() { + return step2; + } + + public void addStep2(int step2) { + this.step2 += step2; + } + + public void setDone(boolean done) { + isDone = done; + } + + public boolean isDone() { + return isDone; + } + + public int getMaxToTurnIn() { + return Math.min(variant.getAmount() - getStep2(), getStep1() - getStep2()); + } } diff --git a/src/main/java/com/alttd/altitudequests/objects/Variant.java b/src/main/java/com/alttd/altitudequests/objects/Variant.java new file mode 100644 index 0000000..0536097 --- /dev/null +++ b/src/main/java/com/alttd/altitudequests/objects/Variant.java @@ -0,0 +1,43 @@ +package com.alttd.altitudequests.objects; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; + +import java.util.List; + +public abstract class Variant { + + private final String internalName; + private final Component name; + private final int amount; + private final List questPages; + private final List donePages; + + public Variant(String internalName, String name, int amount, List questPages, List donePages) { + this.internalName = internalName; + this.name = MiniMessage.miniMessage().deserialize(name); + this.amount = amount; + this.questPages = questPages; + this.donePages = donePages; + } + + public String getInternalName() { + return internalName; + } + + public Component getName() { + return name; + } + + public int getAmount() { + return amount; + } + + public List getQuestPages() { + return questPages; + } + + public List getDonePages() { + return donePages; + } +} 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 61306e4..f671eb8 100644 --- a/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java +++ b/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java @@ -1,12 +1,14 @@ package com.alttd.altitudequests.objects.quests; +import com.alttd.altitudequests.config.Config; import com.alttd.altitudequests.config.QuestsConfig; import com.alttd.altitudequests.database.Database; -import com.alttd.altitudequests.objects.MineQuestObject; +import com.alttd.altitudequests.objects.variants.MineQuestObject; import com.alttd.altitudequests.objects.Quest; -import com.alttd.altitudequests.objects.QuestCompleteEvent; import com.alttd.altitudequests.util.Logger; import com.alttd.altitudequests.util.Utilities; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.block.Block; @@ -19,83 +21,82 @@ import java.util.*; public class MineQuest extends Quest { - private final UUID uuid; - private int mined; - private int turnedIn; private final MineQuestObject mineQuestObject; - private boolean isDone = false; public MineQuest(UUID uuid) { - this.uuid = uuid; - mined = 0; - turnedIn = 0; - this.mineQuestObject = QuestsConfig.MINE_QUESTS.get(Utilities.randomOr0(QuestsConfig.MINE_QUESTS.size() - 1)); + super(uuid, 0, 0, + QuestsConfig.MINE_QUESTS.get(Utilities.randomOr0(QuestsConfig.MINE_QUESTS.size() - 1))); + if (getVariant() instanceof MineQuestObject mineQuestObject) + this.mineQuestObject = mineQuestObject; + else + this.mineQuestObject = null; + if (mineQuestObject == null) { + Logger.warning("Tried to create MineQuest but unable to find variant: %.", "unknown"); + return; //TODO error + } } - public MineQuest(String variantInternalName, int mined, int turnedIn, UUID uuid) { - this.mined = mined; - this.turnedIn = turnedIn; - this.uuid = uuid; - Optional any = QuestsConfig.MINE_QUESTS.stream().filter(object -> variantInternalName.equals(object.getInternalName())).findAny(); - if (any.isEmpty()) { + public MineQuest(String variantInternalName, int mined, int turnedIn, UUID uuid) { + super(uuid, mined, turnedIn, QuestsConfig.MINE_QUESTS.stream() + .filter(object -> variantInternalName.equals(object.getInternalName())) + .findAny().orElse(null)); + if (getVariant() instanceof MineQuestObject mineQuestObject) + this.mineQuestObject = mineQuestObject; + else this.mineQuestObject = null; + if (mineQuestObject == null) { Logger.warning("Tried to create MineQuest but unable to find variant: %.", variantInternalName); return; //TODO error } - this.mineQuestObject = any.get(); + checkDone(); } @Override public void save() { String sql = "INSERT INTO generic_quest_progress " + - "(uuid, quest, quest_variant, step_1_progress, step_2_progress) " + - "VALUES (?, ?, ?, ?, ?) " + + "(year_day, uuid, quest, quest_variant, step_1_progress, step_2_progress) " + + "VALUES (?, ?, ?, ?, ?, ?) " + "ON DUPLICATE KEY UPDATE " + - "quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?"; + "quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?, year_day = ?"; try { PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql); - statement.setString(1, uuid.toString()); - statement.setString(2, MineQuest.class.getSimpleName()); - statement.setString(3, mineQuestObject.getInternalName()); - statement.setInt(4, mined); - statement.setInt(5, turnedIn); - statement.setString(6, MineQuest.class.getSimpleName()); - statement.setString(7, mineQuestObject.getInternalName()); - statement.setInt(8, mined); - statement.setInt(9, turnedIn); + int yearDay = Utilities.getYearDay(); + if (Config.DEBUG) + Logger.info("Saving user for year day %.", String.valueOf(yearDay)); + statement.setInt(1, yearDay); + statement.setString(2, getUuid().toString()); + statement.setString(3, MineQuest.class.getSimpleName()); + statement.setString(4, mineQuestObject.getInternalName()); + statement.setInt(5, getStep1()); + statement.setInt(6, getStep2()); + statement.setString(7, MineQuest.class.getSimpleName()); + statement.setString(8, mineQuestObject.getInternalName()); + statement.setInt(9, getStep1()); + statement.setInt(10, getStep2()); + statement.setInt(11, yearDay); statement.execute(); } catch (SQLException exception) { exception.printStackTrace(); } } - @Override - public boolean isDone() { - return isDone; - } - - @Override - public List getPages() { - return mineQuestObject.getPages(); - } - @Override public TagResolver getTagResolvers() { return TagResolver.resolver( Placeholder.unparsed("block", mineQuestObject.getMaterial().name()), - Placeholder.parsed("mined", mined == mineQuestObject.getAmount() ? - "" + mined + "" : "" + mined + ""), - Placeholder.parsed("total_to_mine", String.valueOf(mineQuestObject.getAmount())), - Placeholder.parsed("turned_in", turnedIn == mineQuestObject.getAmount() ? - "" + turnedIn + "" : "" + turnedIn + ""), - Placeholder.parsed("total_to_turn_in", String.valueOf(mineQuestObject.getAmount())) + Placeholder.parsed("step_1_progress", getStep1() == mineQuestObject.getAmount() ? + "" + getStep1() + "" : "" + getStep1() + ""), + Placeholder.parsed("step_1_total", String.valueOf(mineQuestObject.getAmount())), + Placeholder.parsed("step_2_progress", getStep2() == mineQuestObject.getAmount() ? + "" + getStep2() + "" : "" + getStep2() + ""), + Placeholder.parsed("step_2_total", String.valueOf(mineQuestObject.getAmount())) ); } @Override public int turnIn(Player player) { PlayerInventory inventory = player.getInventory(); - int maxToTurnIn = Math.min(mineQuestObject.getAmount() - turnedIn, mined); + int maxToTurnIn = getMaxToTurnIn(); if (maxToTurnIn == 0) return 0; @@ -118,22 +119,20 @@ public class MineQuest extends Quest { } }); int totalTurnedIn = maxToTurnIn - ref.tmpAmount; - turnedIn += totalTurnedIn; + addStep2(totalTurnedIn); checkDone(player); return totalTurnedIn; } - public void mine(Block block) { - if (isDone || mined == mineQuestObject.getAmount() || !block.getType().equals(mineQuestObject.getMaterial())) - return; - mined += 1; + @Override + public Component getDisplayName() { + return MiniMessage.miniMessage().deserialize(QuestsConfig.MINE_QUEST_NAME); } - public void checkDone(Player player) { - if (turnedIn == mineQuestObject.getAmount() && mined == mineQuestObject.getAmount()) { - isDone = true; - QuestCompleteEvent event = new QuestCompleteEvent(player, this, true); - event.callEvent(); - } + public void mine(Block block) { + if (isDone() || !block.getType().equals(mineQuestObject.getMaterial())) + return; + addStep1(1); + checkDone(); } } diff --git a/src/main/java/com/alttd/altitudequests/objects/variants/MineQuestObject.java b/src/main/java/com/alttd/altitudequests/objects/variants/MineQuestObject.java new file mode 100644 index 0000000..9bdcf2f --- /dev/null +++ b/src/main/java/com/alttd/altitudequests/objects/variants/MineQuestObject.java @@ -0,0 +1,21 @@ +package com.alttd.altitudequests.objects.variants; + +import com.alttd.altitudequests.objects.Variant; +import org.bukkit.Material; + +import java.util.List; + +public class MineQuestObject extends Variant { + + private final Material material; + + public MineQuestObject(String internalName, String name, Material material, int amount, + List questPages, List donePages) { + super(internalName, name, amount, questPages, donePages); + this.material = material; + } + + public Material getMaterial() { + return material; + } +} diff --git a/src/main/java/com/alttd/altitudequests/util/BookOpener.java b/src/main/java/com/alttd/altitudequests/util/BookOpener.java new file mode 100644 index 0000000..89d6a98 --- /dev/null +++ b/src/main/java/com/alttd/altitudequests/util/BookOpener.java @@ -0,0 +1,53 @@ +package com.alttd.altitudequests.util; + +import com.alttd.altitudequests.config.Config; +import com.alttd.altitudequests.objects.Quest; +import net.kyori.adventure.inventory.Book; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class BookOpener { + + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + + public static void openBook(Player player) { + player.openBook(getBook(player)); + } + + private static Book getBook (Player player) { + return Book.builder() + .author(miniMessage.deserialize(Config.QUEST_BOOK_AUTHOR)) + .title(miniMessage.deserialize(Config.QUEST_BOOK_TITLE)) + .pages(getPages(player)) + .build(); + } + + private static final Component error = MiniMessage.miniMessage().deserialize("Error retrieving quest data"); + private static List getPages(Player player) { + Quest dailyQuest = Quest.getDailyQuest(player.getUniqueId()); + if (dailyQuest == null) + return List.of(error); + TagResolver tagResolver = TagResolver.resolver( + TagResolver.resolver(Placeholder.component("player", player.name())), + TagResolver.resolver(Placeholder.component("quest", dailyQuest.getDisplayName())), + TagResolver.resolver(Placeholder.component("variant", dailyQuest.getVariant().getName())), + dailyQuest.getTagResolvers() + ); + //TODO add weekly quest? + List pages = new ArrayList<>(Config.QUEST_PAGES); + if (dailyQuest.isDone()) + pages.addAll(dailyQuest.getDonePages()); + else + pages.addAll(dailyQuest.getQuestPages()); + return (pages.stream() + .map(page -> miniMessage.deserialize(page, tagResolver)) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/com/alttd/altitudequests/util/Utilities.java b/src/main/java/com/alttd/altitudequests/util/Utilities.java index 95ceb44..d284f7a 100644 --- a/src/main/java/com/alttd/altitudequests/util/Utilities.java +++ b/src/main/java/com/alttd/altitudequests/util/Utilities.java @@ -1,5 +1,7 @@ package com.alttd.altitudequests.util; +import java.util.Calendar; +import java.util.Date; import java.util.Random; public class Utilities { @@ -13,4 +15,10 @@ public class Utilities { return 0; return new Random().nextInt(0, max - 1); } + + public static int getYearDay() { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + return (calendar.get(Calendar.YEAR) * 1000) + calendar.get(Calendar.DAY_OF_YEAR); + } }