新年活动中丢爆竹随机得装备的脚本逻辑,核心是三层结构:检测玩家丢出爆竹的动作并消耗物品,生成随机数并根据数值区间匹配对应的装备奖励,最后通过Give命令将装备发放到玩家包裹。整个流程涉及触发标签、随机数命令、条件分支和物品发放四个环节。
## 触发标签与爆竹消耗检测
脚本入口写在QFunction-0.txt中的物品触发段落。当玩家使用爆竹类物品时,引擎会调用物品使用触发,标签格式为[@StdModeFuncX],其中X对应物品数据库StdItems.DB中爆竹物品的Shape或AniCount字段值。假设爆竹物品的AniCount设为200,则触发标签写为[@StdModeFunc200]。
[@StdModeFunc200]
#IF
CHECKITEM 爆竹 1
#ACT
take 爆竹 1
Goto @新年抽奖
break
这段脚本先检测玩家包裹中是否有爆竹,有则扣除一个,然后跳转到抽奖逻辑段落。take命令的第二个参数1表示消耗数量。如果希望一次丢出多个爆竹连续抽奖,将take的数量改为对应值,并在抽奖段落末尾加一个循环跳转回本标签。
部分引擎使用@UseItemX格式作为物品触发标签,X为物品ID。编写前需确认目标引擎采用哪种标签命名规则。GOM和GEE均支持@StdModeFuncX格式,HERO引擎在部分版本中使用@UseItemX。
## 随机数生成与区间匹配
抽奖段落使用Random命令生成随机数。Random的格式为Random 数值,生成的随机值范围为0到该数值减1。设置Random 1000则生成0到999之间的随机整数,配合变量M0接收结果。
[@新年抽奖]
#ACT
Random 1000
Mov M0 <$RANDOM>
Goto @奖池匹配
break
部分引擎中Random命令执行后随机值自动存入<$RANDOM>变量,无需Mov赋值。GOM引擎的写法是直接使用<$RANDOM>获取上一次Random命令的结果。如果引擎不支持该变量,用Mov M0 <$STR(RANDOM)>的格式手动接收。
奖池匹配段落通过一系列条件判断确定M0落在哪个区间,从而决定发放什么装备。区间划分决定了每件装备的中奖概率。假设总随机范围为0到999,共1000个数值单位,将其中50个数值单位分配给顶级装备,则顶级装备的中奖概率为50除以1000等于5%。
[@奖池匹配]
#IF
SMALL M0 5
#ACT
Give 屠龙 1
SendMsg 6 恭喜你获得屠龙
Goto @抽奖结束
break
#IF
SMALL M0 20
#ACT
Give 嗜魂法杖 1
SendMsg 6 恭喜你获得嗜魂法杖
Goto @抽奖结束
break
#IF
SMALL M0 60
#ACT
Give 裁决之杖 1
SendMsg 6 恭喜你获得裁决之杖
Goto @抽奖结束
break
上述三段判断的含义是:M0小于5时发放屠龙,概率为0.5%;M0大于等于5且小于20时发放嗜魂法杖,概率为1.5%;M0大于等于20且小于60时发放裁决之杖,概率为4%。条件判断按顺序执行,第一个满足的条件被触发后通过break跳出,不再继续判断后续条件。这意味着区间必须从小到大排列,否则后面的条件永远无法被触发。
## 奖池配置与概率权重设计
装备池的配置决定了活动的整体体验。低概率区间放置顶级装备,中概率区间放置中等装备,高概率区间放置普通装备或消耗品。以下是一个完整的新年爆竹奖池配置范例,总随机范围设置为0到9999,共10000个数值单位,精度提高到万分之一。
M0区间0到9,概率0.1%,发放开天、镇天、玄天三件中的随机一件。M0区间10到49,概率0.4%,发放屠龙、嗜魂法杖、霸者之刃中的随机一件。M0区间50到199,概率1.5%,发放裁决之杖、龙纹剑、骨玉权杖中的随机一件。M0区间200到699,概率5%,发放赤月级装备。M0区间700到1999,概率13%,发放祖玛级装备。M0区间2000到4999,概率30%,发放沃玛级装备。M0区间5000到9999,概率50%,发放金币、祝福油、金创药等消耗品。
同一区间内发放多件装备时,使用GetRandomName命令从文本列表中随机抽取。在服务端Envir目录下新建一个文本文件,每行写一件装备名称,脚本中通过GetRandomName命令读取该文件并随机返回一行内容。
#ACT
GetRandomName ..\Envir\新年奖池_顶级.txt S1
Give <$STR(S1)> 1
SendMsg 6 恭喜你获得<$STR(S1)>
break
GetRandomName的第一个参数为文件路径,第二个参数为接收结果的变量。文件编码必须为ANSI,用UTF8保存会导致读取到的装备名称为乱码,Give命令无法识别。
## 全服公告与稀有奖励处理
顶级装备中奖后需要触发全服公告,让所有在线玩家看到中奖信息。公告命令使用SendCenterMsg或SendMsg的全局模式。
#ACT
SendCenterMsg 255 0 恭喜玩家<$USERNAME>在新年活动中获得<$STR(S1)> 1 10
Give <$STR(S1)> 1
break
SendCenterMsg的第二个参数为文字颜色,0表示默认。第三个参数为公告内容,<$USERNAME>自动替换为当前角色名。第四个参数1表示公告类型,第五个参数10表示公告持续显示10秒。部分引擎使用SendTopMsg或SysMsg作为全服公告命令,编写前确认引擎版本。
稀有装备发放时如果需要记录中奖日志,在Give命令后追加写入日志文件的命令。GOM引擎支持WriteLog命令,格式为WriteLog ..\Log\新年活动.txt 玩家<$USERNAME>获得<$STR(S1)>。日志文件按日期自动分割,方便活动结束后统计中奖名单。
## 防刷限制与冷却时间设置
爆竹抽奖脚本必须加入防刷机制,否则玩家通过批量使用爆竹可以在短时间内触发大量抽奖。最基础的防刷手段是设置冷却时间,通过变量记录上次抽奖的时间戳,两次抽奖之间强制间隔。
[@新年抽奖]
#IF
LARGE M10 <$GETTIME>
#ACT
SendMsg 6 操作太快,请稍后再试
break
#IF
CHECKITEM 爆竹 1
#ACT
Mov M10 <$GETTIME>
INC M10 1
take 爆竹 1
Random 10000
Mov M0 <$RANDOM>
Goto @奖池匹配
break
M10变量存储的是上次抽奖时间加1秒后的时间戳。LARGE M10 <$GETTIME>判断当前时间是否小于M10,小于则说明距离上次抽奖不足1秒,拒绝本次操作。将INC M10 1中的数字改为3则冷却时间为3秒。
对于单次使用大量爆竹的情况,需要在触发标签中限制单次消耗数量。物品数据库中将爆竹的Shape字段设置为1,表示该物品每次只能使用一个。如果Shape为0,玩家可以批量使用,脚本中的take命令扣除数量需要与实际使用数量匹配。
引擎层面还需要在M2的物品规则中开启使用间隔限制。进入M2选项菜单的物品控制面板,找到使用间隔选项,设置爆竹类物品的最小使用间隔为1000毫秒。该限制在脚本冷却之外提供第二层防护,即使脚本被绕过,引擎层面仍然会拦截高频使用请求。
## 引擎差异与常见报错处理
Random命令在GOM引擎中生成的是0到参数值减1的闭区间随机数。GEE引擎的Random命令范围相同,但随机种子在每次服务端重启后重置,如果发现每次重启后抽奖结果分布异常,在脚本初始化段落中加入Randomize命令重置随机种子。
GetRandomName命令在部分引擎中不支持中文路径,奖池文本文件必须放在Envir根目录下,路径参数写为..\Envir\奖池.txt而非..\Envir\活动\奖池.txt。如果读取文件后Give命令提示物品不存在,检查文本文件中是否有空格或制表符,每行装备名称前后不允许有多余字符。
SendCenterMsg命令在HERO引擎中参数顺序不同,格式为SendCenterMsg 公告内容 颜色 类型 持续时间。移植脚本时需要按目标引擎的参数顺序重新调整。GOM引擎的公告命令参数顺序为颜色在前、内容在后,与HERO相反。
抽奖脚本执行后如果玩家没有收到任何物品,排查顺序为:确认M0变量是否被正确赋值,在奖池匹配段落前插入SendMsg 6 M0当前值为<$STR(M0)>进行调试输出,观察随机值是否落在预设区间内。如果M0始终为0,说明Random命令未生效或<$RANDOM>变量在该引擎中不可用,改用Mov M0 <$STR(RANDOM)>格式手动接收。

