传奇HERO引擎名人堂完整脚本实现方案玩家战力排行记录查询与上榜领奖全套代码

来源: 作者: 点击:
名人堂脚本用于记录玩家角色信息,按指定维度排序展示排行榜,支持战力、等级、积分等不同排行类型,玩家可在NPC查看榜单,上榜玩家可领取档位奖励,脚本仅适配HERO引擎,使用人物持久变量存储数据,全局变量记录排行信息,修改前备份Mir200脚本文件,防止语法错误造成M2加载异常。

核心实现思路分为数据采集、排行刷新、NPC展示、上榜奖励四个模块。数据采集在QFunction-0.txt对应事件内,玩家等级提升、战力变动时更新人物记录;排行刷新使用全局定时器,定时遍历全服玩家,筛邀合条件角色,存入全局数组用于名人堂展示;NPC读取数组内容,分页展示排行;增加领取奖励分支,每个角色每轮仅可领取一次上榜奖励。

[@Startup]
#ACT
;设置每日凌晨0点刷新名人堂排行
SETTIMERRefreshFame000

[@TimerRefreshFame]
#ACT
;清空全局排行数组,避免旧数据残留
CLEARGLOBALARRAYFameName
CLEARGLOBALARRAYFamePower
MOVS00
MOVS10
;遍历全服在线玩家,也可改成读取全部人物数据
GETHUMANCOUNT<$\(STR(S2)>
#WHILE
<\)$STR(S0)><<$\(STR(S2)>
#ACT
GETHUMANNAME<\)$STR(S0)><$STR(S3)>
GETHUMANATTRIB<$STR(S3)>MAXHP<$STR(S4)>
GETHUMANATTRIB<$STR(S3)>DCMAX<$STR(S5)>
;\(STR(S5)>
;计算综合战力,可自行调整公式
CALC<\)
CALC<$STR(S4)>/100+<$STR(S5)><$STR(S6)>
;筛选战力大于等于1000的角色才进入名人堂
#IF
<$\(STR(S6)>>=1000
#ACT
SETGLOBALARRAYFameName<\)$STR(S1)><$STR(S3)>
SETGLOBALARRAYFamePower<$STR(S1)><$\(STR(S6)>
INCS11
#ACT
INCS01
#ENDWHILE
SENDMSG0#G名人堂数据已刷新,当前上榜总人数:<\)$STR(S1)>

名人堂NPC主脚本
[@main]
#ACT
MESSAGE【名人堂】汇聚本区顶尖强者
MESSAGE<$COLOR=250>1.\(COLOR=250>1.查看名人堂榜单</\)</$COLOR>
MESSAGE<$COLOR=250>2.\(COLOR=250>2.领取上榜奖励</\)</$COLOR>
MESSAGE<$COLOR=250>3.\(COLOR=250>3.查询自身排名</\)</$COLOR>
#SACT
#CHOOSE
1@ShowFameList
2@GetFameAward
3@CheckMyRank

[@ShowFameList]
#ACT
GETGLOBALARRAYCOUNTFameName<$\(STR(S0)>
MESSAGE=========名人堂强者榜=========
#IF
<\)$STR(S0)>=0
#ACT
MESSAGE当前暂无上榜玩家
BREAK
#ELSEACT
MOVS10
#WHILE
<$STR(S1)><<$\(STR(S0)>
#IF
<\)$\(STR(S1)><10
#ACT
GETGLOBALARRAYFameName<\)$STR(S1)><$STR(S2)>
GETGLOBALARRAYFamePower<$STR(S1)><$STR(S3)>
MESSAGE\(STR(S3)>
MESSAGE第<\)<$STR(S1+1)>名:<$STR(S2)>\(STR(S2)>综合战力:<\)<$STR(S3)>
#ACT
INCS11
#ENDWHILE
MESSAGE=============END=============
BREAK

[@CheckMyRank]
#ACT
GETVARHUMANMyFameRank<$\(STR(S0)>
#IF
<\)$STR(S0)>>0
#ACT
SENDMSG6你的名人堂排名:\(STR(S3)>
MESSAGE第<\)<$STR(S0)>名
#ELSEACT
SENDMSG6暂未进入名人堂榜单
BREAK

[@GetFameAward]
#ACT
GETVARHUMANMyFameRank<$STR(S0)>
GETVARHUMANGetFameAwardFlag<$STR(S1)>
#IF
<$STR(S0)>>=1
<$STR(S1)>=0
#ACT
SETVARHUMANGetFameAwardFlag1
#IF
<$STR(S0)>=1
#ACT
ADDITEM屠龙1
ADDITEM祝福油10
SENDMSG6恭喜名人堂\(STR(S3)>
MESSAGE第<\)一名,领取屠龙*1,祝福油*10
#ELSEACT
#IF
<$STR(S0)>>=2
<$\(STR(S0)><=5
#ACT
ADDITEM赤月首饰礼盒1
ADDITEM金币5000000
SENDMSG6恭喜进入名人堂前5名,领取赤月礼盒与金币
#ELSEACT
#IF
<\)$STR(S0)>>=6
<$STR(S0)><=10
#ACT
ADDITEM疗伤药包20
SENDMSG6恭喜上榜,领取疗伤药包*20
#ELSEACT
SENDMSG6未达到奖励档位
BREAK
#ELSEACT
SENDMSG6本轮奖励已领取,不可重复领取
BREAK

QFunction-0.txt配套战力更新片段,角色属性变动时更新战力
[@OnStatChange]
#ACT
GETHUMANATTRIB<$USERNAME>MAXHP<$STR(S0)>
GETHUMANATTRIB<$USERNAME>DCMAX<$STR(S1)>
CALC<$STR(S0)>/100+<$STR(S1)><$STR(S2)>
SETVARHUMANSelfPower<$STR(S2)>

排行排序处理,HERO引擎原生数组不自带排序功能,上面基础脚本只做采集,想要按战力从高到低排序,需要额外写冒泡排序循环。在[@TimerRefreshFame]遍历采集完成后,增加冒泡排序代码,对比FamePower数组内数值,交换数组下标对应的名字和战力,实现降序排列。未做排序的版本,榜单仅按读取顺序展示,不是战力由高到低。

冒泡排序示例追加到[@TimerRefreshFame]采集代码之后
#ACT
GETGLOBALARRAYCOUNTFameName<$\(STR(S10)>
MOVS20
#WHILE
<\)$STR(S2)><<$\(STR(S10)>
#ACT
MOVS30
#WHILE
<\)$STR(S3)><<$STR(S10)>-<$STR(S2)>-1
#ACT
GETGLOBALARRAYFamePower<$STR(S3)><$STR(S20)>
GETGLOBALARRAYFamePower<$STR(S3)+1><$STR(S21)>
#IF
<$STR(S20)><<$STR(S21)>
#ACT
GETGLOBALARRAYFameName<$STR(S3)><$STR(TMPNAME)>
GETGLOBALARRAYFamePower<$STR(S3)><$STR(TMPPOWER)>
SETGLOBALARRAYFameName<$STR(S3)><$STR(S3)+1>
SETGLOBALARRAYFamePower<$STR(S3)><$STR(S3)+1>
SETGLOBALARRAYFameName<$STR(S3)+1><$STR(TMPNAME)>
SETGLOBALARRAYFamePower<$STR(S3)+1><$STR(TMPPOWER)>
#ACT
INCS31
#ENDWHILE
#ACT
INCS21
#ENDWHILE

常见故障排查,榜单刷新后看不到玩家,检查GETHUMANCOUNT读取在线玩家逻辑,该写法只抓取在线角色,离线玩家不会被收录。需要包含离线角色,改用人物文件遍历方式,遍历复杂度更高,服务器角色量大时会增加CPU负载。排行顺序错乱,确认冒泡排序循环边界,数组下标不要越界。玩家排名不更新,确认定时器正常触发,M2全局计时器功能开启。奖励重复领取,检查领取标记变量GetFameAwardFlag,领取后设置标记,刷新榜单不会自动清除标记,需要在每次刷新榜单时,编写脚本批量重置该标记变量开启新一轮活动。

性能优化,服务器角色数量较多时,不要设置高频刷新,每日一次刷新足够。排行榜只保留前10或者前20名,采集完成后截断数组,减少NPC读取数组的开销。调试阶段添加SENDMSG打印角色名称与战力,测试完成删除调试输出,减少M2日志体积。重载M2脚本即可生效,无需重启整套服务程序。

扩展功能,可增加名人堂专属称号,上榜自动赋予称号,榜单刷新落榜自动移除称号。可增加名人堂专属地图,上榜玩家拥有进入权限。可切换排行维度,改为等级排行、积分排行、击杀数量排行,修改采集部分读取的属性变量即可。如需保存历史每轮名人堂记录,可将排行数据写入文本文件,通过脚本文件读写指令保存。

注意事项,HERO引擎全局数组在服务器重启后全部清空,重启后会等待定时器触发重新采集榜单。人物SelfPower变量存储个人战力,用于玩家查询自身战力。排行奖励档位可以自由增减,修改判断条件与发放道具。脚本只对主人物生效,英雄数据如需排行,需要单独编写英雄属性读取逻辑。

部署流程,新建NPC文本粘贴主对话脚本,QFunction-0.txt追加[@Startup]、[@TimerRefreshFame]、[@OnStatChange]和冒泡排序代码,保存文件,重载M2脚本。进入游戏提升角色属性,等待定时刷新,测试榜单展示、排名查询、奖励领取。多轮测试核对上榜、落榜、重复领取奖励场景,确认逻辑无误。
[顶部]