diff --git a/currency-plugin/build.gradle b/currency-plugin/build.gradle index 3fe6bf0..49a2040 100644 --- a/currency-plugin/build.gradle +++ b/currency-plugin/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'cn.hamster3' -version '2.2.0' +version '2.2.1' repositories { maven { diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java b/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java index ccb1e47..cd169cb 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java @@ -10,21 +10,19 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import static cn.hamster3.currency.HamsterCurrency.getLogUtils; public class FileDataManager implements IDataManager { private final HamsterCurrency plugin; - private final HashSet playerData; + private final Map playerData; private final HashSet currencyTypes; public FileDataManager(HamsterCurrency plugin) { this.plugin = plugin; - playerData = new HashSet<>(); + playerData = new ConcurrentHashMap<>(); currencyTypes = new HashSet<>(); } @@ -42,7 +40,7 @@ public class FileDataManager implements IDataManager { for (File file : files) { try { PlayerData data = new PlayerData(YamlConfiguration.loadConfiguration(file)); - playerData.add(data); + playerData.put(data.getUuid(), data); } catch (Exception e) { getLogUtils().error(e, "加载玩家存档文件 %s 时出现了一个异常!", file.getName()); } @@ -54,7 +52,7 @@ public class FileDataManager implements IDataManager { @Override public void onDisable() { File dataFolder = new File(plugin.getDataFolder(), "PlayerData"); - for (PlayerData data : playerData) { + for (PlayerData data : playerData.values()) { File dataFile = new File(dataFolder, data.getUuid().toString() + ".yml"); try { data.saveToConfig().save(dataFile); @@ -99,7 +97,7 @@ public class FileDataManager implements IDataManager { // 只需要给没有存档的新玩家初始化一个存档数据即可 PlayerData data = getPlayerData(uuid); if (data == null) { - playerData.add(new PlayerData(uuid)); + playerData.put(uuid, new PlayerData(uuid)); } } @@ -116,23 +114,14 @@ public class FileDataManager implements IDataManager { @Override public PlayerData getPlayerData(UUID uuid) { - synchronized (playerData) { - for (PlayerData data : playerData) { - if (uuid.equals(data.getUuid())) { - return data; - } - } - } - return null; + return playerData.get(uuid); } @Override public PlayerData getPlayerData(String name) { - synchronized (playerData) { - for (PlayerData data : playerData) { - if (name.equalsIgnoreCase(data.getPlayerName())) { - return data; - } + for (PlayerData data : playerData.values()) { + if (name.equalsIgnoreCase(data.getPlayerName())) { + return data; } } return null; @@ -140,9 +129,7 @@ public class FileDataManager implements IDataManager { @Override public ArrayList getPlayerData() { - synchronized (playerData) { - return new ArrayList<>(playerData); - } + return new ArrayList<>(playerData.values()); } @Override diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java b/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java index a1359c0..810beb6 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java @@ -17,6 +17,7 @@ import javax.sql.DataSource; import java.nio.charset.StandardCharsets; import java.sql.*; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import static cn.hamster3.currency.HamsterCurrency.getLogUtils; @@ -27,13 +28,13 @@ public class SQLDataManager implements IDataManager { private final String database; private final DataSource datasource; - private final HashSet playerData; + private final Map playerData; private final HashSet currencyTypes; public SQLDataManager(HamsterCurrency plugin) throws SQLException, ClassNotFoundException { this.plugin = plugin; parser = new JsonParser(); - playerData = new HashSet<>(); + playerData = new ConcurrentHashMap<>(); currencyTypes = new HashSet<>(); ConfigurationSection datasourceConfig = FileManager.getPluginConfig().getConfigurationSection("datasource"); @@ -150,25 +151,23 @@ public class SQLDataManager implements IDataManager { Connection connection = datasource.getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery(String.format("SELECT * FROM %s.%s;", database, table)); - synchronized (playerData) { - while (set.next()) { - try { - UUID uuid = UUID.fromString(set.getString(uuidCol)); - String name = set.getString(nameCol); - double money = set.getDouble(moneyCol); - PlayerData data = getPlayerData(uuid); - if (data == null) { - data = new PlayerData(uuid, name); - playerData.add(data); - } - data.setPlayerCurrency(currencyType, money); - getLogUtils().info("已从其他插件中加载了玩家 %s 的存档数据.", data.getUuid()); - } catch (Exception e) { - getLogUtils().error(e, "导入某一条数据时发生了一个错误: "); + while (set.next()) { + try { + UUID uuid = UUID.fromString(set.getString(uuidCol)); + String name = set.getString(nameCol); + double money = set.getDouble(moneyCol); + PlayerData data = getPlayerData(uuid); + if (data == null) { + data = new PlayerData(uuid, name); + playerData.put(data.getUuid(), data); } + data.setPlayerCurrency(currencyType, money); + getLogUtils().info("已从其他插件中加载了玩家 %s 的存档数据.", data.getUuid()); + } catch (Exception e) { + getLogUtils().error(e, "导入某一条数据时发生了一个错误: "); } } - for (PlayerData data : playerData) { + for (PlayerData data : playerData.values()) { statement.executeUpdate(String.format( "REPLACE INTO " + database + ".hamster_currency_player_data VALUES('%s', '%s');", data.getUuid().toString(), @@ -192,16 +191,14 @@ public class SQLDataManager implements IDataManager { Connection connection = datasource.getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM " + database + ".hamster_currency_player_data;"); - synchronized (playerData) { - while (set.next()) { - String uuid = set.getString("uuid"); - String string = set.getString("data"); - try { - PlayerData data = new PlayerData(parser.parse(string).getAsJsonObject()); - playerData.add(data); - } catch (Exception e) { - getLogUtils().error(e, "从数据库中读取玩家 %s 的存档( %s )时出现了一个异常: ", uuid, string); - } + while (set.next()) { + String uuid = set.getString("uuid"); + String string = set.getString("data"); + try { + PlayerData data = new PlayerData(parser.parse(string).getAsJsonObject()); + playerData.put(data.getUuid(), data); + } catch (Exception e) { + getLogUtils().error(e, "从数据库中读取玩家 %s 的存档( %s )时出现了一个异常: ", uuid, string); } } set.close(); @@ -257,10 +254,8 @@ public class SQLDataManager implements IDataManager { data = new PlayerData(uuid); getLogUtils().info("初始化玩家 %s 的存档数据.", data.getUuid()); } - synchronized (playerData) { - playerData.remove(data); - playerData.add(data); - } + playerData.remove(data.getUuid()); + playerData.put(data.getUuid(), data); set.close(); statement.close(); connection.close(); @@ -318,23 +313,14 @@ public class SQLDataManager implements IDataManager { @Override public PlayerData getPlayerData(UUID uuid) { - synchronized (playerData) { - for (PlayerData data : playerData) { - if (uuid.equals(data.getUuid())) { - return data; - } - } - } - return null; + return playerData.get(uuid); } @Override public PlayerData getPlayerData(String name) { - synchronized (playerData) { - for (PlayerData data : playerData) { - if (name.equalsIgnoreCase(data.getPlayerName())) { - return data; - } + for (PlayerData data : playerData.values()) { + if (name.equalsIgnoreCase(data.getPlayerName())) { + return data; } } return null; @@ -342,9 +328,7 @@ public class SQLDataManager implements IDataManager { @Override public ArrayList getPlayerData() { - synchronized (playerData) { - return new ArrayList<>(playerData); - } + return new ArrayList<>(playerData.values()); } @Override