TrinityCore
QuestPackets.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "QuestPackets.h"
19#include "Util.h"
20
21namespace WorldPackets::Quest
22{
24{
25 data << int32(questDisplaySpell.SpellID);
26 data << int32(questDisplaySpell.PlayerConditionID);
27 data << int32(questDisplaySpell.Type);
28
29 return data;
30}
31
32ByteBuffer& operator<<(ByteBuffer& data, ConditionalQuestText const& conditionalQuestText)
33{
34 data << int32(conditionalQuestText.PlayerConditionID);
35 data << int32(conditionalQuestText.QuestGiverCreatureID);
36 data.WriteBits(conditionalQuestText.Text.length(), 12);
37 data.FlushBits();
38
39 data.WriteString(conditionalQuestText.Text);
40
41 return data;
42}
43
45{
47}
48
50{
51 uint32 guidCount = 0;
52 _worldPacket >> guidCount;
53 if (guidCount > 1000)
54 throw PacketArrayMaxCapacityException(guidCount, 1000);
55
56 QuestGiverGUIDs.reserve(guidCount);
57 for (uint32 i = 0; i < guidCount; ++i)
58 {
59 ObjectGuid guid;
60 _worldPacket >> guid;
61 QuestGiverGUIDs.insert(guid);
62 }
63}
64
66{
69
70 return &_worldPacket;
71}
72
74{
75 _worldPacket << int32(QuestGiver.size());
76 for (QuestGiverInfo const& questGiver : QuestGiver)
77 {
78 _worldPacket << questGiver.Guid;
79 _worldPacket << uint64(questGiver.Status);
80 }
81
82 return &_worldPacket;
83}
84
86{
88}
89
91{
94}
95
97{
99
102
103 if (Allow)
104 {
130
131 for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
132 {
137 }
138
139 for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
140 {
144 }
145
147 _worldPacket << float(Info.POIx);
148 _worldPacket << float(Info.POIy);
150
155
160
161 for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
162 {
167 }
168
170
171 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
172 {
175 }
176
179
182
190
193
194 for (QuestCompleteDisplaySpell const& rewardDisplaySpell : Info.RewardDisplaySpell)
195 _worldPacket << rewardDisplaySpell;
196
208
209 for (QuestObjective const& questObjective : Info.Objectives)
210 {
211 _worldPacket << uint32(questObjective.ID);
212 _worldPacket << uint8(questObjective.Type);
213 _worldPacket << int8(questObjective.StorageIndex);
214 _worldPacket << int32(questObjective.ObjectID);
215 _worldPacket << int32(questObjective.Amount);
216 _worldPacket << uint32(questObjective.Flags);
217 _worldPacket << uint32(questObjective.Flags2);
218 _worldPacket << float(questObjective.ProgressBarWeight);
219
220 _worldPacket << int32(questObjective.VisualEffects.size());
221 for (int32 visualEffect : questObjective.VisualEffects)
222 _worldPacket << int32(visualEffect);
223
224 _worldPacket.WriteBits(questObjective.Description.size(), 8);
226
227 _worldPacket.WriteString(questObjective.Description);
228 }
229
239
240 for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestDescription)
241 _worldPacket << conditionalQuestText;
242
243 for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestCompletionLog)
244 _worldPacket << conditionalQuestText;
245 }
246
247 return &_worldPacket;
248}
249
251{
258
259 return &_worldPacket;
260};
261
263{
267
268 return &_worldPacket;
269}
270
272{
275
276 return &_worldPacket;
277}
278
279ByteBuffer& operator<<(ByteBuffer& data, QuestChoiceItem const& questChoiceItem)
280{
281 data.WriteBits(AsUnderlyingType(questChoiceItem.LootItemType), 2);
282 data << questChoiceItem.Item;
283 data << int32(questChoiceItem.Quantity);
284
285 return data;
286}
287
289{
290 data.ResetBitPos();
291 questChoiceItem.LootItemType = LootItemType(data.ReadBits(2));
292 data >> questChoiceItem.Item;
293 data >> questChoiceItem.Quantity;
294
295 return data;
296}
297
298ByteBuffer& operator<<(ByteBuffer& data, QuestRewards const& questRewards)
299{
300 data << int32(questRewards.ChoiceItemCount);
301 data << int32(questRewards.ItemCount);
302
303 for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
304 {
305 data << int32(questRewards.ItemID[i]);
306 data << int32(questRewards.ItemQty[i]);
307 }
308
309 data << int32(questRewards.Money);
310 data << int32(questRewards.XP);
311 data << int64(questRewards.ArtifactXP);
312 data << int32(questRewards.ArtifactCategoryID);
313 data << int32(questRewards.Honor);
314 data << int32(questRewards.Title);
315 data << int32(questRewards.FactionFlags);
316
317 for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
318 {
319 data << int32(questRewards.FactionID[i]);
320 data << int32(questRewards.FactionValue[i]);
321 data << int32(questRewards.FactionOverride[i]);
322 data << int32(questRewards.FactionCapIn[i]);
323 }
324
325 data.append(questRewards.SpellCompletionDisplayID.data(), questRewards.SpellCompletionDisplayID.size());
326
327 data << int32(questRewards.SpellCompletionID);
328
329 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
330 {
331 data << int32(questRewards.CurrencyID[i]);
332 data << int32(questRewards.CurrencyQty[i]);
333 }
334
335 data << int32(questRewards.SkillLineID);
336 data << int32(questRewards.NumSkillUps);
337 data << int32(questRewards.TreasurePickerID);
338
339 for (QuestChoiceItem const& choiceItem : questRewards.ChoiceItems)
340 data << choiceItem;
341
342 data.WriteBit(questRewards.IsBoostSpell);
343 data.FlushBits();
344
345 return data;
346}
347
349{
350 data << offer.QuestGiverGUID;
351 data << int32(offer.QuestGiverCreatureID);
352 data << int32(offer.QuestID);
353 data << int32(offer.QuestFlags[0]); // Flags
354 data << int32(offer.QuestFlags[1]); // FlagsEx
355 data << int32(offer.QuestFlags[2]); // FlagsEx2
356 data << int32(offer.SuggestedPartyMembers);
357 data << int32(offer.Emotes.size());
358 for (QuestDescEmote const& emote : offer.Emotes)
359 {
360 data << int32(emote.Type);
361 data << uint32(emote.Delay);
362 }
363
364 data.WriteBit(offer.AutoLaunched);
365 data.WriteBit(false); // Unused
366 data.FlushBits();
367
368 data << offer.Rewards; // QuestRewards
369
370 return data;
371}
372
374{
375 _worldPacket << QuestData; // QuestGiverOfferReward
383
391
392 for (ConditionalQuestText const& conditionalQuestText : ConditionalRewardText)
393 _worldPacket << conditionalQuestText;
394
401
402 return &_worldPacket;
403};
404
406{
410}
411
413{
423
425
426 return &_worldPacket;
427}
428
430{
434}
435
437{
439}
440
442{
451 _worldPacket << uint32(QuestFlags[0]); // Flags
452 _worldPacket << uint32(QuestFlags[1]); // FlagsEx
453 _worldPacket << uint32(QuestFlags[2]); // FlagsEx
456 _worldPacket << uint32(DescEmotes.size());
457 _worldPacket << uint32(Objectives.size());
462
463 for (int32 spell : LearnSpells)
464 _worldPacket << int32(spell);
465
466 for (QuestDescEmote const& emote : DescEmotes)
467 {
468 _worldPacket << int32(emote.Type);
469 _worldPacket << uint32(emote.Delay);
470 }
471
472 for (QuestObjectiveSimple const& obj : Objectives)
473 {
474 _worldPacket << int32(obj.ID);
475 _worldPacket << int32(obj.ObjectID);
476 _worldPacket << int32(obj.Amount);
477 _worldPacket << uint8(obj.Type);
478 }
479
488 _worldPacket.WriteBit(false); // unused in client
492
493 _worldPacket << Rewards; // QuestRewards
501
502 for (ConditionalQuestText const& conditionalQuestText : ConditionalDescriptionText)
503 _worldPacket << conditionalQuestText;
504
505 return &_worldPacket;
506}
507
509{
520 _worldPacket << int32(Collect.size());
521 _worldPacket << int32(Currency.size());
523
524 for (QuestObjectiveCollect const& obj : Collect)
525 {
526 _worldPacket << int32(obj.ObjectID);
527 _worldPacket << int32(obj.Amount);
528 _worldPacket << uint32(obj.Flags);
529 }
530
531 for (QuestCurrency const& cur : Currency)
532 {
533 _worldPacket << int32(cur.CurrencyID);
534 _worldPacket << int32(cur.Amount);
535 }
536
539
542
546
547 for (ConditionalQuestText const& conditionalQuestText : ConditionalCompletionText)
548 _worldPacket << conditionalQuestText;
549
552
553 return &_worldPacket;
554}
555
557{
560}
561
563{
567}
568
570{
574}
575
577{
579}
580
582{
587 _worldPacket.WriteBits(Greeting.size(), 11);
589
590 for (NPC::ClientGossipText const& gossip : QuestDataText)
591 _worldPacket << gossip;
592
594
595 return &_worldPacket;
596}
597
599{
601
602 return &_worldPacket;
603}
604
606{
609
612
614
615 return &_worldPacket;
616}
617
619{
621}
622
624{
627
630
632
633 return &_worldPacket;
634}
635
637{
641}
642
644{
647
649 _worldPacket.WriteBits(ReasonText.length(), 9);
650
652
654
655 return &_worldPacket;
656}
657
659{
661
662 return &_worldPacket;
663}
664
666{
669
670 return &_worldPacket;
671}
672
674{
676}
677
679{
681
682 return &_worldPacket;
683}
684
686{
688
689 return &_worldPacket;
690}
691
693{
695
696 for (WorldQuestUpdateInfo const& worldQuestUpdate : WorldQuestUpdates)
697 {
698 _worldPacket << worldQuestUpdate.LastUpdate;
699 _worldPacket << uint32(worldQuestUpdate.QuestID);
700 _worldPacket << uint32(worldQuestUpdate.Timer);
701 _worldPacket << int32(worldQuestUpdate.VariableID);
702 _worldPacket << int32(worldQuestUpdate.Value);
703 }
704
705 return &_worldPacket;
706}
707
708ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseRewardEntry const& playerChoiceResponseRewardEntry)
709{
710 data << playerChoiceResponseRewardEntry.Item;
711 data << int32(playerChoiceResponseRewardEntry.Quantity);
712 return data;
713}
714
715ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseReward const& playerChoiceResponseReward)
716{
717 data << int32(playerChoiceResponseReward.TitleID);
718 data << int32(playerChoiceResponseReward.PackageID);
719 data << int32(playerChoiceResponseReward.SkillLineID);
720 data << uint32(playerChoiceResponseReward.SkillPointCount);
721 data << uint32(playerChoiceResponseReward.ArenaPointCount);
722 data << uint32(playerChoiceResponseReward.HonorPointCount);
723 data << uint64(playerChoiceResponseReward.Money);
724 data << uint32(playerChoiceResponseReward.Xp);
725 data << uint32(playerChoiceResponseReward.Items.size());
726 data << uint32(playerChoiceResponseReward.Currencies.size());
727 data << uint32(playerChoiceResponseReward.Factions.size());
728 data << uint32(playerChoiceResponseReward.ItemChoices.size());
729
730 for (PlayerChoiceResponseRewardEntry const& item : playerChoiceResponseReward.Items)
731 data << item;
732
733 for (PlayerChoiceResponseRewardEntry const& currency : playerChoiceResponseReward.Currencies)
734 data << currency;
735
736 for (PlayerChoiceResponseRewardEntry const& faction : playerChoiceResponseReward.Factions)
737 data << faction;
738
739 for (PlayerChoiceResponseRewardEntry const& itemChoice : playerChoiceResponseReward.ItemChoices)
740 data << itemChoice;
741
742 return data;
743}
744
745ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseMawPower const& playerChoiceResponseMawPower)
746{
747 data << int32(playerChoiceResponseMawPower.Unused901_1);
748 data << int32(playerChoiceResponseMawPower.TypeArtFileID);
749 data << int32(playerChoiceResponseMawPower.Unused901_2);
750 data << int32(playerChoiceResponseMawPower.SpellID);
751 data << int32(playerChoiceResponseMawPower.MaxStacks);
752 data.WriteBit(playerChoiceResponseMawPower.Rarity.has_value());
753 data.WriteBit(playerChoiceResponseMawPower.RarityColor.has_value());
754 data.FlushBits();
755
756 if (playerChoiceResponseMawPower.Rarity)
757 data << int32(*playerChoiceResponseMawPower.Rarity);
758
759 if (playerChoiceResponseMawPower.RarityColor)
760 data << uint32(*playerChoiceResponseMawPower.RarityColor);
761
762 return data;
763}
764
765ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponse const& playerChoiceResponse)
766{
767 data << int32(playerChoiceResponse.ResponseID);
768 data << uint16(playerChoiceResponse.ResponseIdentifier);
769 data << int32(playerChoiceResponse.ChoiceArtFileID);
770 data << int32(playerChoiceResponse.Flags);
771 data << uint32(playerChoiceResponse.WidgetSetID);
772 data << uint32(playerChoiceResponse.UiTextureAtlasElementID);
773 data << uint32(playerChoiceResponse.SoundKitID);
774 data << uint8(playerChoiceResponse.GroupID);
775 data << int32(playerChoiceResponse.UiTextureKitID);
776
777 data.WriteBits(playerChoiceResponse.Answer.length(), 9);
778 data.WriteBits(playerChoiceResponse.Header.length(), 9);
779 data.WriteBits(playerChoiceResponse.SubHeader.length() , 7);
780 data.WriteBits(playerChoiceResponse.ButtonTooltip.length(), 9);
781 data.WriteBits(playerChoiceResponse.Description.length(), 11);
782 data.WriteBits(playerChoiceResponse.Confirmation.length(), 7);
783 data.WriteBit(playerChoiceResponse.RewardQuestID.has_value());
784 data.WriteBit(playerChoiceResponse.Reward.has_value());
785 data.WriteBit(playerChoiceResponse.MawPower.has_value());
786 data.FlushBits();
787
788 if (playerChoiceResponse.Reward)
789 data << *playerChoiceResponse.Reward;
790
791 data.WriteString(playerChoiceResponse.Answer);
792 data.WriteString(playerChoiceResponse.Header);
793 data.WriteString(playerChoiceResponse.SubHeader);
794 data.WriteString(playerChoiceResponse.ButtonTooltip);
795 data.WriteString(playerChoiceResponse.Description);
796 data.WriteString(playerChoiceResponse.Confirmation);
797
798 if (playerChoiceResponse.RewardQuestID)
799 data << uint32(*playerChoiceResponse.RewardQuestID);
800
801 if (playerChoiceResponse.MawPower)
802 data << *playerChoiceResponse.MawPower;
803
804 return data;
805}
806
808{
810 _worldPacket << uint32(Responses.size());
817 _worldPacket.WriteBits(Question.length(), 8);
823
824 for (PlayerChoiceResponse const& response : Responses)
825 _worldPacket << response;
826
829 return &_worldPacket;
830}
831
833{
837}
838}
uint8_t uint8
Definition: Define.h:144
int64_t int64
Definition: Define.h:137
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
LootItemType
Definition: LootItemType.h:24
#define QUEST_REWARD_ITEM_COUNT
Definition: QuestDef.h:48
#define QUEST_REWARD_REPUTATIONS_COUNT
Definition: QuestDef.h:50
#define QUEST_REWARD_CURRENCY_COUNT
Definition: QuestDef.h:52
#define QUEST_REWARD_CHOICES_COUNT
Definition: QuestDef.h:47
QuestFlags
Definition: QuestDef.h:192
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
uint32 ReadBits(int32 bits)
Definition: ByteBuffer.h:209
void WriteString(std::string const &str)
Definition: ByteBuffer.h:500
void append(T value)
Definition: ByteBuffer.h:143
void ResetBitPos()
Definition: ByteBuffer.h:166
bool WriteBit(bool bit)
Definition: ByteBuffer.h:175
void WriteBits(std::size_t value, int32 bits)
Definition: ByteBuffer.h:203
void FlushBits()
Definition: ByteBuffer.h:155
bool ReadBit()
Definition: ByteBuffer.h:191
WorldPacket _worldPacket
Definition: Packet.h:43
WorldPacket const * Write() override
WorldPackets::Duration< Seconds > Duration
Definition: QuestPackets.h:759
std::vector< PlayerChoiceResponse > Responses
Definition: QuestPackets.h:762
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< ConditionalQuestText > ConditionalRewardText
Definition: QuestPackets.h:332
WorldPackets::Item::ItemInstance ItemReward
Definition: QuestPackets.h:365
WorldPacket const * Write() override
std::vector< ConditionalQuestText > ConditionalDescriptionText
Definition: QuestPackets.h:429
std::vector< QuestDescEmote > DescEmotes
Definition: QuestPackets.h:413
std::vector< QuestObjectiveSimple > Objectives
Definition: QuestPackets.h:412
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< NPC::ClientGossipText > QuestDataText
Definition: QuestPackets.h:529
std::vector< QuestCurrency > Currency
Definition: QuestPackets.h:466
std::vector< ConditionalQuestText > ConditionalCompletionText
Definition: QuestPackets.h:471
WorldPacket const * Write() override
std::vector< QuestObjectiveCollect > Collect
Definition: QuestPackets.h:465
std::vector< QuestGiverInfo > QuestGiver
Definition: QuestPackets.h:89
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< WorldQuestUpdateInfo > WorldQuestUpdates
Definition: QuestPackets.h:688
ByteBuffer & operator>>(ByteBuffer &data, QuestChoiceItem &questChoiceItem)
ByteBuffer & operator<<(ByteBuffer &data, QuestCompleteDisplaySpell const &questDisplaySpell)
int32 ObjectID
Definition: QuestDef.h:449
uint32 Flags2
Definition: QuestDef.h:452
std::string Description
Definition: QuestDef.h:454
int8 StorageIndex
Definition: QuestDef.h:448
std::vector< int32 > VisualEffects
Definition: QuestDef.h:455
uint32 Flags
Definition: QuestDef.h:451
int32 Amount
Definition: QuestDef.h:450
float ProgressBarWeight
Definition: QuestDef.h:453
std::vector< PlayerChoiceResponseRewardEntry > Factions
Definition: QuestPackets.h:709
std::vector< PlayerChoiceResponseRewardEntry > ItemChoices
Definition: QuestPackets.h:710
std::vector< PlayerChoiceResponseRewardEntry > Currencies
Definition: QuestPackets.h:708
std::vector< PlayerChoiceResponseRewardEntry > Items
Definition: QuestPackets.h:707
Optional< PlayerChoiceResponseReward > Reward
Definition: QuestPackets.h:741
Optional< PlayerChoiceResponseMawPower > MawPower
Definition: QuestPackets.h:743
std::vector< QuestDescEmote > Emotes
Definition: QuestPackets.h:310
std::vector< QuestCompleteDisplaySpell > RewardDisplaySpell
Definition: QuestPackets.h:150
std::vector< QuestObjective > Objectives
Definition: QuestPackets.h:193
int32 RewardAmount[QUEST_REWARD_ITEM_COUNT]
Definition: QuestPackets.h:197
int32 ItemDrop[QUEST_ITEM_DROP_COUNT]
Definition: QuestPackets.h:198
int32 RewardFactionOverride[QUEST_REWARD_REPUTATIONS_COUNT]
Definition: QuestPackets.h:203
int32 RewardItems[QUEST_REWARD_ITEM_COUNT]
Definition: QuestPackets.h:196
int32 RewardFactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT]
Definition: QuestPackets.h:204
QuestInfoChoiceItem UnfilteredChoiceItems[QUEST_REWARD_CHOICES_COUNT]
Definition: QuestPackets.h:200
Trinity::RaceMask< uint64 > AllowableRaces
Definition: QuestPackets.h:165
std::vector< ConditionalQuestText > ConditionalQuestDescription
Definition: QuestPackets.h:194
std::vector< ConditionalQuestText > ConditionalQuestCompletionLog
Definition: QuestPackets.h:195
int32 RewardFactionID[QUEST_REWARD_REPUTATIONS_COUNT]
Definition: QuestPackets.h:201
int32 RewardCurrencyID[QUEST_REWARD_CURRENCY_COUNT]
Definition: QuestPackets.h:205
int32 ItemDropQuantity[QUEST_ITEM_DROP_COUNT]
Definition: QuestPackets.h:199
int32 RewardCurrencyQty[QUEST_REWARD_CURRENCY_COUNT]
Definition: QuestPackets.h:206
int32 RewardFactionValue[QUEST_REWARD_REPUTATIONS_COUNT]
Definition: QuestPackets.h:202
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionOverride
Definition: QuestPackets.h:288
std::array< QuestChoiceItem, QUEST_REWARD_CHOICES_COUNT > ChoiceItems
Definition: QuestPackets.h:283
std::array< int32, QUEST_REWARD_DISPLAY_SPELL_COUNT > SpellCompletionDisplayID
Definition: QuestPackets.h:278
std::array< int32, QUEST_REWARD_CURRENCY_COUNT > CurrencyQty
Definition: QuestPackets.h:291
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionValue
Definition: QuestPackets.h:287
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionCapIn
Definition: QuestPackets.h:289
std::array< int32, QUEST_REWARD_ITEM_COUNT > ItemQty
Definition: QuestPackets.h:285
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionID
Definition: QuestPackets.h:286
std::array< int32, QUEST_REWARD_CURRENCY_COUNT > CurrencyID
Definition: QuestPackets.h:290
std::array< int32, QUEST_REWARD_ITEM_COUNT > ItemID
Definition: QuestPackets.h:284