BOSS 战的伤害统计面板是团队战斗的数据中枢:每个队员的输出、治疗、承伤实时展示,指挥根据数据调整战术。伤害的统计曾经逐条广播,百人团战的统计包让带宽翻倍,聚合的模式让面板的数据密度与带宽的消耗同时优化。
---伤害统计的实时聚合
local dmgAgg = {}
function CombatStats.onDamage(actor, target, dmg)
local key = actor:GetUserId() .. ":" .. target:GetUserId()
dmgAgg[key] = (dmgAgg[key] or 0) + dmg
end
function CombatStats.flush()
local now = os.time()
if now - (lastFlush or 0) < 3 then return end
lastFlush = now
for key, total in pairs(dmgAgg) do
local from, to = key:match("^(.+):(.+)$")
sendmsg(getplayerbyname(from), 1, "总伤害 " .. total)
end
end
伤害的统计按攻击者与目标的组合键聚合,flush 的间隔 3 秒:3 秒内的多次伤害合并为一条汇总消息下发。聚合的模式让百人团战的统计消息量从每秒数十条降到每 3 秒一条。伤害的排序在 flush 时计算:面板按总伤害降序排列,排名的变动在刷新时更新。
---伤害面板的渲染
function CombatPanel.render(dmgBoard)
local list = GUI:ListView_Create(panel, "dmgList", 10, 10, 200, 300, 1)
GUI:ListView_removeAllItems(list)
for i, rec in ipairs(dmgBoard) do
if i <= 10 then
local item = GUI:ListView_pushBackDefaultItem(list)
GUI:Text_Create(item, "dmg" .. i, 5, 5, 12, "#FF6600", i .. ". " .. rec.name .. " " .. rec.total)
end
end
end
面板只展示前 10 名的实时数据,排名的变动在 3 秒的刷新节拍内更新。伤害的百分比条形图在名字旁边展示,占比的可视化让队伍的贡献分布一眼可辨。面板的透明度可调:战斗的紧张时刻面板可缩小或半透明,不遮挡视野的关键区域。
聚合的数据量与实时性的平衡监控,flush 的间隔在高峰期可动态调整到 5 秒。
聚合的键曾经没区分目标,多目标战斗的伤害混在一起无法分辨输出方向,键加入目标字段后分类清晰。面板的刷新曾经在全量重建,增量更新的优化让面板的刷新不闪屏。
伤害面板的展示模式可切换:总量模式与 DPS 模式的切换让不同战术需求的队伍各取所需。面板的位置可拖动,拖动的坐标持久化,下次打开时恢复位置。面板的数据精度可配置:精确值或缩写(1.2 万),精度的切换在设置页控制。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 战士的烈火剑法一击熄火后要等八秒冷却,连招断档感强烈。疾风烈火斩在烈火剑法命中后给一次连击窗口:三秒内再…
实战应用:用在哪里 阵营对抗打到中期容易疲软:打赢没有额外好处,输掉也没有代价。阵营声望体系给阵营战装上荣誉刻度:个人与阵营…
实战应用:用在哪里 拿下沙巴克之后呢?城主除了名字挂在城墙上,对城市毫无影响。城主施政玩法让占领变成治理:城主每周获得市政令…
实战应用:用在哪里 主线路光缆被挖断的深夜,全服掉线 20 分钟,玩家以为游戏倒闭。备用线路方案给接入层配第二条出口:主线路…
实战应用:用在哪里 行会官员由帮主任命的老模式弊端明显:任人唯亲、能上不能下。行会选举接口把官员换届做成投票制:每两个月一次…
实战应用:用在哪里 烈火剑法的伤害加成、冷却时间、下一级提升,全靠玩家记忆或去官网查。技能说明悬浮卡片在鼠标悬停技能图标零点…