传奇脚本限定仅怪物攻击触发无敌的修改方法

来源: 作者: 点击:
当前脚本中 `checkitemw 始神≌领域·君` 只检测佩戴装备,`random 5` 只控制触发概率,`CHECKTEXTLIST` 那一行被分号注释掉了,没有起到任何限制作用。整段判断对攻击来源没有任何区分,因此怪物和人物攻击都会走同一套触发逻辑。要实现“只受怪物攻击触发无敌、受人物攻击无效果”,核心是加入攻击者类型判断,把人物攻击从条件中剔除。

## 判断攻击者类型的可用命令

引擎中用于区分攻击来源的命令主要有两类。一类是 `CHECKCURRRTARGETFULLNAME`,用于检测当前攻击者的全名是否在指定列表中,但这种方式需要维护人物名单,不适合动态区分怪物和人物。另一类是 `CheckAttackType` 或 `CHECKHITBYMONSTER` 这类攻击来源检测命令,不同引擎版本的写法存在差异,需要根据实际使用的引擎包确认命令名称。

在多数主流引擎中,可以使用 `CHECKCURRRTARGETFULLNAME` 配合怪物名称列表来反向实现:只有当攻击者的名字出现在怪物名称列表中时才触发。但更直接的做法是使用引擎自带的攻击类型判断命令,例如 `CheckAttackType 0` 表示检测本次攻击是否来自怪物,`CheckAttackType 1` 表示来自人物。具体命令名称和参数需要查阅所用引擎的脚本命令手册,不同版本可能写作 `CHECKATTACKTYPE`、`CheckHitByMonster` 或 `CHECKMONSTERHIT`。

如果引擎支持 `CheckAttackType`,脚本结构可以改为在原有条件前增加一行判断,把人物攻击排除掉。

## 修改后的脚本结构

在保留原有装备检测和概率控制的基础上,加入攻击来源判断。参考写法如下:

```
#if
checkitemw 始神≌领域·君
CheckAttackType 0
random 5
#act
ChangeModeEx 14 10
ChangeModeEx 1 2
SENDMSG 6 你被【<$CURRRTARGETNAME>】攻击了。触发防麻痹效果10秒,触发无敌2秒!!!
```

其中 `CheckAttackType 0` 用于限定本次攻击必须来自怪物。如果引擎不支持该命令,可以改用 `CHECKCURRRTARGETFULLNAME` 配合怪物名称列表的方式,把常见怪物名称写入一个文本文件,再用 `CHECKTEXTLIST` 判断攻击者是否在列表中。这种方式需要维护怪物名单,新增怪物时要同步更新文件,维护成本较高。

部分引擎使用 `CHECKHITBYMONSTER` 作为判断命令,写法为 `CHECKHITBYMONSTER`,无需参数,返回真表示本次攻击来自怪物。还有引擎通过 `$CURRRTARGETNAME` 变量结合 `CHECKNAMELIST` 判断,逻辑与名单方式一致。

## 注释行的影响

原脚本中 `;CHECKTEXTLIST ..\QuestDiary\三一真神.txt <$CURRRTARGETNAME>` 这一行被分号注释,意味着它完全不参与判断。如果希望恢复这行作为限制条件,需要先去掉行首的分号,同时确保 `三一真神.txt` 文件中存放的是需要排除的人物名称列表,并且 `CHECKTEXTLIST` 命令在当前引擎中可用。但这种方式只能排除名单内的人物,无法覆盖所有人物攻击,不适合作为通用的“仅怪物触发”方案。

## 引擎差异与调试要点

不同引擎对攻击来源判断的支持程度不同。GOM引擎、GEE引擎、BLUE引擎各自有独立的命令集,同一个功能在不同引擎中的命令名称可能完全不同。修改前需要确认服务端使用的引擎类型,查阅对应引擎的脚本命令文档。

修改后重启服务端,分别用怪物和人物对佩戴该装备的角色进行攻击测试。如果人物攻击仍然触发无敌,说明攻击来源判断命令未生效或参数写错。可以在 `#ACT` 段临时加入 `SENDMSG 6 触发来源判断通过` 这类调试信息,确认脚本是否进入了执行分支。

如果引擎完全不支持攻击来源判断,另一种思路是通过伤害来源的变量判断。部分引擎在受到攻击时会生成攻击者名称变量,可以结合 `CHECKNAMELIST` 和人物名单反向排除,但这种方式需要持续维护人物名单,实际使用中容易遗漏。更稳妥的做法是升级引擎版本或更换支持攻击类型判断的引擎包。