外观
怪物批次玩法示例
怪物批次只负责管理怪物。割草玩法的持续补怪、守点玩法的固定波次,都可以由普通 NPC 脚本安排,无需单独的玩法引擎。
以下为动态房间控制脚本的核心片段,不是完整可直接运行的脚本。接口参数见怪物批次。包含中文怪物名时,脚本文件沿用引擎脚本的 GBK 编码,不要因文档为 UTF-8 而改变脚本编码。
创建与追击
以单人房间为例,在进入时创建批次、绑定玩家并记录开始时间。Batch 和 StartTick 使用脚本级 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; // 其余属性继承怪物模板割草:按附近密度补怪
下面的方法在每次补怪回调中调用。X、Y 传入玩家当前位置;先清理远处怪物,再按附近数量补足。固定时间表放在脚本中,这里演示一分钟后提高目标密度。
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 时推进下一波。
生成不足时由脚本决定后续补齐还是接受较少数量;生成失败不能当作通关。当前追击目标仅支持玩家,攻击建筑、怪物阵营对抗不在本组接口能力内。