mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-03 08:03:50 +00:00
fix(combattext): show power drain separately from damage
This commit is contained in:
parent
e9d2c43191
commit
64483a31d5
3 changed files with 24 additions and 7 deletions
|
|
@ -52,7 +52,7 @@ struct CombatTextEntry {
|
||||||
enum Type : uint8_t {
|
enum Type : uint8_t {
|
||||||
MELEE_DAMAGE, SPELL_DAMAGE, HEAL, MISS, DODGE, PARRY, BLOCK,
|
MELEE_DAMAGE, SPELL_DAMAGE, HEAL, MISS, DODGE, PARRY, BLOCK,
|
||||||
EVADE, CRIT_DAMAGE, CRIT_HEAL, PERIODIC_DAMAGE, PERIODIC_HEAL, ENVIRONMENTAL,
|
EVADE, CRIT_DAMAGE, CRIT_HEAL, PERIODIC_DAMAGE, PERIODIC_HEAL, ENVIRONMENTAL,
|
||||||
ENERGIZE, XP_GAIN, IMMUNE, ABSORB, RESIST, DEFLECT, REFLECT, PROC_TRIGGER,
|
ENERGIZE, POWER_DRAIN, XP_GAIN, IMMUNE, ABSORB, RESIST, DEFLECT, REFLECT, PROC_TRIGGER,
|
||||||
DISPEL, STEAL, INTERRUPT, INSTAKILL
|
DISPEL, STEAL, INTERRUPT, INSTAKILL
|
||||||
};
|
};
|
||||||
Type type;
|
Type type;
|
||||||
|
|
@ -60,7 +60,7 @@ struct CombatTextEntry {
|
||||||
uint32_t spellId = 0;
|
uint32_t spellId = 0;
|
||||||
float age = 0.0f; // Seconds since creation (for fadeout)
|
float age = 0.0f; // Seconds since creation (for fadeout)
|
||||||
bool isPlayerSource = false; // True if player dealt this
|
bool isPlayerSource = false; // True if player dealt this
|
||||||
uint8_t powerType = 0; // For ENERGIZE: 0=mana,1=rage,2=focus,3=energy,6=runicpower
|
uint8_t powerType = 0; // For ENERGIZE/POWER_DRAIN: 0=mana,1=rage,2=focus,3=energy,6=runicpower
|
||||||
|
|
||||||
static constexpr float LIFETIME = 2.5f;
|
static constexpr float LIFETIME = 2.5f;
|
||||||
bool isExpired() const { return age >= LIFETIME; }
|
bool isExpired() const { return age >= LIFETIME; }
|
||||||
|
|
|
||||||
|
|
@ -3993,13 +3993,12 @@ void GameHandler::handlePacket(network::Packet& packet) {
|
||||||
} else if (auraType == 98) {
|
} else if (auraType == 98) {
|
||||||
// PERIODIC_MANA_LEECH: miscValue(powerType) + amount + float multiplier
|
// PERIODIC_MANA_LEECH: miscValue(powerType) + amount + float multiplier
|
||||||
if (packet.getSize() - packet.getReadPos() < 12) break;
|
if (packet.getSize() - packet.getReadPos() < 12) break;
|
||||||
/*uint32_t powerType =*/ packet.readUInt32();
|
uint8_t powerType = static_cast<uint8_t>(packet.readUInt32());
|
||||||
uint32_t amount = packet.readUInt32();
|
uint32_t amount = packet.readUInt32();
|
||||||
/*float multiplier =*/ packet.readUInt32(); // read as raw uint32 (float bits)
|
/*float multiplier =*/ packet.readUInt32(); // read as raw uint32 (float bits)
|
||||||
// Show as periodic damage from victim's perspective (mana drained)
|
|
||||||
if (isPlayerVictim && amount > 0)
|
if (isPlayerVictim && amount > 0)
|
||||||
addCombatText(CombatTextEntry::PERIODIC_DAMAGE, static_cast<int32_t>(amount),
|
addCombatText(CombatTextEntry::POWER_DRAIN, static_cast<int32_t>(amount),
|
||||||
spellId, false, 0, casterGuid, victimGuid);
|
spellId, false, powerType, casterGuid, victimGuid);
|
||||||
} else {
|
} else {
|
||||||
// Unknown/untracked aura type — stop parsing this event safely
|
// Unknown/untracked aura type — stop parsing this event safely
|
||||||
packet.setReadPos(packet.getSize());
|
packet.setReadPos(packet.getSize());
|
||||||
|
|
@ -6462,7 +6461,8 @@ void GameHandler::handlePacket(network::Packet& packet) {
|
||||||
/*float drainMult =*/ packet.readFloat();
|
/*float drainMult =*/ packet.readFloat();
|
||||||
if (drainAmount > 0) {
|
if (drainAmount > 0) {
|
||||||
if (drainTarget == playerGuid)
|
if (drainTarget == playerGuid)
|
||||||
addCombatText(CombatTextEntry::PERIODIC_DAMAGE, static_cast<int32_t>(drainAmount), exeSpellId, false, 0,
|
addCombatText(CombatTextEntry::POWER_DRAIN, static_cast<int32_t>(drainAmount), exeSpellId, false,
|
||||||
|
static_cast<uint8_t>(drainPower),
|
||||||
exeCaster, drainTarget);
|
exeCaster, drainTarget);
|
||||||
else if (isPlayerCaster)
|
else if (isPlayerCaster)
|
||||||
addCombatText(CombatTextEntry::ENERGIZE, static_cast<int32_t>(drainAmount), exeSpellId, true,
|
addCombatText(CombatTextEntry::ENERGIZE, static_cast<int32_t>(drainAmount), exeSpellId, true,
|
||||||
|
|
|
||||||
|
|
@ -8371,6 +8371,16 @@ void GameScreen::renderCombatText(game::GameHandler& gameHandler) {
|
||||||
default: color = ImVec4(0.3f, 0.6f, 1.0f, alpha); break; // Mana (0): blue
|
default: color = ImVec4(0.3f, 0.6f, 1.0f, alpha); break; // Mana (0): blue
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case game::CombatTextEntry::POWER_DRAIN:
|
||||||
|
snprintf(text, sizeof(text), "-%d", entry.amount);
|
||||||
|
switch (entry.powerType) {
|
||||||
|
case 1: color = ImVec4(1.0f, 0.35f, 0.35f, alpha); break;
|
||||||
|
case 2: color = ImVec4(1.0f, 0.7f, 0.2f, alpha); break;
|
||||||
|
case 3: color = ImVec4(1.0f, 0.95f, 0.35f, alpha); break;
|
||||||
|
case 6: color = ImVec4(0.45f, 0.95f, 0.85f, alpha); break;
|
||||||
|
default: color = ImVec4(0.45f, 0.75f, 1.0f, alpha); break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case game::CombatTextEntry::XP_GAIN:
|
case game::CombatTextEntry::XP_GAIN:
|
||||||
snprintf(text, sizeof(text), "+%d XP", entry.amount);
|
snprintf(text, sizeof(text), "+%d XP", entry.amount);
|
||||||
color = ImVec4(0.7f, 0.3f, 1.0f, alpha); // Purple for XP
|
color = ImVec4(0.7f, 0.3f, 1.0f, alpha); // Purple for XP
|
||||||
|
|
@ -20328,6 +20338,13 @@ void GameScreen::renderCombatLog(game::GameHandler& gameHandler) {
|
||||||
snprintf(desc, sizeof(desc), "%s gains %d power", tgt, e.amount);
|
snprintf(desc, sizeof(desc), "%s gains %d power", tgt, e.amount);
|
||||||
color = ImVec4(0.4f, 0.6f, 1.0f, 1.0f);
|
color = ImVec4(0.4f, 0.6f, 1.0f, 1.0f);
|
||||||
break;
|
break;
|
||||||
|
case T::POWER_DRAIN:
|
||||||
|
if (spell)
|
||||||
|
snprintf(desc, sizeof(desc), "%s loses %d power to %s's %s", tgt, e.amount, src, spell);
|
||||||
|
else
|
||||||
|
snprintf(desc, sizeof(desc), "%s loses %d power", tgt, e.amount);
|
||||||
|
color = ImVec4(0.45f, 0.75f, 1.0f, 1.0f);
|
||||||
|
break;
|
||||||
case T::XP_GAIN:
|
case T::XP_GAIN:
|
||||||
snprintf(desc, sizeof(desc), "You gain %d experience", e.amount);
|
snprintf(desc, sizeof(desc), "You gain %d experience", e.amount);
|
||||||
color = ImVec4(0.8f, 0.6f, 1.0f, 1.0f);
|
color = ImVec4(0.8f, 0.6f, 1.0f, 1.0f);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue