卡号充值在HeroM2里通常做成NPC输入卡密,脚本校对卡号列表,命中后发元宝、游戏币、积分或充值点,并把已用卡号清除或标记。纯文本列表适合小服、单机、活动码;数据量大再加外部程序生成卡号文本,按面额分文件管理。下面按Envir目录、NPC注册、卡号列表、主脚本、错误处理、变量记账、日志防刷、排错顺序写。
一、目录与文件规划
HeroM2脚本主体在Mir200\Envir。卡号充值建议单独建目录,避免和别的系统混在一起。
Mir200\Envir\Npc_def:放NPC定义,例如“卡号充值.txt”。
Mir200\Envir\QuestDiary\卡号充值:放对话脚本主文件,例如“Main.txt”。
Mir200\Envir\QuestDiary\卡号充值\卡号列表:放各面额卡号,例如5.txt、10.txt、50.txt、100.txt。
Mir200\Envir\QuestDiary\卡号充值\日志:放充值成功记录、错误尝试记录。
Mir200\Envir\QuestDiary\卡号充值\变量:放人物或全局变量存档,例如充值次数、累计金额。
若本服QuestDiary规则要求每个功能一个独立文件夹,就把主脚本、列表、日志都放在“卡号充值”文件夹内,用相对路径引用。改之前备份整个Envir,脚本编码按本服要求保存,Hero部分子版本对ANSI更稳,混用UTF-8可能导致中文乱码、标签失效。
二、NPC注册
Npc_def里新建“卡号充值.txt”,格式按Hero的MerChant规则写。常见参数顺序为地图、坐标X、坐标Y、名字、头标、身体、所属文件、刷新时间、变色等。示例只写结构,具体地图号和坐标按你当前服改:
;卡号充值NPC
3 330 330 卡号充值 0 0 卡号充值 1 1 0 0 0 0 0 0
上面参数按本服Npc_def模板对齐。重点是“卡号充值”这个名字对应QuestDiary里同名功能文件;如果Npc_def写“点卡充值”,QuestDiary也用“点卡充值”,两边必须一致。NPC放安全区、土城、仓库附近都行,单机测试先放空地图避免影响玩家。
三、基础卡号充值主脚本
最简单做法:玩家点NPC,输入卡号,脚本按面额文件逐一CHECKCODELIST,命中发币并CLEARCODELIST,未命中提示错误。参考点卡平台写法,按面额分文件最不容易乱。
[@main]
SAY
卡号充值中心\ \
请输入充值卡号:\ \
1.5元面额\ \
2.10元面额\ \
3.50元面额\ \
4.100元面额\ \
输入后自动到账\
<5元卡号/@in_5>
<10元卡号/@in_10>
<50元卡号/@in_50>
<100元卡号/@in_100>
[@in_5]
ACT
InputString 卡号 0 20
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\5.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\5.txt
GAMEGOLD + 5
SENDMSG 5 提示:5元卡充值成功,获得5游戏币,当前游戏币:
RecordNpcMsg 卡号充值 5元成功 卡号
ELSEACT
SAY
卡号错误或未生效,请核对后重试\
[@in_10]
ACT
InputString 卡号 0 20
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
GAMEGOLD + 10
SENDMSG 5 提示:10元卡充值成功,获得10游戏币,当前游戏币:
RecordNpcMsg 卡号充值 10元成功 卡号
ELSEACT
SAY
卡号错误或未生效,请核对后重试\
50、100面额按同样结构复制,把文件路径、发放命令、提示文字替换即可。若发元宝用本服元宝命令,例如部分版本GAMEGOLD代表游戏币,元宝字段可能是GameGold、YuanBao、GamePoint等,以M2在线人物属性和!Setup里货币名为主。不要照抄别人命令名,先在本服M2用GM命令试发,确认字段再写进充值脚本。
四、统一输入框按面额自动发币
分四个按钮维护麻烦,可改成一次输入卡号,脚本按卡号前缀或不同列表依次检测。例如5元卡前缀CD5、10元卡前缀CD10、50元CD50、100元CD100。生成卡号时固定前缀,列表按前缀存放。
[@main]
SAY
卡号充值\ \
请输入卡号,系统按面额自动识别\ \
<开始输入/@inputcard>
[@inputcard]
ACT
InputString CARDNO 0 30
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\5.txt
ACT
CALL @give5
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
ACT
CALL @give10
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\50.txt
ACT
CALL @give50
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\100.txt
ACT
CALL @give100
ELSEACT
SAY
卡号未匹配任何面额,请确认是否输错\
[@give5]
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\5.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\5.txt
GAMEGOLD + 5
SENDMSG 5 5元卡到账,游戏币+5
CALL @savelog
ELSEACT
SAY
卡号已使用或无效\
[@give10]
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
GAMEGOLD + 10
SENDMSG 5 10元卡到账,游戏币+10
CALL @savelog
ELSEACT
SAY
卡号已使用或无效\
[@give50]
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\50.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\50.txt
GAMEGOLD + 50
SENDMSG 5 50元卡到账,游戏币+50
CALL @savelog
ELSEACT
SAY
卡号已使用或无效\
[@give100]
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\100.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\100.txt
GAMEGOLD + 100
SENDMSG 5 100元卡到账,游戏币+100
CALL @savelog
ELSEACT
SAY
卡号已使用或无效\
注意CHECKCODELIST检测的是玩家输入字符串与列表行完全一致。卡号文件每行一个卡号,不要带空格、BOM、空行混用。CLEARCODELIST用于删除已用卡号,达到一次性卡效果;若希望保留已用记录审计,可改用CheckTextList检测、用独立已用列表标记,不直接删原卡文件。
五、用文本列表做“提取码”式充值
Hero可用CheckTextList、DelTextList做序列号领取。参考金牌帐号提取码思路:卡号文件放提取码,输入正确后发奖励并删除该行,避免重复领。
[@main]
SAY
充值提取码兑换\ \
输入官方发放的充值码,领取对应元宝\ \
<输入充值码/@inputcode>
[@inputcode]
ACT
InputString PAYCODE 0 40
IF
CheckTextList ..\QuestDiary\卡号充值\提取码.txt
ACT
DelTextList ..\QuestDiary\卡号充值\提取码.txt
GameGold + 1000
SENDMSG 6 充值码有效,元宝+1000
CALL @savelog
ELSEACT
SAY
充值码错误、已使用或不在此服有效\
提取码.txt每行一个码,例如:
VIP1000-8A2B-99C1
VIP5000-3D4E-77F2
TEST-0001-DEBUG
这种适合后台人工发码、活动码、内部测试码。缺点是大批量卡号用纯文本管理麻烦,且每次输入都要遍历列表;万级卡号建议外部程序生成文本,并按段拆分多个文件,脚本只检测对应段。
六、变量记账与累计充值
Hero自定义变量全大写,支持VAR、CALCVAR、CHECKVAR、INC、DEC、SAVEVAR、LOADVAR等。做充值统计可给人物建整数变量,记录累计充值金额、累计元宝、充值次数。
[@initpay]
ACT
VAR Integer HUMAN PAY_TOTAL
VAR Integer HUMAN PAY_COUNT
LOADVAR HUMAN PAY_TOTAL ..\QuestDiary\卡号充值\变量\PayTotal.txt
LOADVAR HUMAN PAY_COUNT ..\QuestDiary\卡号充值\变量\PayCount.txt
发币后更新:
[@give10]
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
GAMEGOLD + 10
CALCVAR HUMAN PAY_TOTAL + 10
CALCVAR HUMAN PAY_COUNT + 1
SAVEVAR HUMAN PAY_TOTAL ..\QuestDiary\卡号充值\变量\PayTotal.txt
SAVEVAR HUMAN PAY_COUNT ..\QuestDiary\卡号充值\变量\PayCount.txt
SENDMSG 5 10元卡到账,累计充值金额:,累计次数:
ELSEACT
SAY
卡号已使用或无效\
若要做全服累计、首充奖励、充值排行,用全局变量G开头,配合SAVEVAR存全局文件。人物变量只跟当前角色,换角色不共享;全账号多角色共享要用账号级变量或外部数据库。
七、充值成功日志与防刷
纯文本卡号系统最怕三件事:卡号被复制多次用、玩家乱试卡号、管理员卡号文件被篡改。处理办法:
1、成功日志
每次发币写NPC日志或文本。Hero可用RecordNpcMsg,也可CALL写自定义日志脚本:
[@savelog]
ACT
RecordNpcMsg 卡号充值 成功 角色: 卡号: 时间见M2日志
如果本服RecordNpcMsg参数不满足,改用每天一个文本,用SAVEVAR追加变量不直观,可让外部程序定时从M2日志提取。小服直接看M2运行日志也行。
2、错误次数限制
Hero用人物变量记录错误次数,超过阈值短时间禁止再输:
[@inputcard]
ACT
VAR Integer HUMAN CARD_ERR
LOADVAR HUMAN CARD_ERR ..\QuestDiary\卡号充值\变量\CardErr.txt
IF
CHECKVAR HUMAN CARD_ERR >= 5
ACT
SENDMSG 5 错误次数过多,请10分钟后再试
CLOSE
ELSEACT
ACT
InputString CARDNO 0 30
校对失败时:
ELSEACT
ACT
CALCVAR HUMAN CARD_ERR + 1
SAVEVAR HUMAN CARD_ERR ..\QuestDiary\卡号充值\变量\CardErr.txt
SENDMSG 5 卡号错误,已记录错误次数:
SAY
请重新输入或联系管理员\
想做“10分钟解封”,用登录脚本或机器人定时把CARD_ERR清0;纯NPC不主动计时,只进不出会误伤正常玩家。
3、卡号唯一与一次性
生成卡号时用随机前缀+批次+校验位,例如SERVER01-5-随机8位。5元、10元、50元、100元分文件,不要全部混在一个列表。玩家成功充值后立即CLEARCODELIST或把卡号移入已用列表;若用CheckTextList而不删除,必须在已用列表再次检测,否则能重复领。
4、外部卡号表防刷参考
如果以后接程序管理卡号,数据库表至少包含卡号、面额、状态、生成时间、使用时间、绑定账号、使用IP。卡号字段唯一索引,状态分未使用、已使用、已作废、已过期;日志表单独记卡号、账号、角色、IP、时间、结果。传输过程用服务端内部校验,别把卡号明文直接暴露给客户端。Hero纯脚本环境用文本替代时,已用卡号移到used目录,原列表只留未用卡,管理更清晰。
八、按货币类型发不同奖励
很多服不只用游戏币,还发元宝、灵符、积分、充值点。主脚本检测卡号后按面额分别发:
[@give10]
IF
CHECKCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
ACT
CLEARCODELIST ..\QuestDiary\卡号充值\卡号列表\10.txt
GAMEGOLD + 10
GameGold + 100
CreditPoint + 10
SENDMSG 5 10元卡到账:游戏币+10,元宝+100,积分+10
CALL @savelog
ELSEACT
SAY
卡号无效\
命令名以本服为准:有的版本元宝是GameGold,有的是YuanBao;灵符/积分可能是CreditPoint、Credit、Point;充值点可能在M2在线人物字段单独改。先在M2在线人物里看角色有哪些货币字段,再用GM命令试发,确认不行再换字段名。
九、自动发卡与批量生成卡号
小服手动写卡号费时间,可用简单规则批量生成:
5元卡:CD5-YYYYMMDD-随机6位
10元卡:CD10-YYYYMMDD-随机6位
50元卡:CD50-YYYYMMDD-随机6位
100元卡:CD100-YYYYMMDD-随机6位
生成后按面额写入5.txt、10.txt、50.txt、100.txt,每个文件每行一个,不夹空格。Windows下用批处理、Python、Excel都能生成;生成完用排序去重,避免重复卡号。导入前备份旧列表,玩家反馈某张卡无效时,用记事本搜完整行,确认是不在列表、已清除还是输入带空格。
若用外部发卡程序,程序只负责生成文本和记录订单,不直接改M2内存;M2仍通过CHECKCODELIST/ClearCodeList发币,这样权限边界清楚,也方便回滚。
十、QFunction或登录脚本补发
部分环境把充值结果接QFunction,例如外部支付通知写入某个账号文件,玩家上线自动领。Hero可放QM登录脚本:
[@OnLogin]
IF
CheckTextList ..\QuestDiary\卡号充值\待发元宝\账号列表.txt
ACT
GameGold + 1000
DelTextList ..\QuestDiary\卡号充值\待发元宝\账号列表.txt
SENDMSG 6 检测到待发充值,元宝+1000
账号列表写登录账号而非角色名时,要注意一个账号多角色只发一次还是每角色发一次。按账号去重可用全局变量或已发列表;按角色发就用人物变量。别把“账号待发”和“卡号一次性”两套混用,否则会出现重复发、漏发、回档后重发。
十一、常见排错
NPC点开没反应:看Npc_def文件名和QuestDiary文件夹名是否一致;地图坐标是否有阻挡;M2是否重新加载NPC;脚本是否有中文括号、异常空行。
输入卡号一直提示错误:用记事本打开对应5.txt/10.txt,显示所有字符,确认无BOM、无行尾空格;InputString长度上限要大于卡号长度;CHECKCODELIST路径相对于当前脚本文件,层级写错会找不到。
充值成功但货币没加:确认GAMEGOLD/GameGold/元宝字段名;M2在线人物手动改该字段测试;若用了自定义变量做发币中介,检查变量声明和INC/CALCVAR格式。
卡号能重复用:没执行CLEARCODELIST或DelTextList;用CheckTextList只检测不删除,必须再写已用判断。多人同时充值同一张卡,文本锁不住,高并发改外部程序+数据库,别用纯txt扛。
错误次数变量不生效:Hero变量全大写,人物变量用VAR Integer HUMAN声明并LOADVAR/SAVEVAR;只声明不保存,重启后统计清零。
中文乱码:脚本另存为ANSI或本服规定编码;Npc_def和QuestDiary编码保持一致;从网页复制脚本常带特殊空格,全部手敲关键标签。
M2报未定义命令:不同Hero子版本命令名有差异,InputString、CHECKCODELIST、CLEARCODELIST、CheckTextList、DelTextList、RecordNpcMsg都可能换成等效命令;以本服命令列表和M2帮助文档为准,不要混用GOM、GEE、Hero不兼容写法。
十二、运营配置建议
面额和比例写进NPC说明,做到输入即所见:5元=多少游戏币、多少元宝、多少积分;10元是否额外赠送;首充额外奖励单独做标签。卡号生成后导出两联,一联给玩家,一联加密备份;作废卡统一移入invalid目录,不直接删,便于后续查重复充值投诉。管理员手动补单用M2在线人物改字段或GM命令,不在卡号列表里塞“万能卡”;万能卡一旦泄露,整个充值体系失效。
定期审计卡号列表行数、已用日志、错误日志。活动码和人民币点卡分开目录,活动码可设有效期,用QM每日检测过期码并移入过期列表;点卡不设时间限制但必须一次性消耗。玩家报“付钱没到账”时,先查发卡程序订单、再查对应面额txt是否曾存在该卡号、是否被CLEAR、是否输错前缀,最后用M2日志按角色名和时间内核。
纯HeroM2文本卡号方案适合中小服、活动码、内部测试;量大、需支付回调、需防并发,用外部管理程序生成文本或数据库,M2只做校验和发币,不要把支付密钥、回调逻辑写进游戏NPC脚本。
传奇HeroM2卡号充值NPC脚本搭建教程之点卡兑换元宝金币与防重复防刷完整配置
来源:
作者:
点击:

