TrinityCore
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
23{
25{
28
29 return &_worldPacket;
30}
31
33{
36
37 return &_worldPacket;
38}
39
41{
42 data << uint32(plotInfo.GarrPlotInstanceID);
43 data << plotInfo.PlotPos;
44 data << uint32(plotInfo.PlotType);
45
46 return data;
47}
48
50{
51 data << uint32(buildingInfo.GarrPlotInstanceID);
52 data << uint32(buildingInfo.GarrBuildingID);
53 data << buildingInfo.TimeBuilt;
54 data << uint32(buildingInfo.CurrentGarSpecID);
55 data << buildingInfo.TimeSpecCooldown;
56 data.WriteBit(buildingInfo.Active);
57 data.FlushBits();
58
59 return data;
60}
61
63{
64 data << uint64(follower.DbID);
65 data << uint32(follower.GarrFollowerID);
66 data << uint32(follower.Quality);
67 data << uint32(follower.FollowerLevel);
68 data << uint32(follower.ItemLevelWeapon);
69 data << uint32(follower.ItemLevelArmor);
70 data << uint32(follower.Xp);
71 data << uint32(follower.Durability);
72 data << uint32(follower.CurrentBuildingID);
73 data << uint32(follower.CurrentMissionID);
74 data << uint32(follower.AbilityID.size());
75 data << uint32(follower.ZoneSupportSpellID);
76 data << uint32(follower.FollowerStatus);
77 data << int32(follower.Health);
78 data << int8(follower.BoardIndex);
79 data << follower.HealingTimestamp;
80 for (GarrAbilityEntry const* ability : follower.AbilityID)
81 data << uint32(ability->ID);
82
83 data.WriteBits(follower.CustomName.length(), 7);
84 data.FlushBits();
85 data.WriteString(follower.CustomName);
86
87 return data;
88}
89
91{
92 data << int32(encounter.GarrEncounterID);
93 data << uint32(encounter.Mechanics.size());
94 data << int32(encounter.GarrAutoCombatantID);
95 data << int32(encounter.Health);
96 data << int32(encounter.MaxHealth);
97 data << int32(encounter.Attack);
98 data << int8(encounter.BoardIndex);
99
100 if (!encounter.Mechanics.empty())
101 data.append(encounter.Mechanics.data(), encounter.Mechanics.size());
102
103 return data;
104}
105
106ByteBuffer& operator<<(ByteBuffer& data, GarrisonMissionReward const& missionRewardItem)
107{
108 data << int32(missionRewardItem.ItemID);
109 data << uint32(missionRewardItem.ItemQuantity);
110 data << int32(missionRewardItem.CurrencyID);
111 data << uint32(missionRewardItem.CurrencyQuantity);
112 data << uint32(missionRewardItem.FollowerXP);
113 data << uint32(missionRewardItem.GarrMssnBonusAbilityID);
114 data << int32(missionRewardItem.ItemFileDataID);
115 data.WriteBit(missionRewardItem.ItemInstance.has_value());
116 data.FlushBits();
117
118 if (missionRewardItem.ItemInstance)
119 data << *missionRewardItem.ItemInstance;
120
121 return data;
122}
123
125{
126 data << uint64(mission.DbID);
127 data << int32(mission.MissionRecID);
128 data << mission.OfferTime;
129 data << mission.OfferDuration;
130 data << mission.StartTime;
131 data << mission.TravelDuration;
132 data << mission.MissionDuration;
133 data << int32(mission.MissionState);
134 data << int32(mission.SuccessChance);
135 data << uint32(mission.Flags);
136 data << float(mission.MissionScalar);
137 data << int32(mission.ContentTuningID);
138 data << uint32(mission.Encounters.size());
139 data << uint32(mission.Rewards.size());
140 data << uint32(mission.OvermaxRewards.size());
141
142 for (GarrisonEncounter const& encounter : mission.Encounters)
143 data << encounter;
144
145 for (GarrisonMissionReward const& missionRewardItem : mission.Rewards)
146 data << missionRewardItem;
147
148 for (GarrisonMissionReward const& missionRewardItem : mission.OvermaxRewards)
149 data << missionRewardItem;
150
151 return data;
152}
153
155{
156 data << areaBonus.StartTime;
157 data << uint32(areaBonus.GarrMssnBonusAbilityID);
158
159 return data;
160}
161
163{
164 data << int32(talentSocketData.SoulbindConduitID);
165 data << int32(talentSocketData.SoulbindConduitRank);
166
167 return data;
168}
169
171{
172 data << int32(talent.GarrTalentID);
173 data << int32(talent.Rank);
174 data << talent.ResearchStartTime;
175 data << int32(talent.Flags);
176 data.WriteBit(talent.Socket.has_value());
177 data.FlushBits();
178
179 if (talent.Socket)
180 data << *talent.Socket;
181
182 return data;
183}
184
186{
187 data << int32(collectionEntry.EntryID);
188 data << int32(collectionEntry.Rank);
189
190 return data;
191}
192
194{
195 data << int32(collection.Type);
196 data << uint32(collection.Entries.size());
197 for (GarrisonCollectionEntry const& collectionEntry : collection.Entries)
198 data << collectionEntry;
199
200 return data;
201}
202
204{
205 data << int64(event.EventValue);
206 data << int32(event.EntryID);
207
208 return data;
209}
210
212{
213 data << int32(eventList.Type);
214 data << uint32(eventList.Events.size());
215 for (GarrisonEventEntry const& event : eventList.Events)
216 data << event;
217
218 return data;
219}
220
222{
223 data << int32(specGroup.ChrSpecializationID);
224 data << int32(specGroup.SoulbindID);
225
226 return data;
227}
228
230{
231 ASSERT(garrison.Missions.size() == garrison.MissionRewards.size());
232 ASSERT(garrison.Missions.size() == garrison.MissionOvermaxRewards.size());
233 ASSERT(garrison.Missions.size() == garrison.CanStartMission.size());
234
235 data << int32(garrison.GarrTypeID);
236 data << int32(garrison.GarrSiteID);
237 data << int32(garrison.GarrSiteLevelID);
238 data << uint32(garrison.Buildings.size());
239 data << uint32(garrison.Plots.size());
240 data << uint32(garrison.Followers.size());
241 data << uint32(garrison.AutoTroops.size());
242 data << uint32(garrison.Missions.size());
243 data << uint32(garrison.MissionRewards.size());
244 data << uint32(garrison.MissionOvermaxRewards.size());
245 data << uint32(garrison.MissionAreaBonuses.size());
246 data << uint32(garrison.Talents.size());
247 data << uint32(garrison.Collections.size());
248 data << uint32(garrison.EventLists.size());
249 data << uint32(garrison.SpecGroups.size());
250 data << uint32(garrison.CanStartMission.size());
251 data << uint32(garrison.ArchivedMissions.size());
252 data << int32(garrison.NumFollowerActivationsRemaining);
253 data << uint32(garrison.NumMissionsStartedToday);
254 data << int32(garrison.MinAutoTroopLevel);
255
256 for (GarrisonPlotInfo* plot : garrison.Plots)
257 data << *plot;
258
259 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards)
260 data << uint32(missionReward.size());
261
262 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards)
263 data << uint32(missionReward.size());
264
265 for (GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses)
266 data << *areaBonus;
267
268 for (GarrisonCollection const& collection : garrison.Collections)
269 data << collection;
270
271 for (GarrisonEventList const& eventList : garrison.EventLists)
272 data << eventList;
273
274 for (GarrisonSpecGroup const& specGroup : garrison.SpecGroups)
275 data << specGroup;
276
277 if (!garrison.ArchivedMissions.empty())
278 data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size());
279
280 for (GarrisonBuildingInfo const* building : garrison.Buildings)
281 data << *building;
282
283 for (bool canStartMission : garrison.CanStartMission)
284 data.WriteBit(canStartMission);
285
286 data.FlushBits();
287
288 for (GarrisonFollower const* follower : garrison.Followers)
289 data << *follower;
290
291 for (GarrisonFollower const* follower : garrison.AutoTroops)
292 data << *follower;
293
294 for (GarrisonMission const* mission : garrison.Missions)
295 data << *mission;
296
297 for (GarrisonTalent const& talent : garrison.Talents)
298 data << talent;
299
300 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards)
301 for (GarrisonMissionReward const& missionRewardItem : missionReward)
302 data << missionRewardItem;
303
304 for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards)
305 for (GarrisonMissionReward const& missionRewardItem : missionReward)
306 data << missionRewardItem;
307
308 return data;
309}
310
311ByteBuffer& operator<<(ByteBuffer& data, FollowerSoftCapInfo const& followerSoftCapInfo)
312{
313 data << int32(followerSoftCapInfo.GarrFollowerTypeID);
314 data << uint32(followerSoftCapInfo.Count);
315 return data;
316}
317
319{
321 _worldPacket << uint32(Garrisons.size());
323 for (FollowerSoftCapInfo const& followerSoftCapInfo : FollowerSoftCaps)
324 _worldPacket << followerSoftCapInfo;
325
326 for (GarrisonInfo const& garrison : Garrisons)
327 _worldPacket << garrison;
328
329 return &_worldPacket;
330}
331
333{
334 data << uint32(building.GarrPlotInstanceID);
335 data << uint32(building.GarrBuildingID);
336
337 return data;
338}
339
341{
342 data << uint32(site.GarrSiteLevelID);
343 data << uint32(site.Buildings.size());
344 for (GarrisonRemoteBuildingInfo const& building : site.Buildings)
345 data << building;
346
347 return data;
348}
349
351{
352 _worldPacket << uint32(Sites.size());
353 for (GarrisonRemoteSiteInfo const& site : Sites)
354 _worldPacket << site;
355
356 return &_worldPacket;
357}
358
360{
364}
365
367{
373
374 return &_worldPacket;
375}
376
378{
381}
382
384{
389
390 return &_worldPacket;
391}
392
394{
398
399 return &_worldPacket;
400}
401
403{
407
408 return &_worldPacket;
409}
410
412{
416 if (BlueprintsKnown)
417 for (uint32 blueprint : *BlueprintsKnown)
418 _worldPacket << uint32(blueprint);
419
421 for (uint32 specialization : *SpecializationsKnown)
422 _worldPacket << uint32(specialization);
423
424 return &_worldPacket;
425}
426
428{
429 data << uint32(building.GarrBuildingPlotInstID);
430 data << building.Pos;
431
432 return data;
433}
434
436{
437 _worldPacket << uint32(Buildings.size());
438 for (GarrisonBuildingMapData& landmark : Buildings)
439 _worldPacket << landmark;
440
441 return &_worldPacket;
442}
443
445{
448
449 return &_worldPacket;
450}
451
453{
455
456 return &_worldPacket;
457}
458
460{
464
465 return &_worldPacket;
466}
467
469{
474
475 return &_worldPacket;
476}
477
479{
481
482 return &_worldPacket;
483}
484}
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
uint32_t uint32
Definition: Define.h:142
#define ASSERT
Definition: Errors.h:68
void WriteString(std::string const &str)
Definition: ByteBuffer.h:500
void append(T value)
Definition: ByteBuffer.h:143
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
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)
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