mirror of
https://github.com/MiniDay/HamsterCurrency-Parent.git
synced 2025-08-22 20:25:30 +08:00
Compare commits
34 Commits
2.0.6-SNAP
...
91817db007
Author | SHA1 | Date | |
---|---|---|---|
91817db007 | |||
840cc6d238 | |||
bcfb866da7 | |||
0743728cbf | |||
13b8a3ee73 | |||
487da47e42 | |||
fdeef5ed91 | |||
fa656c9cbf | |||
250bd94e39 | |||
2aa0aa27cb | |||
2ff4e5a396 | |||
a093d411ec | |||
c6bc7927ea | |||
35f7eacee6 | |||
d7e477dd3f | |||
0cadbd2ca3 | |||
5192b4bb15 | |||
dfce58a945 | |||
29e87d06a2 | |||
5854335f43 | |||
3875f3634f | |||
67e0dd21f9 | |||
cd98126fbe | |||
9c1f4f204e | |||
ddd547bd7e | |||
616eee7b6a | |||
982d87f25d | |||
92affba287 | |||
eac536a971 | |||
870a3789f2 | |||
eff200634d | |||
59f1e02a6c | |||
e6d95e0ba9 | |||
ca220775b6 |
@@ -1,4 +1,4 @@
|
||||
# HamsterCurrency
|
||||
# [HamsterCurrency](https://github.com/MiniDay/HamsterCurrency-Parent)
|
||||
|
||||
[](https://jitpack.io/#cn.hamster3/HamsterCurrency)
|
||||
仓鼠的多货币经济插件
|
||||
@@ -10,6 +10,12 @@
|
||||
- [Vault](https://www.spigotmc.org/resources/vault.34315/) (仅开启Vault经济系统时需要)
|
||||
- [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/) (非必须)
|
||||
|
||||
# 变量列表
|
||||
|
||||
| 变量 | 描述 |
|
||||
|:-----------------|:--------|
|
||||
| %Currency_<货币名称% | 玩家的货币余额 |
|
||||
|
||||
# 开发者
|
||||
|
||||
## 依赖导入
|
||||
@@ -19,10 +25,11 @@
|
||||
添加仓库:
|
||||
|
||||
```xml
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
<id>airgame-repo</id>
|
||||
<url>https://maven.airgame.net/maven-public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
```
|
||||
@@ -30,10 +37,11 @@
|
||||
添加导入:
|
||||
|
||||
```xml
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.hamster3</groupId>
|
||||
<artifactId>HamsterCurrency</artifactId>
|
||||
<version>2.0.6-SNAPSHOT</version>
|
||||
<version>2.2.2</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
@@ -44,7 +52,7 @@
|
||||
```groovy
|
||||
allprojects {
|
||||
repositories {
|
||||
maven { url 'https://jitpack.io' }
|
||||
maven { url 'https://maven.airgame.net/maven-public/' }
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -53,11 +61,10 @@ allprojects {
|
||||
|
||||
```groovy
|
||||
dependencies {
|
||||
implementation 'cn.hamster3:HamsterCurrency:1.3.7-SNAPSHOT'
|
||||
implementation 'cn.hamster3:HamsterCurrency:2.2.2'
|
||||
}
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
请参考[CurrencyAPI](/currency-plugin/src/main/java/cn/hamster3/currency/api/CurrencyAPI.java)
|
||||
|
||||
请参考[CurrencyAPI](currency-plugin/src/main/java/cn/hamster3/currency/api/CurrencyAPI.java)
|
@@ -0,0 +1,3 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
}
|
||||
|
@@ -1,16 +1,15 @@
|
||||
//file:noinspection VulnerableLibrariesLocal
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'maven-publish'
|
||||
}
|
||||
|
||||
group 'cn.hamster3'
|
||||
version '2.0.6-SNAPSHOT'
|
||||
version '2.2.6'
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url = "https://maven.airgame.net/repository/maven-public/"
|
||||
}
|
||||
maven {
|
||||
url = "https://repo.codemc.org/repository/maven-public"
|
||||
url = "https://maven.airgame.net/maven-public/"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,11 +17,12 @@ dependencies {
|
||||
compileOnly "org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT"
|
||||
// https://mvnrepository.com/artifact/org.jetbrains/annotations
|
||||
compileOnly group: 'org.jetbrains', name: 'annotations', version: '22.0.0'
|
||||
compileOnly "cn.hamster3:HamsterService-Bukkit:2.6.2-SNAPSHOT"
|
||||
compileOnly "cn.hamster3:HamsterAPI:2.4.0-SNAPSHOT"
|
||||
compileOnly "com.github.MilkBowl:VaultAPI:1.7"
|
||||
compileOnly "org.black_ixx:PlayerPoints:2.1.3"
|
||||
compileOnly "cn.hamster3:HamsterService-Bukkit:2.8.3-SNAPSHOT"
|
||||
compileOnly "cn.hamster3:HamsterAPI:2.4.8-SNAPSHOT"
|
||||
compileOnly 'net.milkbowl.vault:VaultAPI:1.7'
|
||||
compileOnly "me.clip:placeholderapi:2.10.9"
|
||||
|
||||
compileOnly rootProject.fileTree(dir: './libs', includes: ['*.jar'])
|
||||
}
|
||||
|
||||
processResources {
|
||||
@@ -34,9 +34,37 @@ processResources {
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
withSourcesJar()
|
||||
}
|
||||
|
||||
jar {
|
||||
archivesBaseName = "HamsterCurrency"
|
||||
destinationDir(rootProject.buildDir)
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.encoding = 'UTF-8'
|
||||
options.compilerArgs << "-Xlint:unchecked"
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
create("mavenJava", MavenPublication.class) {
|
||||
artifactId = "HamsterCurrency"
|
||||
artifact jar
|
||||
artifact sourcesJar
|
||||
//artifact javadocJar
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url = 'https://maven.airgame.net/public/'
|
||||
|
||||
credentials {
|
||||
username maven_username
|
||||
password maven_password
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -27,19 +27,25 @@ import org.bukkit.plugin.java.JavaPlugin;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public final class HamsterCurrency extends JavaPlugin {
|
||||
private static HamsterCurrency instance;
|
||||
private static LogUtils logUtils;
|
||||
private IDataManager dataManager;
|
||||
private CurrencyListener listener;
|
||||
private boolean loaded;
|
||||
|
||||
public static HamsterCurrency getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static LogUtils getLogUtils() {
|
||||
return logUtils;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
FileManager.reload(this);
|
||||
instance = this;
|
||||
logUtils = new LogUtils(this);
|
||||
FileManager.reload(this);
|
||||
logUtils.infoDividingLine();
|
||||
if (FileManager.isUseBC()) {
|
||||
logUtils.info("使用多服务器模式...");
|
||||
@@ -86,19 +92,19 @@ public final class HamsterCurrency extends JavaPlugin {
|
||||
logUtils.info("事件监听器已注册!");
|
||||
|
||||
registerVault();
|
||||
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
||||
logUtils.info("检测到 PlaceholderAPI 已安装...");
|
||||
new PlaceholderHook(dataManager).register();
|
||||
logUtils.info("已挂载 PlaceholderAPI 变量!");
|
||||
} else {
|
||||
logUtils.info("未检测到 PlaceholderAPI!");
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
|
||||
dataManager.onEnable();
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
dataManager.loadPlayerData(player.getUniqueId());
|
||||
}
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
logUtils.info("检测到 PlaceholderAPI 已启动...");
|
||||
new PlaceholderHook(dataManager).register();
|
||||
logUtils.info("已挂载 PlaceholderAPI 变量!");
|
||||
} else {
|
||||
logUtils.info("未检测到 PlaceholderAPI!");
|
||||
}
|
||||
});
|
||||
|
||||
ServiceMessageAPI.subscribeTag("HamsterCurrency");
|
||||
|
@@ -1,8 +1,11 @@
|
||||
package cn.hamster3.currency.api;
|
||||
|
||||
import cn.hamster3.currency.HamsterCurrency;
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
import cn.hamster3.currency.event.CurrencyChangeEvent;
|
||||
import org.black_ixx.playerpoints.PlayerPoints;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
@@ -12,7 +15,7 @@ import java.util.UUID;
|
||||
/**
|
||||
* 当 currencyID 为 PlayerPoints 且服务器安装了点券插件时,会自动更改为 PlayerPoints 接口
|
||||
*/
|
||||
@SuppressWarnings({"unused", "ConstantConditions"})
|
||||
@SuppressWarnings("unused")
|
||||
public abstract class CurrencyAPI {
|
||||
private static IDataManager dataManager;
|
||||
|
||||
@@ -40,8 +43,11 @@ public abstract class CurrencyAPI {
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
CurrencyChangeEvent event = new CurrencyChangeEvent(uuid, currencyID, data.getPlayerCurrency(currencyID), amount);
|
||||
Bukkit.getScheduler().runTaskAsynchronously(HamsterCurrency.getInstance(), () -> Bukkit.getPluginManager().callEvent(event));
|
||||
data.setPlayerCurrency(currencyID, amount);
|
||||
dataManager.savePlayerData(data);
|
||||
dataManager.insertLog(new CurrencyLog(uuid, data.getPlayerName(), currencyID, "set", amount, amount));
|
||||
}
|
||||
|
||||
public static void addPlayerCurrency(UUID uuid, String currencyID, double amount) {
|
||||
@@ -53,8 +59,12 @@ public abstract class CurrencyAPI {
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
data.setPlayerCurrency(currencyID, data.getPlayerCurrency(currencyID) + amount);
|
||||
double balance = data.getPlayerCurrency(currencyID) + amount;
|
||||
CurrencyChangeEvent event = new CurrencyChangeEvent(uuid, currencyID, data.getPlayerCurrency(currencyID), balance);
|
||||
Bukkit.getScheduler().runTaskAsynchronously(HamsterCurrency.getInstance(), () -> Bukkit.getPluginManager().callEvent(event));
|
||||
data.setPlayerCurrency(currencyID, balance);
|
||||
dataManager.savePlayerData(data);
|
||||
dataManager.insertLog(new CurrencyLog(uuid, data.getPlayerName(), currencyID, "add", amount, balance));
|
||||
}
|
||||
|
||||
public static void takePlayerCurrency(UUID uuid, String currencyID, double amount) {
|
||||
@@ -66,8 +76,12 @@ public abstract class CurrencyAPI {
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
data.setPlayerCurrency(currencyID, data.getPlayerCurrency(currencyID) - amount);
|
||||
double balance = data.getPlayerCurrency(currencyID) - amount;
|
||||
CurrencyChangeEvent event = new CurrencyChangeEvent(uuid, currencyID, data.getPlayerCurrency(currencyID), balance);
|
||||
Bukkit.getScheduler().runTaskAsynchronously(HamsterCurrency.getInstance(), () -> Bukkit.getPluginManager().callEvent(event));
|
||||
data.setPlayerCurrency(currencyID, balance);
|
||||
dataManager.savePlayerData(data);
|
||||
dataManager.insertLog(new CurrencyLog(uuid, data.getPlayerName(), currencyID, "take", amount, balance));
|
||||
}
|
||||
|
||||
public static boolean hasPlayerCurrency(UUID uuid, String currencyID, double amount) {
|
||||
|
@@ -2,6 +2,7 @@ package cn.hamster3.currency.command;
|
||||
|
||||
import cn.hamster3.api.command.CommandExecutor;
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.core.Message;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@@ -11,7 +12,7 @@ public class ReloadCommand extends CommandExecutor {
|
||||
private final IDataManager dataManager;
|
||||
|
||||
public ReloadCommand(IDataManager dataManager) {
|
||||
super("reload", "重载服务器");
|
||||
super("reload", "重载服务器", "currency.reload");
|
||||
this.dataManager = dataManager;
|
||||
}
|
||||
|
||||
@@ -20,6 +21,11 @@ public class ReloadCommand extends CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPermissionMessage() {
|
||||
return Message.notHasPermission.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
dataManager.reloadConfig();
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package cn.hamster3.currency.command.currency;
|
||||
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
|
||||
@@ -16,7 +17,9 @@ public class CurrencyGiveCommand extends CurrencyAdminSetCommand {
|
||||
|
||||
@Override
|
||||
protected void doSet(PlayerData data, CurrencyType type, double amount) {
|
||||
data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) + amount);
|
||||
double balance = data.getPlayerCurrency(type.getId()) + amount;
|
||||
data.setPlayerCurrency(type.getId(), balance);
|
||||
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "add", amount, balance));
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@ import cn.hamster3.api.command.CommandExecutor;
|
||||
import cn.hamster3.currency.core.FileManager;
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.core.Message;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
import cn.hamster3.service.bukkit.api.ServiceMessageAPI;
|
||||
@@ -25,11 +26,7 @@ public class CurrencyPayCommand extends CommandExecutor {
|
||||
"向其他玩家转账",
|
||||
"currency.pay",
|
||||
Message.notHasPermission.toString(),
|
||||
new String[]{
|
||||
"玩家",
|
||||
"货币类型",
|
||||
"数额"
|
||||
}
|
||||
new String[]{"玩家", "货币类型", "数额"}
|
||||
);
|
||||
this.dataManager = dataManager;
|
||||
}
|
||||
@@ -88,10 +85,14 @@ public class CurrencyPayCommand extends CommandExecutor {
|
||||
);
|
||||
return true;
|
||||
}
|
||||
fromData.setPlayerCurrency(type.getId(), fromData.getPlayerCurrency(type.getId()) - amount);
|
||||
toData.setPlayerCurrency(type.getId(), toData.getPlayerCurrency(type.getId()) + amount);
|
||||
double fromBalance = fromData.getPlayerCurrency(type.getId()) - amount;
|
||||
fromData.setPlayerCurrency(type.getId(), fromBalance);
|
||||
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(
|
||||
Message.paySuccess.toString()
|
||||
.replace("%player%", toData.getPlayerName())
|
||||
|
@@ -10,6 +10,7 @@ import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -22,10 +23,7 @@ public class CurrencySeeCommand extends CommandExecutor {
|
||||
"查看玩家的货币余额",
|
||||
"currency.see",
|
||||
Message.notHasPermission.toString(),
|
||||
new String[]{
|
||||
"货币类型",
|
||||
"玩家"
|
||||
}
|
||||
new String[]{"玩家", "货币类型"}
|
||||
);
|
||||
this.dataManager = dataManager;
|
||||
}
|
||||
@@ -38,17 +36,8 @@ public class CurrencySeeCommand extends CommandExecutor {
|
||||
@Override
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(Message.notInputCurrencyType.toString());
|
||||
return true;
|
||||
}
|
||||
CurrencyType type = dataManager.getCurrencyType(args[1]);
|
||||
if (type == null) {
|
||||
sender.sendMessage(Message.currencyTypeNotFound.toString());
|
||||
return true;
|
||||
}
|
||||
PlayerData data;
|
||||
if (args.length < 3) {
|
||||
if (args.length < 2) {
|
||||
if (!(sender instanceof Player)) {
|
||||
sender.sendMessage(Message.notInputPlayerName.toString());
|
||||
return true;
|
||||
@@ -60,30 +49,51 @@ public class CurrencySeeCommand extends CommandExecutor {
|
||||
sender.sendMessage(Message.notHasPermission.toString());
|
||||
return true;
|
||||
}
|
||||
data = dataManager.getPlayerData(args[2]);
|
||||
if (data == null) {
|
||||
sender.sendMessage(Message.playerNotFound.toString());
|
||||
data = dataManager.getPlayerData(args[1]);
|
||||
}
|
||||
CurrencyType type = null;
|
||||
if (args.length >= 3) {
|
||||
type = dataManager.getCurrencyType(args[2]);
|
||||
if (type == null) {
|
||||
sender.sendMessage(Message.currencyTypeNotFound.toString());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
sender.sendMessage(
|
||||
Message.seeCurrency.toString()
|
||||
.replace("%player%", data.getPlayerName())
|
||||
.replace("%type%", type.getId())
|
||||
.replace("%amount%", String.format("%.2f", data.getPlayerCurrency(type.getId())))
|
||||
);
|
||||
if (data == null) {
|
||||
sender.sendMessage(Message.playerNotFound.toString());
|
||||
return true;
|
||||
}
|
||||
if (type == null) {
|
||||
for (CurrencyType currencyType : dataManager.getCurrencyTypes()) {
|
||||
String typeId = currencyType.getId();
|
||||
sender.sendMessage(
|
||||
Message.seeCurrency.toString()
|
||||
.replace("%player%", data.getPlayerName())
|
||||
.replace("%type%", typeId)
|
||||
.replace("%amount%", String.format("%.2f", data.getPlayerCurrency(typeId)))
|
||||
);
|
||||
}
|
||||
} else {
|
||||
String typeId = type.getId();
|
||||
sender.sendMessage(
|
||||
Message.seeCurrency.toString()
|
||||
.replace("%player%", data.getPlayerName())
|
||||
.replace("%type%", typeId)
|
||||
.replace("%amount%", String.format("%.2f", data.getPlayerCurrency(typeId)))
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
if (args.length == 2) {
|
||||
List<String> types = dataManager.getCurrencyTypes().stream().map(CurrencyType::getId).collect(Collectors.toList());
|
||||
return HamsterAPI.startWith(types, args[1]);
|
||||
return HamsterAPI.getOnlinePlayersName(args[1]);
|
||||
}
|
||||
if (args.length == 3) {
|
||||
return HamsterAPI.getOnlinePlayersName(args[2]);
|
||||
List<String> types = dataManager.getCurrencyTypes().stream().map(CurrencyType::getId).collect(Collectors.toList());
|
||||
return HamsterAPI.startWith(types, args[2]);
|
||||
}
|
||||
return null;
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package cn.hamster3.currency.command.currency;
|
||||
|
||||
import cn.hamster3.currency.api.CurrencyAPI;
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
@@ -16,7 +17,7 @@ public class CurrencySetCommand extends CurrencyAdminSetCommand {
|
||||
|
||||
@Override
|
||||
protected void doSet(PlayerData data, CurrencyType type, double amount) {
|
||||
data.setPlayerCurrency(type.getId(), amount);
|
||||
CurrencyAPI.setPlayerCurrency(data.getUuid(), type.getId(), amount);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package cn.hamster3.currency.command.currency;
|
||||
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
|
||||
@@ -16,7 +17,8 @@ public class CurrencyTakeCommand extends CurrencyAdminSetCommand {
|
||||
|
||||
@Override
|
||||
protected void doSet(PlayerData data, CurrencyType type, double amount) {
|
||||
data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) - amount);
|
||||
double balance = data.getPlayerCurrency(type.getId()) - amount;
|
||||
data.setPlayerCurrency(type.getId(), balance);
|
||||
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "take", amount, balance));
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -10,6 +10,7 @@ import cn.hamster3.currency.data.PlayerData;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class VaultAdminSetCommand extends CommandExecutor {
|
||||
@@ -79,8 +80,8 @@ public abstract class VaultAdminSetCommand extends CommandExecutor {
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
if (args.length == 2) {
|
||||
return HamsterAPI.getOnlinePlayersName(args[0]);
|
||||
return HamsterAPI.getOnlinePlayersName(args[1]);
|
||||
}
|
||||
return null;
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package cn.hamster3.currency.command.vault;
|
||||
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
|
||||
@@ -16,7 +17,8 @@ public class VaultGiveCommand extends VaultAdminSetCommand {
|
||||
|
||||
@Override
|
||||
public void doSet(PlayerData data, CurrencyType type, double amount) {
|
||||
data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) + amount);
|
||||
|
||||
double balance = data.getPlayerCurrency(type.getId()) + amount;
|
||||
data.setPlayerCurrency(type.getId(), balance);
|
||||
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "add", amount, balance));
|
||||
}
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@ import cn.hamster3.api.command.CommandManager;
|
||||
import cn.hamster3.currency.core.FileManager;
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.core.Message;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
import cn.hamster3.service.bukkit.api.ServiceMessageAPI;
|
||||
@@ -88,11 +89,14 @@ public class VaultPayCommand extends CommandManager {
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
fromData.setPlayerCurrency(type.getId(), fromData.getPlayerCurrency(type.getId()) - amount);
|
||||
toData.setPlayerCurrency(type.getId(), toData.getPlayerCurrency(type.getId()) + amount);
|
||||
double fromBalance = fromData.getPlayerCurrency(type.getId()) - amount;
|
||||
fromData.setPlayerCurrency(type.getId(), fromBalance);
|
||||
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(
|
||||
Message.paySuccess.toString()
|
||||
.replace("%player%", toData.getPlayerName())
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package cn.hamster3.currency.command.vault;
|
||||
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
|
||||
@@ -17,5 +18,6 @@ public class VaultSetCommand extends VaultAdminSetCommand {
|
||||
@Override
|
||||
public void doSet(PlayerData data, CurrencyType type, double amount) {
|
||||
data.setPlayerCurrency(type.getId(), amount);
|
||||
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "set", amount, amount));
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package cn.hamster3.currency.command.vault;
|
||||
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
|
||||
@@ -16,6 +17,8 @@ public class VaultTakeCommand extends VaultAdminSetCommand {
|
||||
|
||||
@Override
|
||||
public void doSet(PlayerData data, CurrencyType type, double amount) {
|
||||
data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) - amount);
|
||||
double balance = data.getPlayerCurrency(type.getId()) - amount;
|
||||
data.setPlayerCurrency(type.getId(), balance);
|
||||
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type.getId(), "take", amount, balance));
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package cn.hamster3.currency.core;
|
||||
|
||||
import cn.hamster3.currency.HamsterCurrency;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
@@ -9,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> playerData;
|
||||
private final Map<UUID, PlayerData> playerData;
|
||||
private final HashSet<CurrencyType> currencyTypes;
|
||||
|
||||
public FileDataManager(HamsterCurrency plugin) {
|
||||
this.plugin = plugin;
|
||||
playerData = new HashSet<>();
|
||||
playerData = new ConcurrentHashMap<>();
|
||||
currencyTypes = new HashSet<>();
|
||||
}
|
||||
|
||||
@@ -41,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());
|
||||
}
|
||||
@@ -53,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);
|
||||
@@ -98,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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,25 +108,20 @@ public class FileDataManager implements IDataManager {
|
||||
// 所以这里什么都不做
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertLog(CurrencyLog log) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PlayerData getPlayerData(UUID uuid) {
|
||||
synchronized (playerData) {
|
||||
for (PlayerData data : playerData) {
|
||||
if (uuid.equals(data.getUuid())) {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return playerData.computeIfAbsent(uuid, PlayerData::new);
|
||||
}
|
||||
|
||||
@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;
|
||||
@@ -135,9 +129,7 @@ public class FileDataManager implements IDataManager {
|
||||
|
||||
@Override
|
||||
public ArrayList<PlayerData> getPlayerData() {
|
||||
synchronized (playerData) {
|
||||
return new ArrayList<>(playerData);
|
||||
}
|
||||
return new ArrayList<>(playerData.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -17,7 +17,7 @@ public abstract class FileManager {
|
||||
plugin.reloadConfig();
|
||||
pluginConfig = plugin.getConfig();
|
||||
useBC = pluginConfig.getBoolean("useBC", false);
|
||||
mainServer = pluginConfig.getBoolean("datasource.template");
|
||||
mainServer = pluginConfig.getBoolean("datasource.template", true);
|
||||
setPluginConfig(pluginConfig);
|
||||
}
|
||||
|
||||
@@ -37,8 +37,7 @@ public abstract class FileManager {
|
||||
try {
|
||||
Message.valueOf(key).setMessage(HamsterAPI.replaceColorCode(messagesConfig.getString(key)));
|
||||
} catch (IllegalArgumentException e) {
|
||||
HamsterCurrency.getLogUtils().warning("初始化消息设置 %s 时发生了一个异常: ", key);
|
||||
e.printStackTrace();
|
||||
HamsterCurrency.getLogUtils().error(e, "初始化消息设置 %s 时发生了一个异常: ", key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package cn.hamster3.currency.core;
|
||||
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
|
||||
@@ -42,6 +43,8 @@ public interface IDataManager {
|
||||
*/
|
||||
void savePlayerData(PlayerData data);
|
||||
|
||||
void insertLog(CurrencyLog log);
|
||||
|
||||
PlayerData getPlayerData(UUID uuid);
|
||||
|
||||
PlayerData getPlayerData(String name);
|
||||
|
@@ -2,6 +2,7 @@ package cn.hamster3.currency.core;
|
||||
|
||||
import cn.hamster3.api.HamsterAPI;
|
||||
import cn.hamster3.currency.HamsterCurrency;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
import cn.hamster3.currency.data.CurrencyType;
|
||||
import cn.hamster3.currency.data.PlayerData;
|
||||
import cn.hamster3.service.bukkit.api.ServiceMessageAPI;
|
||||
@@ -12,41 +13,56 @@ import org.bukkit.configuration.InvalidConfigurationException;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.sql.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import static cn.hamster3.currency.HamsterCurrency.getLogUtils;
|
||||
|
||||
public class SQLDataManager implements IDataManager {
|
||||
private final JsonParser parser;
|
||||
private final Connection connection;
|
||||
private final HamsterCurrency plugin;
|
||||
private final HashSet<PlayerData> playerData;
|
||||
private final JsonParser parser;
|
||||
|
||||
private final DataSource datasource;
|
||||
|
||||
private final Map<UUID, PlayerData> playerData;
|
||||
private final HashSet<CurrencyType> currencyTypes;
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
public SQLDataManager(HamsterCurrency plugin) throws SQLException, ClassNotFoundException {
|
||||
this.plugin = plugin;
|
||||
parser = new JsonParser();
|
||||
playerData = new HashSet<>();
|
||||
playerData = new ConcurrentHashMap<>();
|
||||
currencyTypes = new HashSet<>();
|
||||
|
||||
connection = HamsterAPI.getSQLConnection(FileManager.getPluginConfig().getConfigurationSection("datasource"));
|
||||
ConfigurationSection datasourceConfig = FileManager.getPluginConfig().getConfigurationSection("datasource");
|
||||
datasource = HamsterAPI.getHikariDataSource(datasourceConfig);
|
||||
|
||||
Connection connection = datasource.getConnection();
|
||||
Statement statement = connection.createStatement();
|
||||
statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_player_data(" +
|
||||
"uuid VARCHAR(36) PRIMARY KEY," +
|
||||
"data TEXT" +
|
||||
");");
|
||||
"uuid VARCHAR(36) PRIMARY KEY," +
|
||||
"data TEXT" +
|
||||
") CHARACTER SET = utf8mb4;");
|
||||
statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_logs(" +
|
||||
"uuid VARCHAR(36) NOT NULL," +
|
||||
"player_name VARCHAR(36) NOT NULL," +
|
||||
"type VARCHAR(36) NOT NULL," +
|
||||
"action VARCHAR(36) NOT NULL," +
|
||||
"amount DOUBLE NOT NULL," +
|
||||
"balance DOUBLE NOT NULL," +
|
||||
"time DATETIME NOT NULL," +
|
||||
"INDEX idx_uuid(uuid)," +
|
||||
"INDEX idx_name(player_name)" +
|
||||
") CHARACTER SET = utf8mb4;");
|
||||
statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_settings(" +
|
||||
"title VARCHAR(64) PRIMARY KEY," +
|
||||
"data TEXT" +
|
||||
");");
|
||||
"title VARCHAR(64) PRIMARY KEY," +
|
||||
"data TEXT" +
|
||||
") CHARACTER SET = utf8mb4;");
|
||||
|
||||
statement.close();
|
||||
connection.close();
|
||||
}
|
||||
|
||||
public void uploadConfigToSQL() {
|
||||
@@ -56,6 +72,7 @@ public class SQLDataManager implements IDataManager {
|
||||
getLogUtils().info("配置文件重载完成!");
|
||||
try {
|
||||
getLogUtils().info("将配置文件上传至数据库...");
|
||||
Connection connection = datasource.getConnection();
|
||||
Statement statement = connection.createStatement();
|
||||
String data = Base64.getEncoder().encodeToString(config.saveToString().getBytes(StandardCharsets.UTF_8));
|
||||
statement.executeUpdate(String.format(
|
||||
@@ -64,18 +81,20 @@ public class SQLDataManager implements IDataManager {
|
||||
data
|
||||
));
|
||||
statement.close();
|
||||
connection.close();
|
||||
getLogUtils().info("配置文件上传完成!");
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e, "插件上传 pluginConfig 至数据库时遇到了一个异常: ");
|
||||
}
|
||||
loadConfig(config);
|
||||
ServiceMessageAPI.sendMessage("HamsterCurrency", "uploadConfigToSQL");
|
||||
ServiceMessageAPI.sendServiceMessage("HamsterCurrency", "uploadConfigToSQL");
|
||||
}
|
||||
|
||||
@SuppressWarnings("SwitchStatementWithTooFewBranches")
|
||||
public void loadConfigFromSQL() {
|
||||
try {
|
||||
getLogUtils().info("从数据库中下载配置文件...");
|
||||
Connection connection = datasource.getConnection();
|
||||
Statement statement = connection.createStatement();
|
||||
ResultSet set = statement.executeQuery("SELECT * FROM hamster_currency_settings;");
|
||||
while (set.next()) {
|
||||
@@ -94,13 +113,13 @@ public class SQLDataManager implements IDataManager {
|
||||
}
|
||||
}
|
||||
statement.close();
|
||||
connection.close();
|
||||
getLogUtils().info("配置文件下载完成!");
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e, "插件从数据库中下载 pluginConfig 时遇到了一个异常: ");
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
private void loadConfig(FileConfiguration config) {
|
||||
getLogUtils().info("加载配置文件...");
|
||||
currencyTypes.clear();
|
||||
@@ -127,36 +146,36 @@ public class SQLDataManager implements IDataManager {
|
||||
getLogUtils().info("玩家经济列名: %s", moneyCol);
|
||||
getLogUtils().info("导入至经济类型: %s", currencyType);
|
||||
try {
|
||||
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 hamster_currency_player_data VALUES('%s', '%s');",
|
||||
"REPLACE INTO " + database + ".hamster_currency_player_data VALUES('%s', '%s');",
|
||||
data.getUuid().toString(),
|
||||
data.saveToJson().toString()
|
||||
));
|
||||
getLogUtils().info("已保存玩家 %s 的存档数据.", data.getUuid());
|
||||
ServiceMessageAPI.sendMessage("HamsterCurrency", "savedPlayerData", data.getUuid().toString());
|
||||
ServiceMessageAPI.sendServiceMessage("HamsterCurrency", "savedPlayerData", data.getUuid().toString());
|
||||
}
|
||||
statement.close();
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e, "从其他插件中导入数据时发生了一个异常:");
|
||||
}
|
||||
@@ -167,22 +186,22 @@ public class SQLDataManager implements IDataManager {
|
||||
public void onEnable() {
|
||||
getLogUtils().info("从数据库中读取玩家数据...");
|
||||
try {
|
||||
Connection connection = datasource.getConnection();
|
||||
Statement statement = connection.createStatement();
|
||||
ResultSet set = statement.executeQuery("SELECT * FROM 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();
|
||||
statement.close();
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e, "从数据库中读取玩家数据时出现了一个异常:");
|
||||
}
|
||||
@@ -207,12 +226,13 @@ public class SQLDataManager implements IDataManager {
|
||||
|
||||
@Override
|
||||
public void reloadConfig() {
|
||||
ServiceMessageAPI.sendMessage("HamsterCurrency", "reload");
|
||||
ServiceMessageAPI.sendServiceMessage("HamsterCurrency", "reload");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadPlayerData(UUID uuid) {
|
||||
try {
|
||||
Connection connection = datasource.getConnection();
|
||||
Statement statement = connection.createStatement();
|
||||
ResultSet set = statement.executeQuery(String.format(
|
||||
"SELECT * FROM hamster_currency_player_data WHERE uuid='%s';",
|
||||
@@ -232,12 +252,11 @@ 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();
|
||||
getLogUtils().info("已加载玩家 %s 的存档数据.", data.getUuid());
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e, "加载玩家 %s 的存档数据时出错!", uuid);
|
||||
@@ -246,47 +265,60 @@ public class SQLDataManager implements IDataManager {
|
||||
|
||||
@Override
|
||||
public void savePlayerData(PlayerData data) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin,
|
||||
() -> {
|
||||
try {
|
||||
Statement statement = connection.createStatement();
|
||||
statement.executeUpdate(String.format(
|
||||
"REPLACE INTO hamster_currency_player_data VALUES('%s', '%s');",
|
||||
data.getUuid().toString(),
|
||||
data.saveToJson().toString()
|
||||
));
|
||||
statement.close();
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e, "保存玩家 %s 的存档数据时出错!", data.getUuid());
|
||||
}
|
||||
getLogUtils().info("已保存玩家 %s 的存档数据.", data.getUuid());
|
||||
ServiceMessageAPI.sendMessage(
|
||||
"HamsterCurrency",
|
||||
"savedPlayerData",
|
||||
data.getUuid().toString()
|
||||
);
|
||||
});
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
try {
|
||||
Connection connection = datasource.getConnection();
|
||||
Statement statement = connection.createStatement();
|
||||
statement.executeUpdate(String.format(
|
||||
"REPLACE INTO hamster_currency_player_data VALUES('%s', '%s');",
|
||||
data.getUuid().toString(),
|
||||
data.saveToJson().toString()
|
||||
));
|
||||
statement.close();
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e, "保存玩家 %s 的存档数据时出错!", data.getUuid());
|
||||
}
|
||||
getLogUtils().info("已保存玩家 %s 的存档数据.", data.getUuid());
|
||||
ServiceMessageAPI.sendServiceMessage(
|
||||
"HamsterCurrency",
|
||||
"savedPlayerData",
|
||||
data.getUuid().toString()
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertLog(CurrencyLog log) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
try (Connection connection = datasource.getConnection()) {
|
||||
try (PreparedStatement statement = connection.prepareStatement(
|
||||
"INSERT INTO hamster_currency_logs VALUES(?, ?, ?, ?, ?, ?, NOW());"
|
||||
)) {
|
||||
statement.setString(1, log.getUuid().toString());
|
||||
statement.setString(2, log.getPlayerName());
|
||||
statement.setString(3, log.getType());
|
||||
statement.setString(4, log.getAction());
|
||||
statement.setDouble(5, log.getAmount());
|
||||
statement.setDouble(6, log.getBalance());
|
||||
statement.executeUpdate();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
getLogUtils().error(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public PlayerData getPlayerData(UUID uuid) {
|
||||
synchronized (playerData) {
|
||||
for (PlayerData data : playerData) {
|
||||
if (uuid.equals(data.getUuid())) {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return playerData.computeIfAbsent(uuid, PlayerData::new);
|
||||
}
|
||||
|
||||
@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;
|
||||
@@ -294,9 +326,7 @@ public class SQLDataManager implements IDataManager {
|
||||
|
||||
@Override
|
||||
public ArrayList<PlayerData> getPlayerData() {
|
||||
synchronized (playerData) {
|
||||
return new ArrayList<>(playerData);
|
||||
}
|
||||
return new ArrayList<>(playerData.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -0,0 +1,63 @@
|
||||
package cn.hamster3.currency.data;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class CurrencyLog {
|
||||
@NotNull
|
||||
private final UUID uuid;
|
||||
@NotNull
|
||||
private final String playerName;
|
||||
/**
|
||||
* 货币类型
|
||||
*/
|
||||
@NotNull
|
||||
private final String type;
|
||||
/**
|
||||
* 执行的操作
|
||||
*/
|
||||
@NotNull
|
||||
private final String action;
|
||||
/**
|
||||
* 执行操作的数额
|
||||
*/
|
||||
private final double amount;
|
||||
/**
|
||||
* 执行操作后的余额
|
||||
*/
|
||||
private final double balance;
|
||||
|
||||
public CurrencyLog(@NotNull UUID uuid, @NotNull String playerName, @NotNull String type, @NotNull String action, double amount, double balance) {
|
||||
this.uuid = uuid;
|
||||
this.playerName = playerName;
|
||||
this.type = type;
|
||||
this.action = action;
|
||||
this.amount = amount;
|
||||
this.balance = balance;
|
||||
}
|
||||
|
||||
public @NotNull UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public @NotNull String getPlayerName() {
|
||||
return playerName;
|
||||
}
|
||||
|
||||
public @NotNull String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public @NotNull String getAction() {
|
||||
return action;
|
||||
}
|
||||
|
||||
public double getAmount() {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public double getBalance() {
|
||||
return balance;
|
||||
}
|
||||
}
|
@@ -1,5 +1,6 @@
|
||||
package cn.hamster3.currency.data;
|
||||
|
||||
import cn.hamster3.service.bukkit.api.ServiceInfoAPI;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import org.bukkit.Bukkit;
|
||||
@@ -30,14 +31,12 @@ public class PlayerData {
|
||||
|
||||
public PlayerData(JsonObject object) {
|
||||
uuid = UUID.fromString(object.get("uuid").getAsString());
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
||||
if (player.getName() != null) {
|
||||
playerName = player.getName();
|
||||
} else if (object.has("playerName") && !object.get("playerName").isJsonNull()) {
|
||||
if (object.has("playerName")) {
|
||||
playerName = object.get("playerName").getAsString();
|
||||
} else {
|
||||
playerName = null;
|
||||
playerName = ServiceInfoAPI.getPlayerInfo(uuid).getPlayerName();
|
||||
}
|
||||
|
||||
playerCurrencies = new HashMap<>();
|
||||
JsonObject playerCurrenciesJson = object.getAsJsonObject("playerCurrencies");
|
||||
for (Map.Entry<String, JsonElement> entry : playerCurrenciesJson.entrySet()) {
|
||||
@@ -45,14 +44,13 @@ public class PlayerData {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
public PlayerData(ConfigurationSection config) {
|
||||
uuid = UUID.fromString(config.getString("uuid"));
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
||||
if (player.getName() != null) {
|
||||
playerName = player.getName();
|
||||
} else {
|
||||
playerName = config.getString("playerName");
|
||||
playerName = config.getString("playerName").replace("\\'", "'");
|
||||
}
|
||||
playerCurrencies = new HashMap<>();
|
||||
ConfigurationSection playerCurrenciesConfig = config.getConfigurationSection("playerCurrencies");
|
||||
|
@@ -0,0 +1,63 @@
|
||||
package cn.hamster3.currency.event;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class CurrencyChangeEvent extends Event {
|
||||
private static final HandlerList handlerList = new HandlerList();
|
||||
@NotNull
|
||||
private final UUID playerUUID;
|
||||
@NotNull
|
||||
private final String currencyID;
|
||||
private final double oldAmount;
|
||||
private final double newAmount;
|
||||
|
||||
public CurrencyChangeEvent(@NotNull UUID playerUUID, @NotNull String currencyID, double oldAmount, double newAmount) {
|
||||
super(true);
|
||||
this.playerUUID = playerUUID;
|
||||
this.currencyID = currencyID;
|
||||
this.oldAmount = oldAmount;
|
||||
this.newAmount = newAmount;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlerList;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public UUID getPlayerUUID() {
|
||||
return playerUUID;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getCurrencyID() {
|
||||
return currencyID;
|
||||
}
|
||||
|
||||
public double getOldAmount() {
|
||||
return oldAmount;
|
||||
}
|
||||
|
||||
public double getNewAmount() {
|
||||
return newAmount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return handlerList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CurrencyChangeEvent{" +
|
||||
"playerUUID=" + playerUUID +
|
||||
", currencyID='" + currencyID + '\'' +
|
||||
", oldAmount=" + oldAmount +
|
||||
", newAmount=" + newAmount +
|
||||
'}';
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -3,22 +3,23 @@ package cn.hamster3.currency.hook;
|
||||
import cn.hamster3.currency.core.FileManager;
|
||||
import cn.hamster3.currency.core.IDataManager;
|
||||
import cn.hamster3.currency.core.Message;
|
||||
import cn.hamster3.currency.data.CurrencyLog;
|
||||
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.EconomyResponse;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class VaultEconomyHook extends AbstractEconomy {
|
||||
private static final EconomyResponse NOT_IMPLEMENTED_RESPONSE =
|
||||
new EconomyResponse(
|
||||
0,
|
||||
0,
|
||||
EconomyResponse.ResponseType.NOT_IMPLEMENTED,
|
||||
"HamsterCurrency未实现该功能~"
|
||||
);
|
||||
private static final EconomyResponse NOT_IMPLEMENTED_RESPONSE = new EconomyResponse(
|
||||
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "HamsterCurrency未实现该功能~"
|
||||
);
|
||||
private final IDataManager dataManager;
|
||||
|
||||
public VaultEconomyHook(IDataManager dataManager) {
|
||||
@@ -30,12 +31,20 @@ public class VaultEconomyHook extends AbstractEconomy {
|
||||
return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家账户不存在");
|
||||
}
|
||||
String type = FileManager.getVaultCurrencyType();
|
||||
if (data.getPlayerCurrency(type) > 0 && data.getPlayerCurrency(type) + amount < 0) {
|
||||
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;
|
||||
if (data.getPlayerCurrency(type) > 0 && balance < 0) {
|
||||
return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家金额超出上限");
|
||||
}
|
||||
data.setPlayerCurrency(type, data.getPlayerCurrency(type) + amount);
|
||||
data.setPlayerCurrency(type, balance);
|
||||
dataManager.savePlayerData(data);
|
||||
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, "");
|
||||
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type, "add", amount, balance));
|
||||
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, null);
|
||||
}
|
||||
|
||||
protected EconomyResponse withdrawPlayer(PlayerData data, double amount) {
|
||||
@@ -43,26 +52,37 @@ public class VaultEconomyHook extends AbstractEconomy {
|
||||
return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家账户不存在");
|
||||
}
|
||||
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) {
|
||||
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.FAILURE, "余额不足");
|
||||
}
|
||||
data.setPlayerCurrency(type, data.getPlayerCurrency(type) - amount);
|
||||
double balance = data.getPlayerCurrency(type) - amount;
|
||||
data.setPlayerCurrency(type, balance);
|
||||
dataManager.savePlayerData(data);
|
||||
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, "扣款成功");
|
||||
dataManager.insertLog(new CurrencyLog(data.getUuid(), data.getPlayerName(), type, "take", amount, balance));
|
||||
return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, null);
|
||||
}
|
||||
|
||||
private boolean has(PlayerData data, double amount) {
|
||||
if (data == null) {
|
||||
return false;
|
||||
}
|
||||
return data.getPlayerCurrency(FileManager.getVaultCurrencyType()) >= amount;
|
||||
return getBalance(data) >= amount;
|
||||
}
|
||||
|
||||
private double getBalance(PlayerData data) {
|
||||
if (data == null) {
|
||||
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
|
||||
|
@@ -6,18 +6,9 @@ useBC: true
|
||||
# 若开启跨服模式,则需要配置datasource
|
||||
datasource:
|
||||
driver: "com.mysql.jdbc.Driver"
|
||||
url: "jdbc:mysql://test3.hamster3.cn:3306?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false"
|
||||
user: Test
|
||||
password: Test123..
|
||||
database: Test
|
||||
# 是否将这个服务器的配置文件设为模板
|
||||
# 若设为true,config将会在服务器启动时自动上传至数据库
|
||||
# 其他template为false的服务器将会在启动和重载时自动从数据库上下载config
|
||||
# 可以节省一些config配置时的麻烦事情
|
||||
# 但是请先保证template为true的服务器完全启动了再启动子服
|
||||
# 如果觉得这样反而更麻烦,也可以直接把所有服务器的template设为true
|
||||
# 这样每个服务器都会使用自己本地的config文件了
|
||||
template: true
|
||||
url: "jdbc:mysql://localhost:3306/mc1.12.2-germ?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true"
|
||||
user: root
|
||||
password: Root123...
|
||||
|
||||
currencyTypes:
|
||||
# 货币ID
|
||||
|
@@ -12,7 +12,7 @@ depend:
|
||||
- HamsterAPI
|
||||
|
||||
softdepend:
|
||||
- HasmterService-Bukkit
|
||||
- HamsterService-Bukkit
|
||||
- PlaceholderAPI
|
||||
- PlayerPoints
|
||||
- Vault
|
||||
@@ -38,9 +38,11 @@ permissions:
|
||||
default: op
|
||||
currency.set:
|
||||
default: op
|
||||
currency.look:
|
||||
currency.reload:
|
||||
default: op
|
||||
currency.see:
|
||||
default: true
|
||||
currency.look.other:
|
||||
currency.see.other:
|
||||
default: op
|
||||
currency.top:
|
||||
default: op
|
||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
BIN
libs/PlayerPoints-2.1.3.jar
Normal file
BIN
libs/PlayerPoints-2.1.3.jar
Normal file
Binary file not shown.
@@ -1,4 +1,5 @@
|
||||
rootProject.name = 'HamsterCurrency-Parent'
|
||||
include 'currency-plugin'
|
||||
include 'transform-essentials'
|
||||
include 'transform-CMI'
|
||||
|
||||
|
44
transform-CMI/build.gradle
Normal file
44
transform-CMI/build.gradle
Normal file
@@ -0,0 +1,44 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group 'cn.hamster3'
|
||||
version '1.0.0-SNAPSHOT'
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url = "https://maven.airgame.net/maven-public/"
|
||||
}
|
||||
}
|
||||
|
||||
configurations {
|
||||
implementationShade
|
||||
implementation.extendsFrom implementationShade
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// https://mvnrepository.com/artifact/com.google.code.gson/gson
|
||||
implementationShade group: 'com.google.code.gson', name: 'gson', version: '2.8.8'
|
||||
// https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc
|
||||
implementationShade group: 'org.xerial', name: 'sqlite-jdbc', version: '3.36.0.3'
|
||||
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
|
||||
implementationShade group: 'mysql', name: 'mysql-connector-java', version: '8.0.26'
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
jar {
|
||||
archivesBaseName = "HamsterCurrency-Transform-CMI"
|
||||
manifest.attributes('Main-Class': 'cn.hamster3.transform.cmi.Main')
|
||||
from([
|
||||
configurations.implementationShade.collect {
|
||||
it.isDirectory() ? it : zipTree(it)
|
||||
},
|
||||
rootProject.file("LICENSE")
|
||||
])
|
||||
duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
|
||||
destinationDir(rootProject.buildDir)
|
||||
}
|
114
transform-CMI/src/main/java/cn/hamster3/transform/cmi/Main.java
Normal file
114
transform-CMI/src/main/java/cn/hamster3/transform/cmi/Main.java
Normal file
@@ -0,0 +1,114 @@
|
||||
package cn.hamster3.transform.cmi;
|
||||
|
||||
import cn.hamster3.transform.cmi.data.PlayerData;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.*;
|
||||
import java.util.HashSet;
|
||||
import java.util.Scanner;
|
||||
import java.util.UUID;
|
||||
|
||||
public class Main {
|
||||
private static final HashSet<PlayerData> playerData = new HashSet<>();
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.println("请输入 cmi 数据库路径:");
|
||||
String databasePath = scanner.nextLine();
|
||||
System.out.println("请输入数据库主机名: ");
|
||||
String host = scanner.nextLine();
|
||||
System.out.println("请输入数据库端口号: ");
|
||||
String port = scanner.nextLine();
|
||||
System.out.println("请输入数据库用户名: ");
|
||||
String user = scanner.nextLine();
|
||||
System.out.println("请输入数据库密码: ");
|
||||
String password = scanner.nextLine();
|
||||
System.out.println("请输入数据库库名: ");
|
||||
String database = scanner.nextLine();
|
||||
|
||||
File databaseFile = new File(databasePath);
|
||||
System.out.println("开始读取 CMI 数据.");
|
||||
scanData(databaseFile);
|
||||
System.out.println("开始保存数据到 HamsterCurrency 中.");
|
||||
uploadData(host, port, user, password, database);
|
||||
System.out.printf("数据保存完成,共计转移了 %d 个玩家数据存档.%n", playerData.size());
|
||||
}
|
||||
|
||||
private static void scanData(File database) throws ClassNotFoundException, SQLException {
|
||||
System.out.println("加载 sqlite 数据库驱动...");
|
||||
Class.forName("org.sqlite.JDBC");
|
||||
System.out.println("建立 sqlite 数据库连接...");
|
||||
Connection connection = DriverManager.getConnection("jdbc:sqlite://" + database.getAbsolutePath());
|
||||
Statement statement = connection.createStatement();
|
||||
ResultSet set = statement.executeQuery("SELECT player_uuid, username, Balance FROM main.users;");
|
||||
while (set.next()) {
|
||||
try {
|
||||
UUID uuid = UUID.fromString(set.getString("player_uuid"));
|
||||
String username = set.getString("username");
|
||||
PlayerData data = getPlayerData(uuid, username);
|
||||
double balance = set.getDouble("Balance");
|
||||
if (data.getPlayerCurrency("金币") >= balance) {
|
||||
System.out.printf("跳过 %s(%s) 的存档: %.2f >= %.2f金币%n", uuid, username,
|
||||
data.getPlayerCurrency("金币"),
|
||||
balance);
|
||||
continue;
|
||||
}
|
||||
data.setPlayerCurrency("金币", balance);
|
||||
System.out.printf("已加载 %s(%s) 的存档: %.2f金币%n", uuid, username, balance);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
statement.close();
|
||||
connection.close();
|
||||
System.out.printf("已加载 %d 个玩家的数据存档.%n", playerData.size());
|
||||
}
|
||||
|
||||
private static void uploadData(String host, String port, String user, String password, String database) throws ClassNotFoundException, SQLException {
|
||||
System.out.println("加载 MySQL 数据库驱动...");
|
||||
Class.forName("com.mysql.cj.jdbc.Driver");
|
||||
System.out.println("建立 MySQL 数据库连接...");
|
||||
Connection connection = DriverManager.getConnection(
|
||||
"jdbc:mysql://" + host + ":" + port + "?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false",
|
||||
user,
|
||||
password
|
||||
);
|
||||
Statement statement = connection.createStatement();
|
||||
System.out.println("切换至数据库...");
|
||||
statement.execute(String.format("CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET ='UTF8';", database));
|
||||
statement.execute(String.format("USE %s;", database));
|
||||
System.out.println("检查数据表...");
|
||||
statement.execute("CREATE TABLE IF NOT EXISTS hamster_currency_player_data(" +
|
||||
"uuid VARCHAR(36) PRIMARY KEY," +
|
||||
"data TEXT" +
|
||||
");");
|
||||
System.out.println("开始更新数据库...");
|
||||
for (PlayerData data : playerData) {
|
||||
String sql = String.format(
|
||||
"REPLACE INTO hamster_currency_player_data VALUES('%s', '%s');",
|
||||
data.getUuid().toString(),
|
||||
data.saveToJson().toString().replace("'", "\\'")
|
||||
);
|
||||
try {
|
||||
statement.executeUpdate(sql);
|
||||
} catch (SQLException e) {
|
||||
System.out.println("执行 sql " + sql + " 时遇到了一个异常:");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
statement.close();
|
||||
connection.close();
|
||||
}
|
||||
|
||||
private static PlayerData getPlayerData(UUID uuid, String name) {
|
||||
for (PlayerData data : playerData) {
|
||||
if (data.getUuid().equals(uuid)) {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
PlayerData data = new PlayerData(uuid, name);
|
||||
playerData.add(data);
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,44 @@
|
||||
package cn.hamster3.transform.cmi.data;
|
||||
|
||||
/**
|
||||
* 货币类型
|
||||
*/
|
||||
public class CurrencyType {
|
||||
/**
|
||||
* 货币识别符
|
||||
*/
|
||||
private final String id;
|
||||
/**
|
||||
* 是否允许转账
|
||||
*/
|
||||
private final boolean canTransfer;
|
||||
|
||||
public CurrencyType(String id, boolean canTransfer) {
|
||||
this.id = id;
|
||||
this.canTransfer = canTransfer;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
|
||||
public boolean isCanTransfer() {
|
||||
return canTransfer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
CurrencyType that = (CurrencyType) o;
|
||||
|
||||
return id.equalsIgnoreCase(that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id.hashCode();
|
||||
}
|
||||
}
|
@@ -0,0 +1,63 @@
|
||||
package cn.hamster3.transform.cmi.data;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public class PlayerData {
|
||||
private final UUID uuid;
|
||||
private final String playerName;
|
||||
private final HashMap<String, Double> playerCurrencies;
|
||||
|
||||
public PlayerData(UUID uuid, String playerName) {
|
||||
this.uuid = uuid;
|
||||
this.playerName = playerName;
|
||||
playerCurrencies = new HashMap<>();
|
||||
}
|
||||
|
||||
|
||||
public JsonObject saveToJson() {
|
||||
JsonObject object = new JsonObject();
|
||||
object.addProperty("uuid", uuid.toString());
|
||||
object.addProperty("playerName", playerName);
|
||||
JsonObject playerCurrenciesJson = new JsonObject();
|
||||
for (Map.Entry<String, Double> entry : playerCurrencies.entrySet()) {
|
||||
playerCurrenciesJson.addProperty(entry.getKey(), entry.getValue());
|
||||
}
|
||||
object.add("playerCurrencies", playerCurrenciesJson);
|
||||
return object;
|
||||
}
|
||||
|
||||
public UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public String getPlayerName() {
|
||||
return playerName;
|
||||
}
|
||||
|
||||
public void setPlayerCurrency(String type, double amount) {
|
||||
playerCurrencies.put(type, amount);
|
||||
}
|
||||
|
||||
public double getPlayerCurrency(String type) {
|
||||
return playerCurrencies.getOrDefault(type, 0D);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
PlayerData that = (PlayerData) o;
|
||||
|
||||
return uuid.equals(that.uuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return uuid.hashCode();
|
||||
}
|
||||
}
|
@@ -7,12 +7,11 @@ version '1.0.0-SNAPSHOT'
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url = "https://maven.airgame.net/repository/maven-public/"
|
||||
url = "https://maven.airgame.net/maven-public/"
|
||||
}
|
||||
}
|
||||
|
||||
configurations {
|
||||
|
||||
implementationShade
|
||||
implementation.extendsFrom implementationShade
|
||||
}
|
||||
|
@@ -49,7 +49,6 @@ public class Main {
|
||||
System.out.println("加载 MySQL 数据库驱动...");
|
||||
Class.forName("com.mysql.cj.jdbc.Driver");
|
||||
System.out.println("建立 MySQL 数据库连接...");
|
||||
|
||||
Connection connection = DriverManager.getConnection(
|
||||
"jdbc:mysql://" + host + ":" + port + "?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false",
|
||||
user,
|
||||
|
Reference in New Issue
Block a user