外观
地图切换触发
地图切换事件只处理玩家从一张地图进入另一张地图。同地图内移动或传送不触发。前后阶段在 M2 的“新触发”页独立启用。
切换前后
OnBeforeMapChange 用于可取消的主动流转,包括玩家通过地图门或明确目标的普通传送切图。空间传送和复活相关流转不开放前置取消;成功跨地图后仍可收到 OnAfterMapChange。进入前已失败的流转没有成功后置。
前置参数类型为 TBeforeMapChangeContext,后置为 TAfterMapChangeContext:
| 字段 | 类型 | 含义 |
|---|---|---|
Player | TPlayer | 切图玩家 |
FromMap、ToMap | String | 源地图和目标地图 |
FromX、FromY | Integer | 原位置 |
ToX、ToY | Integer | 目标位置;后置为实际进入的位置 |
前置另有 Cancelled: Boolean 和无参 Cancel。前置返回后,M2 会重新检查玩家、地图与落点条件;检查失败不会执行这次切图。后置只能观察结果,不能撤销切换。
pascal
procedure OnBeforeMapChange(Context: TBeforeMapChangeContext);
begin
if Context = nil then Exit;
if (Context.ToMap = '任务地图') and
(Context.Player.Level < 50) then
begin
Context.Player.PlayerNotice('达到 50 级后才能进入', 2);
Context.Cancel;
Exit;
end;
end;
procedure OnAfterMapChange(Context: TAfterMapChangeContext);
begin
if Context = nil then Exit;
Context.Player.PlayerNotice(
'已进入 ' + Context.ToMap, 2);
end;示例中的地图名应替换为实际地图标识;Cancel 只阻止本次切换,不会回滚脚本在回调中自行完成的其他操作。
回城按钮前置
在 M2 → 配置 → 服务参数 → 新触发 中开启“回城按钮前”,并在 RunQuest.pas 添加:
pascal
procedure OnBeforeBackHome(Context: TBeforeBackHomeContext);
begin
if Context.Player.MapName = '活动地图' then
begin
Context.Cancel;
Context.Player.PlayerNotice('活动期间不能使用回城按钮。', 2);
Exit;
end;
end;| 成员 | 含义 |
|---|---|
Player: TPlayer | 点击回城按钮的玩家,只读 |
Cancelled: Boolean | 是否已取消本次默认回城,只读 |
Cancel | 无参方法,阻止本次默认回城 |
只针对存活玩家点击客户端回城按钮;回城卷、NPC 传送和死亡回城不触发。默认关闭。 正常返回且未取消时,继续默认回城,仍检查地图限制和玩家状态。需要自定义传送或打开菜单时,先调用 Cancel,再执行脚本逻辑。
启用此事件后,不再调用盘古 OnBackButton;关闭时恢复原有回城按钮处理。启用后过程缺失或执行异常,本次回城停止并记录脚本诊断,不回退到旧回调。没有按钮后置事件;成功跨地图可使用 OnAfterMapChange,同地图回城不会触发切图事件。