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
This commit is contained in:
Ovahlord
2020-02-01 19:54:38 +01:00
parent 99935970a6
commit 633cfee22b
7 changed files with 92 additions and 111 deletions

View File

@@ -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

View File

@@ -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();

View File

@@ -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<int32> PrevQuests;

View File

@@ -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);

View File

@@ -15,8 +15,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#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<QuestDescEmote> 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__

View File

@@ -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);

View File

@@ -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,