传奇服务端宝宝存取脚本实现方案

来源: 作者: 点击:
脚本原理:变量暂存与文本备份

“存宝宝”并非将怪物实体存入仓库,而是通过脚本记录宝宝类型与等级,再通过命令重新召唤。核心流程为:检测当前宝宝 → 读取数据存入变量 → 保存变量到文本 → 取回时读取文本召唤。

标准存取脚本示例(GOM/GEE引擎)

以下为通用脚本框架,需在NPC脚本中实现。

存宝宝脚本段

[@StoreBaby]
#IF
; 检测是否有宝宝
CHECKSLAVECOUNT > 0
#ACT
; 获取第一个宝宝信息(名称与等级)
GetSlaveInfo 0 <$STR(S$宝宝名)> <$STR(N$宝宝等级)>
; 将信息存入私人变量(防止串号)
MOV U10 <$STR(S$宝宝名)>
MOV U11 <$STR(N$宝宝等级)>
; 将信息写入文本备份(路径需真实存在)
AddTextListEx ..\QuestDiary\宝宝存档\<$USERNAME>.txt <$STR(S$宝宝名)>|<$STR(N$宝宝等级)>
; 清除当前宝宝
KILLCALLMOB
SENDMSG 6 宝宝[<$STR(S$宝宝名)>]已存入仓库,等级:<$STR(N$宝宝等级)>
#ELSEACT
SENDMSG 6 你当前没有携带宝宝,无法存储。


取宝宝脚本段

[@LoadBaby]
#IF
; 检测是否已存宝宝(检查变量或文件)
CHECKVARLIST ..\QuestDiary\宝宝存档\<$USERNAME>.txt <$STR(S$TEMP)>
; 检测当前宝宝数量是否超标(如最多5只)
CHECKSLAVECOUNT < 5
#ACT
; 从文本读取宝宝信息并分割
GetListString <$STR(S$TEMP)> 0 <$STR(S$宝宝名)>
GetListString <$STR(S$TEMP)> 1 <$STR(N$宝宝等级)>
; 召唤宝宝(参数:名称 等级 叛变时间[分钟] 颜色)
RECALLMOB <$STR(S$宝宝名)> <$STR(N$宝宝等级)> 7200 0
; 清除存档标记
DELVARLIST ..\QuestDiary\宝宝存档\<$USERNAME>.txt
SENDMSG 6 宝宝[<$STR(S$宝宝名)>]取回成功。
#ELSEACT
SENDMSG 6 取回失败:未找到存档或宝宝数量已满。


关键命令与路径配置

• 检测命令:CHECKSLAVECOUNT 检测宝宝数量;CHECKSLAVENAME 检测特定宝宝是否存在。

- 存储介质:建议使用 QuestDiary\宝宝存档\ 目录,按角色名建立 角色名.txt 文件存储数据。
- 变量选择:必须使用私人变量(如U变量、T变量),若使用全局变量会导致所有玩家数据混乱。
- 叛变时间:RECALLMOB 的第三个参数建议设为较大值(如7200),避免取回后立即叛变。

常见问题与排查

1. 宝宝不攻击/叛变:检查 RECALLMOB 命令的叛变时间参数,若设为0可能立即叛变;确认怪物数据库(Monster.DB)中该宝宝的 Race 字段是否为宝宝类型(通常为81或特定值)。
2. 变量冲突:若多人同时存取出错,检查脚本是否使用了重复的U/T变量编号,建议每个NPC使用独立的变量区间。
3. 路径权限:确保 Mir200\Envir\QuestDiary\宝宝存档\ 文件夹存在,且M2Server有写入权限(否则AddTextListEx会失败)。
4. 引擎兼容:GetSlaveInfo 命令在部分老引擎(如HERO)可能不支持,需替换为循环检测宝宝名称的脚本逻辑。

脚本放置位置

将上述脚本代码放入 MirServer\Mir200\Envir\Market_Def\ 下的NPC脚本文件中(如 功能NPC-3.txt),并在对应NPC的菜单中链接 [@StoreBaby] 和 [@LoadBaby] 标签即可生效。