测试版

This commit is contained in:
yaohunya 2024-07-31 06:12:01 +08:00
parent afbec49935
commit fafccd1e95
14 changed files with 1015 additions and 5 deletions

View File

@ -22,9 +22,9 @@
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>spigot</artifactId> <artifactId>gson</artifactId>
<version>1.18.2</version> <version>2.8.8</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,19 +1,174 @@
package com.yaohun.questsystem; package com.yaohun.questsystem;
import com.yaohun.questsystem.api.QuestAPI;
import com.yaohun.questsystem.data.PlayerData;
import com.yaohun.questsystem.data.QuestData;
import com.yaohun.questsystem.data.database.SqlManager;
import com.yaohun.questsystem.listener.JoinEvent;
import com.yaohun.questsystem.manage.DataManage;
import com.yaohun.questsystem.util.SqlUtil;
import com.yaohun.questsystem.util.TimeType;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.List;
public class Main extends JavaPlugin { public class Main extends JavaPlugin {
public static Main plugin; public static Main plugin;
public static DataManage dataManage;
public static SqlManager sqlManager;
public static SqlUtil sqlUtil;
@Override @Override
public void onEnable() { public void onEnable() {
plugin = this; plugin = this;
DemonAPI.sendConsoleMessage("§f[§6!§f] §aQuestSystem (1.0) §f开始加载");
LinkMySqlData();
saveDefaultConfig();
dataManage = new DataManage();
for (Player player : Bukkit.getOnlinePlayers()){
Main.dataManage.loadPlayerData(player);
}
getServer().getPluginManager().registerEvents(new JoinEvent(),this);
DemonAPI.sendConsoleMessage("§f[§6!§f] §aQuestSystem §f加载完成,祝你使用愉快!");
DemonAPI.sendConsoleMessage("§f[§6!§f] §b极光像素工作室出品");
}
public void LinkMySqlData(){
String SQL_Host = "gz-cdb-r9koldtt.sql.tencentcdb.com";
String SQL_Port = "29320";
String SQL_Users = "root";
String SQL_Password = "Pixel@123456";
String SQL_Database = "quest";
sqlManager = new SqlManager();
sqlUtil = new SqlUtil(SQL_Host,SQL_Port,SQL_Database,SQL_Users,SQL_Password);
sqlManager.createTable();
} }
@Override @Override
public void onDisable() { public void onDisable() {
super.onDisable(); for (Player player : Bukkit.getOnlinePlayers()){
dataManage.savePlayerData(player);
}
DemonAPI.sendConsoleMessage("§f[§c!§f] §aQuestSystem §f卸载完成,欢迎下次使用!");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String Command, String[] args) {
if (Command.equalsIgnoreCase("questinfo") && sender instanceof Player player) {
sender.sendMessage("§f[§e!§f]§7查询玩家: "+player.getName());
sender.sendMessage("§f[§e!§f]§7任务数据:");
PlayerData data = dataManage.getPlayerData(player);
List<QuestData> everydayList = QuestAPI.getPlayerQuestList(player, TimeType.EVERYDAY);
for (QuestData quest : everydayList){
sender.sendMessage(" [每日] §b"+quest.getQuestKey()+" §f进度: §c"+data.getQuestAmount(quest)+"§f/§a"+quest.getNeedAmount());
}
List<QuestData> weeklyList = QuestAPI.getPlayerQuestList(player, TimeType.WEEKLY);
for (QuestData quest : weeklyList){
sender.sendMessage(" [每周] §b"+quest.getQuestKey()+" §f进度: §c"+data.getQuestAmount(quest)+"§f/§a"+quest.getNeedAmount());
}
List<QuestData> longTermList = QuestAPI.getPlayerQuestList(player, TimeType.LONGTERM);
for (QuestData quest : longTermList){
sender.sendMessage(" [长期] §b"+quest.getQuestKey()+" §f进度: §c"+data.getQuestAmount(quest)+"§f/§a"+quest.getNeedAmount());
}
}
if (Command.equalsIgnoreCase("quest")) {
Player player = (Player) sender;
if(args.length == 1 && args[0].equalsIgnoreCase("save")) {
if (dataManage.getPlayerData(player) != null) {
dataManage.savePlayerData(player);
}
DemonAPI.sendMessage(sender,"数据已保存至数据库.");
}
/*if(args.length == 2 && args[0].equalsIgnoreCase("js")) {
String questKey = args[1];
// 判断这个任务是否存在
QuestData questData = dataManage.getQuestData(questKey);
if(questData == null){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 不存在");
return true;
}
PlayerData playerData = dataManage.getPlayerData(player);
// 判断玩家是否已接受任务
if(playerData.isAcceptQuest(questData)){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 已接受");
return true;
}
// 判断玩家是否已完成任务
if(playerData.isFinished(questData)){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 已完成");
return true;
}
playerData.acceptQuest(questData);
DemonAPI.sendMessage(sender,"任务: "+questKey+" 已接受");
}
if(args.length == 2 && args[0].equalsIgnoreCase("add")) {
String questKey = args[1];
// 判断这个任务是否存在
QuestData questData = dataManage.getQuestData(questKey);
if(questData == null){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 不存在");
return true;
}
PlayerData playerData = dataManage.getPlayerData(player);
// 判断玩家是否已接受任务
if(!playerData.isAcceptQuest(questData)){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 未接受");
return true;
}
playerData.addQuestAmount(questData);
DemonAPI.sendMessage(sender,"任务: "+questKey+" 当前进度: "+playerData.getQuestAmount(questData)+"/"+questData.getNeedAmount()+"["+(playerData.getProgress(questData) * 100)+"%]");
}
if(args.length == 3 && args[0].equalsIgnoreCase("add")) {
String questKey = args[1];
// 判断这个任务是否存在
QuestData questData = dataManage.getQuestData(questKey);
if(questData == null){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 不存在");
return true;
}
PlayerData playerData = dataManage.getPlayerData(player);
// 判断玩家是否已接受任务
if(!playerData.isAcceptQuest(questData)){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 未接受");
return true;
}
int amount = Integer.parseInt(args[2]);
playerData.addQuestAmount(questData,amount);
DemonAPI.sendMessage(sender,"任务: "+questKey+" 当前进度: "+playerData.getQuestAmount(questData)+"/"+questData.getNeedAmount()+"["+(playerData.getProgress(questData) * 100)+"%]");
}
if(args.length == 2 && args[0].equalsIgnoreCase("tj")) {
String questKey = args[1];
// 判断这个任务是否存在
QuestData questData = dataManage.getQuestData(questKey);
if(questData == null){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 不存在");
return true;
}
PlayerData playerData = dataManage.getPlayerData(player);
// 判断玩家是否已接受任务
if(!playerData.isAcceptQuest(questData)){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 未接受");
return true;
}
// 判断玩家是否已完成任务
if(playerData.isFinished(questData)){
DemonAPI.sendMessage(sender,"任务: "+questKey+" 已完成");
return true;
}
if (!playerData.canSubmitQuest(questData)) {
DemonAPI.sendMessage(sender,"任务: "+questKey+" 任务尚未完成");
return true;
}
playerData.submitQuest(questData);
DemonAPI.sendMessage(sender,"任务: "+questKey+" 已提交");
}*/
}
return true;
} }
} }

View File

@ -0,0 +1,152 @@
package com.yaohun.questsystem.api;
import com.yaohun.questsystem.Main;
import com.yaohun.questsystem.data.PlayerData;
import com.yaohun.questsystem.data.QuestData;
import com.yaohun.questsystem.manage.DataManage;
import com.yaohun.questsystem.util.TimeType;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class QuestAPI {
public static PlayerData getPlayerData(Player p){
DataManage dataManage = Main.dataManage;
PlayerData playerData = dataManage.getPlayerData(p);
if(playerData == null){
return null;
}
return playerData;
}
/*
* 获取玩家的任务列表
* */
public static Set<QuestData> getPlayerQuestList(Player p){
PlayerData data = Main.dataManage.getPlayerData(p);
return data.getQuests();
}
/*
* 获取玩家已接受任务 指定周期任务列表
* */
public static List<QuestData> getPlayerQuestList(Player p, TimeType timeType) {
List<QuestData> questDataList = new ArrayList<>();
PlayerData data = Main.dataManage.getPlayerData(p);
for (QuestData questData : data.getQuests()){
if(questData.getTimeType() == timeType){
questDataList.add(questData);
}
}
return questDataList;
}
/*
* 获取指定任务信息数据
* */
public static QuestData getQuestData(String questKey){
QuestData quest = Main.dataManage.getQuestData(questKey);
if(quest == null){
System.out.println("[错误 - 任务] 任务: "+questKey+" 配置文件不存在.");
return null;
}
return quest;
}
/*
* 增加任务进度
* */
public static void addQuestProgress(Player p,String questKey,int amount){
QuestData quest = Main.dataManage.getQuestData(questKey);
if(quest == null){
System.out.println("[错误 - 任务] 任务: "+questKey+" 配置文件不存在.");
return;
}
PlayerData data = Main.dataManage.getPlayerData(p);
data.addQuestAmount(quest,amount);
}
/*
* 设置任务进度
* */
public static void setQuestProgress(Player p,String questKey,int amount){
QuestData quest = Main.dataManage.getQuestData(questKey);
if(quest == null){
System.out.println("[错误 - 任务] 任务: "+questKey+" 配置文件不存在.");
return;
}
PlayerData data = Main.dataManage.getPlayerData(p);
data.setQuestAmount(quest,amount);
}
/*
* 强制完成任务进度
* */
public static void forceCompleteQuest(Player p,String questKey){
QuestData quest = Main.dataManage.getQuestData(questKey);
if(quest == null){
System.out.println("[错误 - 任务] 任务: "+questKey+" 配置文件不存在.");
return;
}
PlayerData data = Main.dataManage.getPlayerData(p);
data.setQuestAmount(quest,-1);
}
/*
* 强制完成任务进度并触发奖励
* */
public static void forceCompleteQuestFinish(Player p,String questKey,boolean finish){
QuestData quest = Main.dataManage.getQuestData(questKey);
if(quest == null){
System.out.println("[错误 - 任务] 任务: "+questKey+" 配置文件不存在.");
return;
}
PlayerData data = Main.dataManage.getPlayerData(p);
data.setQuestAmount(quest,-1);
if(finish){
quest.sendFinishCommand(p);
}
}
/*
* 重置任务进度(若已完成也会返回0%)
* */
public static void resetCompleteQuest(Player p,String questKey){
QuestData quest = Main.dataManage.getQuestData(questKey);
if(quest == null){
System.out.println("[错误 - 任务] 任务: "+questKey+" 配置文件不存在.");
return;
}
PlayerData data = Main.dataManage.getPlayerData(p);
data.setQuestAmount(quest,0);
}
/*
* 删除任务
* */
public static void deletePlayerDataQuest(Player p,String questKey){
QuestData quest = Main.dataManage.getQuestData(questKey);
if(quest == null){
System.out.println("[错误 - 任务] 任务: "+questKey+" 配置文件不存在.");
return;
}
PlayerData data = Main.dataManage.getPlayerData(p);
HashMap<QuestData, Integer> hashMap = data.getQuestAmount();
hashMap.remove(quest);
data.setQuestMap(hashMap);
}
/*
* 删除所有任务
* */
public static void deleteAllPlayerDataQuest(Player p){
PlayerData data = Main.dataManage.getPlayerData(p);
HashMap<QuestData, Integer> hashMap = new HashMap<>();
data.setQuestMap(hashMap);
}
}

View File

@ -0,0 +1,179 @@
package com.yaohun.questsystem.data;
import org.bukkit.Bukkit;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class PlayerData {
private String name; // 玩家名字
private HashMap<QuestData,Integer> questAmount;
public PlayerData(String name){
this.name = name;
this.questAmount = new HashMap<>();
}
public PlayerData(String name,HashMap<QuestData,Integer> hashMap){
this.name = name;
this.questAmount = hashMap;
for (QuestData quest : hashMap.keySet()){
System.out.println("[调试 - 输出] 任务名: "+quest.getQuestKey()+" 进度: "+getQuestAmount(quest)+"/"+quest.getNeedAmount());
}
}
public String getName() {
return name;
}
public HashMap<QuestData, Integer> getQuestAmount() {
return questAmount;
}
public void setQuestMap(HashMap<QuestData, Integer> questMap) {
this.questAmount = questMap;
}
public Set<QuestData> getQuests() {
return this.questAmount.keySet();
}
// 获取玩家已完成任务数量
public int getFinishedAmount(){
int i = 0;
for (QuestData quest : getQuests()){
if(isFinished(quest)){
i++;
}
}
return i;
}
/*
* 接受任务
* */
public void acceptQuest(QuestData quest){
if(!isAcceptQuest(quest)){
this.questAmount.put(quest,0);
}
}
/*
* 判断任务是否已接受
* */
public boolean isAcceptQuest(QuestData quest){
if(this.questAmount.get(quest) == null){
return false;
}
return true;
}
/*
* 判断任务是否已完成
* */
public boolean isFinished(QuestData quest) {
// 判断任务是否已接受
if(isAcceptQuest(quest)){
// 判断任务是否已提交
if(this.questAmount.get(quest) <= -1){
return true;
}
}
return false;
}
/*
* 提交任务
* */
public void submitQuest(QuestData quest) {
// 提交任务后触发命令
quest.sendFinishCommand(Bukkit.getPlayer(this.name));
// 设置任务提交后的状态为 -1
this.questAmount.put(quest, -1);
}
/*
* 判断玩家是否达到要求可提交任务
* */
public boolean canSubmitQuest(QuestData quest) {
// 判断玩家是否接受任务
if (isAcceptQuest(quest)) {
// 判断玩家是否已达到任务要求数量
int amount = this.questAmount.get(quest);
if(amount >= quest.getNeedAmount()){
return true;
}
}
return false;
}
/*
* 获取玩家当前任务进度
* */
public int getQuestAmount(QuestData quest){
if(this.questAmount.get(quest) == null){
return 0;
}
return this.questAmount.get(quest);
}
/*增加任务进度*/
public void addQuestAmount(QuestData quest){
addQuestAmount(quest,1);
}
/*增加任务进度*/
public void addQuestAmount(QuestData quest, int addAmount) {
// 若玩家未接受任务直接返回
if (!isAcceptQuest(quest)) {
return;
}
// 当玩家当前任务进度为0时直接返回
int amount = this.questAmount.getOrDefault(quest, 0);
if (amount <= -1) {
return;
}
int new_amount = amount + addAmount;
int quest_amount = quest.getNeedAmount();
if (new_amount > quest_amount) {
int need_Amount = quest_amount - amount; // 得出 玩家还需要多少积分完成任务
amount = amount + need_Amount;
this.questAmount.put(quest, amount);
return;
}
this.questAmount.put(quest, new_amount);
}
/*设置任务进度*/
public void setQuestAmount(QuestData quest, int amount) {
// 若玩家未接受任务直接返回
if (!isAcceptQuest(quest)) {
return;
}
this.questAmount.put(quest, amount);
}
/*
* 获取任务的进度
* */
public double getProgress(QuestData quest) {
if (!isAcceptQuest(quest)) {
return 0.0D;
}
double amount = this.questAmount.get(quest);
double d = amount / quest.getNeedAmount();
if (d < 0.0D) {
d = 0.0D;
}else if (d > 1.0D) {
d = 1.0D;
}
return d;
}
public void reload(List<QuestData> questDataList) {
HashMap<QuestData, Integer> newData = new HashMap<>();
for (QuestData newQuest : questDataList) {
for (QuestData oldQuest : this.questAmount.keySet()) {
if (newQuest.getQuestKey().equalsIgnoreCase(oldQuest.getQuestKey())) {
newData.put(newQuest, this.questAmount.get(oldQuest));
}
}
}
this.questAmount = newData;
}
}

View File

@ -0,0 +1,76 @@
package com.yaohun.questsystem.data;
import com.yaohun.questsystem.util.TimeType;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import java.util.List;
public class QuestData {
private String questKey; // 任务名
private String name; // 任务名
private TimeType timeType; // 任务时间
private String type; // 任务类型
private String target;
private int needAmount;
private List<String> finish;
private List<String> description;
public QuestData(String questKey,FileConfiguration yml){
this.questKey = questKey;
String cycle = yml.getString(questKey+".timeType","longTerm");
if(cycle.equalsIgnoreCase("everyday")){
timeType = TimeType.EVERYDAY;
}else if(cycle.equalsIgnoreCase("weekly")){
timeType = TimeType.WEEKLY;
}else if(cycle.equalsIgnoreCase("longTerm")){
timeType = TimeType.LONGTERM;
}
this.name = yml.getString(questKey+".name");
this.type = yml.getString(questKey+".type");
this.target = yml.getString(questKey+".content.name");
this.needAmount = yml.getInt(questKey+".content.amount");
this.finish = yml.getStringList(questKey+".finish");
this.description = yml.getStringList(questKey+".description");
}
public String getQuestKey() {
return questKey;
}
public TimeType getTimeType() {
return timeType;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
public String getTarget() {
return target;
}
public int getNeedAmount() {
return needAmount;
}
public List<String> getDescription() {
return description;
}
public void sendFinishCommand(Player player){
if(player == null){return;}
DemonAPI.ConsoleOutCommandList(player,getFinish());
}
public List<String> getFinish() {
return finish;
}
}

View File

@ -0,0 +1,13 @@
package com.yaohun.questsystem.data.database;
import java.sql.Connection;
public abstract class MegumiSQL {
public abstract void openConnection();
public abstract boolean checkConnection();
public abstract Connection getConnection();
public abstract void closeConnection();
}

View File

@ -0,0 +1,104 @@
package com.yaohun.questsystem.data.database;
import com.yaohun.questsystem.Main;
import com.yaohun.questsystem.util.SqlUtil;
import org.bukkit.Bukkit;
import java.sql.ResultSet;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
public class SqlManager {
public String table = "quest_playerdata";
// 创建数据库表格格式
public void createTable() {
// 数据库结构组成
// 玩家名(VARCHAR) 数据(VARCHAR) 数据保存时间(VARCHAR)
String s = "CREATE TABLE IF NOT EXISTS "+table+"(" +
" name VARCHAR(32) NOT NULL," +
" data VARCHAR(8000) NOT NULL," +
" savetime VARCHAR(256) NOT NULL" +
") ENGINE = InnoDB";
getSQL().openConnection();
getSQL().updateSQL(s);
getSQL().closeConnection();
}
// 创建玩家数据
public void createPlayerData(String name){
getSQL().openConnection();
boolean butt = true;
String select = "SELECT * FROM "+table+" WHERE name = '%name%'";
try {
ResultSet resultSet = getSQL().querySQL(select.replace("%name%", name));
while (resultSet.next()) {
butt = false;
}
} catch (Exception e) {
e.printStackTrace();
}
// 若数据库没有name的数据则会创建数据
if(butt) {
String set = "INSERT INTO " + table + " (`name`,`data`, `savetime`) " +
"VALUES ('%name%','%data%', '%savetime%')";
set = set.replace("%name%", name);
set = set.replace("%data%", "");
set = set.replace("%savetime%", getNowTimeString());
getSQL().updateSQL(set);
System.out.println("[调试 - 输出] "+name+" 数据库数据已创建.");
}
getSQL().closeConnection();
}
public String getNowTimeString(){
// 获取当前时间戳
Instant now = Instant.now();
// 将时间戳转换为本地日期时间
LocalDateTime dateTime = LocalDateTime.ofInstant(now, ZoneId.systemDefault());
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm");
return dateTime.format(formatter);
}
// 获取玩家任务数据
public String getQuestData(String name) {
String select = "SELECT * FROM "+table+" WHERE name = '%name%'";
try {
getSQL().openConnection();
ResultSet resultSet = getSQL().querySQL(select.replace("%name%", name));
while (resultSet.next()) {
String string = resultSet.getString("data");
if(string.length() >= 3) {
System.out.println("[调试 - 输出] " + name + " 数据: " + string);
return string;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
getSQL().closeConnection();
}
return null;
}
public void SavePlayerData(String name,String jsonData){
String set = "UPDATE `"+table+"` SET " +
"`data` = '%data%'," +
"`savetime` = '%savetime%' WHERE `"+table+"`.`name` = '%name%'";
getSQL().openConnection();
getSQL().updateSQL(set.replace("%name%", name).
replace("%data%", jsonData).
replace("%savetime%",getNowTimeString()));
getSQL().closeConnection();
}
private SqlUtil getSQL() {
return Main.sqlUtil;
}
}

View File

@ -0,0 +1,38 @@
package com.yaohun.questsystem.listener;
import com.yaohun.questsystem.Main;
import com.yaohun.questsystem.data.PlayerData;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.scheduler.BukkitRunnable;
public class JoinEvent implements Listener {
@EventHandler
public void onJoin(PlayerJoinEvent e){
Player p = e.getPlayer();
new BukkitRunnable() {
@Override
public void run() {
Main.dataManage.loadPlayerData(p);
}
}.runTaskLater(Main.plugin,20L);
}
@EventHandler
public void onQuit(PlayerQuitEvent e){
Player p = e.getPlayer();
Main.dataManage.savePlayerData(p);
}
@EventHandler
public void onKick(PlayerKickEvent e){
Player p = e.getPlayer();
Main.dataManage.savePlayerData(p);
}
}

View File

@ -0,0 +1,145 @@
package com.yaohun.questsystem.manage;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.yaohun.questsystem.Main;
import com.yaohun.questsystem.data.PlayerData;
import com.yaohun.questsystem.data.QuestData;
import com.yaohun.questsystem.util.TimeType;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.util.*;
public class DataManage {
private HashMap<Player, PlayerData> dataHashMap = new HashMap<>();
private HashMap<String, QuestData> questDataMap;
private ArrayList<QuestData> questDataArrayList = new ArrayList<>();
public DataManage(){
File file = new File(Main.plugin.getDataFolder(),"quest.yml");
FileConfiguration fileConfiguration = YamlConfiguration.loadConfiguration(file);
HashMap<String, QuestData> dataHashMap = new HashMap<>();
for (String questKey : fileConfiguration.getKeys(false)){
QuestData questData = new QuestData(questKey,fileConfiguration);
dataHashMap.put(questKey,questData);
if(!questDataArrayList.contains(questData)) {
questDataArrayList.add(questData);
}
}
this.questDataMap = dataHashMap;
DemonAPI.sendConsoleMessage("§f[§a!§f] §f任务列表 §8> §6"+questDataMap.size()+"");
}
public ArrayList<QuestData> getQuestDataArrayList() {
return questDataArrayList;
}
public HashMap<String, QuestData> getQuestDataMap() {
return questDataMap;
}
public QuestData getQuestData(String questKey){
if(this.questDataMap.get(questKey) == null){
return null;
}
return this.questDataMap.get(questKey);
}
/*
* 载入玩家数据
* */
public void loadPlayerData(Player player) {
String name = player.getName();
String sqlJson = Main.sqlManager.getQuestData(name);
// 创建 Gson 实例
Gson gson = new Gson();
// 解析 JSON 数据
if (sqlJson != null && sqlJson.length() >= 3){
JsonObject jsonObject = gson.fromJson(sqlJson, JsonObject.class);
JsonArray questsArray = jsonObject.getAsJsonArray("quest");
// 创建 HashMap 来存储结果
HashMap<QuestData, Integer> questData = new HashMap<>();
// 遍历 JSON 数组并将数据存储到 HashMap
for (JsonElement element : questsArray) {
JsonObject questObject = element.getAsJsonObject();
String key = questObject.get("key").getAsString();
QuestData quest = getQuestData(key);
if (quest != null) {
int amount = questObject.get("amount").getAsInt();
questData.put(quest, amount);
} else {
System.out.println("[错误 - 任务] " + key + " 不存在无法载入.");
}
}
// 判断玩家数据库中是否已存在数据
Main.sqlManager.createPlayerData(name);
// 创建初始化数据
PlayerData playerData = new PlayerData(name, questData);
this.dataHashMap.put(player, playerData);
}else{
// 判断玩家数据库中是否已存在数据
Main.sqlManager.createPlayerData(name);
// 创建初始化数据
PlayerData playerData = new PlayerData(name);
this.dataHashMap.put(player, playerData);
}
player.sendMessage("§f[§e!§f]§7玩家 §6"+name+" §7任务数据已载入.");
}
/*
* 删除玩家数据
* */
public void deletePlayerData(Player player){
if(this.dataHashMap.get(player) == null){
return;
}
this.dataHashMap.remove(player);
}
/*
* 保存玩家数据
* */
public void savePlayerData(Player player){
if(this.dataHashMap.get(player) == null){
return;
}
PlayerData data = this.dataHashMap.get(player);
JsonObject jsonObject = new JsonObject();
JsonArray questArray = new JsonArray(); // 用于存储多个quest对象
HashMap<QuestData,Integer> questAmount = data.getQuestAmount();
for (QuestData quest : questAmount.keySet()){
String questKey = quest.getQuestKey();
int amount = data.getQuestAmount(quest);
JsonObject questObject = new JsonObject();
questObject.addProperty("key", questKey);
questObject.addProperty("amount", amount);
questArray.add(questObject);
}
jsonObject.add("quest", questArray);
String jsonString = jsonObject.toString();
Main.sqlManager.SavePlayerData(player.getName(),jsonString);
}
public PlayerData getPlayerData(Player player){
// 获取玩家是否在数据库中
if(this.dataHashMap.get(player) == null){
String name = player.getName();
this.dataHashMap.put(player,new PlayerData(name));
}
return this.dataHashMap.get(player);
}
public HashMap<Player, PlayerData> getDataHashMap() {
return dataHashMap;
}
public Set<Player> getQuests() {
return this.dataHashMap.keySet();
}
}

View File

@ -0,0 +1,115 @@
package com.yaohun.questsystem.util;
import com.yaohun.questsystem.data.database.MegumiSQL;
import org.bukkit.Bukkit;
import java.sql.*;
public class SqlUtil extends MegumiSQL {
private final String hostname;
private final String port;
private final String database;
private final String username;
private final String password;
private Connection connection;
public SqlUtil(String hostname, String port, String database, String username, String password) {
this.hostname = hostname;
this.port = port;
this.database = database;
this.username = username;
this.password = password;
this.connection = null;
}
public static String getMinecraftVersion() {
String packageName = Bukkit.getServer().getClass().getPackage().getName();
String version = packageName.substring(packageName.lastIndexOf('.') + 1);
return version;
}
@Override
public void openConnection() {
try {
String mcVersion = getMinecraftVersion();
if(mcVersion.contains("1_20")){
Class.forName("com.mysql.cj.jdbc.Driver"); // 1.20.4的mysql路径
}else{
Class.forName("com.mysql.jdbc.Driver"); // 1.18.2的mysql路径
}
this.connection = DriverManager.getConnection("jdbc:mysql://" + this.hostname + ":" + this.port + "/" + this.database + "?useSSL=false", this.username, this.password);
} catch (SQLException e) {
System.out.println("[日志 - 错误] 连接数据库失败!");
this.connection = null;
} catch (ClassNotFoundException e) {
System.out.println("[日志 - 错误] 未找到JDBC驱动程序");
this.connection = null;
}
}
@Override
public boolean checkConnection() {
return this.connection != null;
}
@Override
public Connection getConnection() {
return this.connection;
}
@Override
public void closeConnection() {
if (this.connection != null) {
try {
this.connection.close();
this.connection = null;
} catch (SQLException e) {
System.out.println("[日志 - 错误] 关闭数据库连接失败!");
e.printStackTrace();
}
}
}
public ResultSet querySQL(String query) {
Connection conn;
if (checkConnection())
conn = getConnection();
else
return null;
Statement stat = null;
try {
stat = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
ResultSet result = null;
try {
if (stat != null)
result = stat.executeQuery(query);
else
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return result;
}
public boolean updateSQL(String data) {
Connection conn;
if (checkConnection())
conn = getConnection();
else
return false;
Statement stat = null;
try {
stat = conn.createStatement();
stat.executeUpdate(data);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}

View File

@ -0,0 +1,5 @@
package com.yaohun.questsystem.util;
public enum TimeType {
EVERYDAY,WEEKLY,LONGTERM
}

View File

@ -0,0 +1,9 @@
SqlData:
Yaohun:
everyday:
# -1 = 已完成
# 0 = 进行中
# 100 = 已满足要求
questKey: -1
weekly: 1111
longTerm: 1111

View File

@ -1,5 +1,9 @@
name: QuestSystem name: QuestSystem
main: com.yaohun.questsystem.Main main: com.yaohun.questsystem.Main
version: 1.0 version: 1.0
api-version: 1.18
softdepend:
- DemonAPI
commands: commands:
quest: quest:
questinfo:

View File

@ -0,0 +1,15 @@
# 任务序号
breakBlock:
name: "任务·破坏方块100次"
type: break
content:
Name: "air"
amount: 100
description:
- "XXXXXXXXXXXXXXXXXX"
- "XXXXXXXXXXXXXXXXXX"
- "XXXXXXXXXXXXXXXXXX"
- "XXXXXXXXXXXXXXXXXX"
- "XXXXXXXXXXXXXXXXXX"
finish:
- "console:points give %player% 1"