diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 86 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.cpp | 39 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 37 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 |
5 files changed, 116 insertions, 50 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 975a4e74a81..186e6c53c96 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -689,65 +689,55 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS)) AddQuestLevelToTitle(questTitle, quest->GetQuestLevel()); - WorldPacket data(SMSG_QUESTGIVER_REQUEST_ITEMS, 50); // guess size - /*data << npcGUID; - data << uint32(quest->GetQuestId()); - data << questTitle; - data << requestItemsText; + WorldPackets::Quest::QuestGiverRequestItems packet; + packet.QuestGiverGUID = npcGUID; + + // Is there a better way? what about game objects? + if (Creature const* creature = sObjectAccessor->GetCreature(*_session->GetPlayer(), npcGUID)) + packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry; - data << uint32(0); // unknown + packet.QuestID = quest->GetQuestId(); if (canComplete) - data << quest->GetCompleteEmote(); + { + packet.CompEmoteDelay = quest->EmoteOnCompleteDelay; + packet.CompEmoteType = quest->EmoteOnComplete; + } else - data << quest->GetIncompleteEmote(); - - // Close Window after cancel - data << uint32(closeOnCancel); - - data << uint32(quest->GetFlags()); // 3.3.3 questFlags - data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum - - // Required Money - data << uint32(quest->GetRewOrReqMoney() < 0 ? -quest->GetRewOrReqMoney() : 0); - - data << uint32(quest->GetReqItemsCount()); - for (QuestObjective const& obj : quest->Objectives) { - if (obj.Type != QUEST_OBJECTIVE_ITEM) - continue; - - data << uint32(obj.ObjectID); - data << uint32(obj.Amount); - - if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(obj.ObjectID)) - data << uint32(itemTemplate->DisplayInfoID); - - else - data << uint32(0); + packet.CompEmoteDelay = quest->EmoteOnIncompleteDelay; + packet.CompEmoteType = quest->EmoteOnIncomplete; } - data << uint32(quest->GetReqCurrencyCount()); - for (int i = 0; i < QUEST_REQUIRED_CURRENCY_COUNT; ++i) - { - if (!quest->RequiredCurrencyId[i]) - continue; + packet.QuestFlags[0] = quest->GetFlags(); + packet.QuestFlags[1] = quest->GetFlagsEx(); + packet.SuggestPartyMembers = quest->GetSuggestedPlayers(); + packet.StatusFlags = 0xDF; // Unk, send common value - data << uint32(quest->RequiredCurrencyId[i]); - data << uint32(quest->RequiredCurrencyCount[i]); + packet.MoneyToGet = 0; + for (QuestObjective const& obj : quest->GetObjectives()) + { + switch (obj.Type) + { + case QUEST_OBJECTIVE_ITEM: + packet.Collect.push_back(WorldPackets::Quest::QuestObjectiveCollect(obj.ObjectID, obj.Amount)); + break; + case QUEST_OBJECTIVE_CURRENCY: + packet.Currency.push_back(WorldPackets::Quest::QuestCurrency(obj.ObjectID, obj.Amount)); + break; + case QUEST_OBJECTIVE_MONEY: + packet.MoneyToGet += obj.Amount; + break; + default: + break; + } } - if (!canComplete) // Experimental; there are 6 similar flags, if any of them - data << uint32(0x00); // of them is 0 player can't complete quest (still unknown meaning) - else - data << uint32(0x02); - - data << uint32(0x04); - data << uint32(0x08); - data << uint32(0x10); - data << uint32(0x40);*/ + packet.AutoLaunched = closeOnCancel; + packet.QuestTitle = questTitle; + packet.CompletionText = requestItemsText; - _session->SendPacket(&data); + _session->SendPacket(packet.Write()); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS 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 fd7320eac7e..5003b49dc2f 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -374,3 +374,42 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write() +{ + _worldPacket << QuestGiverGUID; + _worldPacket << QuestGiverCreatureID; + _worldPacket << QuestID; + _worldPacket << CompEmoteDelay; + _worldPacket << CompEmoteType; + _worldPacket << QuestFlags[0]; + _worldPacket << QuestFlags[1]; + _worldPacket << SuggestPartyMembers; + _worldPacket << MoneyToGet; + _worldPacket << int32(Collect.size()); + _worldPacket << int32(Currency.size()); + _worldPacket << StatusFlags; + + for (QuestObjectiveCollect const& obj : Collect) + { + _worldPacket << obj.ObjectID; + _worldPacket << obj.Amount; + } + + for (QuestCurrency const& cur : Currency) + { + _worldPacket << cur.CurrencyID; + _worldPacket << cur.Amount; + } + + _worldPacket.WriteBit(AutoLaunched); + _worldPacket.FlushBits(); + + _worldPacket.WriteBits(QuestTitle.size(), 9); + _worldPacket.WriteBits(CompletionText.size(), 12); + + _worldPacket.WriteString(QuestTitle); + _worldPacket.WriteString(CompletionText); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 66f97dcfc30..2d42d5990f7 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -345,6 +345,43 @@ namespace WorldPackets bool StartCheat = false; bool AutoLaunched = false; }; + + struct QuestObjectiveCollect + { + QuestObjectiveCollect(int32 objectID = 0, int32 amount = 0) : ObjectID(objectID), Amount(amount) { } + int32 ObjectID; + int32 Amount; + }; + + struct QuestCurrency + { + QuestCurrency(int32 currencyID = 0, int32 amount = 0) : CurrencyID(currencyID), Amount(amount) { } + int32 CurrencyID; + int32 Amount; + }; + + class QuestGiverRequestItems final : public ServerPacket + { + public: + QuestGiverRequestItems() : ServerPacket(SMSG_QUESTGIVER_REQUEST_ITEMS, 300) { } + + WorldPacket const* Write() override; + + ObjectGuid QuestGiverGUID; + int32 QuestGiverCreatureID = 0; + int32 QuestID = 0; + int32 CompEmoteDelay = 0; + int32 CompEmoteType = 0; + bool AutoLaunched = false; + int32 SuggestPartyMembers = 0; + int32 MoneyToGet = 0; + std::vector<QuestObjectiveCollect> Collect; + std::vector<QuestCurrency> Currency; + int32 StatusFlags = 0; + uint32 QuestFlags[2] = {}; + std::string QuestTitle; + std::string CompletionText; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 6919d457ecb..cbc98dbef3c 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1232,7 +1232,7 @@ void OpcodeTable::Initialize() 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTLOG_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 0c8f0569da8..4c84d7b47f4 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1237,7 +1237,7 @@ enum OpcodeServer : uint32 SMSG_QUESTGIVER_QUEST_FAILED = 0xBADD, SMSG_QUESTGIVER_QUEST_INVALID = 0xBADD, SMSG_QUESTGIVER_QUEST_LIST = 0xBADD, - SMSG_QUESTGIVER_REQUEST_ITEMS = 0xBADD, + SMSG_QUESTGIVER_REQUEST_ITEMS = 0x17B8, SMSG_QUESTGIVER_STATUS = 0x1567, SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x17C6, SMSG_QUESTLOG_FULL = 0xBADD, |