diff options
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 62 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.cpp | 55 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 39 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
4 files changed, 132 insertions, 26 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 0f10266b39b..c7e1c833a5a 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -415,35 +415,47 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS)) AddQuestLevelToTitle(questLogTitle, quest->GetQuestLevel()); - WorldPacket data(SMSG_QUESTGIVER_QUEST_DETAILS, 100); // guess size - data << npcGUID; - data << _session->GetPlayer()->GetDivider(); - data << uint32(quest->GetQuestId()); - data << questLogTitle; - data << questLogDescription; - data << questDescription; - data << portraitGiverText; // 4.x - data << portraitGiverName; // 4.x - data << portraitTurnInText; // 4.x - data << portraitTurnInName; // 4.x - data << uint32(quest->GetQuestGiverPortrait()); // 4.x - data << uint32(quest->GetQuestTurnInPortrait()); // 4.x - data << uint8(activateAccept ? 1 : 0); // auto finish - data << uint32(quest->GetFlags()); // 3.3.3 questFlags - data << uint32(quest->GetSuggestedPlayers()); - data << uint8(0); // IsFinished? value is sent back to server in quest accept packet - data << uint8(0); // 4.x FIXME: Starts at AreaTrigger - data << uint32(quest->GetSrcSpell()); // 4.x + WorldPackets::Quest::QuestGiverQuestDetails packet; + packet.QuestGiverGUID = npcGUID; + packet.InformUnit = _session->GetPlayer()->GetDivider(); + packet.QuestID = quest->GetQuestId(); + packet.QuestTitle = questLogTitle; + packet.LogDescription = questLogDescription; + packet.DescriptionText = questDescription; + packet.PortraitGiverText = portraitGiverText; + packet.PortraitGiverName = portraitGiverName; + packet.PortraitTurnInText = portraitTurnInText; + packet.PortraitTurnInName = portraitTurnInName; + packet.PortraitGiver = quest->GetQuestGiverPortrait(); + packet.PortraitTurnIn = quest->GetQuestTurnInPortrait(); + packet.DisplayPopup = activateAccept; + packet.QuestFlags[0] = quest->GetFlags(); + packet.QuestFlags[1] = quest->GetFlagsEx(); + packet.SuggestedPartyMembers = quest->GetSuggestedPlayers(); + + if (quest->GetSrcSpell()) + packet.LearnSpells.push_back(quest->GetSrcSpell()); - quest->BuildExtraQuestInfo(data, _session->GetPlayer()); + quest->BuildQuestRewards(packet.Rewards, _session->GetPlayer()); - data << uint32(QUEST_EMOTE_COUNT); - for (uint8 i = 0; i < QUEST_EMOTE_COUNT; ++i) + packet.DescEmotes.resize(QUEST_EMOTE_COUNT); + for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) { - data << uint32(quest->DetailsEmote[i]); - data << uint32(quest->DetailsEmoteDelay[i]); // DetailsEmoteDelay (in ms) + packet.DescEmotes[i].Type = quest->DetailsEmote[i]; + packet.DescEmotes[i].Delay = quest->DetailsEmoteDelay[i]; } - _session->SendPacket(&data); + + QuestObjectives const& objs = quest->GetObjectives(); + packet.Objectives.resize(objs.size()); + for (uint32 i = 0; i < objs.size(); ++i) + { + packet.Objectives[i].ID = objs[i].ID; + packet.Objectives[i].ObjectID = objs[i].ObjectID; + packet.Objectives[i].Amount = objs[i].Amount; + packet.Objectives[i].Type = objs[i].Type; + } + + _session->SendPacket(packet.Write()); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPC=%s, questid=%u", npcGUID.ToString().c_str(), quest->GetQuestId()); } diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 34fc1a6261a..fd7320eac7e 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -319,3 +319,58 @@ void WorldPackets::Quest::QuestGiverCompleteQuest::Read() _worldPacket >> QuestID; FromScript = _worldPacket.ReadBit(); } + +WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() +{ + _worldPacket << QuestGiverGUID; + _worldPacket << InformUnit; + _worldPacket << QuestID; + _worldPacket << QuestPackageID; + _worldPacket << PortraitGiver; + _worldPacket << SuggestedPartyMembers; + _worldPacket << QuestFlags[0]; // Flags + _worldPacket << QuestFlags[1]; // FlagsEx + _worldPacket << PortraitTurnIn; + _worldPacket << int32(LearnSpells.size()); + _worldPacket << Rewards; // WorldPackets::Quest::QuestRewards + _worldPacket << int32(DescEmotes.size()); + _worldPacket << int32(Objectives.size()); + + for (int32 spell : LearnSpells) + _worldPacket << spell; + + for (WorldPackets::Quest::QuestDescEmote const& emote : DescEmotes) + { + _worldPacket << emote.Type; + _worldPacket << emote.Delay; + } + + for (WorldPackets::Quest::QuestObjectiveSimple const& obj : Objectives) + { + _worldPacket << obj.ID; + _worldPacket << obj.ObjectID; + _worldPacket << obj.Amount; + _worldPacket << obj.Type; + } + + _worldPacket.WriteBits(QuestTitle.size(), 9); + _worldPacket.WriteBits(DescriptionText.size(), 12); + _worldPacket.WriteBits(LogDescription.size(), 12); + _worldPacket.WriteBits(PortraitTurnInText.size(), 10); + _worldPacket.WriteBits(PortraitTurnInName.size(), 8); + _worldPacket.WriteBits(PortraitGiverText.size(), 10); + _worldPacket.WriteBits(PortraitGiverName.size(), 8); + _worldPacket.WriteBit(DisplayPopup); + _worldPacket.WriteBit(StartCheat); + _worldPacket.WriteBit(AutoLaunched); + + _worldPacket.WriteString(QuestTitle); + _worldPacket.WriteString(DescriptionText); + _worldPacket.WriteString(LogDescription); + _worldPacket.WriteString(PortraitTurnInText); + _worldPacket.WriteString(PortraitTurnInName); + _worldPacket.WriteString(PortraitGiverText); + _worldPacket.WriteString(PortraitGiverName); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 94d4f5173cb..9aa77da47f4 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -306,6 +306,45 @@ namespace WorldPackets int32 QuestID = 0; bool FromScript = false; // 0 - standart complete quest mode with npc, 1 - auto-complete mode }; + + struct QuestObjectiveSimple + { + int32 ID = 0; + int32 ObjectID = 0; + int32 Amount = 0; + uint8 Type = 0; + }; + + class QuestGiverQuestDetails final : public ServerPacket + { + public: + QuestGiverQuestDetails() : ServerPacket(SMSG_QUESTGIVER_QUEST_DETAILS, 1000) { } + + WorldPacket const* Write() override; + + ObjectGuid QuestGiverGUID; + ObjectGuid InformUnit; + int32 QuestID = 0; + int32 QuestPackageID = 0; + uint32 QuestFlags[2] = {}; + int32 SuggestedPartyMembers = 0; + QuestRewards Rewards; + std::vector<QuestObjectiveSimple> Objectives; + std::vector<QuestDescEmote> DescEmotes; + std::vector<int32> LearnSpells; + int32 PortraitTurnIn = 0; + int32 PortraitGiver = 0; + std::string PortraitTurnInText; + std::string PortraitTurnInName; + std::string PortraitGiverText; + std::string PortraitGiverName; + std::string QuestTitle; + std::string LogDescription; + std::string DescriptionText; + bool DisplayPopup = false; + bool StartCheat = false; + bool AutoLaunched = false; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3b5e7afa996..85a639b6161 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1226,7 +1226,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_OFFER_REWARD, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_DETAILS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); |