简介
QyCycleTaskView 是一个循环任务视图插件,支持每日/每周/每月/自定义天数重置的任务系统,使用 DragonCore 作为 GUI 展示。

支持一个任务组对应一个GUI界面。
依赖
|
插件 |
类型 |
说明 |
|
QySQL |
必须 |
数据库前置 |
|
DragonCore |
必须 |
GUI 视图 |
|
MythicMobs |
可选 |
KILL_MOB 类型任务和 MM 物品匹配 |
|
NeigeItems |
可选 |
NI 物品匹配(含 data) |
|
Chemdah |
可选 |
CHEMDAH 类型任务联动 |
|
PlaceholderAPI |
可选 |
占位符支持 |
指令
主命令:/qct(别名 /qycycletask、/cycletask)
|
指令 |
权限 |
说明 |
|
|
qct.use |
打开指定任务组的界面 |
|
|
qct.admin |
重载配置(同步补齐 all 模式缺失任务) |
|
|
qct.admin |
重置任务组(需30秒内二次确认,重新分配任务) |
|
|
qct.admin |
添加任务到玩家列表并接取 |
|
|
qct.admin |
强制完成任务 |
|
|
qct.admin |
重置单个任务为未接取(不发奖励) |
|
|
qct.admin |
增加 data 点数 |
|
|
qct.admin |
设置 data 点数 |
|
|
qct.admin |
查看 data 点数 |
|
|
qct.admin |
查看玩家任务状态 |
指令说明:
reset重置任务组:random 模式重新随机分配,all 模式全部重新分配。所有进度清零,auto-accept 的任务自动接取。task add:可以追加不在随机分配里的任务,追加后自动接取。task reset:只重置单个任务状态,不影响其他任务。reload:重载配置后,如果模式从 random 切换到 all,会自动补齐缺失的任务到在线玩家列表。
PlaceholderAPI 占位符
|
占位符 |
返回值 |
说明 |
|
|
数字 |
分配的任务总数 |
|
|
数字 |
已完成任务数 |
|
|
数字 |
已领取奖励数 |
|
|
3/5 |
已完成/总数 |
|
|
true/false |
是否全部领取 |
|
|
true/false |
组奖励是否已领 |
|
|
2h30m |
距下次重置时间 |
|
|
unaccepted/accepted/completed/claimed |
任务状态 |
|
|
3/10 |
任务进度 |
|
|
数字 |
data 当前值 |
配置文件
config.yml(主配置)
table-prefix: "cycle_task" # 数据库表前缀
messages:
no-permission: "&c你没有权限执行此操作"
task-accepted: "&a成功接取任务: {0}"
task-already-accepted: "&e你已经接取了该任务"
task-not-available: "&c该任务当前不可用"
reward-claimed: "&a成功领取奖励!"
reward-no-space: "&c背包空间不足,需要 {0} 个空槽位"
group-reward-claimed: "&a成功领取任务组总奖励!"
group-not-complete: "&c尚未完成所有任务"
task-not-complete: "&c任务尚未完成"
reset-notice: "&e任务已重置,新的任务已刷新"
reset-confirm: "&e请在30秒内再次输入该指令确认重置"
reset-success: "&a任务组 {0} 已重置"
data-added: "&a已为 {0} 增加 {1} 点 {2}"
data-set: "&a已将 {0} 的 {1} 设置为 {2}"
player-not-found: "&c找不到玩家: {0}"
group-not-found: "&c找不到任务组: {0}"
task-not-found: "&c找不到任务: {0}"
任务组配置(taskgroups/*.yml)
每个任务组一个文件,文件名即为任务组 ID。
# ==================== 重置设置 ====================
# 重置周期: daily / weekly / monthly / custom
reset-type: daily
# 重置时间点(24小时制)
reset-time: "05:00"
# custom 类型时的重置天数
reset-days: 3
# ==================== 分配设置 ====================
# 分配模式: all(全部分配)/ random(随机分配)
assign-mode: random
# random 模式下分配数量
assign-count: 5
# ==================== 组完成奖励 ====================
group-reward:
required-slots: 2 # 领取所需背包空槽位
description: # 奖励描述(发送给客户端显示)
- "&6&l全勤奖励"
- "&7完成所有任务的额外奖励"
- "&e- 金币 x1000"
commands: # 奖励命令组
- "eco give %player% 1000"
- "give %player% diamond 5"
# ==================== 任务列表 ====================
tasks:
# ... 见下方任务类型说明
任务类型
KILL_MOB — 击杀 MythicMobs 怪物
依赖 MythicMobs,未安装时自动隐藏。
tasks:
kill_zombie:
name: "&a击杀僵尸精英"
description:
- "&7击杀 10 只僵尸精英"
type: KILL_MOB
auto-accept: false # 是否自动接取(默认 false)
mob-id: "ZombieElite" # MythicMobs 怪物 ID
amount: 10 # 需要击杀数量
reward:
required-slots: 1
commands:
- "eco give %player% 100"
SUBMIT_ITEM — 提交物品
支持 4 种物品来源,提交时优先扣手持,不足再扣背包。
source: vanilla(原版物品)
tasks:
submit_diamond:
name: "&b提交钻石"
description:
- "&7提交 5 颗钻石"
type: SUBMIT_ITEM
auto-accept: true
items:
- source: vanilla
id: "DIAMOND" # Material 英文名
amount: 5 # 需求数量
consume: true # 是否消耗(默认 true)
consume-amount: 5 # 消耗数量(默认等于 amount)
reward:
required-slots: 1
commands:
- "eco give %player% 500"
source: neigeitems(NeigeItems 物品)
items:
- source: neigeitems
id: "elite_sword" # NI 物品 ID
amount: 1
consume: true
consume-amount: 1
ni-data: # NI data 匹配(可选)
品质: "6" # 要求品质为 6
强化等级: "10" # 要求强化等级为 10
source: mythicmobs(MythicMobs 物品)
items:
- source: mythicmobs
id: "dragon_scale" # MM 物品 ID
amount: 3
consume: true
consume-amount: 3
source: customitem(自定义匹配)
不需要 id,通过 match 节点定义匹配条件。match 中至少需要一个条件,所有条件都满足才算匹配。
name 和 lore 支持正则表达式:
- 直接写文本 = 精确匹配
.*xxx.*= 包含匹配
items:
- source: customitem
amount: 1
consume: true
consume-amount: 1
match:
# 名称匹配(正则)
name: ".*传说之剑.*"
# Lore 匹配(正则列表,每项都必须在 lore 中找到匹配行)
lore:
- "传说品质" # 精确匹配:lore 中有一行完全等于"传说品质"
- ".*不可交易.*" # 包含匹配:lore 中有一行包含"不可交易"
# NBT 节点匹配(路径用 . 分隔)
nbt:
- path: "custom.quality"
value: "6"
- path: "custom.bound"
value: "true"
DATA — 插件内置 Data 点数
通过 /qct data add 指令或其他插件调用 API 增加点数,达到目标值即完成。
tasks:
gather_points:
name: "&e积累探索点数"
description:
- "&7积累 100 探索点数"
type: DATA
auto-accept: true
data: # 支持多条件,全部满足才算完成
- name: "explore_points" # data 名称
value: 100 # 需要 >= 此值
reset-on-accept: true # 接取时是否重置此 data 为 0
reward:
required-slots: 1
commands:
- "eco give %player% 500"
CHEMDAH — Chemdah 托管任务
依赖 Chemdah,未安装时自动隐藏。任务的接取/完成/停止完全由 Chemdah 管理。
tasks:
chemdah_story:
name: "&c完成主线剧情"
description:
- "&7完成主线剧情第三章"
type: CHEMDAH
auto-accept: false
chemdah:
quest-id: "story_chapter_3" # Chemdah 任务模板 ID
task-id: "kill_boss" # Chemdah quest 内的 task 节点 ID
reward:
required-slots: 1
commands:
- "eco give %player% 2000"
生命周期:
- 接取时:自动 reset + accept 对应 Chemdah quest
- 完成判断:检查 Chemdah quest 的指定 task 节点是否完成
- 领取奖励时:completeQuest 完成对应 Chemdah quest + 发放奖励
- 玩家在 Chemdah 侧放弃/失败任务时(未完成状态下):自动重置为”未接取”状态
重置机制
|
类型 |
说明 |
示例 |
|
daily |
每天重置 |
每天 05:00 重置 |
|
weekly |
每周重置 |
每周一 05:00 重置 |
|
monthly |
每月重置 |
每月1号 05:00 重置 |
|
custom |
自定义天数 |
每 3 天 05:00 重置 |
重置时:
- 清空所有任务进度
- 重新分配任务(随机/全量)
- 组奖励状态重置
- 自动接取标记为 auto-accept 的任务
分配模式
|
模式 |
说明 |
|
all |
分配所有可用任务(忽略 assign-count) |
|
random |
从可用任务中随机选取 assign-count 个 |
注意事项:
- 从 random 切换到 all 模式后执行
/qct reload,会自动补齐在线玩家缺失的任务 /qct task add可以追加不在随机分配里的额外任务- 不可用的任务(缺少依赖插件)不会被分配
DragonCore GUI
界面配置文件位于 plugins/QyCycleTaskView/graphical/cycle_task_view.yml,可自行修改布局和贴图。
发包协议(供界面开发者参考):
|
包ID |
参数 |
说明 |
|
get_tasks |
无 或 (pageSize, page) |
获取任务列表 |
|
accept_task |
taskId |
接取任务 |
|
claim_reward |
taskId |
领取奖励 |
|
submit_task |
taskId |
提交物品任务 |
|
get_group_reward |
无 |
获取组奖励状态 |
|
claim_group_reward |
无 |
领取组奖励 |
动态组件 temp 字段:
|
字段 |
说明 |
|
$temp.task_id |
任务 ID |
|
$temp.name |
任务名称 |
|
$temp.description |
任务描述 |
|
$temp.progress |
进度文本(如 3/10) |
|
$temp.status |
状态:unaccepted/accepted/completed/claimed |
界面变量:
|
变量 |
说明 |
|
界面变量.get_tasks总页数 |
任务列表总页数 |
|
界面变量.get_tasks当前页 |
当前页码 |
|
界面变量.get_group_reward_status |
组奖励状态:locked/available/claimed |
|
界面变量.get_group_reward_desc |
组奖励描述 |
|
界面变量.get_group_reward_slots |
组奖励所需空槽位 |
完整任务组配置示例
reset-type: daily
reset-time: "05:00"
assign-mode: random
assign-count: 4
group-reward:
required-slots: 2
description:
- "&6&l每日全勤奖励"
- "&7完成所有每日任务可领取"
- "&e- 钻石 x5"
- "&e- 金币 x1000"
commands:
- "give %player% diamond 5"
- "eco give %player% 1000"
tasks:
kill_skeleton:
name: "&a击杀骷髅弓手"
description:
- "&7击杀 15 只骷髅弓手"
type: KILL_MOB
auto-accept: false
mob-id: "SkeletonArcher"
amount: 15
reward:
required-slots: 1
commands:
- "eco give %player% 150"
submit_ore:
name: "&b提交精炼矿石"
description:
- "&7提交 10 个精炼矿石"
type: SUBMIT_ITEM
auto-accept: true
items:
- source: neigeitems
id: "refined_ore"
amount: 10
consume: true
consume-amount: 10
reward:
required-slots: 1
commands:
- "eco give %player% 200"
submit_custom_weapon:
name: "&d提交传说武器"
description:
- "&7提交任意一把传说品质武器"
type: SUBMIT_ITEM
auto-accept: true
items:
- source: customitem
amount: 1
consume: false
consume-amount: 0
match:
lore:
- ".*传说品质.*"
reward:
required-slots: 1
commands:
- "eco give %player% 500"
explore:
name: "&e探索世界"
description:
- "&7积累 50 探索点数"
- "&7(击杀怪物、采集资源获得)"
type: DATA
auto-accept: true
data:
- name: "daily_explore"
value: 50
reset-on-accept: true
reward:
required-slots: 1
commands:
- "eco give %player% 300"
story_quest:
name: "&c完成每日剧情"
description:
- "&7完成今日剧情任务"
type: CHEMDAH
auto-accept: false
chemdah:
quest-id: "daily_story"
task-id: "main_objective"
reward:
required-slots: 1
commands:
- "eco give %player% 400"


