aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjoschiwald <joschiwald.trinity@gmail.com>2014-11-06 22:41:44 +0100
committerjoschiwald <joschiwald.trinity@gmail.com>2014-11-06 22:41:44 +0100
commiteba9903265524e4d8008c2f9851ab74dbb422a11 (patch)
treede42139cb3f3e959de9a7bdbd48ba5ab00444656 /src
parentb61e4feea5b6e86fb5923d1ba772711139063110 (diff)
Core/NetworkIO: updated CMSG_GUILD_QUERY and SMSG_GUILD_QUERY_RESPONSE
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Guilds/Guild.cpp59
-rw-r--r--src/server/game/Guilds/Guild.h3
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp23
-rw-r--r--src/server/game/Server/Packets/GuildPackets.cpp67
-rw-r--r--src/server/game/Server/Packets/GuildPackets.h84
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp5
-rw-r--r--src/server/game/Server/WorldSession.h7
7 files changed, 193 insertions, 55 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 125239dd539..2df22b0f9e2 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -24,6 +24,7 @@
#include "Guild.h"
#include "GuildFinderMgr.h"
#include "GuildMgr.h"
+#include "GuildPackets.h"
#include "Language.h"
#include "Log.h"
#include "ScriptMgr.h"
@@ -810,15 +811,6 @@ void EmblemInfo::LoadFromDB(Field* fields)
m_backgroundColor = fields[7].GetUInt8();
}
-void EmblemInfo::WritePacket(WorldPacket& data) const
-{
- data << uint32(m_style);
- data << uint32(m_color);
- data << uint32(m_borderStyle);
- data << uint32(m_borderColor);
- data << uint32(m_backgroundColor);
-}
-
void EmblemInfo::SaveToDB(ObjectGuid::LowType guildId) const
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_EMBLEM_INFO);
@@ -1483,44 +1475,27 @@ void Guild::HandleRoster(WorldSession* session)
session->SendPacket(&data);
}
-void Guild::HandleQuery(WorldSession* session)
+void Guild::SendQueryResponse(WorldSession* session)
{
- WorldPacket data(SMSG_GUILD_QUERY_RESPONSE, 8 * 32 + 200); // Guess size
+ WorldPackets::Guild::GuildQueryResponse response;
+ response.GuildGuid = GetGUID();
+ response.Info.HasValue = true;
- data << GetGUID();
- data << m_name;
+ response.Info.value.GuildGuid = GetGUID();
+ response.Info.value.VirtualRealmAddress = realmHandle.Index;
- // Rank name
- for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i) // Always show 10 ranks
- {
- if (i < _GetRanksSize())
- data << m_ranks[i].GetName();
- else
- data << uint8(0); // Empty string
- }
+ response.Info.value.EmblemStyle = m_emblemInfo.GetStyle();
+ response.Info.value.EmblemColor = m_emblemInfo.GetColor();
+ response.Info.value.BorderStyle = m_emblemInfo.GetBorderStyle();
+ response.Info.value.BorderColor = m_emblemInfo.GetBorderColor();
+ response.Info.value.BackgroundColor = m_emblemInfo.GetBackgroundColor();
- // Rank order of creation
- for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i)
- {
- if (i < _GetRanksSize())
- data << uint32(i);
- else
- data << uint32(0);
- }
+ for (uint8 i = 0; i < _GetRanksSize(); ++i)
+ response.Info.value.Ranks.emplace(m_ranks[i].GetId(), i, m_ranks[i].GetName());
- // Rank order of "importance" (sorting by rights)
- for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i)
- {
- if (i < _GetRanksSize())
- data << uint32(m_ranks[i].GetId());
- else
- data << uint32(0);
- }
-
- m_emblemInfo.WritePacket(data);
- data << uint32(_GetRanksSize()); // Number of ranks used
+ response.Info.value.Name = m_name;
- session->SendPacket(&data);
+ session->SendPacket(response.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [%s]", session->GetPlayerInfo().c_str());
}
@@ -1645,7 +1620,7 @@ void Guild::HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo)
SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved."
- HandleQuery(session);
+ SendQueryResponse(session);
}
}
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index 1481ec3b042..4abeb282b0c 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -285,7 +285,6 @@ public:
void LoadFromDB(Field* fields);
void SaveToDB(ObjectGuid::LowType guildId) const;
void ReadPacket(WorldPacket& recv);
- void WritePacket(WorldPacket& data) const;
uint32 GetStyle() const { return m_style; }
uint32 GetColor() const { return m_color; }
@@ -790,7 +789,7 @@ public:
// Handle client commands
void HandleRoster(WorldSession* session);
- void HandleQuery(WorldSession* session);
+ void SendQueryResponse(WorldSession* session);
void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds);
void HandleSetMOTD(WorldSession* session, std::string const& motd);
void HandleSetInfo(WorldSession* session, std::string const& info);
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index dcae8bc35fa..9370dd726ba 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -27,18 +27,25 @@
#include "Guild.h"
#include "GossipDef.h"
#include "SocialMgr.h"
+#include "GuildPackets.h"
-void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildQueryOpcode(WorldPackets::Guild::GuildQuery& query)
{
- ObjectGuid guildGuid, playerGuid;
- recvPacket >> guildGuid >> playerGuid;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_QUERY [%s]: Guild: %s Target: %s",
- GetPlayerInfo().c_str(), guildGuid.ToString().c_str(), playerGuid.ToString().c_str());
+ GetPlayerInfo().c_str(), query.GuildGuid.ToString().c_str(), query.PlayerGuid.ToString().c_str());
- if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid))
- if (guild->IsMember(playerGuid))
- guild->HandleQuery(this);
+ if (Guild* guild = sGuildMgr->GetGuildByGuid(query.GuildGuid))
+ if (guild->IsMember(query.PlayerGuid))
+ {
+ guild->SendQueryResponse(this);
+ return;
+ }
+
+ WorldPackets::Guild::GuildQueryResponse response;
+ response.GuildGuid = query.GuildGuid;
+ SendPacket(response.Write());
+
+ TC_LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [%s]", GetPlayerInfo().c_str());
}
void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp
new file mode 100644
index 00000000000..f3bba39ac08
--- /dev/null
+++ b/src/server/game/Server/Packets/GuildPackets.cpp
@@ -0,0 +1,67 @@
+/*
+ * 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 "GuildPackets.h"
+#include "ObjectGuid.h"
+
+WorldPackets::Guild::GuildQuery::GuildQuery(WorldPacket&& packet)
+ : ClientPacket(std::move(packet))
+{
+ ASSERT(_worldPacket.GetOpcode() == CMSG_GUILD_QUERY);
+}
+
+void WorldPackets::Guild::GuildQuery::Read()
+{
+ _worldPacket >> GuildGuid;
+ _worldPacket >> PlayerGuid;
+}
+
+WorldPackets::Guild::GuildQueryResponse::GuildQueryResponse()
+ : ServerPacket(SMSG_GUILD_QUERY_RESPONSE) { }
+
+WorldPacket const* WorldPackets::Guild::GuildQueryResponse::Write()
+{
+ _worldPacket << GuildGuid;
+ _worldPacket.WriteBit(Info.HasValue);
+
+ if (Info.HasValue)
+ {
+ _worldPacket << Info.value.GuildGuid;
+ _worldPacket << uint32(Info.value.VirtualRealmAddress);
+ _worldPacket << uint32(Info.value.Ranks.size());
+ _worldPacket << uint32(Info.value.EmblemStyle);
+ _worldPacket << uint32(Info.value.EmblemColor);
+ _worldPacket << uint32(Info.value.BorderStyle);
+ _worldPacket << uint32(Info.value.BorderColor);
+ _worldPacket << uint32(Info.value.BackgroundColor);
+
+ for (GuildInfo::RankInfo const& rank : Info.value.Ranks)
+ {
+ _worldPacket << uint32(rank.Id);
+ _worldPacket << uint32(rank.Order);
+
+ _worldPacket.WriteBits(rank.Name.size(), 7);
+ _worldPacket << rank.Name;
+ }
+
+ _worldPacket.WriteBits(Info.value.Name.size(), 7);
+ _worldPacket << Info.value.Name;
+ }
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h
new file mode 100644
index 00000000000..7b537e0a1db
--- /dev/null
+++ b/src/server/game/Server/Packets/GuildPackets.h
@@ -0,0 +1,84 @@
+/*
+ * 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 GuildPackets_h__
+#define GuildPackets_h__
+
+#include "Packet.h"
+
+class ObjectGuid;
+
+namespace WorldPackets
+{
+ namespace Guild
+ {
+ class GuildQuery final : public ClientPacket
+ {
+ public:
+ GuildQuery(WorldPacket&& packet);
+
+ void Read() override;
+
+ ObjectGuid GuildGuid;
+ ObjectGuid PlayerGuid;
+ };
+
+ class GuildQueryResponse final : public ServerPacket
+ {
+ public:
+ struct GuildInfo
+ {
+ ObjectGuid GuildGuid;
+
+ uint32 VirtualRealmAddress = 0;
+ uint32 EmblemStyle = 0;
+ uint32 EmblemColor = 0;
+ uint32 BorderStyle = 0;
+ uint32 BorderColor = 0;
+ uint32 BackgroundColor = 0;
+
+ struct RankInfo
+ {
+ RankInfo(uint32 id, uint32 order, std::string const& name)
+ : Id(id), Order(order), Name(name) { }
+
+ uint32 Id;
+ uint32 Order;
+ std::string Name;
+
+ bool operator<(RankInfo const& right) const
+ {
+ return Id < right.Id;
+ }
+ };
+
+ std::set<RankInfo> Ranks;
+
+ std::string Name;
+ };
+
+ GuildQueryResponse();
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid GuildGuid;
+ Optional<GuildInfo> Info;
+ };
+ }
+}
+
+#endif // GuildPackets_h__
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index c47b73b79eb..c77f1015372 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -19,6 +19,7 @@
#include "Opcodes.h"
#include "WorldSession.h"
#include "Packets/CharacterPackets.h"
+#include "Packets/GuildPackets.h"
template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)>
class PacketHandler : public OpcodeHandler
@@ -320,7 +321,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGuildNewsUpdateStickyOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_PERMISSIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildPermissions );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_PROMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildPromoteOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryOpcode );
+ DEFINE_HANDLER(CMSG_GUILD_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildQuery, &WorldSession::HandleGuildQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_NEWS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGuildQueryNewsOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_RANKS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryRanksOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REMOVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRemoveOpcode );
@@ -941,7 +942,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_QUERY_RESPONSE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_QUERY_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANK, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RECIPES, STATUS_UNHANDLED);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 600936004d7..53f6b8a8556 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -88,6 +88,11 @@ namespace WorldPackets
class UndeleteCharacter;
class PlayerLogin;
}
+
+ namespace Guild
+ {
+ class GuildQuery;
+ }
}
enum AccountDataType
@@ -608,7 +613,7 @@ class WorldSession
void HandleOfferPetitionOpcode(WorldPacket& recvData);
void HandleTurnInPetitionOpcode(WorldPacket& recvData);
- void HandleGuildQueryOpcode(WorldPacket& recvPacket);
+ void HandleGuildQueryOpcode(WorldPackets::Guild::GuildQuery& query);
void HandleGuildInviteOpcode(WorldPacket& recvPacket);
void HandleGuildRemoveOpcode(WorldPacket& recvPacket);
void HandleGuildAcceptOpcode(WorldPacket& recvPacket);