diff options
| author | Intel <chemicstry@gmail.com> | 2014-11-14 01:55:29 +0000 |
|---|---|---|
| committer | Nayd <dnpd.dd@gmail.com> | 2014-11-14 01:55:29 +0000 |
| commit | b08b54c8bba4644253bbc89559a36f4e8e8bfc88 (patch) | |
| tree | 6d5baed640850be255a3612149ec97fe259ed17a /src/server/game/Server | |
| parent | 231207970bf9c28971def453d2622aa17fe36b43 (diff) | |
Core/Packets: CMSG_CREATURE_QUERY and SMSG_CREATURE_QUERY_RESPONSE handler
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 88 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 73 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 7 |
4 files changed, 170 insertions, 3 deletions
diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp new file mode 100644 index 00000000000..23c851d36ce --- /dev/null +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -0,0 +1,88 @@ +/* + * 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 "QueryPackets.h" + +void WorldPackets::Query::QueryCreature::Read() +{ + _worldPacket >> CreatureID; +} + +WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write() +{ + _worldPacket << CreatureID; + _worldPacket.WriteBit(Allow); + + if (Allow) + { + _worldPacket.WriteBits(uint32(Stats.Title.length()+1), 11); + _worldPacket.WriteBits(uint32(Stats.TitleAlt.length()+1), 11); + _worldPacket.WriteBits(uint32(Stats.CursorName.length()+1), 6); + _worldPacket.WriteBit(Stats.Leader); + + for (uint32 i = 0; i < MAX_CREATURE_NAMES; ++i) + { + _worldPacket.WriteBits(uint32(Stats.Name[i].length()+1), 11); + _worldPacket.WriteBits(uint32(Stats.NameAlt[i].length()+1), 11); + } + + for (uint32 i = 0; i < MAX_CREATURE_NAMES; ++i) + { + if (!Stats.Name[i].empty()) + _worldPacket << Stats.Name[i]; + if (!Stats.NameAlt[i].empty()) + _worldPacket << Stats.NameAlt[i]; + } + + _worldPacket << Stats.Flags[0]; + _worldPacket << Stats.Flags[1]; + _worldPacket << Stats.CreatureType; + _worldPacket << Stats.CreatureFamily; + _worldPacket << Stats.Classification; + + for (uint32 i = 0; i < MAX_KILL_CREDIT; ++i) + _worldPacket << Stats.ProxyCreatureID[i]; + + for (uint32 i = 0; i < MAX_CREATURE_MODELS; ++i) + _worldPacket << Stats.CreatureDisplayID[i]; + + _worldPacket << Stats.HpMulti; + _worldPacket << Stats.EnergyMulti; + + _worldPacket << int32(Stats.QuestItems.size()); + _worldPacket << Stats.CreatureMovementInfoID; + _worldPacket << Stats.RequiredExpansion; + + _worldPacket << int32(0); // FlagQuest + + if (Stats.Title.length()) + _worldPacket << Stats.Title; + + if (Stats.TitleAlt.length()) + _worldPacket << Stats.TitleAlt; + + if (Stats.CursorName.length()) + _worldPacket << Stats.CursorName; + + for (uint32 i = 0; i < Stats.QuestItems.size(); ++i) + _worldPacket << Stats.QuestItems[i]; + } + + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h new file mode 100644 index 00000000000..49bb5847400 --- /dev/null +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -0,0 +1,73 @@ +/* +* 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 QueryPackets_h__ +#define QueryPackets_h__ + +#include "Packet.h" +#include "Creature.h" + +namespace WorldPackets +{ + namespace Query + { + class QueryCreature final : public ClientPacket + { + public: + QueryCreature(WorldPacket&& packet) : ClientPacket(CMSG_CREATURE_QUERY, std::move(packet)) { } + + void Read() override; + + uint32 CreatureID = 0; + }; + + struct CreatureStats + { + std::string Title; + std::string TitleAlt; + std::string CursorName; + int32 CreatureType = 0; + int32 CreatureFamily = 0; + int32 Classification = 0; + float HpMulti = 0.0f; + float EnergyMulti = 0.0f; + bool Leader = false; + std::vector<int32> QuestItems; + uint32 CreatureMovementInfoID = 0; + uint32 RequiredExpansion = 0; + uint32 Flags[2]; + uint32 ProxyCreatureID[MAX_KILL_CREDIT]; + uint32 CreatureDisplayID[MAX_CREATURE_MODELS]; + std::string Name[MAX_CREATURE_NAMES]; + std::string NameAlt[MAX_CREATURE_NAMES]; + }; + + class QueryCreatureResponse final : public ServerPacket + { + public: + QueryCreatureResponse() : ServerPacket(SMSG_CREATURE_QUERY_RESPONSE, 2+4+4+4+12) { } + + WorldPacket const* Write() override; + + bool Allow = false; + CreatureStats Stats; + uint32 CreatureID = 0; + }; + } +} + +#endif // QueryPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 556560c5e70..e28bf0f0bd4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -22,6 +22,7 @@ #include "Packets/GuildPackets.h" #include "Packets/TradePackets.h" #include "Packets/MiscPackets.h" +#include "Packets/QueryPackets.h" template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)> class PacketHandler : public OpcodeHandler @@ -250,7 +251,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_CONNECT_TO_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CONTACT_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleContactListOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CORPSE_MAP_POSITION_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseMapPositionQuery ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CREATURE_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleCreatureQueryOpcode ); + DEFINE_HANDLER(CMSG_CREATURE_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryCreature, &WorldSession::HandleCreatureQuery); DEFINE_OPCODE_HANDLER_OLD(CMSG_DANCE_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DB_QUERY_BULK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_FRIEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelFriendOpcode ); @@ -839,7 +840,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_NOT_IN_INSTANCE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CROSSED_INEBRIATION_THRESHOLD, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 6e863b9e580..36de09be5a2 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -110,6 +110,11 @@ namespace WorldPackets { class ViolenceLevel; } + + namespace Query + { + class QueryCreature; + } } enum AccountDataType @@ -579,7 +584,7 @@ class WorldSession void HandleQueryTimeOpcode(WorldPacket& recvPacket); - void HandleCreatureQueryOpcode(WorldPacket& recvPacket); + void HandleCreatureQuery(WorldPackets::Query::QueryCreature& packet); void HandleGameObjectQueryOpcode(WorldPacket& recvPacket); |
