LogoArcartX Doc

界面协议

自定义任务面板、追踪 HUD 与对话框时使用的动作和数据结构

界面协议

任务列表页码从 0 开始。客户端只提交分类、页码、任务 ID、目标 ID 或对话 token,任务状态、追踪结果、奖励、进度和路标状态都以服务端回包为准。

协议总览

客户端动作

UI动作参数用途
任务面板listcategory, page请求指定分类的一页任务
任务面板selectquestId获取任务详情
任务面板trackquestId, taskId追踪目标
任务面板untrackquestId, taskId取消追踪
任务面板cleartrack清空全部追踪
对话框replyframe, token选择当前帧的回复
对话框closeframe主动结束当前对话

追踪 HUD 没有客户端动作,服务端会在内容变化时主动同步。

服务端数据处理器

UI处理器数据用途
任务面板tracking_syncTrackingCount当前追踪数与上限
任务面板quest_categoriesQuestCategories分类与单页容量
任务面板quest_syncQuestPage当前页任务摘要
任务面板quest_detailQuestView选中任务详情
任务面板tracking_resultTrackingResult追踪动作结果
任务面板quest_errorUiError被拒绝的面板操作
追踪 HUDtracker_syncTrackerSnapshot完整追踪目标快照
对话框dialogue_frameDialogueFrame当前对话内容与回复
对话框dialogue_close空对象服务端结束对话
对话框dialogue_errorDialogueError对话帧或回复失效

任务面板

玩家执行 /chemdahview open 并确认界面已经打开后,服务端依次发送:

  1. tracking_sync
  2. quest_categories
  3. 空分类第 0 页的 quest_sync

分类与分页

Packet.send('list', selectedCategory, targetPage)
参数说明
category使用 quest_categories.categories[].id;空字符串表示全部进行中
page0 开始的非负整数

quest_categories 返回:

{
  "pageSize": 12,
  "categories": [
    {"id":"","displayName":"全部","totalItems":35,"special":true},
    {"id":"主线","displayName":"主线","totalItems":27,"special":false},
    {"id":"completed","displayName":"已完成","totalItems":41,"special":true}
  ]
}
分类字段类型说明
idString请求 list 时原样使用
displayNameString分类按钮文字
totalItemsNumber当前分类中的任务总数
specialBoolean是否为“全部”“已完成”等特殊分类

quest_sync 顶层只包含:

{
  "totalPages": 3,
  "quests": [
    {
      "id": "frontier-survey",
      "title": "§b边境测绘",
      "type": "主线",
      "taskCount": 4,
      "completedTaskCount": 1,
      "trackedTaskCount": 1
    }
  ]
}
摘要字段类型说明
idString任务 ID
titleString任务标题
typeString任务分类
taskCountNumber目标总数
completedTaskCountNumber已完成目标数
trackedTaskCountNumber正在追踪的目标数

即使列表为空,totalPages 也至少为 1

任务详情

Packet.send('select', questId)

服务端通过 quest_detail 返回:

QuestView 字段类型说明
idString任务 ID
titleString任务标题
typeString任务分类
descriptionArray<String>任务说明
tasksArray<TaskView>目标列表
rewardsArray<RewardView>主任务奖励预览

TaskView

字段类型说明
questId / taskIdString所属任务与目标 ID
questTitle / titleString所属任务与目标标题
descriptionArray<String>目标说明
objectiveTextString主要目标文字
progressProgressView原生进度
stateStringACTIVELOCKEDCOMPLETED
trackedBoolean是否正在追踪
waypointStatusString当前路标状态
rewardsArray<RewardView>目标奖励预览

ProgressView 包含 availablevaluetargetpercent 和已经格式化的 textpercent 范围为 0.01.0

waypointStatus 的取值:

含义
ACTIVE路标正在显示
DISABLED全局路标已关闭
NOT_DECLARED目标没有路标配置
SERVER_TYPE_MISMATCH当前服务器类型不允许
WORLD_MISMATCH当前世界不允许
TARGET_UNAVAILABLE无法取得有效位置
CLIENT_NOT_READYArcartX 客户端资源尚未就绪

只有 ACTIVE 应显示为“路标已启用”。

RewardView

字段类型说明
idString奖励配置 ID
typeStringitemcustom
displayNameString显示名称
descriptionArray<String>奖励说明
iconString自定义奖励图片路径
amountNumber物品数量
amountTextString界面数量文字
itemContentString物品的序列化内容

奖励结构只允许用于显示。

追踪动作

Packet.send('track', questId, taskId)
Packet.send('untrack', questId, taskId)
Packet.send('cleartrack')

trackuntrack 必须提供两个 ID,cleartrack 不带参数。服务端在 tracking_result 中返回权威结果:

{
  "action": "track",
  "questId": "frontier-survey",
  "taskId": "dig-dirt",
  "code": "ADDED",
  "current": 2,
  "maximum": 3,
  "tracked": [
    {"questId":"frontier-survey","taskId":"dig-dirt"}
  ]
}
code含义
ADDED已加入追踪
REMOVED已取消追踪
ALREADY_TRACKED原本已经追踪
NOT_TRACKED原本没有追踪
LIMIT_REACHED已达到追踪上限
UNAVAILABLE任务或目标当前不可追踪
CLEARED已清空全部追踪

清空结果还会包含 removed。客户端应等待 tracking_result 后再更新按钮和计数,不要先改本地状态。

tracking_sync 只包含 currentmaximum,用于初始化或更新面板中的追踪计数。

面板错误

quest_error 包含用于逻辑判断的 code 和可以直接展示的 msg

{
  "action": "list",
  "code": "CATEGORY_NOT_FOUND",
  "msg": "任务分类不存在或已失效"
}

可能的错误码包括 ACTION_NOT_ALLOWEDINVALID_ARGUMENTPROFILE_LOADINGNOT_FOUNDCATEGORY_NOT_FOUNDPAGE_OUT_OF_RANGERATE_LIMITED

追踪 HUD

HUD 只处理 tracker_sync

{
  "current": 2,
  "maximum": 3,
  "tasks": [
    {
      "questId": "frontier-survey",
      "taskId": "dig-dirt",
      "title": "清理松软泥土",
      "objectiveText": "清理泥土",
      "state": "ACTIVE",
      "tracked": true,
      "waypointStatus": "ACTIVE",
      "rewards": []
    }
  ]
}

tasks 中每项都使用与任务详情相同的 TaskView。每次回包都是完整快照,客户端应直接覆盖旧数据,不要定时发送查询包。

对话框

dialogue_frame 返回当前帧:

{
  "frame": "92f4f3c5-...",
  "title": "边境联络员",
  "messages": ["风暴快到了。"],
  "canReply": true,
  "replies": [
    {"token":"reply-rid","text":"我现在就去。"}
  ]
}

回复或主动关闭时,必须原样带回当前 frame

Packet.send('reply', currentFrame, replyToken)
Packet.send('close', currentFrame)

replyToken 只能使用服务端下发的 replies[].token。成功回复后,Chemdah 会继续发送新的 dialogue_frame,或通过 dialogue_close 结束界面。

dialogue_error 包含 codemsg;过期帧或选项会返回 STALE_FRAME。收到 dialogue_close 后直接关闭界面,不要再次发送 close

On this page