Skip to content

This_Monster

在 Race 250 怪物脚本中,This_Monster 表示当前怪物,类型为 TAnimal。下面介绍编写行为脚本时使用的回调、属性和方法;首次配置可先照着 Race 250 脚本怪配置完成一个示例。

本页接口为 GOW-Next 脚本怪扩展。攻击内容在 M2 中配置,脚本通过攻击槽选择招式。

脚本回调

这些过程由引擎调用,直接定义在怪物的 .pas 文件中。

pascal
procedure OnInitialize;
procedure OnSpawn;
procedure OnThink;
procedure OnStruck(AttackerToken, AttackerKind: Integer);
回调调用时机
OnInitialize初始化脚本时调用;已有怪物切换到重载后的脚本时也会调用,可省略
OnSpawn怪物生成后首次运行时调用一次,可省略;重载脚本不会再次触发
OnThink周期执行,主要在这里寻敌、追近和选招,必须提供
OnStruck怪物受击时调用,可省略;两个参数分别是攻击者临时标识和攻击者类型

OnThink 默认间隔为 800 毫秒。需要调整时,在 Envir/monScript.txt 的怪物名后填写:

text
万年恶尸 ThinkMs=800

ThinkMs 支持 250~60000 毫秒。它控制脚本判断频率,实际攻击和移动仍受怪物自身间隔限制。每次回调完成本轮判断后返回,等待下一次调用即可。

OnStruckAttackerKind 可与以下常量比较:

常量类型
AK_UNKNOWN0未知
AK_PLAYER1玩家
AK_SLAVE2宝宝
AK_MONSTER3怪物
AK_NPC4NPC

例如,受击后尝试把攻击者设为目标:

pascal
procedure OnStruck(AttackerToken, AttackerKind: Integer);
var
  Attacker: TCreature;
begin
  Attacker := This_Monster.ResolveVisibleCreature(AttackerToken);
  if This_Monster.IsValidTarget(Attacker) then
    This_Monster.SetTarget(Attacker);
end;

只读属性

属性类型说明
NameString怪物名称
LevelInteger当前等级
MapNameString所在地图编号
MapDescString所在地图名称
My_XInteger当前横坐标
My_YInteger当前纵坐标

例如:This_Monster.LevelThis_Monster.My_X

目标与移动

GetTarget

取得当前目标,没有目标时返回 nil。使用前可用 IsValidTarget 再检查一次。

pascal
function GetTarget: TCreature;

IsValidTarget

检查 Target 是否是当前怪物可攻击的有效目标,包括存活、同地图和敌我关系检查。传入 nil 返回 False;返回 True 时,仍需满足所选攻击的起手距离。

pascal
function IsValidTarget(Target: TCreature): Boolean;

SetTarget

Target 设为当前目标。有效时返回 True,无效或为 nil 时返回 False,原目标保持不变。

pascal
function SetTarget(Target: TCreature): Boolean;

SearchTarget

从当前可见对象中选择 Range 格以内最近的有效敌人,并设为当前目标。找到返回 True;未找到返回 False,原目标保持不变。

pascal
function SearchTarget(Range: Integer): Boolean;

Range <= 0 时使用怪物的视野范围,Race 250 默认是 7 格。填写更大的数值也只能搜索当前可见对象。

DistanceTo

返回当前怪物与 Target 的格数距离,横向、纵向距离取较大值,因此相邻的斜向格也算 1 格。Target = nil 时返回 2147483647

pascal
function DistanceTo(Target: TCreature): Integer;

该方法只计算坐标距离;判断目标是否可攻击时,先调用 IsValidTarget

TryChaseTarget

尝试向 Target 走一步。实际移动后返回 True;目标无效、移动间隔未到、起手动作尚未结束或无法移动时返回 False。下次是否继续追近,由下一轮脚本决定。

pascal
function TryChaseTarget(Target: TCreature): Boolean;

ResolveVisibleCreature / ResolveVisiblePlayer

OnStruck 收到的攻击者 Token 解析为当前可见对象。找不到或对象已离开当前视野时返回 nil

pascal
function ResolveVisibleCreature(Token: Integer): TCreature;
function ResolveVisiblePlayer(Token: Integer): TPlayer;

ResolveVisiblePlayer 只返回玩家,攻击者为怪物或宝宝时返回 nilToken 是临时标识,应在当前回调中解析,不作为长期保存的角色编号。

使用 M2 配置的攻击

TryAttack

Target 发起本怪物指定槽位的攻击。

pascal
function TryAttack(Target: TCreature; AttackIndex: Integer): Boolean;
参数说明
Target当前有效的敌方目标,不能为 nil
AttackIndex0~5,依次对应 M2 页面的攻击1~攻击6

返回 True 表示请求已受理,后续按 M2 配置的起手时间、释放后延迟和效果执行。返回 False 表示本次未受理,可紧接着读取 GetLastAttackResult

攻击的距离、范围、伤害、附加效果、表现和独立冷却均使用 M2 对应攻击槽的配置。范围攻击也可以传入目标,引擎在释放时根据目标位置确定落点或方向。

pascal
This_Monster.TryAttack(This_Monster.GetTarget, 0);  { 使用攻击1 }

TryAttackAt

向当前地图指定坐标发起攻击,用于直线和范围等非锁定单体攻击。

pascal
function TryAttackAt(X, Y, AttackIndex: Integer): Boolean;

XY 是目标坐标;AttackIndex 同样为 0~5。坐标需在该攻击的起手距离内。使用锁定单体攻击时会被拒绝,应改用 TryAttack 传入目标对象。

返回值含义与 TryAttack 相同。例如,攻击2配置为范围攻击时,可向怪物脚下释放:

pascal
This_Monster.TryAttackAt(This_Monster.My_X, This_Monster.My_Y, 1);

GetLastAttackResult

读取这只怪物最近一次 TryAttackTryAttackAt 请求的受理结果。应在调用攻击方法后读取。

pascal
function GetLastAttackResult: Integer;
返回值含义
0请求已受理
1未找到该怪物的攻击配置,或攻击槽无效、未配置
2目标无效,或使用坐标接口调用锁定单体攻击
3超出起手距离
4当前不能行动,或上一招仍处于起手阶段
5基础攻击间隔或该招独立冷却尚未结束
6当前待执行攻击数量已达上限,可在后续回调重试

例如,只在距离不足时追近,冷却期间等待:

pascal
if not This_Monster.TryAttack(Target, 0) then
begin
  if This_Monster.GetLastAttackResult = 3 then
    This_Monster.TryChaseTarget(Target);
end;

受理成功不代表已经命中或造成伤害。 起手期间目标离开范围、死亡等情况仍可能取消攻击;结果码也不会随之后的命中结算更新。请求受理时开始计算冷却,未受理的请求不消耗冷却。

变量与命名冷却

这几类数据属于每一只怪物,各只怪物分别保存。存活怪物重载脚本时会保留,怪物销毁后清除;需要保留的值不要在 OnInitialize 中无条件覆盖。

名称使用固定的非空字符串,例如 'phase''say',不要把玩家名或递增编号拼进名称。

GetVarInt / SetVarInt

读写名为 Name 的整数变量。尚未设置时读到 0Value 为新的整数值。

pascal
function GetVarInt(const Name: string): Integer;
procedure SetVarInt(const Name: string; Value: Integer);
pascal
This_Monster.SetVarInt('phase', 1);
if This_Monster.GetVarInt('phase') = 1 then
  This_Monster.TryAttack(This_Monster.GetTarget, 0);

GetVarStr / SetVarStr

读写名为 Name 的字符串变量。尚未设置时读到空字符串;Value 为新的文本。

pascal
function GetVarStr(const Name: string): string;
procedure SetVarStr(const Name, Value: string);
pascal
This_Monster.SetVarStr('state', '追击');

CooldownReady / SetCooldown

检查或设置名为 Name 的冷却。CooldownReady 在未设置或已到期时返回 TrueSetCooldown 从当前时刻重新计算 Ms 毫秒,Ms <= 0 时立即到期,无返回值。

pascal
function CooldownReady(const Name: string): Boolean;
procedure SetCooldown(const Name: string; Ms: Integer);

适合控制说话、传送等脚本行为的频率。M2 已配置的攻击冷却由引擎自动执行,无需再设置同一招的命名冷却。

pascal
if This_Monster.CooldownReady('say') then
begin
  This_Monster.Say('来战!');
  This_Monster.SetCooldown('say', 5000);
end;

同一种怪物的脚本最多使用 16 个整数名称、8 个字符串名称、16 个冷却名称,读取新名称也会占用名额。空名称或超过数量限制会导致脚本报错。

传送与说话

TeleportNear

尝试把当前怪物传送到 Target 附近,距离在 MinRange~MaxRange 格之间的可站立空位。Target 须为有效敌人;传送成功返回 True,目标无效或未找到位置返回 False

pascal
function TeleportNear(Target: TCreature; MinRange, MaxRange: Integer): Boolean;

MinRange 最小按 1 处理,MaxRange 小于 MinRange 时按 MinRange 处理。可配合命名冷却控制传送频率:

pascal
if This_Monster.CooldownReady('teleport') then
begin
  if This_Monster.TeleportNear(Target, 1, 3) then
    This_Monster.SetCooldown('teleport', 5000);
end;

Say

让怪物说出 Text,附近玩家可看到。空字符串不发送,无返回值。

pascal
procedure Say(const Text: string);
pascal
This_Monster.Say('你逃不掉的!');

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