diff options
author | aquadeus <efectokoleos13@gmail.com> | 2022-01-09 22:27:20 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-01-09 23:12:00 +0100 |
commit | 9dc11391c570ebc75a580aceed0c7eeaa1dedcf0 (patch) | |
tree | 6c5035b128487f6b30d820f3d3715827ef4f7f2e /src/server/game/Guilds/Guild.cpp | |
parent | 0d3235f56969a6e414071edbb669ac63b4398958 (diff) |
Core/Guilds: Implemented reordering guild ranks
Diffstat (limited to 'src/server/game/Guilds/Guild.cpp')
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index c8dcbd9f2c2..0ee48109d8f 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -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 |