// 在主类中注册模块
@Override
public void onEnable() {
if (Bukkit.getPluginManager().getPlugin("SuperInventory") != null) {
SuperInventory si = (SuperInventory) Bukkit.getPluginManager().getPlugin("SuperInventory");
miningModule = new MiningModule(this);
miningModule.register();
si.getSpecialManager().registerModule(miningModule);
getLogger().info("已注册特殊模块: mining");
} else {
getLogger().warning("SuperInventory 未加载,挖矿模块注册失败");
}
}
// 模块类,按需重写 onActivate(装备饰品时触发)、onTrigger(激活时触发)、onTrigger(拆卸饰品时触发)
public class MiningModule implements SpecialModule, Listener {
private final JavaPlugin plugin;
// Player UUID -> list of (material, executorType, command)
private final Map<UUID, List<MiningConfig>> playerConfigs = new HashMap<>();
public MiningModule(JavaPlugin plugin) {
this.plugin = plugin;
}
/**
* 注册事件监听,需在模块注册后调用一次
*/
public void register() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@Override
public String getType() {
// 模块名
return "mining";
}
@Override
public void onActivate(Player player, SpecialModel model, String triggerType) {
addConfig(player, model.getContent());
}
@Override
public void onTrigger(Player player, SpecialModel model, String triggerType) {
// onBreak 由 BlockBreakEvent 处理器处理,此处不重复处理
}
@Override
public void onDeactivate(Player player, SpecialModel model, String triggerType) {
removeConfig(player, model.getContent());
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
List<MiningConfig> configs = playerConfigs.get(player.getUniqueId());
if (configs == null || configs.isEmpty()) return;
Material brokenType = event.getBlock().getType();
for (MiningConfig config : configs) {
if (config.material == brokenType) {
executeCommand(player, config);
}
}
}
private void addConfig(Player player, String content) {
MiningConfig config = parseContent(content);
if (config == null) return;
playerConfigs.computeIfAbsent(player.getUniqueId(), k -> new ArrayList<>()).add(config);
plugin.getLogger().info("玩家 " + player.getName() + " 激活了挖矿模块: " + content);
}
private void removeConfig(Player player, String content) {
List<MiningConfig> configs = playerConfigs.get(player.getUniqueId());
if (configs == null) return;
configs.removeIf(c -> c.content.equals(content));
if (configs.isEmpty()) {
playerConfigs.remove(player.getUniqueId());
plugin.getLogger().info("玩家 " + player.getName() + " 清除所有挖矿模块");
}
}
private MiningConfig parseContent(String content) {
if (content == null || content.isEmpty()) return null;
String[] parts = content.split(":", 3);
if (parts.length < 3) {
plugin.getLogger().warning("挖矿模块配置格式错误,应为 BLOCK_TYPE:executor:command,实际: " + content);
return null;
}
Material material = Material.matchMaterial(parts[0].toUpperCase());
if (material == null) {
plugin.getLogger().warning("未知的方块类型: " + parts[0]);
return null;
}
String executor = parts[1].toLowerCase();
if (!"player".equals(executor) && !"console".equals(executor)) {
plugin.getLogger().warning("执行类型必须是 player 或 console,实际: " + parts[1]);
return null;
}
String command = parts[2];
if (command.isEmpty()) {
plugin.getLogger().warning("指令不能为空");
return null;
}
return new MiningConfig(material, executor, command, content);
}
private void executeCommand(Player player, MiningConfig config) {
String cmd = config.command;
switch (config.executor) {
case "player":
player.performCommand(cmd);
break;
case "console":
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd);
break;
}
}
private static class MiningConfig {
final Material material;
final String executor;
final String command;
final String content; // 原始 content,用于移除时匹配
MiningConfig(Material material, String executor, String command, String content) {
this.material = material;
this.executor = executor;
this.command = command;
this.content = content;
}
}
}