Core/NetworkIO: updated CMSG_GUILD_QUERY and SMSG_GUILD_QUERY_RESPONSE

This commit is contained in:
joschiwald
2014-11-06 22:41:44 +01:00
parent b61e4feea5
commit eba9903265
7 changed files with 193 additions and 55 deletions

View File

@@ -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);
}
response.Info.value.Name = m_name;
m_emblemInfo.WritePacket(data);
data << uint32(_GetRanksSize()); // Number of ranks used
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);
}
}

View File

@@ -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);

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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__

View File

@@ -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);

View File

@@ -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);