Skip to content

怪物批次玩法示例

怪物批次只负责管理怪物。割草玩法的持续补怪、守点玩法的固定波次,都可以由普通 NPC 脚本安排,无需单独的玩法引擎。

以下为动态房间控制脚本的核心片段,不是完整可直接运行的脚本。接口参数见怪物批次。包含中文怪物名时,脚本文件沿用引擎脚本的 GBK 编码,不要因文档为 UTF-8 而改变脚本编码。

创建与追击

以单人房间为例,在进入时创建批次、绑定玩家并记录开始时间。BatchStartTick 使用脚本级 Int64 变量,Attr 为脚本级 TMonsterAttributes 变量,供后续回调使用。

pascal
Batch := MonsterBatchCreate(This_Player, 100);
if Batch = 0 then Exit;
if not MonsterBatchSetTarget(Batch, This_Player) then
begin
  MonsterBatchRelease(Batch);
  Batch := 0;
  Exit;
end;
StartTick := GetTickCount64;
Attr := MonsterAttributes;
Attr.MaxHP := 5000;  // 其余属性继承怪物模板

割草:按附近密度补怪

下面的方法在每次补怪回调中调用。XY 传入玩家当前位置;先清理远处怪物,再按附近数量补足。固定时间表放在脚本中,这里演示一分钟后提高目标密度。

pascal
// 维持玩家附近的怪物密度;每轮最多追加 8 只。
procedure Refill(X, Y: Integer);
var
  TargetCount, NearCount, Need, Added, Status: Integer;
begin
  if Batch = 0 then Exit;
  if MonsterBatchTrimOutside(Batch, X, Y, 24) < 0 then Exit;

  TargetCount := 40;
  if GetTickCount64 - StartTick >= 60000 then
    TargetCount := 60;

  NearCount := MonsterBatchCountNear(Batch, X, Y, 16);
  if NearCount < 0 then Exit;
  Need := TargetCount - NearCount;
  if Need <= 0 then Exit;
  if Need > 8 then Need := 8;

  Added := MonsterBatchAddEx(Batch, '半兽人', Need,
    X, Y, 10, 16, Attr, Status);
  // 未生成足量时留到下一轮处理,不在本轮循环重试。
end;

Need 控制附近密度,创建时的 MaxAlive 控制整批存活总量,两者用途不同。生成半径需要按实际客户端视野调整,并不天然等于视野外。

回调与结束

使用现有 This_Player.CallOutEx 安排补怪回调,例如每秒一次。其延迟单位为秒,GetTickCount64 的单位为毫秒。

时机脚本处理
@OnEnter创建批次、设置目标、记录时间,启动一次补怪回调链
补怪回调检查玩法仍在进行、玩家仍在房间且批次有效,再调用 Refill 并安排下一次回调
@OnDie停止补怪,按规则清空或释放批次
@OnLeave停止补怪,释放批次并将句柄置 0

不要重复启动回调链;结束后仍可能到达的旧回调应直接退出。重新开局时,也要防止上一局的回调参与新一局。

固定波次

守点玩法可以在固定坐标调用 MonsterBatchAdd,不做附近补怪和远处裁剪。记录本波实际生成数量,再通过 MonsterBatchGetStat 查询存活数,成功查询且为 0 时推进下一波。

生成不足时由脚本决定后续补齐还是接受较少数量;生成失败不能当作通关。当前追击目标仅支持玩家,攻击建筑、怪物阵营对抗不在本组接口能力内。

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