外观
表单提交 GOW-Next 专用接口
自定义面板可以一次提交多个输入值、开关及背包物品选择。普通 NPC 的脚本与 HelperQuest 均可接收;需要配套客户端面板支持。
回调命名规则
客户端提交表单后,引擎调用目标 NPC 脚本中的对应过程。过程名由固定前缀和业务自定义的表单名组成:
text
procedure FormSubmit_<表单名>(Context: TFormSubmitContext);<表单名> 是占位符,编写脚本时替换为与客户端提交的 FormName 一致的名称。forge 只是合成面板的示例,不是固定关键字。
| FormName | 服务端处理过程 |
|---|---|
forge | FormSubmit_forge |
recycle | FormSubmit_recycle |
exchange | FormSubmit_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 当成服务端持有数量。
选择物品不会锁定或托管物品,预览成功也不保证确认时条件仍成立。重复确认与扣物、发放的一致性由业务结算路径保证;脚本异常不会自动撤销已经执行的操作。处理结果继续使用通知或面板更新接口。