传奇全服总库存与单号每日限购NPC售卖脚本HeroGOM变量名单防刷教程

来源: 作者: 点击:
限量卖物品核心就是三件事:全服共卖多少件、每个人最多买几件、什么时间把库存和限购重置。普通商店用goods或SELL只适合无限库存,限量必须改脚本,用全局变量记总库存、用人物/账号变量记个人次数、用机器人或QuestDiary做零点重置。

一、NPC注册与文件位置

对话型限量NPC放Mir200\Envir\Npc_def,名字在Npcs.txt登记;商人型放Mir200\Envir\Market_Def,并在Merchant.txt登记。以商人型为例,Merchant.txt行按本服字段写NPC名、地图号、X、Y、脚本名、范围、图标、是否交易。脚本文件建Market_Def\限量商人.txt,首标签[@main]。改完交易型可用M2重载NPC或@reloadnpc,对话型按本服重载方式处理,异常就重启M2。

如果用M2自带的售卖物品功能,部分GOM类在NPC属性“售卖物品”里加物品并填库存数量,0代表无限,填10就是总共10件;这种方式适合简单限量,但不支持复杂的单号每日、单IP防刷。

二、全服总库存用全局变量

思路:建一个全局数字变量存剩余库存,玩家购买前判断大于0,扣钱后发物品并把全局变量减1;到0就提示售罄。不同引擎全局变量写法不同,Hero可用GLOBAL或GlobalVar文件方案,GOM类用CheckGlobal/SetGlobal或自定义全局数字变量,通用教学可用$ItemStock这类示例变量名。

Hero思路示例:

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
SENDMSG6购买成功,剩余库存请重新对话查看
GOTO@main
ELSEACT

IF

CHECKGLOBAL限量屠龙库存=0
ACT

MESSAGEBOX今日屠龙已售罄
ELSEACT

MESSAGEBOX元宝不足,无法购买

上面CHECKGLOBAL/SETGLOBAL按本服Hero全局命令名替换;老版本若用GlobalVar.txt文本变量,就用LOADVAR/SAVEVAR或M2全局变量管理。GOM可写成CheckGlobal限量屠龙库存>0、SetGlobal限量屠龙库存-1;若本服不支持全局变量减法,用D/G变量配合机器人初始化,但D变量重启会丢,重要库存用可保存全局方案。

主菜单把库存读出来:

[@main]
限量商城\\
屠龙:2000元宝,剩余库存<$GLOBAL(限量屠龙库存)>\\
1.购买屠龙/@buy_item\\

若引擎不支持<$GLOBAL(变量)>这种内插,就把剩余量用SENDMSG单独发,或者在购买成功后再用查询标签输出。

三、单角色每日限购

只限全服总库存不够,玩家可反复买完所有库存。加人物变量记当天购买次数。Hero用HUMAN数字变量,GOM类用HUMAN/个人变量并配合SAVEVAR,BLUE类按本服用户数据方案。

示例每人每天最多买2把屠龙:

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
CHECKVARHUMAN屠龙日购<2
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
CALCVARHUMAN屠龙日购+1
SAVEVARHUMAN屠龙日购..\QuestDiary\限量\屠龙日购.txt
SENDMSG6购买成功,今日已买<$STR(HUMAN屠龙日购)>/2把
GOTO@main
ELSEACT

IF

CHECKVARHUMAN屠龙日购>1
ACT

MESSAGEBOX今日个人购买已达2把
ELSEACT

IF

CHECKGLOBAL限量屠龙库存=0
ACT

MESSAGEBOX全服库存已空
ELSEACT

MESSAGEBOX元宝不足

CALCVAR/CHECKVAR/HUMAN按所用Hero小版本替换;GOM用VARIntegerHUMAN声明、CHECKVAR、CALCVAR、LOADVAR、SAVEVAR;若本服HUMAN不落盘,重启后次数会丢,重要活动改名单文件。

名单方案更稳,不受变量作用域影响:

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
CHECKNAMELIST..\QuestDiary\限量\屠龙已买.txt
ACT

MESSAGEBOX今日已购买过,明天再来
ELSEACT

IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
ADDNAMELIST..\QuestDiary\限量\屠龙已买.txt
SENDMSG6购买成功,名单已记录
GOTO@main

名单文件建空txt放在对应QuestDiary子目录,机器人零点CLEARNAMELIST清空。

四、单账号和单IP防小号

多角色同账号刷:用账号变量。Hero资料里U开头绑账号、I开头绑IP、G是全局;限制同IP用I,限制同账号用U,别混用。

Hero账号+IP双控示例:

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
CheckVariableU屠龙已买0
CheckVariableI屠龙IP已买0
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
SetVariableU屠龙已买1
SetVariableI屠龙IP已买1
SENDMSG6购买成功,账号与IP均已限领
GOTO@main
ELSEACT

IF

CheckVariableU屠龙已买1
ACT

MESSAGEBOX该账号已购买
ELSEACT

IF

CheckVariableI屠龙IP已买1
ACT

MESSAGEBOX该IP已购买
ELSEACT

MESSAGEBOX库存或元宝不足

CheckVariable/SetVariable按本服Hero变量命令名调整;若用小号体系,U/I变量名和声明方式以M2变量管理为准。同局域网多个玩家公网IP相同,IP限制会误伤,可把IP限次改成每IP每日N次,而不是1次。

文本IP名单方案:

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
CHECKIPLIST..\QuestDiary\限量\屠龙IP.txt
ACT

MESSAGEBOX该IP已购买
ELSEACT

IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
ADDIPLIST..\QuestDiary\限量\屠龙IP.txt
SENDMSG6购买成功,IP已记录
GOTO@main

CHECKIPLIST/ADDIPLIST命令名各引擎不同,Hero也可用WRITETOFILE写IP文本再比对,机器人零点DELFILELINE清空。

五、按时间段的限量活动

要求每天20点到21点可买、库存每天50把、每人每天1把。NPC先判断系统时间,再判断库存和个限。

[@buy_item]
IF

CHECKTIME20:00-21:00
CHECKGLOBAL晚场屠龙库存>0
CHECKGAMEGOLD>2000
CHECKVARHUMAN晚场屠龙=0
ACT

SETGLOBAL晚场屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
CALCVARHUMAN晚场屠龙=1
SENDMSG6晚场购买成功
GOTO@main
ELSEACT

IF

CHECKTIME20:00-21:00
ACT

MESSAGEBOX非售卖时间或已售罄或已购买
ELSEACT

MESSAGEBOX仅在20:00-21:00购买

CHECKTIME格式按本服命令要求改,有的写HH:MM-HH:MM,有的用OnWeek、RunOnDay判断。时间窗和外网服务器时区保持一致,机器人零点重置库存和个人变量。

六、零点重置库存与限购

方案A:Robot自动跑。AutoRunRobot.txt写:

AutoRunNPCRUNONDAY00:00:00@限量重置

RobotManage.txt写:

[@限量重置]
IF

ACT

SETGLOBAL限量屠龙库存10
SETGLOBAL晚场屠龙库存50
CLEARNAMELIST..\QuestDiary\限量\屠龙已买.txt
CLEARNAMELIST..\QuestDiary\限量\屠龙日购.txt
CLEARIPLIST..\QuestDiary\限量\屠龙IP.txt
MOVHUMAN屠龙日购0
MOVHUMAN晚场屠龙0
MOVU屠龙已买0
MOVI屠龙IP已买0

SETGLOBAL/MOV/CLEAR各命令按引擎替换;Hero全局若走GlobalVar文件,用对应加载保存命令,Robot里直接MOV全局不生效就要在M2变量管理或登录脚本初始化。名单、IP名单路径按实际QuestDiary目录改。

方案B:QuestDiary定时器。建立量\重置.txt,用#AutoRun或OnTimer每分钟/每天触发,执行变量置初始值、清名单。GOM可用CLEARVARCALCULATE清角色变量目录,Hero可用CLEARGLOBALVAR清全局变量目录,BLUE用RESETUSERDATA,命令不一致时以本服M2脚本命令表为准。

七、用M2售卖物品做简单限量

不写脚本也能限量:NPC管理找到目标NPC,售卖物品选项卡添加物品,填价格、库存数量,0无限、10就是10件,勾允许购买后保存重载。缺点是没有单角色每日、单账号、单IP限制,谁手快谁买完。适合临时活动、低级材料、不担心被小号扫货的场景。稀有武器、元宝道具、新区福利不建议只靠M2库存,必须脚本加个人限次。

八、SELL命令限量思路

部分GOM/翎风类商人可用SELL物品ID单次数量价格,例如SELL38311000000表示单次买1把屠龙、100万金币;SELL本身不自动做全服总库存,需要外层用全局变量判断。示例:

[@main]
IF

ACT

SAY

限量符文\\
1.帝王符文一2000元宝/@buy1\\

[@buy1]
IF

CHECKGLOBAL帝王符文一库存>0
CheckGAMEGOLD>1999
ACT

SetGlobal帝王符文一库存-1
GAMEGOLD-2000
give帝王符文(一)1
SENDMSG0购买限量物品帝王符文(一),剩余库存<$STR(GLOBAL帝王符文一库存)>
GOTO@main
ELSEACT

MESSAGEBOX库存不足或元宝不足

CheckGAMEGOLD、give、GAMEGOLD减扣按GOM类写法;Hero若用GAMEGOLD代表元宝,命令一致,若元宝是物品则改成CHECKITEM元宝、TAKE元宝、GIVE物品。

九、价格随库存腐

全服库存高时便宜、库存低时涨价,用全局库存值分档:

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>5
CHECKGAMEGOLD>1000
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-1000
GIVE屠龙1
SENDMSG6库存充足价1000,购买成功
GOTO@main

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>0
SMALLG全局库存变量6
CHECKGAMEGOLD>2000
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
SENDMSG6库存紧张价2000,购买成功
GOTO@main

SMALL/LARGE比较全局变量时,若引擎只支持比较人物/本地变量,就先把全局库存读入D变量再判断。价格分档要和主菜单提示一致,否则玩家看到1000实际扣2000会被投诉。

十、防并发超卖

两人同时点、库存只剩1,可能都通过大于0判断,导致发2把。单线程脚本引擎一般按会话顺序执行,风险较低;高并发但仍建议加锁变量。用全局锁方案:

[@buy_item]
IF

CHECKGLOBAL购买锁=0
CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
CHECKVARHUMAN屠龙日购<2
ACT

SETGLOBAL购买锁1
SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
CALCVARHUMAN屠龙日购+1
SETGLOBAL购买锁0
SENDMSG6购买成功
GOTO@main
ELSEACT

MESSAGEBOX正在处理其他订单或库存/限额不足

购买锁用完后必须置回0,异常分支也要考虑重置;如果本服变量不支持在NPC里这样互斥,就把限量逻辑放到机器人单线程标签或M2商业售卖模块处理。拍卖行类也可用类似全局锁防止同时买走同一件。

十一、完整可抄模板

Merchant.txt:

限量商人3330330限量商人080011

Market_Def\限量商人.txt:

[@main]
每日限量商城\\
屠龙:2000元宝,全服库存10,每人每日2\\
1.购买屠龙/@buy_item\\

[@buy_item]
IF

CHECKGLOBAL限量屠龙库存>0
CHECKGAMEGOLD>2000
CHECKVARHUMAN屠龙日购<2
CheckVariableU屠龙已买0
CheckVariableI屠龙IP已买0
ACT

SETGLOBAL限量屠龙库存-1
GAMEGOLD-2000
GIVE屠龙1
CALCVARHUMAN屠龙日购+1
SetVariableU屠龙已买1
SetVariableI屠龙IP已买1
SAVEVARHUMAN屠龙日购..\QuestDiary\限量\屠龙日购.txt
SENDMSG6购买成功,今日第<$STR(HUMAN屠龙日购)>把
GOTO@main
ELSEACT

IF

CHECKGLOBAL限量屠龙库存=0
ACT

MESSAGEBOX全服屠龙已售罄
ELSEACT

IF

CHECKVARHUMAN屠龙日购>1
ACT

MESSAGEBOX今日个人限购2把
ELSEACT

IF

CheckVariableU屠龙已买1
ACT

MESSAGEBOX该账号已购买
ELSEACT

IF

CheckVariableI屠龙IP已买1
ACT

MESSAGEBOX该IP已购买
ELSEACT

MESSAGEBOX元宝不足

RobotManage零点:

[@限量重置]
IF

ACT

SETGLOBAL限量屠龙库存10
MOVHUMAN屠龙日购0
SetVariableU屠龙已买0
SetVariableI屠龙IP已买0
CLEARNAMELIST..\QuestDiary\限量\屠龙日购.txt

各SETGLOBAL/CHECKGLOBAL/MOV/CALCVAR/CheckVariable按Hero或GOM实际命令替换;若用名单方案,把人物变量判断改CHECKNAMELIST、购买后ADDNAMELIST,零点CLEARNAMELIST。

十二、排错顺序

NPC不显示购买项:看Merchant/Npcs坐标、脚本名、[@main]是否存在,文件编码用ANSI,M2是否重载成功。

库存不减:SETGLOBAL或减变量命令名错,全局变量未声明,或者用了D变量但重启丢失;改可保存全局方案或在M2变量管理初始化。

一直能买不限次:个人变量没保存,HUMAN重启清零;换名单或账号变量。U/I变量用错,限制IP却用U,限制账号却用I。

同局域网全被限:IP方案限1次会误伤,改每IP每日N次,或只用账号+角色双控,不用IP。

扣钱成功不发物品:GIVE物品名和StdItems数据库不一致,含空格、括号、全半角;元宝若用物品不用GAMEGOLD,要改CHECKITEM/TAKE/GIVE元宝。

零点不重置:AutoRunRobot时间格式错,RobotManage标签名和AutoRun不一致,CLEARNAMELIST路径错,全局变量重置命令不被本服支持;先手动执行一次重置标签看是否生效。

限量活动超卖:去掉复杂并发前先单变量判断,加全局锁;如果仍超卖,把售卖改M2商业NPC或单线程机器人队列,不在普通NPC做高并发抢购。

按总库存全局变量、个人每日变量、账号/IP双控、零点重置四层写,限量销售既能控制全服产出,也能挡小号扫货;只写总库存不写个人限次会被单号买空,只写个人限次不写总库存会无法做全服稀缺,两套必须一起上。
[顶部]