TrinityCore
Loading...
Searching...
No Matches
PartyPackets.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 "PartyPackets.h"
19#include "Group.h"
20#include "PacketOperators.h"
21#include "Pet.h"
22#include "PhasingHandler.h"
23#include "Player.h"
24#include "RealmList.h"
25#include "SpellAuraEffects.h"
26#include "SpellAuras.h"
27#include "Vehicle.h"
28
29namespace WorldPackets::Party
30{
32{
33 _worldPacket << SizedString::BitsSize<9>(Name);
34 _worldPacket << Bits<4>(Command);
35 _worldPacket << Bits<6>(Result);
36
40
41 return &_worldPacket;
42}
43
60
62{
63 _worldPacket << Bits<1>(CanAccept);
64 _worldPacket << Bits<1>(IsXRealm);
65 _worldPacket << Bits<1>(IsXNativeRealm);
66 _worldPacket << Bits<1>(ShouldSquelch);
67 _worldPacket << Bits<1>(AllowMultipleRoles);
68 _worldPacket << Bits<1>(QuestSessionActive);
69 _worldPacket << SizedString::BitsSize<6>(InviterName);
70 _worldPacket << Bits<1>(IsCrossFaction);
71
77 _worldPacket << Size<uint32>(LfgSlots);
79
81
82 for (uint32 lfgSlot : LfgSlots)
83 _worldPacket << lfgSlot;
84
85 return &_worldPacket;
86}
87
88void PartyInvite::Initialize(Player const* inviter, int32 proposedRoles, bool canAccept)
89{
90 CanAccept = canAccept;
91
92 InviterName = inviter->GetName();
93 InviterGUID = inviter->GetGUID();
94 InviterBNetAccountId = inviter->m_playerData->BnetAccount;
95
96 ProposedRoles = proposedRoles;
97
98 if (std::shared_ptr<Realm const> realm = sRealmList->GetRealm(*inviter->m_playerData->VirtualPlayerRealm))
99 InviterRealm = Auth::VirtualRealmInfo(realm->Id.GetAddress(), true, false, realm->Name, realm->NormalizedName);
100}
101
114
116{
118 _worldPacket >> SizedString::BitsSize<9>(Reason);
119
121 if (PartyIndex)
123
125}
126
128{
129 _worldPacket << SizedString::BitsSize<9>(Name);
131
133
134 return &_worldPacket;
135}
136
138{
140
141 return &_worldPacket;
142}
143
145{
147 _worldPacket >> Size<uint32>(Targets);
148 if (PartyIndex)
150
151 for (ObjectGuid& target : Targets)
152 _worldPacket >> target;
153}
154
156{
157 data << uint32(phase.Flags);
158 data << uint16(phase.Id);
159
160 return data;
161}
162
164{
165 data << uint32(phases.PhaseShiftFlags);
166 data << Size<uint32>(phases.List);
167 data << phases.PersonalGUID;
168
169 for (PartyMemberPhase const& phase : phases.List)
170 data << phase;
171
172 return data;
173}
174
176{
177 data << int32(aura.SpellID);
178 data << uint16(aura.Flags);
179 data << uint32(aura.ActiveFlags);
180 data << Size<int32>(aura.Points);
181 for (float points : aura.Points)
182 data << float(points);
183
184 return data;
185}
186
187ByteBuffer& operator<<(ByteBuffer& data, CTROptions const& ctrOptions)
188{
189 data << Size<uint32>(ctrOptions.ConditionalFlags);
190 data << int8(ctrOptions.FactionGroup);
191 data << uint32(ctrOptions.ChromieTimeExpansionMask);
192
193 if (!ctrOptions.ConditionalFlags.empty())
194 data.append(ctrOptions.ConditionalFlags.data(), ctrOptions.ConditionalFlags.size());
195
196 return data;
197}
198
200{
201 data << petStats.GUID;
202 data << int32(petStats.ModelId);
203 data << int32(petStats.CurrentHealth);
204 data << int32(petStats.MaxHealth);
205 data << Size<uint32>(petStats.Auras);
206 for (PartyMemberAuraStates const& aura : petStats.Auras)
207 data << aura;
208
209 data << SizedString::BitsSize<8>(petStats.Name);
210 data.FlushBits();
211
212 data << SizedString::Data(petStats.Name);
213
214 return data;
215}
216
218{
219 for (uint32 i = 0; i < 2; i++)
220 data << uint8(memberStats.PartyType[i]);
221
222 data << uint32(memberStats.Status);
223 data << uint8(memberStats.PowerType);
224 data << uint16(memberStats.PowerDisplayID);
225 data << int32(memberStats.CurrentHealth);
226 data << int32(memberStats.MaxHealth);
227 data << uint16(memberStats.CurrentPower);
228 data << uint16(memberStats.MaxPower);
229 data << uint16(memberStats.Level);
230 data << uint16(memberStats.SpecID);
231 data << uint16(memberStats.ZoneID);
232 data << uint16(memberStats.WmoGroupID);
233 data << uint32(memberStats.WmoDoodadPlacementID);
234 data << int16(memberStats.PositionX);
235 data << int16(memberStats.PositionY);
236 data << int16(memberStats.PositionZ);
237 data << int32(memberStats.VehicleSeat);
238 data << Size<uint32>(memberStats.Auras);
239 data << memberStats.Phases;
240 data << memberStats.ChromieTime;
241 data << memberStats.DungeonScore;
242
243 for (PartyMemberAuraStates const& aura : memberStats.Auras)
244 data << aura;
245
246 data << OptionalInit(memberStats.PetStats);
247 data.FlushBits();
248
249 if (memberStats.PetStats)
250 data << *memberStats.PetStats;
251
252 return data;
253}
254
256{
257 _worldPacket << Bits<1>(ForEnemy);
258
261
262 return &_worldPacket;
263}
264
272
282
291
302
309
319
328
337
346
356
358{
360 _worldPacket << Size<uint32>(TargetIcons);
361
362 for (auto& [symbol, target] : TargetIcons)
363 {
364 _worldPacket << target;
365 _worldPacket << uint8(symbol);
366 }
367
368 return &_worldPacket;
369}
370
372{
373 _worldPacket >> Bits<1>(Raid);
374}
375
382
391
398
408
416
418{
421
422 _worldPacket << Bits<1>(IsReady);
424
425 return &_worldPacket;
426}
427
435
437{
438 _worldPacket >> Bits<1>(PassOnLoot);
439}
440
447
449{
452
453 return &_worldPacket;
454}
455
457{
459 _worldPacket << SizedString::BitsSize<9>(Name);
460
462
463 return &_worldPacket;
464}
465
466ByteBuffer& operator<<(ByteBuffer& data, LeaverInfo const& leaverInfo)
467{
468 data << leaverInfo.BnetAccountGUID;
469 data << float(leaverInfo.LeaveScore);
470 data << uint32(leaverInfo.SeasonID);
471 data << uint32(leaverInfo.TotalLeaves);
472 data << uint32(leaverInfo.TotalSuccesses);
473 data << int32(leaverInfo.ConsecutiveSuccesses);
474 data << leaverInfo.LastPenaltyTime;
475 data << leaverInfo.LeaverExpirationTime;
476 data << int32(leaverInfo.Flags);
477 data << Bits<1>(leaverInfo.LeaverStatus);
478 data.FlushBits();
479
480 return data;
481}
482
484{
485 data << SizedString::BitsSize<6>(playerInfo.Name);
486 data << SizedCString::BitsSize<6>(playerInfo.VoiceStateID);
487 data << Bits<1>(playerInfo.Connected);
488 data << Bits<1>(playerInfo.FromSocialQueue);
489 data << Bits<1>(playerInfo.VoiceChatSilenced);
490 data << playerInfo.GUID;
491 data << uint8(playerInfo.Subgroup);
492 data << uint8(playerInfo.Flags);
493 data << uint8(playerInfo.RolesAssigned);
494 data << uint8(playerInfo.RolesUnk_1210);
495 data << uint8(playerInfo.Class);
496 data << uint8(playerInfo.FactionGroup);
497 data << playerInfo.Leaver;
498 data << SizedString::Data(playerInfo.Name);
499 data << SizedCString::Data(playerInfo.VoiceStateID);
500
501 return data;
502}
503
505{
506 data << int32(challengeMode.MapID);
507 data << int32(challengeMode.InitialPlayerCount);
508 data << uint64(challengeMode.InstanceID);
509 data << challengeMode.StartTime;
510 data << challengeMode.KeystoneOwnerGUID;
511 data << challengeMode.LeaverGUID;
512 data << challengeMode.InstanceAbandonVoteCooldown;
513 data << Bits<1>(challengeMode.IsActive);
514 data << Bits<1>(challengeMode.HasRestrictions);
515 data << Bits<1>(challengeMode.CanVoteAbandon);
516 data.FlushBits();
517
518 return data;
519}
520
522{
523 data << uint32(lfgInfos.Slot);
524 data << uint8(lfgInfos.MyFlags);
525 data << uint32(lfgInfos.MyRandomSlot);
526 data << uint8(lfgInfos.MyPartialClear);
527 data << float(lfgInfos.MyGearDiff);
528 data << uint8(lfgInfos.MyStrangerCount);
529 data << uint8(lfgInfos.MyKickVoteCount);
530 data << uint8(lfgInfos.BootCount);
531 data << Bits<1>(lfgInfos.Aborted);
532 data << Bits<1>(lfgInfos.MyFirstReward);
533 data.FlushBits();
534
535 return data;
536}
537
539{
540 data << uint8(lootSettings.Method);
541 data << lootSettings.LootMaster;
542 data << uint8(lootSettings.Threshold);
543
544 return data;
545}
546
547ByteBuffer& operator<<(ByteBuffer& data, PartyDifficultySettings const& difficultySettings)
548{
549 data << int16(difficultySettings.DungeonDifficultyID);
550 data << int16(difficultySettings.RaidDifficultyID);
551 data << int16(difficultySettings.LegacyRaidDifficultyID);
552
553 return data;
554}
555
592
600
609
618
623
625{
628
629 _worldPacket << BitsSize<4>(RaidMarkers);
631
632 for (RaidMarker const* raidMarker : RaidMarkers)
633 {
634 _worldPacket << raidMarker->TransportGUID;
635 _worldPacket << raidMarker->Location.GetMapId();
636 _worldPacket << raidMarker->Location.PositionXYZStream();
637 }
638
639 return &_worldPacket;
640}
641
643{
644 ForEnemy = false;
645
646 MemberGuid = player->GetGUID();
647
648 // Status
650
651 if (player->IsPvP())
653
654 if (!player->IsAlive())
655 {
658 else
660 }
661
662 if (player->IsFFAPvP())
664
665 if (player->isAFK())
667
668 if (player->isDND())
670
671 if (player->GetVehicle())
673
674 // Level
675 MemberStats.Level = player->GetLevel();
676
677 // Health
680
681 // Power
684 MemberStats.CurrentPower = player->GetPower(player->GetPowerType());
685 MemberStats.MaxPower = player->GetMaxPower(player->GetPowerType());
686
687 // Position
688 MemberStats.ZoneID = player->GetZoneId();
692
694 MemberStats.PartyType[0] = player->m_playerData->PartyType[0];
695 MemberStats.PartyType[1] = player->m_playerData->PartyType[1];
696
697 if (WmoLocation const* wmoLocation = player->GetCurrentWmo())
698 {
699 MemberStats.WmoGroupID = wmoLocation->GroupId;
700 MemberStats.WmoDoodadPlacementID = wmoLocation->UniqueId;
701 }
702
703 // Vehicle
704 if (::Vehicle const* vehicle = player->GetVehicle())
705 if (VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(player))
706 MemberStats.VehicleSeat = vehicleSeat->ID;
707
708 // Auras
709 for (AuraApplication const* aurApp : player->GetVisibleAuras())
710 {
711 PartyMemberAuraStates& aura = MemberStats.Auras.emplace_back();
712
713 aura.SpellID = aurApp->GetBase()->GetId();
714 aura.ActiveFlags = aurApp->GetEffectMask();
715 aura.Flags = aurApp->GetFlags();
716
717 if (aurApp->GetFlags() & AFLAG_SCALABLE)
718 for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects())
719 if (aurApp->HasEffect(aurEff->GetEffIndex()))
720 aura.Points.push_back(float(aurEff->GetAmount()));
721 }
722
723 // Phases
725
726 // Pet
727 if (::Pet* pet = player->GetPet())
728 {
729 MemberStats.PetStats.emplace();
730
731 MemberStats.PetStats->GUID = pet->GetGUID();
732 MemberStats.PetStats->Name = pet->GetName();
733 MemberStats.PetStats->ModelId = pet->GetDisplayId();
734
735 MemberStats.PetStats->CurrentHealth = pet->GetHealth();
736 MemberStats.PetStats->MaxHealth = pet->GetMaxHealth();
737
738 for (AuraApplication const* aurApp : pet->GetVisibleAuras())
739 {
740 PartyMemberAuraStates& aura = MemberStats.PetStats->Auras.emplace_back();
741
742 aura.SpellID = aurApp->GetBase()->GetId();
743 aura.ActiveFlags = aurApp->GetEffectMask();
744 aura.Flags = aurApp->GetFlags();
745
746 if (aurApp->GetFlags() & AFLAG_SCALABLE)
747 for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects())
748 if (aurApp->HasEffect(aurEff->GetEffIndex()))
749 aura.Points.push_back(float(aurEff->GetAmount()));
750 }
751 }
752
753 MemberStats.ChromieTime.ConditionalFlags = player->m_playerData->CtrOptions->ConditionalFlags;
754 MemberStats.ChromieTime.FactionGroup = player->m_playerData->CtrOptions->FactionGroup;
755 MemberStats.ChromieTime.ChromieTimeExpansionMask = player->m_playerData->CtrOptions->ChromieTimeExpansionMask;
756}
757
759{
762
763 return &_worldPacket;
764}
765
767{
769
770 return &_worldPacket;
771}
772
774{
776 _worldPacket << Bits<1>(Accepted);
778
779 return &_worldPacket;
780}
781
789
808
831
842
855
867
881
889}
uint8_t uint8
Definition Define.h:156
int16_t int16
Definition Define.h:151
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
@ MEMBER_STATUS_AFK
Definition Group.h:68
@ MEMBER_STATUS_VEHICLE
Definition Group.h:71
@ MEMBER_STATUS_PVP
Definition Group.h:63
@ MEMBER_STATUS_ONLINE
Definition Group.h:62
@ MEMBER_STATUS_DEAD
Definition Group.h:64
@ MEMBER_STATUS_GHOST
Definition Group.h:65
@ MEMBER_STATUS_DND
Definition Group.h:69
@ MEMBER_STATUS_PVP_FFA
Definition Group.h:66
@ PLAYER_FLAGS_GHOST
Definition Player.h:516
#define sRealmList
Definition RealmList.h:95
Targets
@ AFLAG_SCALABLE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:565
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void append(T value)
Definition ByteBuffer.h:131
void ResetBitPos()
Definition ByteBuffer.h:153
void FlushBits()
Definition ByteBuffer.h:142
Definition Pet.h:40
static void FillPartyMemberPhase(WorldPackets::Party::PartyMemberPhaseStates *partyMemberPhases, PhaseShift const &phaseShift)
ChrSpecialization GetPrimarySpecialization() const
Definition Player.h:1993
UF::UpdateField< UF::PlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_PLAYER > m_playerData
Definition Player.h:3047
Pet * GetPet() const
Definition Player.cpp:22007
bool isDND() const
Definition Player.h:1268
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:2895
bool isAFK() const
Definition Player.h:1267
Vehicle * GetVehicle() const
Definition Unit.h:1800
bool IsPvP() const
Definition Unit.h:901
Powers GetPowerType() const
Definition Unit.h:823
bool IsAlive() const
Definition Unit.h:1205
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10105
uint64 GetMaxHealth() const
Definition Unit.h:801
uint64 GetHealth() const
Definition Unit.h:800
bool IsFFAPvP() const
Definition Unit.h:902
int32 GetPower(Powers power) const
Definition Unit.cpp:10096
VisibleAuraContainer const & GetVisibleAuras() const
Definition Unit.h:1619
uint8 GetLevel() const
Definition Unit.h:769
PhaseShift & GetPhaseShift()
Definition Object.h:310
WmoLocation const * GetCurrentWmo() const
Definition Object.h:338
std::string const & GetName() const
Definition Object.h:342
uint32 GetZoneId() const
Definition Object.h:332
WorldPacket _worldPacket
Definition Packet.h:43
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< uint32 > LfgSlots
void Initialize(Player const *inviter, int32 proposedRoles, bool canAccept)
Auth::VirtualRealmInfo InviterRealm
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
Optional< PartyLootSettings > LootSettings
Optional< PartyDifficultySettings > DifficultySettings
Optional< ChallengeModeData > ChallengeMode
std::vector< PartyPlayerInfo > PlayerList
WorldPacket const * Write() override
Optional< PartyLFGInfo > LfgInfos
WorldPacket const * Write() override
std::vector< RaidMarker const * > RaidMarkers
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPackets::Duration< Milliseconds > Duration
WorldPackets::Duration< Milliseconds, int32 > Remaining
WorldPackets::Duration< Milliseconds, int32 > Duration
WorldPacket const * Write() override
Duration< Milliseconds, int32 > PingDuration
WorldPacket const * Write() override
Duration< Milliseconds, int32 > PingDuration
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > Point
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPackets::Duration< Milliseconds, int32 > Remaining
WorldPackets::Duration< Milliseconds, int32 > Duration
Optional< uint32 > SpellOverrideNameID
Duration< Milliseconds, int32 > PingDuration
TaggedPosition< Position::XYZ > Point
Duration< Milliseconds, int32 > PingDuration
std::vector< std::pair< uint8, ObjectGuid > > TargetIcons
Optional< uint8 > PartyIndex
ByteBuffer & operator<<(ByteBuffer &data, PartyMemberPhase const &phase)
DataWriter< Container > Data(Container const &value)
DataWriter< Container > Data(Container const &value)
OptionalInitWriter< T > OptionalInit(Optional< T > const &value)
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr float GetPositionZ() const
Definition Position.h:89
std::span< uint32 const > ConditionalFlags
Duration< Milliseconds > InstanceAbandonVoteCooldown
std::vector< PartyMemberAuraStates > Auras
std::vector< PartyMemberPhase > List
Optional< PartyMemberPetStats > PetStats
std::vector< PartyMemberAuraStates > Auras
MythicPlus::DungeonScoreSummary DungeonScore