diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index ae2b5622..d6df5254 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -1031,6 +1031,8 @@ public: if (raidTargetGuids_[i] == guid) return static_cast(i); return 0xFF; } + // Set or clear a raid mark on a guid (icon 0-7, or 0xFF to clear) + void setRaidMark(uint64_t guid, uint8_t icon); // ---- LFG / Dungeon Finder ---- enum class LfgState : uint8_t { diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index dc33651f..b2b51503 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -10546,6 +10546,29 @@ void GameHandler::clearMainAssist() { LOG_INFO("Cleared main assist"); } +void GameHandler::setRaidMark(uint64_t guid, uint8_t icon) { + if (state != WorldState::IN_WORLD || !socket) return; + + static const char* kMarkNames[] = { + "Star", "Circle", "Diamond", "Triangle", "Moon", "Square", "Cross", "Skull" + }; + + if (icon == 0xFF) { + // Clear mark: find which slot this guid holds and send 0 GUID + for (int i = 0; i < 8; ++i) { + if (raidTargetGuids_[i] == guid) { + auto packet = RaidTargetUpdatePacket::build(static_cast(i), 0); + socket->send(packet); + break; + } + } + } else if (icon < 8) { + auto packet = RaidTargetUpdatePacket::build(icon, guid); + socket->send(packet); + LOG_INFO("Set raid mark %s on guid %llu", kMarkNames[icon], (unsigned long long)guid); + } +} + void GameHandler::requestRaidInfo() { if (state != WorldState::IN_WORLD || !socket) { LOG_WARNING("Cannot request raid info: not in world or not connected"); diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 08475d1e..959fb6a1 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -2594,6 +2594,21 @@ void GameScreen::renderTargetFrame(game::GameHandler& gameHandler) { gameHandler.addIgnore(name); } } + ImGui::Separator(); + if (ImGui::BeginMenu("Set Raid Mark")) { + static const char* kRaidMarkNames[] = { + "{*} Star", "{O} Circle", "{<>} Diamond", "{^} Triangle", + "{)} Moon", "{ } Square", "{x} Cross", "{8} Skull" + }; + for (int mi = 0; mi < 8; ++mi) { + if (ImGui::MenuItem(kRaidMarkNames[mi])) + gameHandler.setRaidMark(tGuid, static_cast(mi)); + } + ImGui::Separator(); + if (ImGui::MenuItem("Clear Mark")) + gameHandler.setRaidMark(tGuid, 0xFF); + ImGui::EndMenu(); + } ImGui::EndPopup(); } @@ -6258,6 +6273,21 @@ void GameScreen::renderPartyFrames(game::GameHandler& gameHandler) { if (ImGui::MenuItem("Kick from Raid")) gameHandler.uninvitePlayer(m.name); } + ImGui::Separator(); + if (ImGui::BeginMenu("Set Raid Mark")) { + static const char* kRaidMarkNames[] = { + "{*} Star", "{O} Circle", "{<>} Diamond", "{^} Triangle", + "{)} Moon", "{ } Square", "{x} Cross", "{8} Skull" + }; + for (int mi = 0; mi < 8; ++mi) { + if (ImGui::MenuItem(kRaidMarkNames[mi])) + gameHandler.setRaidMark(m.guid, static_cast(mi)); + } + ImGui::Separator(); + if (ImGui::MenuItem("Clear Mark")) + gameHandler.setRaidMark(m.guid, 0xFF); + ImGui::EndMenu(); + } ImGui::EndPopup(); } ImGui::PopID(); @@ -6438,6 +6468,21 @@ void GameScreen::renderPartyFrames(game::GameHandler& gameHandler) { gameHandler.uninvitePlayer(member.name); } } + ImGui::Separator(); + if (ImGui::BeginMenu("Set Raid Mark")) { + static const char* kRaidMarkNames[] = { + "{*} Star", "{O} Circle", "{<>} Diamond", "{^} Triangle", + "{)} Moon", "{ } Square", "{x} Cross", "{8} Skull" + }; + for (int mi = 0; mi < 8; ++mi) { + if (ImGui::MenuItem(kRaidMarkNames[mi])) + gameHandler.setRaidMark(member.guid, static_cast(mi)); + } + ImGui::Separator(); + if (ImGui::MenuItem("Clear Mark")) + gameHandler.setRaidMark(member.guid, 0xFF); + ImGui::EndMenu(); + } ImGui::EndPopup(); }