From 633cfee22b7641a4c0b4d02b155b39b02e4063b4 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sat, 1 Feb 2020 19:54:38 +0100 Subject: [PATCH] Core/Packets: convert SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE to packet class and fix emote field order in QuestGiverQuestDetails * fixed quest packet header naming typos --- .../game/Entities/Creature/GossipDef.cpp | 71 +++++++------------ src/server/game/Quests/QuestDef.cpp | 60 ---------------- src/server/game/Quests/QuestDef.h | 1 - .../game/Server/Packets/QuestPackets.cpp | 32 ++++++++- src/server/game/Server/Packets/QuestPackets.h | 35 ++++++++- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.h | 2 +- 7 files changed, 92 insertions(+), 111 deletions(-) diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 9ff688fb327..200c75366c2 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -628,66 +628,49 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUID, bool autoLaunched) const { - std::string questTitle = quest->GetTitle(); - std::string questOfferRewardText = quest->GetOfferRewardText(); - std::string questGiverTextWindow = quest->GetQuestGiverTextWindow(); - std::string questGiverTargetName = quest->GetQuestGiverTargetName(); - std::string questTurnTextWindow = quest->GetQuestTurnTextWindow(); - std::string questTurnTargetName = quest->GetQuestTurnTargetName(); + WorldPackets::Quest::QuestGiverOfferRewardMessage packet; + + packet.QuestTitle = quest->GetTitle(); + packet.RewardText = quest->GetOfferRewardText(); + packet.PortraitGiverText = quest->GetQuestGiverTextWindow(); + packet.PortraitGiverName = quest->GetQuestGiverTargetName(); + packet.PortraitTurnInText = quest->GetQuestTurnTextWindow(); + packet.PortraitTurnInName = quest->GetQuestTurnTargetName(); LocaleConstant localeConstant = _session->GetSessionDbLocaleIndex(); if (localeConstant != LOCALE_enUS) { if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId())) { - ObjectMgr::GetLocaleString(localeData->Title, localeConstant, questTitle); - ObjectMgr::GetLocaleString(localeData->OfferRewardText, localeConstant, questOfferRewardText); - ObjectMgr::GetLocaleString(localeData->QuestGiverTextWindow, localeConstant, questGiverTextWindow); - ObjectMgr::GetLocaleString(localeData->QuestGiverTargetName, localeConstant, questGiverTargetName); - ObjectMgr::GetLocaleString(localeData->QuestTurnTextWindow, localeConstant, questTurnTextWindow); - ObjectMgr::GetLocaleString(localeData->QuestTurnTargetName, localeConstant, questTurnTargetName); + ObjectMgr::GetLocaleString(localeData->Title, localeConstant, packet.QuestTitle); + ObjectMgr::GetLocaleString(localeData->OfferRewardText, localeConstant, packet.RewardText); + ObjectMgr::GetLocaleString(localeData->QuestGiverTextWindow, localeConstant, packet.PortraitGiverText); + ObjectMgr::GetLocaleString(localeData->QuestGiverTargetName, localeConstant, packet.PortraitGiverName); + ObjectMgr::GetLocaleString(localeData->QuestTurnTextWindow, localeConstant, packet.PortraitTurnInText); + ObjectMgr::GetLocaleString(localeData->QuestTurnTargetName, localeConstant, packet.PortraitTurnInName); } } if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS)) - AddQuestLevelToTitle(questTitle, quest->GetQuestLevel()); + AddQuestLevelToTitle(packet.QuestTitle, quest->GetQuestLevel()); - WorldPacket data(SMSG_QUESTGIVER_OFFER_REWARD, 50); // guess size - data << uint64(npcGUID); - data << uint32(quest->GetQuestId()); - data << questTitle; - data << questOfferRewardText; + WorldPackets::Quest::QuestGiverOfferReward& offer = packet.QuestData; - data << questGiverTextWindow; - data << questGiverTargetName; - data << questTurnTextWindow; - data << questTurnTargetName; - data << uint32(quest->GetQuestGiverPortrait()); - data << uint32(quest->GetQuestTurnInPortrait()); + quest->BuildQuestRewards(offer.Rewards, _session->GetPlayer()); + offer.QuestGiverGUID = npcGUID; + offer.QuestID = quest->GetQuestId(); + offer.AutoLaunched = autoLaunched; + offer.SuggestedPartyMembers = quest->GetSuggestedPlayers(); - data << uint8(autoLaunched); // Auto Finish - data << uint32(quest->GetFlags()); // 3.3.3 questFlags - data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum + for (uint32 i = 0; i < QUEST_EMOTE_COUNT && quest->OfferRewardEmote[i]; ++i) + offer.Emotes.emplace_back(quest->OfferRewardEmote[i], quest->OfferRewardEmoteDelay[i]); - uint32 emoteCount = 0; - for (uint8 i = 0; i < QUEST_EMOTE_COUNT; ++i) - { - if (quest->OfferRewardEmote[i] <= 0) - break; - ++emoteCount; - } + offer.QuestFlags = quest->GetFlags(); - data << emoteCount; // Emote Count - for (uint8 i = 0; i < emoteCount; ++i) - { - data << uint32(quest->OfferRewardEmoteDelay[i]); // Delay Emote - data << uint32(quest->OfferRewardEmote[i]); - } + packet.PortraitTurnIn = quest->GetQuestTurnInPortrait(); + packet.PortraitGiver = quest->GetQuestGiverPortrait(); - quest->BuildExtraQuestInfo(data, _session->GetPlayer()); - - _session->SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPC=%s, questid=%u", npcGUID.ToString().c_str(), quest->GetQuestId()); + _session->SendPacket(packet.Write()); } void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGUID, bool canComplete, bool autoLaunched) const diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 4b8d92b5e94..12bedab4e99 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -285,66 +285,6 @@ int32 Quest::GetRewOrReqMoney(Player const* player) const return std::max(int32(GetRewMoneyMaxLevel()), int32(RewardMoney * sWorld->getRate(RATE_MONEY_QUEST))); } -void Quest::BuildExtraQuestInfo(WorldPacket& data, Player* player) const -{ - data << uint32(GetRewChoiceItemsCount()); - for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - data << uint32(RewardChoiceItemId[i]); - for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - data << uint32(RewardChoiceItemCount[i]); - for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - { - if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(RewardChoiceItemId[i])) - data << uint32(itemTemplate->DisplayInfoID); - else - data << uint32(0); - } - - data << uint32(GetReqItemsCount()); - for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i) - data << uint32(RewardItemId[i]); - for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i) - data << uint32(RewardItemIdCount[i]); - for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i) - { - if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(RewardItemId[i])) - data << uint32(itemTemplate->DisplayInfoID); - else - data << uint32(0); - } - - data << uint32(GetRewOrReqMoney(player)); - data << uint32(GetXPReward(player) * sWorld->getRate(RATE_XP_QUEST)); - - data << uint32(GetCharTitleId()); - data << uint32(0); // unk - data << float(0.0f); // unk - data << uint32(GetBonusTalents()); - data << uint32(0); // unk - data << uint32(GetRewardReputationMask()); - - for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids - data << uint32(RewardFactionId[i]); - - for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (zero based)? - data << int32(RewardFactionValueId[i]); - - for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override? - data << uint32(RewardFactionValueIdOverride[i]); - - data << uint32(GetRewSpell()); - data << uint32(GetRewSpellCast()); - - for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) - data << uint32(RewardCurrencyId[i]); - - for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) - data << uint32(RewardCurrencyCount[i]); - - data << uint32(GetRewardSkillId()); - data << uint32(GetRewardSkillPoints()); -} - void Quest::BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player* player) const { rewards.ChoiceItemCount = GetRewChoiceItemsCount(); diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 77e676bfec2..5f3ad1e676e 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -363,7 +363,6 @@ class TC_GAME_API Quest void SetEventIdForQuest(uint16 eventId) { _eventIdForQuest = eventId; } uint16 GetEventIdForQuest() const { return _eventIdForQuest; } - void BuildExtraQuestInfo(WorldPacket& data, Player* player) const; void BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player* player) const; typedef std::vector PrevQuests; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 967c033c3a7..fee67f13972 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -166,8 +166,8 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() _worldPacket << uint32(DescEmotes.size()); for (WorldPackets::Quest::QuestDescEmote const& emote : DescEmotes) { - _worldPacket << uint32(emote.Type); _worldPacket << uint32(emote.Delay); + _worldPacket << uint32(emote.Type); } return &_worldPacket; @@ -267,6 +267,36 @@ WorldPacket const* WorldPackets::Quest::QuestGiverStatusMultiple::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Quest::QuestGiverOfferRewardMessage::Write() +{ + _worldPacket << QuestData.QuestGiverGUID; + _worldPacket << uint32(QuestData.QuestID); + + _worldPacket << QuestTitle; + _worldPacket << RewardText; + _worldPacket << PortraitGiverText; + _worldPacket << PortraitGiverName; + _worldPacket << PortraitTurnInText; + _worldPacket << PortraitTurnInName; + + _worldPacket << uint32(PortraitGiver); + _worldPacket << uint32(PortraitTurnIn); + _worldPacket << uint8(QuestData.AutoLaunched); + _worldPacket << uint32(QuestData.QuestFlags); + _worldPacket << uint32(QuestData.SuggestedPartyMembers); + + _worldPacket << uint32(QuestData.Emotes.size()); + for (WorldPackets::Quest::QuestDescEmote const& emote : QuestData.Emotes) + { + _worldPacket << uint32(emote.Delay); + _worldPacket << uint32(emote.Type); + } + + _worldPacket << QuestData.Rewards; + + return &_worldPacket; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards) { data << uint32(questRewards.ChoiceItemCount); diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 9a37069aecf..b94ee04d11d 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -15,8 +15,8 @@ * with this program. If not, see . */ -#ifndef SystemPackets_h__ -#define SystemPackets_h__ +#ifndef QuestPackets_h__ +#define QuestPackets_h__ #include "Packet.h" #include "ObjectGuid.h" @@ -421,9 +421,38 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; + + struct QuestGiverOfferReward + { + ObjectGuid QuestGiverGUID; + int32 QuestFlags = 0; + int32 QuestID = 0; + int32 SuggestedPartyMembers = 0; + QuestRewards Rewards; + std::vector Emotes; + bool AutoLaunched = false; + }; + + class QuestGiverOfferRewardMessage final : public ServerPacket + { + public: + QuestGiverOfferRewardMessage() : ServerPacket(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, 600) { } + + WorldPacket const* Write() override; + + QuestGiverOfferReward QuestData; + int32 PortraitTurnIn = 0; + int32 PortraitGiver = 0; + std::string QuestTitle; + std::string RewardText; + std::string PortraitGiverText; + std::string PortraitGiverName; + std::string PortraitTurnInText; + std::string PortraitTurnInName; + }; } } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards); -#endif // SystemPackets_h__ +#endif // QuestPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c917877ab6f..5c3000fd8a9 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1136,7 +1136,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_OFFER_REWARD, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 02a2584c4d5..041101ea638 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1093,7 +1093,7 @@ enum OpcodeServer SMSG_PVP_OPTIONS_ENABLED = 0x50A1, SMSG_QUERY_QUESTS_COMPLETED_RESPONSE = 0x6314, SMSG_QUERY_TIME_RESPONSE = 0x2124, - SMSG_QUESTGIVER_OFFER_REWARD = 0x2427, + SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x2427, SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x55A4, SMSG_QUEST_GIVER_QUEST_DETAILS = 0x2425, SMSG_QUEST_GIVER_QUEST_FAILED = 0x4236,