时间点卡在服务端里不是一个单独的开关,它由三块拼起来:引擎的计费口径、记录剩余时间的那个数据文件、以及登录和定时里跑的脚本。哪一块没对齐,玩家那边就会出现扣点不准、时间不减、买完卡进不去的毛病。下面按实际搭建顺序拆开讲。
先确定时间怎么算
点卡的时间单位有三种常见写法,混用是出问题的头号原因。
按分钟扣点,把剩余分钟数存在游戏点里,每到一分钟扣一点,扣到零就踢人。这种口径最直观,玩家能随时看到自己还剩多少分钟。
按小时扣点,逻辑一样,只是把单位换成小时,定时器间隔改成三千六百秒。
按到期时间算,不做减法而做比大小。玩家身上记一个到期时刻,登录时拿当前时间和它对比,还没到就放行,过了就拦下。这种就是月卡、周卡那套,玩家下线时间照样走,不会再单独扣点。
选哪种,取决于你想卖的是时长还是时段。三种口径写在同一个版本里可以,但同一个玩家身上不要既有分钟点又有到期时刻,否则两边一起扣,玩家会找上门。
引擎和网关这两侧的收费开关
计费不一定全在脚本里。部分版本的收费判定放在登录网关上,由网关按在线时长扣点,脚本只负责显示和卖卡;另一些版本把点数交给引擎,脚本用命令直接增减。上手第一步是确认你这份服务端的计费落在哪一侧。
打开引擎的主控界面,在选项里的参数设置或游戏参数一栏,通常能找到一个计费方式的下拉项,可选免费、计时、按点。把它切到对应模式,退出时保存,再重启引擎让设置生效。如果版本带独立计费网关,网关目录下也有配套的配置文件,里面写着单点对应的分钟数、扣点间隔、断线是否继续计费这几项,这些值和后面脚本里的间隔必须一致。
按分钟扣点的做法
这条路线把游戏点当分钟用,核心命令只有几个。
GAMEPOINT 控制符 点数,用来加、减、赋值游戏点。写 GAMEPOINT + 60 是加六十分钟,GAMEPOINT - 1 是扣一分钟。
CHECKGAMEPOINT 控制符 点数,判断当前点数。写 CHECKGAMEPOINT > 0 表示还有余额。
SETONTIMER 编号 间隔秒数,个人定时器,编号在一个玩家的身上不能重复占用。
SETOFFTIMER 编号,把定时器关掉。
定时器开好之后,引擎会按间隔自动跑去执行 [@OnTimer编号] 这一段脚本。把扣点动作放在这里,才不会漏扣也不会重复扣。
一份可以直接改的购买加扣点脚本长这样。
text
[@点卡中心]
#IF
#ACT
SETONTIMER 19 60
SENDMSG 6 你当前剩余在线时间 <$GAMEPOINT> 分钟。
[@买60分钟]
#IF
CHECKGAMEGOLD > 5999
#ACT
GAMEGOLD - 6000
GAMEPOINT + 60
SETONTIMER 19 60
SENDMSG 6 已购买60分钟点卡,当前剩余 <$GAMEPOINT> 分钟。
GOTO @点卡中心
[@买600分钟]
#IF
CHECKGAMEGOLD > 59999
#ACT
GAMEGOLD - 60000
GAMEPOINT + 600
SETONTIMER 19 60
SENDMSG 6 已购买600分钟点卡,当前剩余 <$GAMEPOINT> 分钟。
GOTO @点卡中心
[@OnTimer19]
#IF
CHECKGAMEPOINT > 0
#ACT
GAMEPOINT - 1
#ELSEACT
SETOFFTIMER 19
MESSAGEBOX 你的在线时间已经用完,请购买点卡后再上线。
KICK
这段的扣点只发生在定时器里,间隔设成六十秒,一次扣一点,正好是一分钟。购买那边先把定时器开起来,是防止玩家买卡前没进过点卡中心、身上根本没挂定时器的情况。
游戏点用 <$GAMEPOINT> 直接显示,写在对话框和提示里都能读到。余额不足那段用 SETOFFTIMER 先把定时器关掉再踢人,不然玩家重新上线时旧定时器还挂着,会出现负数和反复弹框。
按到期时间的做法
月卡、周卡这类不愿意按分钟扣的,用会员时间命令更省事。
老一点的引擎里是这三条:ADDUSERDATE 名单文件,给当前角色加一段会员时间;CHECKUSERDATE 名单文件 控制符 天数 变量一 变量二,对比剩余时间和阈值,把已用天数、剩余天数接到变量里;DELUSERDATE 名单文件,把角色的会员记录删掉。加时间的单位是决定好的天数,比如卖三十天的卡,就配一段固定加三十天的脚本。
GOM 这一系换成了另一套:ADDNAMEDATETIMELIST 名单文件 天数 小时 分钟,三个参数分开写,一小时的卡就是 0 1 0;CHECKNAMEDATETIMELIST 名单文件 是否删除过期 到期时间变量 剩余天数变量 剩余小时变量 剩余分钟变量,把到期时刻和剩余量一起吐出来。是否删除过期这个参数填一,过期记录在检测时自动清掉。
写的时候把剩余天数、剩余小时、剩余分钟三个变量都用 <$STR(变量)> 拼进提示里,玩家在对话框上就能看到还有几天到期。这两个前置检测命令都必须先过一遍判断,再执行加时间,顺序写反会让没过期的记录被重复叠加。
text
[@领月卡]
#IF
CHECKNAMEDATETIMELIST ..\QuestDiary\会员\会员名单.txt 1 <$STR(S$1)> <$STR(N$1)> <$STR(N$2)> <$STR(N$3)>
#ACT
ADDNAMEDATETIMELIST ..\QuestDiary\会员\会员名单.txt 30 0 0
SENDMSG 6 月卡到账,到期时间 <$STR(S$1)>。
卡密和自动发卡怎么接
从发卡平台买来的卡密,要让玩家自己输入核销,用到的是列表检测这一类命令。
流程是先摆一个输入框,把玩家填进去的字符串接住,命令名各引擎不一样,常见的是 InPutString 加编号,编号对应到 S 变量;然后拿这个值去卡密文件里比对,比中了就把这一行从文件里删掉,再执行发时间和发点。
CHECKCODELIST 路径,按玩家刚才输入的字符串去文件里找。CLEARCODELIST 路径,把匹配到的那一行清掉,防止一张卡被反复用。这两条在有些引擎上要带参数,具体写法看你手上引擎自带的命令说明。
卡密的存放位置分档,五元卡、十元卡、月卡各放一个文本文件,一行一个码,文件编码要跟引擎一致,带没带空行、有没有多余空格都会影响比对。给玩家的提示要写清卡密错误几次会上报,避免有人拿脚本刷。
地图泡点是另一条线
有的版本不靠定时器扣点,而是用地图参数来增减点。地图配置文件里给某张图挂上 INCGAMEPOINT(60/1),意思是人在图里每六十秒加一点;换成 DECGAMEPOINT(1/10) 就是每秒减十点,点扣光了自动传回上次的回城点。这种写法适合把计费绑在特定地图上的玩法,比如闭关修炼、专属挂机区。
泡点地图和点卡扣点不要同时挂在同一个玩家身上。两边都在动游戏点,一边加一边减,点数会飘,玩家看到的余额和实际扣的对不上。
数据文件和变量这几处最容易错
游戏点是玩家身上的一个数值,重启后归零还是保留,取决于引擎把角色数据存到哪里。用文件记录的路线要保证文件真实存在、目录层级对得上,脚本里写相对路径时,一个点和两个点差一层目录,多写少写都会让命令静默失效。
变量一律大写。
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
、
USERNAME、USERID、
𝑆
𝐸
𝑅
𝑉
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
、
SERVERNAME、GAMEPOINT 这些,写成小写引擎读不到值,脚本看着没报错,实际什么都不干。
定时器编号要挑没被占用的。版本里往往已经有一堆定时器在跑活动、回血、公告,开之前先把整个脚本文件搜一遍 @OnTimer,避开已经用了的编号。
扣点间隔和引擎或网关里的单点时长必须一致。脚本里六十秒扣一点,网关那边如果按一百二十秒算,玩家体感就是时间走得慢,两边的账都对不上。
上线前按这几点过一遍
买卡、扣点、余额为零被拦、卡密核对、过期记录清理,这五条路径各用测试号跑一次,看聊天框提示和数据文件的变化对不对。
关掉引擎再打开,检查点数有没有丢。丢了说明数据没落盘,要回去看引擎的数据保存设置。
把系统时间往前调一天,看到期时间那套会不会误判。会误判就把检测命令前加一道判断,排除时间异常的情况。
确认网关和脚本的计费口径完全一致,再开区。两边不一致造成的投诉,查起来比脚本写错还费劲。
传奇服务端时间点卡程序设置方法详解 从计费口径到扣点脚本的完整搭建流程
来源:
作者:
点击:

