2026-02-02 12:24:50 -08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "game/game_handler.hpp"
|
|
|
|
|
#include "game/inventory.hpp"
|
2026-02-21 19:41:21 -08:00
|
|
|
// WorldMap is now owned by Renderer, accessed via getWorldMap()
|
2026-02-06 14:24:38 -08:00
|
|
|
#include "rendering/character_preview.hpp"
|
2026-02-02 12:24:50 -08:00
|
|
|
#include "ui/inventory_screen.hpp"
|
2026-02-06 13:47:03 -08:00
|
|
|
#include "ui/quest_log_screen.hpp"
|
2026-02-04 11:31:08 -08:00
|
|
|
#include "ui/spellbook_screen.hpp"
|
2026-02-06 16:04:25 -08:00
|
|
|
#include "ui/talent_screen.hpp"
|
2026-03-11 06:51:48 -07:00
|
|
|
#include "ui/keybinding_manager.hpp"
|
2026-03-31 08:53:14 +03:00
|
|
|
#include "ui/chat_panel.hpp"
|
2026-03-31 09:18:17 +03:00
|
|
|
#include "ui/toast_manager.hpp"
|
2026-03-31 10:07:58 +03:00
|
|
|
#include "ui/dialog_manager.hpp"
|
|
|
|
|
#include "ui/settings_panel.hpp"
|
2026-02-22 03:32:08 -08:00
|
|
|
#include <vulkan/vulkan.h>
|
2026-02-02 12:24:50 -08:00
|
|
|
#include <imgui.h>
|
|
|
|
|
#include <string>
|
2026-02-05 15:07:13 -08:00
|
|
|
#include <unordered_map>
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-02-06 14:30:54 -08:00
|
|
|
namespace wowee {
|
|
|
|
|
namespace pipeline { class AssetManager; }
|
2026-03-25 12:52:07 -07:00
|
|
|
namespace rendering { class Renderer; }
|
2026-02-06 14:30:54 -08:00
|
|
|
namespace ui {
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* In-game screen UI
|
|
|
|
|
*
|
|
|
|
|
* Displays player info, entity list, chat, and game controls
|
|
|
|
|
*/
|
|
|
|
|
class GameScreen {
|
|
|
|
|
public:
|
|
|
|
|
GameScreen();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Render the UI
|
|
|
|
|
* @param gameHandler Reference to game handler
|
|
|
|
|
*/
|
|
|
|
|
void render(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check if chat input is active
|
|
|
|
|
*/
|
2026-03-31 08:53:14 +03:00
|
|
|
bool isChatInputActive() const { return chatPanel_.isChatInputActive(); }
|
2026-02-02 12:24:50 -08:00
|
|
|
|
Fix vendor buying, improve character select, parallelize WMO culling, and optimize collision
- Fix CMSG_BUY_ITEM count field from uint8 to uint32 (server silently dropped undersized packets)
- Character select screen: remember last selected character, two-column layout with details panel, double-click to enter world, responsive window sizing
- Fix stale character data between logins by replacing static init flag with per-character GUID tracking
- Parallelize WMO visibility culling across worker threads (same pattern as M2 renderer)
- Optimize WMO collision queries with world-space group bounds early rejection in getFloorHeight, checkWallCollision, isInsideWMO, and raycastBoundingBoxes
- Reduce camera ground samples from 5 to 3 movement-aligned probes
- Add WMO interior lighting, unlit materials, vertex color multiply, and alpha blending support
2026-02-07 15:29:19 -08:00
|
|
|
void saveSettings();
|
|
|
|
|
void loadSettings();
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
private:
|
2026-03-31 08:53:14 +03:00
|
|
|
// Chat panel (extracted from GameScreen — owns all chat state and rendering)
|
|
|
|
|
ChatPanel chatPanel_;
|
2026-03-18 04:14:44 -07:00
|
|
|
|
2026-03-31 09:18:17 +03:00
|
|
|
// Toast manager (extracted from GameScreen — owns all toast/notification state and rendering)
|
|
|
|
|
ToastManager toastManager_;
|
|
|
|
|
|
2026-03-31 10:07:58 +03:00
|
|
|
// Dialog manager (extracted from GameScreen — owns all popup/dialog rendering)
|
|
|
|
|
DialogManager dialogManager_;
|
|
|
|
|
|
|
|
|
|
// Settings panel (extracted from GameScreen — owns all settings UI and config state)
|
|
|
|
|
SettingsPanel settingsPanel_;
|
|
|
|
|
|
2026-03-18 04:30:33 -07:00
|
|
|
// Action bar error-flash: spellId → wall-clock time (seconds) when the flash ends.
|
|
|
|
|
// Populated by the SpellCastFailedCallback; queried during action bar button rendering.
|
|
|
|
|
std::unordered_map<uint32_t, float> actionFlashEndTimes_;
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
// UI state
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
bool showEntityWindow = false;
|
2026-02-02 12:24:50 -08:00
|
|
|
bool showChatWindow = true;
|
2026-03-11 09:24:37 -07:00
|
|
|
bool showMinimap_ = true; // M key toggles minimap
|
2026-03-18 11:43:39 -07:00
|
|
|
bool showNameplates_ = true; // V key toggles enemy/NPC nameplates
|
2026-03-12 00:26:47 -07:00
|
|
|
uint64_t nameplateCtxGuid_ = 0; // GUID of nameplate right-clicked (0 = none)
|
|
|
|
|
ImVec2 nameplateCtxPos_{}; // Screen position of nameplate right-click
|
2026-03-11 22:57:04 -07:00
|
|
|
uint32_t lastPlayerHp_ = 0; // Previous frame HP for damage flash detection
|
|
|
|
|
float damageFlashAlpha_ = 0.0f; // Screen edge flash intensity (fades to 0)
|
2026-03-31 09:18:17 +03:00
|
|
|
|
2026-03-12 01:15:11 -07:00
|
|
|
|
2026-03-12 03:52:54 -07:00
|
|
|
// Raid Warning / Boss Emote big-text overlay (center-screen, fades after 5s)
|
|
|
|
|
struct RaidWarnEntry {
|
|
|
|
|
std::string text;
|
|
|
|
|
float age = 0.0f;
|
|
|
|
|
bool isBossEmote = false; // true = amber, false (raid warning) = red+yellow
|
|
|
|
|
static constexpr float LIFETIME = 5.0f;
|
|
|
|
|
};
|
|
|
|
|
std::vector<RaidWarnEntry> raidWarnEntries_;
|
|
|
|
|
bool raidWarnCallbackSet_ = false;
|
|
|
|
|
size_t raidWarnChatSeenCount_ = 0; // index into chat history for unread scan
|
|
|
|
|
|
2026-03-12 01:15:11 -07:00
|
|
|
// UIErrorsFrame: WoW-style center-bottom error messages (spell fails, out of range, etc.)
|
|
|
|
|
struct UIErrorEntry { std::string text; float age = 0.0f; };
|
|
|
|
|
std::vector<UIErrorEntry> uiErrors_;
|
|
|
|
|
bool uiErrorCallbackSet_ = false;
|
|
|
|
|
static constexpr float kUIErrorLifetime = 2.5f;
|
2026-03-18 04:30:33 -07:00
|
|
|
bool castFailedCallbackSet_ = false;
|
|
|
|
|
static constexpr float kActionFlashDuration = 0.5f; // seconds for error-red overlay to fade
|
2026-03-12 01:51:18 -07:00
|
|
|
|
2026-03-12 05:44:25 -07:00
|
|
|
|
2026-03-12 06:14:18 -07:00
|
|
|
|
|
|
|
|
// Death screen: elapsed time since the death dialog first appeared
|
|
|
|
|
float deathElapsed_ = 0.0f;
|
|
|
|
|
bool deathTimerRunning_ = false;
|
|
|
|
|
// WoW forces release after ~6 minutes; show countdown until then
|
|
|
|
|
static constexpr float kForcedReleaseSec = 360.0f;
|
2026-03-31 09:18:17 +03:00
|
|
|
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
bool showPlayerInfo = false;
|
2026-03-10 05:46:03 -07:00
|
|
|
bool showSocialFrame_ = false; // O key toggles social/friends list
|
2026-02-13 21:39:48 -08:00
|
|
|
bool showGuildRoster_ = false;
|
2026-03-11 09:24:37 -07:00
|
|
|
bool showRaidFrames_ = true; // F key toggles raid/party frames
|
2026-03-11 07:38:08 -07:00
|
|
|
bool showWorldMap_ = false; // W key toggles world map
|
2026-02-16 20:16:14 -08:00
|
|
|
std::string selectedGuildMember_;
|
|
|
|
|
bool showGuildNoteEdit_ = false;
|
|
|
|
|
bool editingOfficerNote_ = false;
|
|
|
|
|
char guildNoteEditBuffer_[256] = {0};
|
2026-02-25 14:44:44 -08:00
|
|
|
int guildRosterTab_ = 0; // 0=Roster, 1=Guild Info
|
|
|
|
|
char guildMotdEditBuffer_[256] = {0};
|
|
|
|
|
bool showMotdEdit_ = false;
|
|
|
|
|
char petitionNameBuffer_[64] = {0};
|
|
|
|
|
char addRankNameBuffer_[64] = {0};
|
|
|
|
|
bool showAddRankModal_ = false;
|
2026-02-19 22:34:22 -08:00
|
|
|
bool vendorBagsOpened_ = false; // Track if bags were auto-opened for current vendor session
|
2026-03-12 16:47:42 -07:00
|
|
|
ImVec2 questTrackerPos_ = ImVec2(-1.0f, -1.0f); // <0 = use default
|
2026-03-13 04:04:29 -07:00
|
|
|
ImVec2 questTrackerSize_ = ImVec2(220.0f, 200.0f); // saved size
|
|
|
|
|
float questTrackerRightOffset_ = -1.0f; // pixels from right edge; <0 = use default
|
2026-03-12 16:47:42 -07:00
|
|
|
bool questTrackerPosInit_ = false;
|
2026-02-05 16:01:38 -08:00
|
|
|
bool showEscapeMenu = false;
|
2026-03-31 10:07:58 +03:00
|
|
|
|
2026-03-18 02:07:59 -07:00
|
|
|
// Macro editor popup state
|
|
|
|
|
uint32_t macroEditorId_ = 0; // macro index being edited
|
|
|
|
|
bool macroEditorOpen_ = false; // deferred OpenPopup flag
|
|
|
|
|
char macroEditorBuf_[256] = {}; // edit buffer
|
2026-02-17 16:26:49 -08:00
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
/**
|
|
|
|
|
* Render player info window
|
|
|
|
|
*/
|
|
|
|
|
void renderPlayerInfo(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Render entity list window
|
|
|
|
|
*/
|
|
|
|
|
void renderEntityList(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Render player unit frame (top-left)
|
|
|
|
|
*/
|
|
|
|
|
void renderPlayerFrame(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Render target frame
|
|
|
|
|
*/
|
|
|
|
|
void renderTargetFrame(game::GameHandler& gameHandler);
|
2026-03-10 21:15:24 -07:00
|
|
|
void renderFocusFrame(game::GameHandler& gameHandler);
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-03-09 17:23:28 -07:00
|
|
|
/**
|
|
|
|
|
* Render pet frame (below player frame when player has an active pet)
|
|
|
|
|
*/
|
|
|
|
|
void renderPetFrame(game::GameHandler& gameHandler);
|
2026-03-12 10:14:44 -07:00
|
|
|
void renderTotemFrame(game::GameHandler& gameHandler);
|
2026-03-09 17:23:28 -07:00
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
/**
|
|
|
|
|
* Process targeting input (Tab, Escape, click)
|
|
|
|
|
*/
|
|
|
|
|
void processTargetInput(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Rebuild character geosets from current equipment state
|
|
|
|
|
*/
|
|
|
|
|
void updateCharacterGeosets(game::Inventory& inventory);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Re-composite character skin texture from current equipment
|
|
|
|
|
*/
|
|
|
|
|
void updateCharacterTextures(game::Inventory& inventory);
|
|
|
|
|
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
// ---- New UI renders ----
|
|
|
|
|
void renderActionBar(game::GameHandler& gameHandler);
|
feat: add stance/form/presence bar for Warriors, Druids, Death Knights, Rogues, Priests
Renders a stance bar to the left of the main action bar showing the
player's known stance spells filtered to only those they have learned:
- Warrior: Battle Stance, Defensive Stance, Berserker Stance
- Death Knight: Blood Presence, Frost Presence, Unholy Presence
- Druid: Bear/Dire Bear, Cat, Travel, Aquatic, Moonkin, Tree, Flight forms
- Rogue: Stealth
- Priest: Shadowform
Active form detected from permanent player auras (maxDurationMs == -1).
Clicking an inactive stance casts the corresponding spell. Active stance
shown with green border/tint; inactive stances are slightly dimmed.
Spell name tooltips shown on hover using existing SpellbookScreen lookup.
2026-03-17 15:12:58 -07:00
|
|
|
void renderStanceBar(game::GameHandler& gameHandler);
|
Implement complete talent system with dual spec support
Network Protocol:
- Add SMSG_TALENTS_INFO (0x4C0) packet parsing for talent data
- Add CMSG_LEARN_TALENT (0x251) to request learning talents
- Add MSG_TALENT_WIPE_CONFIRM (0x2AB) opcode for spec switching
- Parse talent spec, unspent points, and learned talent ranks
DBC Parsing:
- Load Talent.dbc: talent grid positions, ranks, prerequisites, spell IDs
- Load TalentTab.dbc: talent tree definitions with correct field indices
- Fix localized string field handling (17 fields per string)
- Load Spell.dbc and SpellIcon.dbc for talent icons and tooltips
- Class mask filtering using bitwise operations (1 << (class - 1))
UI Implementation:
- Complete talent tree UI with tabbed interface for specs
- Display talent icons from spell data with proper tinting/borders
- Enhanced tooltips: spell name, rank, current/next descriptions, prereqs
- Visual states: green (maxed), yellow (partial), white (available), gray (locked)
- Tier unlock system (5 points per tier requirement)
- Rank overlay on icons with shadow text
- Click to learn talents with validation
Dual Spec Support:
- Store unspent points and learned talents per spec (0 and 1)
- Track active spec and display its talents
- Spec switching UI with buttons for Spec 1/Spec 2
- Handle both SMSG_TALENTS_INFO packets from server at login
- Display unspent points for both specs in header
- Independent talent trees for each specialization
2026-02-10 02:00:13 -08:00
|
|
|
void renderBagBar(game::GameHandler& gameHandler);
|
2026-02-05 12:07:58 -08:00
|
|
|
void renderXpBar(game::GameHandler& gameHandler);
|
2026-03-12 05:03:03 -07:00
|
|
|
void renderRepBar(game::GameHandler& gameHandler);
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
void renderCastBar(game::GameHandler& gameHandler);
|
2026-03-09 14:30:48 -07:00
|
|
|
void renderMirrorTimers(game::GameHandler& gameHandler);
|
2026-03-12 15:25:07 -07:00
|
|
|
void renderCooldownTracker(game::GameHandler& gameHandler);
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
void renderCombatText(game::GameHandler& gameHandler);
|
2026-03-12 03:52:54 -07:00
|
|
|
void renderRaidWarningOverlay(game::GameHandler& gameHandler);
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
void renderPartyFrames(game::GameHandler& gameHandler);
|
2026-03-09 20:05:09 -07:00
|
|
|
void renderBossFrames(game::GameHandler& gameHandler);
|
2026-03-12 01:15:11 -07:00
|
|
|
void renderUIErrors(game::GameHandler& gameHandler, float deltaTime);
|
2026-03-31 09:18:17 +03:00
|
|
|
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
void renderBuffBar(game::GameHandler& gameHandler);
|
2026-03-10 05:46:03 -07:00
|
|
|
void renderSocialFrame(game::GameHandler& gameHandler);
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
void renderLootWindow(game::GameHandler& gameHandler);
|
|
|
|
|
void renderGossipWindow(game::GameHandler& gameHandler);
|
2026-02-06 11:59:51 -08:00
|
|
|
void renderQuestDetailsWindow(game::GameHandler& gameHandler);
|
2026-02-06 21:50:15 -08:00
|
|
|
void renderQuestRequestItemsWindow(game::GameHandler& gameHandler);
|
|
|
|
|
void renderQuestOfferRewardWindow(game::GameHandler& gameHandler);
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
void renderVendorWindow(game::GameHandler& gameHandler);
|
2026-02-08 14:33:39 -08:00
|
|
|
void renderTrainerWindow(game::GameHandler& gameHandler);
|
2026-03-18 11:58:01 -07:00
|
|
|
void renderBarberShopWindow(game::GameHandler& gameHandler);
|
feat: implement pet stable system (MSG_LIST_STABLED_PETS, CMSG_STABLE_PET, CMSG_UNSTABLE_PET)
- Parse MSG_LIST_STABLED_PETS (SMSG): populate StabledPet list with
petNumber, entry, level, name, displayId, and active status
- Detect stable master via gossip option text/keyword matching and
auto-send MSG_LIST_STABLED_PETS request to open the stable UI
- Refresh list automatically after SMSG_STABLE_RESULT to reflect state
- New packet builders: ListStabledPetsPacket, StablePetPacket, UnstablePetPacket
- New public API: requestStabledPetList(), stablePet(slot), unstablePet(petNumber)
- Stable window UI: shows active/stabled pets with store/retrieve buttons,
slot count, refresh, and close; opens when server sends pet list
- Clear stable state on world logout/disconnect
2026-03-12 19:15:52 -07:00
|
|
|
void renderStableWindow(game::GameHandler& gameHandler);
|
2026-02-07 16:59:20 -08:00
|
|
|
void renderTaxiWindow(game::GameHandler& gameHandler);
|
2026-03-13 10:13:54 -07:00
|
|
|
void renderLogoutCountdown(game::GameHandler& gameHandler);
|
2026-02-06 17:27:20 -08:00
|
|
|
void renderDeathScreen(game::GameHandler& gameHandler);
|
2026-03-09 22:31:56 -07:00
|
|
|
void renderReclaimCorpseButton(game::GameHandler& gameHandler);
|
2026-02-05 16:01:38 -08:00
|
|
|
void renderEscapeMenu();
|
2026-02-06 20:10:10 -08:00
|
|
|
void renderQuestMarkers(game::GameHandler& gameHandler);
|
|
|
|
|
void renderMinimapMarkers(game::GameHandler& gameHandler);
|
2026-03-09 15:05:38 -07:00
|
|
|
void renderQuestObjectiveTracker(game::GameHandler& gameHandler);
|
2026-02-13 21:39:48 -08:00
|
|
|
void renderGuildRoster(game::GameHandler& gameHandler);
|
2026-02-15 14:00:41 -08:00
|
|
|
void renderMailWindow(game::GameHandler& gameHandler);
|
|
|
|
|
void renderMailComposeWindow(game::GameHandler& gameHandler);
|
Implement bank, guild bank, and auction house systems
Add 27 new opcodes, packet builders/parsers, handler methods, inventory
extension with 28 bank slots + 7 bank bags, and UI windows for personal
bank, guild bank (6 tabs x 98 slots), and auction house (browse/sell/bid).
Fix Classic gossip parser to omit boxMoney/boxText fields not present in
Vanilla protocol, fix gossip icon labels with text-based NPC type detection,
and add Turtle WoW opcode mappings for bank and auction interactions.
2026-02-16 21:11:18 -08:00
|
|
|
void renderBankWindow(game::GameHandler& gameHandler);
|
|
|
|
|
void renderGuildBankWindow(game::GameHandler& gameHandler);
|
|
|
|
|
void renderAuctionHouseWindow(game::GameHandler& gameHandler);
|
2026-03-09 13:47:07 -07:00
|
|
|
void renderDungeonFinderWindow(game::GameHandler& gameHandler);
|
2026-03-09 15:52:58 -07:00
|
|
|
void renderInstanceLockouts(game::GameHandler& gameHandler);
|
2026-03-09 17:01:38 -07:00
|
|
|
void renderNameplates(game::GameHandler& gameHandler);
|
2026-03-09 22:42:44 -07:00
|
|
|
void renderBattlegroundScore(game::GameHandler& gameHandler);
|
2026-03-12 04:04:27 -07:00
|
|
|
void renderDPSMeter(game::GameHandler& gameHandler);
|
2026-03-12 14:25:37 -07:00
|
|
|
void renderDurabilityWarning(game::GameHandler& gameHandler);
|
2026-03-18 10:47:34 -07:00
|
|
|
void takeScreenshot(game::GameHandler& gameHandler);
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
/**
|
|
|
|
|
* Inventory screen
|
|
|
|
|
*/
|
2026-02-04 22:27:45 -08:00
|
|
|
void renderWorldMap(game::GameHandler& gameHandler);
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
InventoryScreen inventoryScreen;
|
Fix vendor buying, improve character select, parallelize WMO culling, and optimize collision
- Fix CMSG_BUY_ITEM count field from uint8 to uint32 (server silently dropped undersized packets)
- Character select screen: remember last selected character, two-column layout with details panel, double-click to enter world, responsive window sizing
- Fix stale character data between logins by replacing static init flag with per-character GUID tracking
- Parallelize WMO visibility culling across worker threads (same pattern as M2 renderer)
- Optimize WMO collision queries with world-space group bounds early rejection in getFloorHeight, checkWallCollision, isInsideWMO, and raycastBoundingBoxes
- Reduce camera ground samples from 5 to 3 movement-aligned probes
- Add WMO interior lighting, unlit materials, vertex color multiply, and alpha blending support
2026-02-07 15:29:19 -08:00
|
|
|
uint64_t inventoryScreenCharGuid_ = 0; // GUID of character inventory screen was initialized for
|
2026-02-06 13:47:03 -08:00
|
|
|
QuestLogScreen questLogScreen;
|
2026-02-04 11:31:08 -08:00
|
|
|
SpellbookScreen spellbookScreen;
|
2026-02-06 16:04:25 -08:00
|
|
|
TalentScreen talentScreen;
|
2026-02-21 19:41:21 -08:00
|
|
|
// WorldMap is now owned by Renderer (accessed via renderer->getWorldMap())
|
2026-02-05 15:07:13 -08:00
|
|
|
|
2026-02-06 14:30:54 -08:00
|
|
|
// Spell icon cache: spellId -> GL texture ID
|
2026-02-22 03:32:08 -08:00
|
|
|
std::unordered_map<uint32_t, VkDescriptorSet> spellIconCache_;
|
2026-02-06 14:30:54 -08:00
|
|
|
// SpellIconID -> icon path (from SpellIcon.dbc)
|
|
|
|
|
std::unordered_map<uint32_t, std::string> spellIconPaths_;
|
|
|
|
|
// SpellID -> SpellIconID (from Spell.dbc field 133)
|
|
|
|
|
std::unordered_map<uint32_t, uint32_t> spellIconIds_;
|
|
|
|
|
bool spellIconDbLoaded_ = false;
|
2026-02-22 03:32:08 -08:00
|
|
|
VkDescriptorSet getSpellIcon(uint32_t spellId, pipeline::AssetManager* am);
|
2026-02-06 19:24:44 -08:00
|
|
|
|
2026-03-20 05:28:45 -07:00
|
|
|
// ItemExtendedCost.dbc cache: extendedCostId -> cost details
|
|
|
|
|
struct ExtendedCostEntry {
|
|
|
|
|
uint32_t honorPoints = 0;
|
|
|
|
|
uint32_t arenaPoints = 0;
|
|
|
|
|
uint32_t itemId[5] = {};
|
|
|
|
|
uint32_t itemCount[5] = {};
|
|
|
|
|
};
|
|
|
|
|
std::unordered_map<uint32_t, ExtendedCostEntry> extendedCostCache_;
|
|
|
|
|
bool extendedCostDbLoaded_ = false;
|
|
|
|
|
void loadExtendedCostDBC();
|
|
|
|
|
std::string formatExtendedCost(uint32_t extendedCostId, game::GameHandler& gameHandler);
|
|
|
|
|
|
2026-03-20 08:14:08 -07:00
|
|
|
// Macro cooldown cache: maps macro ID → resolved primary spell ID (0 = no spell found)
|
|
|
|
|
std::unordered_map<uint32_t, uint32_t> macroPrimarySpellCache_;
|
2026-03-20 08:52:57 -07:00
|
|
|
size_t macroCacheSpellCount_ = 0; // invalidates cache when spell list changes
|
2026-03-20 08:14:08 -07:00
|
|
|
uint32_t resolveMacroPrimarySpellId(uint32_t macroId, game::GameHandler& gameHandler);
|
2026-03-20 08:11:13 -07:00
|
|
|
|
2026-03-09 18:28:03 -07:00
|
|
|
// Death Knight rune bar: client-predicted fill (0.0=depleted, 1.0=ready) for smooth animation
|
|
|
|
|
float runeClientFill_[6] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
|
|
|
|
|
|
2026-02-06 19:24:44 -08:00
|
|
|
// Action bar drag state (-1 = not dragging)
|
|
|
|
|
int actionBarDragSlot_ = -1;
|
2026-02-22 03:32:08 -08:00
|
|
|
VkDescriptorSet actionBarDragIcon_ = VK_NULL_HANDLE;
|
2026-02-07 13:53:03 -08:00
|
|
|
|
2026-02-19 22:34:22 -08:00
|
|
|
// Bag bar state
|
2026-02-22 03:32:08 -08:00
|
|
|
VkDescriptorSet backpackIconTexture_ = VK_NULL_HANDLE;
|
|
|
|
|
VkDescriptorSet emptyBagSlotTexture_ = VK_NULL_HANDLE;
|
2026-02-19 22:34:22 -08:00
|
|
|
int bagBarPickedSlot_ = -1; // Visual drag in progress (-1 = none)
|
|
|
|
|
int bagBarDragSource_ = -1; // Mouse pressed on this slot, waiting for drag or click (-1 = none)
|
Implement complete talent system with dual spec support
Network Protocol:
- Add SMSG_TALENTS_INFO (0x4C0) packet parsing for talent data
- Add CMSG_LEARN_TALENT (0x251) to request learning talents
- Add MSG_TALENT_WIPE_CONFIRM (0x2AB) opcode for spec switching
- Parse talent spec, unspent points, and learned talent ranks
DBC Parsing:
- Load Talent.dbc: talent grid positions, ranks, prerequisites, spell IDs
- Load TalentTab.dbc: talent tree definitions with correct field indices
- Fix localized string field handling (17 fields per string)
- Load Spell.dbc and SpellIcon.dbc for talent icons and tooltips
- Class mask filtering using bitwise operations (1 << (class - 1))
UI Implementation:
- Complete talent tree UI with tabbed interface for specs
- Display talent icons from spell data with proper tinting/borders
- Enhanced tooltips: spell name, rank, current/next descriptions, prereqs
- Visual states: green (maxed), yellow (partial), white (available), gray (locked)
- Tier unlock system (5 points per tier requirement)
- Rank overlay on icons with shadow text
- Click to learn talents with validation
Dual Spec Support:
- Store unspent points and learned talents per spec (0 and 1)
- Track active spec and display its talents
- Spec switching UI with buttons for Spec 1/Spec 2
- Handle both SMSG_TALENTS_INFO packets from server at login
- Display unspent points for both specs in header
- Independent talent trees for each specialization
2026-02-10 02:00:13 -08:00
|
|
|
|
2026-03-12 10:41:18 -07:00
|
|
|
// Who Results window
|
|
|
|
|
bool showWhoWindow_ = false;
|
|
|
|
|
void renderWhoWindow(game::GameHandler& gameHandler);
|
|
|
|
|
|
feat: add persistent combat log window (/combatlog or /cl)
Stores up to 500 combat events in a rolling deque alongside the existing
floating combat text. Events are populated via the existing addCombatText()
call site, resolving attacker/target names from the entity manager and
player name cache at event time.
- CombatLogEntry struct in spell_defines.hpp (type, amount, spellId,
isPlayerSource, timestamp, sourceName, targetName)
- getCombatLog() / clearCombatLog() accessors on GameHandler
- renderCombatLog() in GameScreen: scrollable two-column table (Time +
Event), color-coded by event category, with Damage/Healing/Misc filter
checkboxes, auto-scroll toggle, and Clear button
- /combatlog (/cl) chat command toggles the window
2026-03-12 11:00:10 -07:00
|
|
|
// Combat Log window
|
|
|
|
|
bool showCombatLog_ = false;
|
|
|
|
|
void renderCombatLog(game::GameHandler& gameHandler);
|
|
|
|
|
|
2026-03-09 15:52:58 -07:00
|
|
|
// Instance Lockouts window
|
|
|
|
|
bool showInstanceLockouts_ = false;
|
|
|
|
|
|
2026-03-09 13:47:07 -07:00
|
|
|
// Dungeon Finder state
|
|
|
|
|
bool showDungeonFinder_ = false;
|
2026-03-12 02:09:35 -07:00
|
|
|
|
|
|
|
|
// Achievements window
|
|
|
|
|
bool showAchievementWindow_ = false;
|
|
|
|
|
char achievementSearchBuf_[128] = {};
|
|
|
|
|
void renderAchievementWindow(game::GameHandler& gameHandler);
|
2026-03-12 02:31:12 -07:00
|
|
|
|
2026-03-17 20:46:41 -07:00
|
|
|
// Skills / Professions window (K key)
|
|
|
|
|
bool showSkillsWindow_ = false;
|
|
|
|
|
void renderSkillsWindow(game::GameHandler& gameHandler);
|
|
|
|
|
|
2026-03-12 20:23:36 -07:00
|
|
|
// Titles window
|
|
|
|
|
bool showTitlesWindow_ = false;
|
|
|
|
|
void renderTitlesWindow(game::GameHandler& gameHandler);
|
|
|
|
|
|
2026-03-12 20:28:03 -07:00
|
|
|
// Equipment Set Manager window
|
|
|
|
|
bool showEquipSetWindow_ = false;
|
|
|
|
|
void renderEquipSetWindow(game::GameHandler& gameHandler);
|
|
|
|
|
|
2026-03-12 02:31:12 -07:00
|
|
|
// GM Ticket window
|
feat: parse SMSG_GMTICKET_GETTICKET/SYSTEMSTATUS and SMSG_SPELLINSTAKILLLOG
Previously SMSG_GMTICKET_GETTICKET and SMSG_GMTICKET_SYSTEMSTATUS were
silently consumed. Now both are fully parsed:
- SMSG_GMTICKET_GETTICKET decodes all four status codes (no ticket,
open ticket, closed, suspended), extracts ticket text, age and
server-estimated wait time, and stores them on GameHandler.
- SMSG_GMTICKET_SYSTEMSTATUS shows a chat message when GM support
goes offline/online.
- Added requestGmTicket() (sends CMSG_GMTICKET_GETTICKET) called
automatically when the GM Ticket UI window is opened, so the player
sees their existing open ticket text and wait time on first open.
- GM Ticket UI window now shows current-ticket status bar, estimated
wait time, and hides the Delete button when no ticket is active.
Also implements SMSG_SPELLINSTAKILLLOG (previously silently consumed):
parses caster/victim/spellId for all expansions and emits combat text
when the local player is involved in an instant-kill spell event (e.g.
Execute, Obliterate).
2026-03-12 22:14:46 -07:00
|
|
|
bool showGmTicketWindow_ = false;
|
|
|
|
|
bool gmTicketWindowWasOpen_ = false; ///< Previous frame state; used to fire one-shot query
|
2026-03-12 02:31:12 -07:00
|
|
|
char gmTicketBuf_[2048] = {};
|
|
|
|
|
void renderGmTicketWindow(game::GameHandler& gameHandler);
|
2026-03-12 02:52:40 -07:00
|
|
|
|
2026-03-12 19:42:31 -07:00
|
|
|
// Pet rename modal (triggered from pet frame context menu)
|
|
|
|
|
bool petRenameOpen_ = false;
|
|
|
|
|
char petRenameBuf_[16] = {};
|
|
|
|
|
|
2026-03-12 02:52:40 -07:00
|
|
|
// Inspect window
|
|
|
|
|
bool showInspectWindow_ = false;
|
|
|
|
|
void renderInspectWindow(game::GameHandler& gameHandler);
|
2026-03-12 02:59:09 -07:00
|
|
|
|
2026-03-12 18:21:50 -07:00
|
|
|
// Readable text window (books / scrolls / notes)
|
|
|
|
|
bool showBookWindow_ = false;
|
|
|
|
|
int bookCurrentPage_ = 0;
|
|
|
|
|
void renderBookWindow(game::GameHandler& gameHandler);
|
|
|
|
|
|
2026-03-12 02:59:09 -07:00
|
|
|
// Threat window
|
|
|
|
|
bool showThreatWindow_ = false;
|
|
|
|
|
void renderThreatWindow(game::GameHandler& gameHandler);
|
2026-03-12 12:02:59 -07:00
|
|
|
|
|
|
|
|
// BG scoreboard window
|
|
|
|
|
bool showBgScoreboard_ = false;
|
|
|
|
|
void renderBgScoreboard(game::GameHandler& gameHandler);
|
2026-03-09 13:47:07 -07:00
|
|
|
uint8_t lfgRoles_ = 0x08; // default: DPS (0x02=tank, 0x04=healer, 0x08=dps)
|
|
|
|
|
uint32_t lfgSelectedDungeon_ = 861; // default: random dungeon (entry 861 = Random Dungeon WotLK)
|
|
|
|
|
|
2026-02-15 14:00:41 -08:00
|
|
|
// Mail compose state
|
|
|
|
|
char mailRecipientBuffer_[256] = "";
|
|
|
|
|
char mailSubjectBuffer_[256] = "";
|
|
|
|
|
char mailBodyBuffer_[2048] = "";
|
|
|
|
|
int mailComposeMoney_[3] = {0, 0, 0}; // gold, silver, copper
|
|
|
|
|
|
2026-03-11 21:19:47 -07:00
|
|
|
// Vendor search filter
|
|
|
|
|
char vendorSearchFilter_[128] = "";
|
|
|
|
|
|
2026-03-18 11:16:43 -07:00
|
|
|
// Vendor purchase confirmation for expensive items
|
|
|
|
|
bool vendorConfirmOpen_ = false;
|
|
|
|
|
uint64_t vendorConfirmGuid_ = 0;
|
|
|
|
|
uint32_t vendorConfirmItemId_ = 0;
|
|
|
|
|
uint32_t vendorConfirmSlot_ = 0;
|
|
|
|
|
uint32_t vendorConfirmQty_ = 1;
|
|
|
|
|
uint32_t vendorConfirmPrice_ = 0;
|
|
|
|
|
std::string vendorConfirmItemName_;
|
|
|
|
|
|
2026-03-18 11:58:01 -07:00
|
|
|
// Barber shop UI state
|
|
|
|
|
int barberHairStyle_ = 0;
|
|
|
|
|
int barberHairColor_ = 0;
|
|
|
|
|
int barberFacialHair_ = 0;
|
|
|
|
|
int barberOrigHairStyle_ = 0;
|
|
|
|
|
int barberOrigHairColor_ = 0;
|
|
|
|
|
int barberOrigFacialHair_ = 0;
|
|
|
|
|
bool barberInitialized_ = false;
|
|
|
|
|
|
2026-03-11 21:21:14 -07:00
|
|
|
// Trainer search filter
|
|
|
|
|
char trainerSearchFilter_[128] = "";
|
|
|
|
|
|
Implement bank, guild bank, and auction house systems
Add 27 new opcodes, packet builders/parsers, handler methods, inventory
extension with 28 bank slots + 7 bank bags, and UI windows for personal
bank, guild bank (6 tabs x 98 slots), and auction house (browse/sell/bid).
Fix Classic gossip parser to omit boxMoney/boxText fields not present in
Vanilla protocol, fix gossip icon labels with text-based NPC type detection,
and add Turtle WoW opcode mappings for bank and auction interactions.
2026-02-16 21:11:18 -08:00
|
|
|
// Auction house UI state
|
|
|
|
|
char auctionSearchName_[256] = "";
|
|
|
|
|
int auctionLevelMin_ = 0;
|
|
|
|
|
int auctionLevelMax_ = 0;
|
|
|
|
|
int auctionQuality_ = 0;
|
|
|
|
|
int auctionSellDuration_ = 2; // 0=12h, 1=24h, 2=48h
|
|
|
|
|
int auctionSellBid_[3] = {0, 0, 0}; // gold, silver, copper
|
|
|
|
|
int auctionSellBuyout_[3] = {0, 0, 0}; // gold, silver, copper
|
|
|
|
|
int auctionSelectedItem_ = -1;
|
2026-02-25 14:44:44 -08:00
|
|
|
int auctionSellSlotIndex_ = -1; // Selected backpack slot for selling
|
|
|
|
|
uint32_t auctionBrowseOffset_ = 0; // Pagination offset for browse results
|
|
|
|
|
int auctionItemClass_ = -1; // Item class filter (-1 = All)
|
|
|
|
|
int auctionItemSubClass_ = -1; // Item subclass filter (-1 = All)
|
2026-03-20 05:34:17 -07:00
|
|
|
bool auctionUsableOnly_ = false; // Filter to items usable by current class/level
|
Implement bank, guild bank, and auction house systems
Add 27 new opcodes, packet builders/parsers, handler methods, inventory
extension with 28 bank slots + 7 bank bags, and UI windows for personal
bank, guild bank (6 tabs x 98 slots), and auction house (browse/sell/bid).
Fix Classic gossip parser to omit boxMoney/boxText fields not present in
Vanilla protocol, fix gossip icon labels with text-based NPC type detection,
and add Turtle WoW opcode mappings for bank and auction interactions.
2026-02-16 21:11:18 -08:00
|
|
|
|
|
|
|
|
// Guild bank money input
|
|
|
|
|
int guildBankMoneyInput_[3] = {0, 0, 0}; // gold, silver, copper
|
|
|
|
|
|
2026-02-07 13:53:03 -08:00
|
|
|
// Left-click targeting: distinguish click from camera drag
|
|
|
|
|
glm::vec2 leftClickPressPos_ = glm::vec2(0.0f);
|
|
|
|
|
bool leftClickWasPress_ = false;
|
2026-02-17 17:23:42 -08:00
|
|
|
|
2026-03-31 09:18:17 +03:00
|
|
|
|
2026-03-18 12:17:00 -07:00
|
|
|
bool appearanceCallbackSet_ = false;
|
2026-03-14 08:31:08 -07:00
|
|
|
bool ghostOpacityStateKnown_ = false;
|
|
|
|
|
bool ghostOpacityLastState_ = false;
|
|
|
|
|
uint32_t ghostOpacityLastInstanceId_ = 0;
|
2026-03-31 09:18:17 +03:00
|
|
|
|
|
|
|
|
|
2026-03-17 16:34:39 -07:00
|
|
|
void renderWeatherOverlay(game::GameHandler& gameHandler);
|
2026-03-09 17:06:12 -07:00
|
|
|
|
2026-03-12 04:04:27 -07:00
|
|
|
// DPS / HPS meter
|
|
|
|
|
float dpsCombatAge_ = 0.0f; // seconds in current combat (for accurate early-combat DPS)
|
|
|
|
|
bool dpsWasInCombat_ = false;
|
2026-03-12 11:40:31 -07:00
|
|
|
float dpsEncounterDamage_ = 0.0f; // total player damage this combat
|
|
|
|
|
float dpsEncounterHeal_ = 0.0f; // total player healing this combat
|
|
|
|
|
size_t dpsLogSeenCount_ = 0; // log entries already scanned
|
2026-03-12 04:04:27 -07:00
|
|
|
|
2026-02-17 17:23:42 -08:00
|
|
|
public:
|
2026-03-12 21:24:42 -07:00
|
|
|
void openDungeonFinder() { showDungeonFinder_ = true; }
|
2026-03-31 09:18:17 +03:00
|
|
|
ToastManager& toastManager() { return toastManager_; }
|
2026-02-02 12:24:50 -08:00
|
|
|
};
|
|
|
|
|
|
2026-02-06 14:30:54 -08:00
|
|
|
} // namespace ui
|
|
|
|
|
} // namespace wowee
|