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:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user