aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-07-31 21:39:48 +0200
committerShauren <shauren.trinity@gmail.com>2022-07-31 21:39:48 +0200
commit20f38369f30309e2c0cd53eca9cfe9c49376ed8c (patch)
tree35fd316599e09226241ecd946469ccd6e21c0fa7
parent71e885cd4b0098f38ca360a35361a6e867556542 (diff)
Core/PacketIO: Updated packet structures to 9.2.7
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp20
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h7
-rw-r--r--src/server/game/Entities/Player/Player.cpp9
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Groups/Group.cpp15
-rw-r--r--src/server/game/Groups/Group.h1
-rw-r--r--src/server/game/Server/Packets/AuctionHousePackets.cpp2
-rw-r--r--src/server/game/Server/Packets/AuctionHousePackets.h2
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp42
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h7
-rw-r--r--src/server/game/Server/Packets/CombatLogPacketsCommon.cpp1
-rw-r--r--src/server/game/Server/Packets/CombatLogPacketsCommon.h1
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h2
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp1
-rw-r--r--src/server/game/Server/Packets/PartyPackets.h1
-rw-r--r--src/server/game/Server/Packets/SystemPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/SystemPackets.h2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp1
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h1
-rw-r--r--src/server/game/Server/WorldSocket.cpp4
-rw-r--r--src/server/game/World/World.cpp1
-rw-r--r--src/server/worldserver/Main.cpp1
23 files changed, 96 insertions, 30 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index c3146b13bdc..b12c585a788 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -309,6 +309,7 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint32(DynamicFlags2);
+ data << uint16(DEBUGItemLevel);
}
for (uint32 i = 0; i < ArtifactPowers.size(); ++i)
{
@@ -323,7 +324,7 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xFC04E4FFu, 0x000000FFu });
+ Mask allowedMaskForTarget({ 0xF804E4FFu, 0x000001FFu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -331,12 +332,12 @@ void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
- allowedMaskForTarget |= { 0x03FB1B00u, 0x00000000u };
+ allowedMaskForTarget |= { 0x07FB1B00u, 0x00000000u };
}
void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFC04E4FFu, 0x000000FFu });
+ Mask allowedMaskForTarget({ 0xF804E4FFu, 0x000001FFu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -460,26 +461,30 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
{
data << uint32(DynamicFlags2);
}
+ if (changesMask[20])
+ {
+ data << uint16(DEBUGItemLevel);
+ }
if (changesMask[18])
{
Modifiers->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
- if (changesMask[20])
+ if (changesMask[21])
{
for (uint32 i = 0; i < 5; ++i)
{
- if (changesMask[21 + i])
+ if (changesMask[22 + i])
{
data << int32(SpellCharges[i]);
}
}
}
- if (changesMask[26])
+ if (changesMask[27])
{
for (uint32 i = 0; i < 13; ++i)
{
- if (changesMask[27 + i])
+ if (changesMask[28 + i])
{
Enchantment[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
@@ -508,6 +513,7 @@ void ItemData::ClearChangesMask()
Base::ClearChangesMask(ItemAppearanceModID);
Base::ClearChangesMask(Modifiers);
Base::ClearChangesMask(DynamicFlags2);
+ Base::ClearChangesMask(DEBUGItemLevel);
Base::ClearChangesMask(SpellCharges);
Base::ClearChangesMask(Enchantment);
_changesMask.ResetAll();
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 5beb9c4b93a..b19fdebafb0 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -113,7 +113,7 @@ struct SocketedGem : public IsUpdateFieldStructureTag, public HasChangesMask<20>
void ClearChangesMask();
};
-struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<40>
+struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41>
{
UpdateField<std::vector<int32>, 0, 1> BonusListIDs;
DynamicUpdateField<UF::ArtifactPower, 0, 2> ArtifactPowers;
@@ -134,8 +134,9 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<40>
UpdateField<uint8, 0, 17> ItemAppearanceModID;
UpdateField<UF::ItemModList, 0, 18> Modifiers;
UpdateField<uint32, 0, 19> DynamicFlags2;
- UpdateFieldArray<int32, 5, 20, 21> SpellCharges;
- UpdateFieldArray<UF::ItemEnchantment, 13, 26, 27> Enchantment;
+ UpdateField<uint16, 0, 20> DEBUGItemLevel;
+ UpdateFieldArray<int32, 5, 21, 22> SpellCharges;
+ UpdateFieldArray<UF::ItemEnchantment, 13, 27, 28> Enchantment;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 1dab0e4b99c..b44260c7066 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6303,6 +6303,15 @@ TeamId Player::TeamIdForRace(uint8 race)
return TEAM_NEUTRAL;
}
+uint8 Player::GetFactionGroupForRace(uint8 race)
+{
+ if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race))
+ if (FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(rEntry->FactionID))
+ return faction->FactionGroup;
+
+ return 1;
+}
+
void Player::SetFactionForRace(uint8 race)
{
m_team = TeamForRace(race);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 40567b8533b..2f7d79c8781 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2200,6 +2200,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
static uint32 TeamForRace(uint8 race);
static TeamId TeamIdForRace(uint8 race);
+ static uint8 GetFactionGroupForRace(uint8 race);
uint32 GetTeam() const { return m_team; }
TeamId GetTeamId() const { return m_team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
void SetFactionForRace(uint8 race);
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 91acaad9a0e..8bcfa842993 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -61,7 +61,7 @@ Loot* Roll::getLoot()
return getTarget();
}
-Group::Group() : m_leaderGuid(), m_leaderName(""), m_groupFlags(GROUP_FLAG_NONE), m_groupCategory(GROUP_CATEGORY_HOME),
+Group::Group() : m_leaderGuid(), m_leaderFactionGroup(0), m_leaderName(""), m_groupFlags(GROUP_FLAG_NONE), m_groupCategory(GROUP_CATEGORY_HOME),
m_dungeonDifficulty(DIFFICULTY_NORMAL), m_raidDifficulty(DIFFICULTY_NORMAL_RAID), m_legacyRaidDifficulty(DIFFICULTY_10_N),
m_bgGroup(nullptr), m_bfGroup(nullptr), m_lootMethod(FREE_FOR_ALL), m_lootThreshold(ITEM_QUALITY_UNCOMMON), m_looterGuid(),
m_masterLooterGuid(), m_subGroupsCounts(nullptr), m_guid(), m_maxEnchantingLevel(0), m_dbStoreId(0), m_isLeaderOffline(false),
@@ -161,6 +161,7 @@ bool Group::Create(Player* leader)
m_guid = ObjectGuid::Create<HighGuid::Party>(sGroupMgr->GenerateGroupId());
m_leaderGuid = leaderGuid;
+ m_leaderFactionGroup = Player::GetFactionGroupForRace(leader->GetRace());
m_leaderName = leader->GetName();
leader->SetPlayerFlag(PLAYER_FLAGS_GROUP_LEADER);
@@ -238,9 +239,12 @@ void Group::LoadGroupFromDB(Field* fields)
m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64());
// group leader not exist
- if (!sCharacterCache->GetCharacterNameByGuid(m_leaderGuid, m_leaderName))
+ CharacterCacheEntry const* leader = sCharacterCache->GetCharacterCacheByGuid(m_leaderGuid);
+ if (!leader)
return;
+ m_leaderFactionGroup = Player::GetFactionGroupForRace(leader->Race);
+ m_leaderName = leader->Name;
m_lootMethod = LootMethod(fields[1].GetUInt8());
m_looterGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt64());
m_lootThreshold = ItemQualities(fields[3].GetUInt8());
@@ -392,6 +396,7 @@ bool Group::AddLeaderInvite(Player* player)
return false;
m_leaderGuid = player->GetGUID();
+ m_leaderFactionGroup = Player::GetFactionGroupForRace(player->GetRace());
m_leaderName = player->GetName();
return true;
}
@@ -791,6 +796,7 @@ void Group::ChangeLeader(ObjectGuid newLeaderGuid, int8 partyIndex)
newLeader->SetPlayerFlag(PLAYER_FLAGS_GROUP_LEADER);
m_leaderGuid = newLeader->GetGUID();
+ m_leaderFactionGroup = Player::GetFactionGroupForRace(newLeader->GetRace());
m_leaderName = newLeader->GetName();
ToggleGroupMemberFlag(slot, MEMBER_FLAG_ASSISTANT, false);
@@ -1539,6 +1545,7 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)
partyUpdate.PartyGUID = m_guid;
partyUpdate.LeaderGUID = m_leaderGuid;
+ partyUpdate.LeaderFactionGroup = m_leaderFactionGroup;
partyUpdate.SequenceNum = player->NextGroupUpdateSequenceNumber(m_groupCategory);
@@ -1557,9 +1564,7 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)
playerInfos.Name = citr->name;
playerInfos.Class = citr->_class;
- ChrRacesEntry const* race = sChrRacesStore.AssertEntry(citr->race);
- FactionTemplateEntry const* raceFaction = sFactionTemplateStore.AssertEntry(race->FactionID);
- playerInfos.FactionGroup = raceFaction->FactionGroup;
+ playerInfos.FactionGroup = Player::GetFactionGroupForRace(citr->race);
playerInfos.Status = MEMBER_STATUS_OFFLINE;
if (member && member->GetSession() && !member->GetSession()->PlayerLogout())
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index 7f72e6e8d6a..fd671978055 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -440,6 +440,7 @@ class TC_GAME_API Group
GroupRefManager m_memberMgr;
InvitesList m_invitees;
ObjectGuid m_leaderGuid;
+ uint8 m_leaderFactionGroup;
std::string m_leaderName;
GroupFlags m_groupFlags;
GroupCategory m_groupCategory;
diff --git a/src/server/game/Server/Packets/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp
index cc8bdade761..08478565728 100644
--- a/src/server/game/Server/Packets/AuctionHousePackets.cpp
+++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp
@@ -450,6 +450,7 @@ void AuctionRemoveItem::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> AuctionID;
+ _worldPacket >> ItemID;
if (_worldPacket.ReadBit())
{
TaintedBy.emplace();
@@ -585,6 +586,7 @@ WorldPacket const* AuctionFavoriteList::Write()
WorldPacket const* AuctionHelloResponse::Write()
{
_worldPacket << Guid;
+ _worldPacket << uint32(DeliveryDelay);
_worldPacket.WriteBit(OpenForBusiness);
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h
index 6f441c4b281..795565c6fa0 100644
--- a/src/server/game/Server/Packets/AuctionHousePackets.h
+++ b/src/server/game/Server/Packets/AuctionHousePackets.h
@@ -287,6 +287,7 @@ namespace WorldPackets
ObjectGuid Auctioneer;
int32 AuctionID = 0;
+ int32 ItemID = 0;
Optional<Addon::AddOnInfo> TaintedBy;
};
@@ -417,6 +418,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
ObjectGuid Guid;
+ uint32 DeliveryDelay = 0;
bool OpenForBusiness = true;
};
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp
index 7ba0c8b886d..f05643e807e 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.cpp
+++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp
@@ -18,7 +18,7 @@
#include "AuthenticationPackets.h"
#include "BigNumber.h"
#include "CharacterTemplateDataStore.h"
-#include "CryptoHash.h"
+#include "Ed25519.h"
#include "HMAC.h"
#include "ObjectMgr.h"
#include "RSA.h"
@@ -205,7 +205,7 @@ WorldPacket const* WorldPackets::Auth::WaitQueueUpdate::Write()
namespace
{
-std::string RSAPrivateKey = R"(-----BEGIN RSA PRIVATE KEY-----
+std::string const RSAPrivateKey = R"(-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA7rPc1NPDtFRRzmZbyzK48PeSU8YZ8gyFL4omqXpFn2DE683q
f41Z2FeyYHsJTJtouMft7x6ADeZrN1tTkOsYEw1/Q2SD2pjmrMIwooKlxsvH+4af
n6kCagNJxTj7wMhVzMDOJZG+hc/R0TfOzIPS6jCAB3uAn51EVCIpvoba20jFqfkT
@@ -234,7 +234,16 @@ OHYtKG3GK3GEcFDwZU2LPHq21EroUAdtRfbrJ4KW2yc8igtXKxTBYw==
-----END RSA PRIVATE KEY-----
)";
+std::array<uint8, 32> constexpr EnterEncryptedModePrivateKey =
+{
+ 0x08, 0xBD, 0xC7, 0xA3, 0xCC, 0xC3, 0x4F, 0x3F,
+ 0x6A, 0x0B, 0xFF, 0xCF, 0x31, 0xC1, 0xB6, 0x97,
+ 0x69, 0x1E, 0x72, 0x9A, 0x0A, 0xAB, 0x2C, 0x77,
+ 0xC3, 0x6F, 0x8A, 0xE7, 0x5A, 0x9A, 0xA7, 0xC9
+};
+
std::unique_ptr<Trinity::Crypto::RsaSignature> ConnectToRSA;
+std::unique_ptr<Trinity::Crypto::Ed25519> EnterEncryptedModeSigner;
}
bool WorldPackets::Auth::ConnectTo::InitializeEncryption()
@@ -309,19 +318,34 @@ void WorldPackets::Auth::ConnectToFailed::Read()
_worldPacket >> Con;
}
-uint8 constexpr EnableEncryptionSeed[16] = { 0x90, 0x9C, 0xD0, 0x50, 0x5A, 0x2C, 0x14, 0xDD, 0x5C, 0x2C, 0xC0, 0x64, 0x14, 0xF3, 0xFE, 0xC9 };
+bool WorldPackets::Auth::EnterEncryptedMode::InitializeEncryption()
+{
+ std::unique_ptr<Trinity::Crypto::Ed25519> ed25519 = std::make_unique<Trinity::Crypto::Ed25519>();
+ if (!ed25519->LoadFromByteArray(EnterEncryptedModePrivateKey))
+ return false;
+
+ EnterEncryptedModeSigner = std::move(ed25519);
+ return true;
+}
+
+void WorldPackets::Auth::EnterEncryptedMode::ShutdownEncryption()
+{
+ EnterEncryptedModeSigner.reset();
+}
+
+std::array<uint8, 16> constexpr EnableEncryptionSeed = { 0x90, 0x9C, 0xD0, 0x50, 0x5A, 0x2C, 0x14, 0xDD, 0x5C, 0x2C, 0xC0, 0x64, 0x14, 0xF3, 0xFE, 0xC9 };
+std::array<uint8, 16> constexpr EnableEncryptionContext = { 0xA7, 0x1F, 0xB6, 0x9B, 0xC9, 0x7C, 0xDD, 0x96, 0xE9, 0xBB, 0xB8, 0x21, 0x39, 0x8D, 0x5A, 0xD4 };
WorldPacket const* WorldPackets::Auth::EnterEncryptedMode::Write()
{
- std::array<uint8, 17> msg{};
- msg[0] = Enabled ? 1 : 0;
- std::copy_n(std::begin(EnableEncryptionSeed), std::size(EnableEncryptionSeed), &msg[1]);
+ std::array<uint8, 32> toSign = Trinity::Crypto::HMAC_SHA256::GetDigestOf(EncryptionKey,
+ std::array<uint8, 1>{uint8(Enabled ? 1 : 0)},
+ EnableEncryptionSeed);
- Trinity::Crypto::RsaSignature rsa(*ConnectToRSA);
- Trinity::Crypto::RsaSignature::HMAC_SHA256 digestGenerator(EncryptionKey, 16);
+ Trinity::Crypto::Ed25519 ed25519(*EnterEncryptedModeSigner);
std::vector<uint8> signature;
- rsa.Sign(msg, digestGenerator, signature);
+ ed25519.SignWithContext(toSign, { EnableEncryptionContext.begin(), EnableEncryptionContext.end() }, signature);
_worldPacket.append(signature.data(), signature.size());
_worldPacket.WriteBit(Enabled);
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h
index aa4216ec30e..fae780f5835 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.h
+++ b/src/server/game/Server/Packets/AuthenticationPackets.h
@@ -288,14 +288,17 @@ namespace WorldPackets
class EnterEncryptedMode final : public ServerPacket
{
public:
- EnterEncryptedMode(uint8 const* encryptionKey, bool enabled) : ServerPacket(SMSG_ENTER_ENCRYPTED_MODE, 256 + 1),
+ static bool InitializeEncryption();
+ static void ShutdownEncryption();
+
+ EnterEncryptedMode(std::array<uint8, 16> const& encryptionKey, bool enabled) : ServerPacket(SMSG_ENTER_ENCRYPTED_MODE, 256 + 1),
EncryptionKey(encryptionKey), Enabled(enabled)
{
}
WorldPacket const* Write() override;
- uint8 const* EncryptionKey;
+ std::array<uint8, 16> const& EncryptionKey;
bool Enabled = false;
};
}
diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp
index ec0162d20f9..f0ee217503d 100644
--- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp
+++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp
@@ -178,6 +178,7 @@ ByteBuffer& operator<<(ByteBuffer& data, ContentTuningParams const& contentTunin
data << uint32(contentTuningParams.Flags);
data << int32(contentTuningParams.PlayerContentTuningID);
data << int32(contentTuningParams.TargetContentTuningID);
+ data << int32(contentTuningParams.Unused927);
data.WriteBits(contentTuningParams.Type, 4);
data.FlushBits();
return data;
diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h
index 1a1413c58e1..325338223c2 100644
--- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h
+++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h
@@ -76,6 +76,7 @@ namespace WorldPackets
uint32 Flags = NO_LEVEL_SCALING | NO_ITEM_LEVEL_SCALING;
int32 PlayerContentTuningID = 0;
int32 TargetContentTuningID = 0;
+ int32 Unused927 = 0;
template<class T, class U>
bool GenerateDataForUnits(T* attacker, U* target);
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index 3041da8f2f1..bfbe9f748a4 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -178,7 +178,7 @@ void WorldPackets::Misc::TutorialSetFlag::Read()
WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write()
{
_worldPacket << uint32(DifficultyID);
- _worldPacket << uint8(IsTournamentRealm);
+ _worldPacket.WriteBit(IsTournamentRealm);
_worldPacket.WriteBit(XRealmPvpAlert);
_worldPacket.WriteBit(BlockExitingLoadingScreen);
_worldPacket.WriteBit(RestrictedAccountMaxLevel.has_value());
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index 7302fd6deb9..ead73143901 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -262,7 +262,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
uint32 DifficultyID = 0;
- uint8 IsTournamentRealm = 0;
+ bool IsTournamentRealm = false;
bool XRealmPvpAlert = false;
bool BlockExitingLoadingScreen = false; // when set to true, sending SMSG_UPDATE_OBJECT with CreateObject Self bit = true will not hide loading screen
// instead it will be done after this packet is sent again with false in this bit and SMSG_UPDATE_OBJECT Values for player
diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp
index 2c831e6db8d..4b53c885e06 100644
--- a/src/server/game/Server/Packets/PartyPackets.cpp
+++ b/src/server/game/Server/Packets/PartyPackets.cpp
@@ -483,6 +483,7 @@ WorldPacket const* WorldPackets::Party::PartyUpdate::Write()
_worldPacket << PartyGUID;
_worldPacket << uint32(SequenceNum);
_worldPacket << LeaderGUID;
+ _worldPacket << uint8(LeaderFactionGroup);
_worldPacket << uint32(PlayerList.size());
_worldPacket.WriteBit(LfgInfos.has_value());
_worldPacket.WriteBit(LootSettings.has_value());
diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h
index d3dd89c06e3..355e576f95d 100644
--- a/src/server/game/Server/Packets/PartyPackets.h
+++ b/src/server/game/Server/Packets/PartyPackets.h
@@ -556,6 +556,7 @@ namespace WorldPackets
ObjectGuid PartyGUID;
ObjectGuid LeaderGUID;
+ uint8 LeaderFactionGroup = 0;
int32 MyIndex = 0;
int32 SequenceNum = 0;
diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp
index 992e031d039..5f6304d4bee 100644
--- a/src/server/game/Server/Packets/SystemPackets.cpp
+++ b/src/server/game/Server/Packets/SystemPackets.cpp
@@ -81,6 +81,7 @@ WorldPacket const* FeatureSystemStatus::Write()
_worldPacket << uint32(GameRuleValues.size());
_worldPacket << int16(MaxPlayerNameQueriesPerPacket);
+ _worldPacket << int16(PlayerNameQueryTelemetryInterval);
for (GameRuleValuePair const& gameRuleValue : GameRuleValues)
_worldPacket << gameRuleValue;
@@ -208,6 +209,7 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write()
_worldPacket << int32(ActiveSeason);
_worldPacket << uint32(GameRuleValues.size());
_worldPacket << int16(MaxPlayerNameQueriesPerPacket);
+ _worldPacket << int16(PlayerNameQueryTelemetryInterval);
if (LaunchETA)
_worldPacket << int32(*LaunchETA);
diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h
index b55ad06e5a1..f6a3d37c133 100644
--- a/src/server/game/Server/Packets/SystemPackets.h
+++ b/src/server/game/Server/Packets/SystemPackets.h
@@ -130,6 +130,7 @@ namespace WorldPackets
uint32 KioskSessionMinutes = 0;
int32 ActiveSeason = 0; ///< Currently active Classic season
int16 MaxPlayerNameQueriesPerPacket = 50;
+ int16 PlayerNameQueryTelemetryInterval = 600;
bool ItemRestorationButtonEnabled = false;
bool CharUndeleteEnabled = false; ///< Implemented
bool BpayStoreDisabledByParentalControls = false;
@@ -203,6 +204,7 @@ namespace WorldPackets
int32 ActiveSeason = 0; // Currently active Classic season
std::vector<GameRuleValuePair> GameRuleValues;
int16 MaxPlayerNameQueriesPerPacket = 50;
+ int16 PlayerNameQueryTelemetryInterval = 600;
Optional<int32> LaunchETA;
};
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index c9e1bb8b16a..9782e06dc85 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -994,6 +994,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_CLOSED_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_DISABLE_POSTING_BEFORE_MAINTENANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_FAVORITE_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 9b46b07f36b..02507572377 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -900,6 +900,7 @@ enum OpcodeServer : uint16
SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x27C5,
SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26E7,
SMSG_AUCTION_COMMAND_RESULT = 0x26E4,
+ SMSG_AUCTION_DISABLE_POSTING_BEFORE_MAINTENANCE = 0x287F,
SMSG_AUCTION_FAVORITE_LIST = 0x285F,
SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x2856,
SMSG_AUCTION_HELLO_RESPONSE = 0x26E2,
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 35e87c0e86f..f762e100f3d 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -884,7 +884,7 @@ void WorldSocket::LoadSessionPermissionsCallback(PreparedQueryResult result)
// RBAC must be loaded before adding session to check for skip queue permission
_worldSession->GetRBACData()->LoadFromDBCallback(result);
- SendPacketAndLogOpcode(*WorldPackets::Auth::EnterEncryptedMode(_encryptKey.data(), true).Write());
+ SendPacketAndLogOpcode(*WorldPackets::Auth::EnterEncryptedMode(_encryptKey, true).Write());
}
void WorldSocket::HandleAuthContinuedSession(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession)
@@ -947,7 +947,7 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPacket
// only first 16 bytes of the hmac are used
memcpy(_encryptKey.data(), encryptKeyGen.GetDigest().data(), 16);
- SendPacketAndLogOpcode(*WorldPackets::Auth::EnterEncryptedMode(_encryptKey.data(), true).Write());
+ SendPacketAndLogOpcode(*WorldPackets::Auth::EnterEncryptedMode(_encryptKey, true).Write());
AsyncRead();
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 6dab922968a..33ca3786630 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2431,6 +2431,7 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Initializing Opcodes...");
opcodeTable.Initialize();
WorldPackets::Auth::ConnectTo::InitializeEncryption();
+ WorldPackets::Auth::EnterEncryptedMode::InitializeEncryption();
TC_LOG_INFO("server.loading", "Starting Arena Season...");
sGameEventMgr->StartArenaSeason();
diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp
index a6da765c21c..c78b42f152d 100644
--- a/src/server/worldserver/Main.cpp
+++ b/src/server/worldserver/Main.cpp
@@ -403,6 +403,7 @@ extern int main(int argc, char** argv)
// Shutdown starts here
WorldPackets::Auth::ConnectTo::ShutdownEncryption();
+ WorldPackets::Auth::EnterEncryptedMode::ShutdownEncryption();
threadPool.reset();