6 Commits

26 changed files with 241 additions and 111 deletions

View File

@@ -5,7 +5,7 @@ plugins {
} }
group 'cn.hamster3' group 'cn.hamster3'
version '2.2.5' version '2.2.9'
repositories { repositories {
maven { maven {
@@ -20,7 +20,7 @@ dependencies {
compileOnly "cn.hamster3:HamsterService-Bukkit:2.8.3-SNAPSHOT" compileOnly "cn.hamster3:HamsterService-Bukkit:2.8.3-SNAPSHOT"
compileOnly "cn.hamster3:HamsterAPI:2.4.8-SNAPSHOT" compileOnly "cn.hamster3:HamsterAPI:2.4.8-SNAPSHOT"
compileOnly 'net.milkbowl.vault:VaultAPI:1.7' compileOnly 'net.milkbowl.vault:VaultAPI:1.7'
compileOnly "me.clip:placeholderapi:2.10.9" compileOnly "me.clip:placeholderapi:2.11.6"
compileOnly rootProject.fileTree(dir: './libs', includes: ['*.jar']) compileOnly rootProject.fileTree(dir: './libs', includes: ['*.jar'])
} }
@@ -39,7 +39,7 @@ java {
jar { jar {
archivesBaseName = "HamsterCurrency" archivesBaseName = "HamsterCurrency"
destinationDir(rootProject.buildDir) destinationDirectory = rootProject.layout.buildDirectory
} }
tasks.withType(JavaCompile).configureEach { tasks.withType(JavaCompile).configureEach {
@@ -62,8 +62,8 @@ publishing {
url = 'https://maven.airgame.net/public/' url = 'https://maven.airgame.net/public/'
credentials { credentials {
username maven_username username = findProperty("MAVEN_AIRGAME_USERNAME")?.toString() ?: ""
password maven_password password = findProperty("MAVEN_AIRGAME_PASSWORD")?.toString() ?: ""
} }
} }
} }

View File

@@ -81,7 +81,6 @@ public abstract class CurrencyAdminSetCommand extends CommandExecutor {
.replace("%type%", type.getId()) .replace("%type%", type.getId())
.replace("%amount%", String.format("%.2f", data.getPlayerCurrency(type.getId()))) .replace("%amount%", String.format("%.2f", data.getPlayerCurrency(type.getId())))
); );
dataManager.savePlayerData(data);
return true; return true;
} }

View File

@@ -1,7 +1,7 @@
package cn.hamster3.currency.command.currency; package cn.hamster3.currency.command.currency;
import cn.hamster3.currency.api.CurrencyAPI;
import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.CurrencyType;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
@@ -17,9 +17,6 @@ public class CurrencyGiveCommand extends CurrencyAdminSetCommand {
@Override @Override
protected void doSet(PlayerData data, CurrencyType type, double amount) { protected void doSet(PlayerData data, CurrencyType type, double amount) {
double balance = data.getPlayerCurrency(type.getId()) + amount; CurrencyAPI.addPlayerCurrency(data.getUuid(), type.getId(), amount);
data.setPlayerCurrency(type.getId(), balance);
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "add", amount, balance));
} }
} }

View File

@@ -2,10 +2,10 @@ package cn.hamster3.currency.command.currency;
import cn.hamster3.api.HamsterAPI; import cn.hamster3.api.HamsterAPI;
import cn.hamster3.api.command.CommandExecutor; import cn.hamster3.api.command.CommandExecutor;
import cn.hamster3.currency.api.CurrencyAPI;
import cn.hamster3.currency.core.FileManager; import cn.hamster3.currency.core.FileManager;
import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.core.Message; import cn.hamster3.currency.core.Message;
import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.CurrencyType;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
import cn.hamster3.service.bukkit.api.ServiceMessageAPI; import cn.hamster3.service.bukkit.api.ServiceMessageAPI;
@@ -77,22 +77,15 @@ public class CurrencyPayCommand extends CommandExecutor {
return true; return true;
} }
Player player = (Player) sender; Player player = (Player) sender;
PlayerData fromData = dataManager.getPlayerData(player.getUniqueId()); if (!CurrencyAPI.hasPlayerCurrency(player.getUniqueId(), type.getId(), amount)) {
if (fromData.getPlayerCurrency(type.getId()) < amount) {
sender.sendMessage( sender.sendMessage(
Message.currencyNotEnough.toString() Message.currencyNotEnough.toString()
.replace("%type%", type.getId()) .replace("%type%", type.getId())
); );
return true; return true;
} }
double fromBalance = fromData.getPlayerCurrency(type.getId()) - amount; CurrencyAPI.takePlayerCurrency(player.getUniqueId(), type.getId(), amount);
fromData.setPlayerCurrency(type.getId(), fromBalance); CurrencyAPI.addPlayerCurrency(toData.getUuid(), type.getId(), amount);
double toBalance = toData.getPlayerCurrency(type.getId()) + amount;
toData.setPlayerCurrency(type.getId(), toBalance);
dataManager.savePlayerData(fromData);
dataManager.savePlayerData(toData);
dataManager.insertLog(new CurrencyLog(fromData.getUuid(), fromData.getPlayerName(), type.getId(), "payOut", amount, fromBalance));
dataManager.insertLog(new CurrencyLog(toData.getUuid(), toData.getPlayerName(), type.getId(), "payIn", amount, toBalance));
sender.sendMessage( sender.sendMessage(
Message.paySuccess.toString() Message.paySuccess.toString()
.replace("%player%", toData.getPlayerName()) .replace("%player%", toData.getPlayerName())

View File

@@ -19,5 +19,4 @@ public class CurrencySetCommand extends CurrencyAdminSetCommand {
protected void doSet(PlayerData data, CurrencyType type, double amount) { protected void doSet(PlayerData data, CurrencyType type, double amount) {
CurrencyAPI.setPlayerCurrency(data.getUuid(), type.getId(), amount); CurrencyAPI.setPlayerCurrency(data.getUuid(), type.getId(), amount);
} }
} }

View File

@@ -1,7 +1,7 @@
package cn.hamster3.currency.command.currency; package cn.hamster3.currency.command.currency;
import cn.hamster3.currency.api.CurrencyAPI;
import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.CurrencyType;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
@@ -17,8 +17,6 @@ public class CurrencyTakeCommand extends CurrencyAdminSetCommand {
@Override @Override
protected void doSet(PlayerData data, CurrencyType type, double amount) { protected void doSet(PlayerData data, CurrencyType type, double amount) {
double balance = data.getPlayerCurrency(type.getId()) - amount; CurrencyAPI.takePlayerCurrency(data.getUuid(), type.getId(), amount);
data.setPlayerCurrency(type.getId(), balance);
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "take", amount, balance));
} }
} }

View File

@@ -67,12 +67,6 @@ public abstract class VaultAdminSetCommand extends CommandExecutor {
} }
doSet(data, type, amount); doSet(data, type, amount);
dataManager.savePlayerData(data); dataManager.savePlayerData(data);
sender.sendMessage(
Message.seeCurrency.toString()
.replace("%player%", data.getPlayerName())
.replace("%type%", type.getId())
.replace("%amount%", String.format("%.2f", data.getPlayerCurrency(type.getId())))
);
return true; return true;
} }

View File

@@ -1,7 +1,7 @@
package cn.hamster3.currency.command.vault; package cn.hamster3.currency.command.vault;
import cn.hamster3.currency.api.CurrencyAPI;
import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.CurrencyType;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
@@ -17,8 +17,6 @@ public class VaultGiveCommand extends VaultAdminSetCommand {
@Override @Override
public void doSet(PlayerData data, CurrencyType type, double amount) { public void doSet(PlayerData data, CurrencyType type, double amount) {
double balance = data.getPlayerCurrency(type.getId()) + amount; CurrencyAPI.addPlayerCurrency(data.getUuid(), type.getId(), amount);
data.setPlayerCurrency(type.getId(), balance);
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "add", amount, balance));
} }
} }

View File

@@ -2,10 +2,10 @@ package cn.hamster3.currency.command.vault;
import cn.hamster3.api.HamsterAPI; import cn.hamster3.api.HamsterAPI;
import cn.hamster3.api.command.CommandManager; import cn.hamster3.api.command.CommandManager;
import cn.hamster3.currency.api.CurrencyAPI;
import cn.hamster3.currency.core.FileManager; import cn.hamster3.currency.core.FileManager;
import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.core.Message; import cn.hamster3.currency.core.Message;
import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.CurrencyType;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
import cn.hamster3.service.bukkit.api.ServiceMessageAPI; import cn.hamster3.service.bukkit.api.ServiceMessageAPI;
@@ -79,24 +79,16 @@ public class VaultPayCommand extends CommandManager {
sender.sendMessage(Message.amountNumberError.toString()); sender.sendMessage(Message.amountNumberError.toString());
return true; return true;
} }
Player player = (Player) sender; Player player = (Player) sender;
PlayerData fromData = dataManager.getPlayerData(player.getUniqueId()); if (!CurrencyAPI.hasPlayerCurrency(player.getUniqueId(), type.getId(), amount)) {
if (fromData.getPlayerCurrency(type.getId()) < amount) {
sender.sendMessage( sender.sendMessage(
Message.currencyNotEnough.toString() Message.currencyNotEnough.toString()
.replace("%type%", type.getId()) .replace("%type%", type.getId())
); );
return true; return true;
} }
double fromBalance = fromData.getPlayerCurrency(type.getId()) - amount; CurrencyAPI.takePlayerCurrency(player.getUniqueId(), type.getId(), amount);
fromData.setPlayerCurrency(type.getId(), fromBalance); CurrencyAPI.addPlayerCurrency(toData.getUuid(), type.getId(), amount);
double toBalance = toData.getPlayerCurrency(type.getId()) + amount;
toData.setPlayerCurrency(type.getId(), toBalance);
dataManager.savePlayerData(fromData);
dataManager.savePlayerData(toData);
dataManager.insertLog(new CurrencyLog(fromData.getUuid(), fromData.getPlayerName(), type.getId(), "payOut", amount, fromBalance));
dataManager.insertLog(new CurrencyLog(toData.getUuid(), toData.getPlayerName(), type.getId(), "payIn", amount, toBalance));
sender.sendMessage( sender.sendMessage(
Message.paySuccess.toString() Message.paySuccess.toString()
.replace("%player%", toData.getPlayerName()) .replace("%player%", toData.getPlayerName())

View File

@@ -1,7 +1,7 @@
package cn.hamster3.currency.command.vault; package cn.hamster3.currency.command.vault;
import cn.hamster3.currency.api.CurrencyAPI;
import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.CurrencyType;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
@@ -17,7 +17,6 @@ public class VaultSetCommand extends VaultAdminSetCommand {
@Override @Override
public void doSet(PlayerData data, CurrencyType type, double amount) { public void doSet(PlayerData data, CurrencyType type, double amount) {
data.setPlayerCurrency(type.getId(), amount); CurrencyAPI.setPlayerCurrency(data.getUuid(), type.getId(), amount);
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "set", amount, amount));
} }
} }

View File

@@ -1,7 +1,7 @@
package cn.hamster3.currency.command.vault; package cn.hamster3.currency.command.vault;
import cn.hamster3.currency.api.CurrencyAPI;
import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.CurrencyType;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
@@ -17,8 +17,6 @@ public class VaultTakeCommand extends VaultAdminSetCommand {
@Override @Override
public void doSet(PlayerData data, CurrencyType type, double amount) { public void doSet(PlayerData data, CurrencyType type, double amount) {
double balance = data.getPlayerCurrency(type.getId()) - amount; CurrencyAPI.takePlayerCurrency(data.getUuid(), type.getId(), amount);
data.setPlayerCurrency(type.getId(), balance);
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "take", amount, balance));
} }
} }

View File

@@ -17,7 +17,7 @@ public abstract class FileManager {
plugin.reloadConfig(); plugin.reloadConfig();
pluginConfig = plugin.getConfig(); pluginConfig = plugin.getConfig();
useBC = pluginConfig.getBoolean("useBC", false); useBC = pluginConfig.getBoolean("useBC", false);
mainServer = pluginConfig.getBoolean("datasource.template"); mainServer = pluginConfig.getBoolean("datasource.template", true);
setPluginConfig(pluginConfig); setPluginConfig(pluginConfig);
} }

View File

@@ -25,7 +25,6 @@ public class SQLDataManager implements IDataManager {
private final HamsterCurrency plugin; private final HamsterCurrency plugin;
private final JsonParser parser; private final JsonParser parser;
private final String database;
private final DataSource datasource; private final DataSource datasource;
private final Map<UUID, PlayerData> playerData; private final Map<UUID, PlayerData> playerData;
@@ -38,16 +37,15 @@ public class SQLDataManager implements IDataManager {
currencyTypes = new HashSet<>(); currencyTypes = new HashSet<>();
ConfigurationSection datasourceConfig = FileManager.getPluginConfig().getConfigurationSection("datasource"); ConfigurationSection datasourceConfig = FileManager.getPluginConfig().getConfigurationSection("datasource");
database = datasourceConfig.getString("database");
datasource = HamsterAPI.getHikariDataSource(datasourceConfig); datasource = HamsterAPI.getHikariDataSource(datasourceConfig);
Connection connection = datasource.getConnection(); Connection connection = datasource.getConnection();
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
statement.execute("CREATE TABLE IF NOT EXISTS " + database + ".hamster_currency_player_data(" + statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_player_data(" +
"uuid VARCHAR(36) PRIMARY KEY," + "uuid VARCHAR(36) PRIMARY KEY," +
"data TEXT" + "data TEXT" +
") CHARACTER SET = utf8mb4;"); ") CHARACTER SET = utf8mb4;");
statement.execute("CREATE TABLE IF NOT EXISTS " + database + ".hamster_currency_logs(" + statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_logs(" +
"uuid VARCHAR(36) NOT NULL," + "uuid VARCHAR(36) NOT NULL," +
"player_name VARCHAR(36) NOT NULL," + "player_name VARCHAR(36) NOT NULL," +
"type VARCHAR(36) NOT NULL," + "type VARCHAR(36) NOT NULL," +
@@ -58,7 +56,7 @@ public class SQLDataManager implements IDataManager {
"INDEX idx_uuid(uuid)," + "INDEX idx_uuid(uuid)," +
"INDEX idx_name(player_name)" + "INDEX idx_name(player_name)" +
") CHARACTER SET = utf8mb4;"); ") CHARACTER SET = utf8mb4;");
statement.execute("CREATE TABLE IF NOT EXISTS " + database + ".hamster_currency_settings(" + statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_settings(" +
"title VARCHAR(64) PRIMARY KEY," + "title VARCHAR(64) PRIMARY KEY," +
"data TEXT" + "data TEXT" +
") CHARACTER SET = utf8mb4;"); ") CHARACTER SET = utf8mb4;");
@@ -78,7 +76,7 @@ public class SQLDataManager implements IDataManager {
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
String data = Base64.getEncoder().encodeToString(config.saveToString().getBytes(StandardCharsets.UTF_8)); String data = Base64.getEncoder().encodeToString(config.saveToString().getBytes(StandardCharsets.UTF_8));
statement.executeUpdate(String.format( statement.executeUpdate(String.format(
"REPLACE INTO " + database + ".hamster_currency_settings VALUES('%s', '%s');", "REPLACE INTO hamster_currency_settings VALUES('%s', '%s');",
"pluginConfig", "pluginConfig",
data data
)); ));
@@ -98,7 +96,7 @@ public class SQLDataManager implements IDataManager {
getLogUtils().info("从数据库中下载配置文件..."); getLogUtils().info("从数据库中下载配置文件...");
Connection connection = datasource.getConnection(); Connection connection = datasource.getConnection();
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery("SELECT * FROM " + database + ".hamster_currency_settings;"); ResultSet set = statement.executeQuery("SELECT * FROM hamster_currency_settings;");
while (set.next()) { while (set.next()) {
String title = set.getString("title"); String title = set.getString("title");
String data = new String(Base64.getDecoder().decode(set.getString("data")), StandardCharsets.UTF_8); String data = new String(Base64.getDecoder().decode(set.getString("data")), StandardCharsets.UTF_8);
@@ -160,16 +158,18 @@ public class SQLDataManager implements IDataManager {
if (data == null) { if (data == null) {
data = new PlayerData(uuid, name); data = new PlayerData(uuid, name);
playerData.put(data.getUuid(), data); playerData.put(data.getUuid(), data);
} else {
data.setPlayerName(name);
} }
data.setPlayerCurrency(currencyType, money); data.setPlayerCurrency(currencyType, money);
getLogUtils().info("已从其他插件中加载了玩家 %s 的存档数据.", data.getUuid()); getLogUtils().info("已从其他插件中加载了玩家 %s(%s) 的存档数据.", uuid, name);
} catch (Exception e) { } catch (Exception e) {
getLogUtils().error(e, "导入某一条数据时发生了一个错误: "); getLogUtils().error(e, "导入某一条数据时发生了一个错误: ");
} }
} }
for (PlayerData data : playerData.values()) { for (PlayerData data : playerData.values()) {
statement.executeUpdate(String.format( statement.executeUpdate(String.format(
"REPLACE INTO " + database + ".hamster_currency_player_data VALUES('%s', '%s');", "REPLACE INTO hamster_currency_player_data VALUES('%s', '%s');",
data.getUuid().toString(), data.getUuid().toString(),
data.saveToJson().toString() data.saveToJson().toString()
)); ));
@@ -190,7 +190,7 @@ public class SQLDataManager implements IDataManager {
try { try {
Connection connection = datasource.getConnection(); Connection connection = datasource.getConnection();
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery("SELECT * FROM " + database + ".hamster_currency_player_data;"); ResultSet set = statement.executeQuery("SELECT * FROM hamster_currency_player_data;");
while (set.next()) { while (set.next()) {
String uuid = set.getString("uuid"); String uuid = set.getString("uuid");
String string = set.getString("data"); String string = set.getString("data");
@@ -237,7 +237,7 @@ public class SQLDataManager implements IDataManager {
Connection connection = datasource.getConnection(); Connection connection = datasource.getConnection();
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery(String.format( ResultSet set = statement.executeQuery(String.format(
"SELECT * FROM " + database + ".hamster_currency_player_data WHERE uuid='%s';", "SELECT * FROM hamster_currency_player_data WHERE uuid='%s';",
uuid uuid
)); ));
PlayerData data; PlayerData data;
@@ -272,7 +272,7 @@ public class SQLDataManager implements IDataManager {
Connection connection = datasource.getConnection(); Connection connection = datasource.getConnection();
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
statement.executeUpdate(String.format( statement.executeUpdate(String.format(
"REPLACE INTO " + database + ".hamster_currency_player_data VALUES('%s', '%s');", "REPLACE INTO hamster_currency_player_data VALUES('%s', '%s');",
data.getUuid().toString(), data.getUuid().toString(),
data.saveToJson().toString() data.saveToJson().toString()
)); ));
@@ -295,7 +295,7 @@ public class SQLDataManager implements IDataManager {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
try (Connection connection = datasource.getConnection()) { try (Connection connection = datasource.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement( try (PreparedStatement statement = connection.prepareStatement(
"INSERT INTO " + database + ".hamster_currency_logs VALUES(?, ?, ?, ?, ?, ?, NOW());" "INSERT INTO hamster_currency_logs VALUES(?, ?, ?, ?, ?, ?, NOW());"
)) { )) {
statement.setString(1, log.getUuid().toString()); statement.setString(1, log.getUuid().toString());
statement.setString(2, log.getPlayerName()); statement.setString(2, log.getPlayerName());
@@ -313,7 +313,7 @@ public class SQLDataManager implements IDataManager {
@Override @Override
public PlayerData getPlayerData(UUID uuid) { public PlayerData getPlayerData(UUID uuid) {
return playerData.computeIfAbsent(uuid, PlayerData::new); return playerData.get(uuid);
} }
@Override @Override

View File

@@ -14,8 +14,8 @@ import java.util.UUID;
public class PlayerData { public class PlayerData {
private final UUID uuid; private final UUID uuid;
private final String playerName;
private final HashMap<String, Double> playerCurrencies; private final HashMap<String, Double> playerCurrencies;
private String playerName;
public PlayerData(UUID uuid) { public PlayerData(UUID uuid) {
this.uuid = uuid; this.uuid = uuid;
@@ -31,7 +31,7 @@ public class PlayerData {
public PlayerData(JsonObject object) { public PlayerData(JsonObject object) {
uuid = UUID.fromString(object.get("uuid").getAsString()); uuid = UUID.fromString(object.get("uuid").getAsString());
if (object.has("playerName")) { if (object.has("playerName") && !object.get("playerName").isJsonNull()) {
playerName = object.get("playerName").getAsString(); playerName = object.get("playerName").getAsString();
} else { } else {
playerName = ServiceInfoAPI.getPlayerInfo(uuid).getPlayerName(); playerName = ServiceInfoAPI.getPlayerInfo(uuid).getPlayerName();
@@ -91,6 +91,10 @@ public class PlayerData {
return playerName; return playerName;
} }
public void setPlayerName(String playerName) {
this.playerName = playerName;
}
public void setPlayerCurrency(String type, double amount) { public void setPlayerCurrency(String type, double amount) {
playerCurrencies.put(type, amount); playerCurrencies.put(type, amount);
} }

View File

@@ -54,10 +54,10 @@ public class CurrencyChangeEvent extends Event {
@Override @Override
public String toString() { public String toString() {
return "CurrencyChangeEvent{" + return "CurrencyChangeEvent{" +
"playerUUID=" + playerUUID + "playerUUID=" + playerUUID +
", currencyID='" + currencyID + '\'' + ", currencyID='" + currencyID + '\'' +
", oldAmount=" + oldAmount + ", oldAmount=" + oldAmount +
", newAmount=" + newAmount + ", newAmount=" + newAmount +
'}'; '}';
} }
} }

View File

@@ -0,0 +1,50 @@
package cn.hamster3.currency.event.vault;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class VaultEconomyGiveEvent extends Event {
private static final HandlerList handlerList = new HandlerList();
@NotNull
private final UUID uuid;
@NotNull
private final String currencyID;
private double amount;
public VaultEconomyGiveEvent(@NotNull UUID uuid, @NotNull String currencyID, double amount) {
super(!Bukkit.getServer().isPrimaryThread());
this.uuid = uuid;
this.currencyID = currencyID;
this.amount = amount;
}
public static HandlerList getHandlerList() {
return handlerList;
}
public @NotNull UUID getUuid() {
return uuid;
}
public @NotNull String getCurrencyID() {
return currencyID;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
@Override
public HandlerList getHandlers() {
return handlerList;
}
}

View File

@@ -0,0 +1,50 @@
package cn.hamster3.currency.event.vault;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class VaultEconomySeeEvent extends Event {
private static final HandlerList handlerList = new HandlerList();
@NotNull
private final UUID uuid;
@NotNull
private final String currencyID;
private double result;
public VaultEconomySeeEvent(@NotNull UUID uuid, @NotNull String currencyID, double result) {
super(!Bukkit.getServer().isPrimaryThread());
this.uuid = uuid;
this.currencyID = currencyID;
this.result = result;
}
public static HandlerList getHandlerList() {
return handlerList;
}
public @NotNull UUID getUuid() {
return uuid;
}
public @NotNull String getCurrencyID() {
return currencyID;
}
public double getResult() {
return result;
}
public void setResult(double result) {
this.result = result;
}
@Override
public HandlerList getHandlers() {
return handlerList;
}
}

View File

@@ -0,0 +1,50 @@
package cn.hamster3.currency.event.vault;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class VaultEconomyTakeEvent extends Event {
private static final HandlerList handlerList = new HandlerList();
@NotNull
private final UUID uuid;
@NotNull
private final String currencyID;
private double amount;
public VaultEconomyTakeEvent(@NotNull UUID uuid, @NotNull String currencyID, double amount) {
super(!Bukkit.getServer().isPrimaryThread());
this.uuid = uuid;
this.currencyID = currencyID;
this.amount = amount;
}
public static HandlerList getHandlerList() {
return handlerList;
}
public @NotNull UUID getUuid() {
return uuid;
}
public @NotNull String getCurrencyID() {
return currencyID;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
@Override
public HandlerList getHandlers() {
return handlerList;
}
}

View File

@@ -5,21 +5,21 @@ import cn.hamster3.currency.core.IDataManager;
import cn.hamster3.currency.core.Message; import cn.hamster3.currency.core.Message;
import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyLog;
import cn.hamster3.currency.data.PlayerData; import cn.hamster3.currency.data.PlayerData;
import cn.hamster3.currency.event.vault.VaultEconomyGiveEvent;
import cn.hamster3.currency.event.vault.VaultEconomySeeEvent;
import cn.hamster3.currency.event.vault.VaultEconomyTakeEvent;
import net.milkbowl.vault.economy.AbstractEconomy; import net.milkbowl.vault.economy.AbstractEconomy;
import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class VaultEconomyHook extends AbstractEconomy { public class VaultEconomyHook extends AbstractEconomy {
private static final EconomyResponse NOT_IMPLEMENTED_RESPONSE = private static final EconomyResponse NOT_IMPLEMENTED_RESPONSE = new EconomyResponse(
new EconomyResponse( 0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "HamsterCurrency未实现该功能~"
0, );
0,
EconomyResponse.ResponseType.NOT_IMPLEMENTED,
"HamsterCurrency未实现该功能~"
);
private final IDataManager dataManager; private final IDataManager dataManager;
public VaultEconomyHook(IDataManager dataManager) { public VaultEconomyHook(IDataManager dataManager) {
@@ -31,6 +31,12 @@ public class VaultEconomyHook extends AbstractEconomy {
return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家账户不存在"); return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家账户不存在");
} }
String type = FileManager.getVaultCurrencyType(); String type = FileManager.getVaultCurrencyType();
VaultEconomyGiveEvent event = new VaultEconomyGiveEvent(data.getUuid(), type, amount);
Bukkit.getPluginManager().callEvent(event);
amount = event.getAmount();
if (amount == 0) {
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, null);
}
double balance = data.getPlayerCurrency(type) + amount; double balance = data.getPlayerCurrency(type) + amount;
if (data.getPlayerCurrency(type) > 0 && balance < 0) { if (data.getPlayerCurrency(type) > 0 && balance < 0) {
return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家金额超出上限"); return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家金额超出上限");
@@ -38,7 +44,7 @@ public class VaultEconomyHook extends AbstractEconomy {
data.setPlayerCurrency(type, balance); data.setPlayerCurrency(type, balance);
dataManager.savePlayerData(data); dataManager.savePlayerData(data);
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type, "add", amount, balance)); dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type, "add", amount, balance));
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, ""); return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, null);
} }
protected EconomyResponse withdrawPlayer(PlayerData data, double amount) { protected EconomyResponse withdrawPlayer(PlayerData data, double amount) {
@@ -46,6 +52,12 @@ public class VaultEconomyHook extends AbstractEconomy {
return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家账户不存在"); return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家账户不存在");
} }
String type = FileManager.getVaultCurrencyType(); String type = FileManager.getVaultCurrencyType();
VaultEconomyTakeEvent event = new VaultEconomyTakeEvent(data.getUuid(), type, amount);
Bukkit.getPluginManager().callEvent(event);
amount = event.getAmount();
if (amount == 0) {
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, null);
}
if (data.getPlayerCurrency(type) < amount) { if (data.getPlayerCurrency(type) < amount) {
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.FAILURE, "余额不足"); return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.FAILURE, "余额不足");
} }
@@ -53,21 +65,24 @@ public class VaultEconomyHook extends AbstractEconomy {
data.setPlayerCurrency(type, balance); data.setPlayerCurrency(type, balance);
dataManager.savePlayerData(data); dataManager.savePlayerData(data);
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type, "take", amount, balance)); dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type, "take", amount, balance));
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, "扣款成功"); return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, null);
} }
private boolean has(PlayerData data, double amount) { private boolean has(PlayerData data, double amount) {
if (data == null) { if (data == null) {
return false; return false;
} }
return data.getPlayerCurrency(FileManager.getVaultCurrencyType()) >= amount; return getBalance(data) >= amount;
} }
private double getBalance(PlayerData data) { private double getBalance(PlayerData data) {
if (data == null) { if (data == null) {
return 0; return 0;
} }
return data.getPlayerCurrency(FileManager.getVaultCurrencyType()); double currency = data.getPlayerCurrency(FileManager.getVaultCurrencyType());
VaultEconomySeeEvent event = new VaultEconomySeeEvent(data.getUuid(), FileManager.getVaultCurrencyType(), currency);
Bukkit.getPluginManager().callEvent(event);
return event.getResult();
} }
@Override @Override

View File

@@ -43,6 +43,9 @@ public class SQLListener extends CurrencyListener {
break; break;
} }
case "savedPlayerData": { case "savedPlayerData": {
if (ServiceInfoAPI.getLocalServerName().equals(info.getSenderInfo().getName())) {
return;
}
if (ServiceInfoAPI.getLocalSenderInfo().equals(info.getSenderInfo())) { if (ServiceInfoAPI.getLocalSenderInfo().equals(info.getSenderInfo())) {
return; return;
} }

View File

@@ -5,19 +5,10 @@ useBC: true
# 若开启跨服模式则需要配置datasource # 若开启跨服模式则需要配置datasource
datasource: datasource:
driver: "com.mysql.cj.jdbc.Driver" driver: "com.mysql.jdbc.Driver"
url: "jdbc:mysql://sql.hamster3.cn:3306?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false" url: "jdbc:mysql://localhost:3306/Test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true"
user: Test user: root
password: Test123.. password: Root123...
database: Test1
# 是否将这个服务器的配置文件设为模板
# 若设为trueconfig将会在服务器启动时自动上传至数据库
# 其他template为false的服务器将会在启动和重载时自动从数据库上下载config
# 可以节省一些config配置时的麻烦事情
# 但是请先保证template为true的服务器完全启动了再启动子服
# 如果觉得这样反而更麻烦也可以直接把所有服务器的template设为true
# 这样每个服务器都会使用自己本地的config文件了
template: true
currencyTypes: currencyTypes:
# 货币ID # 货币ID

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -40,5 +40,5 @@ jar {
rootProject.file("LICENSE") rootProject.file("LICENSE")
]) ])
duplicatesStrategy(DuplicatesStrategy.EXCLUDE) duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
destinationDir(rootProject.buildDir) destinationDirectory = rootProject.layout.buildDirectory
} }

View File

@@ -79,9 +79,9 @@ public class Main {
statement.execute(String.format("USE %s;", database)); statement.execute(String.format("USE %s;", database));
System.out.println("检查数据表..."); System.out.println("检查数据表...");
statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_player_data(" + statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_player_data(" +
"uuid VARCHAR(36) PRIMARY KEY," + "uuid VARCHAR(36) PRIMARY KEY," +
"data TEXT" + "data TEXT" +
");"); ");");
System.out.println("开始更新数据库..."); System.out.println("开始更新数据库...");
for (PlayerData data : playerData) { for (PlayerData data : playerData) {
String sql = String.format( String sql = String.format(

View File

@@ -43,5 +43,5 @@ jar {
rootProject.file("LICENSE") rootProject.file("LICENSE")
]) ])
duplicatesStrategy(DuplicatesStrategy.EXCLUDE) duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
destinationDir(rootProject.buildDir) destinationDirectory = rootProject.layout.buildDirectory
} }

View File

@@ -60,9 +60,9 @@ public class Main {
statement.execute(String.format("USE %s;", database)); statement.execute(String.format("USE %s;", database));
System.out.println("检查数据表..."); System.out.println("检查数据表...");
statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_player_data(" + statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_player_data(" +
"uuid VARCHAR(36) PRIMARY KEY," + "uuid VARCHAR(36) PRIMARY KEY," +
"data TEXT" + "data TEXT" +
");"); ");");
System.out.println("开始更新数据库..."); System.out.println("开始更新数据库...");
for (PlayerData data : playerData) { for (PlayerData data : playerData) {
String sql = String.format( String sql = String.format(