传奇脚本NPC不显名&刷钱漏洞终极修复指南,附详细代码解析

来源: 作者: 点击:
#### **问题现象分析**
1. **NPC不显示名字**
- NPC在游戏中存在模型但无名称提示,导致玩家交互困难。
- 可能原因:脚本未定义NPC名称、配置文件坐标错误或地图编号不匹配。

2. **任务条件漏洞导致刷钱**
- 符合条件玩家(`[301]=1`)反复点击NPC可无限获取金币。
- 不符合条件玩家点击无反应,但变量重置逻辑存在问题,导致条件可重复触发。

---

#### **核心问题定位**
##### **1. NPC名称缺失的根源**
- **脚本未定义名称标签**:NPC对话脚本未使用`<$SELFNAME>`变量显示名称。
- **配置文件错误**:`Merchant.txt`中NPC的地图编号或坐标超出边界。
- **功能参数缺失**:脚本头部未声明`@buy`、`@sell`等必要功能,导致NPC基础交互异常。

##### **2. 刷钱漏洞的脚本逻辑错误**
- **变量重置时机错误**:`SET [301] 0`在对话结束后执行,导致下次触发时仍可能满足条件。
- **条件分支冲突**:多个`[@main]`段落未正确隔离,导致变量状态混乱。
- **缺少触发后锁定**:未通过`BREAK`或`GOTO`跳转彻底结束当前流程,玩家可重复点击。

---

#### **逐行代码修复方案**
```lua
-- 第一部分:主对话逻辑(修复名称显示与变量控制)--
[@main]
#IF
check [301] 1
#SAY
<$SELFNAME>:\ -- 添加NPC名称显示--
纳尼?是卫家店老板让你来的?\
...(原有对话内容)
#ACT
give 金币 5000
SET [301] 0 -- 触发后立即重置条件变量--
SET [302] 1
SET [315] 1
BREAK -- 强制结束当前段落,防止重复触发--

#ELSESAY
<$SELFNAME>:\ -- 非任务状态显示默认名称--
欢迎光临。请问有什么事情帮忙吗?\
<买/@buy>武器\
...(原有功能选项)

-- 第二部分:任务链逻辑(修复变量冲突)--
[@main_1] -- 避免使用重复标签[@main]导致引擎混淆--
#IF
check [301] 0
check [302] 1
#SAY
<$SELFNAME>:\
是戒指店老板让你找我的吗?\
<是啊/@是啊>
#ACT
BREAK -- 结束当前流程,防止变量错位--

[@是啊]
#IF
check [302] 1 -- 增加二次校验,防止绕过--
#SAY
...(后续对话)
#ACT
SET [302] 0
SET [303] 1
BREAK

-- 第三部分:功能声明与物品配置--
[@buy] -- 补充功能段落声明--
#SAY
请选择要购买的物品:
...(根据[goods]列表显示)

[goods] -- 确保物品配置在脚本末尾--
古铜戒指 10 10
...(原有物品列表)
```

---

#### **修改要点总结**
1. **NPC名称显示**
- 在所有对话段落开头添加`<$SELFNAME>:\`,强制显示NPC名称。
- 检查`Merchant.txt`中NPC坐标是否在有效地图范围内(如`0-600`)。

2. **变量逻辑优化**
- **立即重置条件变量**:在给予金币后立刻执行`SET [301] 0`,而非等到对话结束。
- **双重条件校验**:关键步骤(如`[@是啊]`)添加二次变量检查,防止跳过初始判断。
- **严格流程控制**:使用`BREAK`终止当前脚本段落,避免玩家通过连续点击绕过限制。

3. **脚本结构规范**
- **避免标签重复**:将第二个`[@main]`改为`[@main_1]`,防止引擎解析冲突。
- **功能段落补全**:明确声明`@buy`、`@sell`等功能,确保NPC基础交互正常。
- **物品配置位置**:将`[goods]`段落移至脚本末尾,符合引擎解析规则。

---

#### **测试验证步骤**
1. **基础功能测试**
- 非任务玩家点击NPC应显示默认功能(买/卖/修理),且无金币奖励。
- 任务玩家(`[301]=1`)首次触发后,立即失去再次领取资格。

2. **变量监控**
- 使用`M2-查看-全局变量`确认`[301]`在触发后变为0且不可逆。

3. **压力测试**
- 连续点击NPC 10次,验证金币仅发放一次,且后续对话提示条件不满足。

---

通过以上修改,可彻底解决NPC名称缺失与刷钱漏洞问题。建议定期检查变量逻辑与脚本结构,避免类似错误重现。