Skip to content

任务系统配置

任务系统允许你设置定时、循环或事件触发的脚本,实现复杂的地牢机制。

常见用途:

  • 倒计时提醒(定时任务)
  • 定期补给发放(循环任务)
  • 击杀统计和奖励(事件任务)
  • Boss战阶段触发(事件任务)
  • 环境特效循环(循环任务)

前置要求:

  • 脚本需要在 tasks.yml 中手动编辑
  • 事件类型需要了解触发条件

任务类型说明

任务系统支持 3 种任务类型:

类型说明适用场景触发方式
定时在特定时间点执行倒计时提醒、阶段切换地牢开始后X秒
循环定期重复执行补给发放、环境特效每X秒执行一次
事件特定事件发生时触发击杀统计、波次完成事件发生时

支持的事件类型

事件说明trigger_target用途
monster_kill每次击杀怪物指定怪物ID(可选)
wave_complete怪物组完成指定怪物组名(可选)
interact_trigger交互点触发指定交互点名(可选)

示例1:定时任务 - 倒计时提醒

在特定时间点提醒玩家。

yaml
tasks:
  倒计时提醒:
    type: "定时"
    
    timings:
      # 5分钟时
      300: |-
        action.title('@all', '&e剩余25分钟', '&7请加快速度')
        action.sound('@all', 'BLOCK_NOTE_BLOCK_PLING', 1.0, 1.0)
      
      # 10分钟时
      600: |-
        action.title('@all', '&e剩余20分钟', '&7时间充裕')
        action.sound('@all', 'BLOCK_NOTE_BLOCK_PLING', 1.0, 1.2)
      
      # 25分钟时(紧急警告)
      1500: |-
        action.title('@all', '&c&l剩余5分钟!', '&4&l快速完成')
        action.message('@all', '&4&l[紧急] 还剩 5 分钟!')
        action.sound('@all', 'ENTITY_ENDER_DRAGON_GROWL', 1.0, 0.8)
      
      # 29分钟时(最后警告)
      1740: |-
        action.title('@all', '&4&l还剩1分钟!!!', '&4&l马上超时')
        action.message('@all', '&4&l[紧急] 还剩 1 分钟!!!')
        action.sound('@all', 'ENTITY_WITHER_SPAWN', 1.0, 1.0)

示例2:循环任务 - 进度显示

定期显示任务进度。

yaml
tasks:
  进度显示:
    type: "循环"
    interval: 10  # 每10秒执行一次
    
    script: |-
      var kills = getVar('total_kills') || 0
      var target = 50
      var progress = Math.floor((kills / target) * 100)
      
      action.actionbar('@all', '&e击杀进度: &a' + kills + '&7/&e' + target + ' &8[&a' + progress + '%&8]')

示例3:循环任务 - 补给箱刷新

定期给随机玩家发放补给。

yaml
tasks:
  补给箱刷新:
    type: "循环"
    interval: 120  # 每2分钟
    
    script: |-
      action.message('@all', '&e[系统] 随机补给已发放')
      action.give_item('@random', 'GOLDEN_APPLE', 1)
      action.give_item('@random', 'ARROW', 16)
      action.sound('@random', 'ENTITY_ITEM_PICKUP', 1.0, 1.2)
      action.effect('VILLAGER_HAPPY', '0,65,0', 30, 2.0, 0.5)

示例4:循环任务 - 环境特效

定期播放环境粒子效果。

yaml
tasks:
  环境特效:
    type: "循环"
    interval: 60  # 每1分钟
    
    script: |-
      action.effect('END_ROD', '10,70,10', 15, 0.5, 0.05)
      action.effect('END_ROD', '-10,70,-10', 15, 0.5, 0.05)
      action.effect('PORTAL', '0,68,0', 30, 2.0, 0.1)

示例5:事件任务 - 击杀统计

每次击杀怪物时统计并给予奖励。

yaml
tasks:
  击杀计数:
    type: "事件"
    trigger: "monster_kill"  # 每次击杀怪物触发
    
    script: |-
      var kills = (getVar('total_kills') || 0) + 1
      setVar('total_kills', kills)
      
      action.message('@trigger', '&7击杀 +1 &8(&e' + kills + '&8)')
      action.sound('@trigger', 'ENTITY_EXPERIENCE_ORB_PICKUP', 0.5, 1.5)
      
      // 每10击杀给予奖励
      if (kills % 10 === 0) {
        action.message('@all', '&a&l团队击杀达到 ' + kills + ' 只!获得速度效果')
        action.apply_potion('@all', 'SPEED', '30秒', 1)
        action.effect('FIREWORK', '0,65,0', 20, 2.0, 0.5)
      }

示例6:事件任务 - 指定怪物击杀

只统计击杀特定怪物。

yaml
tasks:
  Boss击杀检测:
    type: "事件"
    trigger: "monster_kill"
    trigger_target: "SkeletonKing"  # ⚠️ 必须是 MythicMobs 的 Internal Name
    
    script: |-
      action.title('@all', '&6&l击败骷髅王!', '&e获得特殊奖励')
      action.sound('@all', 'UI_TOAST_CHALLENGE_COMPLETE', 1.0, 1.0)
      action.effect('FIREWORK', '0,65,0', 20, 1.0, 0.5)
      
      action.give_item('@all', 'DIAMOND', 10)
      action.give_item('@all', 'EMERALD', 5)
      action.message('@all', '&a全队获得: 10钻石, 5绿宝石')

示例7:事件任务 - 波次完成治疗

所有怪物组完成时触发。

yaml
tasks:
  波次完成治疗:
    type: "事件"
    trigger: "wave_complete"  # 怪物组完成触发
    # 不指定 trigger_target,所有怪物组完成时都触发
    
    script: |-
      action.message('@all', '&d[治疗波] 神秘力量治愈了你们!')
      action.heal('@all')
      action.sound('@all', 'BLOCK_BEACON_POWER_SELECT', 1.0, 1.2)
      action.effect('HEART', '0,65,0', 50, 2.0, 0.3)

示例8:事件任务 - 指定波次完成奖励

只在特定怪物组完成时触发。

yaml
tasks:
  第一波奖励:
    type: "事件"
    trigger: "wave_complete"
    trigger_target: "第一波"  # 只在"第一波"完成时触发
    
    script: |-
      action.message('@all', '&a[奖励] 第一波完成!获得速度效果!')
      action.apply_potion('@all', 'SPEED', '60秒', 1)
      action.sound('@all', 'ENTITY_PLAYER_LEVELUP', 1.0, 1.0)
      
      // 给予金币奖励
      action.message('@all', '&e+500 金币')
      // 需要经济插件支持

示例9:事件任务 - 击杀计数器(精英怪)

统计特定类型怪物的击杀数。

yaml
tasks:
  精英击杀计数:
    type: "事件"
    trigger: "monster_kill"
    trigger_target: "EliteGuard"  # 只统计精英守卫
    
    script: |-
      var kills = (getVar('elite_kills') || 0) + 1
      setVar('elite_kills', kills)
      
      action.actionbar('@all', '&6精英击杀: &e' + kills + '&7/&e5')
      
      if (kills >= 5) {
        action.message('@all', '&a&l已击败5只精英守卫!开启宝箱')
        action.delete_obstacle('treasure_gate')
        action.effect('EXPLOSION_LARGE', '0,65,0', 20, 2.0, 0.0)
      }

示例10:复杂定时任务 - 多阶段提醒

结合多个时间点的复杂任务。

yaml
tasks:
  阶段切换:
    type: "定时"
    
    timings:
      # 3分钟 - 第一阶段
      180:
        - |-
          action.title('@all', '&e第一阶段', '&7难度提升')
          action.message('@all', '&e[阶段] 敌人变得更强了!')
          setVar('difficulty', 1)
      
      # 10分钟 - 第二阶段
      600:
        - |-
          action.title('@all', '&6第二阶段', '&7大量敌人来袭')
          action.message('@all', '&6[阶段] 敌人数量增加!')
          setVar('difficulty', 2)
          action.spawn_group('第二波')
      
      # 20分钟 - 最终阶段
      1200:
        - |-
          action.title('@all', '&c&l最终阶段', '&4Boss即将出现')
          action.message('@all', '&c[阶段] Boss战准备开始!')
          action.weather('thunder')
          action.time('midnight')
          setVar('difficulty', 3)
          
          action.wait('10秒')
          action.spawn_group('Boss战')

配置字段说明

定时任务字段

字段类型必填说明
type字符串任务类型:"定时"
timings对象时间点映射,键=秒数,值=脚本列表

循环任务字段

字段类型必填说明
type字符串任务类型:"循环"
interval整数循环间隔(秒)
script脚本每次执行的脚本

事件任务字段

字段类型必填说明
type字符串任务类型:"事件"
trigger字符串事件类型(见事件类型表)
trigger_target字符串目标过滤(怪物ID/组名/交互点名)
script脚本事件触发时执行的脚本

配置文件编辑

任务系统只能通过配置文件编辑,没有游戏内UI。

编辑步骤

  1. 打开 plugins/QueDP/dungeons/地牢名/tasks.yml
  2. 按照示例格式添加任务
  3. 使用 /dga reload 重载配置
  4. 进入地牢测试

配置技巧

定时任务:

  • 时间点从地牢开始时计算(秒)
  • 可以设置多个时间点
  • 每个时间点可以有多个脚本

循环任务:

  • interval 不要设置太小(建议≥5秒)
  • 过于频繁会影响性能
  • 适合用于UI更新和定期奖励

事件任务:

  • trigger_target 留空表示所有目标
  • 怪物ID必须是MythicMobs的Internal Name
  • 可以在脚本中使用 @trigger 选择器

常见问题

Q: 定时任务不触发?

  • 检查时间点是否在地牢时限内
  • 确认 timings 格式正确(键必须是数字)
  • 查看控制台是否有脚本错误

Q: 循环任务执行太频繁?

  • 增大 interval
  • 建议最小值为5秒
  • 使用条件判断减少不必要的执行

Q: 事件任务不触发?

  • 确认 trigger 类型正确
  • 检查 trigger_target 是否存在(怪物ID/组名)
  • 确认事件确实发生了(击杀/完成/触发)

Q: 如何获取MythicMobs怪物的Internal Name?

  • 打开MythicMobs配置文件(如 Mobs.yml
  • 查找怪物定义,冒号前的就是Internal Name
  • 例如:SkeletonKing: → Internal Name是 SkeletonKing

Q: 如何实现条件判断?

  • 使用JavaScript条件语句
  • 示例:if (getVar('kills') >= 10) { ... }
  • 可以使用 setVargetVar 存储数据

Q: 多个任务能同时运行吗?

  • 可以!所有任务类型都是独立运行的
  • 定时任务按时间点触发
  • 循环任务按间隔执行
  • 事件任务按事件触发

高级技巧

1. 动态难度调整

根据时间动态改变怪物强度。

yaml
tasks:
  难度递增:
    type: "循环"
    interval: 300  # 每5分钟
    
    script: |-
      var currentDiff = getVar('difficulty') || 1
      var newDiff = currentDiff + 1
      setVar('difficulty', newDiff)
      
      action.message('@all', '&c[难度] 难度已提升至 Lv.' + newDiff)
      action.sound('@all', 'ENTITY_ENDER_DRAGON_GROWL', 1.0, 0.8)

2. 成就系统

统计玩家成就并给予奖励。

yaml
tasks:
  成就检测:
    type: "事件"
    trigger: "monster_kill"
    
    script: |-
      var kills = (getVar('total_kills') || 0) + 1
      setVar('total_kills', kills)
      
      // 检查成就
      if (kills === 50) {
        action.title('@all', '&6&l成就解锁', '&e击杀大师')
        action.grant_reward('@all', '成就奖励_击杀50')
      } else if (kills === 100) {
        action.title('@all', '&6&l成就解锁', '&e屠戮之王')
        action.grant_reward('@all', '成就奖励_击杀100')
      }

3. 击杀里程碑

根据击杀数给予阶段性奖励。

yaml
tasks:
  击杀里程碑:
    type: "事件"
    trigger: "monster_kill"
    
    script: |-
      var kills = (getVar('total_kills') || 0) + 1
      setVar('total_kills', kills)
      
      // 25击杀里程碑
      if (kills === 25) {
        action.title('@all', '&6击杀25', '&e团队力量提升')
        action.apply_potion('@all', 'DAMAGE_RESISTANCE', '60秒', 0)
      }
      
      // 50击杀里程碑
      if (kills === 50) {
        action.title('@all', '&6击杀50', '&e团队速度提升')
        action.apply_potion('@all', 'SPEED', '60秒', 1)
      }
      
      // 100击杀里程碑
      if (kills === 100) {
        action.title('@all', '&6&l击杀100', '&e获得特殊奖励')
        action.grant_reward('@all', '击杀里程碑奖励')
      }

基于 MIT 许可发布