1.3.6
This commit is contained in:
parent
fb7ef81d99
commit
d1fc0be07f
|
@ -13,6 +13,7 @@ import com.yaohun.demonskills.gui.SkillsGui;
|
||||||
import com.yaohun.demonskills.listener.PlayerListener;
|
import com.yaohun.demonskills.listener.PlayerListener;
|
||||||
import com.yaohun.demonskills.listener.SkillKeyListener;
|
import com.yaohun.demonskills.listener.SkillKeyListener;
|
||||||
import com.yaohun.demonskills.manage.PlayerManager;
|
import com.yaohun.demonskills.manage.PlayerManager;
|
||||||
|
import com.yaohun.demonskills.util.AsyncPlayerDataSaver;
|
||||||
import com.yaohun.demonskills.util.CDTimeAPI;
|
import com.yaohun.demonskills.util.CDTimeAPI;
|
||||||
import me.Demon.DemonPlugin.DemonAPI;
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
@ -49,6 +50,8 @@ public class SkillsMain extends JavaPlugin {
|
||||||
}
|
}
|
||||||
Bukkit.getConsoleSender().sendMessage("§b[魂式技能] §a插件成功载入Server!");
|
Bukkit.getConsoleSender().sendMessage("§b[魂式技能] §a插件成功载入Server!");
|
||||||
Bukkit.getConsoleSender().sendMessage("§b[魂式技能] §a妖魂QQ: §b1763917516");
|
Bukkit.getConsoleSender().sendMessage("§b[魂式技能] §a妖魂QQ: §b1763917516");
|
||||||
|
|
||||||
|
new AsyncPlayerDataSaver(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
package com.yaohun.demonskills.data;
|
package com.yaohun.demonskills.data;
|
||||||
|
|
||||||
|
import com.yaohun.demonskills.SkillsMain;
|
||||||
import com.yaohun.demonskills.core.Skill;
|
import com.yaohun.demonskills.core.Skill;
|
||||||
import me.Demon.DemonPlugin.DemonAPI;
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
import me.Demon.DemonPlugin.data.NbtItem;
|
import me.Demon.DemonPlugin.data.NbtItem;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
@ -11,6 +13,7 @@ import org.bukkit.inventory.ItemStack;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class PlayerData {
|
public class PlayerData {
|
||||||
|
|
||||||
|
@ -60,20 +63,38 @@ public class PlayerData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SavePlayerData(){
|
public void SavePlayerData() {
|
||||||
this.configuration.set("Magic",this.magicMax);
|
// ✅ 1. 主线程内抓取快照,避免异步直接访问成员变量
|
||||||
this.configuration.set("KeyBoard",null);
|
int magicMaxSnapshot = this.magicMax;
|
||||||
for (Integer keyBoard : keyBoardStackMap.keySet()) {
|
|
||||||
ItemStack keyBoardStack = keyBoardStackMap.get(keyBoard);
|
// 复制键盘映射(注意深拷贝 ItemStack)
|
||||||
this.configuration.set("KeyBoard."+keyBoard,keyBoardStack);
|
Map<Integer, ItemStack> keyboardSnapshot = new HashMap<>();
|
||||||
}
|
for (Map.Entry<Integer, ItemStack> entry : this.keyBoardStackMap.entrySet()) {
|
||||||
try {
|
keyboardSnapshot.put(entry.getKey(), entry.getValue().clone());
|
||||||
this.configuration.save(this.file);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建配置快照
|
||||||
|
File fileSnapshot = this.file;
|
||||||
|
YamlConfiguration configSnapshot = new YamlConfiguration();
|
||||||
|
|
||||||
|
// ✅ 2. 异步保存,使用快照对象,避免线程冲突
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(SkillsMain.inst(), () -> {
|
||||||
|
configSnapshot.set("Magic", magicMaxSnapshot);
|
||||||
|
configSnapshot.set("KeyBoard", null);
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, ItemStack> entry : keyboardSnapshot.entrySet()) {
|
||||||
|
configSnapshot.set("KeyBoard." + entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
configSnapshot.save(fileSnapshot);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getPlayerName() {
|
public String getPlayerName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package com.yaohun.demonskills.listener;
|
package com.yaohun.demonskills.listener;
|
||||||
|
|
||||||
|
import com.yaohun.demonskills.SkillsMain;
|
||||||
import com.yaohun.demonskills.gui.SkillsGui;
|
import com.yaohun.demonskills.gui.SkillsGui;
|
||||||
|
import com.yaohun.demonskills.manage.PlayerManager;
|
||||||
import com.yaohun.demonskills.util.CDTimeAPI;
|
import com.yaohun.demonskills.util.CDTimeAPI;
|
||||||
import eos.moe.dragoncore.api.event.KeyPressEvent;
|
import eos.moe.dragoncore.api.event.KeyPressEvent;
|
||||||
import eos.moe.dragoncore.api.event.KeyReleaseEvent;
|
import eos.moe.dragoncore.api.event.KeyReleaseEvent;
|
||||||
|
@ -17,8 +19,10 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.inventory.EquipmentSlot;
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.serverct.ersha.jd.S;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@ -65,4 +69,12 @@ public class PlayerListener implements Listener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuieSave(PlayerQuitEvent e){
|
||||||
|
Player player = e.getPlayer();
|
||||||
|
String playerName = player.getName();
|
||||||
|
PlayerManager playerManager = SkillsMain.getPlayerManager();
|
||||||
|
playerManager.getPlayerData(playerName).SavePlayerData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.yaohun.demonskills.util;
|
||||||
|
|
||||||
|
import com.yaohun.demonskills.SkillsMain;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AsyncPlayerDataSaver {
|
||||||
|
|
||||||
|
private final SkillsMain plugin;
|
||||||
|
private final int batchSize = 5;
|
||||||
|
private final int delayBetweenBatches = 20; // 每批延迟1秒(20tick)
|
||||||
|
|
||||||
|
public AsyncPlayerDataSaver(SkillsMain plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
startAutoSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startAutoSave() {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
List<Player> onlinePlayers = new ArrayList<>(Bukkit.getOnlinePlayers());
|
||||||
|
if (onlinePlayers.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int total = onlinePlayers.size();
|
||||||
|
int batches = (int) Math.ceil((double) total / batchSize);
|
||||||
|
|
||||||
|
for (int i = 0; i < batches; i++) {
|
||||||
|
final int batchIndex = i;
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int start = batchIndex * batchSize;
|
||||||
|
int end = Math.min(start + batchSize, total);
|
||||||
|
|
||||||
|
for (int j = start; j < end; j++) {
|
||||||
|
Player p = onlinePlayers.get(j);
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(SkillsMain.inst(), () -> {
|
||||||
|
savePlayerData(p); // 你的保存方法(异步安全)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskLater(SkillsMain.inst(), (long) delayBetweenBatches * i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(SkillsMain.inst(), 20 * 60 * 10, 20 * 60 * 10); // 每5分钟执行一次
|
||||||
|
}
|
||||||
|
|
||||||
|
private void savePlayerData(Player player) {
|
||||||
|
// TODO: 将你的数据写入YAML或数据库
|
||||||
|
// 注意线程安全,例如避免直接操作 Bukkit API,只处理内存数据快照
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
name: DemonSkills
|
name: DemonSkills
|
||||||
main: com.yaohun.demonskills.SkillsMain
|
main: com.yaohun.demonskills.SkillsMain
|
||||||
version: 1.3.4
|
version: 1.3.6
|
||||||
depend:
|
depend:
|
||||||
- DemonAPI
|
- DemonAPI
|
||||||
commands:
|
commands:
|
||||||
dskills:
|
dskills:
|
||||||
castskill:
|
castskill:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user