批量买药核心用输入数字命令拿数量到变量,再乘单价算总价,先查背包空格和货币,满足后GIVE发药、TAKE扣钱。不同引擎输入命令名字不同,GOM/BLUE类常用@@InPutInteger,Hero可用其输入数字命令或参数变量,LEG按本服InputNumber/PA变量替换;下面给通用可改模板。
一、NPC注册
商人型放Mir200\Envir\Market_Def,文件名如批量买药.txt;Merchant.txt加一行,字段按本服顺序写NPC名、地图号、X、Y、脚本名、范围、图标、是否交易。对话型放npc_def并在npcs.txt登记也可,但批量卖药用商人型更顺。文件保存ANSI,改完M2重载NPC或重启。
二、GOM/BLUE输入数量模板
[@main]
批量买药中心\\
超级金创药单价3500金币/@buy_hp\\
超级魔法药单价3500金币/@buy_mp\\
[@buy_hp]
输入要购买的数量\\
@@InPutInteger1
[@InPutInteger1]
IF
EQUALN10
ACT
SAY
数量不能为0,请重新输入\\
GOTO@buy_hp
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_hp
IF
LARGEN12000
ACT
SAY
单次最多输入2000\\
GOTO@buy_hp
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM03500
GOTO@hp_checkbag
[@hp_checkbag]
IF
CHECKBAGSIZEN1
ACT
GOTO@hp_checkgold
ELSEACT
SAY
背包空格不足,需要至少<N1>个空格\\
GOTO@buy_hp
[@hp_checkgold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE超级金创药N1
SENDMSG6批量购买超级金创药<N1>个,扣款<M0>金币
GOTO@main
ELSEACT
SAY
金币不足,需要<M0>金币\\
GOTO@buy_hp
@@InPutInteger1用于呼出数字输入框,N1接收输入值;InPutInteger后面数字决定写哪个N1,0到255按引擎支持范围填。EQUALN10拦零,SMALLN11拦负数和零,LARGEN12000拦超量。MULM03500把数量乘单价,M0作为总价;CHECKBAGSIZEN1检查背包是否有足够空格,避免发药爆包。CHECKGOLDM0检查金币足够,TAKE金币M0扣款,GIVE超级金创药N1按数量发药。
三、魔法药与其他药复制
[@buy_mp]
输入要购买的数量\\
@@InPutInteger2
[@InPutInteger2]
IF
EQUALN10
ACT
SAY
数量不能为0,请重新输入\\
GOTO@buy_mp
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_mp
IF
LARGEN12000
ACT
SAY
单次最多输入2000\\
GOTO@buy_mp
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM03500
GOTO@mp_checkbag
[@mp_checkbag]
IF
CHECKBAGSIZEN1
ACT
GOTO@mp_checkgold
ELSEACT
SAY
背包空格不足,需要至少<N1>个空格\\
GOTO@buy_mp
[@mp_checkgold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE超级魔法药N1
SENDMSG6批量购买超级魔法药<N1>个,扣款<M0>金币
GOTO@main
ELSEACT
SAY
金币不足,需要<M0>金币\\
GOTO@buy_mp
不同药换GIVE物品名和单价即可。若用普通金创药、强效金创药、太阳水,把超级金创药改成数据库StdItems实际Name,单价改MUL的第二个数。
四、元宝买药写法
元宝若用GAMEGOLD变量:
[@buy_hp_yb]
输入要购买的数量\\
@@InPutInteger3
[@InPutInteger3]
IF
EQUALN10
ACT
SAY
数量不能为0\\
GOTO@buy_hp_yb
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_hp_yb
IF
LARGEN1500
ACT
SAY
单次最多500\\
GOTO@buy_hp_yb
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM01
GOTO@hp_yb_bag
[@hp_yb_bag]
IF
CHECKBAGSIZEN1
ACT
GOTO@hp_yb_gold
ELSEACT
SAY
背包空格不足\\
GOTO@buy_hp_yb
[@hp_yb_gold]
IF
CHECKGAMEGOLDM0
ACT
GAMEGOLD-M0
GIVE超级金创药N1
SENDMSG6元宝购买金创药<N1>个,扣<M0>元宝
GOTO@main
ELSEACT
SAY
元宝不足,需要<M0>\\
GOTO@buy_hp_yb
若元宝是背包物品“元宝”,把CHECKGAMEGOLD/GAMEGOLD-M0改成CHECKITEM元宝M0、TAKE元宝M0;绑定元宝用绑定元宝物品名和对应TAKE命令。
五、Hero输入数量写法
Hero老版可用参数变量或自定义输入命令。若本服支持@@InPutInteger,直接套上面GOM模板;若用参数P0接收,主菜单不让手输,改固定按钮传数量:
[@buy_hp_10]
IF
ACT
MOVP010
GOTO@hero_hp_cal
[@hero_hp_cal]
IF
ACT
MOVM00
MOVM0P0
MULM03500
GOTO@hero_hp_bag
[@hero_hp_bag]
IF
CHECKBAGSIZEP0
ACT
GOTO@hero_hp_gold
ELSEACT
SAY
背包空格不足\\
GOTO@main
[@hero_hp_gold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE超级金创药P0
SENDMSG6购买金创药<P0>个,扣<M0>金币
GOTO@main
ELSEACT
SAY
金币不足\\
GOTO@main
要自由输入就把主菜单按钮改成Hero输入数字命令,回传N变量后再走MUL/CHECKBAGSIZE/CHECKGOLD/GIVE/TAKE。Hero变量名若不支持M0,用D0/A0/N0按本服数字变量替换;CHECKBAGSIZE不支持变量时用固定空格判断或分档。
六、多档药品菜单
[@main]
批量买药\\
1.超级金创药3500金/个/@buy_hp\\
2.超级魔法药3500金/个/@buy_mp\\
3.太阳水5000金/个/@buy_sun\\
4.强效金创药2000金/个/@buy_bighp\\
5.强效魔法药2000金/个/@buy_bigmp\\
[@buy_sun]
输入数量\\
@@InPutInteger4
[@InPutInteger4]
IF
EQUALN10
ACT
SAY
数量不能为0\\
GOTO@buy_sun
IF
SMALLN11
ACT
SAY
数量错误\\
GOTO@buy_sun
IF
LARGEN11000
ACT
SAY
单次最多1000\\
GOTO@buy_sun
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM05000
GOTO@sun_bag
[@sun_bag]
IF
CHECKBAGSIZEN1
ACT
GOTO@sun_gold
ELSEACT
SAY
背包空格不足\\
GOTO@buy_sun
[@sun_gold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE太阳水N1
SENDMSG6购买太阳水<N1>个,扣<M0>金币
GOTO@main
ELSEACT
SAY
金币不足\\
GOTO@buy_sun
强效药把物品名和MUL单价改掉即可,逻辑完全复用。
七、防刷与边界处理
零和负数:EQUALN10、SMALLN11双重拦;部分老引擎输入空值可能返回0,只拦0不够,必须拦小于1。
超大数量:LARGEN1上限拦截,金创类可设2000,太阳水设1000,按背包和金币承受力改;不设计上限会被一次输入几十万刷物品。
背包空格:CHECKBAGSIZEN1按数量查;老引擎不支持变量就CHECKBAGSIZE固定值,或分批购买。空格不足先提示再回菜单,不要强行GIVE。
货币校验顺序:先CHECKBAGSIZE再CHECKGOLD/CHECKGAMEGOLD,先扣钱再发药会出问题;标准顺序算价、查包、查钱、扣钱、发药。若先发药后扣钱,并发或脚本异常会白嫖。
重复点击:BLUE/GOM输入标签加DelayGoto1~标签名,防止网络延迟连点重复购买。示例:
[@InPutInteger1]
IF
ACT
DelayGoto1~InPutInteger1
...条件...
输入非法字符:数字输入框一般只收数字;若用字符串输入命令,加格式判断,非数字直接回主菜单,不进入MUL,避免运算错误。
小号刷药:加等级限制CHECKLEVELEX、会员/行会条件、每日购买次数HUMAN变量;公开白嫖服才不做限次。
物价同步:NPC菜单写死的单价要和MUL单价一致,改价时两处一起改;可用M2变量或数据库读价,但批量NPC手算更直观。
八、用M2商店批量代替脚本
若只要玩家自己填数量买固定药,商人NPC建[TRADE]或直接M2售卖物品加药,客户端点物品弹数量框,输入数量购买;这种方式不写输入脚本也能批量。缺点是难以做复杂活动价、等级限制、每日限次。脚本化好处是能按会员折扣、行会折扣、元宝/金币双通道、输入上限、活动倍率处理。
九、折扣与会员价
会员金创药8折示例,单价3500则实价2800:
[@InPutInteger1]
IF
EQUALN10
ACT
SAY
数量不能为0\\
GOTO@buy_hp
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_hp
IF
LARGEN12000
ACT
SAY
单次最多2000\\
GOTO@buy_hp
ELSEACT
IF
CHECK[会员标志命令]
ACT
MOVM00
MOVM0N1
MULM02800
GOTO@hp_checkbag
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM03500
GOTO@hp_checkbag
会员标志按本服用称号、变量、付费名单判断;CHECKTITLE、CHECKVARHUMANVIP、CHECKNAMELIST都可以。行会折扣把CHECK[会员]换成ISGUILDMATE或行会名单。
十、排错清单
点菜单不弹数字框:确认主菜单按钮写@@InPutInteger1而不是@InPutInteger1;确认本服支持该输入命令;BLUE/GOM部分版本脚本头部需要输入属性声明,按命令表加。
输入后无反应:看回传标签名是否和按钮数字一致,InPutInteger1对应[@InPutInteger1];N1变量被别的脚本改空,先在标签MOV清值再算。
输入0仍发药:缺少EQUALN10和SMALLN11;只写CHECKGOLD不拦0,0乘单价不扣钱但GIVEN1会发0或异常。
扣钱不发药:GIVE物品名和StdItems不一致,含空格、括号、全半角;超背包但先扣钱,顺序应查包再查钱。
发药不扣钱:TAKE金币M0写成TAKE金币3500固定值,或MUL没把N1写入M0;用SENDMSG输出M0、N1调试。
背包爆了丢药:CHECKBAGSIZE没用变量,写固定1;大数量必须CHECKBAGSIZEN1或分批。
元宝买扣了元宝没发药:GAMEGOLD-M0后GIVE失败,核对元宝是变量还是物品;物品元宝用CHECKITEM/TAKE/GIVE,不用GAMEGOLD。
Hero不识别InPutInteger:换本服输入数字命令,或用固定数量按钮+P0参数,或做NPC分档10/50/100/500避免自由输入。
重载后还旧逻辑:Merchant/npc_def文件编码非ANSI、文件名和注册名不一致、M2未重载;改完用M2重新加载对应NPC,严重重启M2。
按输入变量接数量、MUL算总价、CHECKBAGSIZE查空格、CHECKGOLD/CHECKGAMEGOLD查款、TAKE扣款、GIVE按N1发药这个顺序写,批量买药不会出白嫖和爆包;多药品复制标签改物品名与单价,元宝版本把CHECKGOLD换元宝命令即可。
一、NPC注册
商人型放Mir200\Envir\Market_Def,文件名如批量买药.txt;Merchant.txt加一行,字段按本服顺序写NPC名、地图号、X、Y、脚本名、范围、图标、是否交易。对话型放npc_def并在npcs.txt登记也可,但批量卖药用商人型更顺。文件保存ANSI,改完M2重载NPC或重启。
二、GOM/BLUE输入数量模板
[@main]
批量买药中心\\
超级金创药单价3500金币/@buy_hp\\
超级魔法药单价3500金币/@buy_mp\\
[@buy_hp]
输入要购买的数量\\
@@InPutInteger1
[@InPutInteger1]
IF
EQUALN10
ACT
SAY
数量不能为0,请重新输入\\
GOTO@buy_hp
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_hp
IF
LARGEN12000
ACT
SAY
单次最多输入2000\\
GOTO@buy_hp
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM03500
GOTO@hp_checkbag
[@hp_checkbag]
IF
CHECKBAGSIZEN1
ACT
GOTO@hp_checkgold
ELSEACT
SAY
背包空格不足,需要至少<N1>个空格\\
GOTO@buy_hp
[@hp_checkgold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE超级金创药N1
SENDMSG6批量购买超级金创药<N1>个,扣款<M0>金币
GOTO@main
ELSEACT
SAY
金币不足,需要<M0>金币\\
GOTO@buy_hp
@@InPutInteger1用于呼出数字输入框,N1接收输入值;InPutInteger后面数字决定写哪个N1,0到255按引擎支持范围填。EQUALN10拦零,SMALLN11拦负数和零,LARGEN12000拦超量。MULM03500把数量乘单价,M0作为总价;CHECKBAGSIZEN1检查背包是否有足够空格,避免发药爆包。CHECKGOLDM0检查金币足够,TAKE金币M0扣款,GIVE超级金创药N1按数量发药。
三、魔法药与其他药复制
[@buy_mp]
输入要购买的数量\\
@@InPutInteger2
[@InPutInteger2]
IF
EQUALN10
ACT
SAY
数量不能为0,请重新输入\\
GOTO@buy_mp
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_mp
IF
LARGEN12000
ACT
SAY
单次最多输入2000\\
GOTO@buy_mp
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM03500
GOTO@mp_checkbag
[@mp_checkbag]
IF
CHECKBAGSIZEN1
ACT
GOTO@mp_checkgold
ELSEACT
SAY
背包空格不足,需要至少<N1>个空格\\
GOTO@buy_mp
[@mp_checkgold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE超级魔法药N1
SENDMSG6批量购买超级魔法药<N1>个,扣款<M0>金币
GOTO@main
ELSEACT
SAY
金币不足,需要<M0>金币\\
GOTO@buy_mp
不同药换GIVE物品名和单价即可。若用普通金创药、强效金创药、太阳水,把超级金创药改成数据库StdItems实际Name,单价改MUL的第二个数。
四、元宝买药写法
元宝若用GAMEGOLD变量:
[@buy_hp_yb]
输入要购买的数量\\
@@InPutInteger3
[@InPutInteger3]
IF
EQUALN10
ACT
SAY
数量不能为0\\
GOTO@buy_hp_yb
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_hp_yb
IF
LARGEN1500
ACT
SAY
单次最多500\\
GOTO@buy_hp_yb
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM01
GOTO@hp_yb_bag
[@hp_yb_bag]
IF
CHECKBAGSIZEN1
ACT
GOTO@hp_yb_gold
ELSEACT
SAY
背包空格不足\\
GOTO@buy_hp_yb
[@hp_yb_gold]
IF
CHECKGAMEGOLDM0
ACT
GAMEGOLD-M0
GIVE超级金创药N1
SENDMSG6元宝购买金创药<N1>个,扣<M0>元宝
GOTO@main
ELSEACT
SAY
元宝不足,需要<M0>\\
GOTO@buy_hp_yb
若元宝是背包物品“元宝”,把CHECKGAMEGOLD/GAMEGOLD-M0改成CHECKITEM元宝M0、TAKE元宝M0;绑定元宝用绑定元宝物品名和对应TAKE命令。
五、Hero输入数量写法
Hero老版可用参数变量或自定义输入命令。若本服支持@@InPutInteger,直接套上面GOM模板;若用参数P0接收,主菜单不让手输,改固定按钮传数量:
[@buy_hp_10]
IF
ACT
MOVP010
GOTO@hero_hp_cal
[@hero_hp_cal]
IF
ACT
MOVM00
MOVM0P0
MULM03500
GOTO@hero_hp_bag
[@hero_hp_bag]
IF
CHECKBAGSIZEP0
ACT
GOTO@hero_hp_gold
ELSEACT
SAY
背包空格不足\\
GOTO@main
[@hero_hp_gold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE超级金创药P0
SENDMSG6购买金创药<P0>个,扣<M0>金币
GOTO@main
ELSEACT
SAY
金币不足\\
GOTO@main
要自由输入就把主菜单按钮改成Hero输入数字命令,回传N变量后再走MUL/CHECKBAGSIZE/CHECKGOLD/GIVE/TAKE。Hero变量名若不支持M0,用D0/A0/N0按本服数字变量替换;CHECKBAGSIZE不支持变量时用固定空格判断或分档。
六、多档药品菜单
[@main]
批量买药\\
1.超级金创药3500金/个/@buy_hp\\
2.超级魔法药3500金/个/@buy_mp\\
3.太阳水5000金/个/@buy_sun\\
4.强效金创药2000金/个/@buy_bighp\\
5.强效魔法药2000金/个/@buy_bigmp\\
[@buy_sun]
输入数量\\
@@InPutInteger4
[@InPutInteger4]
IF
EQUALN10
ACT
SAY
数量不能为0\\
GOTO@buy_sun
IF
SMALLN11
ACT
SAY
数量错误\\
GOTO@buy_sun
IF
LARGEN11000
ACT
SAY
单次最多1000\\
GOTO@buy_sun
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM05000
GOTO@sun_bag
[@sun_bag]
IF
CHECKBAGSIZEN1
ACT
GOTO@sun_gold
ELSEACT
SAY
背包空格不足\\
GOTO@buy_sun
[@sun_gold]
IF
CHECKGOLDM0
ACT
TAKE金币M0
GIVE太阳水N1
SENDMSG6购买太阳水<N1>个,扣<M0>金币
GOTO@main
ELSEACT
SAY
金币不足\\
GOTO@buy_sun
强效药把物品名和MUL单价改掉即可,逻辑完全复用。
七、防刷与边界处理
零和负数:EQUALN10、SMALLN11双重拦;部分老引擎输入空值可能返回0,只拦0不够,必须拦小于1。
超大数量:LARGEN1上限拦截,金创类可设2000,太阳水设1000,按背包和金币承受力改;不设计上限会被一次输入几十万刷物品。
背包空格:CHECKBAGSIZEN1按数量查;老引擎不支持变量就CHECKBAGSIZE固定值,或分批购买。空格不足先提示再回菜单,不要强行GIVE。
货币校验顺序:先CHECKBAGSIZE再CHECKGOLD/CHECKGAMEGOLD,先扣钱再发药会出问题;标准顺序算价、查包、查钱、扣钱、发药。若先发药后扣钱,并发或脚本异常会白嫖。
重复点击:BLUE/GOM输入标签加DelayGoto1~标签名,防止网络延迟连点重复购买。示例:
[@InPutInteger1]
IF
ACT
DelayGoto1~InPutInteger1
...条件...
输入非法字符:数字输入框一般只收数字;若用字符串输入命令,加格式判断,非数字直接回主菜单,不进入MUL,避免运算错误。
小号刷药:加等级限制CHECKLEVELEX、会员/行会条件、每日购买次数HUMAN变量;公开白嫖服才不做限次。
物价同步:NPC菜单写死的单价要和MUL单价一致,改价时两处一起改;可用M2变量或数据库读价,但批量NPC手算更直观。
八、用M2商店批量代替脚本
若只要玩家自己填数量买固定药,商人NPC建[TRADE]或直接M2售卖物品加药,客户端点物品弹数量框,输入数量购买;这种方式不写输入脚本也能批量。缺点是难以做复杂活动价、等级限制、每日限次。脚本化好处是能按会员折扣、行会折扣、元宝/金币双通道、输入上限、活动倍率处理。
九、折扣与会员价
会员金创药8折示例,单价3500则实价2800:
[@InPutInteger1]
IF
EQUALN10
ACT
SAY
数量不能为0\\
GOTO@buy_hp
IF
SMALLN11
ACT
SAY
数量必须大于0\\
GOTO@buy_hp
IF
LARGEN12000
ACT
SAY
单次最多2000\\
GOTO@buy_hp
ELSEACT
IF
CHECK[会员标志命令]
ACT
MOVM00
MOVM0N1
MULM02800
GOTO@hp_checkbag
ELSEACT
IF
ACT
MOVM00
MOVM0N1
MULM03500
GOTO@hp_checkbag
会员标志按本服用称号、变量、付费名单判断;CHECKTITLE、CHECKVARHUMANVIP、CHECKNAMELIST都可以。行会折扣把CHECK[会员]换成ISGUILDMATE或行会名单。
十、排错清单
点菜单不弹数字框:确认主菜单按钮写@@InPutInteger1而不是@InPutInteger1;确认本服支持该输入命令;BLUE/GOM部分版本脚本头部需要输入属性声明,按命令表加。
输入后无反应:看回传标签名是否和按钮数字一致,InPutInteger1对应[@InPutInteger1];N1变量被别的脚本改空,先在标签MOV清值再算。
输入0仍发药:缺少EQUALN10和SMALLN11;只写CHECKGOLD不拦0,0乘单价不扣钱但GIVEN1会发0或异常。
扣钱不发药:GIVE物品名和StdItems不一致,含空格、括号、全半角;超背包但先扣钱,顺序应查包再查钱。
发药不扣钱:TAKE金币M0写成TAKE金币3500固定值,或MUL没把N1写入M0;用SENDMSG输出M0、N1调试。
背包爆了丢药:CHECKBAGSIZE没用变量,写固定1;大数量必须CHECKBAGSIZEN1或分批。
元宝买扣了元宝没发药:GAMEGOLD-M0后GIVE失败,核对元宝是变量还是物品;物品元宝用CHECKITEM/TAKE/GIVE,不用GAMEGOLD。
Hero不识别InPutInteger:换本服输入数字命令,或用固定数量按钮+P0参数,或做NPC分档10/50/100/500避免自由输入。
重载后还旧逻辑:Merchant/npc_def文件编码非ANSI、文件名和注册名不一致、M2未重载;改完用M2重新加载对应NPC,严重重启M2。
按输入变量接数量、MUL算总价、CHECKBAGSIZE查空格、CHECKGOLD/CHECKGAMEGOLD查款、TAKE扣款、GIVE按N1发药这个顺序写,批量买药不会出白嫖和爆包;多药品复制标签改物品名与单价,元宝版本把CHECKGOLD换元宝命令即可。

