在Mir200\Envir\QuestDiary下新建“元宝充值”目录,里面放主脚本、记录脚本、累充变量脚本。NPC文件放Market_Def,文件名和Merchant配置对应。所有脚本保存ANSI/GBK,避免UTF-8带签名导致#IF、#ACT不识别。
一、NPC主菜单与档位
Market_Def\元宝充值使者.txt按引擎格式写,示例只给对话入口:
;元宝充值使者
1 3 3 元宝充值使者 0 0 0 3 330 330
具体地图号和坐标按本服改。脚本主体放QuestDiary\元宝充值\Main.txt:
[@Main]
SAY
元宝充值与记录\
1.充值10元=100元宝\
2.充值30元=300元宝\
3.充值100元=1000元宝\
4.查看我的充值累计\
<10元/@Pay10> <30元/@Pay30> <100元/@Pay100> <累计/@MyTotal> <离开/@exit>
[@Pay10]
IF
CheckAccountList ..\QuestDiary\元宝充值\order10.txt
ACT
GAMEGOLD + 100
AddTextList 10元 ..\QuestDiary\元宝充值\recharge_log.txt
SENDMSG 6 充值成功,获得100元宝,记录已写入
GOTO @Main
ELSEACT
SENDMSG 0 未检测到10元订单授权,请联系支付后重试
GOTO @Main
[@Pay30]
IF
CheckAccountList ..\QuestDiary\元宝充值\order30.txt
ACT
GAMEGOLD + 300
AddTextList 30元 ..\QuestDiary\元宝充值\recharge_log.txt
SENDMSG 6 充值成功,获得300元宝,记录已写入
GOTO @Main
ELSEACT
SENDMSG 0 未检测到30元订单授权
GOTO @Main
[@Pay100]
IF
CheckAccountList ..\QuestDiary\元宝充值\order100.txt
ACT
GAMEGOLD + 1000
AddTextList 100元 ..\QuestDiary\元宝充值\recharge_log.txt
SENDMSG 6 充值成功,获得1000元宝,记录已写入
GOTO @Main
ELSEACT
SENDMSG 0 未检测到100元订单授权
GOTO @Main
GAMEGOLD是部分GOM/GEE类元宝变量命令;Hero若把元宝做成物品,用GIVE 元宝 100代替,若用自定义元宝字段按引擎文档换ADDGAMEGOLD、GiveYuanBao、AddYuanBao等。CheckAccountList用于读取订单账号名单,支付平台回调把账号写入order10/order30/order100.txt后,玩家进NPC领取并写记录。
二、文本日志式充值记录
不想用数据库时,纯文本记录最直观。QuestDiary\元宝充值\recharge_log.txt先建空文件。发元宝前或发元宝后写行,格式自定:
AddTextList 角色=USERNAME 账号=ACCOUNT 金额=10元 元宝=100 时间=DATE TIME ..\QuestDiary\元宝充值\recharge_log.txt
部分引擎变量名可能是%USERNAME%、%ACCOUNT%、%DATE%、%TIME%,按本服M2变量替换。若AddTextList不支持长格式,改成固定前缀:
AddTextList 10元 $USERNAME ..\QuestDiary\元宝充值\recharge_log.txt
后期核对就打开recharge_log.txt,按金额、角色名、日期筛选。1:100比例时在GAMEGOLD + 100上面加1元记录,1:200比例改GAMEGOLD + 200并写2元记录,依此类推。
M2自带写日志可用WRITELOG/WriteLog,路径通常进Mir200\Log:
WRITELOG 充值记录 角色:USERNAME 金额:10 元宝:100 时间:DATE $TIME
不同引擎命令名可能为WriteLog、@WriteLog或M2日志配置项;以命令列表为准。
三、账号名单式模拟订单
支付回调未接时,用账号名单模拟。QuestDiary\元宝充值下建:
order10.txt
order30.txt
order100.txt
每个文件按行写登录账号,不写角色名,除非本服脚本用角色名判断。例如order100.txt写:
test001
test002
支付后端确认收款后,把账号追加到对应金额文件。NPC点100元档,CheckAccountList命中就发元宝并写记录;领完可从order100.txt删除账号防重复,也可用独立已发名单二次判断:
[@Pay100]
IF
CheckAccountList ..\QuestDiary\元宝充值\order100.txt
CheckAccountList ..\QuestDiary\元宝充值\done100.txt
ELSEACT
IF
CheckAccountList ..\QuestDiary\元宝充值\order100.txt
ACT
GAMEGOLD + 1000
AddTextList $ACCOUNT ..\QuestDiary\元宝充值\done100.txt
AddTextList 100元 USERNAME DATE $TIME ..\QuestDiary\元宝充值\recharge_log.txt
SENDMSG 6 100元档已发放,订单标记为已处理
GOTO @Main
ELSEACT
SENDMSG 0 无有效100元订单
GOTO @Main
done100.txt放已发账号,二次进NPC不会重复发。名单式适合单机、内部测试、少量订单;高并发仍建议数据库订单表。
四、累充变量与排行榜
玩家累计充值用HUMAN变量,登录载入、充值追加、NPC查询。QuestDiary\元宝充值\total.txt声明:
VAR Integer HUMAN 累充元宝
VAR Integer HUMAN 累充金额
LOADVAR HUMAN 累充元宝 ..\QuestDiary\元宝充值\total_yb.txt
LOADVAR HUMAN 累充金额 ..\QuestDiary\元宝充值\total_money.txt
发元宝时追加:
[@Pay100]
IF
CheckAccountList ..\QuestDiary\元宝充值\order100.txt
ACT
GAMEGOLD + 1000
CALCVAR HUMAN 累充元宝 + 1000
CALCVAR HUMAN 累充金额 + 100
SAVEVAR HUMAN 累充元宝 ..\QuestDiary\元宝充值\total_yb.txt
SAVEVAR HUMAN 累充金额 ..\QuestDiary\元宝充值\total_money.txt
AddTextList 100元 $USERNAME ..\QuestDiary\元宝充值\recharge_log.txt
SENDMSG 6 充值成功,累计元宝已更新
GOTO @Main
ELSEACT
SENDMSG 0 无有效100元订单
GOTO @Main
查询菜单:
[@MyTotal]
ACT
SENDMSG 6 当前累计充值金额:STR(GETHUMANVAR 累充金额)元,元宝:STR(GETHUMANVAR 累充元宝)
GOTO @Main
全服富翁排行可把每个角色累充写入独立保存文件,用排序NPC重读。变量名避免和系统冲突,统一用“累充元宝”“累充金额”等中文或Pay_YB、Pay_Money等前缀。
五、GOM/GEE支付回调写记录
部分GOM/GEE版本支持支付回调脚本,路径按引擎文档,示例写QuestDiary\Pay\PayCallBack.txt的Lua风格:
function OnPaySuccess(Account, RoleName, Money, Gold, OrderNo, PayType)
local checkSql = "SELECT id FROM pay_log WHERE order_no = '" .. OrderNo .. "'"
local result = DB_Query(checkSql)
if result and #result > 0 then
return 0
end
local ret = AddYuanBao(Account, Gold)
if ret ~= 1 then
return 0
end
local logSql = "INSERT INTO pay_log(order_no,account,role,money,gold,pay_type,ctime) VALUES('" ..
OrderNo .. "','" .. Account .. "','" .. RoleName .. "'," .. Money .. "," .. Gold .. ",'" .. PayType .. "',NOW())"
DB_Exec(logSql)
return 1
end
逻辑是订单号先查重,已处理直接返回;未处理调用引擎加元宝函数,成功再写pay_log。AddYuanBao、AddYuanBao_byRole等函数名按引擎版本替换;不用数据库时把DB_Query/DB_Exec换成读文本订单文件,用账号+订单号追加到recharge_log.txt。
非Lua的传统M2若提供充值处理标签,可写:
[@RechargeProcess]
IF
CHECKSTRINGLIST ..\QuestDiary\元宝充值\order_done.txt $PARAM(OrderNo)
ACT
SENDMSG 6 订单已处理,跳过
BREAK
IF
CHECKGAMEGOLD $PARAM(RoleName) >= 0
ACT
GAMEGOLD PARAM(RoleName) + PARAM(Gold)
AddTextList PARAM(OrderNo) PARAM(Account) PARAM(RoleName) PARAM(Money) PARAM(Gold) DATE $TIME ..\QuestDiary\元宝充值\recharge_log.txt
AddTextList $PARAM(OrderNo) ..\QuestDiary\元宝充值\order_done.txt
SENDMSG 6 充值回调发元宝成功
BREAK
$PARAM具体名称以引擎回调文档为准;没有回调参数的版本,用账号名单或HTTP通知写文件后由NPC领取更稳。
六、Hero老引擎物品元宝记录
Hero若元宝是物品“元宝”,NPC不直接改GAMEGOLD:
[@Pay10]
IF
CheckAccountList ..\QuestDiary\元宝充值\order10.txt
ACT
GIVE 元宝 100
AddTextList 10元 USERNAME 100 DATE $TIME ..\QuestDiary\元宝充值\recharge_log.txt
SENDMSG 6 获得元宝物品100个,记录已写
GOTO @Main
ELSEACT
SENDMSG 0 无10元订单
GOTO @Main
若Hero用自定义元宝字段USER_QB、CREDITPOINT或QFunction充值触发,外部支付调用[@StdModeFunc40]之类标准点后,在充值处理段INC对应变量并AddTextList。QFunction-0.txt末尾挂标准充值标签,处理完写记录;变量字段名以本服AbuseConfig、命令文档为准。
七、M2日志与文件落盘位置
文本记录两条路:
1. QuestDiary内recharge_log.txt:脚本用AddTextList写,路径相对Envir,便于NPC随时读、做累充和对单。
2. Mir200\Log下充值记录:用WRITELOG或M2日志配置,运维查全服订单更方便。
例如M2若支持:
WRITELOG 充值记录 角色:USERNAME 账号:ACCOUNT 金额:10 元宝:100 时间:DATE TIME
日志文件在Mir200\Log\充值记录.log或按WRITELOG第一个参数生成。每天对单时把recharge_log.txt和平台订单导出做差集,能查出未发、重复发、金额比例错配。
八、防重复与防伪造
订单去重必须有。名单式用done文件,数据库式用order_no唯一索引,回调式先查后发。金额校验不能只信前端,支付平台回调要验签名、订单状态、金额、元宝比例;脚本侧再判断:
IF
CheckAccountList order100.txt
ACT
GAMEGOLD + 1000
写记录
BREAK
若外部可直接调用NPC发元宝而不验单,就会被伪造。正确链路是支付平台通知服务端后端写账号名单/订单表,NPC或回调只按已验订单发币,不在客户端传金额参数决定发多少。
每日限额示例:
VAR Integer HUMAN 今日充值
LOADVAR HUMAN 今日充值 ..\QuestDiary\元宝充值\day_money.txt
[@Pay100]
IF
CALCVAR HUMAN 今日充值 >= 1000
ACT
SENDMSG 0 今日累计充值已达1000元上限
GOTO @Main
IF
CheckAccountList order100.txt
ACT
GAMEGOLD + 1000
CALCVAR HUMAN 今日充值 + 100
SAVEVAR HUMAN 今日充值 ..\QuestDiary\元宝充值\day_money.txt
写记录
GOTO @Main
每日0点用RobotManage重置,或登录时按日期变量判断是否跨天再清今日充值。
九、NPC加载与重载
Market_Def建元宝充值使者.txt后,Merchant或NPC市场配置要指向QuestDiary\元宝充值\Main.txt。不同引擎有的在Market_Def直接包含脚本内容,有的只写文件名由QuestDiary加载;按本服习惯来。改完在M2点重载NPC脚本/重载QuestDiary,Hero可用对应重载命令,GOM/GEE用脚本重载,Blue按版本重读NpcDialog。未重载会出现点NPC无反应、菜单旧逻辑、记录不写。
十、排错
NPC不显示:看Market_Def文件名、Merchant地图号坐标、脚本名是否一致;ANSI编码、标签[@Main]是否重复。
点档位无反应:CheckAccountList路径写错,order10.txt为空,或账号写的是角色名而脚本按登录账号判断。
元宝不发但写记录:发币命令在AddTextList之后而发币命令本身不支持,调整顺序先发币再写日志;或GAMEGOLD不支持,换GIVE 元宝/AddYuanBao/GiveYuanBao。
记录文件不增长:AddTextList路径不存在、QuestDiary\元宝充值目录未建、M2无写权限;换绝对相对路径测试,手动建recharge_log.txt空文件。
重复发元宝:缺done名单或订单表去重;回调重发时订单号未落库。名单式每次发完必须写done,数据库式回调先SELECT再INSERT。
累充不更新:VAR声明、LOADVAR/SAVEVAR路径错,或CALCVAR变量名和SENDMSG查询变量名不一致;统一用HUMAN累充元宝、HUMAN累充金额。
Hero元宝物品不进背包:物品库无“元宝”或Stdmode异常,GIVE数量格式错;先用GM命令@GameGold或引擎对应命令测变量渠道。
跨引擎命令对照:GOM常用GAMEGOLD、GiveYuanBao/AddYuanBao按版本;GEE常用AddYuanBao、GAMEGOLD类函数;Hero常用GIVE元宝物品或自定义元宝变量;Blue用GIVE_YUANBAO类命令。落地前在测试号发10元档,确认订单名单写入、NPC领取、GAMEGOLD/GIVE到账、recharge_log.txt追加、done名单去重、累充变量增加,再接真实支付回调。
传奇元宝充值记录脚本添加教材:NPC发元宝写日志订单去重与累充统计全实例
来源:
作者:
点击:

