Save and load quests from the database
This commit is contained in:
parent
063fc4061e
commit
e9bdb6a70d
|
|
@ -3,8 +3,10 @@ package com.alttd.altitudequests;
|
||||||
import com.alttd.altitudequests.commands.CommandManager;
|
import com.alttd.altitudequests.commands.CommandManager;
|
||||||
import com.alttd.altitudequests.config.*;
|
import com.alttd.altitudequests.config.*;
|
||||||
import com.alttd.altitudequests.events.*;
|
import com.alttd.altitudequests.events.*;
|
||||||
|
import com.alttd.altitudequests.objects.Quest;
|
||||||
import com.alttd.altitudequests.util.Logger;
|
import com.alttd.altitudequests.util.Logger;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
public final class AQuest extends JavaPlugin {
|
public final class AQuest extends JavaPlugin {
|
||||||
|
|
||||||
|
|
@ -24,6 +26,7 @@ public final class AQuest extends JavaPlugin {
|
||||||
reloadConfigs();
|
reloadConfigs();
|
||||||
registerEvents();
|
registerEvents();
|
||||||
new CommandManager();
|
new CommandManager();
|
||||||
|
scheduleTasks();
|
||||||
|
|
||||||
Logger.info("--------------------------------------------------");
|
Logger.info("--------------------------------------------------");
|
||||||
Logger.info("AQuest started");
|
Logger.info("AQuest started");
|
||||||
|
|
@ -52,4 +55,15 @@ public final class AQuest extends JavaPlugin {
|
||||||
getServer().getMessenger().registerOutgoingPluginChannel(this, "aquest:player-data");
|
getServer().getMessenger().registerOutgoingPluginChannel(this, "aquest:player-data");
|
||||||
getServer().getMessenger().registerIncomingPluginChannel(this, "aquest:player-data", new PluginMessageListener());
|
getServer().getMessenger().registerIncomingPluginChannel(this, "aquest:player-data", new PluginMessageListener());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void scheduleTasks() {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (Config.DEBUG)
|
||||||
|
Logger.info("Syncing users.");
|
||||||
|
Quest.saveAll();
|
||||||
|
}
|
||||||
|
}.runTaskTimerAsynchronously(getInstance(), 10 * 60 * 20L, 10 * 60 * 20L);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,11 +21,14 @@ public class Database {
|
||||||
|
|
||||||
public static Database getDatabase(){
|
public static Database getDatabase(){
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
|
{
|
||||||
instance = new Database();
|
instance = new Database();
|
||||||
|
instance.init();
|
||||||
|
}
|
||||||
return (instance);
|
return (instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
protected void init() {
|
||||||
try {
|
try {
|
||||||
openConnection();
|
openConnection();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import org.bukkit.Bukkit;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -18,14 +19,22 @@ public class LogoutEvent implements Listener {
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
UUID uuid = event.getPlayer().getUniqueId();
|
UUID uuid = event.getPlayer().getUniqueId();
|
||||||
|
|
||||||
if (Config.DEBUG)
|
new BukkitRunnable() {
|
||||||
Logger.info("Syncing %", event.getPlayer().getName());
|
@Override
|
||||||
Quest.unloadUser(uuid);
|
public void run() {
|
||||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
if (Config.DEBUG)
|
||||||
out.writeUTF("try-unlock");
|
Logger.info("Syncing %", event.getPlayer().getName());
|
||||||
out.writeUTF(uuid.toString());
|
Quest dailyQuest = Quest.getDailyQuest(uuid);
|
||||||
Bukkit.getServer().sendPluginMessage(AQuest.getInstance(),
|
if (dailyQuest != null)
|
||||||
"aquest:player-data",
|
dailyQuest.save();
|
||||||
out.toByteArray());
|
Quest.unloadUser(uuid);
|
||||||
|
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||||
|
out.writeUTF("try-unlock");
|
||||||
|
out.writeUTF(uuid.toString());
|
||||||
|
Bukkit.getServer().sendPluginMessage(AQuest.getInstance(),
|
||||||
|
"aquest:player-data",
|
||||||
|
out.toByteArray());
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(AQuest.getInstance());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.alttd.altitudequests.events;
|
||||||
|
|
||||||
import com.alttd.altitudequests.AQuest;
|
import com.alttd.altitudequests.AQuest;
|
||||||
import com.alttd.altitudequests.config.Config;
|
import com.alttd.altitudequests.config.Config;
|
||||||
|
import com.alttd.altitudequests.database.Database;
|
||||||
import com.alttd.altitudequests.objects.Quest;
|
import com.alttd.altitudequests.objects.Quest;
|
||||||
import com.alttd.altitudequests.util.Logger;
|
import com.alttd.altitudequests.util.Logger;
|
||||||
import com.google.common.io.ByteArrayDataInput;
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
|
|
@ -11,6 +12,9 @@ import org.bukkit.entity.Player;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener {
|
public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener {
|
||||||
|
|
@ -61,9 +65,27 @@ public class PluginMessageListener implements org.bukkit.plugin.messaging.Plugin
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
//TODO load user from database
|
String sql = "SELECT * FROM generic_quest_progress WHERE uuid = ?";
|
||||||
//TODO if no quest in database create one
|
try {
|
||||||
System.out.println("creating quest");
|
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
|
ResultSet resultSet = statement.executeQuery();
|
||||||
|
if (resultSet.next()) {
|
||||||
|
Quest.loadDailyQuest(
|
||||||
|
resultSet.getString("quest"),
|
||||||
|
resultSet.getString("quest_variant"),
|
||||||
|
resultSet.getInt("step_1_progress"),
|
||||||
|
resultSet.getInt("step_2_progress"),
|
||||||
|
uuid);
|
||||||
|
if (Config.DEBUG)
|
||||||
|
Logger.info("Loading daily quest for %", uuid.toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (SQLException exception) {
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
if (Config.DEBUG)
|
||||||
|
Logger.info("Creating new daily quest for %", uuid.toString());
|
||||||
Quest.createDailyQuest(Bukkit.getPlayer(uuid));
|
Quest.createDailyQuest(Bukkit.getPlayer(uuid));
|
||||||
}
|
}
|
||||||
}.runTaskAsynchronously(AQuest.getInstance());
|
}.runTaskAsynchronously(AQuest.getInstance());
|
||||||
|
|
|
||||||
|
|
@ -89,12 +89,33 @@ public abstract class Quest {
|
||||||
}.runTaskAsynchronously(AQuest.getInstance());
|
}.runTaskAsynchronously(AQuest.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void save();
|
public static void saveAll() {
|
||||||
|
for (Quest quest : dailyQuests.values()) {
|
||||||
|
quest.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void 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;
|
||||||
|
}
|
||||||
|
Class<? extends Quest> aClass = any.get();
|
||||||
|
Constructor<? extends Quest> constructor;
|
||||||
|
try {
|
||||||
|
constructor = aClass.getConstructor(String.class, int.class, int.class, UUID.class);
|
||||||
|
Quest quest1 = constructor.newInstance(quest_variant, step_1_progress, step_2_progress, uuid);
|
||||||
|
dailyQuests.put(uuid, quest1);
|
||||||
|
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void save();
|
||||||
|
|
||||||
public abstract boolean isDone();
|
public abstract boolean isDone();
|
||||||
|
|
||||||
public abstract String getName();
|
|
||||||
|
|
||||||
public abstract List<String> getPages();
|
public abstract List<String> getPages();
|
||||||
|
|
||||||
public abstract TagResolver getTagResolvers();
|
public abstract TagResolver getTagResolvers();
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@ import com.alttd.altitudequests.database.Database;
|
||||||
import com.alttd.altitudequests.objects.MineQuestObject;
|
import com.alttd.altitudequests.objects.MineQuestObject;
|
||||||
import com.alttd.altitudequests.objects.Quest;
|
import com.alttd.altitudequests.objects.Quest;
|
||||||
import com.alttd.altitudequests.objects.QuestCompleteEvent;
|
import com.alttd.altitudequests.objects.QuestCompleteEvent;
|
||||||
|
import com.alttd.altitudequests.util.Logger;
|
||||||
import com.alttd.altitudequests.util.Utilities;
|
import com.alttd.altitudequests.util.Utilities;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
|
|
@ -32,36 +32,38 @@ public class MineQuest extends Quest {
|
||||||
this.mineQuestObject = QuestsConfig.MINE_QUESTS.get(Utilities.randomOr0(QuestsConfig.MINE_QUESTS.size() - 1));
|
this.mineQuestObject = QuestsConfig.MINE_QUESTS.get(Utilities.randomOr0(QuestsConfig.MINE_QUESTS.size() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
public MineQuest(int mined, int turnedIn, String variantInternalName, UUID uuid) {
|
public MineQuest(String variantInternalName, int mined, int turnedIn, UUID uuid) {
|
||||||
this.mined = mined;
|
this.mined = mined;
|
||||||
this.turnedIn = turnedIn;
|
this.turnedIn = turnedIn;
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
Optional<MineQuestObject> any = QuestsConfig.MINE_QUESTS.stream().filter(object -> variantInternalName.equals(object.getInternalName())).findAny();
|
Optional<MineQuestObject> any = QuestsConfig.MINE_QUESTS.stream().filter(object -> variantInternalName.equals(object.getInternalName())).findAny();
|
||||||
if (any.isEmpty()) {
|
if (any.isEmpty()) {
|
||||||
this.mineQuestObject = null;
|
this.mineQuestObject = null;
|
||||||
|
Logger.warning("Tried to create MineQuest but unable to find variant: %.", variantInternalName);
|
||||||
return; //TODO error
|
return; //TODO error
|
||||||
}
|
}
|
||||||
this.mineQuestObject = any.get();
|
this.mineQuestObject = any.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void save() {
|
public void save() {
|
||||||
String sql = "INSERT INTO generic_quest_progress " +
|
String sql = "INSERT INTO generic_quest_progress " +
|
||||||
"(uuid, quest, quest_variant, step_1_progress, step_2_progress) " +
|
"(uuid, quest, quest_variant, step_1_progress, step_2_progress) " +
|
||||||
"VALUES (?, ?, ?, ?) " +
|
"VALUES (?, ?, ?, ?, ?) " +
|
||||||
"ON DUPLICATE KEY UPDATE" +
|
"ON DUPLICATE KEY UPDATE " +
|
||||||
"quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?";
|
"quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?";
|
||||||
try {
|
try {
|
||||||
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
|
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
|
||||||
statement.setString(1, uuid.toString());
|
statement.setString(1, uuid.toString());
|
||||||
statement.setString(2, getName());
|
statement.setString(2, MineQuest.class.getSimpleName());
|
||||||
statement.setString(3, mineQuestObject.getInternalName());
|
statement.setString(3, mineQuestObject.getInternalName());
|
||||||
statement.setInt(4, mined);
|
statement.setInt(4, mined);
|
||||||
statement.setInt(5, turnedIn);
|
statement.setInt(5, turnedIn);
|
||||||
statement.setString(6, getName());
|
statement.setString(6, MineQuest.class.getSimpleName());
|
||||||
statement.setString(7, mineQuestObject.getInternalName());
|
statement.setString(7, mineQuestObject.getInternalName());
|
||||||
statement.setInt(8, mined);
|
statement.setInt(8, mined);
|
||||||
statement.setInt(9, turnedIn);
|
statement.setInt(9, turnedIn);
|
||||||
|
statement.execute();
|
||||||
} catch (SQLException exception) {
|
} catch (SQLException exception) {
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
@ -72,11 +74,6 @@ public class MineQuest extends Quest {
|
||||||
return isDone;
|
return isDone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return "mining";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getPages() {
|
public List<String> getPages() {
|
||||||
return mineQuestObject.getPages();
|
return mineQuestObject.getPages();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user