diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-05-18 23:52:58 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-05-18 23:53:25 +0200 |
| commit | c5d3dd90bea3889ef5fcd33c9ef0d59d7c544f8a (patch) | |
| tree | aa7fde6f924fc39da54908bd6eeeb0be422e5fc3 /src/server/game/Server | |
| parent | 74456703146194de72424ec98c4ea76402077be6 (diff) | |
Core/Game: Include cleanup
* Mostly aimed at removing Log/DatabaseEnv includes from other headers
* Fix most packet headers including other packet headers - moved common structures such as ItemInstance to their own files
* Moved SAI function definitions to source files (massive or requiring many different dependencies)
Diffstat (limited to 'src/server/game/Server')
50 files changed, 717 insertions, 633 deletions
diff --git a/src/server/game/Server/Packet.cpp b/src/server/game/Server/Packet.cpp index 09fdb85571f..b68d8d74382 100644 --- a/src/server/game/Server/Packet.cpp +++ b/src/server/game/Server/Packet.cpp @@ -18,8 +18,7 @@ #include "Packet.h" #include "Errors.h" -WorldPackets::Packet::Packet(WorldPacket&& worldPacket) - : _worldPacket(std::move(worldPacket)) +WorldPackets::Packet::Packet(WorldPacket&& worldPacket) : _worldPacket(std::move(worldPacket)) { } @@ -33,14 +32,12 @@ void WorldPackets::ServerPacket::Read() ASSERT(!"Read not implemented for server packets."); } -WorldPackets::ClientPacket::ClientPacket(OpcodeClient expectedOpcode, WorldPacket&& packet) - : Packet(std::move(packet)) +WorldPackets::ClientPacket::ClientPacket(OpcodeClient expectedOpcode, WorldPacket&& packet) : Packet(std::move(packet)) { ASSERT(GetOpcode() == expectedOpcode); } -WorldPackets::ClientPacket::ClientPacket(WorldPacket&& packet) - : Packet(std::move(packet)) +WorldPackets::ClientPacket::ClientPacket(WorldPacket&& packet) : Packet(std::move(packet)) { } diff --git a/src/server/game/Server/Packets/AchievementPackets.h b/src/server/game/Server/Packets/AchievementPackets.h index 5a8841e0180..0ce2b11b1fa 100644 --- a/src/server/game/Server/Packets/AchievementPackets.h +++ b/src/server/game/Server/Packets/AchievementPackets.h @@ -18,8 +18,8 @@ #ifndef game_AchievementPackets_h__ #define game_AchievementPackets_h__ -#include "ObjectGuid.h" #include "Packet.h" +#include "ObjectGuid.h" namespace WorldPackets { diff --git a/src/server/game/Server/Packets/ArtifactPackets.h b/src/server/game/Server/Packets/ArtifactPackets.h index 30336cdbf50..3bc70b92c04 100644 --- a/src/server/game/Server/Packets/ArtifactPackets.h +++ b/src/server/game/Server/Packets/ArtifactPackets.h @@ -19,8 +19,8 @@ #define ArtifactPackets_h__ #include "Packet.h" -#include "PacketUtilities.h" #include "ObjectGuid.h" +#include "PacketUtilities.h" namespace WorldPackets { diff --git a/src/server/game/Server/Packets/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp index 56c38d5d18e..aa18575a2f6 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.cpp +++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp @@ -18,6 +18,7 @@ #include "AuctionHousePackets.h" #include "AuctionHouseMgr.h" #include "ObjectGuid.h" +#include "MailPackets.h" ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AuctionHouse::AuctionItem const& auctionItem) { @@ -268,6 +269,14 @@ void WorldPackets::AuctionHouse::AuctionListOwnerItems::Read() _worldPacket >> Offset; } +WorldPackets::AuctionHouse::AuctionListPendingSalesResult::AuctionListPendingSalesResult() : ServerPacket(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, 140) +{ +} + +WorldPackets::AuctionHouse::AuctionListPendingSalesResult::~AuctionListPendingSalesResult() +{ +} + WorldPacket const* WorldPackets::AuctionHouse::AuctionListPendingSalesResult::Write() { _worldPacket << uint32(Mails.size()); diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h index 17d7ee89e56..9e358e94107 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.h +++ b/src/server/game/Server/Packets/AuctionHousePackets.h @@ -19,14 +19,19 @@ #define AuctionHousePackets_h__ #include "Packet.h" +#include "DBCEnums.h" +#include "ItemPacketsCommon.h" #include "ObjectGuid.h" -#include "ItemPackets.h" -#include "MailPackets.h" struct AuctionEntry; namespace WorldPackets { + namespace Mail + { + struct MailListEntry; + } + namespace AuctionHouse { struct AuctionItem @@ -284,7 +289,8 @@ namespace WorldPackets class AuctionListPendingSalesResult final : public ServerPacket { public: - AuctionListPendingSalesResult() : ServerPacket(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, 140) { } + AuctionListPendingSalesResult(); + ~AuctionListPendingSalesResult(); WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 9ed123f4872..c13608bb429 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -16,8 +16,11 @@ */ #include "AuthenticationPackets.h" +#include "BigNumber.h" #include "CharacterTemplateDataStore.h" #include "HmacHash.h" +#include "ObjectMgr.h" +#include "Util.h" ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::VirtualRealmNameInfo const& virtualRealmInfo) { @@ -339,11 +342,6 @@ WorldPackets::Auth::ConnectTo::ConnectTo() : ServerPacket(SMSG_CONNECT_TO, 8 + 4 HexStrToByteArray("F41DCB2D728CF3337A4FF338FA89DB01BBBE9C3B65E9DA96268687353E48B94C", Payload.PanamaKey); Payload.Adler32 = 0xA0A66C10; - p.SetBinary(P, 128); - q.SetBinary(Q, 128); - dmp1.SetBinary(DP, 128); - dmq1.SetBinary(DQ, 128); - iqmp.SetBinary(InverseQ, 128); } WorldPacket const* WorldPackets::Auth::ConnectTo::Write() @@ -372,6 +370,18 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write() BigNumber bnData; bnData.SetBinary(payload.contents(), payload.size()); + BigNumber p; + BigNumber q; + BigNumber dmp1; + BigNumber dmq1; + BigNumber iqmp; + + p.SetBinary(P, 128); + q.SetBinary(Q, 128); + dmp1.SetBinary(DP, 128); + dmq1.SetBinary(DQ, 128); + iqmp.SetBinary(InverseQ, 128); + BigNumber m1 = (bnData % p).ModExp(dmp1, p); BigNumber m2 = (bnData % q).ModExp(dmq1, q); BigNumber h = (iqmp * (m1 - m2)) % p; diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 2c7a17d217d..27e7a4c08ae 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -19,16 +19,13 @@ #define AuthenticationPacketsWorld_h__ #include "Packet.h" -#include "ObjectMgr.h" -#include "Common.h" -#include "BigNumber.h" -#include "SHA1.h" -#include <boost/asio/ip/tcp.hpp> +#include "Define.h" +#include "Optional.h" +#include <array> +#include <unordered_map> struct CharacterTemplate; -using boost::asio::ip::tcp; - namespace WorldPackets { namespace Auth @@ -155,8 +152,8 @@ namespace WorldPackets std::vector<VirtualRealmInfo> VirtualRealms; ///< list of realms connected to this one (inclusive) @todo implement std::vector<CharacterTemplate const*> Templates; ///< list of pre-made character templates. - ExpansionRequirementContainer const* AvailableClasses = nullptr; ///< the minimum AccountExpansion required to select the classes - ExpansionRequirementContainer const* AvailableRaces = nullptr; ///< the minimum AccountExpansion required to select the races + std::unordered_map<uint8, uint8> const* AvailableClasses = nullptr; ///< the minimum AccountExpansion required to select the classes + std::unordered_map<uint8, uint8> const* AvailableRaces = nullptr; ///< the minimum AccountExpansion required to select the races bool IsExpansionTrial = false; bool ForceCharacterTemplate = false; ///< forces the client to always use a character template when creating a new character. @see Templates. @todo implement @@ -233,13 +230,6 @@ namespace WorldPackets ConnectToSerial Serial = ConnectToSerial::None; ConnectPayload Payload; uint8 Con = 0; - - private: - BigNumber p; - BigNumber q; - BigNumber dmp1; - BigNumber dmq1; - BigNumber iqmp; }; class AuthContinuedSession final : public EarlyProcessClientPacket diff --git a/src/server/game/Server/Packets/BankPackets.cpp b/src/server/game/Server/Packets/BankPackets.cpp index 4def6d9f9e3..880fc7e2bbc 100644 --- a/src/server/game/Server/Packets/BankPackets.cpp +++ b/src/server/game/Server/Packets/BankPackets.cpp @@ -16,7 +16,6 @@ */ #include "BankPackets.h" -#include "ItemPackets.h" void WorldPackets::Bank::AutoBankItem::Read() { diff --git a/src/server/game/Server/Packets/BankPackets.h b/src/server/game/Server/Packets/BankPackets.h index b2083364f6d..df12753f2a4 100644 --- a/src/server/game/Server/Packets/BankPackets.h +++ b/src/server/game/Server/Packets/BankPackets.h @@ -18,10 +18,9 @@ #ifndef BankPackets_h__ #define BankPackets_h__ -#include "ItemPackets.h" #include "Packet.h" +#include "ItemPacketsCommon.h" #include "ObjectGuid.h" -#include "WorldSession.h" namespace WorldPackets { diff --git a/src/server/game/Server/Packets/BattlePetPackets.cpp b/src/server/game/Server/Packets/BattlePetPackets.cpp index 8b7141b3a22..0f724c8d15f 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.cpp +++ b/src/server/game/Server/Packets/BattlePetPackets.cpp @@ -16,7 +16,6 @@ */ #include "BattlePetPackets.h" -#include "World.h" ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::BattlePet::BattlePetSlot const& slot) { @@ -45,17 +44,17 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::BattlePet::BattlePet cons data << uint32(pet.Speed); data << uint8(pet.Quality); data.WriteBits(pet.Name.size(), 7); - data.WriteBit(!pet.Owner.IsEmpty()); // HasOwnerInfo + data.WriteBit(pet.OwnerInfo.is_initialized()); data.WriteBit(pet.Name.empty()); // NoRename data.FlushBits(); data.WriteString(pet.Name); - if (!pet.Owner.IsEmpty()) + if (pet.OwnerInfo) { - data << pet.Owner; - data << uint32(GetVirtualRealmAddress()); // Virtual - data << uint32(GetVirtualRealmAddress()); // Native + data << pet.OwnerInfo->Guid; + data << uint32(pet.OwnerInfo->PlayerVirtualRealm); + data << uint32(pet.OwnerInfo->PlayerNativeRealm); } return data; diff --git a/src/server/game/Server/Packets/BattlePetPackets.h b/src/server/game/Server/Packets/BattlePetPackets.h index 745c7723c2c..bbaa1d95617 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.h +++ b/src/server/game/Server/Packets/BattlePetPackets.h @@ -20,12 +20,20 @@ #include "Packet.h" #include "ObjectGuid.h" -#include "Unit.h" +#include "Optional.h" +#include "UnitDefines.h" namespace WorldPackets { namespace BattlePet { + struct BattlePetOwnerInfo + { + ObjectGuid Guid; + uint32 PlayerVirtualRealm = 0; + uint32 PlayerNativeRealm = 0; + }; + struct BattlePet { ObjectGuid Guid; @@ -41,7 +49,7 @@ namespace WorldPackets uint32 MaxHealth = 0; uint32 Speed = 0; uint8 Quality = 0; - ObjectGuid Owner; // for non-account wide pets only? (Guild Page, Guild Herald) + Optional<BattlePetOwnerInfo> OwnerInfo; std::string Name; }; diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 90dd5ccf529..ff38b48e00d 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -18,12 +18,11 @@ #ifndef BattlegroundPackets_h__ #define BattlegroundPackets_h__ -#include "Common.h" -#include "ObjectGuid.h" -#include "LFGPackets.h" -#include "Position.h" #include "Packet.h" +#include "LFGPacketsCommon.h" +#include "ObjectGuid.h" #include "Optional.h" +#include "Position.h" namespace WorldPackets { diff --git a/src/server/game/Server/Packets/BattlenetPackets.h b/src/server/game/Server/Packets/BattlenetPackets.h index ba3f4299ab9..6d89ba8a170 100644 --- a/src/server/game/Server/Packets/BattlenetPackets.h +++ b/src/server/game/Server/Packets/BattlenetPackets.h @@ -19,8 +19,8 @@ #define BattlenetPackets_h__ #include "Packet.h" -#include "MessageBuffer.h" #include "BattlenetRpcErrorCodes.h" +#include "MessageBuffer.h" #include <array> namespace WorldPackets diff --git a/src/server/game/Server/Packets/BlackMarketPackets.cpp b/src/server/game/Server/Packets/BlackMarketPackets.cpp index 9f95582b4ae..74e3b9411c2 100644 --- a/src/server/game/Server/Packets/BlackMarketPackets.cpp +++ b/src/server/game/Server/Packets/BlackMarketPackets.cpp @@ -16,35 +16,6 @@ */ #include "BlackMarketPackets.h" -#include "BlackMarketMgr.h" -#include "Player.h" - -void WorldPackets::BlackMarket::BlackMarketItem::Initialize(BlackMarketEntry *const entry, Player* player) -{ - BlackMarketTemplate const* templ = entry->GetTemplate(); - - MarketID = entry->GetMarketId(); - SellerNPC = templ->SellerNPC; - Item = templ->Item; - Quantity = templ->Quantity; - - // No bids yet - if (!entry->GetNumBids()) - { - MinBid = templ->MinBid; - MinIncrement = 1; - } - else - { - MinIncrement = entry->GetMinIncrement(); // 5% increment minimum - MinBid = entry->GetCurrentBid() + MinIncrement; - } - - CurrentBid = entry->GetCurrentBid(); - SecondsRemaining = entry->GetSecondsRemaining(); - HighBid = (entry->GetBidder() == player->GetGUID().GetCounter()); - NumBids = entry->GetNumBids(); -} void WorldPackets::BlackMarket::BlackMarketOpen::Read() { diff --git a/src/server/game/Server/Packets/BlackMarketPackets.h b/src/server/game/Server/Packets/BlackMarketPackets.h index ed67800cd8b..61d28a3d18e 100644 --- a/src/server/game/Server/Packets/BlackMarketPackets.h +++ b/src/server/game/Server/Packets/BlackMarketPackets.h @@ -19,11 +19,8 @@ #define BlackMarketPackets_h__ #include "Packet.h" +#include "ItemPacketsCommon.h" #include "ObjectGuid.h" -#include "ItemPackets.h" - -class Player; -class BlackMarketEntry; namespace WorldPackets { @@ -31,8 +28,6 @@ namespace WorldPackets { struct BlackMarketItem { - void Initialize(BlackMarketEntry *const entry, Player* player); - int32 MarketID = 0; int32 SellerNPC = 0; Item::ItemInstance Item; diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp index d045d3434fc..2c0e6a72bf9 100644 --- a/src/server/game/Server/Packets/CalendarPackets.cpp +++ b/src/server/game/Server/Packets/CalendarPackets.cpp @@ -16,7 +16,6 @@ */ #include "CalendarPackets.h" -#include "CalendarMgr.h" ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCalendarEventInfo const& eventInfo) { diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h index 7c417b123ef..61791b551f2 100644 --- a/src/server/game/Server/Packets/CalendarPackets.h +++ b/src/server/game/Server/Packets/CalendarPackets.h @@ -18,10 +18,10 @@ #ifndef CalendarPackets_h__ #define CalendarPackets_h__ -#include "ObjectGuid.h" #include "Packet.h" -#include "PacketUtilities.h" #include "CalendarMgr.h" +#include "ObjectGuid.h" +#include "PacketUtilities.h" namespace WorldPackets { diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp index 7ddcf009a99..31464337e74 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -16,6 +16,7 @@ */ #include "ChannelPackets.h" +#include "Channel.h" #include "Errors.h" WorldPacket const* WorldPackets::Channel::ChannelListResponse::Write() @@ -119,35 +120,29 @@ WorldPacket const* WorldPackets::Channel::UserlistUpdate::Write() return &_worldPacket; } -WorldPackets::Channel::ChannelPlayerCommand::ChannelPlayerCommand(WorldPacket&& packet) : ClientPacket(std::move(packet)) +WorldPackets::Channel::ChannelCommand::ChannelCommand(WorldPacket&& packet) : ClientPacket(std::move(packet)) { - switch (GetOpcode()) + switch (packet.GetOpcode()) { - default: - ABORT(); case CMSG_CHAT_CHANNEL_ANNOUNCEMENTS: - case CMSG_CHAT_CHANNEL_BAN: case CMSG_CHAT_CHANNEL_DECLINE_INVITE: case CMSG_CHAT_CHANNEL_DISPLAY_LIST: - case CMSG_CHAT_CHANNEL_INVITE: - case CMSG_CHAT_CHANNEL_KICK: case CMSG_CHAT_CHANNEL_LIST: case CMSG_CHAT_CHANNEL_MODERATE: - case CMSG_CHAT_CHANNEL_MODERATOR: - case CMSG_CHAT_CHANNEL_MUTE: case CMSG_CHAT_CHANNEL_OWNER: - case CMSG_CHAT_CHANNEL_PASSWORD: - case CMSG_CHAT_CHANNEL_SET_OWNER: - case CMSG_CHAT_CHANNEL_SILENCE_ALL: - case CMSG_CHAT_CHANNEL_UNBAN: - case CMSG_CHAT_CHANNEL_UNMODERATOR: - case CMSG_CHAT_CHANNEL_UNMUTE: - case CMSG_CHAT_CHANNEL_UNSILENCE_ALL: + break; + default: + ABORT(); break; } } -void WorldPackets::Channel::ChannelPlayerCommand::Read() +void WorldPackets::Channel::ChannelCommand::Read() +{ + ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); +} + +WorldPackets::Channel::ChannelPlayerCommand::ChannelPlayerCommand(WorldPacket&& packet) : ClientPacket(std::move(packet)) { switch (GetOpcode()) { @@ -162,36 +157,29 @@ void WorldPackets::Channel::ChannelPlayerCommand::Read() case CMSG_CHAT_CHANNEL_UNMODERATOR: case CMSG_CHAT_CHANNEL_UNMUTE: case CMSG_CHAT_CHANNEL_UNSILENCE_ALL: - { - uint32 channelNameLength = _worldPacket.ReadBits(7); - uint32 nameLength = _worldPacket.ReadBits(9); - ChannelName = _worldPacket.ReadString(channelNameLength); - Name = _worldPacket.ReadString(nameLength); - break; - } - case CMSG_CHAT_CHANNEL_ANNOUNCEMENTS: - case CMSG_CHAT_CHANNEL_DECLINE_INVITE: - case CMSG_CHAT_CHANNEL_DISPLAY_LIST: - case CMSG_CHAT_CHANNEL_LIST: - case CMSG_CHAT_CHANNEL_MODERATE: - case CMSG_CHAT_CHANNEL_OWNER: - { - ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); - break; - } - case CMSG_CHAT_CHANNEL_PASSWORD: - { - uint32 channelNameLength = _worldPacket.ReadBits(7); - uint32 nameLength = _worldPacket.ReadBits(7); - ChannelName = _worldPacket.ReadString(channelNameLength); - Name = _worldPacket.ReadString(nameLength); break; - } default: + ABORT(); break; } } +void WorldPackets::Channel::ChannelPlayerCommand::Read() +{ + uint32 channelNameLength = _worldPacket.ReadBits(7); + uint32 nameLength = _worldPacket.ReadBits(9); + ChannelName = _worldPacket.ReadString(channelNameLength); + Name = _worldPacket.ReadString(nameLength); +} + +void WorldPackets::Channel::ChannelPassword::Read() +{ + uint32 channelNameLength = _worldPacket.ReadBits(7); + uint32 passwordLength = _worldPacket.ReadBits(7); + ChannelName = _worldPacket.ReadString(channelNameLength); + Password = _worldPacket.ReadString(passwordLength); +} + void WorldPackets::Channel::JoinChannel::Read() { _worldPacket >> ChatChannelId; diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index e0ecf8f82f9..85a11ec36f3 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -19,7 +19,6 @@ #define ChannelPackets_h__ #include "Packet.h" -#include "Channel.h" #include "ObjectGuid.h" namespace WorldPackets @@ -103,8 +102,8 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid AddedUserGUID; - uint32 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags - uint8 UserFlags = MEMBER_FLAG_NONE; + uint32 _ChannelFlags = 0; ///< @see enum ChannelFlags + uint8 UserFlags = 0; ///< @see enum ChannelMemberFlags int32 ChannelID = 0; std::string ChannelName; }; @@ -117,7 +116,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid RemovedUserGUID; - uint32 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags + uint32 _ChannelFlags = 0; ///< @see enum ChannelFlags uint32 ChannelID = 0; std::string ChannelName; }; @@ -130,12 +129,22 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid UpdatedUserGUID; - uint32 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags - uint8 UserFlags = MEMBER_FLAG_NONE; + uint32 _ChannelFlags = 0; ///< @see enum ChannelFlags + uint8 UserFlags = 0; ///< @see enum ChannelMemberFlags int32 ChannelID = 0; std::string ChannelName; }; + class ChannelCommand final : public ClientPacket + { + public: + ChannelCommand(WorldPacket&& packet); + + void Read() override; + + std::string ChannelName; + }; + class ChannelPlayerCommand final : public ClientPacket { public: @@ -147,6 +156,17 @@ namespace WorldPackets std::string Name; }; + class ChannelPassword final : public ClientPacket + { + public: + ChannelPassword(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_CHANNEL_PASSWORD, std::move(packet)) { } + + void Read() override; + + std::string ChannelName; + std::string Password; + }; + class JoinChannel final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 095f14c3783..f65626179fa 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -16,6 +16,7 @@ */ #include "CharacterPackets.h" +#include "Field.h" #include "ObjectMgr.h" #include "PacketUtilities.h" #include "World.h" diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 79f35e4b8ad..70767bea1f0 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -19,6 +19,7 @@ #define CharacterPackets_h__ #include "Packet.h" +#include "Optional.h" #include "Player.h" #include "PacketUtilities.h" diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h index e79ae8978ae..4723c7561c4 100644 --- a/src/server/game/Server/Packets/ChatPackets.h +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -19,9 +19,10 @@ #define ChatPackets_h__ #include "Packet.h" -#include "SharedDefines.h" +#include "Common.h" #include "ObjectGuid.h" #include "PacketUtilities.h" +#include "SharedDefines.h" class WorldObject; diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index cf01534348c..0ddbad174d6 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -22,6 +22,9 @@ #include "ObjectGuid.h" #include "Position.h" #include "PacketUtilities.h" +#include <list> +#include <unordered_set> +#include <vector> struct GarrAbilityEntry; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 501732d3d4e..2470dca41c9 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -18,17 +18,6 @@ #include "ItemPackets.h" #include "Player.h" -bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData const& r) const -{ - if (Context != r.Context) - return false; - - if (BonusListIDs.size() != r.BonusListIDs.size()) - return false; - - return std::is_permutation(BonusListIDs.begin(), BonusListIDs.end(), r.BonusListIDs.begin()); -} - void WorldPackets::Item::BuyBackItem::Read() { _worldPacket >> VendorGUID; @@ -162,213 +151,6 @@ WorldPacket const* WorldPackets::Item::SetProficiency::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData) -{ - data << uint8(itemBonusInstanceData.Context); - data << uint32(itemBonusInstanceData.BonusListIDs.size()); - for (uint32 bonusID : itemBonusInstanceData.BonusListIDs) - data << uint32(bonusID); - - return data; -} - -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData) -{ - uint32 bonusListIdSize; - - data >> itemBonusInstanceData.Context; - data >> bonusListIdSize; - - for (uint32 i = 0u; i < bonusListIdSize; ++i) - { - uint32 bonusId; - data >> bonusId; - itemBonusInstanceData.BonusListIDs.push_back(bonusId); - } - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance) -{ - data << int32(itemInstance.ItemID); - data << int32(itemInstance.RandomPropertiesSeed); - data << int32(itemInstance.RandomPropertiesID); - - data.WriteBit(itemInstance.ItemBonus.is_initialized()); - data.WriteBit(itemInstance.Modifications.is_initialized()); - data.FlushBits(); - - if (itemInstance.ItemBonus) - data << *itemInstance.ItemBonus; - - if (itemInstance.Modifications) - data << *itemInstance.Modifications; - - return data; -} - -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance) -{ - data >> itemInstance.ItemID; - data >> itemInstance.RandomPropertiesSeed; - data >> itemInstance.RandomPropertiesID; - - bool hasItemBonus = data.ReadBit(); - bool hasModifications = data.ReadBit(); - data.ResetBitPos(); - - if (hasItemBonus) - { - itemInstance.ItemBonus = boost::in_place(); - data >> *itemInstance.ItemBonus; - } - - if (hasModifications) - { - itemInstance.Modifications = boost::in_place(); - data >> *itemInstance.Modifications; - } - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData const& itemEnchantData) -{ - data << int32(itemEnchantData.ID); - data << uint32(itemEnchantData.Expiration); - data << int32(itemEnchantData.Charges); - data << uint8(itemEnchantData.Slot); - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemData const& itemGemData) -{ - data << uint8(itemGemData.Slot); - data << itemGemData.Item; - return data; -} - -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemData& itemGemData) -{ - data >> itemGemData.Slot; - data >> itemGemData.Item; - return data; -} - -ByteBuffer& WorldPackets::Item::operator>>(ByteBuffer& data, InvUpdate& invUpdate) -{ - invUpdate.Items.resize(data.ReadBits(2)); - for (size_t i = 0; i < invUpdate.Items.size(); ++i) - { - data >> invUpdate.Items[i].ContainerSlot; - data >> invUpdate.Items[i].Slot; - } - - return data; -} - -void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) -{ - ItemID = item->GetEntry(); - RandomPropertiesSeed = item->GetItemSuffixFactor(); - RandomPropertiesID = item->GetItemRandomPropertyId(); - std::vector<uint32> const& bonusListIds = item->GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS); - if (!bonusListIds.empty()) - { - ItemBonus = boost::in_place(); - ItemBonus->BonusListIDs.insert(ItemBonus->BonusListIDs.end(), bonusListIds.begin(), bonusListIds.end()); - ItemBonus->Context = item->GetUInt32Value(ITEM_FIELD_CONTEXT); - } - - if (uint32 mask = item->GetUInt32Value(ITEM_FIELD_MODIFIERS_MASK)) - { - Modifications = boost::in_place(); - - for (size_t i = 0; mask != 0; mask >>= 1, ++i) - if ((mask & 1) != 0) - Modifications->Insert(i, item->GetModifier(ItemModifier(i))); - } -} - -void WorldPackets::Item::ItemInstance::Initialize(::ItemDynamicFieldGems const* gem) -{ - ItemID = gem->ItemId; - - ItemBonusInstanceData bonus; - bonus.Context = gem->Context; - for (uint16 bonusListId : gem->BonusListIDs) - if (bonusListId) - bonus.BonusListIDs.push_back(bonusListId); - - if (bonus.Context || !bonus.BonusListIDs.empty()) - ItemBonus = bonus; -} - -void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) -{ - ItemID = lootItem.itemid; - RandomPropertiesSeed = lootItem.randomSuffix; - if (lootItem.randomPropertyId.Type != ItemRandomEnchantmentType::BonusList) - RandomPropertiesID = lootItem.randomPropertyId.Id; - - if (!lootItem.BonusListIDs.empty()) - { - ItemBonus = boost::in_place(); - ItemBonus->BonusListIDs = lootItem.BonusListIDs; - ItemBonus->Context = lootItem.context; - } - - if (lootItem.upgradeId) - { - Modifications = boost::in_place(); - Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, lootItem.upgradeId); - } -} - -void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem) -{ - ItemID = voidItem->ItemEntry; - RandomPropertiesSeed = voidItem->ItemSuffixFactor; - if (voidItem->ItemRandomPropertyId.Type != ItemRandomEnchantmentType::BonusList) - RandomPropertiesID = voidItem->ItemRandomPropertyId.Id; - - if (voidItem->ItemUpgradeId || voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) - { - Modifications = boost::in_place(); - if (voidItem->ItemUpgradeId) - Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, voidItem->ItemUpgradeId); - if (voidItem->FixedScalingLevel) - Modifications->Insert(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL, voidItem->FixedScalingLevel); - if (voidItem->ArtifactKnowledgeLevel) - Modifications->Insert(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, voidItem->ArtifactKnowledgeLevel); - } - - if (!voidItem->BonusListIDs.empty()) - { - ItemBonus = boost::in_place(); - ItemBonus->Context = voidItem->Context; - ItemBonus->BonusListIDs = voidItem->BonusListIDs; - } -} - -bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const -{ - if (ItemID != r.ItemID || RandomPropertiesID != r.RandomPropertiesID || RandomPropertiesSeed != r.RandomPropertiesSeed) - return false; - - if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized() || Modifications.is_initialized() != r.Modifications.is_initialized()) - return false; - - if (Modifications.is_initialized() && *Modifications != *r.Modifications) - return false; - - if (ItemBonus.is_initialized() && *ItemBonus != *r.ItemBonus) - return false; - - return true; -} - WorldPacket const* WorldPackets::Item::InventoryChangeFailure::Write() { _worldPacket << int8(BagResult); diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index 012e6800174..4e677814083 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -20,6 +20,7 @@ #include "Packet.h" #include "Item.h" +#include "ItemPacketsCommon.h" #include "PacketUtilities.h" #include "Optional.h" @@ -29,47 +30,6 @@ namespace WorldPackets { namespace Item { - struct ItemBonusInstanceData - { - uint8 Context = 0; - std::vector<int32> BonusListIDs; - - bool operator==(ItemBonusInstanceData const& r) const; - bool operator!=(ItemBonusInstanceData const& r) const { return !(*this == r); } - }; - - struct ItemInstance - { - void Initialize(::Item const* item); - void Initialize(::ItemDynamicFieldGems const* gem); - void Initialize(::LootItem const& lootItem); - void Initialize(::VoidStorageItem const* voidItem); - - uint32 ItemID = 0; - uint32 RandomPropertiesSeed = 0; - uint32 RandomPropertiesID = 0; - Optional<ItemBonusInstanceData> ItemBonus; - Optional<CompactArray<int32>> Modifications; - - bool operator==(ItemInstance const& r) const; - bool operator!=(ItemInstance const& r) const { return !(*this == r); } - }; - - struct ItemEnchantData - { - ItemEnchantData(int32 id, uint32 expiration, int32 charges, uint8 slot) : ID(id), Expiration(expiration), Charges(charges), Slot(slot) { } - int32 ID = 0; - uint32 Expiration = 0; - int32 Charges = 0; - uint8 Slot = 0; - }; - - struct ItemGemData - { - uint8 Slot; - ItemInstance Item; - }; - class BuyBackItem final : public ClientPacket { public: @@ -242,17 +202,6 @@ namespace WorldPackets uint8 ProficiencyClass = 0; }; - struct InvUpdate - { - struct InvItem - { - uint8 ContainerSlot = 0; - uint8 Slot = 0; - }; - - std::vector<InvItem> Items; - }; - class InventoryChangeFailure final : public ServerPacket { public: @@ -539,17 +488,7 @@ namespace WorldPackets ObjectGuid Item; }; - - ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData); -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance); -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData const& itemEnchantData); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemData const& itemGemInstanceData); -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemData& itemGemInstanceData); - #endif // ItemPackets_h__ diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp new file mode 100644 index 00000000000..dc2a6dad65e --- /dev/null +++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ItemPacketsCommon.h" +#include "Item.h" +#include "Player.h" + +bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData const& r) const +{ + if (Context != r.Context) + return false; + + if (BonusListIDs.size() != r.BonusListIDs.size()) + return false; + + return std::is_permutation(BonusListIDs.begin(), BonusListIDs.end(), r.BonusListIDs.begin()); +} + +void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) +{ + ItemID = item->GetEntry(); + RandomPropertiesSeed = item->GetItemSuffixFactor(); + RandomPropertiesID = item->GetItemRandomPropertyId(); + std::vector<uint32> const& bonusListIds = item->GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS); + if (!bonusListIds.empty()) + { + ItemBonus = boost::in_place(); + ItemBonus->BonusListIDs.insert(ItemBonus->BonusListIDs.end(), bonusListIds.begin(), bonusListIds.end()); + ItemBonus->Context = item->GetUInt32Value(ITEM_FIELD_CONTEXT); + } + + if (uint32 mask = item->GetUInt32Value(ITEM_FIELD_MODIFIERS_MASK)) + { + Modifications = boost::in_place(); + + for (size_t i = 0; mask != 0; mask >>= 1, ++i) + if ((mask & 1) != 0) + Modifications->Insert(i, item->GetModifier(ItemModifier(i))); + } +} + +void WorldPackets::Item::ItemInstance::Initialize(::ItemDynamicFieldGems const* gem) +{ + ItemID = gem->ItemId; + + ItemBonusInstanceData bonus; + bonus.Context = gem->Context; + for (uint16 bonusListId : gem->BonusListIDs) + if (bonusListId) + bonus.BonusListIDs.push_back(bonusListId); + + if (bonus.Context || !bonus.BonusListIDs.empty()) + ItemBonus = bonus; +} + +void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) +{ + ItemID = lootItem.itemid; + RandomPropertiesSeed = lootItem.randomSuffix; + if (lootItem.randomPropertyId.Type != ItemRandomEnchantmentType::BonusList) + RandomPropertiesID = lootItem.randomPropertyId.Id; + + if (!lootItem.BonusListIDs.empty()) + { + ItemBonus = boost::in_place(); + ItemBonus->BonusListIDs = lootItem.BonusListIDs; + ItemBonus->Context = lootItem.context; + } + + if (lootItem.upgradeId) + { + Modifications = boost::in_place(); + Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, lootItem.upgradeId); + } +} + +void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem) +{ + ItemID = voidItem->ItemEntry; + RandomPropertiesSeed = voidItem->ItemSuffixFactor; + if (voidItem->ItemRandomPropertyId.Type != ItemRandomEnchantmentType::BonusList) + RandomPropertiesID = voidItem->ItemRandomPropertyId.Id; + + if (voidItem->ItemUpgradeId || voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) + { + Modifications = boost::in_place(); + if (voidItem->ItemUpgradeId) + Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, voidItem->ItemUpgradeId); + if (voidItem->FixedScalingLevel) + Modifications->Insert(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL, voidItem->FixedScalingLevel); + if (voidItem->ArtifactKnowledgeLevel) + Modifications->Insert(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, voidItem->ArtifactKnowledgeLevel); + } + + if (!voidItem->BonusListIDs.empty()) + { + ItemBonus = boost::in_place(); + ItemBonus->Context = voidItem->Context; + ItemBonus->BonusListIDs = voidItem->BonusListIDs; + } +} + +bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const +{ + if (ItemID != r.ItemID || RandomPropertiesID != r.RandomPropertiesID || RandomPropertiesSeed != r.RandomPropertiesSeed) + return false; + + if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized() || Modifications.is_initialized() != r.Modifications.is_initialized()) + return false; + + if (Modifications.is_initialized() && *Modifications != *r.Modifications) + return false; + + if (ItemBonus.is_initialized() && *ItemBonus != *r.ItemBonus) + return false; + + return true; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData) +{ + data << uint8(itemBonusInstanceData.Context); + data << uint32(itemBonusInstanceData.BonusListIDs.size()); + for (uint32 bonusID : itemBonusInstanceData.BonusListIDs) + data << uint32(bonusID); + + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData) +{ + uint32 bonusListIdSize; + + data >> itemBonusInstanceData.Context; + data >> bonusListIdSize; + + for (uint32 i = 0u; i < bonusListIdSize; ++i) + { + uint32 bonusId; + data >> bonusId; + itemBonusInstanceData.BonusListIDs.push_back(bonusId); + } + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance) +{ + data << int32(itemInstance.ItemID); + data << int32(itemInstance.RandomPropertiesSeed); + data << int32(itemInstance.RandomPropertiesID); + + data.WriteBit(itemInstance.ItemBonus.is_initialized()); + data.WriteBit(itemInstance.Modifications.is_initialized()); + data.FlushBits(); + + if (itemInstance.ItemBonus) + data << *itemInstance.ItemBonus; + + if (itemInstance.Modifications) + data << *itemInstance.Modifications; + + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance) +{ + data >> itemInstance.ItemID; + data >> itemInstance.RandomPropertiesSeed; + data >> itemInstance.RandomPropertiesID; + + bool hasItemBonus = data.ReadBit(); + bool hasModifications = data.ReadBit(); + + if (hasItemBonus) + { + itemInstance.ItemBonus = boost::in_place(); + data >> *itemInstance.ItemBonus; + } + + if (hasModifications) + { + itemInstance.Modifications = boost::in_place(); + data >> *itemInstance.Modifications; + } + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData const& itemEnchantData) +{ + data << int32(itemEnchantData.ID); + data << uint32(itemEnchantData.Expiration); + data << int32(itemEnchantData.Charges); + data << uint8(itemEnchantData.Slot); + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemData const& itemGemData) +{ + data << uint8(itemGemData.Slot); + data << itemGemData.Item; + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemData& itemGemData) +{ + data >> itemGemData.Slot; + data >> itemGemData.Item; + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::InvUpdate& invUpdate) +{ + invUpdate.Items.resize(data.ReadBits(2)); + for (size_t i = 0; i < invUpdate.Items.size(); ++i) + { + data >> invUpdate.Items[i].ContainerSlot; + data >> invUpdate.Items[i].Slot; + } + + return data; +} diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.h b/src/server/game/Server/Packets/ItemPacketsCommon.h new file mode 100644 index 00000000000..172e9d3e25d --- /dev/null +++ b/src/server/game/Server/Packets/ItemPacketsCommon.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef ItemPacketsCommon_h__ +#define ItemPacketsCommon_h__ + +#include "Define.h" +#include "PacketUtilities.h" +#include "Optional.h" +#include <vector> + +class ByteBuffer; +class Item; +struct ItemDynamicFieldGems; +struct LootItem; +struct VoidStorageItem; + +namespace WorldPackets +{ + namespace Item + { + struct ItemBonusInstanceData + { + uint8 Context = 0; + std::vector<int32> BonusListIDs; + + bool operator==(ItemBonusInstanceData const& r) const; + bool operator!=(ItemBonusInstanceData const& r) const { return !(*this == r); } + }; + + struct ItemInstance + { + void Initialize(::Item const* item); + void Initialize(::ItemDynamicFieldGems const* gem); + void Initialize(::LootItem const& lootItem); + void Initialize(::VoidStorageItem const* voidItem); + + uint32 ItemID = 0; + uint32 RandomPropertiesSeed = 0; + uint32 RandomPropertiesID = 0; + Optional<ItemBonusInstanceData> ItemBonus; + Optional<CompactArray<int32>> Modifications; + + bool operator==(ItemInstance const& r) const; + bool operator!=(ItemInstance const& r) const { return !(*this == r); } + }; + + struct ItemEnchantData + { + ItemEnchantData(int32 id, uint32 expiration, int32 charges, uint8 slot) : ID(id), Expiration(expiration), Charges(charges), Slot(slot) { } + int32 ID = 0; + uint32 Expiration = 0; + int32 Charges = 0; + uint8 Slot = 0; + }; + + struct ItemGemData + { + uint8 Slot; + ItemInstance Item; + }; + + struct InvUpdate + { + struct InvItem + { + uint8 ContainerSlot = 0; + uint8 Slot = 0; + }; + + std::vector<InvItem> Items; + }; + } +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData); +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData); + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance); +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance); + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData const& itemEnchantData); + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemData const& itemGemInstanceData); +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemData& itemGemInstanceData); + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::InvUpdate& invUpdate); + +#endif // ItemPacketsCommon_h__ diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index a5078efdf5a..4ec8178035c 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -16,23 +16,3 @@ */ #include "LFGPackets.h" - -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket) -{ - data >> ticket.RequesterGuid; - data >> ticket.Id; - data >> ticket.Type; - data >> ticket.Time; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::RideTicket const& ticket) -{ - data << ticket.RequesterGuid; - data << int32(ticket.Id); - data << int32(ticket.Type); - data << uint32(ticket.Time); - - return data; -} diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index 009018a43a0..18b8ef8620a 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -18,23 +18,14 @@ #ifndef LFGPackets_h__ #define LFGPackets_h__ -#include "ObjectGuid.h" +#include "Packet.h" +#include "LFGPacketsCommon.h" namespace WorldPackets { namespace LFG { - struct RideTicket - { - ObjectGuid RequesterGuid; - int32 Id = 0; - int32 Type = 0; - uint32 Time = 0; - }; } } -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::RideTicket const& ticket); - #endif // LFGPackets_h__ diff --git a/src/server/game/Server/Packets/LFGPacketsCommon.cpp b/src/server/game/Server/Packets/LFGPacketsCommon.cpp new file mode 100644 index 00000000000..71af239d5aa --- /dev/null +++ b/src/server/game/Server/Packets/LFGPacketsCommon.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "LFGPacketsCommon.h" + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket) +{ + data >> ticket.RequesterGuid; + data >> ticket.Id; + data >> ticket.Type; + data >> ticket.Time; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::RideTicket const& ticket) +{ + data << ticket.RequesterGuid; + data << int32(ticket.Id); + data << int32(ticket.Type); + data << uint32(ticket.Time); + + return data; +} diff --git a/src/server/game/Server/Packets/LFGPacketsCommon.h b/src/server/game/Server/Packets/LFGPacketsCommon.h new file mode 100644 index 00000000000..957ed07f161 --- /dev/null +++ b/src/server/game/Server/Packets/LFGPacketsCommon.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef LFGPacketsCommon_h__ +#define LFGPacketsCommon_h__ + +#include "Packet.h" +#include "ObjectGuid.h" + +namespace WorldPackets +{ + namespace LFG + { + struct RideTicket + { + ObjectGuid RequesterGuid; + int32 Id = 0; + int32 Type = 0; + uint32 Time = 0; + }; + } +} + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::RideTicket const& ticket); + +#endif // LFGPacketsCommon_h__ diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 4880b750319..f3c5b1467d8 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -16,7 +16,7 @@ */ #include "MiscPackets.h" -#include "PacketUtilities.h" +#include "Common.h" WorldPacket const* WorldPackets::Misc::BindPointUpdate::Write() { @@ -467,12 +467,10 @@ WorldPacket const* WorldPackets::Misc::Dismount::Write() void WorldPackets::Misc::SaveCUFProfiles::Read() { - uint32 count; - _worldPacket >> count; - - for (uint8 i = 0; i < count && i < MAX_CUF_PROFILES; i++) + CUFProfiles.resize(_worldPacket.read<uint32>()); + for (std::unique_ptr<CUFProfile>& cufProfile : CUFProfiles) { - std::unique_ptr<CUFProfile> cufProfile = Trinity::make_unique<CUFProfile>(); + cufProfile = Trinity::make_unique<CUFProfile>(); uint8 strLen = _worldPacket.ReadBits(7); @@ -496,8 +494,6 @@ void WorldPackets::Misc::SaveCUFProfiles::Read() _worldPacket >> cufProfile->LeftOffset; cufProfile->ProfileName = _worldPacket.ReadString(strLen); - - CUFProfiles.push_back(std::move(cufProfile)); } } diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 9617cc4b1e1..c4f05ff3b89 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -19,14 +19,20 @@ #define MiscPackets_h__ #include "Packet.h" -#include "ObjectGuid.h" -#include "WorldSession.h" -#include "Object.h" -#include "Unit.h" -#include "Player.h" -#include "Weather.h" #include "CollectionMgr.h" +#include "CUFProfile.h" +#include "ObjectGuid.h" +#include "Optional.h" #include "PacketUtilities.h" +#include "Position.h" +#include "SharedDefines.h" +#include <array> +#include <map> +#include <set> + +enum MountStatusFlags : uint8; +enum UnitStandStateType : uint8; +enum WeatherState : uint32; namespace WorldPackets { @@ -39,7 +45,7 @@ namespace WorldPackets WorldPacket const* Write() override; - uint32 BindMapID = MAPID_INVALID; + uint32 BindMapID = 0; TaggedPosition<Position::XYZ> BindPosition; uint32 BindAreaID = 0; }; @@ -387,7 +393,7 @@ namespace WorldPackets bool Abrupt = false; float Intensity = 0.0f; - WeatherState WeatherID = WEATHER_STATE_FINE; + WeatherState WeatherID = WeatherState(0); }; class StandStateChange final : public ClientPacket @@ -397,7 +403,7 @@ namespace WorldPackets void Read() override; - UnitStandStateType StandState = UNIT_STAND_STATE_STAND; + UnitStandStateType StandState = UnitStandStateType(0); }; class StandStateUpdate final : public ServerPacket @@ -409,7 +415,7 @@ namespace WorldPackets WorldPacket const* Write() override; uint32 AnimKitID = 0; - UnitStandStateType State = UNIT_STAND_STATE_STAND; + UnitStandStateType State = UnitStandStateType(0); }; class StartMirrorTimer final : public ServerPacket @@ -783,7 +789,7 @@ namespace WorldPackets WorldPacket const* Write() override; bool IsFullUpdate = false; - HeirloomContainer const* Heirlooms = nullptr; + std::map<uint32, HeirloomData> const* Heirlooms = nullptr; int32 Unk = 0; }; diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index a7e73465949..44a4e22a74e 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -122,7 +122,7 @@ namespace WorldPackets } uint32 GetMask() const { return _mask; } - T const& operator[](std::size_t index) const { return _contents.at(index); } + T const& operator[](std::size_t index) const { return _contents[index]; } std::size_t GetSize() const { return _contents.size(); } void Insert(std::size_t index, T const& value) diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 6d5657d80b6..c4974e77f6e 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -16,12 +16,13 @@ */ #include "PartyPackets.h" - -#include "Player.h" #include "Pet.h" -#include "Vehicle.h" -#include "SpellAuras.h" +#include "Player.h" +#include "Realm.h" #include "SpellAuraEffects.h" +#include "SpellAuras.h" +#include "Vehicle.h" +#include "World.h" WorldPacket const* WorldPackets::Party::PartyCommandResult::Write() { diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h index 6e5787f1a7f..0a8fb5e7c06 100644 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -21,6 +21,7 @@ #include "Packet.h" #include "PacketUtilities.h" #include "ObjectGuid.h" +#include "Optional.h" #include "Unit.h" #include "WorldSession.h" diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index e57864f077b..88e9a24b030 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -18,7 +18,6 @@ #include "QueryPackets.h" #include "BattlenetAccountMgr.h" #include "Player.h" -#include "PacketUtilities.h" #include "World.h" #include "ObjectMgr.h" diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index d0af1e0043d..3d2aeca3610 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -23,6 +23,7 @@ #include "Player.h" #include "SpellAuras.h" #include "Spell.h" +#include "Optional.h" namespace WorldPackets { diff --git a/src/server/game/Server/Packets/TaxiPackets.h b/src/server/game/Server/Packets/TaxiPackets.h index c9d7ba8e061..0acba3d2f73 100644 --- a/src/server/game/Server/Packets/TaxiPackets.h +++ b/src/server/game/Server/Packets/TaxiPackets.h @@ -1,19 +1,19 @@ /* -* Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation; either version 2 of the License, or (at your -* option) any later version. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along -* with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ #ifndef TaxiPackets_h__ #define TaxiPackets_h__ diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index 9f1197b97df..cc60c57e908 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -15,13 +15,10 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "LFGPackets.h" #include "TicketPackets.h" #include "PacketUtilities.h" #include "SupportMgr.h" -using namespace WorldPackets; - ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Ticket::SupportTicketHeader& header) { data >> header.MapID; diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h index 048e387c046..b8c02a555b0 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -19,7 +19,7 @@ #define TicketPackets_h__ #include "Packet.h" -#include "LFGPackets.h" +#include "LFGPacketsCommon.h" #include "Optional.h" #include "Position.h" diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5d8a6a7c14c..b9ac5fa4020 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -280,24 +280,24 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChatAddonMessageOpcode); DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChatAddonMessageOpcode); DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChatAddonMessageWhisperOpcode); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_ANNOUNCEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand<&Channel::Announce>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_BAN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::Ban>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_DECLINE_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand<&Channel::DeclineInvite>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand<&Channel::List>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::Invite>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_KICK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::Kick>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand<&Channel::List>); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_ANNOUNCEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_BAN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_DECLINE_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_KICK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand); DEFINE_HANDLER(CMSG_CHAT_CHANNEL_MODERATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_MODERATOR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::SetModerator>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_MUTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::SetMute>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_OWNER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand<&Channel::SendWhoOwner>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_PASSWORD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::Password>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_SET_OWNER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::SetOwner>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_SILENCE_ALL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::SilenceAll>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNBAN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::UnBan>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNMODERATOR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::UnsetModerator>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNMUTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::UnsetMute>); - DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNSILENCE_ALL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand<&Channel::UnsilenceAll>); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_MODERATOR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_MUTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_OWNER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_PASSWORD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPassword); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_SET_OWNER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_SILENCE_ALL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNBAN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNMODERATOR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNMUTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); + DEFINE_HANDLER(CMSG_CHAT_CHANNEL_UNSILENCE_ALL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPlayerCommand); DEFINE_HANDLER(CMSG_CHAT_JOIN_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannel); DEFINE_HANDLER(CMSG_CHAT_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel); DEFINE_HANDLER(CMSG_CHAT_MESSAGE_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChatMessageAFKOpcode); diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp index d32ea43bfc2..7f0ffed44f2 100644 --- a/src/server/game/Server/Protocol/PacketLog.cpp +++ b/src/server/game/Server/Protocol/PacketLog.cpp @@ -17,9 +17,11 @@ #include "PacketLog.h" #include "Config.h" -#include "WorldPacket.h" +#include "Realm.h" #include "Timer.h" #include "World.h" +#include "WorldPacket.h" +#include <boost/asio/ip/address.hpp> #pragma pack(push, 1) @@ -89,19 +91,21 @@ void PacketLog::Initialize() { _file = fopen((logsDir + logname).c_str(), "wb"); - LogHeader header; - header.Signature[0] = 'P'; header.Signature[1] = 'K'; header.Signature[2] = 'T'; - header.FormatVersion = 0x0301; - header.SnifferId = 'T'; - header.Build = realm.Build; - header.Locale[0] = 'e'; header.Locale[1] = 'n'; header.Locale[2] = 'U'; header.Locale[3] = 'S'; - std::memset(header.SessionKey, 0, sizeof(header.SessionKey)); - header.SniffStartUnixtime = time(NULL); - header.SniffStartTicks = getMSTime(); - header.OptionalDataSize = 0; - if (CanLogPacket()) + { + LogHeader header; + header.Signature[0] = 'P'; header.Signature[1] = 'K'; header.Signature[2] = 'T'; + header.FormatVersion = 0x0301; + header.SnifferId = 'T'; + header.Build = realm.Build; + header.Locale[0] = 'e'; header.Locale[1] = 'n'; header.Locale[2] = 'U'; header.Locale[3] = 'S'; + std::memset(header.SessionKey, 0, sizeof(header.SessionKey)); + header.SniffStartUnixtime = time(NULL); + header.SniffStartTicks = getMSTime(); + header.OptionalDataSize = 0; + fwrite(&header, sizeof(header), 1, _file); + } } } diff --git a/src/server/game/Server/Protocol/PacketLog.h b/src/server/game/Server/Protocol/PacketLog.h index acf5efe0ee5..2d7b1c1b1bc 100644 --- a/src/server/game/Server/Protocol/PacketLog.h +++ b/src/server/game/Server/Protocol/PacketLog.h @@ -19,9 +19,6 @@ #define TRINITY_PACKETLOG_H #include "Common.h" -#include "Opcodes.h" - -#include <boost/asio/ip/address.hpp> #include <mutex> enum Direction @@ -31,6 +28,18 @@ enum Direction }; class WorldPacket; +enum ConnectionType : int8; + +namespace boost +{ + namespace asio + { + namespace ip + { + class address; + } + } +} class TC_GAME_API PacketLog { diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index 11f72160067..a6c9ffe2ba0 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -19,9 +19,8 @@ #ifndef TRINITYCORE_WORLDPACKET_H #define TRINITYCORE_WORLDPACKET_H -#include "Common.h" -#include "Opcodes.h" #include "ByteBuffer.h" +#include "Opcodes.h" class WorldPacket : public ByteBuffer { diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 8f1f87bcf18..2bcb75f4b4f 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -20,43 +20,34 @@ \ingroup u2w */ -#include "WorldSocket.h" -#include "Config.h" -#include "Common.h" -#include "DatabaseEnv.h" -#include "QueryCallback.h" +#include "WorldSession.h" #include "QueryHolder.h" #include "AccountMgr.h" -#include "Log.h" -#include "Opcodes.h" -#include "WorldPacket.h" -#include "WorldSession.h" -#include "Player.h" -#include "Vehicle.h" -#include "ObjectMgr.h" -#include "GuildMgr.h" -#include "Group.h" -#include "Guild.h" -#include "World.h" -#include "ObjectAccessor.h" -#include "BattlegroundMgr.h" -#include "OutdoorPvPMgr.h" -#include "SocialMgr.h" -#include "ScriptMgr.h" -#include "WardenWin.h" #include "AuthenticationPackets.h" +#include "BattlePetMgr.h" +#include "BattlegroundMgr.h" #include "BattlenetPackets.h" #include "CharacterPackets.h" -#include "ClientConfigPackets.h" -#include "MiscPackets.h" #include "ChatPackets.h" -#include "BattlePetMgr.h" -#include "PacketUtilities.h" -#include "CollectionMgr.h" +#include "DatabaseEnv.h" +#include "Group.h" +#include "Guild.h" +#include "GuildMgr.h" #include "Metric.h" +#include "MiscPackets.h" +#include "ObjectMgr.h" +#include "OutdoorPvPMgr.h" +#include "PacketUtilities.h" +#include "Player.h" +#include "QueryHolder.h" #include "Random.h" - -#include <zlib.h> +#include "RBAC.h" +#include "Realm.h" +#include "ScriptMgr.h" +#include "SocialMgr.h" +#include "WardenWin.h" +#include "World.h" +#include "WorldSocket.h" namespace { @@ -697,6 +688,11 @@ char const* WorldSession::GetTrinityString(uint32 entry) const return sObjectMgr->GetTrinityString(entry, GetSessionDbLocaleIndex()); } +void WorldSession::ResetTimeOutTime() +{ + m_timeOutTime = int32(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME)); +} + void WorldSession::Handle_NULL(WorldPackets::Null& null) { TC_LOG_ERROR("network.opcode", "Received unhandled opcode %s from %s", GetOpcodeNameForLogging(null.GetOpcode()).c_str(), GetPlayerInfo().c_str()); @@ -1387,3 +1383,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co return maxPacketCounterAllowed; } + +WorldSession::DosProtection::DosProtection(WorldSession* s) : Session(s), _policy((Policy)sWorld->getIntConfig(CONFIG_PACKET_SPOOF_POLICY)) +{ +} diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 20999763fcb..8b4c5e99743 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -24,39 +24,36 @@ #define __WORLDSESSION_H #include "Common.h" -#include "SharedDefines.h" -#include "DatabaseEnv.h" -#include "World.h" +#include "DatabaseEnvFwd.h" +#include "LockedQueue.h" +#include "ObjectGuid.h" #include "Packet.h" -#include "Cryptography/BigNumber.h" -#include "AccountMgr.h" +#include "QueryCallbackProcessor.h" +#include "SharedDefines.h" +#include <array> +#include <set> +#include <unordered_map> #include <unordered_set> class BattlePetMgr; -class Channel; +class BigNumber; +class BlackMarketEntry; class CollectionMgr; class Creature; -class BlackMarketEntry; -class GameObject; class InstanceSave; class Item; class LoginQueryHolder; -class Object; class Player; -class Quest; -class SpellCastTargets; class Unit; class Warden; -class WorldPacket; class WorldSession; class WorldSocket; -struct AreaTableEntry; struct AuctionEntry; +struct BlackMarketTemplate; struct DeclinedName; struct ItemTemplate; struct MovementInfo; struct Position; -struct BlackMarketTemplate; namespace lfg { @@ -233,7 +230,9 @@ namespace WorldPackets namespace Channel { + class ChannelCommand; class ChannelPlayerCommand; + class ChannelPassword; class JoinChannel; class LeaveChannel; } @@ -771,41 +770,6 @@ enum AccountDataType #define GLOBAL_CACHE_MASK 0x15 #define PER_CHARACTER_CACHE_MASK 0xEA -enum TutorialAction : uint8 -{ - TUTORIAL_ACTION_UPDATE = 0, - TUTORIAL_ACTION_CLEAR = 1, - TUTORIAL_ACTION_RESET = 2 -}; - -/* -enum Tutorials -{ - TUTORIAL_TALENT = 0, - TUTORIAL_SPEC = 1, - TUTORIAL_GLYPH = 2, - TUTORIAL_SPELLBOOK = 3, - TUTORIAL_PROFESSIONS = 4, - TUTORIAL_CORE_ABILITITES = 5, - TUTORIAL_PET_JOURNAL = 6, - TUTORIAL_WHAT_HAS_CHANGED = 7, - TUTORIAL_GARRISON_BUILDING = 8, - TUTORIAL_GARRISON_MISSION_LIST = 9, - TUTORIAL_GARRISON_MISSION_PAGE = 10, - TUTORIAL_GARRISON_LANDING = 11, - TUTORIAL_GARRISON_ZONE_ABILITY = 12, - TUTORIAL_WORLD_MAP_FRAME = 13, - TUTORIAL_CLEAN_UP_BAGS = 14, - TUTORIAL_BAG_SETTINGS = 15, - TUTORIAL_REAGENT_BANK_UNLOCK = 16, - TUTORIAL_TOYBOX_FAVORITE = 17, - TUTORIAL_TOYBOX_MOUSEWHEEL_PAGING = 18, - TUTORIAL_LFG_LIST = 19 -}; -*/ - -#define MAX_ACCOUNT_TUTORIAL_VALUES 8 - struct AccountData { time_t Time = 0; @@ -862,9 +826,6 @@ enum DeclinedNameResult DECLINED_NAMES_RESULT_ERROR = 1 }; -#define DB2_REPLY_SPARSE 2442913102 -#define DB2_REPLY_ITEM 1344507586 - //class to deal with packet processing //allows to determine if next packet is safe to be processed class PacketFilter @@ -1108,10 +1069,7 @@ class TC_GAME_API WorldSession m_timeOutTime -= int32(diff); } - void ResetTimeOutTime() - { - m_timeOutTime = int32(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME)); - } + void ResetTimeOutTime(); bool IsConnectionIdle() const { @@ -1516,12 +1474,9 @@ class TC_GAME_API WorldSession void HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet); void HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet); - - template<void(Channel::*CommandFunction)(Player const*)> - void HandleChannelCommand(WorldPackets::Channel::ChannelPlayerCommand& packet); - - template<void(Channel::*CommandFunction)(Player const*, std::string const&)> + void HandleChannelCommand(WorldPackets::Channel::ChannelCommand& packet); void HandleChannelPlayerCommand(WorldPackets::Channel::ChannelPlayerCommand& packet); + void HandleChannelPassword(WorldPackets::Channel::ChannelPassword& channelPassword); void HandleCompleteCinematic(WorldPackets::Misc::CompleteCinematic& packet); void HandleNextCinematicCamera(WorldPackets::Misc::NextCinematicCamera& packet); @@ -1787,7 +1742,7 @@ class TC_GAME_API WorldSession { friend class World; public: - DosProtection(WorldSession* s) : Session(s), _policy((Policy)sWorld->getIntConfig(CONFIG_PACKET_SPOOF_POLICY)) { } + DosProtection(WorldSession* s); bool EvaluateOpcode(WorldPacket& p, time_t time) const; protected: enum Policy diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 8069220d270..1b0d7b7174a 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -19,19 +19,20 @@ #include "WorldSocket.h" #include "AuthenticationPackets.h" #include "BattlenetRpcErrorCodes.h" -#include "BigNumber.h" #include "CharacterPackets.h" +#include "DatabaseEnv.h" +#include "Errors.h" #include "HmacHash.h" -#include "Opcodes.h" #include "PacketLog.h" -#include "QueryCallback.h" +#include "Realm.h" +#include "RBAC.h" #include "ScriptMgr.h" #include "SessionKeyGeneration.h" #include "SHA256.h" #include "World.h" - +#include "WorldPacket.h" +#include "WorldSession.h" #include <zlib.h> -#include <memory> #pragma pack(push, 1) @@ -42,6 +43,8 @@ struct CompressedWorldPacket uint32 CompressedAdler; }; +#pragma pack(pop) + class EncryptablePacket : public WorldPacket { public: @@ -53,8 +56,6 @@ private: bool _encrypt; }; -#pragma pack(pop) - using boost::asio::ip::tcp; std::string const WorldSocket::ServerConnectionInitialize("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT"); @@ -995,3 +996,8 @@ bool WorldSocket::HandlePing(WorldPackets::Auth::Ping& ping) SendPacketAndLogOpcode(*WorldPackets::Auth::Pong(ping.Serial).Write()); return true; } + +bool PacketHeader::IsValidOpcode() +{ + return Command < NUM_OPCODE_HANDLERS; +} diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 337ef055e2a..57a1f05142b 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -20,19 +20,23 @@ #define __WORLDSOCKET_H__ #include "Common.h" +#include "BigNumber.h" +#include "DatabaseEnvFwd.h" +#include "MessageBuffer.h" #include "QueryCallbackProcessor.h" -#include "WorldPacketCrypt.h" #include "Socket.h" -#include "Util.h" -#include "WorldPacket.h" -#include "WorldSession.h" +#include "WorldPacketCrypt.h" #include "MPSCQueue.h" #include <chrono> -#include <boost/asio/ip/tcp.hpp> +#include <functional> +#include <mutex> -using boost::asio::ip::tcp; -struct z_stream_s; +typedef struct z_stream_s z_stream; class EncryptablePacket; +class WorldPacket; +class WorldSession; +enum ConnectionType : int8; +enum OpcodeClient : uint32; namespace WorldPackets { @@ -54,7 +58,7 @@ struct PacketHeader uint16 Command; bool IsValidSize() { return Size < 0x10000; } - bool IsValidOpcode() { return Command < NUM_OPCODE_HANDLERS; } + bool IsValidOpcode(); }; #pragma pack(pop) @@ -72,7 +76,7 @@ class TC_GAME_API WorldSocket : public Socket<WorldSocket> typedef Socket<WorldSocket> BaseSocket; public: - WorldSocket(tcp::socket&& socket); + WorldSocket(boost::asio::ip::tcp::socket&& socket); ~WorldSocket(); WorldSocket(WorldSocket const& right) = delete; @@ -145,7 +149,7 @@ private: MPSCQueue<EncryptablePacket> _bufferQueue; std::size_t _sendBufferSize; - z_stream_s* _compressionStream; + z_stream* _compressionStream; QueryCallbackProcessor _queryProcessor; std::string _ipCountry; diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp index 42f34245adc..1fda984f969 100644 --- a/src/server/game/Server/WorldSocketMgr.cpp +++ b/src/server/game/Server/WorldSocketMgr.cpp @@ -16,12 +16,12 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "WorldSocketMgr.h" #include "Config.h" #include "NetworkThread.h" #include "ScriptMgr.h" #include "WorldSocket.h" -#include "WorldSocketMgr.h" - +#include "World.h" #include <boost/system/error_code.hpp> static void OnSocketAccept(tcp::socket&& sock, uint32 threadIndex) |
