• 欢迎加入MineBBS QQ讨论群:点击查看所有的官方讨论群
  • 我们将于近期对服务器进行迁移,服务可能中断至多2日。请各位安排好自己的访问计划,造成不便敬请谅解!
  • MineBBS入站考试已经上线!想要成为【正式会员】解锁更多功能吗?快来参与吧!【点我去看】
[简易任务]MainQuest-1.12.2-1.21.4

原创 闭源 [简易任务]MainQuest-1.12.2-1.21.4 1.2.0

请登录后获取
1.新增指令/mq quest random <玩家> <多个任务key或任务id>
该指令可知道让某个玩家随机接取任务池中的某个任务
例如/mq quest random Drbiaodi example,example2,example3 ,该指令会让玩家 Drbiaodi 随机接取example,example2,example3中的随机一个任务,各个任务接取到的概率相等。
再比如/mq quest random Drbiaodi example:10,example2:20,example3:30 ,此时为权重模式,玩家 Drbiaodi 接取到example3的概率就大于其他两个任务。
若是觉得写任务key太麻烦了,还可以写成任务id的形式/mq quest random Drbiaodi 1:10,2:20,3:30

2.新增任务需求数量的PAPI变量解析
# 任务内容
tasks:
# 阶段1(可写多个阶段)
1:
# 任务类型[击杀、收集、提交、空白]
type: "击杀"
# 任务内容
content:
# 任务内容 击杀\收集\提交 数量
# 任务在接取时,可根据玩家当前的相关变量调整任务数量(例如:%player_level%)
# PAPI变量解析的对象为接取任务的玩家
amount: "%player_level%"
# 生物类型
type: "ZOMBIE"
# 生物名称(若为空则不指定)
name: "&a测试任务僵尸"
# 任务描述(可选)
# <amount> 为任务数量占位符 (若设计的amount为随机数,则不建议将<amount>写到任务描述中)
# <name> 为生物名称占位符(为空时,则为生物类型)
description:
- "&f任务阶段1:"
- "&f击杀 <amount> 只 <name>"
- " "
# 任务奖励
reward:
# 经济奖励
eco:
vault: 100
playerpoints: 0
# 命令执行(命令执行者:player、console、op)
commands:
- "[player]say &a恭喜 <player> 完成了任务阶段 1"
- "[player]say &a请继续努力完成任务"

在新版本的任务需求的数量中,可以使用PAPI变量,你可以添加PAPI变量的数学扩展来实现随机数
该功能启用方式如下:

settings:
# 该任务是否显示到任务列表中(默认true)
show-in-list: true
# 任务是否可重复接取
repeatable: false
# 任务可重复接取的次数(可重复接取时才生效,为0则不限制)
repeat-count: 0
# 任务领取间隔(单位:秒)
interval: 86400
# 接取时执行指令(命令执行者:player、console、op)
commands:
- "[player]say &a <player> 接取了任务 <task>"
# 任务结束后,自动领取的任务ID(可选,多个任务ID用逗号隔开[1,2],若为空则不指定自动领取任务)
next-tasks: []
将任务类型击杀的匹配方式从精确匹配,改为包含匹配
一、任务类型新增-地点
新增 “地点” 任务类型,可指示玩家前往指定地点:
YAML:
# 任务内容
  tasks:
    # 阶段1(可写多个阶段)
    1:
      # 地点: 任务阶段,需要玩家到达指定地点
      type: "地点"
      content:
        # 地点坐标 (世界, X, Y, Z, 半径) 半径默认为5格
        type: "world,0,64,0,5"
        description:
          - "&e任务阶段 1 :"
          - "&f请到达指定地点"
          - "&f坐标: world 0,64,0"
      reward:
        # 经济奖励
        eco:
          vault: 100
          playerpoints: 0
        # 命令执行(命令执行者:player、console、op)
        commands:
          - "[player]say &a恭喜 <player> 完成了任务阶段 1"
          - "[player]say &a请继续努力完成任务"

二、新增接取任务时执行指令列表功能
YAML:
settings:
    # 该任务是否显示到任务列表中(默认true)
    show-in-list: true
    # 任务是否可重复接取
    repeatable: false
    # 任务可重复接取的次数(可重复接取时才生效,为0则不限制)
    repeat-count: 0
    # 任务领取间隔(单位:秒)
    interval: 86400
    # 接取时执行指令(命令执行者:player、console、op)
    commands:
      - "[player]say &a <player> 接取了任务 <task>"

三、新增API、JS脚本添加任务类型功能
其中JS脚本需要安装前置https://wwaos.lanzouu.com/iDmdv3rieved 且需要在config.yml中启用js脚本加载,插件提供了一个js脚本[钓鱼]的例子,供用户参考。

而使用API的例子如下:
Java:
/**
 * 示例插件:通过 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;
        });
    }
}
后退
顶部 底部