Core/Guilds: Implemented reordering guild ranks

This commit is contained in:
aquadeus
2022-01-09 22:27:20 +01:00
committed by Shauren
parent 0d3235f569
commit 9dc11391c5
5 changed files with 52 additions and 1 deletions

View File

@@ -1994,6 +1994,46 @@ void Guild::HandleRemoveRank(WorldSession* session, GuildRankOrder rankOrder)
BroadcastPacket(eventPacket.Write());
}
void Guild::HandleShiftRank(WorldSession* session, GuildRankOrder rankOrder, bool shiftUp)
{
// Only leader can modify ranks
if (!_IsLeader(session->GetPlayer()))
return;
GuildRankOrder otherRankOrder = GuildRankOrder(AsUnderlyingType(rankOrder) + (shiftUp ? -1 : 1));
RankInfo* rankInfo = GetRankInfo(rankOrder);
RankInfo* otherRankInfo = GetRankInfo(otherRankOrder);
if (!rankInfo || !otherRankInfo)
return;
// can't shift guild master rank (rank id = 0) - there's already a client-side limitation for it so that's just a safe-guard
if (rankInfo->GetId() == GuildRankId::GuildMaster || otherRankInfo->GetId() == GuildRankId::GuildMaster)
return;
rankInfo->SetOrder(otherRankOrder);
otherRankInfo->SetOrder(rankOrder);
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_RANK_ORDER);
stmt->setUInt8(0, AsUnderlyingType(rankInfo->GetOrder()));
stmt->setUInt8(1, AsUnderlyingType(rankInfo->GetId()));
stmt->setUInt64(2, m_id);
trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_RANK_ORDER);
stmt->setUInt8(0, AsUnderlyingType(otherRankInfo->GetOrder()));
stmt->setUInt8(1, AsUnderlyingType(otherRankInfo->GetId()));
stmt->setUInt64(2, m_id);
trans->Append(stmt);
CharacterDatabase.CommitTransaction(trans);
// force client to re-request SMSG_GUILD_RANKS
BroadcastPacket(WorldPackets::Guild::GuildEventRanksUpdated().Write());
}
void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow /*=false*/)
{
// guild bank cannot have more than MAX_MONEY_AMOUNT

View File

@@ -755,6 +755,7 @@ class TC_GAME_API Guild
void HandleSetMemberRank(WorldSession* session, ObjectGuid guid, ObjectGuid setterGuid, GuildRankOrder rank);
void HandleAddNewRank(WorldSession* session, std::string const& name);
void HandleRemoveRank(WorldSession* session, GuildRankOrder rankOrder);
void HandleShiftRank(WorldSession* session, GuildRankOrder rankOrder, bool shiftUp);
void HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow = false);
bool HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool repair = false);
void HandleMemberLogout(WorldSession* session);

View File

@@ -166,6 +166,14 @@ void WorldSession::HandleGuildDeleteRank(WorldPackets::Guild::GuildDeleteRank& p
guild->HandleRemoveRank(this, GuildRankOrder(packet.RankOrder));
}
void WorldSession::HandleGuildShiftRank(WorldPackets::Guild::GuildShiftRank& shiftRank)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_SHIFT_RANK [%s]: RankOrder: %u, ShiftUp: %s", GetPlayerInfo().c_str(), shiftRank.RankOrder, shiftRank.ShiftUp ? "true" : "false");
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleShiftRank(this, GuildRankOrder(shiftRank.RankOrder), shiftRank.ShiftUp);
}
void WorldSession::HandleGuildUpdateInfoText(WorldPackets::Guild::GuildUpdateInfoText& packet)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_UPDATE_INFO_TEXT [%s]: %s", GetPlayerInfo().c_str(), packet.InfoText.c_str());

View File

@@ -486,7 +486,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GUILD_SET_GUILD_MASTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetGuildMaster);
DEFINE_HANDLER(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetMemberNote);
DEFINE_HANDLER(CMSG_GUILD_SET_RANK_PERMISSIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetRankPermissions);
DEFINE_HANDLER(CMSG_GUILD_SHIFT_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GUILD_SHIFT_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildShiftRank);
DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildUpdateInfoText);
DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildUpdateMotdText);
DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthAndResurrect);

View File

@@ -362,6 +362,7 @@ namespace WorldPackets
class GuildGetRanks;
class GuildAddRank;
class GuildDeleteRank;
class GuildShiftRank;
class GuildUpdateInfoText;
class GuildSetMemberNote;
class GuildEventLogQuery;
@@ -1374,6 +1375,7 @@ class TC_GAME_API WorldSession
void HandleGuildSetRankPermissions(WorldPackets::Guild::GuildSetRankPermissions& packet);
void HandleGuildAddRank(WorldPackets::Guild::GuildAddRank& packet);
void HandleGuildDeleteRank(WorldPackets::Guild::GuildDeleteRank& packet);
void HandleGuildShiftRank(WorldPackets::Guild::GuildShiftRank& shiftRank);
void HandleGuildUpdateInfoText(WorldPackets::Guild::GuildUpdateInfoText& packet);
void HandleSaveGuildEmblem(WorldPackets::Guild::SaveGuildEmblem& packet);
void HandleGuildRequestPartyState(WorldPackets::Guild::RequestGuildPartyState& packet);