2026-02-13 18:50:05 +08:00
|
|
|
|
package com.playerblocklife;
|
|
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
import org.bukkit.Bukkit;
|
2026-02-13 18:50:05 +08:00
|
|
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
2026-02-13 20:56:03 +08:00
|
|
|
|
|
2026-02-13 18:50:05 +08:00
|
|
|
|
import java.util.logging.Level;
|
|
|
|
|
|
|
|
|
|
|
|
public class PlayerBlockLife extends JavaPlugin {
|
|
|
|
|
|
private static PlayerBlockLife instance;
|
|
|
|
|
|
private PlayerBlockManager blockManager;
|
|
|
|
|
|
private SkinManager skinManager;
|
|
|
|
|
|
private LifeSystem lifeSystem;
|
|
|
|
|
|
private ConfigManager configManager;
|
2026-02-13 22:03:17 +08:00
|
|
|
|
private MessageManager messageManager;
|
2026-02-13 18:50:05 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void onEnable() {
|
|
|
|
|
|
instance = this;
|
2026-02-13 20:56:03 +08:00
|
|
|
|
|
|
|
|
|
|
// 第一步:保存默认配置
|
2026-02-13 18:50:05 +08:00
|
|
|
|
saveDefaultConfig();
|
|
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 第二步:初始化管理器(注意顺序!)
|
2026-02-13 18:50:05 +08:00
|
|
|
|
this.configManager = new ConfigManager(this);
|
2026-02-13 22:03:17 +08:00
|
|
|
|
this.messageManager = new MessageManager(this);
|
2026-02-13 18:50:05 +08:00
|
|
|
|
this.skinManager = new SkinManager(this);
|
|
|
|
|
|
this.blockManager = new PlayerBlockManager(this, skinManager);
|
|
|
|
|
|
this.lifeSystem = new LifeSystem(this);
|
|
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 第三步:加载数据(必须在管理器初始化之后)
|
|
|
|
|
|
this.configManager.loadConfig();
|
2026-02-13 22:03:17 +08:00
|
|
|
|
this.messageManager.loadMessages();
|
2026-02-13 20:56:03 +08:00
|
|
|
|
|
|
|
|
|
|
// 第四步:注册事件监听器
|
2026-02-13 18:50:05 +08:00
|
|
|
|
getServer().getPluginManager().registerEvents(new BlockBreakListener(this), this);
|
|
|
|
|
|
getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this);
|
|
|
|
|
|
getServer().getPluginManager().registerEvents(new PlayerQuitListener(this), this);
|
|
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 第五步:注册命令
|
2026-02-13 18:50:05 +08:00
|
|
|
|
getCommand("setlifeblocks").setExecutor(new SetLifeBlocksCommand(this));
|
|
|
|
|
|
getCommand("checklifeblocks").setExecutor(new CheckLifeBlocksCommand(this));
|
|
|
|
|
|
getCommand("pblreload").setExecutor(new AdminCommands(this));
|
|
|
|
|
|
getCommand("pbldelete").setExecutor(new AdminCommands(this));
|
2026-02-13 20:56:03 +08:00
|
|
|
|
getCommand("pblrevive").setExecutor(new AdminCommands(this));
|
|
|
|
|
|
getCommand("pblstats").setExecutor(new AdminCommands(this));
|
2026-02-13 18:50:05 +08:00
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 第六步:加载其他数据
|
2026-02-13 18:50:05 +08:00
|
|
|
|
blockManager.loadData();
|
|
|
|
|
|
skinManager.loadAllSkins();
|
|
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 第七步:启动定时任务
|
2026-02-13 18:50:05 +08:00
|
|
|
|
startScheduler();
|
|
|
|
|
|
|
|
|
|
|
|
getLogger().info("§a========================================");
|
|
|
|
|
|
getLogger().info("§ePlayerBlockLife v" + getDescription().getVersion() + " 已启用");
|
|
|
|
|
|
getLogger().info("§e作者: " + getDescription().getAuthors());
|
|
|
|
|
|
getLogger().info("§a========================================");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void onDisable() {
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 保存数据
|
2026-02-13 18:50:05 +08:00
|
|
|
|
if (blockManager != null) {
|
|
|
|
|
|
blockManager.saveData();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (skinManager != null) {
|
|
|
|
|
|
skinManager.saveSkinData();
|
|
|
|
|
|
}
|
|
|
|
|
|
getLogger().info("§cPlayerBlockLife 插件已禁用");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 重写 reloadConfig 方法,避免循环依赖
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void reloadConfig() {
|
|
|
|
|
|
// 只调用父类的reloadConfig,不调用configManager的方法
|
|
|
|
|
|
super.reloadConfig();
|
|
|
|
|
|
getLogger().info("基础配置文件已重新加载");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 插件的完整重载方法(用于命令)
|
|
|
|
|
|
*/
|
|
|
|
|
|
public void reloadPluginConfig() {
|
|
|
|
|
|
if (configManager != null) {
|
|
|
|
|
|
configManager.reloadConfig();
|
|
|
|
|
|
}
|
2026-02-13 22:03:17 +08:00
|
|
|
|
if (messageManager != null) {
|
|
|
|
|
|
messageManager.reloadMessages();
|
|
|
|
|
|
}
|
2026-02-13 20:56:03 +08:00
|
|
|
|
if (blockManager != null) {
|
|
|
|
|
|
blockManager.loadData();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (skinManager != null) {
|
|
|
|
|
|
skinManager.loadAllSkins();
|
|
|
|
|
|
}
|
|
|
|
|
|
getLogger().info("插件配置已完全重载");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-13 18:50:05 +08:00
|
|
|
|
private void startScheduler() {
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 每5分钟自动保存数据
|
2026-02-13 18:50:05 +08:00
|
|
|
|
getServer().getScheduler().runTaskTimerAsynchronously(this, () -> {
|
2026-02-13 20:56:03 +08:00
|
|
|
|
if (blockManager != null) {
|
|
|
|
|
|
blockManager.saveData();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (skinManager != null) {
|
|
|
|
|
|
skinManager.saveSkinData();
|
|
|
|
|
|
}
|
|
|
|
|
|
getLogger().info("数据已自动保存");
|
2026-02-13 18:50:05 +08:00
|
|
|
|
}, 6000L, 6000L);
|
|
|
|
|
|
|
2026-02-13 20:56:03 +08:00
|
|
|
|
// 每10秒检查玩家生命方块
|
2026-02-13 18:50:05 +08:00
|
|
|
|
getServer().getScheduler().runTaskTimer(this, () -> {
|
2026-02-13 20:56:03 +08:00
|
|
|
|
if (lifeSystem != null) {
|
|
|
|
|
|
lifeSystem.checkAllPlayers();
|
|
|
|
|
|
}
|
2026-02-13 18:50:05 +08:00
|
|
|
|
}, 200L, 200L);
|
2026-02-13 20:56:03 +08:00
|
|
|
|
|
|
|
|
|
|
// 每分钟清理一次过期缓存
|
|
|
|
|
|
getServer().getScheduler().runTaskTimerAsynchronously(this, () -> {
|
|
|
|
|
|
if (skinManager != null) {
|
|
|
|
|
|
skinManager.cleanupOldCache();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 1200L, 1200L);
|
2026-02-13 18:50:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static PlayerBlockLife getInstance() {
|
|
|
|
|
|
return instance;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public PlayerBlockManager getBlockManager() {
|
|
|
|
|
|
return blockManager;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public SkinManager getSkinManager() {
|
|
|
|
|
|
return skinManager;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public LifeSystem getLifeSystem() {
|
|
|
|
|
|
return lifeSystem;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ConfigManager getConfigManager() {
|
|
|
|
|
|
return configManager;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-13 22:03:17 +08:00
|
|
|
|
public MessageManager getMessageManager() {
|
|
|
|
|
|
return messageManager;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-13 18:50:05 +08:00
|
|
|
|
public void logInfo(String message) {
|
|
|
|
|
|
getLogger().info(message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void logWarning(String message) {
|
|
|
|
|
|
getLogger().warning(message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void logError(String message, Throwable throwable) {
|
|
|
|
|
|
getLogger().log(Level.SEVERE, message, throwable);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|