Files
PlayerBlockLife/src/main/java/com/playerblocklife/PlayerBlockLife.java

228 lines
7.2 KiB
Java
Raw Normal View History

2026-02-13 18:50:05 +08:00
package com.playerblocklife;
import org.bukkit.Bukkit;
2026-02-13 18:50:05 +08:00
import org.bukkit.plugin.java.JavaPlugin;
2026-02-13 18:50:05 +08:00
import java.util.logging.Level;
/**
* PlayerBlockLife插件主类 - 玩家生命方块系统的核心控制器
*
* <p>这个插件为Minecraft服务器添加了一个独特的游戏机制每个玩家拥有一定数量的生命方块
* 这些方块使用玩家的皮肤作为材质当其他玩家挖光某个玩家的所有生命方块时该玩家会被淘汰</p>
*
* <p>主要功能
* <ul>
* <li>管理玩家生命方块的生成和销毁</li>
* <li>处理玩家皮肤的获取和应用</li>
* <li>监控玩家生命值状态</li>
* <li>提供完整的命令和权限系统</li>
* <li>支持配置热重载和数据持久化</li>
* </ul>
*
* @author xiaobai
* @version 3.0.0-experimental-1.20.4
* @since 1.0.0
*/
2026-02-13 18:50:05 +08:00
public class PlayerBlockLife extends JavaPlugin {
private static PlayerBlockLife instance;
private PlayerBlockManager blockManager;
private SkinManager skinManager;
private LifeSystem lifeSystem;
private ConfigManager configManager;
private MessageManager messageManager;
2026-02-13 18:50:05 +08:00
/**
* 插件启用时调用执行初始化操作
*
* <p>初始化流程
* <ol>
* <li>保存默认配置文件</li>
* <li>初始化所有管理器注意依赖顺序</li>
* <li>加载配置和消息数据</li>
* <li>注册事件监听器</li>
* <li>注册命令执行器</li>
* <li>加载玩家数据和皮肤缓存</li>
* <li>启动定时任务</li>
* </ol>
*
* @see #onDisable()
*/
2026-02-13 18:50:05 +08:00
@Override
public void onEnable() {
instance = this;
// 第一步:保存默认配置
2026-02-13 18:50:05 +08:00
saveDefaultConfig();
// 第二步:初始化管理器(注意顺序!)
2026-02-13 18:50:05 +08:00
this.configManager = new ConfigManager(this);
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);
// 第三步:加载数据(必须在管理器初始化之后)
this.configManager.loadConfig();
this.messageManager.loadMessages();
// 第四步:注册事件监听器
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 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));
getCommand("pblrevive").setExecutor(new AdminCommands(this));
getCommand("pblstats").setExecutor(new AdminCommands(this));
2026-02-13 18:50:05 +08:00
// 第六步:加载其他数据
2026-02-13 18:50:05 +08:00
blockManager.loadData();
skinManager.loadAllSkins();
// 第七步:启动定时任务
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========================================");
}
/**
* 插件禁用时调用执行清理操作
*
* <p>执行以下清理操作
* <ul>
* <li>保存玩家方块数据到文件</li>
* <li>保存皮肤缓存数据</li>
* <li>记录插件禁用日志</li>
* </ul>
*
* @see #onEnable()
*/
2026-02-13 18:50:05 +08:00
@Override
public void onDisable() {
// 保存数据
2026-02-13 18:50:05 +08:00
if (blockManager != null) {
blockManager.saveData();
}
if (skinManager != null) {
skinManager.saveSkinData();
}
getLogger().info("§cPlayerBlockLife 插件已禁用");
}
/**
* 重写 reloadConfig 方法避免循环依赖
*/
@Override
public void reloadConfig() {
// 只调用父类的reloadConfig不调用configManager的方法
super.reloadConfig();
getLogger().info("基础配置文件已重新加载");
}
/**
* 插件的完整重载方法用于命令
*
* <p>重新加载所有插件配置和数据包括
* <ul>
* <li>主配置文件 (config.yml)</li>
* <li>消息配置文件 (messages.yml)</li>
* <li>玩家方块数据</li>
* <li>皮肤缓存数据</li>
* </ul>
*
* <p>这个方法通常由管理员通过/pblreload命令调用</p>
*/
public void reloadPluginConfig() {
if (configManager != null) {
configManager.reloadConfig();
}
if (messageManager != null) {
messageManager.reloadMessages();
}
if (blockManager != null) {
blockManager.loadData();
}
if (skinManager != null) {
skinManager.loadAllSkins();
}
getLogger().info("插件配置已完全重载");
}
2026-02-13 18:50:05 +08:00
private void startScheduler() {
// 每5分钟自动保存数据
2026-02-13 18:50:05 +08:00
getServer().getScheduler().runTaskTimerAsynchronously(this, () -> {
if (blockManager != null) {
blockManager.saveData();
}
if (skinManager != null) {
skinManager.saveSkinData();
}
getLogger().info("数据已自动保存");
2026-02-13 18:50:05 +08:00
}, 6000L, 6000L);
// 每10秒检查玩家生命方块
2026-02-13 18:50:05 +08:00
getServer().getScheduler().runTaskTimer(this, () -> {
if (lifeSystem != null) {
lifeSystem.checkAllPlayers();
}
2026-02-13 18:50:05 +08:00
}, 200L, 200L);
// 每分钟清理一次过期缓存
getServer().getScheduler().runTaskTimerAsynchronously(this, () -> {
if (skinManager != null) {
skinManager.cleanupOldCache();
}
}, 1200L, 1200L);
2026-02-13 18:50:05 +08:00
}
/**
* 获取插件单例实例
*
* <p>提供全局访问点允许其他类访问插件主实例</p>
*
* @return PlayerBlockLife插件实例
* @throws IllegalStateException 如果插件尚未启用实例为null
*/
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;
}
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);
}
}