Core/PacketIO: Updated packet structures to 8.2

This commit is contained in:
Shauren
2019-07-12 20:41:33 +02:00
parent 901d36b0a7
commit 0e4c569770
36 changed files with 962 additions and 861 deletions

View File

@@ -22,7 +22,7 @@ ArenaScore::ArenaScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(p
{
}
void ArenaScore::BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const
void ArenaScore::BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -27,7 +27,7 @@ struct TC_GAME_API ArenaScore : public BattlegroundScore
protected:
ArenaScore(ObjectGuid playerGuid, uint32 team);
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override;
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override;
// For Logging purpose
std::string ToString() const override;

View File

@@ -1276,13 +1276,10 @@ bool Battleground::HasFreeSlots() const
void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPLogData& pvpLogData) const
{
if (GetStatus() == STATUS_WAIT_LEAVE)
pvpLogData.Winner = GetWinner();
pvpLogData.Players.reserve(GetPlayerScoresSize());
pvpLogData.Statistics.reserve(GetPlayerScoresSize());
for (auto const& score : PlayerScores)
{
WorldPackets::Battleground::PVPLogData::PlayerData playerData;
WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics playerData;
score.second->BuildPvPLogPlayerDataPacket(playerData);
if (Player* player = ObjectAccessor::GetPlayer(GetBgMap(), playerData.PlayerGUID))
@@ -1295,7 +1292,7 @@ void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPLogData&
playerData.HonorLevel = player->GetHonorLevel();
}
pvpLogData.Players.push_back(playerData);
pvpLogData.Statistics.push_back(playerData);
}
pvpLogData.PlayerCount[BG_TEAM_HORDE] = int8(GetPlayersCountByTeam(HORDE));

View File

@@ -56,7 +56,7 @@ void BattlegroundScore::UpdateScore(uint32 type, uint32 value)
}
}
void BattlegroundScore::BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const
void BattlegroundScore::BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const
{
playerData.PlayerGUID = PlayerGuid;
playerData.Kills = KillingBlows;

View File

@@ -63,7 +63,7 @@ struct BattlegroundScore
virtual void UpdateScore(uint32 type, uint32 value);
virtual void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const;
virtual void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const;
// For Logging purpose
virtual std::string ToString() const { return ""; }

View File

@@ -294,7 +294,7 @@ struct BattlegroundABScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -1597,7 +1597,7 @@ struct BattlegroundAVScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -42,7 +42,7 @@ class BattlegroundBFGScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -377,7 +377,7 @@ struct BattlegroundEYScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -937,7 +937,7 @@ struct BattlegroundICScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -540,7 +540,7 @@ struct BattlegroundSAScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -42,7 +42,7 @@ class BattlegroundTPScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -193,7 +193,7 @@ struct BattlegroundWGScore final : public BattlegroundScore
}
}
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PlayerData& playerData) const override
void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics& playerData) const override
{
BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData);

View File

@@ -505,55 +505,151 @@ void AzeriteEmpoweredItemData::ClearChangesMask()
_changesMask.ResetAll();
}
void UnlockedAzeriteEssence::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
data << uint32(AzeriteEssenceID);
data << uint32(Rank);
}
void UnlockedAzeriteEssence::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
data.FlushBits();
data << uint32(AzeriteEssenceID);
data << uint32(Rank);
}
void SelectedAzeriteEssences::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
for (std::size_t i = 0; i < 3; ++i)
{
data << uint32(AzeriteEssenceID[i]);
}
data << uint32(Field_0);
data.WriteBits(Enabled, 1);
data.FlushBits();
}
void SelectedAzeriteEssences::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
data.FlushBits();
data << uint32(Field_0);
data.WriteBits(Enabled, 1);
for (std::size_t i = 0; i < 3; ++i)
{
data << uint32(AzeriteEssenceID[i]);
}
data.FlushBits();
}
void AzeriteItemData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
data << uint64(Xp);
data << uint32(Level);
data << uint32(AuraLevel);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint64(Xp);
data << uint32(Level);
data << uint32(AuraLevel);
data << uint32(KnowledgeLevel);
data << uint32(DEBUGknowledgeWeek);
}
data << uint32(UnlockedEssences.size());
data << uint32(SelectedEssences.size());
data << uint32(UnlockedEssenceMilestones.size());
for (std::size_t i = 0; i < UnlockedEssences.size(); ++i)
{
UnlockedEssences[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver);
}
for (std::size_t i = 0; i < UnlockedEssenceMilestones.size(); ++i)
{
data << uint32(UnlockedEssenceMilestones[i]);
}
for (std::size_t i = 0; i < SelectedEssences.size(); ++i)
{
SelectedEssences[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver);
}
}
void AzeriteItemData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
UpdateMask<6> allowedMaskForTarget({ 0x0000000Fu });
UpdateMask<9> allowedMaskForTarget({ 0x0000000Fu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, fieldVisibilityFlags, owner, receiver);
}
void AzeriteItemData::AppendAllowedFieldsMaskForFlag(UpdateMask<6>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const
void AzeriteItemData::AppendAllowedFieldsMaskForFlag(UpdateMask<9>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
allowedMaskForTarget |= { 0x00000030u };
allowedMaskForTarget |= { 0x000001F0u };
}
void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<6> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 6);
data.WriteBits(changesMask.GetBlock(0), 9);
if (changesMask[0])
{
if (changesMask[1])
{
UnlockedEssences.WriteUpdateMask(data);
}
if (changesMask[2])
{
UnlockedEssenceMilestones.WriteUpdateMask(data);
}
if (changesMask[3])
{
SelectedEssences.WriteUpdateMask(data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << uint64(Xp);
for (std::size_t i = 0; i < UnlockedEssences.size(); ++i)
{
if (UnlockedEssences.HasChanged(i))
{
UnlockedEssences[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver);
}
}
}
if (changesMask[2])
{
data << uint32(Level);
for (std::size_t i = 0; i < UnlockedEssenceMilestones.size(); ++i)
{
if (UnlockedEssenceMilestones.HasChanged(i))
{
data << uint32(UnlockedEssenceMilestones[i]);
}
}
}
if (changesMask[3])
{
data << uint32(AuraLevel);
for (std::size_t i = 0; i < SelectedEssences.size(); ++i)
{
if (SelectedEssences.HasChanged(i))
{
SelectedEssences[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver);
}
}
}
if (changesMask[4])
{
data << uint32(KnowledgeLevel);
data << uint64(Xp);
}
if (changesMask[5])
{
data << uint32(Level);
}
if (changesMask[6])
{
data << uint32(AuraLevel);
}
if (changesMask[7])
{
data << uint32(KnowledgeLevel);
}
if (changesMask[8])
{
data << uint32(DEBUGknowledgeWeek);
}
@@ -562,6 +658,9 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<6> const& changes
void AzeriteItemData::ClearChangesMask()
{
Base::ClearChangesMask(UnlockedEssences);
Base::ClearChangesMask(UnlockedEssenceMilestones);
Base::ClearChangesMask(SelectedEssences);
Base::ClearChangesMask(Xp);
Base::ClearChangesMask(Level);
Base::ClearChangesMask(AuraLevel);
@@ -2273,7 +2372,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
data << float(VersatilityBonus);
data << float(PvpPowerDamage);
data << float(PvpPowerHealing);
for (std::size_t i = 0; i < 160; ++i)
for (std::size_t i = 0; i < 192; ++i)
{
data << uint64(ExploredZones[i]);
}
@@ -2442,6 +2541,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
{
SpellFlatModByLabel[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver);
}
for (std::size_t i = 0; i < 6; ++i)
{
PvpInfo[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver);
}
data.WriteBit(BackpackAutoSortDisabled);
data.WriteBit(BankAutoSortDisabled);
data.WriteBit(SortBagsRightToLeft);
@@ -2450,20 +2553,16 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
{
CharacterRestrictions[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver);
}
for (std::size_t i = 0; i < 6; ++i)
{
PvpInfo[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver);
}
data.FlushBits();
}
void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
UpdateMask<1455> const& changesMask = _changesMask;
UpdateMask<1487> const& changesMask = _changesMask;
for (std::size_t i = 0; i < 1; ++i)
data << uint32(changesMask.GetBlocksMask(i));
data.WriteBits(changesMask.GetBlocksMask(1), 14);
for (std::size_t i = 0; i < 46; ++i)
data.WriteBits(changesMask.GetBlocksMask(1), 15);
for (std::size_t i = 0; i < 47; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -3061,7 +3160,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
}
if (changesMask[300])
{
for (std::size_t i = 0; i < 160; ++i)
for (std::size_t i = 0; i < 192; ++i)
{
if (changesMask[301 + i])
{
@@ -3069,127 +3168,127 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
}
}
}
if (changesMask[461])
if (changesMask[493])
{
for (std::size_t i = 0; i < 2; ++i)
{
if (changesMask[462 + i])
if (changesMask[494 + i])
{
RestInfo[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver);
}
}
}
if (changesMask[464])
if (changesMask[496])
{
for (std::size_t i = 0; i < 7; ++i)
{
if (changesMask[465 + i])
if (changesMask[497 + i])
{
data << int32(ModDamageDonePos[i]);
}
if (changesMask[472 + i])
if (changesMask[504 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
if (changesMask[479 + i])
if (changesMask[511 + i])
{
data << float(ModDamageDonePercent[i]);
}
}
}
if (changesMask[486])
if (changesMask[518])
{
for (std::size_t i = 0; i < 3; ++i)
{
if (changesMask[487 + i])
if (changesMask[519 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
if (changesMask[490 + i])
if (changesMask[522 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
if (changesMask[493])
if (changesMask[525])
{
for (std::size_t i = 0; i < 12; ++i)
{
if (changesMask[494 + i])
if (changesMask[526 + i])
{
data << uint32(BuybackPrice[i]);
}
if (changesMask[506 + i])
if (changesMask[538 + i])
{
data << uint32(BuybackTimestamp[i]);
}
}
}
if (changesMask[518])
if (changesMask[550])
{
for (std::size_t i = 0; i < 32; ++i)
{
if (changesMask[519 + i])
if (changesMask[551 + i])
{
data << int32(CombatRatings[i]);
}
}
}
if (changesMask[558])
if (changesMask[590])
{
for (std::size_t i = 0; i < 4; ++i)
{
if (changesMask[559 + i])
if (changesMask[591 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
if (changesMask[563])
if (changesMask[595])
{
for (std::size_t i = 0; i < 2; ++i)
{
if (changesMask[564 + i])
if (changesMask[596 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
if (changesMask[566])
if (changesMask[598])
{
for (std::size_t i = 0; i < 4; ++i)
{
if (changesMask[567 + i])
if (changesMask[599 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
if (changesMask[571])
if (changesMask[603])
{
for (std::size_t i = 0; i < 7; ++i)
{
if (changesMask[572 + i])
if (changesMask[604 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
if (changesMask[579])
if (changesMask[611])
{
for (std::size_t i = 0; i < 875; ++i)
{
if (changesMask[580 + i])
if (changesMask[612 + i])
{
data << uint64(QuestCompleted[i]);
}
}
}
if (changesMask[551])
if (changesMask[583])
{
for (std::size_t i = 0; i < 6; ++i)
{
if (changesMask[552 + i])
if (changesMask[584 + i])
{
PvpInfo[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver);
}
@@ -3341,8 +3440,8 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag
data << int32(ViewerDependentValue<LevelTag>::GetValue(Level, owner, receiver));
data << int8(ViewerDependentValue<StateTag>::GetValue(State, owner, receiver));
data << int8(TypeID);
data << uint8(ArtKit);
data << uint8(PercentHealth);
data << uint32(ArtKit);
data << uint32(EnableDoodadSets.size());
data << uint32(CustomParam);
for (std::size_t i = 0; i < EnableDoodadSets.size(); ++i)
@@ -3449,11 +3548,11 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag
}
if (changesMask[17])
{
data << uint8(ArtKit);
data << uint8(PercentHealth);
}
if (changesMask[18])
{
data << uint8(PercentHealth);
data << uint32(ArtKit);
}
if (changesMask[19])
{
@@ -3480,8 +3579,8 @@ void GameObjectData::ClearChangesMask()
Base::ClearChangesMask(Level);
Base::ClearChangesMask(State);
Base::ClearChangesMask(TypeID);
Base::ClearChangesMask(ArtKit);
Base::ClearChangesMask(PercentHealth);
Base::ClearChangesMask(ArtKit);
Base::ClearChangesMask(CustomParam);
_changesMask.ResetAll();
}
@@ -3895,11 +3994,12 @@ void ConversationActor::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldF
void ConversationData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const
{
data << uint32(Lines->size());
data << int32(LastLineEndTime);
data << uint32(Field_1C);
for (std::size_t i = 0; i < Lines->size(); ++i)
{
(*Lines)[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver);
}
data << int32(LastLineEndTime);
data << uint32(Actors.size());
for (std::size_t i = 0; i < Actors.size(); ++i)
{
@@ -3909,8 +4009,8 @@ void ConversationData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
void ConversationData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const
{
UpdateMask<4> const& changesMask = _changesMask;
data.WriteBits(changesMask.GetBlock(0), 4);
UpdateMask<5> const& changesMask = _changesMask;
data.WriteBits(changesMask.GetBlock(0), 5);
if (changesMask[0])
{
@@ -3948,6 +4048,10 @@ void ConversationData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
{
data << int32(LastLineEndTime);
}
if (changesMask[4])
{
data << uint32(Field_1C);
}
}
}
@@ -3956,6 +4060,7 @@ void ConversationData::ClearChangesMask()
Base::ClearChangesMask(Lines);
Base::ClearChangesMask(Actors);
Base::ClearChangesMask(LastLineEndTime);
Base::ClearChangesMask(Field_1C);
_changesMask.ResetAll();
}

View File

@@ -134,18 +134,40 @@ struct AzeriteEmpoweredItemData : public IsUpdateFieldStructureTag, public HasCh
void ClearChangesMask();
};
struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask<6>
struct UnlockedAzeriteEssence : public IsUpdateFieldStructureTag
{
UpdateField<uint64, 0, 1> Xp;
UpdateField<uint32, 0, 2> Level;
UpdateField<uint32, 0, 3> AuraLevel;
UpdateField<uint32, 0, 4> KnowledgeLevel;
UpdateField<uint32, 0, 5> DEBUGknowledgeWeek;
uint32 AzeriteEssenceID;
uint32 Rank;
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void AppendAllowedFieldsMaskForFlag(UpdateMask<6>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
void WriteUpdate(ByteBuffer& data, UpdateMask<6> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
};
struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag
{
uint32 Field_0;
uint32 Enabled;
uint32 AzeriteEssenceID[3];
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
};
struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask<9>
{
DynamicUpdateField<UnlockedAzeriteEssence, 0, 1> UnlockedEssences;
DynamicUpdateField<uint32, 0, 2> UnlockedEssenceMilestones;
DynamicUpdateField<SelectedAzeriteEssences, 0, 3> SelectedEssences;
UpdateField<uint64, 0, 4> Xp;
UpdateField<uint32, 0, 5> Level;
UpdateField<uint32, 0, 6> AuraLevel;
UpdateField<uint32, 0, 7> KnowledgeLevel;
UpdateField<uint32, 0, 8> DEBUGknowledgeWeek;
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void AppendAllowedFieldsMaskForFlag(UpdateMask<9>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
void WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void ClearChangesMask();
};
@@ -471,7 +493,7 @@ struct Research : public IsUpdateFieldStructureTag
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
};
struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1455>
struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1487>
{
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
UpdateField<bool, 0, 2> BankAutoSortDisabled;
@@ -571,22 +593,22 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
UpdateField<uint8, 98, 100> NumBankSlots;
UpdateFieldArray<ObjectGuid, 195, 101, 102> InvSlots;
UpdateFieldArray<uint32, 2, 297, 298> TrackResourceMask;
UpdateFieldArray<uint64, 160, 300, 301> ExploredZones;
UpdateFieldArray<RestInfo, 2, 461, 462> RestInfo;
UpdateFieldArray<int32, 7, 464, 465> ModDamageDonePos;
UpdateFieldArray<int32, 7, 464, 472> ModDamageDoneNeg;
UpdateFieldArray<float, 7, 464, 479> ModDamageDonePercent;
UpdateFieldArray<float, 3, 486, 487> WeaponDmgMultipliers;
UpdateFieldArray<float, 3, 486, 490> WeaponAtkSpeedMultipliers;
UpdateFieldArray<uint32, 12, 493, 494> BuybackPrice;
UpdateFieldArray<uint32, 12, 493, 506> BuybackTimestamp;
UpdateFieldArray<int32, 32, 518, 519> CombatRatings;
UpdateFieldArray<PVPInfo, 6, 551, 552> PvpInfo;
UpdateFieldArray<uint32, 4, 558, 559> NoReagentCostMask;
UpdateFieldArray<int32, 2, 563, 564> ProfessionSkillLine;
UpdateFieldArray<uint32, 4, 566, 567> BagSlotFlags;
UpdateFieldArray<uint32, 7, 571, 572> BankBagSlotFlags;
UpdateFieldArray<uint64, 875, 579, 580> QuestCompleted;
UpdateFieldArray<uint64, 192, 300, 301> ExploredZones;
UpdateFieldArray<RestInfo, 2, 493, 494> RestInfo;
UpdateFieldArray<int32, 7, 496, 497> ModDamageDonePos;
UpdateFieldArray<int32, 7, 496, 504> ModDamageDoneNeg;
UpdateFieldArray<float, 7, 496, 511> ModDamageDonePercent;
UpdateFieldArray<float, 3, 518, 519> WeaponDmgMultipliers;
UpdateFieldArray<float, 3, 518, 522> WeaponAtkSpeedMultipliers;
UpdateFieldArray<uint32, 12, 525, 526> BuybackPrice;
UpdateFieldArray<uint32, 12, 525, 538> BuybackTimestamp;
UpdateFieldArray<int32, 32, 550, 551> CombatRatings;
UpdateFieldArray<PVPInfo, 6, 583, 584> PvpInfo;
UpdateFieldArray<uint32, 4, 590, 591> NoReagentCostMask;
UpdateFieldArray<int32, 2, 595, 596> ProfessionSkillLine;
UpdateFieldArray<uint32, 4, 598, 599> BagSlotFlags;
UpdateFieldArray<uint32, 7, 603, 604> BankBagSlotFlags;
UpdateFieldArray<uint64, 875, 611, 612> QuestCompleted;
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
@@ -614,8 +636,8 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<
UpdateField<int8, 0, 15> State;
struct StateTag : ViewerDependentValueTag<int8> {};
UpdateField<int8, 0, 16> TypeID;
UpdateField<uint8, 0, 17> ArtKit;
UpdateField<uint8, 0, 18> PercentHealth;
UpdateField<uint8, 0, 17> PercentHealth;
UpdateField<uint32, 0, 18> ArtKit;
UpdateField<uint32, 0, 19> CustomParam;
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const;
@@ -730,11 +752,12 @@ struct ConversationActor : public IsUpdateFieldStructureTag
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const;
};
struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<4>
struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<5>
{
UpdateField<std::vector<ConversationLine>, 0, 1> Lines;
DynamicUpdateField<ConversationActor, 0, 2> Actors;
UpdateField<int32, 0, 3> LastLineEndTime;
UpdateField<uint32, 0, 4> Field_1C;
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const;

View File

@@ -122,7 +122,7 @@ enum SkillFieldOffset : uint16
SKILL_PERM_BONUS_OFFSET = SKILL_TEMP_BONUS_OFFSET + CalculateSkillFieldArraySize<uint16>()
};
#define PLAYER_EXPLORED_ZONES_SIZE 160
#define PLAYER_EXPLORED_ZONES_SIZE 192
// Note: SPELLMOD_* values is aura types in fact
enum SpellModType : uint8

View File

@@ -43,25 +43,14 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect)
return;
WorldPackets::Inspect::InspectResult inspectResult;
inspectResult.InspecteeGUID = inspect.Target;
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i))
inspectResult.Items.emplace_back(item, i);
}
inspectResult.ClassID = player->getClass();
inspectResult.GenderID = player->m_playerData->NativeSex;
inspectResult.DisplayInfo.Initialize(player);
if (GetPlayer()->CanBeGameMaster() || sWorld->getIntConfig(CONFIG_TALENTS_INSPECTING) + (GetPlayer()->GetTeamId() == player->GetTeamId()) > 1)
{
PlayerTalentMap const* talents = player->GetTalentMap(player->GetActiveTalentGroup());
for (PlayerTalentMap::value_type const& v : *talents)
{
if (v.second != PLAYERSPELL_REMOVED)
inspectResult.Talents.push_back(v.first);
}
PlayerPvpTalentMap const& pvpTalents = player->GetPvpTalentMap(player->GetActiveTalentGroup());
for (std::size_t i = 0; i < pvpTalents.size(); ++i)
@@ -76,8 +65,7 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect)
inspectResult.GuildData->AchievementPoints = guild->GetAchievementMgr().GetAchievementPoints();
}
inspectResult.InspecteeGUID = inspect.Target;
inspectResult.SpecializationID = player->GetPrimarySpecialization();
inspectResult.ItemLevel = int32(player->GetAverageItemLevel());
inspectResult.LifetimeMaxRank = player->m_activePlayerData->LifetimeMaxRank;
inspectResult.TodayHK = player->m_activePlayerData->TodayHonorableKills;
inspectResult.YesterdayHK = player->m_activePlayerData->YesterdayHonorableKills;

View File

@@ -1207,68 +1207,6 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC
_player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
}
void WorldSession::HandleUpgradeItem(WorldPackets::Item::UpgradeItem& upgradeItem)
{
WorldPackets::Item::ItemUpgradeResult itemUpgradeResult;
if (!_player->GetNPCIfCanInteractWith(upgradeItem.ItemMaster, UNIT_NPC_FLAG_NONE, UNIT_NPC_FLAG_2_ITEM_UPGRADE_MASTER))
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - %s not found or player can't interact with it.", upgradeItem.ItemMaster.ToString().c_str());
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
Item* item = _player->GetItemByGuid(upgradeItem.ItemGUID);
if (!item)
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems: Item %s not found!", upgradeItem.ItemGUID.ToString().c_str());
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
ItemUpgradeEntry const* itemUpgradeEntry = sItemUpgradeStore.LookupEntry(upgradeItem.UpgradeID);
if (!itemUpgradeEntry)
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - ItemUpgradeEntry (%u) not found.", upgradeItem.UpgradeID);
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
// Check if player has enough currency
if (!_player->HasCurrency(itemUpgradeEntry->CurrencyType, itemUpgradeEntry->CurrencyAmount))
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - Player has not enougth currency (ID: %u, Cost: %u) not found.", itemUpgradeEntry->CurrencyType, itemUpgradeEntry->CurrencyAmount);
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
uint32 currentUpgradeId = item->GetModifier(ITEM_MODIFIER_UPGRADE_ID);
if (currentUpgradeId != itemUpgradeEntry->PrerequisiteID)
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - ItemUpgradeEntry (%u) is not related to this ItemUpgradePath (%u).", itemUpgradeEntry->ID, currentUpgradeId);
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
itemUpgradeResult.Success = true;
SendPacket(itemUpgradeResult.Write());
if (item->IsEquipped())
_player->_ApplyItemBonuses(item, item->GetSlot(), false);
item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, itemUpgradeEntry->ID);
if (item->IsEquipped())
_player->_ApplyItemBonuses(item, item->GetSlot(), true);
item->SetState(ITEM_CHANGED, _player);
_player->ModifyCurrency(itemUpgradeEntry->CurrencyType, -int32(itemUpgradeEntry->CurrencyAmount));
}
void WorldSession::HandleSortBags(WorldPackets::Item::SortBags& /*sortBags*/)
{
// TODO: Implement sorting

View File

@@ -21,6 +21,7 @@
#include "HmacHash.h"
#include "ObjectMgr.h"
#include "RSA.h"
#include "SHA256.h"
#include "Util.h"
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::VirtualRealmNameInfo const& virtualRealmInfo)
@@ -73,7 +74,7 @@ const WorldPacket* WorldPackets::Auth::Pong::Write()
WorldPacket const* WorldPackets::Auth::AuthChallenge::Write()
{
_worldPacket.append(DosChallenge, 8);
_worldPacket.append(DosChallenge.data(), DosChallenge.size());
_worldPacket.append(Challenge.data(), Challenge.size());
_worldPacket << uint8(DosZeroBits);
return &_worldPacket;
@@ -201,25 +202,6 @@ WorldPacket const* WorldPackets::Auth::WaitQueueUpdate::Write()
return &_worldPacket;
}
std::string const WorldPackets::Auth::ConnectTo::Haiku("An island of peace\nCorruption is brought ashore\nPandarens will rise\n\0\0", 71);
uint8 const WorldPackets::Auth::ConnectTo::PiDigits[130] =
{
0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93, 0x23, 0x84,
0x62, 0x64, 0x33, 0x83, 0x27, 0x95, 0x02, 0x88, 0x41, 0x97,
0x16, 0x93, 0x99, 0x37, 0x51, 0x05, 0x82, 0x09, 0x74, 0x94,
0x45, 0x92, 0x30, 0x78, 0x16, 0x40, 0x62, 0x86, 0x20, 0x89,
0x98, 0x62, 0x80, 0x34, 0x82, 0x53, 0x42, 0x11, 0x70, 0x67,
0x98, 0x21, 0x48, 0x08, 0x65, 0x13, 0x28, 0x23, 0x06, 0x64,
0x70, 0x93, 0x84, 0x46, 0x09, 0x55, 0x05, 0x82, 0x23, 0x17,
0x25, 0x35, 0x94, 0x08, 0x12, 0x84, 0x81, 0x11, 0x74, 0x50,
0x28, 0x41, 0x02, 0x70, 0x19, 0x38, 0x52, 0x11, 0x05, 0x55,
0x96, 0x44, 0x62, 0x29, 0x48, 0x95, 0x49, 0x30, 0x38, 0x19,
0x64, 0x42, 0x88, 0x10, 0x97, 0x56, 0x65, 0x93, 0x34, 0x46,
0x12, 0x84, 0x75, 0x64, 0x82, 0x33, 0x78, 0x67, 0x83, 0x16,
0x52, 0x71, 0x20, 0x19, 0x09, 0x14, 0x56, 0x48, 0x56, 0x69,
};
namespace
{
std::string RSAPrivateKey = R"(-----BEGIN RSA PRIVATE KEY-----
@@ -252,14 +234,6 @@ OHYtKG3GK3GEcFDwZU2LPHq21EroUAdtRfbrJ4KW2yc8igtXKxTBYw==
)";
std::unique_ptr<Trinity::Crypto::RSA> ConnectToRSA;
uint8 const WherePacketHmac[] =
{
0x2C, 0x1F, 0x1D, 0x80, 0xC3, 0x8C, 0x23, 0x64, 0xDA, 0x90, 0xCA, 0x8E, 0x2C, 0xFC, 0x0C, 0xCE,
0x09, 0xD3, 0x62, 0xF9, 0xF3, 0x8B, 0xBE, 0x9F, 0x19, 0xEF, 0x58, 0xA1, 0x1C, 0x34, 0x14, 0x41,
0x3F, 0x23, 0xFD, 0xD3, 0xE8, 0x14, 0xEC, 0x2A, 0xFD, 0x4F, 0x95, 0xBA, 0x30, 0x7E, 0x56, 0x5D,
0x83, 0x95, 0x81, 0x69, 0xB0, 0x5A, 0xB4, 0x9D, 0xA8, 0x55, 0xFF, 0xFC, 0xEE, 0x58, 0x0A, 0x2F
};
}
bool WorldPackets::Auth::ConnectTo::InitializeEncryption()
@@ -272,50 +246,44 @@ bool WorldPackets::Auth::ConnectTo::InitializeEncryption()
return true;
}
WorldPackets::Auth::ConnectTo::ConnectTo() : ServerPacket(SMSG_CONNECT_TO, 8 + 4 + 256 + 1)
WorldPackets::Auth::ConnectTo::ConnectTo() : ServerPacket(SMSG_CONNECT_TO, 256 + 1 + 16 + 2 + 4 + 1 + 8)
{
Payload.Where.fill(0);
HexStrToByteArray("F41DCB2D728CF3337A4FF338FA89DB01BBBE9C3B65E9DA96268687353E48B94C", Payload.PanamaKey);
Payload.Adler32 = 0xA0A66C10;
}
WorldPacket const* WorldPackets::Auth::ConnectTo::Write()
{
HmacSha1 hmacHash(64, WherePacketHmac);
hmacHash.UpdateData(Payload.Where.data(), 16);
hmacHash.UpdateData((uint8* const)&Payload.Type, 1);
hmacHash.UpdateData((uint8* const)&Payload.Port, 2);
hmacHash.UpdateData((uint8* const)Haiku.c_str(), 71);
hmacHash.UpdateData(Payload.PanamaKey, 32);
hmacHash.UpdateData(PiDigits, 108);
hmacHash.UpdateData(&Payload.XorMagic, 1);
hmacHash.Finalize();
ByteBuffer whereBuffer;
whereBuffer << uint8(Payload.Where.Type);
switch (Payload.Where.Type)
{
case IPv4:
whereBuffer.append(Payload.Where.Address.V4.data(), Payload.Where.Address.V4.size());
break;
case IPv6:
whereBuffer.append(Payload.Where.Address.V6.data(), Payload.Where.Address.V6.size());
break;
case NamedSocket:
whereBuffer << Payload.Where.Address.Name.data();
break;
default:
break;
}
ByteBuffer payload;
payload << uint32(Payload.Adler32);
payload << uint8(Payload.Type);
payload.append(Payload.Where.data(), 16);
payload << uint16(Payload.Port);
payload.append(Haiku.data(), 71);
payload.append(Payload.PanamaKey, 32);
payload.append(PiDigits, 108);
payload << uint8(Payload.XorMagic);
payload.append(hmacHash.GetDigest(), hmacHash.GetLength());
uint32 type = Payload.Where.Type;
SHA256Hash hash;
hash.UpdateData(whereBuffer.contents(), whereBuffer.size());
hash.UpdateData(reinterpret_cast<uint8 const*>(&type), 4);
hash.UpdateData(reinterpret_cast<uint8 const*>(&Payload.Port), 2);
hash.Finalize();
uint32 rsaSize = ConnectToRSA->GetOutputSize();
if (payload.size() < rsaSize)
payload.resize(rsaSize);
ConnectToRSA->Sign(hash.GetDigest(), hash.GetLength(), Payload.Signature.data(), Trinity::Crypto::RSA::SHA256{});
_worldPacket << uint64(Key);
_worldPacket.append(Payload.Signature.data(), Payload.Signature.size());
_worldPacket.append(whereBuffer);
_worldPacket << uint16(Payload.Port);
_worldPacket << uint32(Serial);
size_t encryptedPayloadPos = _worldPacket.wpos();
_worldPacket.resize(_worldPacket.size() + rsaSize);
_worldPacket << uint8(Con);
ConnectToRSA->Encrypt(payload.contents(), payload.size(),
_worldPacket.contents() + encryptedPayloadPos,
Trinity::Crypto::RSA::PrivateKey{},
Trinity::Crypto::RSA::NoPadding{});
_worldPacket << uint64(Key);
return &_worldPacket;
}
@@ -333,3 +301,22 @@ void WorldPackets::Auth::ConnectToFailed::Read()
Serial = _worldPacket.read<ConnectToSerial>();
_worldPacket >> Con;
}
uint8 constexpr EnableEncryptionSeed[16] = { 0x90, 0x9C, 0xD0, 0x50, 0x5A, 0x2C, 0x14, 0xDD, 0x5C, 0x2C, 0xC0, 0x64, 0x14, 0xF3, 0xFE, 0xC9 };
WorldPacket const* WorldPackets::Auth::EnableEncryption::Write()
{
HmacSha256 hash(16, EncryptionKey);
hash.UpdateData(reinterpret_cast<uint8 const*>(&Enabled), 1);
hash.UpdateData(EnableEncryptionSeed, 16);
hash.Finalize();
_worldPacket.resize(_worldPacket.size() + ConnectToRSA->GetOutputSize());
ConnectToRSA->Sign(hash.GetDigest(), hash.GetLength(), _worldPacket.contents(), Trinity::Crypto::RSA::SHA256{});
_worldPacket.WriteBit(Enabled);
_worldPacket.FlushBits();
return &_worldPacket;
}

View File

@@ -63,12 +63,12 @@ namespace WorldPackets
class AuthChallenge final : public ServerPacket
{
public:
AuthChallenge() : ServerPacket(SMSG_AUTH_CHALLENGE, 4 + 32 + 1) { }
AuthChallenge() : ServerPacket(SMSG_AUTH_CHALLENGE, 16 + 4 * 8 + 1) { }
WorldPacket const* Write() override;
std::array<uint8, 16> Challenge = { };
uint32 DosChallenge[8] = { }; ///< Encryption seeds
std::array<uint32, 8> DosChallenge = { };
uint8 DosZeroBits = 0;
};
@@ -200,26 +200,32 @@ namespace WorldPackets
class ConnectTo final : public ServerPacket
{
static std::string const Haiku;
static uint8 const PiDigits[130];
public:
static bool InitializeEncryption();
enum AddressType : uint8
{
IPv4 = 1,
IPv6 = 2
IPv6 = 2,
NamedSocket = 3 // not supported by windows client
};
struct SocketAddress
{
AddressType Type;
union
{
std::array<uint8, 4> V4;
std::array<uint8, 16> V6;
std::array<char, 128> Name;
} Address;
};
struct ConnectPayload
{
std::array<uint8, 16> Where;
SocketAddress Where;
uint16 Port;
AddressType Type;
uint32 Adler32 = 0;
uint8 XorMagic = 0x2A;
uint8 PanamaKey[32];
std::array<uint8, 256> Signature;
};
ConnectTo();
@@ -275,9 +281,15 @@ namespace WorldPackets
class EnableEncryption final : public ServerPacket
{
public:
EnableEncryption() : ServerPacket(SMSG_ENABLE_ENCRYPTION, 0) { }
EnableEncryption(uint8 const* encryptionKey, bool enabled) : ServerPacket(SMSG_ENABLE_ENCRYPTION, 256 + 1),
EncryptionKey(encryptionKey), Enabled(enabled)
{
}
WorldPacket const* Write() override { return &_worldPacket; }
WorldPacket const* Write() override;
uint8 const* EncryptionKey;
bool Enabled = false;
};
}
}

View File

@@ -19,9 +19,10 @@
WorldPacket const* WorldPackets::Battleground::PVPSeason::Write()
{
_worldPacket << uint32(CurrentSeason);
_worldPacket << uint32(PreviousSeason);
_worldPacket << uint32(PvpSeasonID);
_worldPacket << int32(MythicPlusSeasonID);
_worldPacket << int32(CurrentSeason);
_worldPacket << int32(PreviousSeason);
_worldPacket << int32(PvpSeasonID);
return &_worldPacket;
}
@@ -46,9 +47,12 @@ WorldPacket const* WorldPackets::Battleground::AreaSpiritHealerTime::Write()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData::RatingData const& ratingData)
{
data.append(ratingData.Prematch, 2);
data.append(ratingData.Postmatch, 2);
data.append(ratingData.PrematchMMR, 2);
for (std::size_t i = 0; i < 2; ++i)
{
data << int32(ratingData.Prematch[i]);
data << int32(ratingData.Postmatch[i]);
data << int32(ratingData.PrematchMMR[i]);
}
return data;
}
@@ -60,7 +64,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData:
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData::PlayerData const& playerData)
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics const& playerData)
{
data << playerData.PlayerGUID;
data << uint32(playerData.Kills);
@@ -105,20 +109,16 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData:
WorldPacket const* WorldPackets::Battleground::PVPLogData::Write()
{
_worldPacket.reserve(Players.size() * sizeof(PlayerData) + sizeof(PVPLogData));
_worldPacket.reserve(Statistics.size() * sizeof(PVPMatchPlayerStatistics) + sizeof(PVPLogData));
_worldPacket.WriteBit(Ratings.is_initialized());
_worldPacket.WriteBit(Winner.is_initialized());
_worldPacket << uint32(Players.size());
_worldPacket.append(PlayerCount, 2);
_worldPacket << uint32(Statistics.size());
_worldPacket.append(PlayerCount.data(), PlayerCount.size());
if (Ratings.is_initialized())
_worldPacket << *Ratings;
if (Winner)
_worldPacket << uint8(*Winner);
for (PlayerData const& player : Players)
for (PVPMatchPlayerStatistics const& player : Statistics)
_worldPacket << player;
return &_worldPacket;

View File

@@ -32,13 +32,14 @@ namespace WorldPackets
class PVPSeason final : public ServerPacket
{
public:
PVPSeason() : ServerPacket(SMSG_PVP_SEASON, 8) { }
PVPSeason() : ServerPacket(SMSG_PVP_SEASON, 4 + 4 + 4 + 4) { }
WorldPacket const* Write() override;
uint32 PreviousSeason = 0;
uint32 CurrentSeason = 0;
uint32 PvpSeasonID = 0;
int32 MythicPlusSeasonID = 0;
int32 PreviousSeason = 0;
int32 CurrentSeason = 0;
int32 PvpSeasonID = 0;
};
class AreaSpiritHealerQuery final : public ClientPacket
@@ -109,7 +110,7 @@ namespace WorldPackets
uint32 ContributionPoints = 0;
};
struct PlayerData
struct PVPMatchPlayerStatistics
{
ObjectGuid PlayerGUID;
uint32 Kills = 0;
@@ -131,10 +132,9 @@ namespace WorldPackets
int32 HonorLevel = 0;
};
Optional<uint8> Winner;
std::vector<PlayerData> Players;
std::vector<PVPMatchPlayerStatistics> Statistics;
Optional<RatingData> Ratings;
int8 PlayerCount[2] = { };
std::array<int8, 2> PlayerCount = { };
};
struct BattlefieldStatusHeader

View File

@@ -55,6 +55,7 @@ WorldPacket const* WorldPackets::Battlenet::Response::Write()
WorldPacket const* WorldPackets::Battlenet::SetSessionState::Write()
{
_worldPacket.WriteBits(State, 2);
_worldPacket.WriteBit(SuppressNotification);
_worldPacket.FlushBits();
return &_worldPacket;

View File

@@ -68,6 +68,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
uint8 State = 0;
bool SuppressNotification = true;
};
class RealmListTicket final : public ServerPacket

View File

@@ -65,7 +65,7 @@ WorldPacket const* WorldPackets::Channel::ChannelNotify::Write()
WorldPacket const* WorldPackets::Channel::ChannelNotifyJoined::Write()
{
_worldPacket.WriteBits(_Channel.length(), 7);
_worldPacket.WriteBits(ChannelWelcomeMsg.length(), 10);
_worldPacket.WriteBits(ChannelWelcomeMsg.length(), 11);
_worldPacket << uint32(_ChannelFlags);
_worldPacket << int32(ChatChannelID);
_worldPacket << uint64(InstanceID);

View File

@@ -236,7 +236,7 @@ namespace WorldPackets
class GarrisonBuildingRemoved final : public ServerPacket
{
public:
GarrisonBuildingRemoved() : ServerPacket(SMSG_GARRISON_BUILDING_REMOVED, 4 + 4 + 4) { }
GarrisonBuildingRemoved() : ServerPacket(SMSG_GARRISON_BUILDING_REMOVED, 4 + 4 + 4 + 4) { }
WorldPacket const* Write() override;
@@ -353,7 +353,7 @@ namespace WorldPackets
class GarrisonRemoveFollowerResult final : public ServerPacket
{
public:
GarrisonRemoveFollowerResult() : ServerPacket(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, 8 + 4 + 4) { }
GarrisonRemoveFollowerResult() : ServerPacket(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, 8 + 4 + 4 + 4) { }
WorldPacket const* Write() override;

View File

@@ -68,7 +68,7 @@ WorldPacket const* WorldPackets::Guild::GuildRoster::Write()
_worldPacket.AppendPackedTime(CreateDate);
_worldPacket << int32(GuildFlags);
_worldPacket << uint32(MemberData.size());
_worldPacket.WriteBits(WelcomeText.length(), 10);
_worldPacket.WriteBits(WelcomeText.length(), 11);
_worldPacket.WriteBits(InfoText.length(), 11);
_worldPacket.FlushBits();
@@ -93,7 +93,7 @@ WorldPacket const* WorldPackets::Guild::GuildRosterUpdate::Write()
void WorldPackets::Guild::GuildUpdateMotdText::Read()
{
uint32 textLen = _worldPacket.ReadBits(10);
uint32 textLen = _worldPacket.ReadBits(11);
MotdText = _worldPacket.ReadString(textLen);
}
@@ -205,7 +205,7 @@ WorldPacket const* WorldPackets::Guild::GuildEventPresenceChange::Write()
WorldPacket const* WorldPackets::Guild::GuildEventMotd::Write()
{
_worldPacket.WriteBits(MotdText.length(), 10);
_worldPacket.WriteBits(MotdText.length(), 11);
_worldPacket.FlushBits();
_worldPacket.WriteString(MotdText);

View File

@@ -54,6 +54,49 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectItemData
return data;
}
void WorldPackets::Inspect::PlayerModelDisplayInfo::Initialize(Player const* player)
{
GUID = player->GetGUID();
SpecializationID = player->GetPrimarySpecialization();
Name = player->GetName();
GenderID = player->m_playerData->NativeSex;
Skin = player->m_playerData->SkinID;
HairColor = player->m_playerData->HairColorID;
HairStyle = player->m_playerData->HairStyleID;
FacialHairStyle = player->m_playerData->FacialHairStyleID;
Face = player->m_playerData->FaceID;
Race = player->getRace();
ClassID = player->getClass();
std::copy(player->m_playerData->CustomDisplayOption.begin(), player->m_playerData->CustomDisplayOption.end(), CustomDisplay.begin());
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
if (::Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i))
Items.emplace_back(item, i);
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PlayerModelDisplayInfo const& displayInfo)
{
data << displayInfo.GUID;
data << int32(displayInfo.SpecializationID);
data << uint32(displayInfo.Items.size());
data.WriteBits(displayInfo.Name.length(), 6);
data << uint8(displayInfo.GenderID);
data << uint8(displayInfo.Skin);
data << uint8(displayInfo.HairColor);
data << uint8(displayInfo.HairStyle);
data << uint8(displayInfo.FacialHairStyle);
data << uint8(displayInfo.Face);
data << uint8(displayInfo.Race);
data << uint8(displayInfo.ClassID);
data.append(displayInfo.CustomDisplay.data(), displayInfo.CustomDisplay.size());
data.WriteString(displayInfo.Name);
for (WorldPackets::Inspect::InspectItemData const& item : displayInfo.Items)
data << item;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectGuildData const& guildData)
{
data << guildData.GuildGUID;
@@ -110,14 +153,11 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint
WorldPacket const* WorldPackets::Inspect::InspectResult::Write()
{
_worldPacket << InspecteeGUID;
_worldPacket << uint32(Items.size());
_worldPacket << DisplayInfo;
_worldPacket << uint32(Glyphs.size());
_worldPacket << uint32(Talents.size());
_worldPacket << uint32(PvpTalents.size());
_worldPacket << int32(ClassID);
_worldPacket << int32(SpecializationID);
_worldPacket << int32(GenderID);
_worldPacket << int32(ItemLevel);
_worldPacket << uint8(LifetimeMaxRank);
_worldPacket << uint16(TodayHK);
_worldPacket << uint16(YesterdayHK);
@@ -143,9 +183,6 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write()
if (AzeriteLevel)
_worldPacket << int32(*AzeriteLevel);
for (InspectItemData const& item : Items)
_worldPacket << item;
return &_worldPacket;
}

View File

@@ -24,6 +24,7 @@
#include "SharedDefines.h"
class Item;
class Player;
namespace WorldPackets
{
@@ -60,6 +61,25 @@ namespace WorldPackets
std::vector<int32> AzeritePowers;
};
struct PlayerModelDisplayInfo
{
ObjectGuid GUID;
std::vector<InspectItemData> Items;
std::string Name;
int32 SpecializationID = 0;
uint8 GenderID = GENDER_NONE;
uint8 Skin = 0;
uint8 HairColor = 0;
uint8 HairStyle = 0;
uint8 FacialHairStyle = 0;
uint8 Face = 0;
uint8 Race = RACE_NONE;
uint8 ClassID = CLASS_NONE;
std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay;
void Initialize(Player const* player);
};
struct InspectGuildData
{
ObjectGuid GuildGUID;
@@ -92,17 +112,14 @@ namespace WorldPackets
WorldPacket const* Write() override;
ObjectGuid InspecteeGUID;
std::vector<InspectItemData> Items;
PlayerModelDisplayInfo DisplayInfo;
std::vector<uint16> Glyphs;
std::vector<uint16> Talents;
std::array<uint16, MAX_PVP_TALENT_SLOTS> PvpTalents;
int32 ClassID = CLASS_NONE;
int32 GenderID = GENDER_NONE;
Optional<InspectGuildData> GuildData;
std::array<PVPBracketData, 6> Bracket;
int32 SpecializationID = 0;
Optional<int32> AzeriteLevel;
int32 ItemLevel = 0;
uint32 LifetimeHK = 0;
uint32 HonorLevel = 0;
uint16 TodayHK = 0;

View File

@@ -328,15 +328,6 @@ void WorldPackets::Item::UseCritterItem::Read()
_worldPacket >> ItemGuid;
}
void WorldPackets::Item::UpgradeItem::Read()
{
_worldPacket >> ItemMaster;
_worldPacket >> ItemGUID;
_worldPacket >> UpgradeID;
_worldPacket >> ContainerSlot;
_worldPacket >> Slot;
}
void WorldPackets::Item::SocketGems::Read()
{
_worldPacket >> ItemGuid;
@@ -351,14 +342,6 @@ WorldPacket const* WorldPackets::Item::SocketGemsResult::Write()
return &_worldPacket;
}
WorldPacket const* WorldPackets::Item::ItemUpgradeResult::Write()
{
_worldPacket.WriteBit(Success);
_worldPacket.FlushBits();
return &_worldPacket;
}
void WorldPackets::Item::RemoveNewItem::Read()
{
_worldPacket >> ItemGuid;

View File

@@ -447,30 +447,6 @@ namespace WorldPackets
ObjectGuid ItemGuid;
};
class UpgradeItem final : public ClientPacket
{
public:
UpgradeItem(WorldPacket&& packet) : ClientPacket(CMSG_UPGRADE_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid ItemMaster;
ObjectGuid ItemGUID;
int32 ContainerSlot = 0;
int32 UpgradeID = 0;
int32 Slot = 0;
};
class ItemUpgradeResult final : public ServerPacket
{
public:
ItemUpgradeResult() : ServerPacket(SMSG_ITEM_UPGRADE_RESULT, 1) { }
WorldPacket const* Write() override;
bool Success = false;
};
class SocketGems final : public ClientPacket
{
public:

View File

@@ -51,6 +51,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Social::ContactInfo const
data << uint32(contact.Level);
data << uint32(contact.ClassID);
data.WriteBits(contact.Notes.length(), 10);
data.WriteBit(contact.Mobile);
data.FlushBits();
data.WriteString(contact.Notes);
@@ -93,6 +94,7 @@ WorldPacket const* WorldPackets::Social::FriendStatus::Write()
_worldPacket << uint32(Level);
_worldPacket << uint32(ClassID);
_worldPacket.WriteBits(Notes.length(), 10);
_worldPacket.WriteBit(Mobile);
_worldPacket.FlushBits();
_worldPacket.WriteString(Notes);

View File

@@ -53,6 +53,7 @@ namespace WorldPackets
uint32 AreaID = 0;
uint32 Level = 0;
uint32 ClassID = CLASS_NONE;
bool Mobile = false;
};
class ContactList final : public ServerPacket
@@ -84,6 +85,7 @@ namespace WorldPackets
uint32 Level = 0;
uint32 AreaID = 0;
uint8 FriendResult = 0; ///< @see enum FriendsResult
bool Mobile = false;
};
struct QualifiedGUID

View File

@@ -185,6 +185,8 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode);
DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_VIEWED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBankerActivateOpcode);
DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldLeaveOpcode);
DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode);
@@ -326,6 +328,14 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CLIENT_PORT_GRAVEYARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePortGraveyard);
DEFINE_HANDLER(CMSG_CLOSE_INTERACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCloseInteraction);
DEFINE_HANDLER(CMSG_CLOSE_QUEST_CHOICE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_APPLICATION_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_GET_APPLICANTS_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_COLLECTION_ITEM_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCollectionItemSetFavorite);
DEFINE_HANDLER(CMSG_COMMENTATOR_ENABLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
@@ -344,7 +354,6 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CONTRIBUTION_CONTRIBUTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CONTRIBUTION_GET_STATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CONVERSATION_LINE_STARTED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CONVERT_CONSUMPTION_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleConvertRaidOpcode);
DEFINE_HANDLER(CMSG_CREATE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCreateOpcode);
DEFINE_HANDLER(CMSG_CREATE_SHIPMENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
@@ -549,7 +558,6 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOVE_FORCE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
@@ -570,6 +578,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_SET_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_SET_VEHICLE_REC_ID_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetVehicleRecAck);
@@ -635,7 +644,6 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_PET_STOP_ATTACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetStopAttack);
DEFINE_HANDLER(CMSG_PING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess);
DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayerLoginOpcode);
DEFINE_HANDLER(CMSG_PROTOCOL_MISMATCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_PUSH_QUEST_TO_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty);
DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePVPLogDataOpcode);
DEFINE_HANDLER(CMSG_QUERY_BATTLE_PET_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
@@ -704,7 +712,6 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_REQUEST_CHALLENGE_MODE_AFFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_REQUEST_CONSUMPTION_CONVERSION_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_REQUEST_CROWD_CONTROL_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_REQUEST_FORCED_REACTIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestForcedReactionsOpcode);
DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestPartyState);
@@ -853,7 +860,6 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateListedAuctionableTokens);
DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_COUNT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPGRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpgradeItem);
DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUseCritterItem);
DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUseEquipmentSet);
@@ -936,6 +942,9 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_HOTFIXES, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_EMPOWERED_ITEM_EQUIPPED_STATUS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_EMPOWERED_ITEM_RESPEC_OPEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_FORGE_CLOSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_FORGE_OPENED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_SELECTION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BAN_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -962,6 +971,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_UPDATE_SESSION_KEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_ACK_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_BUNDLE_PRICE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_CONFIRM_PURCHASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DELIVERY_ENDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DELIVERY_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1100,6 +1110,11 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_APPLICANTS_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_APPLICATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_APPLICATIONS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_CLUBS_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_CLUBS_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_EVENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_MAP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1154,7 +1169,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_ENCRYPTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_ENCRYPTION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1267,6 +1282,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_AWAY_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_DISBANDED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1348,7 +1364,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_PVP_TALENTS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1427,6 +1442,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_PARTY_RANGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_EQUIPMENT_APPLY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1451,7 +1467,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_LAND_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_MOVEMENT_FORCE_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_NORMAL_FALL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_PITCH_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1502,7 +1518,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_MOVEMENT_FORCE_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE,STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1600,6 +1616,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PUSH_SPELL_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_MATCH_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1802,6 +1819,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_LOST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_DURATION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_MOVED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);

File diff suppressed because it is too large Load Diff

View File

@@ -389,7 +389,6 @@ namespace WorldPackets
class WrapItem;
class CancelTempEnchantment;
class UseCritterItem;
class UpgradeItem;
class SocketGems;
class SortBags;
class SortBankBags;
@@ -1405,7 +1404,6 @@ class TC_GAME_API WorldSession
void HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet);
void HandleWrapItem(WorldPackets::Item::WrapItem& packet);
void HandleUseCritterItem(WorldPackets::Item::UseCritterItem& packet);
void HandleUpgradeItem(WorldPackets::Item::UpgradeItem& packet);
void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet);
void HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& packet);