传奇卡号充值功能完整实现教程 从卡号生成到NPC脚本配置及路径与编码错误排查详解

来源: 作者: 点击:
卡号充值的核心机制是利用CHECKCODELIST命令去一个TXT文本文件中查找玩家输入的卡号,找到则发放元宝并删除该卡号防止重复使用。整个系统由卡号文件、NPC脚本和变量输入框三部分组成,理解清楚这三者之间的对应关系,卡号充值功能十几分钟就能配置完成。

## 卡号文件的创建与格式要求

卡号文件本质上就是一个纯文本文件,每行一个卡号,文件里不能有任何多余内容。新建一个文本文档,重命名为“500元卡号.txt”,右键用记事本打开,输入几行测试卡号,每行一个,不要有空格、空行、标点符号或中文注释。

保存时编码必须选择ANSI。用记事本另存为,在编码下拉菜单中选ANSI,覆盖原文件。如果文件保存为UTF-8或带BOM格式,引擎读取时会出现乱码,导致卡号比对永远失败。

文件存放路径建议放在 `Mir200\Envir\QuestDiary\冲值\` 目录下。注意文件夹名称是“冲值”而不是“充值”,这两个名称在传奇服务端中经常被混用,脚本中写的是哪个名称,实际文件夹就必须用哪个名称,错一个字就会导致路径失效。如果没有这个文件夹,手动创建即可。

卡号的格式没有严格限制,纯数字、数字加字母组合都可以,但卡号文件中每一行只能包含一个卡号,不能在一行里写多个卡号用逗号或空格隔开。批量生成卡号可以使用卡密生成器工具,设置好卡号长度和组成字符后批量导出,导出后直接粘贴到TXT文件中保存即可。

## NPC充值脚本完整写法

卡号充值脚本的标准结构如下,以500元充值档位为例,脚本放在Market_Def目录下的充值NPC文件中:

```
[@main]
#if
#ACT
#SAY
元宝充值服务.\
<点这里输入你的充值卡卡号/@@InPutInteger8>\

[@InPutInteger8]
#IF
CHECKCODELIST <$STR(N8)> ..\QuestDiary\冲值\500元卡号.txt
#ACT
CLEARCODELIST <$STR(N8)> ..\QuestDiary\冲值\500元卡号.txt
GAMEGOLD + 100000
#SAY
您已经冲值成功,你的帐号里元宝的总数是:<$GAMEGOLD>颗。\
<返回/@main>
#ELSESAY
您的输入的卡号不对!\
<返回/@main>
```

这段脚本的执行流程分四步。玩家点击“点这里输入你的充值卡卡号”后弹出输入框,输入的数字被自动存入N8变量。CHECKCODELIST命令逐行读取500元卡号.txt文件,检查文件中是否存在与输入值完全一致的一行文本。如果存在则条件成立,执行CLEARCODELIST从文件中删除该卡号,防止同一卡号被重复使用,然后GAMEGOLD + 100000为玩家增加十万游戏币。如果文件中找不到匹配行,脚本跳转到#ELSESAY提示卡号错误。

@@InPutInteger8这个输入框指令和N8变量的对应关系是固定的,InPutInteger后面的数字是几,输入的卡号就存入N几。写成@@InPutInteger8就必须用N8来接收,写成@@InPutInteger22就必须用N22来接收,变量编号和输入框编号不一致会导致卡号读取失败。

## 变量引用与路径符号解析

<$STR(N8)>中的STR()是字符串转换函数,作用是提取N8变量中存储的内容并转换为字符串格式,供CHECKCODELIST进行文本比对。玩家输入卡号12345678后,<$STR(N8)>就等于这个字符串“12345678”,脚本用它去卡号文件中做匹配。尖括号和美元符号都不能省略,书写错误会直接导致变量失效。

路径中的“..”代表返回上一级目录。假设充值脚本文件存放在 `Mir200\Envir\QuestDiary\` 目录下,脚本中写 `..\QuestDiary\冲值\500元卡号.txt`,引擎会从脚本所在目录向上退一级到Envir目录,再进入QuestDiary目录下的冲值子文件夹找到卡号文件。换服务端后卡号报错,最常见的原因就是新服务端的目录结构发生了变化,“..”定位的上一级目录和原来不一致,导致引擎找不到卡号文件,最终误判为卡号无效。

如果脚本本身就放在QuestDiary目录下,路径可以简化为 `冲值\500元卡号.txt`,不需要用“..”返回上一级。部分新版引擎也支持绝对路径写法,直接写完整路径或使用正斜杠替代反斜杠。

## 多档位充值脚本配置

实际运营中通常需要设置多个充值档位,比如500元卡、1000元卡、2000元卡,分别对应不同面额的元宝数量。每个档位需要单独创建一个卡号文件,并在NPC脚本中分别为每个档位写一段处理逻辑。

NPC主界面列出所有档位选项:

```
[@main]
#SAY
元宝充值服务.\
<500元档位/@@InPutInteger8>\
<1000元档位/@@InPutInteger9>\
<2000元档位/@@InPutInteger10>\

[@InPutInteger8]
#IF
CHECKCODELIST <$STR(N8)> ..\QuestDiary\冲值\500元卡号.txt
#ACT
CLEARCODELIST <$STR(N8)> ..\QuestDiary\冲值\500元卡号.txt
GAMEGOLD + 50000
#SAY
500元充值成功,当前元宝总数:<$GAMEGOLD>颗。\

[@InPutInteger9]
#IF
CHECKCODELIST <$STR(N9)> ..\QuestDiary\冲值\1000元卡号.txt
#ACT
CLEARCODELIST <$STR(N9)> ..\QuestDiary\冲值\1000元卡号.txt
GAMEGOLD + 100000
#SAY
1000元充值成功,当前元宝总数:<$GAMEGOLD>颗。\

[@InPutInteger10]
#IF
CHECKCODELIST <$STR(N10)> ..\QuestDiary\冲值\2000元卡号.txt
#ACT
CLEARCODELIST <$STR(N10)> ..\QuestDiary\冲值\2000元卡号.txt
GAMEGOLD + 200000
#SAY
2000元充值成功,当前元宝总数:<$GAMEGOLD>颗。\
```

每个档位使用不同的InPutInteger编号和对应的N变量,500元档位用@@InPutInteger8和N8,1000元档位用@@InPutInteger9和N9,2000元档位用@@InPutInteger10和N10。各档位的卡号文件相互独立,500元的卡号不能用于1000元档位的充值。

部分引擎支持使用CHECKTEXTLIST和DELTEXTLIST命令替代CHECKCODELIST和CLEARCODELIST,功能完全相同,格式为 `CHECKTEXTLIST ..\QuestDiary\元宝充值\50000.txt <$STR(S22)>`,其中S22为字符型变量。如果使用@@InPutString指令,输入内容存入的是S变量而不是N变量,脚本中引用时要用<$STR(S22)>。

## 充值记录与日志

为方便核对充值数据,可以在发放元宝之前将充值信息写入记录文件。在GAMEGOLD + 元宝数命令的上方增加一行:

```
AddTextList <$USERNAME> <$USERID> <$DATETIME> 500元 ..\QuestDiary\充值记录.txt
```

这行命令会把玩家名称、账号、充值时间和充值档位追加写入充值记录.txt文件中,每行一条记录。每天去QuestDiary目录下的充值记录.txt核对数据即可追踪所有充值操作。

如果需要更细致的日志追踪,可以使用LogToFile命令生成独立的日志文件,格式为 `LogToFile "RechargeSuccess.log" 已发放元宝[<$STR(N8)>]至[<$USERNAME>]`。日志文件存放在LogServer目录下,按日期命名,便于后续查询。

## 卡号充值报错排查

卡号输入后提示错误,先检查文件路径。确认QuestDiary文件夹的位置,它必须在 `Mir200\Envir\` 目录下。检查冲值文件夹是否存在,名称是否为“冲值”而非“充值”。检查500元卡号.txt文件是否在该文件夹中,文件名拼写是否与脚本中完全一致。

路径格式排查。如果使用的是“..”相对路径,确认脚本文件所在目录和卡号文件所在目录之间的层级关系是否正确。换服务端后出错的情况,尝试删除“..”改用绝对路径或标准相对路径。修改后的CHECKCODELIST命令格式为 `CHECKCODELIST <$STR(N8)> QuestDiary\冲值\500元卡号.txt`,去掉开头的“..\”。

文件编码排查。用记事本打开卡号文件,查看文件菜单中的编码信息。如果不是ANSI,另存为ANSI编码覆盖保存。文件内容中不能有空格、空行、中文标点或注释,每行有且只有一个卡号。

变量编号排查。确认脚本中使用的InPutInteger编号与N变量编号一一对应。@@InPutInteger8对应N8,@@InPutInteger9对应N9,编号不匹配时输入的卡号不会被正确读取,CHECKCODELIST比对的一定是空的或错误的值。同时检查<$STR(N8)>的尖括号和美元符号是否完整书写,遗漏任何一个符号变量都不会被解析。

引擎兼容性排查。不同引擎对CHECKCODELIST和CLEARCODELIST命令的支持有差异。GOM和GEE引擎可以使用CHECKTEXTLIST和DELTEXTLIST替代,格式为 `CHECKTEXTLIST 路径 变量` 和 `DELTEXTLIST 路径 变量`。如果旧脚本中的命令在新引擎上无法执行,尝试替换为对应的新版命令。

修改脚本后需要重启M2Server或在控制台执行@ReloadManage重新加载NPC脚本,修改卡号文件不需要重启,引擎每次执行CHECKCODELIST时都会实时读取文件内容。所有脚本文件必须保存为ANSI编码,UTF-8编码下中文提示会乱码,虽然英文命令不受影响,但文件中的中文内容解析错误可能导致脚本执行中断。