外观
物品与装备触发
本页事件都以正在操作的玩家为主体。物品字段使用共用的 TItemInfo 快照;装备、使用及拾取各阶段须分别在 M2 的“新触发”页启用。
装备变更
OnBeforeEquipChange 在玩家主动穿戴、卸下或替换之前运行;原生条件已判定失败的请求不进入前置。前置正常返回后会复查装备位、物品身份、背包与穿戴条件。成功提交后,OnAfterEquipChange 运行一次;替换不会拆成卸下和穿戴两次事件。原生强制移除装备只有后置。
前置参数类型为 TBeforeEquipChangeContext,后置为 TAfterEquipChangeContext:
| 字段 | 含义 |
|---|---|
Player: TPlayer | 操作玩家 |
Slot: Integer | 发生变化的装备位 |
OldItem: TItemInfo | 原装备,可为 nil |
NewItem: TItemInfo | 将穿上或已穿上的物品,可为 nil |
Reason: Integer | ECR_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 在原生或物品脚本处理器接受使用并完成对应背包更新后运行。一次使用至多有一次后置;被拒绝或处理失败没有后置。该事件不是通用的物品入包、出包或效果接管接口。
| 阶段 | 上下文字段 |
|---|---|
TBeforeItemUseContext | Player: TPlayer、Item: TItemInfo、Cancelled: Boolean、无参 Cancel |
TAfterItemUseContext | Player: 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;