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:
Teriuihi 2022-06-02 22:12:29 +02:00
parent e9bdb6a70d
commit 39900153d8
17 changed files with 389 additions and 163 deletions

View File

@ -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
}
}

View File

@ -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]))

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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() {

View File

@ -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);
}
}

View File

@ -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, " +

View File

@ -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");

View File

@ -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"),

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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());
}
}

View 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;
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View 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()));
}
}

View File

@ -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);
}
}