在传奇单机架设中,实现“怪物不攻击人物、只攻击其他怪物”的效果,不能只靠一段万能脚本,核心要看当前使用的引擎是否支持目标过滤。常见做法有三种:数据库 Race 行为码控制、QFunction 攻击触发脚本拦截、怪物 AI 目标选择脚本重写。
第一种:数据库 Race 行为码控制
打开 Monster.DB 或 cfg_monster 怪物数据表,找到对应怪物的 Race 字段。Race 决定怪物行动模式和攻击逻辑。
部分引擎中,Race=11 表示无敌加瞬移,主动攻击怪物和红名;Race=112 表示只主动攻击红名,射程较长。如果目标是让怪物主要攻击怪物而不主动追打普通玩家,可以优先测试 Race=11、Race=112 这类行为码。
需要注意,Race=108 在部分引擎中是“不攻击人,也不被攻击伤害”,它会让怪物接近无敌状态,通常不适合做互打怪。
修改完成后保存怪物数据库,重启服务端或重新加载怪物配置。若怪物仍不攻击,需要同时检查 CoolEye 视野值,避免设为 0 导致怪物无法锁定目标。
第二种:QFunction 攻击触发脚本
适用于 GOM、翎风等支持 QFunction 触发脚本的引擎。进入服务端目录:
Mir200EnvirMarketDefQFunction-0.txt
找到 [@ATTACK] 或攻击触发段。这里可以判断攻击对象是否为怪物,再决定是否执行后续行为。
示例思路如下:
[@ATTACK]
; 判断攻击目标是否为怪物
; 非怪物则不执行互打逻辑
; 是怪物则执行嘲讽、改目标或伤害转移
NOT HUMAN
; 此处只对怪物生效
MOBTAUNT 20 0 0 0
其中 NOT HUMAN 表示当前攻击目标不是人物;MOBTAUNT 用于嘲讽周围怪物,参数含义通常为最大范围、最小范围、是否检测等级、最大嘲讽数量。
如果希望怪物之间互相攻击,可以把嘲讽对象限制为怪物,并配合怪物仇恨脚本,让它们优先锁定附近怪物。部分引擎需要在怪物脚本或地图脚本中额外开启仇恨转移,否则怪物仍会按默认 AI 选择玩家。
第三种:怪物 AI 目标选择脚本
部分引擎支持怪物 AI 脚本或 onThink、onCombat、statschange 一类事件。可以写一个目标过滤脚本:当怪物选择目标时,如果目标是玩家,则移除或跳过;如果目标是怪物,则允许攻击。
伪代码示例:
onThink(monster)
{
targetList = monster.getTargetList()
for each target in targetList
{
if target.isPlayer()
{
monster.removeTarget(target)
}
}
if monster.getTarget() == null
{
monster.searchTarget(MONSTER_ONLY)
}
}
这段逻辑的关键是两点:一是禁止怪物把玩家加入目标列表;二是让怪物重新搜索目标时只搜索怪物。不同引擎函数名可能不同,例如有的使用 setTarget、removeTarget、searchTarget,有的使用 onCombat 返回 false 来阻止攻击。
如果引擎不支持“只搜索怪物”的参数,可以采用替代方案:给玩家添加临时友方标识,让怪物 AI 忽略玩家;或者给参与互打的怪物设置同一阵营,使其只对非本阵营怪物产生仇恨。
第四种:阵营与仇恨隔离
更稳定的做法是把互打怪物划入独立阵营。例如设置怪物阵营 A,玩家阵营 B,怪物 A 只对非 A 阵营单位产生仇恨,同时把玩家加入不可仇恨列表。这样即使玩家靠近,怪物也不会切换目标。
部分引擎中,可以通过怪物脚本设置仇恨范围、仇恨优先级和不可攻击列表。如果怪物仍然追玩家,通常需要检查以下字段:
CoolEye:视野过大时容易锁定玩家,过小则无法发现怪物目标。
Race:必须选择支持主动攻击或可自定义目标的行为码。
WalkSpeed:移动速度过低会导致怪物看起来不追击。
LifeTime:存活时间太短会导致仇恨未建立就消失。
第五种:实战配置步骤
先确认引擎类型,不同引擎脚本命令差异很大。
在怪物数据库中为互打怪物单独建立一组配置,不要直接修改原版怪物。
设置 Race 为支持主动攻击的行为码,例如 81、87、112,再根据需求测试 11。
在 QFunction 攻击触发中增加非人物判断,防止玩家被卷入互打逻辑。
在怪物 AI 中增加目标过滤,移除玩家目标,只保留怪物目标。
重启服务端后进入测试地图,观察怪物是否只锁定怪物。
如果怪物仍攻击玩家,优先检查是否有其他脚本覆盖了目标选择,例如刷怪脚本、仇恨脚本、行会战脚本或玩家召唤物脚本。
第六种:常见问题排查
怪物完全不攻击:检查 Race 是否为非攻击型,如 51、52、220。
怪物只攻击玩家:说明目标过滤未生效,需要在 AI 层移除玩家目标。
怪物互相不攻击:检查阵营设置、仇恨范围、CoolEye 视野和 WalkSpeed 移动速度。
玩家靠近后怪物切换目标:需要在 onThink 或每次目标选择时持续过滤玩家。
召唤物被攻击:如果玩家召唤物也被怪物攻击,需要单独判断召唤物归属,避免误伤。
第七种:推荐方案
如果只是少量怪物互打,优先使用数据库 Race 加 QFunction 攻击触发脚本。若需要整张地图怪物都不攻击玩家,建议使用怪物 AI 目标过滤脚本,并配合阵营系统。这样比单纯改 Race 更稳定,也能避免玩家误触仇恨后怪物乱追人。

