feat: implement quest sharing with party via CMSG_PUSHQUESTTOPARTY

This commit is contained in:
Kelsi 2026-03-12 09:56:38 -07:00
parent e781ede5b2
commit 71b0a18238
4 changed files with 41 additions and 1 deletions

View file

@ -1252,6 +1252,7 @@ public:
};
const std::vector<QuestLogEntry>& getQuestLog() const { return questLog_; }
void abandonQuest(uint32_t questId);
void shareQuestWithParty(uint32_t questId); // CMSG_PUSHQUESTTOPARTY
bool requestQuestQuery(uint32_t questId, bool force = false);
bool isQuestTracked(uint32_t questId) const { return trackedQuestIds_.count(questId) > 0; }
void setQuestTracked(uint32_t questId, bool tracked) {

View file

@ -16096,6 +16096,28 @@ void GameHandler::abandonQuest(uint32_t questId) {
gossipPois_.end());
}
void GameHandler::shareQuestWithParty(uint32_t questId) {
if (state != WorldState::IN_WORLD || !socket) {
addSystemChatMessage("Cannot share quest: not in world.");
return;
}
if (!isInGroup()) {
addSystemChatMessage("You must be in a group to share a quest.");
return;
}
network::Packet pkt(wireOpcode(Opcode::CMSG_PUSHQUESTTOPARTY));
pkt.writeUInt32(questId);
socket->send(pkt);
// Local feedback: find quest title
for (const auto& q : questLog_) {
if (q.questId == questId && !q.title.empty()) {
addSystemChatMessage("Sharing quest: " + q.title);
return;
}
}
addSystemChatMessage("Quest shared.");
}
void GameHandler::handleQuestRequestItems(network::Packet& packet) {
QuestRequestItemsData data;
if (!QuestRequestItemsParser::parse(packet, data)) {

View file

@ -6833,6 +6833,11 @@ void GameScreen::renderQuestObjectiveTracker(game::GameHandler& gameHandler) {
gameHandler.setQuestTracked(q.questId, true);
}
}
if (gameHandler.isInGroup() && !q.complete) {
if (ImGui::MenuItem("Share Quest")) {
gameHandler.shareQuestWithParty(q.questId);
}
}
if (!q.complete) {
ImGui::Separator();
if (ImGui::MenuItem("Abandon Quest")) {

View file

@ -377,6 +377,11 @@ void QuestLogScreen::render(game::GameHandler& gameHandler, InventoryScreen& inv
if (ImGui::MenuItem(tracked ? "Untrack" : "Track")) {
gameHandler.setQuestTracked(q.questId, !tracked);
}
if (gameHandler.isInGroup() && !q.complete) {
if (ImGui::MenuItem("Share Quest")) {
gameHandler.shareQuestWithParty(q.questId);
}
}
if (!q.complete) {
ImGui::Separator();
if (ImGui::MenuItem("Abandon Quest")) {
@ -559,12 +564,19 @@ void QuestLogScreen::render(game::GameHandler& gameHandler, InventoryScreen& inv
}
}
// Track / Abandon buttons
// Track / Share / Abandon buttons
ImGui::Separator();
bool isTracked = gameHandler.isQuestTracked(sel.questId);
if (ImGui::Button(isTracked ? "Untrack" : "Track", ImVec2(100.0f, 0.0f))) {
gameHandler.setQuestTracked(sel.questId, !isTracked);
}
if (gameHandler.isInGroup() && !sel.complete) {
ImGui::SameLine();
if (ImGui::Button("Share", ImVec2(80.0f, 0.0f))) {
gameHandler.shareQuestWithParty(sel.questId);
}
if (ImGui::IsItemHovered()) ImGui::SetTooltip("Share this quest with your party");
}
if (!sel.complete) {
ImGui::SameLine();
if (ImGui::Button("Abandon Quest", ImVec2(150.0f, 0.0f))) {