Skip to content

副本文件、入口与开本流程

GTDungeonTeam 的副本固定使用文件夹模式。每个副本一个 yml,放在 plugins/GTDungeonTeam/dungeons/

text
plugins/GTDungeonTeam/dungeons/
  forest.yml
  tower.yml
  abyss/nightmare.yml

可以建子文件夹。插件会递归读取所有 .yml 文件。

基础副本文件

yaml
dungeon:
  id: forest
  name: "&a森林遗迹"
  provider: command
  engine-id: forest
  target-server: ""
  min-players: 1
  max-players: 4
  icon: ENDER_EYE
  description:
    - "&7被藤蔓吞没的古代遗迹。"
字段作用
idGTDungeonTeam 内部副本 ID
name玩家看到的副本名
provider适配器 ID
engine-id对应副本插件里的真实副本 ID
target-server目标副本服,跨服时使用
min-players最少人数
max-players最多人数
iconGUI 展示材料
description副本描述

id 建议只用英文、数字、下划线和短横线。不要频繁改,队伍选择、副本记录、跨服请求都会用到它。

provider 怎么填

常见值:

text
command
dungeonplus
quedp
btdungeons
mythicdungeons

实际可用状态以命令为准:

text
/gdt providers

provider: command 不要求安装副本插件,适合先打通消耗、队伍、结算动作。

副本入口

大型 RPG 服通常不希望玩家在任意地方点列表就开本,而是走副本门口、NPC、方块、菜单。写法:

yaml
dungeon:
  id: forest
  entry:
    require-open-command: true
    permission: "gtdungeonteam.entry.forest"
    locked-text: "请先到森林遗迹入口打开副本。"

让 NPC、方块菜单、传送门或其他插件执行:

text
/gdt dungeon open forest

效果:

  • 玩家从入口打开副本详情页。
  • 插件记录玩家正在查看的副本。
  • 队长在详情页确认选择。
  • 如果直接在列表里选择,会被 locked-text 拦住。

permission 为空时不检查权限。写了权限后,玩家必须拥有该权限才能打开入口详情页。

难度展示

yaml
dungeon:
  difficulties:
    - "普通"
    - "困难"
    - "噩梦"

当前版本主要用于详情页展示和后续 UI 扩展。真实难度切换通常由对应副本插件或 start-actions 自己接。

展示掉落

yaml
dungeon:
  display-drops:
    - "&6远古钥匙 &8x1"
    - "&b星辉碎片 &8x3-8"
    - "&d史诗装备箱 &8低概率"

display-drops 只负责展示,不会发奖励。
真实奖励写在副本插件、GTMobDrops、MythicMobs 或 reward-actions 里。

展示掉落适合写:

  • 稀有装备
  • 通关材料
  • 坐骑碎片
  • 称号道具
  • 门票返还
  • 每日首通奖励提示

进入条件 requirements

yaml
dungeon:
  requirements:
    scope: leader
    list:
      - "{calc:%player_level%+0} >= 30"
      - "%player_job% == 战士"
字段作用
scope: leader只检查队长
scope: all-online检查当前服务器在线队员

requirements.list 支持:

  • PAPI
  • <变量>
  • {calc:公式}
  • GTCore 表达式

常见写法:

yaml
requirements:
  scope: leader
  list:
    - "{calc:%player_level%+0} >= 60"
    - "{calc:%player_zhandouli%+0} >= 50000"
    - "%player_job% == 法师"

如果跨服检查全队,注意不在当前子服的玩家无法直接读取本服 PAPI。跨服开本建议先检查队长,或让各子服共享玩家属性数据。

成本 cost

yaml
dungeon:
  cost:
    scope: leader
    stamina: "{calc:10+<members>*2}"
    money: "{calc:100*<members>}"
    items:
      - "vanilla:DIAMOND x1"
字段作用
scope: leader只扣队长
scope: all-online扣当前服务器在线队员
stamina体力消耗
money金币消耗
items物品消耗

staminamoney 支持公式:

yaml
cost:
  stamina: "{calc:30}"
  money: "{calc:100*<members>}"

<members> 是队伍当前人数。

物品消耗

yaml
cost:
  items:
    - "vanilla:DIAMOND x1"
    - "ia:dungeon_ticket x1"
    - "ce:forest_key x1"
    - "oa:abyss_token x2"

常用前缀:

前缀说明
vanilla:原版物品
ia:ItemsAdder
ce:CraftEngine
oa:Oraxen

不同物品库的真实 ID 以对应插件为准。展示图标和扣除物品建议先在测试服验证。

开始动作

yaml
dungeon:
  start-actions:
    - "[console] say <leader> 开始了 <dungeon_name>"

开始动作在副本启动流程中执行。常用变量:

text
<leader>
<team>
<team_id>
<dungeon>
<dungeon_name>
<engine_dungeon>
<members>

完成、奖励、失败动作

yaml
dungeon:
  finish-actions:
    - "[console] say <player> 完成 <dungeon> success=<success> damage=<damage>"
  reward-actions:
    - "[message] &a你获得了 <dungeon_name> 的奖励。"
    - "gtmd:setitem example_reward"
  fail-actions:
    - "[message] &c副本失败了,下次再战。"
  return-actions: []
动作触发
finish-actions副本结束时
reward-actions成功结算发奖励时
fail-actions失败结算时
return-actions返回或收尾时

动作语法见 GUI 与客户端界面

开本检查顺序

队长执行 /gdt dungeon start 后,插件按这个顺序处理:

  1. 检查玩家是否有队伍。
  2. 检查执行者是否是队长。
  3. 检查队伍是否选择了副本。
  4. 读取 dungeons/ 中的副本配置。
  5. 检查队伍人数是否在 min-playersmax-players 范围内。
  6. requirements.scope 检查进入条件。
  7. cost.scope 预检查体力、金币、物品。
  8. 如果目标服不是当前服,创建跨服等待请求并传送队员。
  9. 扣除体力、金币、物品。
  10. 调用副本适配器启动副本。
  11. 启动成功后记录副本运行状态。

如果中途失败,后面的步骤不会继续。跨服传送失败时,会取消等待请求。

command 适配器示例

yaml
dungeon:
  id: test
  name: "&a测试副本"
  provider: command
  engine-id: test
  min-players: 1
  max-players: 4
  start-actions:
    - "[console] say 队伍 <team> 开始测试副本"

用它检查:

  • 队伍是否能选副本
  • 体力是否扣除
  • 金币是否扣除
  • 物品是否扣除
  • 结算动作是否执行

这些都通了,再接真实副本插件。