mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/NetworkIO: updated CMSG_GUILD_QUERY and SMSG_GUILD_QUERY_RESPONSE
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
67
src/server/game/Server/Packets/GuildPackets.cpp
Normal file
67
src/server/game/Server/Packets/GuildPackets.cpp
Normal 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;
|
||||
}
|
||||
84
src/server/game/Server/Packets/GuildPackets.h
Normal file
84
src/server/game/Server/Packets/GuildPackets.h
Normal 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__
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user