手动运行怪物攻城脚本,核心在于三个环节的串联:触发入口的手动化配置、怪物生成时的移动属性预设、以及攻城路径与目标的逻辑绑定。多数版本默认的怪物攻城只是定点刷怪,怪物只会在原地游荡或随机走动,无法形成向特定目标推进的压迫感。要实现真正意义上的移动性攻城,必须从怪物AI类型、路径点序列、攻击目标优先级三个维度同时下手。
手动触发入口的搭建方式
手动运行意味着脚本不依赖系统定时器自动启动,而是由管理员通过GM命令或特定NPC主动唤起。两种常用的触发方式各有优劣。
GM命令触发最为直接。在Command.ini中添加一条自定义命令,指向QFunction-0.txt中的对应标签段。格式通常为:
ACT
#IF
EQUAL G0 0
#ACT
MOV G0 1
EXECUTE 执行攻城启动流程
SENDMSG 0 怪物攻城活动已由管理员手动开启
BREAK
这里用全局变量G0作为活动开关,防止重复触发。命令名称可以自定义,例如"@StartSiege",管理员在游戏内输入即可启动。需要注意在活动结束后将G0重置为0,否则下次无法再次触发。
NPC触发方式适合让特定道具或NPC管理权限来启动。在比奇或盟重添加一个隐藏NPC,只有持有管理权限或特定物品的玩家点击后才会弹出确认框。确认后调用相同的启动脚本段。这种方式比GM命令更隐蔽,也便于在脚本中加入额外的判断条件,比如检测当前在线人数是否达标、距离上次开启是否超过冷却时间等。
怪物生成的基础命令与移动参数
怪物生成命令在不同引擎中略有差异,但核心参数结构基本一致。以GOM和GEE引擎为例,MONGEN命令是最常用的刷怪指令。
标准格式为:MONGEN 地图号 X坐标 Y坐标 怪物名称 数量 范围 颜色 性别
其中与移动性直接相关的是坐标和范围参数。如果只填一组固定坐标,怪物会在该点周围随机分布,生成后按照默认AI行动。默认AI通常是随机游荡加遇敌攻击,这样的怪物不会主动向城内推进,只能算定点刷新。
要让怪物有明确的移动方向,必须在生成时就指定其AI类型和初始目标。部分高级引擎支持在MONGEN后追加参数设置AI等级和攻击目标。例如:
MONGEN 3 330 330 祖玛教主 1 0
CHANGEAITYPE 330 330 祖玛教主 5
CHANGEAITYPE命令用于修改指定坐标范围内怪物的AI类型。AI类型数值决定了怪物的行为模式:
类型0:原地不动,只攻击进入视野的玩家
类型1:随机游荡,普通怪物默认
类型2:巡逻模式,按固定路径点循环移动
类型3:追击模式,锁定玩家后持续追击
类型4:守卫模式,守护特定区域
类型5:攻城模式,向指定目标点移动并攻击沿途障碍
攻城模式AI是实现移动性攻城的关键。设置为类型5后,怪物会自动寻找最近的攻击目标,优先攻击玩家、守卫大刀、城门NPC等。但仅凭默认的攻城AI,怪物往往只会走直线,遇到障碍物就会卡墙,无法按照规划的路线推进。
路径点驱动的移动攻城方案
真正可控的移动攻城,需要采用路径点序列配合怪物位置刷新或强制移动的方式实现。常见的有两种技术路线:路径点瞬移法和分段推进法。
路径点瞬移法的原理是预先在攻城路线上标记一系列坐标点,然后每隔固定时间将攻城怪物集体移动到下一个路径点。这种方式实现简单,怪物不会迷路,但移动不够平滑,看起来像是在跳跃前进。
具体实现步骤:
第一步,采集路径点。从城外刷新点到城内目标点(比如皇宫门口),每隔一段距离记录一个坐标。路径点之间的间距决定了移动的平滑度,间距越小越流畅,但脚本量越大。通常20到30格一个点比较合适。一条完整的攻城路线建议设置15到25个路径点,覆盖从城门到皇宫的整条主干道。
第二步,定义路径点数组。在脚本开头用变量存储所有路径点坐标。由于传奇脚本原生不支持数组,通常用多个变量模拟。例如:
MOV S10 333 222
MOV S11 340 230
或者将坐标拼接成字符串存入全局变量,用时再拆分。这种方式变量占用少,但需要额外的字符串处理逻辑。
第三步,怪物生成与标记。在刷新点生成怪物后,给每个怪物打上攻城标记,方便后续批量操作。标记可以用怪物名称后缀实现,比如生成"攻城祖玛卫士"而不是普通的"祖玛卫士"。或者利用怪物的附加属性位,部分引擎支持给怪物设置自定义变量。
第四步,定时移动。开启一个定时器,每3到5秒执行一次移动逻辑。移动时遍历当前路径点索引,将所有带攻城标记的怪物移动到下一个路径点附近。移动命令常用MOBHUMANMOVE或SETPOSITION,具体依引擎而定。如果引擎不支持批量移动,就只能用循环逐个处理。
第五步,到达终点后的行为。当路径点索引走到最后一个点时,停止移动,将怪物AI切换为攻城或守卫模式,让它们自由攻击周围的玩家和建筑。同时可以触发第二波、第三波怪物的生成逻辑。
这种方法的缺点是怪物在移动过程中不会主动攻击玩家,遇到阻拦也不会停下来战斗,更像是在走流程。适合用于大型活动的仪式感进场,或者配合剧情演出。
分段推进法更加贴近真实的攻城体验。其核心思路是将整个攻城路线划分为若干个战斗区域,怪物在每个区域内自由战斗一定时间后,再集体向下一个区域推进。这样既保证了移动的方向性,又保留了战斗的交互性。
实现方式是在每个区域设置一个集结点和停留时间。怪物生成后先在第一区域自由活动,计时器结束后,所有存活的攻城怪物被传送到第二区域的集结点,继续战斗。以此类推,直到最终到达皇宫。
这种方式的脚本结构相对清晰,每个区域一段独立的刷怪和计时逻辑。玩家在防守时也有明确的阶段性,可以在不同路段布置不同的防御力量。
攻击目标优先级设定
移动性攻城不仅是让怪往前走,还要让它们在移动过程中正确地攻击目标。默认AI下,怪物会优先攻击离自己最近的玩家。但在攻城场景中,往往希望怪物优先攻击城门、守卫、NPC等建筑目标,玩家只是次要目标。
调整攻击优先级,需要借助引擎提供的SETTARGET命令或修改怪物仇恨机制。部分高级引擎支持在怪物生成时设置其仇恨列表的优先级:
SETTARGETTYPE 怪物名称 1
数值1表示优先攻击NPC和守卫,数值2表示优先攻击建筑和城门,数值0是默认的优先玩家。如果引擎不支持直接设置优先级,就只能用脚本模拟:每隔一定时间检测攻城怪物附近是否有防御NPC,如果有就强制怪物攻击该NPC。
强制攻击的实现通常用MOBATTACK命令,指定怪物ID或名称以及目标坐标或目标NPC名称。例如:
MOBATTACK 攻城祖玛教主 比奇城门
这条命令会让指定怪物立刻向比奇城门发起攻击,直到城门被摧毁或怪物死亡。配合路径点移动,可以实现怪物边推进边破坏沿途防御设施的效果。
需要注意的是,强制攻击命令对部分BOSS级怪物可能无效,因为BOSS有自己独立的AI逻辑。这时需要在怪物DB数据库中修改该怪物的AI类型字段,将其改为更具攻击性的类型,或者降低其逃跑概率。
完整脚本结构示例
一个完整的手动移动攻城脚本,通常由以下几个标签段组成:
启动段负责初始化变量、清场、广播消息、开启第一波刷新。
刷新段按批次在不同坐标生成怪物,设置AI和标记。
路径推进段由定时器驱动的怪物移动逻辑,处理路径点切换。
战斗监测段检测攻城怪物数量,判断是否全部被消灭,触发胜负逻辑。
结束段清理残留怪物、重置变量、发放奖励或惩罚。
以GOM引擎为例,核心代码片段大致如下:
[@StartSiege]
#IF
EQUAL G_SIEGE_FLAG 0
#ACT
MOV G_SIEGE_FLAG 1
MOV G_SIEGE_STEP 0
MOV G_SIEGE_MONCOUNT 0
SENDMSG 0 【警告】比奇城遭到怪物军团入侵,全体玩家速回防守!
SECONDSCRIPT 1 @SiegeRefresh 10
SECONDSCRIPT 1 @SiegeMoveLoop 3
BREAK
[@SiegeRefresh]
#ACT
MONGEN 3 310 200 攻城沃玛卫士 20 10
MONGEN 3 315 205 攻城沃玛教主 2 5
CHANGEAITYPE 310 200 20 5
SENDMSG 0 第一波怪物已出现在比奇城外,正在向城门推进!
INC G_SIEGE_MONCOUNT 22
BREAK
[@SiegeMoveLoop]
#IF
EQUAL G_SIEGE_FLAG 1
#ACT
INC G_SIEGE_STEP 1
#IF
EQUAL G_SIEGE_STEP 1
#ACT
MOBMOVEPOS 310 200 320 215 攻城 15
#ELSEACT
#IF
EQUAL G_SIEGE_STEP 2
MOBMOVEPOS 320 215 330 240 攻城 15
以此类推直到最终点
#IF
EQUAL G_SIEGE_STEP 10
#ACT
SECONDSCRIPT 1 @SiegeEnd 60
BREAK
怪物DB与地图配置的配合
脚本层面的设置只是一部分,要让怪物真正能在地图上走得通,还需要地图本身的路径可达。很多版本的城门是堵死的,或者城门处有不可见的障碍物,怪物AI无法自动寻路通过。
解决方法有两种。一是在地图编辑器中打开城门位置的通行权限,将阻挡格改为可通行。这样怪物就能正常通过城门进入城内。但这样做的副作用是玩家也能随意穿过城门,失去了城门的屏障意义。
二是保留城门的阻挡属性,在脚本中做特殊处理。当怪物推进到城门坐标附近时,先让怪物攻击城门NPC。等城门NPC的血量降到0(即被攻破)后,再用脚本将城门处的阻挡临时取消,或者直接将怪物传送到城门内侧。这样既符合逻辑,又增加了玩家防守的目标点。
具体实现时,给城门NPC设置一定的血量,用变量记录。怪物每次攻击造成固定伤害,血量归零即判定城门被破。城门被破后广播全服消息,同时开启通往内城的路径。
另一个常见问题是怪物卡在建筑拐角或地图边缘。这通常是因为路径点选在了障碍物上,或者移动命令的目标坐标不可到达。采集路径点时,一定要亲自走一遍路线,确认每一个点都能正常站立。同时,移动范围参数不要设得太小,给怪物留出几格的随机分布空间,避免所有怪挤在一个坐标上导致穿模或卡顿。
多波次与分路进攻的扩展
基础的单路单波攻城实现后,可以进一步扩展为多波次、多方向的复杂攻城模式。
多波次就是在第一波怪物被消灭或推进到一半时,触发第二波刷新。每波的怪物种类、数量、进攻路线都可以不同。比如第一波是低级怪走正门,第二波是精英怪走侧门,第三波BOSS走密道。这样玩家需要分兵防守,战术性更强。
分路进攻需要为每一路设置独立的路径点序列和推进计时器。各路之间互不干扰,按各自的节奏推进。可以设置一个总计数器,统计所有路还存活的怪物总数,当总数低于阈值时判定守城成功。
实现多路线时,建议给每一路的怪物名称加上不同前缀,如"东路祖玛卫士""西路沃玛战士",方便脚本中按名称批量处理。否则不同路线的怪物混在一起,很难区分和控制。
手动运行的调试与排错
手动触发的好处是便于调试。不需要等定时器到点,随时可以启动和停止。调试过程中几个常见问题需要特别注意。
怪物生成后不动。先检查MONGEN命令的参数是否正确,地图号和坐标是否在有效范围内。再看怪物DB中该怪物的速度是否为0,速度为0的怪物不会移动。最后确认AI类型是否设置正确,类型0的怪物是原地不动的。
怪物走着走着就散了。这是因为怪物在移动途中遇到了玩家,触发了攻击AI,脱离了推进队列。解决方法是提高推进频率,让移动指令覆盖战斗行为,或者在攻城期间降低怪物对玩家的仇恨值。部分引擎支持设置怪物的专注模式,使其只攻击特定目标,不被玩家干扰。
怪物数量不减少。检测怪物存活数量时,不能只靠生成时的计数器递减,因为有些怪物可能被卡住或消失了但没触发死亡事件。最准确的方法是用MOBCOUNT命令实时统计指定地图内带攻城标记的怪物数量。如果数量为0,说明攻城怪物已全部被消灭。
脚本执行到一半停了。检查是否有变量溢出或命令拼写错误。传奇脚本对语法要求很严格,多一个空格或少一个参数都可能导致整段失效。建议每写一段就测试一段,不要全部写完再一起测,出了问题很难定位。
性能优化与注意事项
大规模怪物攻城对服务器性能压力较大。怪物数量过多时,寻路计算和战斗判定会占用大量CPU资源,导致服务器卡顿甚至崩溃。
控制单屏怪物数量是第一原则。同一地图同时存在的怪物不要超过200只。如果需要更多数量,建议分批次刷新,前一波死得差不多了再刷下一波。或者分散到多个地图同时进行。
定时器频率也要控制。移动逻辑的执行间隔不要小于2秒,间隔太短服务器频繁运算反而会让移动看起来更卡。3到5秒一次比较合理,配合合适的路径点间距,视觉上已经足够流畅。
结束时一定要彻底清理。攻城活动结束后,用CLEARMAPMON或MOBKILL命令清除所有残留的攻城怪物,避免它们留在地图上影响正常游戏。同时将所有相关的全局变量重置为初始值,确保下次手动启动时状态正确。
手动运行模式下,建议在脚本中加入紧急停止功能。万一出现刷怪过多、服务器卡顿等意外情况,管理员可以输入一条命令立即终止活动,清除所有怪物并重置状态。这个安全开关在调试阶段尤其重要。
最后提醒一点,不同引擎的命令名称和参数顺序可能存在差异。以上提到的命令和格式基于常见的GOM/GEE引擎体系,如果你使用的是HERO、LEGEND或其他引擎,需要对照对应的脚本说明书调整语法。核心的路径点思想和分段推进逻辑是通用的,具体命令只是实现工具的不同。
传奇手动触发怪物攻城脚本完整实现指南 怪物移动路径规划与攻城AI设置详解
来源:
作者:
点击:

