传奇NPC让玩家输入任意数量批量购买金创药魔法药金币元宝扣款发药防刷完整脚本

来源: 作者: 点击:
批量买药核心用输入数字命令拿数量到变量,再乘单价算总价,先查背包空格和货币,满足后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

EQUAL N1 0
ACT

SAY

数量不能为0,请重新输入\ \
GOTO @buy_hp
IF

SMALL N1 1
ACT

SAY

数量必须大于0\ \
GOTO @buy_hp
IF

LARGE N1 2000
ACT

SAY

单次最多输入2000\ \
GOTO @buy_hp
ELSEACT

IF

ACT

MOV M0 0
MOV M0 N1
MUL M0 3500
GOTO @hp_checkbag

[@hp_checkbag]
IF

CHECKBAGSIZE N1
ACT

GOTO @hp_checkgold
ELSEACT

SAY

背包空格不足,需要至少<N1>个空格\ \
GOTO @buy_hp

[@hp_checkgold]
IF

CHECKGOLD M0
ACT

TAKE 金币 M0
GIVE 超级金创药 N1
SENDMSG 6 批量购买超级金创药<N1>个,扣款<M0>金币
GOTO @main
ELSEACT

SAY

金币不足,需要<M0>金币\ \
GOTO @buy_hp

@@InPutInteger1用于呼出数字输入框,N1接收输入值;InPutInteger后面数字决定写哪个N1,0到255按引擎支持范围填。 EQUAL N1 0拦零,SMALL N1 1拦负数和零,LARGE N1 2000拦超量。MUL M0 3500把数量乘单价,M0作为总价;CHECKBAGSIZE N1检查背包是否有足够空格,避免发药爆包。 CHECKGOLD M0检查金币足够,TAKE 金币 M0扣款,GIVE 超级金创药 N1按数量发药。

三、魔法药与其他药复制

[@buy_mp]
输入要购买的数量\ \
@@InPutInteger2

[@InPutInteger2]
IF

EQUAL N1 0
ACT

SAY

数量不能为0,请重新输入\ \
GOTO @buy_mp
IF

SMALL N1 1
ACT

SAY

数量必须大于0\ \
GOTO @buy_mp
IF

LARGE N1 2000
ACT

SAY

单次最多输入2000\ \
GOTO @buy_mp
ELSEACT

IF

ACT

MOV M0 0
MOV M0 N1
MUL M0 3500
GOTO @mp_checkbag

[@mp_checkbag]
IF

CHECKBAGSIZE N1
ACT

GOTO @mp_checkgold
ELSEACT

SAY

背包空格不足,需要至少<N1>个空格\ \
GOTO @buy_mp

[@mp_checkgold]
IF

CHECKGOLD M0
ACT

TAKE 金币 M0
GIVE 超级魔法药 N1
SENDMSG 6 批量购买超级魔法药<N1>个,扣款<M0>金币
GOTO @main
ELSEACT

SAY

金币不足,需要<M0>金币\ \
GOTO @buy_mp

不同药换GIVE物品名和单价即可。若用普通金创药、强效金创药、太阳水,把超级金创药改成数据库StdItems实际Name,单价改MUL的第二个数。

四、元宝买药写法

元宝若用GAMEGOLD变量:

[@buy_hp_yb]
输入要购买的数量\ \
@@InPutInteger3

[@InPutInteger3]
IF

EQUAL N1 0
ACT

SAY

数量不能为0\ \
GOTO @buy_hp_yb
IF

SMALL N1 1
ACT

SAY

数量必须大于0\ \
GOTO @buy_hp_yb
IF

LARGE N1 500
ACT

SAY

单次最多500\ \
GOTO @buy_hp_yb
ELSEACT

IF

ACT

MOV M0 0
MOV M0 N1
MUL M0 1
GOTO @hp_yb_bag

[@hp_yb_bag]
IF

CHECKBAGSIZE N1
ACT

GOTO @hp_yb_gold
ELSEACT

SAY

背包空格不足\ \
GOTO @buy_hp_yb

[@hp_yb_gold]
IF

CHECKGAMEGOLD M0
ACT

GAMEGOLD -M0
GIVE 超级金创药 N1
SENDMSG 6 元宝购买金创药<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

MOV P0 10
GOTO @hero_hp_cal

[@hero_hp_cal]
IF

ACT

MOV M0 0
MOV M0 P0
MUL M0 3500
GOTO @hero_hp_bag

[@hero_hp_bag]
IF

CHECKBAGSIZE P0
ACT

GOTO @hero_hp_gold
ELSEACT

SAY

背包空格不足\ \
GOTO @main

[@hero_hp_gold]
IF

CHECKGOLD M0
ACT

TAKE 金币 M0
GIVE 超级金创药 P0
SENDMSG 6 购买金创药<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

EQUAL N1 0
ACT

SAY

数量不能为0\ \
GOTO @buy_sun
IF

SMALL N1 1
ACT

SAY

数量错误\ \
GOTO @buy_sun
IF

LARGE N1 1000
ACT

SAY

单次最多1000\ \
GOTO @buy_sun
ELSEACT

IF

ACT

MOV M0 0
MOV M0 N1
MUL M0 5000
GOTO @sun_bag

[@sun_bag]
IF

CHECKBAGSIZE N1
ACT

GOTO @sun_gold
ELSEACT

SAY

背包空格不足\ \
GOTO @buy_sun

[@sun_gold]
IF

CHECKGOLD M0
ACT

TAKE 金币 M0
GIVE 太阳水 N1
SENDMSG 6 购买太阳水<N1>个,扣<M0>金币
GOTO @main
ELSEACT

SAY

金币不足\ \
GOTO @buy_sun

强效药把物品名和MUL单价改掉即可,逻辑完全复用。

七、防刷与边界处理

零和负数:EQUAL N1 0、SMALL N1 1双重拦;部分老引擎输入空值可能返回0,只拦0不够,必须拦小于1。
超大数量:LARGE N1 上限拦截,金创类可设2000,太阳水设1000,按背包和金币承受力改;不设计上限会被一次输入几十万刷物品。
背包空格:CHECKBAGSIZE N1按数量查;老引擎不支持变量就CHECKBAGSIZE 固定值,或分批购买。空格不足先提示再回菜单,不要强行GIVE。
货币校验顺序:先CHECKBAGSIZE再CHECKGOLD/CHECKGAMEGOLD,先扣钱再发药会出问题;标准顺序算价、查包、查钱、扣钱、发药。若先发药后扣钱,并发或脚本异常会白嫖。
重复点击:BLUE/GOM输入标签加DelayGoto 1 ~标签名,防止网络延迟连点重复购买。 示例:

[@InPutInteger1]
IF

ACT

DelayGoto 1 ~InPutInteger1
...条件...

输入非法字符:数字输入框一般只收数字;若用字符串输入命令,加格式判断,非数字直接回主菜单,不进入MUL,避免运算错误。
小号刷药:加等级限制CHECKLEVELEX、会员/行会条件、每日购买次数HUMAN变量;公开白嫖服才不做限次。
物价同步:NPC菜单写死的单价要和MUL单价一致,改价时两处一起改;可用M2变量或数据库读价,但批量NPC手算更直观。

八、用M2商店批量代替脚本

若只要玩家自己填数量买固定药,商人NPC建[TRADE]或直接M2售卖物品加药,客户端点物品弹数量框,输入数量购买;这种方式不写输入脚本也能批量。缺点是难以做复杂活动价、等级限制、每日限次。脚本化好处是能按会员折扣、行会折扣、元宝/金币双通道、输入上限、活动倍率处理。

九、折扣与会员价

会员金创药8折示例,单价3500则实价2800:

[@InPutInteger1]
IF

EQUAL N1 0
ACT

SAY

数量不能为0\ \
GOTO @buy_hp
IF

SMALL N1 1
ACT

SAY

数量必须大于0\ \
GOTO @buy_hp
IF

LARGE N1 2000
ACT

SAY

单次最多2000\ \
GOTO @buy_hp
ELSEACT

IF

CHECK[会员标志命令]
ACT

MOV M0 0
MOV M0 N1
MUL M0 2800
GOTO @hp_checkbag
ELSEACT

IF

ACT

MOV M0 0
MOV M0 N1
MUL M0 3500
GOTO @hp_checkbag

会员标志按本服用称号、变量、付费名单判断;CHECKTITLE、CHECKVAR HUMAN VIP、CHECKNAMELIST都可以。行会折扣把CHECK[会员]换成ISGUILDMATE或行会名单。

十、排错清单

点菜单不弹数字框:确认主菜单按钮写@@InPutInteger1而不是@InPutInteger1;确认本服支持该输入命令;BLUE/GOM部分版本脚本头部需要输入属性声明,按命令表加。
输入后无反应:看回传标签名是否和按钮数字一致,InPutInteger1对应[@InPutInteger1];N1变量被别的脚本改空,先在标签MOV清值再算。
输入0仍发药:缺少EQUAL N1 0和SMALL N1 1;只写CHECKGOLD不拦0,0乘单价不扣钱但GIVE N1会发0或异常。
扣钱不发药:GIVE物品名和StdItems不一致,含空格、括号、全半角;超背包但先扣钱,顺序应查包再查钱。
发药不扣钱:TAKE 金币 M0写成TAKE 金币 3500固定值,或MUL没把N1写入M0;用SENDMSG输出M0、N1调试。
背包爆了丢药:CHECKBAGSIZE没用变量,写固定1;大数量必须CHECKBAGSIZE N1或分批。
元宝买扣了元宝没发药: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换元宝命令即可。