mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-22 23:30:14 +00:00
feat: add HP% text and cast bars to nameplates
- Show health percentage centered on each nameplate health bar - Show purple cast bar below health bar when a unit is actively casting - Display spell name (from Spell.dbc cache) above cast bar - Show time remaining (e.g. "1.4s") centered on cast bar fill - All elements respect the existing nameplate alpha fade-out at distance
This commit is contained in:
parent
fa947eb9c7
commit
6068d0d68d
1 changed files with 53 additions and 0 deletions
|
|
@ -6067,6 +6067,59 @@ void GameScreen::renderNameplates(game::GameHandler& gameHandler) {
|
|||
}
|
||||
drawList->AddRect (ImVec2(barX - 1.0f, sy - 1.0f), ImVec2(barX + barW + 1.0f, sy + barH + 1.0f), borderColor, 2.0f);
|
||||
|
||||
// HP % text centered on health bar (non-corpse, non-full-health for readability)
|
||||
if (!isCorpse && unit->getMaxHealth() > 0) {
|
||||
int hpPct = static_cast<int>(healthPct * 100.0f + 0.5f);
|
||||
char hpBuf[8];
|
||||
snprintf(hpBuf, sizeof(hpBuf), "%d%%", hpPct);
|
||||
ImVec2 hpTextSz = ImGui::CalcTextSize(hpBuf);
|
||||
float hpTx = sx - hpTextSz.x * 0.5f;
|
||||
float hpTy = sy + (barH - hpTextSz.y) * 0.5f;
|
||||
drawList->AddText(ImVec2(hpTx + 1.0f, hpTy + 1.0f), IM_COL32(0, 0, 0, A(140)), hpBuf);
|
||||
drawList->AddText(ImVec2(hpTx, hpTy), IM_COL32(255, 255, 255, A(200)), hpBuf);
|
||||
}
|
||||
|
||||
// Cast bar below health bar when unit is casting
|
||||
float castBarBaseY = sy + barH + 2.0f;
|
||||
{
|
||||
const auto* cs = gameHandler.getUnitCastState(guid);
|
||||
if (cs && cs->casting && cs->timeTotal > 0.0f) {
|
||||
float castPct = std::clamp((cs->timeTotal - cs->timeRemaining) / cs->timeTotal, 0.0f, 1.0f);
|
||||
const float cbH = 6.0f * nameplateScale_;
|
||||
|
||||
// Spell name above the cast bar
|
||||
const std::string& spellName = gameHandler.getSpellName(cs->spellId);
|
||||
if (!spellName.empty()) {
|
||||
ImVec2 snSz = ImGui::CalcTextSize(spellName.c_str());
|
||||
float snX = sx - snSz.x * 0.5f;
|
||||
float snY = castBarBaseY;
|
||||
drawList->AddText(ImVec2(snX + 1.0f, snY + 1.0f), IM_COL32(0, 0, 0, A(140)), spellName.c_str());
|
||||
drawList->AddText(ImVec2(snX, snY), IM_COL32(255, 210, 100, A(220)), spellName.c_str());
|
||||
castBarBaseY += snSz.y + 2.0f;
|
||||
}
|
||||
|
||||
// Cast bar background + fill
|
||||
ImU32 cbBg = IM_COL32(40, 30, 60, A(180));
|
||||
ImU32 cbFill = IM_COL32(140, 80, 220, A(200)); // purple cast bar
|
||||
drawList->AddRectFilled(ImVec2(barX, castBarBaseY),
|
||||
ImVec2(barX + barW, castBarBaseY + cbH), cbBg, 2.0f);
|
||||
drawList->AddRectFilled(ImVec2(barX, castBarBaseY),
|
||||
ImVec2(barX + barW * castPct, castBarBaseY + cbH), cbFill, 2.0f);
|
||||
drawList->AddRect (ImVec2(barX - 1.0f, castBarBaseY - 1.0f),
|
||||
ImVec2(barX + barW + 1.0f, castBarBaseY + cbH + 1.0f),
|
||||
IM_COL32(20, 10, 40, A(200)), 2.0f);
|
||||
|
||||
// Time remaining text
|
||||
char timeBuf[12];
|
||||
snprintf(timeBuf, sizeof(timeBuf), "%.1fs", cs->timeRemaining);
|
||||
ImVec2 timeSz = ImGui::CalcTextSize(timeBuf);
|
||||
float timeX = sx - timeSz.x * 0.5f;
|
||||
float timeY = castBarBaseY + (cbH - timeSz.y) * 0.5f;
|
||||
drawList->AddText(ImVec2(timeX + 1.0f, timeY + 1.0f), IM_COL32(0, 0, 0, A(140)), timeBuf);
|
||||
drawList->AddText(ImVec2(timeX, timeY), IM_COL32(220, 200, 255, A(220)), timeBuf);
|
||||
}
|
||||
}
|
||||
|
||||
// Name + level label above health bar
|
||||
uint32_t level = unit->getLevel();
|
||||
const std::string& unitName = unit->getName();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue