diff options
| author | Golrag <buderus@hotmail.be> | 2014-12-28 16:01:53 +0000 |
|---|---|---|
| committer | Nayd <dnpd.dd@gmail.com> | 2014-12-28 16:01:53 +0000 |
| commit | 8fec200670e89003773b9bea4e0e90b3b5c3028c (patch) | |
| tree | da83973df96dfdf4fdf90d152d154d6888e94c42 /src/server/game/Server | |
| parent | 62b2ccca13e3e00ca68b4299d0e980b884ddf07d (diff) | |
Core/Opcodes:
Added Structure for:
* CMSG_GAMEOBJECT_QUERY
* CMSG_GAMEOBJ_REPORT_USE
* CMSG_GAMEOBJ_USE
* SMSG_GAMEOBJECT_QUERY_RESPONSE
Closes #13791
Diffstat (limited to 'src/server/game/Server')
| -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 |
6 files changed, 172 insertions, 8 deletions
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 |
