/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * 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 . */ #ifndef TRINITYCORE_QUERY_PACKETS_H #define TRINITYCORE_QUERY_PACKETS_H #include "Packet.h" #include "AuthenticationPackets.h" #include "ItemPacketsCommon.h" #include "NPCHandler.h" #include "ObjectGuid.h" #include "PacketUtilities.h" #include "Position.h" #include "RaceMask.h" #include "SharedDefines.h" #include "UnitDefines.h" #include class Player; struct QuestPOIData; enum class QuestRewardContextFlags : int32; namespace WorldPackets { namespace Query { class QueryCreature final : public ClientPacket { public: explicit QueryCreature(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_CREATURE, std::move(packet)) { } void Read() override; uint32 CreatureID = 0; }; struct CreatureXDisplay { uint32 CreatureDisplayID = 0; float Scale = 1.0f; float Probability = 1.0f; }; struct CreatureDisplayStats { float TotalProbability = 0.0f; std::vector CreatureDisplay; }; struct CreatureStats { std::string Title; std::string TitleAlt; std::string CursorName; uint8 CreatureType = 0; int32 CreatureFamily = 0; int8 Classification = 0; CreatureDisplayStats Display; float HpMulti = 0.0f; float EnergyMulti = 0.0f; bool Leader = false; std::vector QuestItems; std::vector QuestCurrencies; uint32 CreatureMovementInfoID = 0; int32 HealthScalingExpansion = 0; uint32 RequiredExpansion = 0; uint32 VignetteID = 0; int32 Class = 0; int32 CreatureDifficultyID = 0; int32 WidgetSetID = 0; int32 WidgetSetUnitConditionID = 0; std::array Flags = { }; std::array ProxyCreatureID = { }; std::array Name = { }; std::array NameAlt = { }; }; class QueryCreatureResponse final : public ServerPacket { public: explicit QueryCreatureResponse() : ServerPacket(SMSG_QUERY_CREATURE_RESPONSE, 76) { } WorldPacket const* Write() override; bool Allow = false; CreatureStats Stats; uint32 CreatureID = 0; }; class QueryPlayerNames final : public ClientPacket { public: explicit QueryPlayerNames(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_PLAYER_NAMES, std::move(packet)) { } void Read() override; Array Players; }; struct PlayerGuidLookupData { bool Initialize(ObjectGuid const& guid, Player const* player = nullptr); bool IsDeleted = false; ObjectGuid AccountID; ObjectGuid BnetAccountID; ObjectGuid GuidActual; std::string Name; uint64 GuildClubMemberID = 0; // same as bgs.protocol.club.v1.MemberId.unique_id uint32 VirtualRealmAddress = 0; uint8 Race = RACE_NONE; uint8 Sex = GENDER_NONE; uint8 ClassID = CLASS_NONE; uint8 Level = 0; uint8 PvpFaction = 0; int32 TimerunningSeasonID = 0; DeclinedName DeclinedNames; }; struct GuildGuidLookupData { uint32 VirtualRealmAddress = 0; ObjectGuid Guid; std::string_view Name; }; struct HouseLookupData { ObjectGuid Guid; std::string_view Name; }; struct NameCacheLookupResult { ObjectGuid Player; uint8 Result = 0; // 0 - full packet, != 0 - only guid Optional Data; Optional GuildData; Optional HouseData; }; class QueryPlayerNamesResponse final : public ServerPacket { public: explicit QueryPlayerNamesResponse() : ServerPacket(SMSG_QUERY_PLAYER_NAMES_RESPONSE, 60) { } WorldPacket const* Write() override; std::vector Players; }; class QueryPageText final : public ClientPacket { public: explicit QueryPageText(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_PAGE_TEXT, std::move(packet)) { } void Read() override; ObjectGuid ItemGUID; uint32 PageTextID = 0; }; class QueryPageTextResponse final : public ServerPacket { public: explicit QueryPageTextResponse() : ServerPacket(SMSG_QUERY_PAGE_TEXT_RESPONSE, 15) { } WorldPacket const* Write() override; struct PageTextInfo { uint32 ID = 0; uint32 NextPageID = 0; int32 PlayerConditionID = 0; uint8 Flags = 0; std::string Text; }; uint32 PageTextID = 0; bool Allow = false; std::vector Pages; }; class QueryNPCText final : public ClientPacket { public: explicit QueryNPCText(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_NPC_TEXT, std::move(packet)) { } void Read() override; ObjectGuid Guid; uint32 TextID = 0; }; class QueryNPCTextResponse final : public ServerPacket { public: explicit QueryNPCTextResponse() : ServerPacket(SMSG_QUERY_NPC_TEXT_RESPONSE, 73) { } WorldPacket const* Write() override; uint32 TextID = 0; bool Allow = false; std::array Probabilities = { }; std::array BroadcastTextID = { }; }; class QueryGameObject final : public ClientPacket { public: explicit QueryGameObject(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_GAME_OBJECT, std::move(packet)) { } void Read() override; ObjectGuid Guid; uint32 GameObjectID = 0; }; struct GameObjectStats { std::string Name[4]; std::string IconName; std::string CastBarCaption; std::string UnkString; uint32 Type = 0; uint32 DisplayID = 0; std::array Data = { }; float Size = 0.0f; std::vector QuestItems; int32 ContentTuningId = 0; int32 RequiredLevel = 0; }; class QueryGameObjectResponse final : public ServerPacket { public: explicit QueryGameObjectResponse() : ServerPacket(SMSG_QUERY_GAME_OBJECT_RESPONSE, 165) { } WorldPacket const* Write() override; uint32 GameObjectID = 0; ObjectGuid Guid; bool Allow = false; GameObjectStats Stats; }; class QueryCorpseLocationFromClient final : public ClientPacket { public: explicit QueryCorpseLocationFromClient(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, std::move(packet)) { } void Read() override; ObjectGuid Player; }; class CorpseLocation final : public ServerPacket { public: explicit CorpseLocation() : ServerPacket(SMSG_CORPSE_LOCATION, 1 + (5 * 4) + 16) { } WorldPacket const* Write() override; ObjectGuid Player; ObjectGuid Transport; TaggedPosition<::Position::XYZ> Position; int32 ActualMapID = 0; int32 MapID = 0; bool Valid = false; }; class QueryCorpseTransport final : public ClientPacket { public: explicit QueryCorpseTransport(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_CORPSE_TRANSPORT , std::move(packet)) { } void Read() override; ObjectGuid Player; ObjectGuid Transport; }; class CorpseTransportQuery final : public ServerPacket { public: explicit CorpseTransportQuery() : ServerPacket(SMSG_CORPSE_TRANSPORT_QUERY, 16) { } WorldPacket const* Write() override; ObjectGuid Player; TaggedPosition<::Position::XYZ> Position; float Facing = 0.0f; }; class QueryTime final : public ClientPacket { public: explicit QueryTime(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_TIME, std::move(packet)) { } void Read() override { } }; class QueryTimeResponse final : public ServerPacket { public: explicit QueryTimeResponse() : ServerPacket(SMSG_QUERY_TIME_RESPONSE, 4 + 4) { } WorldPacket const* Write() override; Timestamp<> CurrentTime; }; class QuestPOIQuery final : public ClientPacket { public: explicit QuestPOIQuery(WorldPacket&& packet) : ClientPacket(CMSG_QUEST_POI_QUERY, std::move(packet)) { } void Read() override; int32 MissingQuestCount = 0; std::array MissingQuestPOIs = { }; }; class QuestPOIQueryResponse final : public ServerPacket { public: explicit QuestPOIQueryResponse() : ServerPacket(SMSG_QUEST_POI_QUERY_RESPONSE, 4 + 4) { } WorldPacket const* Write() override; std::vector QuestPOIDataStats; }; class QueryQuestCompletionNPCs final : public ClientPacket { public: explicit QueryQuestCompletionNPCs(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_QUEST_COMPLETION_NPCS, std::move(packet)) { } void Read() override; Array QuestCompletionNPCs; }; struct QuestCompletionNPC { int32 QuestID = 0; std::vector NPCs; }; class QuestCompletionNPCResponse final : public ServerPacket { public: explicit QuestCompletionNPCResponse() : ServerPacket(SMSG_QUEST_COMPLETION_NPC_RESPONSE, 4) { } WorldPacket const* Write() override; std::vector QuestCompletionNPCs; }; class QueryPetName final : public ClientPacket { public: explicit QueryPetName(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_PET_NAME, std::move(packet)) { } void Read() override; ObjectGuid UnitGUID; }; class QueryPetNameResponse final : public ServerPacket { public: explicit QueryPetNameResponse() : ServerPacket(SMSG_QUERY_PET_NAME_RESPONSE, 16 + 1) { } WorldPacket const* Write() override; ObjectGuid UnitGUID; bool Allow = false; bool HasDeclined = false; DeclinedName DeclinedNames; WorldPackets::Timestamp<> Timestamp; std::string Name; }; class ItemTextQuery final : public ClientPacket { public: explicit ItemTextQuery(WorldPacket&& packet) : ClientPacket(CMSG_ITEM_TEXT_QUERY, std::move(packet)) { } void Read() override; ObjectGuid Id; }; struct ItemTextCache { std::string Text; }; class QueryItemTextResponse final : public ServerPacket { public: explicit QueryItemTextResponse() : ServerPacket(SMSG_QUERY_ITEM_TEXT_RESPONSE) { } WorldPacket const* Write() override; ObjectGuid Id; bool Valid = false; ItemTextCache Item; }; class QueryRealmName final : public ClientPacket { public: explicit QueryRealmName(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_REALM_NAME, std::move(packet)) { } void Read() override; uint32 VirtualRealmAddress = 0; }; class RealmQueryResponse final : public ServerPacket { public: explicit RealmQueryResponse() : ServerPacket(SMSG_REALM_QUERY_RESPONSE) { } WorldPacket const* Write() override; uint32 VirtualRealmAddress = 0; uint8 LookupState = 0; WorldPackets::Auth::VirtualRealmNameInfo NameInfo; }; class QueryTreasurePicker final : public ClientPacket { public: explicit QueryTreasurePicker(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_TREASURE_PICKER, std::move(packet)) { } void Read() override; uint32 QuestID = 0; uint32 TreasurePickerID = 0; }; struct TreasurePickItem { Item::ItemInstance Item; uint32 Quantity = 0; Optional ContextFlags; }; struct TreasurePickCurrency { uint32 CurrencyID = 0; uint32 Quantity = 0; Optional ContextFlags; }; enum class TreasurePickerBonusContext : uint8 { None = 0, WarMode = 1 }; struct TreasurePickerBonus { std::vector ItemPicks; std::vector CurrencyPicks; uint64 Gold = 0; TreasurePickerBonusContext Context = TreasurePickerBonusContext::None; }; struct TreasurePickerPick { std::vector ItemPicks; std::vector CurrencyPicks; std::vector Bonuses; uint64 Gold = 0; int32 Flags = 0; bool IsChoice = false; }; class TreasurePickerResponse final : public ServerPacket { public: explicit TreasurePickerResponse() : ServerPacket(SMSG_TREASURE_PICKER_RESPONSE) { } WorldPacket const* Write() override; uint32 QuestID = 0; uint32 TreasurePickerID = 0; TreasurePickerPick Treasure; }; ByteBuffer& operator<<(ByteBuffer& data, PlayerGuidLookupData const& lookupData); } } ByteBuffer& operator<<(ByteBuffer& data, QuestPOIData const& questPOIData); #endif // TRINITYCORE_QUERY_PACKETS_H