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