Handle missing WotLK packets: health/power updates, mirror timers, combo points, loot roll, titles, phase shift

- SMSG_HEALTH_UPDATE / SMSG_POWER_UPDATE: update entity HP/power via entityManager
- SMSG_UPDATE_WORLD_STATE: single world state variable update (companion to INIT)
- SMSG_UPDATE_COMBO_POINTS: store comboPoints_/comboTarget_ in GameHandler
- SMSG_START_MIRROR_TIMER / SMSG_STOP_MIRROR_TIMER / SMSG_PAUSE_MIRROR_TIMER: breath/fatigue/feign timer state
- MirrorTimer struct + getMirrorTimer() public getter; renderMirrorTimers() draws colored breath/fatigue bars above cast bar
- SMSG_CAST_RESULT: WotLK extended cast result; clear cast bar and show reason on failure (result != 0)
- SMSG_SPELL_FAILED_OTHER / SMSG_PROCRESIST: consume silently
- SMSG_LOOT_START_ROLL: correct trigger for Need/Greed popup (replaces rollType=128 heuristic)
- SMSG_STABLE_RESULT: show pet stable feedback in system chat (store/retrieve/buy slot/error)
- SMSG_TITLE_EARNED: system chat notification for title earned/removed
- SMSG_PLAYERBOUND / SMSG_BINDER_CONFIRM: hearthstone binding notification
- SMSG_SET_PHASE_SHIFT: consume (WotLK phasing, no client action needed)
- SMSG_TOGGLE_XP_GAIN: system chat notification
This commit is contained in:
Kelsi 2026-03-09 14:30:48 -07:00
parent 6df36f4588
commit bd3bd1b5a6
4 changed files with 301 additions and 0 deletions

View file

@ -865,6 +865,23 @@ public:
uint32_t getWorldStateMapId() const { return worldStateMapId_; }
uint32_t getWorldStateZoneId() const { return worldStateZoneId_; }
// Mirror timers (0=fatigue, 1=breath, 2=feigndeath)
struct MirrorTimer {
int32_t value = 0;
int32_t maxValue = 0;
int32_t scale = 0; // +1 = counting up, -1 = counting down
bool paused = false;
bool active = false;
};
const MirrorTimer& getMirrorTimer(int type) const {
static MirrorTimer empty;
return (type >= 0 && type < 3) ? mirrorTimers_[type] : empty;
}
// Combo points
uint8_t getComboPoints() const { return comboPoints_; }
uint64_t getComboTarget() const { return comboTarget_; }
struct FactionStandingInit {
uint8_t flags = 0;
int32_t standing = 0;
@ -1655,6 +1672,13 @@ private:
uint32_t instanceDifficulty_ = 0;
bool instanceIsHeroic_ = false;
// Mirror timers (0=fatigue, 1=breath, 2=feigndeath)
MirrorTimer mirrorTimers_[3];
// Combo points (rogues/druids)
uint8_t comboPoints_ = 0;
uint64_t comboTarget_ = 0;
// Instance / raid lockouts
std::vector<InstanceLockout> instanceLockouts_;

View file

@ -201,6 +201,7 @@ private:
void renderBagBar(game::GameHandler& gameHandler);
void renderXpBar(game::GameHandler& gameHandler);
void renderCastBar(game::GameHandler& gameHandler);
void renderMirrorTimers(game::GameHandler& gameHandler);
void renderCombatText(game::GameHandler& gameHandler);
void renderPartyFrames(game::GameHandler& gameHandler);
void renderGroupInvitePopup(game::GameHandler& gameHandler);