diff --git a/.examples/userdata/uuid.yml b/.examples/userdata/uuid.yml
new file mode 100644
index 0000000..9b1ef9f
--- /dev/null
+++ b/.examples/userdata/uuid.yml
@@ -0,0 +1,13 @@
+date: 20211111 # 用于判断售出数据的所在日期
+
+depositories:
+ "miner":
+ "COAL:0":
+ amount: 1241
+ sold: 100
+ "FLINT:0":
+ amount: 1241
+ "fishman":
+ "TROPICAL_FISH:0":
+ amount: 51
+ sold: 4
diff --git a/pom.xml b/pom.xml
index d77c395..96f9b06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
cc.carm.plugin
ultradepository
jar
- 1.0.1
+ 1.1.0
UltraDepository
超级仓库插件,支持设定不同物品的存储仓库。
diff --git a/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java b/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java
index 5bd98bc..8fc4cb8 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java
@@ -4,7 +4,7 @@ import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.storage.DataStorage;
-import cc.carm.plugin.ultradepository.util.DateUtil;
+import cc.carm.plugin.ultradepository.util.DateIntUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -118,12 +118,16 @@ public class UserData {
public Date getDate() {
- return new Date(DateUtil.getDateMillis(this.date));
+ return new Date(DateIntUtil.getDateMillis(getDateInt()));
+ }
+
+ public int getDateInt() {
+ return this.date;
}
public boolean isCurrentDay() {
- return this.date == DateUtil.getCurrentDate();
+ return this.date == DateIntUtil.getCurrentDate();
}
@@ -132,7 +136,7 @@ public class UserData {
Main.debug("Date is not change, skip clear sold amount.");
return;
}
- this.date = DateUtil.getCurrentDate(); //更新日期
+ this.date = DateIntUtil.getCurrentDate(); //更新日期
Main.debug("Date changed, clear sold.");
getDepositories().values().stream()
.flatMap(value -> value.getContents().values().stream())
diff --git a/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java b/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java
index 9db8341..71b063b 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java
@@ -2,7 +2,7 @@ package cc.carm.plugin.ultradepository.manager;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.data.UserData;
-import cc.carm.plugin.ultradepository.util.DateUtil;
+import cc.carm.plugin.ultradepository.util.DateIntUtil;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -33,7 +33,7 @@ public class UserManager {
} catch (Exception e) {
Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!");
Main.error("Could not load user's data, please check the data configuration!");
- return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateUtil.getCurrentDate());
+ return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateIntUtil.getCurrentDate());
}
}
diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java
index 923d1dd..9e26b90 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java
@@ -1,14 +1,22 @@
package cc.carm.plugin.ultradepository.storage;
import cc.carm.plugin.ultradepository.Main;
+import cc.carm.plugin.ultradepository.configuration.depository.Depository;
+import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.configuration.values.ConfigValue;
+import cc.carm.plugin.ultradepository.data.DepositoryData;
+import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData;
-import cc.carm.plugin.ultradepository.util.DateUtil;
+import cc.carm.plugin.ultradepository.util.DateIntUtil;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import java.io.File;
-import java.sql.Date;
+import java.io.IOException;
import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.UUID;
public class FileStorage implements DataStorage {
@@ -21,7 +29,12 @@ public class FileStorage implements DataStorage {
@Override
public boolean initialize() {
- return false;
+ dataContainer = new File(Main.getInstance().getDataFolder(), FILE_PATH.get());
+ if (!dataContainer.exists()) {
+ return dataContainer.mkdir();
+ } else {
+ return dataContainer.isDirectory();
+ }
}
@Override
@@ -29,18 +42,90 @@ public class FileStorage implements DataStorage {
// 似乎没什么需要做的?
}
+ public File getDataContainer() {
+ return dataContainer;
+ }
+
@Override
public @NotNull UserData loadData(@NotNull UUID uuid) {
long start = System.currentTimeMillis();
Main.debug("正通过 FileStorage 加载 " + uuid + " 的用户数据...");
- return new UserData(uuid, this, new HashMap<>(), DateUtil.getCurrentDate());
+ File userDataFile = new File(getDataContainer(), uuid + ".yml");
+ if (!userDataFile.exists()) {
+ Main.debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。");
+ return new UserData(uuid, this, new HashMap<>(), DateIntUtil.getCurrentDate());
+ }
+
+ YamlConfiguration userDataConfig = YamlConfiguration.loadConfiguration(userDataFile);
+ int dateInt = userDataConfig.getInt("date", DateIntUtil.getCurrentDate());
+ UserData userData = new UserData(uuid, this, new HashMap<>(), dateInt);
+
+ ConfigurationSection depositoriesSection = userDataConfig.getConfigurationSection("depositories");
+ if (depositoriesSection != null) {
+ for (String depositoryID : depositoriesSection.getKeys(false)) {
+
+ Depository depository = Main.getDepositoryManager().getDepository(depositoryID);
+ if (depository == null) continue;
+
+ ConfigurationSection depositorySection = depositoriesSection.getConfigurationSection(depositoryID);
+ if (depositorySection == null) continue;
+
+ DepositoryData depositoryData = DepositoryData.emptyContents(depository, userData);
+
+ for (String itemTypeID : depositorySection.getKeys(false)) {
+ DepositoryItem item = depository.getItems().get(itemTypeID);
+ if (item == null) continue;
+
+ ConfigurationSection itemSection = depositorySection.getConfigurationSection(itemTypeID);
+ if (itemSection == null) continue;
+
+ depositoryData.getContents().put(item.getTypeID(), new DepositoryItemData(
+ item, depositoryData,
+ itemSection.getInt("amount", 0),
+ itemSection.getInt("sold", 0)
+ ));
+
+ }
+
+ if (!depositoryData.getContents().isEmpty()) userData.setDepository(depositoryData);
+ }
+ }
+ Main.debug("通过 FileStorage 加载 " + uuid + " 的用户数据完成,"
+ + "耗时 " + (System.currentTimeMillis() - start) + "ms。");
+
+ return userData;
}
@Override
- public void saveUserData(@NotNull UserData data) {
+ public void saveUserData(@NotNull UserData data) throws IOException {
long start = System.currentTimeMillis();
Main.debug("正通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据...");
+ YamlConfiguration userDataConfig = new YamlConfiguration();
+ userDataConfig.set("date", data.getDateInt());
+
+ Map>> values = new LinkedHashMap<>();
+
+ data.getDepositories().forEach((depositoryID, depositoryData) -> {
+ Map> depositoryDataMap = new LinkedHashMap<>();
+ depositoryData.getContents().forEach((itemType, itemData) -> {
+ Map itemDataMap = new HashMap<>();
+ if (itemData.getAmount() > 0) itemDataMap.put("amount", itemData.getAmount());
+ if (itemData.getSold() > 0) itemDataMap.put("sold", itemData.getSold());
+ if (!itemDataMap.isEmpty()) depositoryDataMap.put(itemType, itemDataMap);
+ });
+ if (!depositoryDataMap.isEmpty()) values.put(depositoryID, depositoryDataMap);
+ });
+
+ try {
+ userDataConfig.createSection("depositories", values);
+ userDataConfig.save(new File(getDataContainer(), data.getUserUUID() + ".yml"));
+ } catch (IOException ioException) {
+ Main.error("在保存玩家 #" + data.getUserUUID() + " 的数据时出现异常。");
+ Main.error("Error occurred when saving #" + data.getUserUUID() + " data.");
+ throw ioException;
+ }
+
Main.debug(
"通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据完成," +
"耗时 " + (System.currentTimeMillis() - start) + "ms。"
diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java
index 7ac039b..e8be85c 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java
@@ -12,7 +12,7 @@ import cc.carm.plugin.ultradepository.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData;
-import cc.carm.plugin.ultradepository.util.DateUtil;
+import cc.carm.plugin.ultradepository.util.DateIntUtil;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -126,7 +126,7 @@ public class MySQLStorage implements DataStorage {
if (resultSet != null && resultSet.next()) {
String dataJSON = resultSet.getString("data");
Date date = resultSet.getDate("day");
- UserData data = new UserData(uuid, this, new HashMap<>(), DateUtil.getDateInt(date));
+ UserData data = new UserData(uuid, this, new HashMap<>(), DateIntUtil.getDateInt(date));
JsonElement dataElement = PARSER.parse(dataJSON);
if (dataElement.isJsonObject()) {
@@ -142,7 +142,7 @@ public class MySQLStorage implements DataStorage {
return data;
}
Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。");
- return new UserData(uuid, this, new HashMap<>(), DateUtil.getCurrentDate());
+ return new UserData(uuid, this, new HashMap<>(), DateIntUtil.getCurrentDate());
} catch (Exception exception) {
throw new Exception(exception);
}
diff --git a/src/main/java/cc/carm/plugin/ultradepository/util/DateUtil.java b/src/main/java/cc/carm/plugin/ultradepository/util/DateIntUtil.java
similarity index 96%
rename from src/main/java/cc/carm/plugin/ultradepository/util/DateUtil.java
rename to src/main/java/cc/carm/plugin/ultradepository/util/DateIntUtil.java
index 067603c..3c79ba6 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/util/DateUtil.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/util/DateIntUtil.java
@@ -4,7 +4,7 @@ import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
-public class DateUtil {
+public class DateIntUtil {
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyyMMdd");