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<8>(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
242 for (PartyMemberAuraStates const& aura : memberStats.Auras)
243 data << aura;
244
245 data << OptionalInit(memberStats.PetStats);
246 data.FlushBits();
247
248 data << memberStats.DungeonScore;
249
250 if (memberStats.PetStats)
251 data << *memberStats.PetStats;
252
253 return data;
254}
255
257{
258 _worldPacket << Bits<1>(ForEnemy);
259
262
263 return &_worldPacket;
264}
265
273
283
292
303
310
320
329
338
347
357
359{
361 _worldPacket << Size<uint32>(TargetIcons);
362
363 for (auto& [symbol, target] : TargetIcons)
364 {
365 _worldPacket << target;
366 _worldPacket << uint8(symbol);
367 }
368
369 return &_worldPacket;
370}
371
373{
374 _worldPacket >> Bits<1>(Raid);
375}
376
383
392
399
409
417
419{
422
423 _worldPacket << Bits<1>(IsReady);
425
426 return &_worldPacket;
427}
428
436
438{
439 _worldPacket >> Bits<1>(PassOnLoot);
440}
441
448
450{
453
454 return &_worldPacket;
455}
456
458{
460 _worldPacket << SizedString::BitsSize<9>(Name);
461
463
464 return &_worldPacket;
465}
466
467ByteBuffer& operator<<(ByteBuffer& data, LeaverInfo const& leaverInfo)
468{
469 data << leaverInfo.BnetAccountGUID;
470 data << float(leaverInfo.LeaveScore);
471 data << uint32(leaverInfo.SeasonID);
472 data << uint32(leaverInfo.TotalLeaves);
473 data << uint32(leaverInfo.TotalSuccesses);
474 data << int32(leaverInfo.ConsecutiveSuccesses);
475 data << leaverInfo.LastPenaltyTime;
476 data << leaverInfo.LeaverExpirationTime;
477 data << int32(leaverInfo.Unknown_1120);
478 data << Bits<1>(leaverInfo.LeaverStatus);
479 data.FlushBits();
480
481 return data;
482}
483
485{
486 data << SizedString::BitsSize<6>(playerInfo.Name);
487 data << SizedCString::BitsSize<6>(playerInfo.VoiceStateID);
488 data << Bits<1>(playerInfo.Connected);
489 data << Bits<1>(playerInfo.VoiceChatSilenced);
490 data << Bits<1>(playerInfo.FromSocialQueue);
491 data << playerInfo.Leaver;
492 data << playerInfo.GUID;
493 data << uint8(playerInfo.Subgroup);
494 data << uint8(playerInfo.Flags);
495 data << uint8(playerInfo.RolesAssigned);
496 data << uint8(playerInfo.Class);
497 data << uint8(playerInfo.FactionGroup);
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
591
599
608
617
622
624{
627
628 _worldPacket << BitsSize<4>(RaidMarkers);
630
631 for (RaidMarker const* raidMarker : RaidMarkers)
632 {
633 _worldPacket << raidMarker->TransportGUID;
634 _worldPacket << raidMarker->Location.GetMapId();
635 _worldPacket << raidMarker->Location.PositionXYZStream();
636 }
637
638 return &_worldPacket;
639}
640
642{
643 ForEnemy = false;
644
645 MemberGuid = player->GetGUID();
646
647 // Status
649
650 if (player->IsPvP())
652
653 if (!player->IsAlive())
654 {
657 else
659 }
660
661 if (player->IsFFAPvP())
663
664 if (player->isAFK())
666
667 if (player->isDND())
669
670 if (player->GetVehicle())
672
673 // Level
674 MemberStats.Level = player->GetLevel();
675
676 // Health
679
680 // Power
683 MemberStats.CurrentPower = player->GetPower(player->GetPowerType());
684 MemberStats.MaxPower = player->GetMaxPower(player->GetPowerType());
685
686 // Position
687 MemberStats.ZoneID = player->GetZoneId();
691
693 MemberStats.PartyType[0] = player->m_playerData->PartyType[0];
694 MemberStats.PartyType[1] = player->m_playerData->PartyType[1];
695
696 if (WmoLocation const* wmoLocation = player->GetCurrentWmo())
697 {
698 MemberStats.WmoGroupID = wmoLocation->GroupId;
699 MemberStats.WmoDoodadPlacementID = wmoLocation->UniqueId;
700 }
701
702 // Vehicle
703 if (::Vehicle const* vehicle = player->GetVehicle())
704 if (VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(player))
705 MemberStats.VehicleSeat = vehicleSeat->ID;
706
707 // Auras
708 for (AuraApplication const* aurApp : player->GetVisibleAuras())
709 {
710 PartyMemberAuraStates& aura = MemberStats.Auras.emplace_back();
711
712 aura.SpellID = aurApp->GetBase()->GetId();
713 aura.ActiveFlags = aurApp->GetEffectMask();
714 aura.Flags = aurApp->GetFlags();
715
716 if (aurApp->GetFlags() & AFLAG_SCALABLE)
717 for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects())
718 if (aurApp->HasEffect(aurEff->GetEffIndex()))
719 aura.Points.push_back(float(aurEff->GetAmount()));
720 }
721
722 // Phases
724
725 // Pet
726 if (::Pet* pet = player->GetPet())
727 {
728 MemberStats.PetStats.emplace();
729
730 MemberStats.PetStats->GUID = pet->GetGUID();
731 MemberStats.PetStats->Name = pet->GetName();
732 MemberStats.PetStats->ModelId = pet->GetDisplayId();
733
734 MemberStats.PetStats->CurrentHealth = pet->GetHealth();
735 MemberStats.PetStats->MaxHealth = pet->GetMaxHealth();
736
737 for (AuraApplication const* aurApp : pet->GetVisibleAuras())
738 {
739 PartyMemberAuraStates& aura = MemberStats.PetStats->Auras.emplace_back();
740
741 aura.SpellID = aurApp->GetBase()->GetId();
742 aura.ActiveFlags = aurApp->GetEffectMask();
743 aura.Flags = aurApp->GetFlags();
744
745 if (aurApp->GetFlags() & AFLAG_SCALABLE)
746 for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects())
747 if (aurApp->HasEffect(aurEff->GetEffIndex()))
748 aura.Points.push_back(float(aurEff->GetAmount()));
749 }
750 }
751
752 MemberStats.ChromieTime.ConditionalFlags = player->m_playerData->CtrOptions->ConditionalFlags;
753 MemberStats.ChromieTime.FactionGroup = player->m_playerData->CtrOptions->FactionGroup;
754 MemberStats.ChromieTime.ChromieTimeExpansionMask = player->m_playerData->CtrOptions->ChromieTimeExpansionMask;
755}
756
758{
761
762 return &_worldPacket;
763}
764
766{
768
769 return &_worldPacket;
770}
771
773{
775 _worldPacket << Bits<1>(Accepted);
777
778 return &_worldPacket;
779}
780
788
804
824
835
848
856}
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:524
#define sRealmList
Definition RealmList.h:93
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:130
void ResetBitPos()
Definition ByteBuffer.h:152
void FlushBits()
Definition ByteBuffer.h:141
Definition Pet.h:40
static void FillPartyMemberPhase(WorldPackets::Party::PartyMemberPhaseStates *partyMemberPhases, PhaseShift const &phaseShift)
ChrSpecialization GetPrimarySpecialization() const
Definition Player.h:2008
UF::UpdateField< UF::PlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_PLAYER > m_playerData
Definition Player.h:3061
Pet * GetPet() const
Definition Player.cpp:22060
bool isDND() const
Definition Player.h:1284
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:2910
bool isAFK() const
Definition Player.h:1283
Vehicle * GetVehicle() const
Definition Unit.h:1784
bool IsPvP() const
Definition Unit.h:886
Powers GetPowerType() const
Definition Unit.h:811
bool IsAlive() const
Definition Unit.h:1185
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10037
uint64 GetMaxHealth() const
Definition Unit.h:789
uint64 GetHealth() const
Definition Unit.h:788
bool IsFFAPvP() const
Definition Unit.h:887
int32 GetPower(Powers power) const
Definition Unit.cpp:10028
VisibleAuraContainer const & GetVisibleAuras() const
Definition Unit.h:1592
uint8 GetLevel() const
Definition Unit.h:757
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
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
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