Skip to content

物品与装备触发 ​

本页事件都以正在操作的玩家为主体。物品字段使用共用的 TItemInfo 快照;装备、使用及拾取各阶段须分别在 M2 的“新触发”页启用。

装备变更 ​

OnBeforeEquipChange 在玩家主动穿戴、卸下或替换之前运行;原生条件已判定失败的请求不进入前置。前置正常返回后会复查装备位、物品身份、背包与穿戴条件。成功提交后,OnAfterEquipChange 运行一次;替换不会拆成卸下和穿戴两次事件。原生强制移除装备只有后置。

前置参数类型为 TBeforeEquipChangeContext,后置为 TAfterEquipChangeContext:

字段含义
Player: TPlayer操作玩家
Slot: Integer发生变化的装备位
OldItem: TItemInfo原装备,可为 nil
NewItem: TItemInfo将穿上或已穿上的物品,可为 nil
Reason: IntegerECR_PLAYER_ACTION 主动操作;ECR_FORCED_REMOVAL 原生强制移除

前置另有 Cancelled: Boolean 和无参 Cancel。后置没有取消方法。判断“不能卸下某件装备”时应检查 OldItem,这样替换也会受限制。

pascal
procedure OnBeforeEquipChange(Context: TBeforeEquipChangeContext);
begin
  if Context = nil then Exit;
  if Context.OldItem = nil then Exit;
  if Context.OldItem.ItemName = '任务戒指' then
  begin
    Context.Player.PlayerNotice('任务戒指不能卸下或替换', 2);
    Context.Cancel;
    Exit;
  end;
end;

procedure OnAfterEquipChange(Context: TAfterEquipChangeContext);
begin
  if Context = nil then Exit;
  // 此时可查询玩家当前全身装备并重算自己的套装玩法。
end;

加载角色原有装备、单纯改变耐久或属性,不算装备变更;只有物品实际离开装备位才有强制移除后置。后置的 OldItem 是操作前快照,不保证物品仍存在。

物品使用 ​

玩家通过客户端使用背包物品时,OnBeforeItemUse 在本次使用前运行,OnAfterItemUse 在原生或物品脚本处理器接受使用并完成对应背包更新后运行。一次使用至多有一次后置;被拒绝或处理失败没有后置。该事件不是通用的物品入包、出包或效果接管接口。

阶段上下文字段
TBeforeItemUseContextPlayer: TPlayer、Item: TItemInfo、Cancelled: Boolean、无参 Cancel
TAfterItemUseContextPlayer: TPlayer、Item: TItemInfo、Consumed: Boolean、Updated: Boolean

Consumed 表示本次使用消耗了物品,Updated 表示物品记录发生更新。Item 是使用时的只读快照,不是可修改背包物品的引用。

pascal
procedure OnBeforeItemUse(Context: TBeforeItemUseContext);
begin
  if Context = nil then Exit;
  if Context.Item.ItemName = '盟重传送石' then
  begin
    Context.Player.PlayerNotice('当前版本暂不能使用该物品', 2);
    Context.Cancel;
    Exit;
  end;
end;

拾取 ​

OnBeforePickup 在玩家拿走地面对象之前运行;只有物品真正入包、合并堆叠或金币入账,才调用 OnAfterPickup。购买、交易和脚本发放物品不属于拾取事件。

前置参数类型为 TBeforePickupContext,后置为 TAfterPickupContext。两者均提供 Player、Item、Gold、Count、X、Y;前置另有 Cancelled 和无参 Cancel,后置另有 Result: Integer。

Result 常量含义
PICKUP_NEW_ITEM新物品进入背包
PICKUP_MERGED_STACK合并到已有背包堆叠
PICKUP_GOLD金币入账

拾取金币时 Item = nil。堆叠合并后,Item.ClientItemID 仍是被拾取的地面物品标识,不代表接收它的背包堆叠。

启用物品 UID 存档后,这个编号只用于当前运行中的物品定位。地面物品完全合并后,快照仍保留原编号,但该物品已经退出持有状态;不要再用它定位接收堆叠,也不要跨重登保存为永久引用。

pascal
procedure OnAfterPickup(Context: TAfterPickupContext);
begin
  if Context = nil then Exit;
  if Context.Result = PICKUP_GOLD then
    Context.Player.PlayerNotice(
      '拾取金币 ' + IntToStr(Context.Gold), 2);
end;

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