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 | |
| parent | 0d3235f56969a6e414071edbb669ac63b4398958 (diff) | |
Core/Guilds: Implemented reordering guild ranks
Diffstat (limited to 'src/server/game/Guilds')
| -rw-r--r-- | src/server/game/Guilds/Guild.cpp | 40 | ||||
| -rw-r--r-- | src/server/game/Guilds/Guild.h | 1 |
2 files changed, 41 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 diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 92a6cff2016..c9180e7c36d 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -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); |
