diff options
Diffstat (limited to 'src')
-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 |