/**
* 示例插件:通过 MainQuest API 注册自定义任务类型
*
* plugin.yml 中需要:
* depend: [MainQuest]
*/
public class ExamplePlugin extends JavaPlugin implements Listener {
@Override
public void onEnable() {
// 获取 MainQuest API
MainQuestAPI api = MainQuest.getAPI();
if (api == null) {
getLogger().severe("未找到 MainQuest 插件,已禁用");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
// 注册自定义任务类型 "挖矿"
api.registerTaskHandler(new ITaskHandler() {
@Override
public String getTypeName() {
return "挖矿";
}
@Override
public void onRegister(MainQuest plugin, QuestTaskWrapper taskWrapper) {
// 注册事件监听器
Bukkit.getPluginManager().registerEvents(ExamplePlugin.this, ExamplePlugin.this);
getLogger().info("挖矿任务类型已注册");
}
@Override
public void onUnregister(MainQuest plugin) {
// 注销事件监听器
HandlerList.unregisterAll(ExamplePlugin.this);
getLogger().info("挖矿任务类型已注销");
}
@Override
public void handleProgress(Player player, PlayerTaskData taskData, QuestStage stage, int amount) {
// 增加进度(由事件驱动,此方法通常由 TaskWrapper 内部调用)
api.getQuestTaskWrapper().addProgress(player, taskData, amount);
}
});
getLogger().info("示例任务注册插件已启用");
getLogger().info("在任务配置中使用 type: \"挖矿\" 即可使用该任务类型");
}
@Override
public void onDisable() {
// 插件卸载时自动注销
}
// ==================== 任务逻辑 ====================
/**
* 监听方块破坏事件
* 当玩家破坏指定类型的方块时,增加 "挖矿" 类型任务的进度
*/
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
// 获取 MainQuest 的任务包装器
MainQuestAPI api = MainQuest.getAPI();
if (api == null) return;
QuestTaskWrapper taskWrapper = api.getQuestTaskWrapper();
// 遍历玩家所有活跃的 "挖矿" 类型任务
taskWrapper.getActiveTaskByHandlerType(player, "挖矿", (taskData, stage) -> {
// 检查配置中的 content.type 是否匹配破坏的方块
String requiredType = stage.getContent().getType();
if (requiredType.isEmpty()) {
// 不指定方块类型则所有方块都计数
taskWrapper.addProgress(player, taskData, 1);
return true;
}
// 匹配方块类型
Material blockType = event.getBlock().getType();
if (blockType.name().equalsIgnoreCase(requiredType)) {
taskWrapper.addProgress(player, taskData, 1);
return true;
}
return false;
});
}
}