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;
|
2026-02-05 17:32:21 -08:00
|
|
|
int pendingMusicVolume = 30;
|
|
|
|
|
int pendingSfxVolume = 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-07 20:51:53 -08:00
|
|
|
bool pendingMinimapRotate = true;
|
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-07 20:51:53 -08:00
|
|
|
bool minimapRotate_ = true;
|
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-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-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
|