Add spellbook, fix WMO floor clipping, and polish UI/visuals

- Add spellbook screen (P key) with Spell.dbc name lookup and action bar assignment
- Default Attack and Hearthstone spells available in single player
- Fix WMO floor clipping (gryphon roost) by tightening ceiling rejection threshold
- Darken ocean water, increase wave motion and opacity
- Add M2 model distance fade-in to prevent pop-in
- Reposition chat window, add slash/enter key focus
- Remove debug key commands (keep only F1 perf HUD, N minimap)
- Performance: return chat history by const ref, use deque for O(1) pop_front
This commit is contained in:
Kelsi 2026-02-04 11:31:08 -08:00
parent c49bb58e47
commit 4bc5064515
17 changed files with 486 additions and 431 deletions

View file

@ -757,11 +757,10 @@ bool MessageChatParser::parse(network::Packet& packet, MessageChatData& data) {
// Read sender name length + name
uint32_t nameLen = packet.readUInt32();
if (nameLen > 0 && nameLen < 256) {
std::vector<char> nameBuffer(nameLen);
data.senderName.resize(nameLen);
for (uint32_t i = 0; i < nameLen; ++i) {
nameBuffer[i] = static_cast<char>(packet.readUInt8());
data.senderName[i] = static_cast<char>(packet.readUInt8());
}
data.senderName = std::string(nameBuffer.begin(), nameBuffer.end());
}
// Read receiver GUID (usually 0 for monsters)
@ -798,11 +797,10 @@ bool MessageChatParser::parse(network::Packet& packet, MessageChatData& data) {
// Read message
if (messageLen > 0 && messageLen < 8192) {
std::vector<char> msgBuffer(messageLen);
data.message.resize(messageLen);
for (uint32_t i = 0; i < messageLen; ++i) {
msgBuffer[i] = static_cast<char>(packet.readUInt8());
data.message[i] = static_cast<char>(packet.readUInt8());
}
data.message = std::string(msgBuffer.begin(), msgBuffer.end());
}
// Read chat tag