热血传奇的脚本编写,本质上是对游戏服务器端逻辑的定制。脚本存放在服务端的特定文件夹中,通过特定的命令格式控制NPC对话、任务流程、怪物刷新和玩家数据。掌握脚本编写,意味着能够自主设计游戏内的交互功能。
脚本文件主要分布在服务端目录下的 `\Mir200\Envir\` 文件夹中。`Market_Def` 存放NPC脚本,`MapQuest_Def` 存放地图触发脚本,`Robot_def` 存放机器人定时脚本,`QuestDiary` 则用于存放被调用的子程序脚本。
### 脚本的核心构成与执行逻辑
一个完整的脚本段落通常由条件判断和执行结果两部分组成。执行时,脚本按照从上到下的顺序逐行解析命令。
**基础结构示例:**
```
[@脚本段落名称]
#IF
; 这里是条件检测部分
检测玩家等级是否大于34级
#ACT
; 这里执行通过后的操作
将玩家传送到指定地图
#ELSEACT
; 条件不满足时执行
弹出提示消息告诉玩家等级不够
```
在实际编写中,`#IF` 和 `#ACT` 是最常见的组合。`#IF` 用于检测条件,`#ACT` 用于执行命令。当条件不满足时,可以使用 `#ELSEACT` 或 `#ELSEAY` 来处理否定情况。
### 变量系统的使用方法
脚本运行中需要存储和处理数据,这就涉及到变量。传奇脚本中的变量分为多种类型,不同变量在作用范围和保存方式上差异明显。
**常用变量类型及特点:**
- **P变量(私人变量,数字型)**:仅在当前NPC对话中有效,关闭对话框后自动重置为0。适合临时计算使用。
- **D变量(私人变量,数字型)**:人物不下线时对全局NPC通用传递,下线不保存。
- **N变量(私人变量,数字型)**:用于存储数字,下线不保存,小退归0。通过输入框获取数字时,系统会自动存入N变量。
- **S变量(私人变量,字符型)**:用于存储文本字符,下线不保存,小退归0。通过输入框获取文本时存入S变量。
- **G变量(全局变量,数字型)**:全服务器唯一且全局NPC通用传递,可保存。服务器重启后数据不丢失,存放在 `GlobalVal.ini` 文件中。
- **U变量(私人变量,数字型)**:可保存,存放在人物数据库 `Mir.db` 中。适合记录玩家个人成就或任务进度。
在脚本中调用变量时,需要使用 `<$STR(变量名)>` 的格式来显示其值。例如,显示N85变量的内容应写作 `<$STR(N85)>`。
### NPC输入框功能实现
当需要玩家输入内容时,比如输入数量或名字,需要使用输入框功能。不同引擎的调用方式略有差异,以Hero引擎为例:
**第一步:在NPC对话中添加输入按钮**
```
[@Main]
请选择操作:\
<输入数字进行捐赠/@@InPutInteger10>\
<输入角色名/@@InPutString15>\
```
`@@InPutIntegerX` 会弹出数字输入框,并将输入结果存入对应的N变量。`@@InPutStringX` 则弹出文本输入框,结果存入S变量。这里的X代表变量编号(0-99)。
**第二步:编写输入后的处理逻辑**
Hero引擎在处理输入结果时,需要在标签前加上 `Call` 前缀。
```
[@CallInPutInteger10]
#IF
; 检测玩家是否拥有足够的游戏币
CHECKGAMEGOLD > <$STR(N10)>
#ACT
; 扣除对应数量的游戏币
GAMEGOLD - <$STR(N10)>
MESSAGEBOX 您成功捐赠了 <$STR(N10)> 金币。
#ELSEACT
MESSAGEBOX 金币数量不足,请重新输入。
```
3K引擎在处理时语法稍有不同,标签直接写成 `[@InPutIntegerX]` 即可,不需要 `Call` 前缀。对于输入内容的过滤,引擎提供了 `[@IsInFilterList]` 标签用于处理非法字符,当玩家输入内容包含敏感词时会自动跳转到此段落进行拦截处理。
### 定时与机器人脚本
游戏中的定时活动、定时刷怪等功能,依靠机器人脚本来实现。机器人脚本主要涉及两个文件:`AutoRunRobot.txt` 用于设置定时触发,`RobotManage.txt` 用于编写触发后的具体逻辑。
**第一步:在 `AutoRunRobot.txt` 中设定触发时间**
```
; 每小时运行一次
#AutoRun NPC HOUR 1 @开始活动
; 每周五15点55分运行
#AutoRun NPC RUNONWEEK 5:15:55 @周五活动
```
支持的时间单位包括 `SEC`(秒)、`MIN`(分)、`HOUR`(时)、`DAY`(天)以及 `RUNONWEEK`(星期几)。
**第二步:在 `RobotManage.txt` 中编写触发逻辑**
当 `AutoRunRobot.txt` 中的定时条件达成后,系统会执行 `RobotManage.txt` 中对应的脚本段落。
```
[@开始活动]
#IF
#ACT
; 向全服发送公告消息
SENDMSG 0 比武地图已经开放,勇士们请速速前往!
; 执行地图刷怪或其它操作
Param1 3 355 339
Param2 355
Param3 339
MonGen 活动BOSS 1 0
```
通过这种方式,可以实现定时全服公告、定时开启活动地图、定时刷新怪物等常规功能。
### 常用脚本命令整理
编写脚本时,熟悉基础命令的效率会高很多。以下是一些高频使用的命令:
| 命令格式 | 功能说明 |
| :--- | :--- |
| `CHECKLEVELEX > 数值` | 检测玩家等级是否大于指定数值 |
| `CHECKGAMEGOLD > 数值` | 检测玩家元宝数量是否大于指定数值 |
| `GAMEGOLD + 数值` | 增加玩家元宝数量 |
| `GAMEGOLD - 数值` | 扣除玩家元宝数量 |
| `MAPMOVE 地图代码 X坐标 Y坐标` | 将玩家传送到指定地图的精确坐标 |
| `GIVE 物品名称 数量` | 给予玩家指定数量的物品 |
| `TAKE 物品名称 数量` | 回收玩家背包中指定数量的物品 |
| `MESSAGEBOX 提示内容` | 弹出对话框显示提示信息 |
| `SENDMSG 频道编号 消息内容` | 发送公告消息,0为全局红色公告 |
除了这些基础命令,脚本中还包含大量的逻辑判断语句,如 `EQUAL`(等于)、`LARGE`(大于)、`SMALL`(小于)等,用于构建更复杂的条件分支。

