限量卖物品核心就是三件事:全服共卖多少件、每个人最多买几件、什么时间把库存和限购重置。普通商店用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
SENDMSG 6 购买成功,剩余库存请重新对话查看
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
CHECKVAR HUMAN 屠龙日购 <2
ACT
SETGLOBAL 限量屠龙库存 -1
GAMEGOLD -2000
GIVE 屠龙 1
CALCVAR HUMAN 屠龙日购 +1
SAVEVAR HUMAN 屠龙日购 ..\QuestDiary\限量\屠龙日购.txt
SENDMSG 6 购买成功,今日已买<$STR(HUMAN 屠龙日购)>/2把
GOTO @main
ELSEACT
IF
CHECKVAR HUMAN 屠龙日购 >1
ACT
MESSAGEBOX 今日个人购买已达2把
ELSEACT
IF
CHECKGLOBAL 限量屠龙库存 =0
ACT
MESSAGEBOX 全服库存已空
ELSEACT
MESSAGEBOX 元宝不足
CALCVAR/CHECKVAR/HUMAN按所用Hero小版本替换;GOM用VAR Integer HUMAN声明、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
SENDMSG 6 购买成功,名单已记录
GOTO @main
名单文件建空txt放在对应QuestDiary子目录,机器人零点CLEARNAMELIST清空。
四、单账号和单IP防小号
多角色同账号刷:用账号变量。Hero资料里U开头绑账号、I开头绑IP、G是全局;限制同IP用I,限制同账号用U,别混用。
Hero账号+IP双控示例:
[@buy_item]
IF
CHECKGLOBAL 限量屠龙库存 >0
CHECKGAMEGOLD >2000
CheckVariable U屠龙已买 0
CheckVariable I屠龙IP已买 0
ACT
SETGLOBAL 限量屠龙库存 -1
GAMEGOLD -2000
GIVE 屠龙 1
SetVariable U屠龙已买 1
SetVariable I屠龙IP已买 1
SENDMSG 6 购买成功,账号与IP均已限领
GOTO @main
ELSEACT
IF
CheckVariable U屠龙已买 1
ACT
MESSAGEBOX 该账号已购买
ELSEACT
IF
CheckVariable I屠龙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
SENDMSG 6 购买成功,IP已记录
GOTO @main
CHECKIPLIST/ADDIPLIST命令名各引擎不同,Hero也可用WRITETOFILE写IP文本再比对,机器人零点DELFILELINE清空。
五、按时间段的限量活动
要求每天20点到21点可买、库存每天50把、每人每天1把。NPC先判断系统时间,再判断库存和个限。
[@buy_item]
IF
CHECKTIME 20:00-21:00
CHECKGLOBAL 晚场屠龙库存 >0
CHECKGAMEGOLD >2000
CHECKVAR HUMAN 晚场屠龙 =0
ACT
SETGLOBAL 晚场屠龙库存 -1
GAMEGOLD -2000
GIVE 屠龙 1
CALCVAR HUMAN 晚场屠龙 =1
SENDMSG 6 晚场购买成功
GOTO @main
ELSEACT
IF
CHECKTIME 20:00-21:00
ACT
MESSAGEBOX 非售卖时间或已售罄或已购买
ELSEACT
MESSAGEBOX 仅在20:00-21:00购买
CHECKTIME格式按本服命令要求改,有的写HH:MM-HH:MM,有的用OnWeek、RunOnDay判断。时间窗和外网服务器时区保持一致,机器人零点重置库存和个人变量。
六、零点重置库存与限购
方案A:Robot自动跑。AutoRunRobot.txt写:
AutoRun NPC RUNONDAY 00:00:00 @限量重置
RobotManage.txt写:
[@限量重置]
IF
ACT
SETGLOBAL 限量屠龙库存 10
SETGLOBAL 晚场屠龙库存 50
CLEARNAMELIST ..\QuestDiary\限量\屠龙已买.txt
CLEARNAMELIST ..\QuestDiary\限量\屠龙日购.txt
CLEARIPLIST ..\QuestDiary\限量\屠龙IP.txt
MOV HUMAN 屠龙日购 0
MOV HUMAN 晚场屠龙 0
MOV U屠龙已买 0
MOV I屠龙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 单次数量 价格,例如SELL 383 1 1000000表示单次买1把屠龙、100万金币;SELL本身不自动做全服总库存,需要外层用全局变量判断。示例:
[@main]
IF
ACT
SAY
限量符文\ \
1.帝王符文一 2000元宝 /@buy1\ \
[@buy1]
IF
CHECKGLOBAL 帝王符文一库存 >0
CheckGAMEGOLD >1999
ACT
SetGlobal 帝王符文一库存 -1
GAMEGOLD -2000
give 帝王符文(一) 1
SENDMSG 0 购买限量物品帝王符文(一),剩余库存<$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
SENDMSG 6 库存充足价1000,购买成功
GOTO @main
[@buy_item]
IF
CHECKGLOBAL 限量屠龙库存 >0
SMALL G全局库存变量 6
CHECKGAMEGOLD >2000
ACT
SETGLOBAL 限量屠龙库存 -1
GAMEGOLD -2000
GIVE 屠龙 1
SENDMSG 6 库存紧张价2000,购买成功
GOTO @main
SMALL/LARGE比较全局变量时,若引擎只支持比较人物/本地变量,就先把全局库存读入D变量再判断。价格分档要和主菜单提示一致,否则玩家看到1000实际扣2000会被投诉。
十、防并发超卖
两人同时点、库存只剩1,可能都通过大于0判断,导致发2把。单线程脚本引擎一般按会话顺序执行,风险较低;高并发但仍建议加锁变量。用全局锁方案:
[@buy_item]
IF
CHECKGLOBAL 购买锁 =0
CHECKGLOBAL 限量屠龙库存 >0
CHECKGAMEGOLD >2000
CHECKVAR HUMAN 屠龙日购 <2
ACT
SETGLOBAL 购买锁 1
SETGLOBAL 限量屠龙库存 -1
GAMEGOLD -2000
GIVE 屠龙 1
CALCVAR HUMAN 屠龙日购 +1
SETGLOBAL 购买锁 0
SENDMSG 6 购买成功
GOTO @main
ELSEACT
MESSAGEBOX 正在处理其他订单或库存/限额不足
购买锁用完后必须置回0,异常分支也要考虑重置;如果本服变量不支持在NPC里这样互斥,就把限量逻辑放到机器人单线程标签或M2商业售卖模块处理。拍卖行类也可用类似全局锁防止同时买走同一件。
十一、完整可抄模板
Merchant.txt:
限量商人 3 330 330 限量商人 0 8 0 0 1 1
Market_Def\限量商人.txt:
[@main]
每日限量商城\ \
屠龙:2000元宝,全服库存10,每人每日2\ \
1.购买屠龙 /@buy_item\ \
[@buy_item]
IF
CHECKGLOBAL 限量屠龙库存 >0
CHECKGAMEGOLD >2000
CHECKVAR HUMAN 屠龙日购 <2
CheckVariable U屠龙已买 0
CheckVariable I屠龙IP已买 0
ACT
SETGLOBAL 限量屠龙库存 -1
GAMEGOLD -2000
GIVE 屠龙 1
CALCVAR HUMAN 屠龙日购 +1
SetVariable U屠龙已买 1
SetVariable I屠龙IP已买 1
SAVEVAR HUMAN 屠龙日购 ..\QuestDiary\限量\屠龙日购.txt
SENDMSG 6 购买成功,今日第<$STR(HUMAN 屠龙日购)>把
GOTO @main
ELSEACT
IF
CHECKGLOBAL 限量屠龙库存 =0
ACT
MESSAGEBOX 全服屠龙已售罄
ELSEACT
IF
CHECKVAR HUMAN 屠龙日购 >1
ACT
MESSAGEBOX 今日个人限购2把
ELSEACT
IF
CheckVariable U屠龙已买 1
ACT
MESSAGEBOX 该账号已购买
ELSEACT
IF
CheckVariable I屠龙IP已买 1
ACT
MESSAGEBOX 该IP已购买
ELSEACT
MESSAGEBOX 元宝不足
RobotManage零点:
[@限量重置]
IF
ACT
SETGLOBAL 限量屠龙库存 10
MOV HUMAN 屠龙日购 0
SetVariable U屠龙已买 0
SetVariable I屠龙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双控、零点重置四层写,限量销售既能控制全服产出,也能挡小号扫货;只写总库存不写个人限次会被单号买空,只写个人限次不写总库存会无法做全服稀缺,两套必须一起上。
传奇全服总库存与单号每日限购NPC售卖脚本Hero GOM变量名单防刷教程
来源:
作者:
点击:

