TrinityCore
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
GarrisonPackets.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 "GarrisonPackets.h"
19#include "DB2Structure.h"
20#include "Errors.h"
21#include "PacketOperators.h"
22
24{
26{
29
30 return &_worldPacket;
31}
32
34{
37
38 return &_worldPacket;
39}
40
42{
43 data << uint32(plotInfo.GarrPlotInstanceID);
44 data << plotInfo.PlotPos;
45 data << uint8(plotInfo.PlotType);
46
47 return data;
48}
49
51{
52 data << buildingInfo.TimeBuilt;
53 data << uint32(buildingInfo.GarrPlotInstanceID);
54 data << uint32(buildingInfo.GarrBuildingID);
55 data << uint32(buildingInfo.CurrentGarSpecID);
56 data << buildingInfo.TimeSpecCooldown;
57 data << Bits<1>(buildingInfo.Active);
58 data.FlushBits();
59
60 return data;
61}
62
64{
65 data << uint64(follower.DbID);
66 data << uint32(follower.GarrFollowerID);
67 data << uint32(follower.Quality);
68 data << uint32(follower.FollowerLevel);
69 data << uint32(follower.ItemLevelWeapon);
70 data << uint32(follower.ItemLevelArmor);
71 data << uint32(follower.Xp);
72 data << uint32(follower.Durability);
73 data << uint32(follower.CurrentBuildingID);
74 data << uint32(follower.CurrentMissionID);
75 data << Size<uint32>(follower.AbilityID);
76 data << uint32(follower.ZoneSupportSpellID);
77 data << uint32(follower.FollowerStatus);
78 data << int32(follower.Health);
79 data << int8(follower.BoardIndex);
80 data << follower.HealingTimestamp;
81 for (GarrAbilityEntry const* ability : follower.AbilityID)
82 data << uint32(ability->ID);
83
84 data << SizedString::BitsSize<7>(follower.CustomName);
85 data.FlushBits();
86
87 data << SizedString::Data(follower.CustomName);
88
89 return data;
90}
91
93{
94 data << int32(encounter.GarrEncounterID);
95 data << Size<uint32>(encounter.Mechanics);
96 data << int32(encounter.GarrAutoCombatantID);
97 data << int32(encounter.Health);
98 data << int32(encounter.MaxHealth);
99 data << int32(encounter.Attack);
100 data << int8(encounter.BoardIndex);
101
102 if (!encounter.Mechanics.empty())
103 data.append(encounter.Mechanics.data(), encounter.Mechanics.size());
104
105 return data;
106}
107
108ByteBuffer& operator<<(ByteBuffer& data, GarrisonMissionReward const& missionRewardItem)
109{
110 data << int32(missionRewardItem.ItemID);
111 data << uint32(missionRewardItem.ItemQuantity);
112 data << int32(missionRewardItem.CurrencyID);
113 data << uint32(missionRewardItem.CurrencyQuantity);
114 data << uint32(missionRewardItem.FollowerXP);
115 data << uint32(missionRewardItem.GarrMssnBonusAbilityID);
116 data << int32(missionRewardItem.ItemFileDataID);
117 data << OptionalInit(missionRewardItem.ItemInstance);
118 data.FlushBits();
119
120 if (missionRewardItem.ItemInstance)
121 data << *missionRewardItem.ItemInstance;
122
123 return data;
124}
125
127{
128 data << uint64(mission.DbID);
129 data << int32(mission.MissionRecID);
130 data << mission.OfferTime;
131 data << mission.OfferDuration;
132 data << mission.StartTime;
133 data << mission.TravelDuration;
134 data << mission.MissionDuration;
135 data << int32(mission.MissionState);
136 data << int32(mission.SuccessChance);
137 data << uint32(mission.Flags);
138 data << float(mission.MissionScalar);
139 data << int32(mission.ContentTuningID);
140 data << Size<uint32>(mission.Encounters);
141 data << Size<uint32>(mission.Rewards);
142 data << Size<uint32>(mission.OvermaxRewards);
143
144 for (GarrisonEncounter const& encounter : mission.Encounters)
145 data << encounter;
146
147 for (GarrisonMissionReward const& missionRewardItem : mission.Rewards)
148 data << missionRewardItem;
149
150 for (GarrisonMissionReward const& missionRewardItem : mission.OvermaxRewards)
151 data << missionRewardItem;
152
153 return data;
154}
155
157{
158 data << areaBonus.StartTime;
159 data << uint32(areaBonus.GarrMssnBonusAbilityID);
160
161 return data;
162}
163
165{
166 data << int32(talentSocketData.SoulbindConduitID);
167 data << int32(talentSocketData.SoulbindConduitRank);
168
169 return data;
170}
171
173{
174 data << int32(talent.GarrTalentID);
175 data << int32(talent.Rank);
176 data << talent.ResearchStartTime;
177 data << int32(talent.Flags);
178 data << OptionalInit(talent.Socket);
179 data.FlushBits();
180
181 if (talent.Socket)
182 data << *talent.Socket;
183
184 return data;
185}
186
188{
189 data << int32(collectionEntry.EntryID);
190 data << int32(collectionEntry.Rank);
191
192 return data;
193}
194
196{
197 data << int32(collection.Type);
198 data << Size<uint32>(collection.Entries);
199 for (GarrisonCollectionEntry const& collectionEntry : collection.Entries)
200 data << collectionEntry;
201
202 return data;
203}
204
206{
207 data << int64(event.EventValue);
208 data << int32(event.EntryID);
209
210 return data;
211}
212
214{
215 data << int32(eventList.Type);
216 data << Size<uint32>(eventList.Events);
217 for (GarrisonEventEntry const& event : eventList.Events)
218 data << event;
219
220 return data;
221}
222
224{
225 data << int32(specGroup.ChrSpecializationID);
226 data << int32(specGroup.SoulbindID);
227
228 return data;
229}
230
232{
233 ASSERT(garrison.Missions.size() == garrison.MissionRewards.size());
234 ASSERT(garrison.Missions.size() == garrison.MissionOvermaxRewards.size());
235 ASSERT(garrison.Missions.size() == garrison.CanStartMission.size());
236
237 data << uint8(garrison.GarrTypeID);
238 data << int32(garrison.GarrSiteID);
239 data << int32(garrison.GarrSiteLevelID);
240 data << Size<uint32>(garrison.Buildings);
241 data << Size<uint32>(garrison.Plots);
242 data << Size<uint32>(garrison.Followers);
243 data << Size<uint32>(garrison.AutoTroops);
244 data << Size<uint32>(garrison.Missions);
245 data << Size<uint32>(garrison.MissionRewards);
246 data << Size<uint32>(garrison.MissionOvermaxRewards);
247 data << Size<uint32>(garrison.MissionAreaBonuses);
248 data << Size<uint32>(garrison.Talents);
249 data << Size<uint32>(garrison.Collections);
250 data << Size<uint32>(garrison.EventLists);
251 data << Size<uint32>(garrison.SpecGroups);
252 data << Size<uint32>(garrison.CanStartMission);
253 data << Size<uint32>(garrison.ArchivedMissions);
254 data << int32(garrison.NumFollowerActivationsRemaining);
255 data << uint32(garrison.NumMissionsStartedToday);
256 data << int32(garrison.MinAutoTroopLevel);
257
258 for (GarrisonPlotInfo const* plot : garrison.Plots)
259 data << *plot;
260
261 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards)
262 data << Size<uint32>(missionReward);
263
264 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards)
265 data << Size<uint32>(missionReward);
266
267 for (GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses)
268 data << *areaBonus;
269
270 for (GarrisonCollection const& collection : garrison.Collections)
271 data << collection;
272
273 for (GarrisonEventList const& eventList : garrison.EventLists)
274 data << eventList;
275
276 for (GarrisonSpecGroup const& specGroup : garrison.SpecGroups)
277 data << specGroup;
278
279 if (!garrison.ArchivedMissions.empty())
280 data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size());
281
282 for (GarrisonBuildingInfo const* building : garrison.Buildings)
283 data << *building;
284
285 for (bool canStartMission : garrison.CanStartMission)
286 data << Bits<1>(canStartMission);
287
288 data.FlushBits();
289
290 for (GarrisonFollower const* follower : garrison.Followers)
291 data << *follower;
292
293 for (GarrisonFollower const* follower : garrison.AutoTroops)
294 data << *follower;
295
296 for (GarrisonMission const* mission : garrison.Missions)
297 data << *mission;
298
299 for (GarrisonTalent const& talent : garrison.Talents)
300 data << talent;
301
302 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards)
303 for (GarrisonMissionReward const& missionRewardItem : missionReward)
304 data << missionRewardItem;
305
306 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards)
307 for (GarrisonMissionReward const& missionRewardItem : missionReward)
308 data << missionRewardItem;
309
310 return data;
311}
312
313ByteBuffer& operator<<(ByteBuffer& data, FollowerSoftCapInfo const& followerSoftCapInfo)
314{
315 data << uint8(followerSoftCapInfo.GarrFollowerTypeID);
316 data << uint32(followerSoftCapInfo.Count);
317 return data;
318}
319
321{
323 _worldPacket << Size<uint32>(Garrisons);
324 _worldPacket << Size<uint32>(FollowerSoftCaps);
325 for (FollowerSoftCapInfo const& followerSoftCapInfo : FollowerSoftCaps)
326 _worldPacket << followerSoftCapInfo;
327
328 for (GarrisonInfo const& garrison : Garrisons)
329 _worldPacket << garrison;
330
331 return &_worldPacket;
332}
333
335{
336 data << uint32(building.GarrPlotInstanceID);
337 data << uint32(building.GarrBuildingID);
338
339 return data;
340}
341
343{
344 data << uint32(site.GarrSiteLevelID);
345 data << Size<uint32>(site.Buildings);
346 for (GarrisonRemoteBuildingInfo const& building : site.Buildings)
347 data << building;
348
349 return data;
350}
351
353{
354 _worldPacket << Size<uint32>(Sites);
355 for (GarrisonRemoteSiteInfo const& site : Sites)
356 _worldPacket << site;
357
358 return &_worldPacket;
359}
360
362{
366}
367
369{
373 _worldPacket << Bits<1>(PlayActivationCinematic);
375
376 return &_worldPacket;
377}
378
380{
383}
384
386{
391
392 return &_worldPacket;
393}
394
396{
400
401 return &_worldPacket;
402}
403
405{
409
410 return &_worldPacket;
411}
412
414{
418 if (BlueprintsKnown)
419 for (uint32 blueprint : *BlueprintsKnown)
420 _worldPacket << uint32(blueprint);
421
423 for (uint32 specialization : *SpecializationsKnown)
424 _worldPacket << uint32(specialization);
425
426 return &_worldPacket;
427}
428
430{
431 data << uint32(building.GarrBuildingPlotInstID);
432 data << building.Pos;
433
434 return data;
435}
436
438{
439 _worldPacket << Size<uint32>(Buildings);
440 for (GarrisonBuildingMapData& landmark : Buildings)
441 _worldPacket << landmark;
442
443 return &_worldPacket;
444}
445
447{
450
451 return &_worldPacket;
452}
453
455{
457
458 return &_worldPacket;
459}
460
462{
466
467 return &_worldPacket;
468}
469
471{
476
477 return &_worldPacket;
478}
479
481{
483
484 return &_worldPacket;
485}
486}
uint8_t uint8
Definition: Define.h:150
int64_t int64
Definition: Define.h:143
int8_t int8
Definition: Define.h:146
int32_t int32
Definition: Define.h:144
uint64_t uint64
Definition: Define.h:147
uint32_t uint32
Definition: Define.h:148
#define ASSERT
Definition: Errors.h:68
void append(T value)
Definition: ByteBuffer.h:130
void FlushBits()
Definition: ByteBuffer.h:141
std::vector< GarrisonBuildingMapData > Buildings
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< GarrisonRemoteSiteInfo > Sites
std::vector< FollowerSoftCapInfo > FollowerSoftCaps
WorldPacket _worldPacket
Definition: Packet.h:43
ByteBuffer & operator<<(ByteBuffer &data, GarrisonPlotInfo const &plotInfo)
DataWriter< Container > Data(Container const &value)
OptionalInitWriter< T > OptionalInit(Optional< T > const &value)
std::vector< GarrisonCollectionEntry > Entries
std::vector< GarrisonEventEntry > Events
std::list< GarrAbilityEntry const * > AbilityID
std::vector< GarrisonTalent > Talents
std::vector< GarrisonEventList > EventLists
std::vector< GarrisonPlotInfo * > Plots
std::vector< GarrisonMissionBonusAbility const * > MissionAreaBonuses
std::vector< GarrisonFollower const * > AutoTroops
std::vector< GarrisonFollower const * > Followers
std::vector< GarrisonMission const * > Missions
std::vector< std::vector< GarrisonMissionReward > > MissionRewards
std::vector< GarrisonCollection > Collections
std::vector< std::vector< GarrisonMissionReward > > MissionOvermaxRewards
std::vector< GarrisonBuildingInfo const * > Buildings
std::vector< GarrisonSpecGroup > SpecGroups
Optional< Item::ItemInstance > ItemInstance
std::vector< GarrisonEncounter > Encounters
std::vector< GarrisonMissionReward > Rewards
std::vector< GarrisonMissionReward > OvermaxRewards
TaggedPosition< Position::XYZO > PlotPos
std::vector< GarrisonRemoteBuildingInfo > Buildings
Optional< GarrisonTalentSocketData > Socket