diff options
author | joschiwald <joschiwald.trinity@gmail.com> | 2014-11-06 22:41:44 +0100 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2014-11-06 22:41:44 +0100 |
commit | eba9903265524e4d8008c2f9851ab74dbb422a11 (patch) | |
tree | de42139cb3f3e959de9a7bdbd48ba5ab00444656 /src | |
parent | b61e4feea5b6e86fb5923d1ba772711139063110 (diff) |
Core/NetworkIO: updated CMSG_GUILD_QUERY and SMSG_GUILD_QUERY_RESPONSE
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 59 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 3 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GuildPackets.cpp | 67 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GuildPackets.h | 84 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 7 |
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); |