aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorGolrag <buderus@hotmail.be>2014-12-28 16:01:53 +0000
committerNayd <dnpd.dd@gmail.com>2014-12-28 16:01:53 +0000
commit8fec200670e89003773b9bea4e0e90b3b5c3028c (patch)
treeda83973df96dfdf4fdf90d152d154d6888e94c42 /src/server/game/Server
parent62b2ccca13e3e00ca68b4299d0e980b884ddf07d (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.cpp28
-rw-r--r--src/server/game/Server/Packets/GameObjectPackets.h51
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp41
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h36
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp11
-rw-r--r--src/server/game/Server/WorldSession.h13
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