Skip to content

fix(基础库): 修复缘起版本多管血目标气血百分比显示错误 - #118

Merged
yefansky merged 1 commit into
tinymins:masterfrom
ZhaoQisi:fix/classic-multi-life-bar
Oct 21, 2026
Merged

yefansky merged 1 commit into
tinymins:masterfrom
ZhaoQisi:fix/classic-multi-life-bar

Conversation

@ZhaoQisi

Copy link
Copy Markdown
Contributor

问题现象

缘起服中,气血上限被拆成多管血的 NPC,茗伊插件显示的气血百分比被放大了整数倍。

以柳哲为例(同一时刻截图):

位置 显示
官方目标面板 Target.lua 2748.75万 / 7456.71万 (36.9%)
茗伊焦点列表 2748.7万 (73%)

当前气血的绝对值两边完全一致,只有百分比对不上,且 73 / 36.9 ≈ 2。这说明问题不在当前血量,而在最大气血取错了字段。

根因

KNpc::getMaxLife64() 返回的是展开后的总血池:

// Source/Common/SO3World/Src/KNpc.cpp:2743
double KNpc::getMaxLife64(void)
{
    return (double)(m_nMaxLifeCount + 1) * m_nMaxLife;
}

而 X.GetCharacterLife 原先只在重制版走 fMaxLife64,缘起分支退回单管 nMaxLife:

return X.IS_REMAKE and kTar.fCurrentLife64 or kTar.nCurrentLife,
    X.IS_REMAKE and kTar.fMaxLife64 or kTar.nMaxLife

多管血(nMaxLifeCount)是独立机制,与游戏版本无关。原代码把它误当成重制版专属特性,导致缘起服在 nMaxLifeCount > 0 时用单管值当总量,百分比被放大 (nMaxLifeCount + 1) 倍。

并且 64 位字段在所有版本都已注册,不存在取不到的问题:

  • KLuaNpc.cpp:2253-2254:REGISTER_LUA_DOUBLE(KNpc, CurrentLife64) / MaxLife64,无条件注册
  • KLuaPlayer.cpp:42544-42545:同上
  • 客户端收包时自己也按 (count + 1) 展开:KPlayerClient.cpp:13161-13177、16439-16456

修改内容

function X.GetCharacterLife(kTar)
	if not kTar then
		return
	end
	return kTar.fCurrentLife64, kTar.fMaxLife64
end

去掉版本分支,统一取总血池字段。管数与 int32 溢出由引擎侧统一处理,插件不再自行拼接,避免同一语义在两处各算一遍。

影响面:MY_Focus(焦点列表)、MY_LifeBar(头顶血条)、MY_ThreatRank、MY_TeamMon、MY_CombatText 都经 X.GetCharacterLife 取气血,一处修改全部生效。

CHANGELOG.md 增加了一条 *(classic)* 记录。

验证

静态与逻辑验证均已通过:

  • GBK 编码往返无损、纯 LF 行尾、无 U+FFFD
  • !src-dist/bin/lua-5.1 语法检查通过
  • 行为用例(缘起 / 重制版两条路径各跑一遍):两管血 NPC → 36%(修复前 73%)、单管 NPC 80% 不变、三管血跨管计算正确、玩家取值不变、nil 安全

尚未在游戏内真机验证,需要一台缘起客户端实测确认。

备注

  • 仅影响气血取值,不涉及其他字段与 UI 布局,重制版行为保持一致。
  • 如果认为直接切到 64 位字段有兼容性顾虑,可以退一步只在 nMaxLifeCount > 0 时展开,但那样会与引擎已有的 getMaxLife64 口径重复实现,不推荐。

GetCharacterLife 原先只在重制版走 fCurrentLife64 / fMaxLife64,缘起分支退回单管
nMaxLife。而多管血(nMaxLifeCount)与版本无关:KNpc::getMaxLife64 返回的是
(nMaxLifeCount + 1) * nMaxLife,气血上限被拆成多管的 NPC 在缘起会用单管值当
总量,百分比被放大 (nMaxLifeCount + 1) 倍。

64 位字段在 KLuaNpc / KLuaPlayer 上均无条件注册,客户端收包时也按同一口径
维护当前值,因此直接统一取 fCurrentLife64 / fMaxLife64,不再区分版本,也不再
自行拼接管数。
@ZhaoQisi
ZhaoQisi force-pushed the fix/classic-multi-life-bar branch from 0d4b87d to dfd8df0 Compare October 21, 2026 03:53
@yefansky
yefansky merged commit ca3ffbc into tinymins:master Oct 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants