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

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

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

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

[@TimerRefreshFame]
#ACT
;清空全局排行数组,避免旧数据残留
CLEARGLOBALARRAY FameName
CLEARGLOBALARRAY FamePower
MOV S0 0
MOV S1 0
;遍历全服在线玩家,也可改成读取全部人物数据
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
SETGLOBALARRAY FameName <\)$STR(S1)> <$STR(S3)>
SETGLOBALARRAY FamePower <$STR(S1)> <$\(STR(S6)>
INC S1 1
#ACT
INC S0 1
#ENDWHILE
SENDMSG 0 #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
GETGLOBALARRAYCOUNT FameName <$\(STR(S0)>
MESSAGE =========名人堂强者榜=========
#IF
<\)$STR(S0)> = 0
#ACT
MESSAGE 当前暂无上榜玩家
BREAK
#ELSEACT
MOV S1 0
#WHILE
<$STR(S1)> < <$\(STR(S0)>
#IF
<\)$\(STR(S1)> < 10
#ACT
GETGLOBALARRAY FameName <\)$STR(S1)> <$STR(S2)>
GETGLOBALARRAY FamePower <$STR(S1)> <$STR(S3)>
MESSAGE \(STR(S3)>
MESSAGE 第<\)<$STR(S1+1)>名:<$STR(S2)> \(STR(S2)> 综合战力:<\)<$STR(S3)>
#ACT
INC S1 1
#ENDWHILE
MESSAGE =============END=============
BREAK

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

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

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

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

冒泡排序示例追加到[@TimerRefreshFame]采集代码之后
#ACT
GETGLOBALARRAYCOUNT FameName <$\(STR(S10)>
MOV S2 0
#WHILE
<\)$STR(S2)> < <$\(STR(S10)>
#ACT
MOV S3 0
#WHILE
<\)$STR(S3)> < <$STR(S10)> - <$STR(S2)> -1
#ACT
GETGLOBALARRAY FamePower <$STR(S3)> <$STR(S20)>
GETGLOBALARRAY FamePower <$STR(S3)+1> <$STR(S21)>
#IF
<$STR(S20)> < <$STR(S21)>
#ACT
GETGLOBALARRAY FameName <$STR(S3)> <$STR(TMPNAME)>
GETGLOBALARRAY FamePower <$STR(S3)> <$STR(TMPPOWER)>
SETGLOBALARRAY FameName <$STR(S3)> <$STR(S3)+1>
SETGLOBALARRAY FamePower <$STR(S3)> <$STR(S3)+1>
SETGLOBALARRAY FameName <$STR(S3)+1> <$STR(TMPNAME)>
SETGLOBALARRAY FamePower <$STR(S3)+1> <$STR(TMPPOWER)>
#ACT
INC S3 1
#ENDWHILE
#ACT
INC S2 1
#ENDWHILE

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

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

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

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

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