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
This commit is contained in:
parent
e9bdb6a70d
commit
39900153d8
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]))
|
||||
|
|
|
|||
|
|
@ -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("<red>Unable to create quest <quest> of variant <variant>.</red>",
|
||||
TagResolver.resolver(Placeholder.parsed("quest", args[2]),
|
||||
Placeholder.parsed("variant", args[3])));
|
||||
commandSender.sendMiniMessage("<green>Created quest <quest> of variant <variant>.</green>",
|
||||
TagResolver.resolver(Placeholder.parsed("quest", args[2]),
|
||||
Placeholder.parsed("variant", args[3])));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "setquest";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabComplete(CommandSender commandSender, String[] args) {
|
||||
List<String> 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,17 @@ public final class Config extends AbstractConfig {
|
|||
|
||||
public static String QUEST_BOOK_AUTHOR = "<magenta>Scruff</magenta>";
|
||||
public static String QUEST_BOOK_TITLE = "<green>Quest Title</green>";
|
||||
public static List<String> QUEST_PAGES = List.of("Example");
|
||||
public static List<String> QUEST_PAGES = List.of("""
|
||||
<bold><gold>Hey <player></gold></bold>
|
||||
|
||||
Here is a quick summary of your quest progress so far!
|
||||
* Quest: <quest>
|
||||
* Variant: <variant>
|
||||
* Items obtained: <step_1_progress>/<step_1_total>
|
||||
* Items turned in: <step_2_progress>/<step_2_total>
|
||||
|
||||
<click:run_command:/aquest turnin><gold>Click here to turn in more items</gold></click>
|
||||
""");
|
||||
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 = "<red>You are too far from Scruff";//TODO replace scruff with <npc>?
|
||||
public static String DAILY_ALREADY_DONE = "<red>You already completed your daily quest";
|
||||
public static String RESETTING_QUESTS = "<white>[<gold>Mascot</gold>] <light_purple>Scruff</light_purple><gray>:</gray> <green>Thank you everyone that completed their daily quest! I will be handing out new ones now so come visit me at <gold>/spawn</gold>!</green></white>";
|
||||
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() {
|
||||
|
|
|
|||
|
|
@ -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<MineQuestObject> MINE_QUESTS = new ArrayList<>();
|
||||
public static String MINE_QUEST_NAME = "<green>Mine quest</green>";
|
||||
|
||||
private static void loadMineQuests() {
|
||||
MINE_QUESTS.clear();
|
||||
|
|
@ -35,13 +36,13 @@ public class QuestsConfig extends AbstractConfig {
|
|||
Set<String> 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<String> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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, " +
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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<UUID> 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("<red>Error retrieving quest data</red>");
|
||||
private List<Component> 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<Component> pages = dailyQuest.getPages().stream()
|
||||
.map(page -> miniMessage.deserialize(page, tagResolver))
|
||||
.collect(Collectors.toList());
|
||||
return (pages);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String> pages;
|
||||
|
||||
public MineQuestObject(String internalName, String name, Material material, int amount, List<String> 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<String> getPages() {
|
||||
return pages;
|
||||
}
|
||||
}
|
||||
|
|
@ -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("<red>Unable to create quest, no quests in config</red>", 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<Class<? extends Quest>> any = possibleQuests.stream().filter(q -> q.getSimpleName().equals(quest)).findAny();
|
||||
if (any.isEmpty()) {
|
||||
//TODO error
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
Class<? extends Quest> aClass = any.get();
|
||||
Constructor<? extends Quest> 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<String> 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<String> getPages();
|
||||
|
||||
public abstract TagResolver getTagResolvers();
|
||||
|
||||
public abstract int turnIn(Player player);
|
||||
|
||||
public abstract Component getDisplayName();
|
||||
|
||||
public List<String> getQuestPages() {
|
||||
return variant.getQuestPages();
|
||||
}
|
||||
|
||||
public List<String> 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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
43
src/main/java/com/alttd/altitudequests/objects/Variant.java
Normal file
43
src/main/java/com/alttd/altitudequests/objects/Variant.java
Normal file
|
|
@ -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<String> questPages;
|
||||
private final List<String> donePages;
|
||||
|
||||
public Variant(String internalName, String name, int amount, List<String> questPages, List<String> 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<String> getQuestPages() {
|
||||
return questPages;
|
||||
}
|
||||
|
||||
public List<String> getDonePages() {
|
||||
return donePages;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<MineQuestObject> 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<String> getPages() {
|
||||
return mineQuestObject.getPages();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TagResolver getTagResolvers() {
|
||||
return TagResolver.resolver(
|
||||
Placeholder.unparsed("block", mineQuestObject.getMaterial().name()),
|
||||
Placeholder.parsed("mined", mined == mineQuestObject.getAmount() ?
|
||||
"<green>" + mined + "</green>" : "<red>" + mined + "</red>"),
|
||||
Placeholder.parsed("total_to_mine", String.valueOf(mineQuestObject.getAmount())),
|
||||
Placeholder.parsed("turned_in", turnedIn == mineQuestObject.getAmount() ?
|
||||
"<green>" + turnedIn + "</green>" : "<red>" + turnedIn + "</red>"),
|
||||
Placeholder.parsed("total_to_turn_in", String.valueOf(mineQuestObject.getAmount()))
|
||||
Placeholder.parsed("step_1_progress", getStep1() == mineQuestObject.getAmount() ?
|
||||
"<green>" + getStep1() + "</green>" : "<red>" + getStep1() + "</red>"),
|
||||
Placeholder.parsed("step_1_total", String.valueOf(mineQuestObject.getAmount())),
|
||||
Placeholder.parsed("step_2_progress", getStep2() == mineQuestObject.getAmount() ?
|
||||
"<green>" + getStep2() + "</green>" : "<red>" + getStep2() + "</red>"),
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<String> questPages, List<String> donePages) {
|
||||
super(internalName, name, amount, questPages, donePages);
|
||||
this.material = material;
|
||||
}
|
||||
|
||||
public Material getMaterial() {
|
||||
return material;
|
||||
}
|
||||
}
|
||||
53
src/main/java/com/alttd/altitudequests/util/BookOpener.java
Normal file
53
src/main/java/com/alttd/altitudequests/util/BookOpener.java
Normal file
|
|
@ -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("<red>Error retrieving quest data</red>");
|
||||
private static List<Component> 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<String> 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()));
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user