外观
新触发:启用与使用约定 GOW-Next 专用接口
新触发用于处理玩家正在发生的操作。前置、后置事件使用固定的 RunQuest.pas 过程;前置可在操作提交前作判断,后置报告已经成立的结果。挖矿产出使用单独的接管回调,过程名可以配置。
启用一个事件
- 在 M2 主窗口 → 配置 → 服务参数 → 新触发 中,勾选所需事件的“前”或“后”开关并保存。各阶段独立启用,默认关闭。
- 在版本的
RunQuest.pas中添加对应的过程,并声明该事件的上下文参数。已有RunQuest.pas时,把过程加入现有脚本,不要再建立第二个program RunQuest。 - 重载
RunQuest.pas,用一名玩家执行对应操作,先确认回调能输出提示,再加入玩法规则。
例如启用“装备变更前”后,可以加入:
pascal
procedure OnBeforeEquipChange(Context: TBeforeEquipChangeContext);
begin
if Context = nil then Exit;
Context.Player.PlayerNotice('准备变更装备', 2);
end;如果开关已启用但过程不存在,操作不会自动得到期望的脚本处理;应同时检查 M2 的脚本诊断。登录与退出继续分别使用 LogonQuest.pas 和 LogoutQuest.pas,不在此重复增加新触发。
第一版事件
| 场景 | 前置过程 | 后置过程 | 说明 |
|---|---|---|---|
| 装备变更 | OnBeforeEquipChange | OnAfterEquipChange | 穿戴、卸下、替换;原生强制移除只有后置 |
| 物品使用 | OnBeforeItemUse | OnAfterItemUse | 玩家使用背包物品 |
| 拾取 | OnBeforePickup | OnAfterPickup | 地面物品或金币 |
| 回城按钮 | OnBeforeBackHome | — | 可取消默认回城,仅针对客户端按钮 |
| 切换地图 | OnBeforeMapChange | OnAfterMapChange | 前置仅用于可取消的主动流转 |
| 攻击与技能使用 | OnBeforePlayerAction | OnAfterPlayerAction | 玩家普攻、实际挥出的物理技能与主动施法 |
| 伤害结算 | OnBeforeDamage | OnAfterDamage | 玩家造成或受到的一笔伤害 |
| 玩家死亡 | OnBeforePlayerDeath | OnAfterPlayerDeath | 前置可用 ReviveTo 保命 |
| 玩家复活 | — | OnAfterPlayerRevive | 实际死亡后恢复存活 |
各事件的开关、上下文字段及例外见左侧对应页面。
挖矿产出接管
挖矿产出使用 TMiningContext,默认过程名为 OnMining。在 游戏功能 → 特色玩法 → 挖矿 中启用,不使用上述前置、后置开关。脚本可以选择继续默认挖矿、此次无产出,或指定一件产物。
回调共同规则
- 各事件过程接收一个强类型
Context参数;字段和操作通过该参数读取。玩家也可从Context.Player读取。OnAfterPlayerRevive暂无专用上下文,直接使用This_Player。 - 上下文只在本次回调期间有效。需要延迟处理时,保存必要的值,执行时重新查找对象;不要把上下文对象存入全局变量。
- 可取消的前置使用无参
Cancel。取消只阻止本次操作,不会自动给玩家发消息;需要提示时由脚本自行调用消息 API。Cancel不会结束当前 Pascal 过程,后续代码不应执行时请接着写Exit。前置返回后,引擎会重新检查关键对象和条件;若已失效,本次操作不提交,也不触发对应后置。 - 后置不能取消已经成立的操作。前置取消也不会撤销脚本自己执行的其他业务操作。
RunQuest.pas由多个玩家共用。脚本全局变量不自动按玩家隔离,单次事件优先使用局部变量和上下文。
共用物品信息 TItemInfo
装备、物品使用和拾取事件中的物品使用同一只读信息类型:
| 字段 | 类型 | 含义 |
|---|---|---|
ClientItemID | Integer | 运行时物品实例编号;不是背包格位或持久 UID |
ItemIndex | Integer | 物品数据库编号 |
ItemName | String | 物品名称 |
事件中的物品信息是当次操作的快照。后置仍可查看已移除物品的名称和编号;不能凭快照判断它仍在背包或装备位。某些场景中物品可以为 nil,使用字段前先判断。
ClientItemID 是运行时编号,重登或服务端重启后可能变化。不要把回调快照中的编号保存为永久引用;再次操作物品时,应重新取得当前玩家持有的物品。TItemInfo 用于事件快照,不能直接传给要求 TBaseItem 的物品操作接口。