Big commit, made mining quests work and use data lock to sync for when we add db
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
package com.alttd.altitudequests.objects;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Material;
|
||||
|
||||
import java.util.List;
|
||||
@@ -11,9 +10,9 @@ public class MineQuestObject {
|
||||
String name;
|
||||
Material material;
|
||||
int amount;
|
||||
List<Component> pages;
|
||||
List<String> pages;
|
||||
|
||||
public MineQuestObject(String internalName, String name, Material material, int amount, List<Component> pages) {
|
||||
public MineQuestObject(String internalName, String name, Material material, int amount, List<String> pages) {
|
||||
this.internalName = internalName;
|
||||
this.name = name;
|
||||
this.material = material;
|
||||
@@ -37,7 +36,7 @@ public class MineQuestObject {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public List<Component> getPages() {
|
||||
public List<String> getPages() {
|
||||
return pages;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +1,48 @@
|
||||
package com.alttd.altitudequests.objects;
|
||||
|
||||
import com.alttd.altitudequests.config.QuestsConfig;
|
||||
import com.alttd.altitudequests.AQuest;
|
||||
import com.alttd.altitudequests.config.Config;
|
||||
import com.alttd.altitudequests.objects.quests.MineQuest;
|
||||
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.minimessage.tag.resolver.TagResolver;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.*;
|
||||
|
||||
public abstract class Quest {
|
||||
|
||||
private static final HashMap<UUID, Quest> dailyQuests = new HashMap<>();
|
||||
private static Quest weeklyQuest = null;
|
||||
private static final String[] possibleQuests;
|
||||
private static final List<Class<? extends Quest>> possibleQuests = new ArrayList<>();
|
||||
|
||||
//TODO add all data every quest needs
|
||||
|
||||
static {
|
||||
possibleQuests = new String[]{"MineQuest"};
|
||||
}
|
||||
|
||||
public Quest() {
|
||||
possibleQuests.add(MineQuest.class);
|
||||
}
|
||||
|
||||
public static void createDailyQuest(Player player) {
|
||||
Random random = new Random();
|
||||
String questName = possibleQuests[random.nextInt(0, possibleQuests.length - 1)];
|
||||
Quest quest = null;
|
||||
switch (questName) {
|
||||
case "MineQuest" -> {
|
||||
quest = new MineQuest(QuestsConfig.MINE_QUESTS.get(random.nextInt(0, QuestsConfig.MINE_QUESTS.size() - 1)));
|
||||
}
|
||||
if (possibleQuests.size() == 0) {
|
||||
player.sendMiniMessage("<red>Unable to create quest, no quests in config</red>", null);
|
||||
return;
|
||||
}
|
||||
|
||||
Class<? extends Quest> questClass = possibleQuests.get(Utilities.randomOr0(possibleQuests.size() - 1));
|
||||
try {
|
||||
Constructor<? extends Quest> constructor = questClass.getDeclaredConstructor(UUID.class);
|
||||
dailyQuests.put(player.getUniqueId(), constructor.newInstance(player.getUniqueId()));
|
||||
} catch (InvocationTargetException | IllegalAccessException | InstantiationException | NoSuchMethodException e) {
|
||||
player.sendMiniMessage("<red>Unable to create quest, contact an admin</red>", null);
|
||||
e.printStackTrace();
|
||||
Logger.severe("% does not have a constructor with a UUID input or has improper access.", questClass.getName());
|
||||
}
|
||||
if (quest == null)
|
||||
return; //TODO error
|
||||
dailyQuests.put(player.getUniqueId(), quest);
|
||||
}
|
||||
|
||||
public static Quest getDailyQuest(UUID uuid) {
|
||||
@@ -48,5 +56,48 @@ public abstract class Quest {
|
||||
Quest.weeklyQuest = newQuest;
|
||||
}
|
||||
|
||||
private static HashSet<UUID> queriedUsers = new HashSet<>();
|
||||
public static void tryLoadDailyQuest(UUID uuid) { //TODO set up a way to listen to the response and load stuff
|
||||
if (queriedUsers.contains(uuid) || dailyQuests.containsKey(uuid))
|
||||
return;
|
||||
queriedUsers.add(uuid);
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
out.writeUTF("try-lock");
|
||||
out.writeUTF(uuid.toString());
|
||||
Bukkit.getServer().sendPluginMessage(AQuest.getInstance(),
|
||||
"aquest:player-data",
|
||||
out.toByteArray());
|
||||
if (Config.DEBUG)
|
||||
Logger.info("Send lock request for %", uuid.toString());
|
||||
}
|
||||
}.runTaskAsynchronously(AQuest.getInstance());
|
||||
}
|
||||
|
||||
public static void unloadUser(UUID uuid) {
|
||||
queriedUsers.remove(uuid);
|
||||
Quest quest = dailyQuests.remove(uuid);
|
||||
if (quest == null)
|
||||
return;
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
quest.save();
|
||||
}
|
||||
}.runTaskAsynchronously(AQuest.getInstance());
|
||||
}
|
||||
|
||||
protected abstract void save();
|
||||
|
||||
public abstract boolean isDone();
|
||||
|
||||
public abstract String getName();
|
||||
|
||||
public abstract List<String> getPages();
|
||||
|
||||
public abstract TagResolver getTagResolvers();
|
||||
|
||||
public abstract int turnIn(Player player);
|
||||
}
|
||||
|
||||
@@ -1,46 +1,139 @@
|
||||
package com.alttd.altitudequests.objects.quests;
|
||||
|
||||
import com.alttd.altitudequests.config.QuestsConfig;
|
||||
import com.alttd.altitudequests.database.Database;
|
||||
import com.alttd.altitudequests.objects.MineQuestObject;
|
||||
import com.alttd.altitudequests.objects.Quest;
|
||||
import com.alttd.altitudequests.objects.QuestCompleteEvent;
|
||||
import com.alttd.altitudequests.util.Utilities;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
public class MineQuest extends Quest {
|
||||
|
||||
int mined;
|
||||
int turnedIn;
|
||||
MineQuestObject mineQuestObject;
|
||||
boolean isDone = false;
|
||||
private final UUID uuid;
|
||||
private int mined;
|
||||
private int turnedIn;
|
||||
private final MineQuestObject mineQuestObject;
|
||||
private boolean isDone = false;
|
||||
|
||||
public MineQuest(MineQuestObject mineQuestObject) {
|
||||
public MineQuest(UUID uuid) {
|
||||
this.uuid = uuid;
|
||||
mined = 0;
|
||||
turnedIn = 0;
|
||||
this.mineQuestObject = mineQuestObject;
|
||||
this.mineQuestObject = QuestsConfig.MINE_QUESTS.get(Utilities.randomOr0(QuestsConfig.MINE_QUESTS.size() - 1));
|
||||
}
|
||||
|
||||
public MineQuest(int mined, int turnedIn, String internalName) {
|
||||
public MineQuest(int mined, int turnedIn, String variantInternalName, UUID uuid) {
|
||||
this.mined = mined;
|
||||
this.turnedIn = turnedIn;
|
||||
Optional<MineQuestObject> any = QuestsConfig.MINE_QUESTS.stream().filter(object -> internalName.equals(object.getInternalName())).findAny();
|
||||
if (any.isEmpty())
|
||||
this.uuid = uuid;
|
||||
Optional<MineQuestObject> any = QuestsConfig.MINE_QUESTS.stream().filter(object -> variantInternalName.equals(object.getInternalName())).findAny();
|
||||
if (any.isEmpty()) {
|
||||
this.mineQuestObject = null;
|
||||
return; //TODO error
|
||||
}
|
||||
this.mineQuestObject = any.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void save() {
|
||||
String sql = "INSERT INTO generic_quest_progress " +
|
||||
"(uuid, quest, quest_variant, step_1_progress, step_2_progress) " +
|
||||
"VALUES (?, ?, ?, ?) " +
|
||||
"ON DUPLICATE KEY UPDATE" +
|
||||
"quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?";
|
||||
try {
|
||||
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
|
||||
statement.setString(1, uuid.toString());
|
||||
statement.setString(2, getName());
|
||||
statement.setString(3, mineQuestObject.getInternalName());
|
||||
statement.setInt(4, mined);
|
||||
statement.setInt(5, turnedIn);
|
||||
statement.setString(6, getName());
|
||||
statement.setString(7, mineQuestObject.getInternalName());
|
||||
statement.setInt(8, mined);
|
||||
statement.setInt(9, turnedIn);
|
||||
} catch (SQLException exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDone() {
|
||||
return isDone;
|
||||
}
|
||||
|
||||
public void mine(Block block, Player player) {
|
||||
if (!isDone && !block.getType().equals(mineQuestObject.getMaterial()))
|
||||
@Override
|
||||
public String getName() {
|
||||
return "mining";
|
||||
}
|
||||
|
||||
@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()))
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int turnIn(Player player) {
|
||||
PlayerInventory inventory = player.getInventory();
|
||||
int maxToTurnIn = Math.min(mineQuestObject.getAmount() - turnedIn, mined);
|
||||
|
||||
if (maxToTurnIn == 0)
|
||||
return 0;
|
||||
var ref = new Object() {
|
||||
int tmpAmount = maxToTurnIn;
|
||||
};
|
||||
|
||||
Arrays.stream(inventory.getContents())
|
||||
.filter(Objects::nonNull)
|
||||
.filter(itemStack -> itemStack.getType().equals(mineQuestObject.getMaterial()))
|
||||
.forEach(itemStack -> {
|
||||
if (ref.tmpAmount == 0)
|
||||
return;
|
||||
if (itemStack.getAmount() > ref.tmpAmount) {
|
||||
itemStack.setAmount(itemStack.getAmount() - ref.tmpAmount);
|
||||
ref.tmpAmount = 0;
|
||||
} else {
|
||||
ref.tmpAmount -= itemStack.getAmount();
|
||||
itemStack.setAmount(0);
|
||||
}
|
||||
});
|
||||
int totalTurnedIn = maxToTurnIn - ref.tmpAmount;
|
||||
turnedIn += totalTurnedIn;
|
||||
checkDone(player);
|
||||
return totalTurnedIn;
|
||||
}
|
||||
|
||||
public void mine(Block block) {
|
||||
if (isDone || mined == mineQuestObject.getAmount() || !block.getType().equals(mineQuestObject.getMaterial()))
|
||||
return;
|
||||
mined += 1;
|
||||
if (mined == mineQuestObject.getAmount()) {
|
||||
}
|
||||
|
||||
public void checkDone(Player player) {
|
||||
if (turnedIn == mineQuestObject.getAmount() && mined == mineQuestObject.getAmount()) {
|
||||
isDone = true;
|
||||
QuestCompleteEvent event = new QuestCompleteEvent(player, this, true);
|
||||
event.callEvent();
|
||||
|
||||
Reference in New Issue
Block a user