外观
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=800ThinkMs 支持 250~60000 毫秒。它控制脚本判断频率,实际攻击和移动仍受怪物自身间隔限制。每次回调完成本轮判断后返回,等待下一次调用即可。
OnStruck 的 AttackerKind 可与以下常量比较:
| 常量 | 值 | 类型 |
|---|---|---|
AK_UNKNOWN | 0 | 未知 |
AK_PLAYER | 1 | 玩家 |
AK_SLAVE | 2 | 宝宝 |
AK_MONSTER | 3 | 怪物 |
AK_NPC | 4 | NPC |
例如,受击后尝试把攻击者设为目标:
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;只读属性
| 属性 | 类型 | 说明 |
|---|---|---|
Name | String | 怪物名称 |
Level | Integer | 当前等级 |
MapName | String | 所在地图编号 |
MapDesc | String | 所在地图名称 |
My_X | Integer | 当前横坐标 |
My_Y | Integer | 当前纵坐标 |
例如:This_Monster.Level、This_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 只返回玩家,攻击者为怪物或宝宝时返回 nil。Token 是临时标识,应在当前回调中解析,不作为长期保存的角色编号。
使用 M2 配置的攻击
TryAttack
对 Target 发起本怪物指定槽位的攻击。
pascal
function TryAttack(Target: TCreature; AttackIndex: Integer): Boolean;| 参数 | 说明 |
|---|---|
Target | 当前有效的敌方目标,不能为 nil |
AttackIndex | 0~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;X、Y 是目标坐标;AttackIndex 同样为 0~5。坐标需在该攻击的起手距离内。使用锁定单体攻击时会被拒绝,应改用 TryAttack 传入目标对象。
返回值含义与 TryAttack 相同。例如,攻击2配置为范围攻击时,可向怪物脚下释放:
pascal
This_Monster.TryAttackAt(This_Monster.My_X, This_Monster.My_Y, 1);GetLastAttackResult
读取这只怪物最近一次 TryAttack 或 TryAttackAt 请求的受理结果。应在调用攻击方法后读取。
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 的整数变量。尚未设置时读到 0;Value 为新的整数值。
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 在未设置或已到期时返回 True。SetCooldown 从当前时刻重新计算 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('你逃不掉的!');