aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorIntel <chemicstry@gmail.com>2014-11-14 01:55:29 +0000
committerNayd <dnpd.dd@gmail.com>2014-11-14 01:55:29 +0000
commitb08b54c8bba4644253bbc89559a36f4e8e8bfc88 (patch)
tree6d5baed640850be255a3612149ec97fe259ed17a /src/server/game/Server
parent231207970bf9c28971def453d2622aa17fe36b43 (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.cpp88
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h73
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp5
-rw-r--r--src/server/game/Server/WorldSession.h7
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);