diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 77 | ||||
| -rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 22 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/GameObjectPackets.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/GameObjectPackets.h | 51 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 41 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 36 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 13 | 
8 files changed, 205 insertions, 74 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 4beddd757da..6cd8acf08dd 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -132,60 +132,39 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe  }  /// Only _static_ data is sent in this packet !!! -void WorldSession::HandleGameObjectQueryOpcode(WorldPacket& recvData) +void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObject& packet)  { -    uint32 entry; -    recvData >> entry; -    ObjectGuid guid; -    recvData >> guid; +    WorldPackets::Query::QueryGameObjectResponse response; +    GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(packet.Entry); -    const GameObjectTemplate* info = sObjectMgr->GetGameObjectTemplate(entry); -    if (info) -    { -        std::string Name; -        std::string IconName; -        std::string CastBarCaption; - -        Name = info->name; -        IconName = info->IconName; -        CastBarCaption = info->castBarCaption; +    response.Entry = packet.Entry; -        int loc_idx = GetSessionDbLocaleIndex(); -        if (loc_idx >= 0) -        { -            if (GameObjectLocale const* gl = sObjectMgr->GetGameObjectLocale(entry)) -            { -                ObjectMgr::GetLocaleString(gl->Name, loc_idx, Name); -                ObjectMgr::GetLocaleString(gl->CastBarCaption, loc_idx, CastBarCaption); -            } -        } -        TC_LOG_DEBUG("network", "WORLD: CMSG_GAMEOBJECT_QUERY '%s' - Entry: %u. ", info->name.c_str(), entry); -        WorldPacket data (SMSG_GAMEOBJECT_QUERY_RESPONSE, 150); -        data << uint32(entry); -        data << uint32(info->type); -        data << uint32(info->displayId); -        data << Name; -        data << uint8(0) << uint8(0) << uint8(0);           // name2, name3, name4 -        data << IconName;                                   // 2.0.3, string. Icon name to use instead of default icon for go's (ex: "Attack" makes sword) -        data << CastBarCaption;                             // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting") -        data << info->unk1;                                 // 2.0.3, string -        data.append(info->raw.data, MAX_GAMEOBJECT_DATA); -        data << float(info->size);                          // go size -        for (uint32 i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) -            data << uint32(info->questItems[i]);            // itemId[6], quest drop -        data << int32(info->unkInt32);                      // 4.x, unknown -        SendPacket(&data); -        TC_LOG_DEBUG("network", "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE"); -    } -    else +    if (gameObjectInfo)      { -        TC_LOG_DEBUG("network", "WORLD: CMSG_GAMEOBJECT_QUERY - Missing gameobject info for (%s, ENTRY: %u)", -            guid.ToString().c_str(), entry); -        WorldPacket data (SMSG_GAMEOBJECT_QUERY_RESPONSE, 4); -        data << uint32(entry | 0x80000000); -        SendPacket(&data); -        TC_LOG_DEBUG("network", "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE"); +        response.Allow = true; +        WorldPackets::Query::GameObjectStats& stats = response.Stats; + +        stats.CastBarCaption = gameObjectInfo->castBarCaption; +        stats.DisplayID = gameObjectInfo->displayId; +        stats.IconName = gameObjectInfo->IconName; +        stats.Name[0] = gameObjectInfo->name; + +        for (uint8 i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; i++) +            if (gameObjectInfo->questItems[i]) +                stats.QuestItems.push_back(gameObjectInfo->questItems[i]); +        for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; i++) +            stats.Data[i] = gameObjectInfo->raw.data[i]; + +        stats.Size = gameObjectInfo->size; +        stats.Type = gameObjectInfo->type; +        stats.UnkString = gameObjectInfo->unk1; +        stats.UnkInt32 = gameObjectInfo->unkInt32; +        stats.Expansion = 0;      } +    else +        response.Allow = false; + +    SendPacket(response.Write());  }  void WorldSession::HandleCorpseQueryOpcode(WorldPacket& /*recvData*/) diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 0b468ca0b47..64373e4b674 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -36,6 +36,7 @@  #include "Player.h"  #include "Config.h"  #include "SpellPackets.h" +#include "GameObjectPackets.h"  void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets)  { @@ -284,14 +285,9 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket)          pUser->SendLoot(item->GetGUID(), LOOT_CORPSE);  } -void WorldSession::HandleGameObjectUseOpcode(WorldPacket& recvData) +void WorldSession::HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjectUse& packet)  { -    ObjectGuid guid; -    recvData >> guid; - -    TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_GAMEOBJ_USE Message [%s]", guid.ToString().c_str()); - -    if (GameObject* obj = GetPlayer()->GetMap()->GetGameObject(guid)) +    if (GameObject* obj = GetPlayer()->GetMap()->GetGameObject(packet.Guid))      {          if (!obj->IsWithinDistInMap(GetPlayer(), obj->GetInteractionDistance()))              return; @@ -305,18 +301,13 @@ void WorldSession::HandleGameObjectUseOpcode(WorldPacket& recvData)      }  } -void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket) +void WorldSession::HandleGameobjectReportUse(WorldPackets::GameObject::GameObjectReportUse& packet)  { -    ObjectGuid guid; -    recvPacket >> guid; - -    TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_GAMEOBJ_REPORT_USE Message [%s]", guid.ToString().c_str()); -      // ignore for remote control state      if (_player->m_mover != _player)          return; -    GameObject* go = GetPlayer()->GetMap()->GetGameObject(guid); +    GameObject* go = GetPlayer()->GetMap()->GetGameObject(packet.Guid);      if (!go)          return; @@ -331,9 +322,6 @@ void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket)  void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::SpellCastRequest& castRequest)  { - -    TC_LOG_DEBUG("network", "WORLD: got cast spell packet, castCount: %u, spellId: %u, castFlags: %u", castRequest.CastID, castRequest.SpellID, castRequest.SendCastFlags); -      // ignore for remote control state (for player case)      Unit* mover = _player->m_mover;      if (mover != _player && mover->GetTypeId() == TYPEID_PLAYER) diff --git a/src/server/game/Server/Packets/GameObjectPackets.cpp b/src/server/game/Server/Packets/GameObjectPackets.cpp new file mode 100644 index 00000000000..21e8305eb5e --- /dev/null +++ b/src/server/game/Server/Packets/GameObjectPackets.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2008-2014 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 "GameObjectPackets.h" + +void WorldPackets::GameObject::GameObjectUse::Read() +{ +    _worldPacket >> Guid; +} + +void WorldPackets::GameObject::GameObjectReportUse::Read() +{ +    _worldPacket >> Guid; +} diff --git a/src/server/game/Server/Packets/GameObjectPackets.h b/src/server/game/Server/Packets/GameObjectPackets.h new file mode 100644 index 00000000000..76b3478844b --- /dev/null +++ b/src/server/game/Server/Packets/GameObjectPackets.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2008-2014 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 GOPackets_h__ +#define GOPackets_h__ + +#include "Packet.h" +#include "DB2Stores.h" +#include "GameObject.h" +#include "WorldSession.h" + +namespace WorldPackets +{ +    namespace GameObject +    { +        class GameObjectUse final : public ClientPacket +        { +        public: +            GameObjectUse(WorldPacket&& packet) : ClientPacket(CMSG_GAMEOBJ_USE, std::move(packet)) { } + +            void Read() override; + +            ObjectGuid Guid; +        }; + +        class GameObjectReportUse final : public ClientPacket +        { +        public: +            GameObjectReportUse(WorldPacket&& packet) : ClientPacket(CMSG_GAMEOBJ_REPORT_USE, std::move(packet)) { } + +            void Read() override; + +            ObjectGuid Guid; +        }; +    } +} +#endif // GOPackets_h__ diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index f100013d7a4..84792b3c21e 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -221,3 +221,44 @@ WorldPacket const* WorldPackets::Query::HotfixNotifyBlob::Write()      return &_worldPacket;  } + +void WorldPackets::Query::QueryGameObject::Read() +{ +    _worldPacket >> Entry; +    _worldPacket >> Guid; +} + +WorldPacket const* WorldPackets::Query::QueryGameObjectResponse::Write() +{ +    _worldPacket << Entry; +    _worldPacket.WriteBit(Allow); + +    if (Allow) +    { +        _worldPacket << Stats.UnkInt32; +        if (Stats.UnkInt32 == 0) +            return &_worldPacket; + +        _worldPacket << Stats.Type; +        _worldPacket << Stats.DisplayID; +        for (int8 i = 0; i < 4; i++) +            _worldPacket << Stats.Name[i]; + +        _worldPacket << Stats.IconName; +        _worldPacket << Stats.CastBarCaption; +        _worldPacket << Stats.UnkString; + +        for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; i++) +            _worldPacket << Stats.Data[i]; + +        _worldPacket << Stats.Size; + +        _worldPacket << uint8(Stats.QuestItems.size()); +        for (int32 questItem : Stats.QuestItems) +            _worldPacket << questItem; + +        _worldPacket << Stats.Expansion; +    } + +    return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 4581c20c6e5..749ff1343a2 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -210,6 +210,42 @@ namespace WorldPackets              HotfixData const* Hotfixes = nullptr;          }; + +        class QueryGameObject final : public ClientPacket +        { +        public: +            QueryGameObject(WorldPacket&& packet) : ClientPacket(CMSG_GAMEOBJECT_QUERY, std::move(packet)) { } + +            void Read() override; +            uint32 Entry = 0; +            ObjectGuid Guid; +        }; + +        struct GameObjectStats +        { +            std::string Name[4]; +            std::string IconName; +            std::string CastBarCaption; +            std::string UnkString; +            int32 UnkInt32 = 0; +            uint32 Type = 0; +            uint32 DisplayID = 0; +            uint32 Data[MAX_GAMEOBJECT_DATA]; +            float Size = 0.0f; +            std::vector<int32> QuestItems; +            uint32 Expansion = 0; +        }; + +        class QueryGameObjectResponse final : public ServerPacket +        { +        public: +            QueryGameObjectResponse() : ServerPacket(SMSG_GAMEOBJECT_QUERY_RESPONSE, 165) { } // Guess size + +            WorldPacket const* Write() override; +            uint32 Entry = 0; +            bool Allow = false; +            GameObjectStats Stats; +        };      }  } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 603e55ff738..1cca6672086 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -33,6 +33,7 @@  #include "Packets/TalentPackets.h"  #include "Packets/TradePackets.h"  #include "Packets/ItemPackets.h" +#include "Packets/GameObjectPackets.h"  template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)>  class PacketHandler : public ClientOpcodeHandler @@ -299,10 +300,10 @@ void OpcodeTable::Initialize()      DEFINE_OPCODE_HANDLER_OLD(CMSG_FAR_SIGHT,                               STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleFarSightOpcode            );      DEFINE_OPCODE_HANDLER_OLD(CMSG_FORCE_MOVE_ROOT_ACK,                     STATUS_UNHANDLED, PROCESS_THREADSAFE,   &WorldSession::HandleMoveRootAck               );      DEFINE_OPCODE_HANDLER_OLD(CMSG_FORCE_MOVE_UNROOT_ACK,                   STATUS_UNHANDLED, PROCESS_THREADSAFE,   &WorldSession::HandleMoveUnRootAck             ); -    DEFINE_OPCODE_HANDLER_OLD(CMSG_GAMEOBJECT_QUERY,                        STATUS_UNHANDLED, PROCESS_INPLACE,      &WorldSession::HandleGameObjectQueryOpcode     ); -    DEFINE_OPCODE_HANDLER_OLD(CMSG_GAMEOBJ_REPORT_USE,                      STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGameobjectReportUse       ); -    DEFINE_OPCODE_HANDLER_OLD(CMSG_GAMEOBJ_USE,                             STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGameObjectUseOpcode       ); -    DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MAIL_LIST,                           STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGetMailList               ); +    DEFINE_HANDLER(CMSG_GAMEOBJECT_QUERY,                                   STATUS_LOGGEDIN,  PROCESS_INPLACE,      WorldPackets::Query::QueryGameObject, &WorldSession::HandleGameObjectQueryOpcode); +    DEFINE_HANDLER(CMSG_GAMEOBJ_REPORT_USE,                                 STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjectReportUse, &WorldSession::HandleGameobjectReportUse); +    DEFINE_HANDLER(CMSG_GAMEOBJ_USE,                                        STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjectUse, &WorldSession::HandleGameObjectUseOpcode); +    DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MAIL_LIST,                           STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGetMailList);      DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MIRRORIMAGE_DATA,                    STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest    );      DEFINE_OPCODE_HANDLER_OLD(CMSG_GMRESPONSE_RESOLVE,                      STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMResponseResolve         );      DEFINE_OPCODE_HANDLER_OLD(CMSG_GMSURVEY_SUBMIT,                         STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMSurveySubmit            ); @@ -927,7 +928,7 @@ void OpcodeTable::Initialize()      DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM,                 STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN,                      STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_PAGETEXT,                     STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); -    DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_QUERY_RESPONSE,               STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_QUERY_RESPONSE,               STATUS_LOGGEDIN,     CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_RESET_STATE,                  STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMESPEED_SET,                           STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_SET,                            STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 52f1c76555a..5a4a3465474 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -182,6 +182,7 @@ namespace WorldPackets          class QueryPageText;          class QueryNPCText;          class DBQueryBulk; +        class QueryGameObject;      }      namespace Quest @@ -198,6 +199,12 @@ namespace WorldPackets          class AutoEquipItem;          class DestroyItem;      } + +    namespace GameObject +    { +        class GameObjectReportUse; +        class GameObjectUse; +    }  }  enum AccountDataType @@ -694,16 +701,16 @@ class WorldSession          void HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request);          void HandleSetActionButtonOpcode(WorldPackets::Spells::SetActionButton& packet); -        void HandleGameObjectUseOpcode(WorldPacket& recPacket); +        void HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjectUse& packet);          void HandleMeetingStoneInfo(WorldPacket& recPacket); -        void HandleGameobjectReportUse(WorldPacket& recvPacket); +        void HandleGameobjectReportUse(WorldPackets::GameObject::GameObjectReportUse& packet);          void HandleNameQueryOpcode(WorldPackets::Query::QueryPlayerName& packet);          void HandleQueryTimeOpcode(WorldPacket& recvPacket);          void HandleCreatureQuery(WorldPackets::Query::QueryCreature& packet);          void HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet); -        void HandleGameObjectQueryOpcode(WorldPacket& recvPacket); +        void HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObject& packet);          void HandleMoveWorldportAckOpcode(WorldPackets::Movement::WorldPortAck& packet);          void HandleMoveWorldportAckOpcode();                // for server-side calls  | 
