Skip to content

表单提交 GOW-Next 专用接口 ​

自定义面板可以一次提交多个输入值、开关及背包物品选择。普通 NPC 的脚本与 HelperQuest 均可接收;需要配套客户端面板支持。

回调命名规则 ​

客户端提交表单后,引擎调用目标 NPC 脚本中的对应过程。过程名由固定前缀和业务自定义的表单名组成:

text
procedure FormSubmit_<表单名>(Context: TFormSubmitContext);

<表单名> 是占位符,编写脚本时替换为与客户端提交的 FormName 一致的名称。forge 只是合成面板的示例,不是固定关键字。

FormName服务端处理过程
forgeFormSubmit_forge
recycleFormSubmit_recycle
exchangeFormSubmit_exchange

多个表单使用各自的过程,不必集中写在一个入口中。无需额外添加下划线,按钮的具体操作从 Context.Action 读取。

触发条件与上下文 ​

This_Player 是提交玩家。Context 只读,只在本次回调及其同步调用中有效,不保存到脚本全局变量或定时任务。提交不会自动设置 This_Item。

普通 NPC 要求玩家同图且横纵距离各不超过 15 格;HelperQuest 可作为全局入口。面板是否曾经打开,不代替脚本对权限、材料和数量的检查。

读取字段 ​

接口返回值与用途
FormName: string只读表单名
Action: string只读操作名,例如 preview、confirm
HasField(const Name: string): Boolean是否提交了该字段
TryGetText(const Name: string; var Value: string): Boolean读取文本;空文本有效
TryGetInt64(const Name: string; var Value: Int64): Boolean将文本严格解析为十进制整数
TryGetBoolean(const Name: string; var Value: Boolean): Boolean读取开关;false 有效
TryGetItem(const Name: string; var Item: TBaseItem): Boolean核验当前背包引用,取得可用于现有物品 API 的对象
TryGetItemCount(const Name: string; var Count: Int64): Boolean读取客户端选择数量,不代表库存足够

字段名区分大小写。字段缺失、类型不符或整数溢出时返回 false,并清空输出为 ''、0、false 或 nil。整数允许正负号与前导零,不接受空白、小数或指数。

TBaseItem 提供 ClientItemID、UID、ItemName,可用于 GN_ItemAttr_* 属性接口;按编号操作的接口传入 Item.ClientItemID。对象仅在本次表单回调内有效,物品移除或被替换后失效。TryGetItem 失败时返回 false 并清空为 nil,回调仍会执行。ClientItemID 不作为永久引用保存,持久身份使用 UID。

首版最多 32 个字段。名称最多支持 32 个英文字符或 16 个常用汉字;单个文本值最多支持 128 个英文字符或 64 个常用汉字。中英文混合时,每个常用汉字按两个英文字符计算。超长内容会被拒绝,不会自动截断。未选物品时由客户端省略字段。

合成面板取值示例 ​

下面演示读取两个输入框、一个开关和两个物品框,不执行材料扣除或成品发放。

pascal
procedure FormSubmit_forge(Context: TFormSubmitContext);
var
  NewName: string;
  Times, MaterialCount: Int64;
  Protect: Boolean;
  Equipment, Material: TBaseItem;
begin
  if (Context.Action <> 'preview') and
     (Context.Action <> 'confirm') then Exit;
  if not Context.TryGetText('name', NewName) then Exit;
  if not Context.TryGetInt64('count', Times) then Exit;
  if (Times < 1) or (Times > 10) then Exit;
  if not Context.TryGetBoolean('protect', Protect) then Exit;
  if not Context.TryGetItem('equipment', Equipment) then begin
    This_Player.PlayerNotice('请重新选择装备', 2);
    Exit;
  end;
  if not Context.TryGetItem('material', Material) then begin
    This_Player.PlayerNotice('请重新选择材料', 2);
    Exit;
  end;
  if not Context.TryGetItemCount('material', MaterialCount) then Exit;
  if Equipment.ClientItemID = Material.ClientItemID then Exit;
  This_Player.PlayerNotice('已读取本次选择,请继续进行业务校验', 2);
end;

预览和确认各自提交当前数据。正式合成还需验证装备类型、材料种类、实际库存、保护材料及消耗规则,再调用已有业务结算函数。不能把 MaterialCount 当成服务端持有数量。

选择物品不会锁定或托管物品,预览成功也不保证确认时条件仍成立。重复确认与扣物、发放的一致性由业务结算路径保证;脚本异常不会自动撤销已经执行的操作。处理结果继续使用通知或面板更新接口。

GOW-Next 引擎开发手册 · 原版 API 兼容列表持续核验中