2026-02-02 12:24:50 -08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "game/game_handler.hpp"
|
|
|
|
|
#include "game/inventory.hpp"
|
2026-02-04 22:27:45 -08:00
|
|
|
#include "rendering/world_map.hpp"
|
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-02-06 14:30:54 -08:00
|
|
|
#include <GL/glew.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; }
|
|
|
|
|
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
|
|
|
|
|
*/
|
|
|
|
|
bool isChatInputActive() const { return chatInputActive; }
|
|
|
|
|
|
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:
|
|
|
|
|
// Chat state
|
|
|
|
|
char chatInputBuffer[512] = "";
|
2026-02-07 12:30:36 -08:00
|
|
|
char whisperTargetBuffer[256] = "";
|
2026-02-02 12:24:50 -08:00
|
|
|
bool chatInputActive = false;
|
2026-02-07 12:30:36 -08:00
|
|
|
int selectedChatType = 0; // 0=SAY, 1=YELL, 2=PARTY, 3=GUILD, 4=WHISPER
|
|
|
|
|
int lastChatType = 0; // Track chat type changes
|
2026-02-06 18:34:45 -08:00
|
|
|
bool chatInputMoveCursorToEnd = false;
|
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;
|
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-02-02 12:24:50 -08:00
|
|
|
bool refocusChatInput = false;
|
2026-02-06 18:34:45 -08:00
|
|
|
bool chatWindowLocked = true;
|
|
|
|
|
ImVec2 chatWindowPos_ = ImVec2(0.0f, 0.0f);
|
|
|
|
|
bool chatWindowPosInit_ = false;
|
2026-02-05 16:01:38 -08:00
|
|
|
bool showEscapeMenu = false;
|
|
|
|
|
bool showEscapeSettingsNotice = false;
|
2026-02-05 16:11:00 -08:00
|
|
|
bool showSettingsWindow = false;
|
|
|
|
|
bool settingsInit = false;
|
|
|
|
|
bool pendingFullscreen = false;
|
|
|
|
|
bool pendingVsync = false;
|
|
|
|
|
int pendingResIndex = 0;
|
2026-02-07 16:00:57 -08:00
|
|
|
bool pendingShadows = false;
|
Implement comprehensive audio control panel with tabbed settings interface
Adds complete audio volume controls for all 11 audio systems with master volume. Reorganizes settings window into Video, Audio, and Gameplay tabs for better UX.
Audio Features:
- Master volume control affecting all audio systems
- Individual volume sliders for: Music, Ambient, UI, Combat, Spell, Movement, Footsteps, NPC Voices, Mounts, Activity sounds
- Real-time volume adjustment with master volume multiplier
- Restore defaults button per tab
Technical Changes:
- Added getVolumeScale() getters to all audio managers
- Integrated all 10 audio managers into renderer (UI, Combat, Spell, Movement added)
- Expanded game_screen.hpp with 11 pending volume variables
- Reorganized settings window using ImGui tab bars (Video/Audio/Gameplay)
- Audio settings uses scrollable child window for 11 volume controls
- Settings window expanded to 520x720px to accommodate comprehensive controls
2026-02-09 17:07:22 -08:00
|
|
|
int pendingMasterVolume = 100;
|
2026-02-05 17:32:21 -08:00
|
|
|
int pendingMusicVolume = 30;
|
Implement comprehensive audio control panel with tabbed settings interface
Adds complete audio volume controls for all 11 audio systems with master volume. Reorganizes settings window into Video, Audio, and Gameplay tabs for better UX.
Audio Features:
- Master volume control affecting all audio systems
- Individual volume sliders for: Music, Ambient, UI, Combat, Spell, Movement, Footsteps, NPC Voices, Mounts, Activity sounds
- Real-time volume adjustment with master volume multiplier
- Restore defaults button per tab
Technical Changes:
- Added getVolumeScale() getters to all audio managers
- Integrated all 10 audio managers into renderer (UI, Combat, Spell, Movement added)
- Expanded game_screen.hpp with 11 pending volume variables
- Reorganized settings window using ImGui tab bars (Video/Audio/Gameplay)
- Audio settings uses scrollable child window for 11 volume controls
- Settings window expanded to 520x720px to accommodate comprehensive controls
2026-02-09 17:07:22 -08:00
|
|
|
int pendingAmbientVolume = 100;
|
|
|
|
|
int pendingUiVolume = 100;
|
|
|
|
|
int pendingCombatVolume = 100;
|
|
|
|
|
int pendingSpellVolume = 100;
|
|
|
|
|
int pendingMovementVolume = 100;
|
|
|
|
|
int pendingFootstepVolume = 100;
|
|
|
|
|
int pendingNpcVoiceVolume = 100;
|
|
|
|
|
int pendingMountVolume = 100;
|
|
|
|
|
int pendingActivityVolume = 100;
|
2026-02-05 17:51:14 -08:00
|
|
|
float pendingMouseSensitivity = 0.2f;
|
|
|
|
|
bool pendingInvertMouse = false;
|
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
|
|
|
int pendingUiOpacity = 65;
|
2026-02-09 01:13:56 -08:00
|
|
|
bool pendingMinimapRotate = false;
|
2026-02-06 20:19:39 -08:00
|
|
|
|
|
|
|
|
// UI element transparency (0.0 = fully transparent, 1.0 = fully opaque)
|
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
|
|
|
float uiOpacity_ = 0.65f;
|
2026-02-09 01:13:56 -08:00
|
|
|
bool minimapRotate_ = false;
|
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 chat window
|
|
|
|
|
*/
|
|
|
|
|
void renderChatWindow(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Send chat message
|
|
|
|
|
*/
|
|
|
|
|
void sendChatMessage(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get chat type name
|
|
|
|
|
*/
|
|
|
|
|
const char* getChatTypeName(game::ChatType type) const;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get chat type color
|
|
|
|
|
*/
|
|
|
|
|
ImVec4 getChatTypeColor(game::ChatType type) const;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Render player unit frame (top-left)
|
|
|
|
|
*/
|
|
|
|
|
void renderPlayerFrame(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Render target frame
|
|
|
|
|
*/
|
|
|
|
|
void renderTargetFrame(game::GameHandler& gameHandler);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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);
|
2026-02-05 12:07:58 -08:00
|
|
|
void renderXpBar(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);
|
|
|
|
|
void renderCombatText(game::GameHandler& gameHandler);
|
|
|
|
|
void renderPartyFrames(game::GameHandler& gameHandler);
|
|
|
|
|
void renderGroupInvitePopup(game::GameHandler& gameHandler);
|
|
|
|
|
void renderBuffBar(game::GameHandler& gameHandler);
|
|
|
|
|
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-02-07 16:59:20 -08:00
|
|
|
void renderTaxiWindow(game::GameHandler& gameHandler);
|
2026-02-06 17:27:20 -08:00
|
|
|
void renderDeathScreen(game::GameHandler& gameHandler);
|
2026-02-07 23:12:24 -08:00
|
|
|
void renderResurrectDialog(game::GameHandler& gameHandler);
|
2026-02-05 16:01:38 -08:00
|
|
|
void renderEscapeMenu();
|
2026-02-05 16:11:00 -08:00
|
|
|
void renderSettingsWindow();
|
2026-02-06 20:10:10 -08:00
|
|
|
void renderQuestMarkers(game::GameHandler& gameHandler);
|
|
|
|
|
void renderMinimapMarkers(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-04 22:27:45 -08:00
|
|
|
rendering::WorldMap worldMap;
|
2026-02-05 15:07:13 -08:00
|
|
|
|
|
|
|
|
bool actionSpellDbAttempted = false;
|
|
|
|
|
bool actionSpellDbLoaded = false;
|
|
|
|
|
std::unordered_map<uint32_t, std::string> actionSpellNames;
|
2026-02-06 14:30:54 -08:00
|
|
|
|
|
|
|
|
// Spell icon cache: spellId -> GL texture ID
|
|
|
|
|
std::unordered_map<uint32_t, GLuint> spellIconCache_;
|
|
|
|
|
// 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;
|
|
|
|
|
GLuint getSpellIcon(uint32_t spellId, pipeline::AssetManager* am);
|
2026-02-06 19:24:44 -08:00
|
|
|
|
|
|
|
|
// Action bar drag state (-1 = not dragging)
|
|
|
|
|
int actionBarDragSlot_ = -1;
|
|
|
|
|
GLuint actionBarDragIcon_ = 0;
|
2026-02-07 13:53:03 -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
|
|
|
static std::string getSettingsPath();
|
|
|
|
|
|
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-02 12:24:50 -08:00
|
|
|
};
|
|
|
|
|
|
2026-02-06 14:30:54 -08:00
|
|
|
} // namespace ui
|
|
|
|
|
} // namespace wowee
|