/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "QuestPackets.h" #include "PacketOperators.h" namespace WorldPackets::Quest { ByteBuffer& operator<<(ByteBuffer& data, QuestCompleteDisplaySpell const& questDisplaySpell) { data << int32(questDisplaySpell.SpellID); data << int32(questDisplaySpell.PlayerConditionID); data << int32(questDisplaySpell.Type); return data; } ByteBuffer& operator<<(ByteBuffer& data, ConditionalQuestText const& conditionalQuestText) { data << int32(conditionalQuestText.PlayerConditionID); data << int32(conditionalQuestText.QuestGiverCreatureID); data << SizedString::BitsSize<12>(conditionalQuestText.Text); data.FlushBits(); data << SizedString::Data(conditionalQuestText.Text); return data; } void QuestGiverStatusQuery::Read() { _worldPacket >> QuestGiverGUID; } WorldPacket const* QuestGiverStatus::Write() { _worldPacket << QuestGiver.Guid; _worldPacket << uint64(QuestGiver.Status); return &_worldPacket; } WorldPacket const* QuestGiverStatusMultiple::Write() { _worldPacket << Size(QuestGiver); for (QuestGiverInfo const& questGiver : QuestGiver) { _worldPacket << questGiver.Guid; _worldPacket << uint64(questGiver.Status); } return &_worldPacket; } void QuestGiverHello::Read() { _worldPacket >> QuestGiverGUID; } void QueryQuestInfo::Read() { _worldPacket >> QuestID; _worldPacket >> QuestGiver; } WorldPacket const* QueryQuestInfoResponse::Write() { _worldPacket << uint32(QuestID); _worldPacket << Bits<1>(Allow); _worldPacket.FlushBits(); if (Allow) { _worldPacket << int32(Info.QuestID); _worldPacket << int32(Info.QuestType); _worldPacket << int32(Info.QuestPackageID); _worldPacket << int32(Info.ContentTuningID); _worldPacket << int32(Info.QuestSortID); _worldPacket << int32(Info.QuestInfoID); _worldPacket << int32(Info.SuggestedGroupNum); _worldPacket << int32(Info.RewardNextQuest); _worldPacket << int32(Info.RewardXPDifficulty); _worldPacket << float(Info.RewardXPMultiplier); _worldPacket << int32(Info.RewardMoney); _worldPacket << int32(Info.RewardMoneyDifficulty); _worldPacket << float(Info.RewardMoneyMultiplier); _worldPacket << int32(Info.RewardBonusMoney); _worldPacket << Size(Info.RewardDisplaySpell); _worldPacket << int32(Info.RewardSpell); _worldPacket << int32(Info.RewardHonor); _worldPacket << float(Info.RewardKillHonor); _worldPacket << int32(Info.RewardArtifactXPDifficulty); _worldPacket << float(Info.RewardArtifactXPMultiplier); _worldPacket << int32(Info.RewardArtifactCategoryID); _worldPacket << int32(Info.StartItem); _worldPacket << uint32(Info.Flags); _worldPacket << uint32(Info.FlagsEx); _worldPacket << uint32(Info.FlagsEx2); _worldPacket << uint32(Info.FlagsEx3); for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i) { _worldPacket << int32(Info.RewardItems[i]); _worldPacket << int32(Info.RewardAmount[i]); _worldPacket << int32(Info.ItemDrop[i]); _worldPacket << int32(Info.ItemDropQuantity[i]); } for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { _worldPacket << int32(Info.UnfilteredChoiceItems[i].ItemID); _worldPacket << int32(Info.UnfilteredChoiceItems[i].Quantity); _worldPacket << int32(Info.UnfilteredChoiceItems[i].DisplayID); } _worldPacket << int32(Info.POIContinent); _worldPacket << float(Info.POIx); _worldPacket << float(Info.POIy); _worldPacket << int32(Info.POIPriority); _worldPacket << int32(Info.RewardTitle); _worldPacket << int32(Info.RewardArenaPoints); _worldPacket << int32(Info.RewardSkillLineID); _worldPacket << int32(Info.RewardNumSkillUps); _worldPacket << int32(Info.PortraitGiver); _worldPacket << int32(Info.PortraitGiverMount); _worldPacket << int32(Info.PortraitGiverModelSceneID); _worldPacket << int32(Info.PortraitTurnIn); for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i) { _worldPacket << int32(Info.RewardFactionID[i]); _worldPacket << int32(Info.RewardFactionValue[i]); _worldPacket << int32(Info.RewardFactionOverride[i]); _worldPacket << int32(Info.RewardFactionCapIn[i]); } _worldPacket << int32(Info.RewardFactionFlags); for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) { _worldPacket << int32(Info.RewardCurrencyID[i]); _worldPacket << int32(Info.RewardCurrencyQty[i]); } _worldPacket << int32(Info.AcceptedSoundKitID); _worldPacket << int32(Info.CompleteSoundKitID); _worldPacket << int32(Info.AreaGroupID); _worldPacket << int64(Info.TimeAllowed); _worldPacket << Size(Info.Objectives); _worldPacket << uint64(Info.AllowableRaces.RawValue); _worldPacket << Size(Info.TreasurePickerID); _worldPacket << Size(Info.TreasurePickerID2); _worldPacket << int32(Info.Expansion); _worldPacket << int32(Info.ManagedWorldStateID); _worldPacket << int32(Info.QuestSessionBonus); _worldPacket << int32(Info.QuestGiverCreatureID); _worldPacket << Size(Info.ConditionalQuestDescription); _worldPacket << Size(Info.ConditionalQuestCompletionLog); _worldPacket << Size(Info.RewardHouseRoomIDs); _worldPacket << Size(Info.RewardHouseDecorIDs); for (QuestCompleteDisplaySpell const& rewardDisplaySpell : Info.RewardDisplaySpell) _worldPacket << rewardDisplaySpell; if (!Info.TreasurePickerID.empty()) _worldPacket.append(Info.TreasurePickerID.data(), Info.TreasurePickerID.size()); if (!Info.TreasurePickerID2.empty()) _worldPacket.append(Info.TreasurePickerID2.data(), Info.TreasurePickerID2.size()); if (!Info.RewardHouseRoomIDs.empty()) _worldPacket.append(Info.RewardHouseRoomIDs.data(), Info.RewardHouseRoomIDs.size()); if (!Info.RewardHouseDecorIDs.empty()) _worldPacket.append(Info.RewardHouseDecorIDs.data(), Info.RewardHouseDecorIDs.size()); _worldPacket << SizedString::BitsSize<9>(Info.LogTitle); _worldPacket << SizedString::BitsSize<12>(Info.LogDescription); _worldPacket << SizedString::BitsSize<12>(Info.QuestDescription); _worldPacket << SizedString::BitsSize<9>(Info.AreaDescription); _worldPacket << SizedString::BitsSize<10>(Info.PortraitGiverText); _worldPacket << SizedString::BitsSize<8>(Info.PortraitGiverName); _worldPacket << SizedString::BitsSize<10>(Info.PortraitTurnInText); _worldPacket << SizedString::BitsSize<8>(Info.PortraitTurnInName); _worldPacket << SizedString::BitsSize<11>(Info.QuestCompletionLog); _worldPacket << Bits<1>(Info.ResetByScheduler); _worldPacket << Bits<1>(Info.ReadyForTranslation); _worldPacket.FlushBits(); for (QuestObjective const& questObjective : Info.Objectives) { _worldPacket << uint32(questObjective.ID); _worldPacket << int32(questObjective.Type); _worldPacket << int8(questObjective.StorageIndex); _worldPacket << int32(questObjective.ObjectID); _worldPacket << int32(questObjective.Amount); _worldPacket << int32(questObjective.SecondaryAmount); // only objective type 22 _worldPacket << uint32(questObjective.Flags); _worldPacket << uint32(questObjective.Flags2); _worldPacket << float(questObjective.ProgressBarWeight); _worldPacket << Size(questObjective.VisualEffects); _worldPacket << int32(questObjective.ParentObjectiveID); // related to new UF flags for (int32 visualEffect : questObjective.VisualEffects) _worldPacket << int32(visualEffect); _worldPacket << SizedString::BitsSize<8>(questObjective.Description); _worldPacket << Bits<1>(questObjective.Visible); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(questObjective.Description); } _worldPacket << SizedString::Data(Info.LogTitle); _worldPacket << SizedString::Data(Info.LogDescription); _worldPacket << SizedString::Data(Info.QuestDescription); _worldPacket << SizedString::Data(Info.AreaDescription); _worldPacket << SizedString::Data(Info.PortraitGiverText); _worldPacket << SizedString::Data(Info.PortraitGiverName); _worldPacket << SizedString::Data(Info.PortraitTurnInText); _worldPacket << SizedString::Data(Info.PortraitTurnInName); _worldPacket << SizedString::Data(Info.QuestCompletionLog); for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestDescription) _worldPacket << conditionalQuestText; for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestCompletionLog) _worldPacket << conditionalQuestText; } return &_worldPacket; } WorldPacket const* QuestUpdateAddCredit::Write() { _worldPacket << VictimGUID; _worldPacket << int32(QuestID); _worldPacket << int32(ObjectID); _worldPacket << uint16(Count); _worldPacket << uint16(Required); _worldPacket << uint32(ObjectiveType); return &_worldPacket; }; WorldPacket const* QuestUpdateAddCreditSimple::Write() { _worldPacket << int32(QuestID); _worldPacket << int32(ObjectID); _worldPacket << uint32(ObjectiveType); return &_worldPacket; } WorldPacket const* QuestUpdateAddPvPCredit::Write() { _worldPacket << int32(QuestID); _worldPacket << uint16(Count); return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, QuestRewardItem const& questRewardItem) { data << int32(questRewardItem.ItemID); data << int32(questRewardItem.ItemQty); data << OptionalInit(questRewardItem.ContextFlags); data.FlushBits(); if (questRewardItem.ContextFlags) data << As(*questRewardItem.ContextFlags); return data; } ByteBuffer& operator<<(ByteBuffer& data, QuestChoiceItem const& questChoiceItem) { data << Bits<2>(questChoiceItem.LootItemType); data << OptionalInit(questChoiceItem.ContextFlags); data << questChoiceItem.Item; data << int32(questChoiceItem.Quantity); if (questChoiceItem.ContextFlags) data << As(*questChoiceItem.ContextFlags); return data; } ByteBuffer& operator>>(ByteBuffer& data, QuestChoiceItem& questChoiceItem) { data.ResetBitPos(); data >> Bits<2>(questChoiceItem.LootItemType); data >> OptionalInit(questChoiceItem.ContextFlags); data >> questChoiceItem.Item; data >> questChoiceItem.Quantity; if (questChoiceItem.ContextFlags) data >> As(*questChoiceItem.ContextFlags); return data; } ByteBuffer& operator<<(ByteBuffer& data, QuestRewardCurrency const& questRewardCurrency) { data << int32(questRewardCurrency.CurrencyID); data << int32(questRewardCurrency.CurrencyQty); data << int32(questRewardCurrency.BonusQty); data << OptionalInit(questRewardCurrency.ContextFlags); data.FlushBits(); if (questRewardCurrency.ContextFlags) data << As(*questRewardCurrency.ContextFlags); return data; } ByteBuffer& operator<<(ByteBuffer& data, QuestRewards const& questRewards) { for (QuestRewardItem const& item : questRewards.Items) data << item; data << int32(questRewards.ChoiceItemCount); data << int32(questRewards.ItemCount); data << int32(questRewards.Money); data << int32(questRewards.XP); data << int64(questRewards.ArtifactXP); data << int32(questRewards.ArtifactCategoryID); data << int32(questRewards.Honor); data << int32(questRewards.Title); data << int32(questRewards.FactionFlags); for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i) { data << int32(questRewards.FactionID[i]); data << int32(questRewards.FactionValue[i]); data << int32(questRewards.FactionOverride[i]); data << int32(questRewards.FactionCapIn[i]); } data.append(questRewards.SpellCompletionDisplayID.data(), questRewards.SpellCompletionDisplayID.size()); data << int32(questRewards.SpellCompletionID); data << int32(questRewards.SkillLineID); data << int32(questRewards.NumSkillUps); data << Size(questRewards.TreasurePickerID); if (!questRewards.TreasurePickerID.empty()) data.append(questRewards.TreasurePickerID.data(), questRewards.TreasurePickerID.size()); for (QuestRewardCurrency const& currency : questRewards.Currencies) data << currency; data << Bits<1>(questRewards.IsBoostSpell); data.FlushBits(); for (QuestChoiceItem const& choiceItem : questRewards.ChoiceItems) data << choiceItem; return data; } ByteBuffer& operator<<(ByteBuffer& data, QuestGiverOfferReward const& offer) { data << offer.Rewards; // QuestRewards data << Size(offer.Emotes); data << offer.QuestGiverGUID; data.append(offer.QuestFlags); data << int32(offer.QuestGiverCreatureID); data << int32(offer.QuestID); data << int32(offer.SuggestedPartyMembers); data << int32(offer.QuestInfoID); for (QuestDescEmote const& emote : offer.Emotes) { data << int32(emote.Type); data << uint32(emote.Delay); } data << Bits<1>(offer.AutoLaunched); data << Bits<1>(false); // Unused data << Bits<1>(offer.ResetByScheduler); data.FlushBits(); return data; } WorldPacket const* QuestGiverOfferRewardMessage::Write() { _worldPacket << QuestData; // QuestGiverOfferReward _worldPacket << int32(QuestPackageID); _worldPacket << int32(PortraitGiver); _worldPacket << int32(PortraitGiverMount); _worldPacket << int32(PortraitGiverModelSceneID); _worldPacket << int32(PortraitTurnIn); _worldPacket << int32(QuestGiverCreatureID); _worldPacket << Size(ConditionalRewardText); _worldPacket << SizedString::BitsSize<9>(QuestTitle); _worldPacket << SizedString::BitsSize<12>(RewardText); _worldPacket << SizedString::BitsSize<10>(PortraitGiverText); _worldPacket << SizedString::BitsSize<8>(PortraitGiverName); _worldPacket << SizedString::BitsSize<10>(PortraitTurnInText); _worldPacket << SizedString::BitsSize<8>(PortraitTurnInName); _worldPacket.FlushBits(); for (ConditionalQuestText const& conditionalQuestText : ConditionalRewardText) _worldPacket << conditionalQuestText; _worldPacket << SizedString::Data(QuestTitle); _worldPacket << SizedString::Data(RewardText); _worldPacket << SizedString::Data(PortraitGiverText); _worldPacket << SizedString::Data(PortraitGiverName); _worldPacket << SizedString::Data(PortraitTurnInText); _worldPacket << SizedString::Data(PortraitTurnInName); return &_worldPacket; }; void QuestGiverChooseReward::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; _worldPacket >> Choice; } WorldPacket const* QuestGiverQuestComplete::Write() { _worldPacket << int32(QuestID); _worldPacket << int32(XPReward); _worldPacket << int64(MoneyReward); _worldPacket << int32(SkillLineIDReward); _worldPacket << int32(NumSkillUpsReward); _worldPacket << Bits<1>(UseQuestReward); _worldPacket << Bits<1>(LaunchGossip); _worldPacket << Bits<1>(LaunchQuest); _worldPacket << Bits<1>(HideChatMessage); _worldPacket << ItemReward; return &_worldPacket; } void QuestGiverCompleteQuest::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; _worldPacket >> Bits<1>(FromScript); } void QuestGiverCloseQuest::Read() { _worldPacket >> QuestID; } WorldPacket const* QuestGiverQuestDetails::Write() { _worldPacket << QuestGiverGUID; _worldPacket << InformUnit; _worldPacket << int32(QuestID); _worldPacket << int32(QuestPackageID); _worldPacket << int32(PortraitGiver); _worldPacket << int32(PortraitGiverMount); _worldPacket << int32(PortraitGiverModelSceneID); _worldPacket << int32(PortraitTurnIn); _worldPacket.append(QuestFlags); _worldPacket << int32(SuggestedPartyMembers); _worldPacket << Size(LearnSpells); _worldPacket << Size(DescEmotes); _worldPacket << Size(Objectives); _worldPacket << int32(QuestStartItemID); _worldPacket << int32(QuestInfoID); _worldPacket << int32(QuestSessionBonus); _worldPacket << int32(QuestGiverCreatureID); _worldPacket << Size(ConditionalDescriptionText); for (int32 spell : LearnSpells) _worldPacket << int32(spell); for (QuestDescEmote const& emote : DescEmotes) { _worldPacket << int32(emote.Type); _worldPacket << uint32(emote.Delay); } for (QuestObjectiveSimple const& obj : Objectives) { _worldPacket << int32(obj.ID); _worldPacket << int32(obj.Type); _worldPacket << int32(obj.ObjectID); _worldPacket << int32(obj.Amount); } _worldPacket << SizedString::BitsSize<9>(QuestTitle); _worldPacket << SizedString::BitsSize<12>(DescriptionText); _worldPacket << SizedString::BitsSize<12>(LogDescription); _worldPacket << SizedString::BitsSize<10>(PortraitGiverText); _worldPacket << SizedString::BitsSize<8>(PortraitGiverName); _worldPacket << SizedString::BitsSize<10>(PortraitTurnInText); _worldPacket << SizedString::BitsSize<8>(PortraitTurnInName); _worldPacket << Bits<1>(AutoLaunched); _worldPacket << Bits<1>(FromContentPush); _worldPacket << Bits<1>(false); // unused in client _worldPacket << Bits<1>(ResetByScheduler); _worldPacket << Bits<1>(StartCheat); _worldPacket << Bits<1>(DisplayPopup); _worldPacket.FlushBits(); _worldPacket << Rewards; // QuestRewards _worldPacket << SizedString::Data(QuestTitle); _worldPacket << SizedString::Data(DescriptionText); _worldPacket << SizedString::Data(LogDescription); _worldPacket << SizedString::Data(PortraitGiverText); _worldPacket << SizedString::Data(PortraitGiverName); _worldPacket << SizedString::Data(PortraitTurnInText); _worldPacket << SizedString::Data(PortraitTurnInName); for (ConditionalQuestText const& conditionalQuestText : ConditionalDescriptionText) _worldPacket << conditionalQuestText; return &_worldPacket; } WorldPacket const* QuestGiverRequestItems::Write() { _worldPacket << Size(Collect); _worldPacket << Size(Currency); _worldPacket << QuestGiverGUID; _worldPacket.append(QuestFlags); _worldPacket << int32(StatusFlags); _worldPacket << int32(QuestGiverCreatureID); _worldPacket << int32(QuestID); _worldPacket << int32(CompEmoteDelay); _worldPacket << int32(CompEmoteType); _worldPacket << int32(SuggestPartyMembers); _worldPacket << int32(MoneyToGet); _worldPacket << int32(QuestInfoID); for (QuestObjectiveCollect const& obj : Collect) { _worldPacket << int32(obj.ObjectID); _worldPacket << int32(obj.Amount); _worldPacket << uint32(obj.Flags); } for (QuestCurrency const& cur : Currency) { _worldPacket << int32(cur.CurrencyID); _worldPacket << int32(cur.Amount); } _worldPacket << Bits<1>(AutoLaunched); _worldPacket << Bits<1>(ResetByScheduler); _worldPacket.FlushBits(); _worldPacket << int32(QuestGiverCreatureID); _worldPacket << Size(ConditionalCompletionText); _worldPacket << SizedString::BitsSize<9>(QuestTitle); _worldPacket << SizedString::BitsSize<12>(CompletionText); _worldPacket.FlushBits(); for (ConditionalQuestText const& conditionalQuestText : ConditionalCompletionText) _worldPacket << conditionalQuestText; _worldPacket << SizedString::Data(QuestTitle); _worldPacket << SizedString::Data(CompletionText); return &_worldPacket; } void QuestGiverRequestReward::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; } void QuestGiverQueryQuest::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; _worldPacket >> Bits<1>(RespondToGiver); } void QuestGiverAcceptQuest::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; _worldPacket >> Bits<1>(StartCheat); } void QuestLogRemoveQuest::Read() { _worldPacket >> Entry; } WorldPacket const* QuestGiverQuestListMessage::Write() { _worldPacket << QuestGiverGUID; _worldPacket << uint32(GreetEmoteDelay); _worldPacket << uint32(GreetEmoteType); _worldPacket << Size(QuestDataText); _worldPacket << SizedString::BitsSize<11>(Greeting); _worldPacket.FlushBits(); for (NPC::ClientGossipText const& gossip : QuestDataText) _worldPacket << gossip; _worldPacket << SizedString::Data(Greeting); return &_worldPacket; } WorldPacket const* QuestUpdateComplete::Write() { _worldPacket << int32(QuestID); return &_worldPacket; } WorldPacket const* QuestConfirmAcceptResponse::Write() { _worldPacket << uint32(QuestID); _worldPacket << InitiatedBy; _worldPacket << SizedString::BitsSize<10>(QuestTitle); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(QuestTitle); return &_worldPacket; } void QuestConfirmAccept::Read() { _worldPacket >> QuestID; } WorldPacket const* QuestPushResultResponse::Write() { _worldPacket << SenderGUID; _worldPacket << uint32(Result); _worldPacket << SizedString::BitsSize<9>(QuestTitle); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(QuestTitle); return &_worldPacket; } void QuestPushResult::Read() { _worldPacket >> SenderGUID; _worldPacket >> QuestID; _worldPacket >> Result; } WorldPacket const* QuestGiverInvalidQuest::Write() { _worldPacket << uint32(Reason); _worldPacket << int32(ContributionRewardID); _worldPacket << Bits<1>(SendErrorMessage); _worldPacket << SizedString::BitsSize<9>(ReasonText); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(ReasonText); return &_worldPacket; } WorldPacket const* QuestUpdateFailedTimer::Write() { _worldPacket << uint32(QuestID); return &_worldPacket; } WorldPacket const* QuestGiverQuestFailed::Write() { _worldPacket << uint32(QuestID); _worldPacket << uint32(Reason); return &_worldPacket; } void PushQuestToParty::Read() { _worldPacket >> QuestID; } WorldPacket const* DailyQuestsReset::Write() { _worldPacket << int32(Count); return &_worldPacket; } WorldPacket const* QuestForceRemoved::Write() { _worldPacket << int32(QuestID); return &_worldPacket; } WorldPacket const* WorldQuestUpdateResponse::Write() { _worldPacket << Size(WorldQuestUpdates); for (WorldQuestUpdateInfo const& worldQuestUpdate : WorldQuestUpdates) { _worldPacket << worldQuestUpdate.LastUpdate; _worldPacket << uint32(worldQuestUpdate.QuestID); _worldPacket << uint32(worldQuestUpdate.Timer); _worldPacket << int32(worldQuestUpdate.VariableID); _worldPacket << int32(worldQuestUpdate.Value); } return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseRewardEntry const& playerChoiceResponseRewardEntry) { data << playerChoiceResponseRewardEntry.Item; data << int32(playerChoiceResponseRewardEntry.Quantity); return data; } ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseReward const& playerChoiceResponseReward) { data << int32(playerChoiceResponseReward.TitleID); data << int32(playerChoiceResponseReward.PackageID); data << int32(playerChoiceResponseReward.SkillLineID); data << uint32(playerChoiceResponseReward.SkillPointCount); data << uint32(playerChoiceResponseReward.ArenaPointCount); data << uint32(playerChoiceResponseReward.HonorPointCount); data << uint64(playerChoiceResponseReward.Money); data << uint32(playerChoiceResponseReward.Xp); data << Size(playerChoiceResponseReward.Items); data << Size(playerChoiceResponseReward.Currencies); data << Size(playerChoiceResponseReward.Factions); data << Size(playerChoiceResponseReward.ItemChoices); for (PlayerChoiceResponseRewardEntry const& item : playerChoiceResponseReward.Items) data << item; for (PlayerChoiceResponseRewardEntry const& currency : playerChoiceResponseReward.Currencies) data << currency; for (PlayerChoiceResponseRewardEntry const& faction : playerChoiceResponseReward.Factions) data << faction; for (PlayerChoiceResponseRewardEntry const& itemChoice : playerChoiceResponseReward.ItemChoices) data << itemChoice; return data; } ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseMawPower const& playerChoiceResponseMawPower) { data << int32(playerChoiceResponseMawPower.Unused901_1); data << int32(playerChoiceResponseMawPower.TypeArtFileID); data << int32(playerChoiceResponseMawPower.BorderUiTextureAtlasMemberID); data << int32(playerChoiceResponseMawPower.SpellID); data << int32(playerChoiceResponseMawPower.MaxStacks); data << OptionalInit(playerChoiceResponseMawPower.Rarity); data.FlushBits(); if (playerChoiceResponseMawPower.Rarity) data << int32(*playerChoiceResponseMawPower.Rarity); return data; } ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponse const& playerChoiceResponse) { data << int32(playerChoiceResponse.ResponseID); data << uint16(playerChoiceResponse.ResponseIdentifier); data << int32(playerChoiceResponse.ChoiceArtFileID); data << int32(playerChoiceResponse.Flags); data << uint32(playerChoiceResponse.WidgetSetID); data << uint32(playerChoiceResponse.UiTextureAtlasElementID); data << uint32(playerChoiceResponse.SoundKitID); data << uint8(playerChoiceResponse.GroupID); data << int32(playerChoiceResponse.UiTextureKitID); data << SizedString::BitsSize<9>(playerChoiceResponse.Answer); data << SizedString::BitsSize<9>(playerChoiceResponse.Header); data << SizedString::BitsSize<7>(playerChoiceResponse.SubHeader); data << SizedString::BitsSize<9>(playerChoiceResponse.ButtonTooltip); data << SizedString::BitsSize<11>(playerChoiceResponse.Description); data << SizedString::BitsSize<7>(playerChoiceResponse.Confirmation); data << OptionalInit(playerChoiceResponse.RewardQuestID); data << OptionalInit(playerChoiceResponse.Reward); data << OptionalInit(playerChoiceResponse.MawPower); data.FlushBits(); if (playerChoiceResponse.Reward) data << *playerChoiceResponse.Reward; data << SizedString::Data(playerChoiceResponse.Answer); data << SizedString::Data(playerChoiceResponse.Header); data << SizedString::Data(playerChoiceResponse.SubHeader); data << SizedString::Data(playerChoiceResponse.ButtonTooltip); data << SizedString::Data(playerChoiceResponse.Description); data << SizedString::Data(playerChoiceResponse.Confirmation); if (playerChoiceResponse.RewardQuestID) data << uint32(*playerChoiceResponse.RewardQuestID); if (playerChoiceResponse.MawPower) data << *playerChoiceResponse.MawPower; return data; } WorldPacket const* DisplayPlayerChoice::Write() { _worldPacket << int32(ChoiceID); _worldPacket << Size(Responses); _worldPacket << SenderGUID; _worldPacket << int32(UiTextureKitID); _worldPacket << uint32(SoundKitID); _worldPacket << uint32(CloseUISoundKitID); _worldPacket << uint8(NumRerolls); _worldPacket << ExpireTime; _worldPacket << SizedString::BitsSize<8>(Question); _worldPacket << SizedString::BitsSize<8>(PendingChoiceText); _worldPacket << Bits<1>(InfiniteRange); _worldPacket << Bits<1>(HideWarboardHeader); _worldPacket << Bits<1>(KeepOpenAfterChoice); _worldPacket << Bits<1>(ShowChoicesAsList); _worldPacket << Bits<1>(ForceDontShowChoicesAsList); _worldPacket.FlushBits(); for (PlayerChoiceResponse const& response : Responses) _worldPacket << response; _worldPacket << SizedString::Data(Question); _worldPacket << SizedString::Data(PendingChoiceText); return &_worldPacket; } void ChoiceResponse::Read() { _worldPacket >> ChoiceID; _worldPacket >> ResponseIdentifier; _worldPacket >> Bits<1>(IsReroll); } WorldPacket const* UiMapQuestLinesResponse::Write() { _worldPacket << int32(UiMapID); _worldPacket << Size(QuestLineXQuestIDs); _worldPacket << Size(QuestIDs); _worldPacket << Size(QuestLineIDs); for (uint32 const& questLineQuestID : QuestLineXQuestIDs) _worldPacket << uint32(questLineQuestID); for (uint32 const& questID : QuestIDs) _worldPacket << uint32(questID); for (uint32 const& questLineID : QuestLineIDs) _worldPacket << uint32(questLineID); return &_worldPacket; } void UiMapQuestLinesRequest::Read() { _worldPacket >> UiMapID; } ByteBuffer& operator>>(ByteBuffer& data, SpawnTrackingRequestInfo& spawnTrackingRequestInfo) { data >> spawnTrackingRequestInfo.ObjectTypeMask; data >> spawnTrackingRequestInfo.ObjectID; data >> spawnTrackingRequestInfo.SpawnTrackingID; return data; } void SpawnTrackingUpdate::Read() { uint32 requests = _worldPacket.read(); if (requests > 10000) OnInvalidArraySize(requests, 10000); SpawnTrackingRequests.resize(requests); for (SpawnTrackingRequestInfo& spawnTrackingRequestInfo : SpawnTrackingRequests) _worldPacket >> spawnTrackingRequestInfo; } ByteBuffer& operator<<(ByteBuffer& data, SpawnTrackingResponseInfo const& spawnTrackingResponseInfo) { data << uint32(spawnTrackingResponseInfo.SpawnTrackingID); data << int32(spawnTrackingResponseInfo.ObjectID); data << int32(spawnTrackingResponseInfo.PhaseID); data << int32(spawnTrackingResponseInfo.PhaseGroupID); data << int32(spawnTrackingResponseInfo.PhaseUseFlags); data << Bits<1>(spawnTrackingResponseInfo.Visible); data.FlushBits(); return data; } WorldPacket const* QuestPOIUpdateResponse::Write() { _worldPacket << Size(SpawnTrackingResponses); for (SpawnTrackingResponseInfo const& spawnTrackingResponseInfo : SpawnTrackingResponses) _worldPacket << spawnTrackingResponseInfo; return &_worldPacket; } WorldPacket const* ForceSpawnTrackingUpdate::Write() { _worldPacket << int32(QuestID); return &_worldPacket; } }