aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Guilds/Guild.cpp
diff options
context:
space:
mode:
authoraquadeus <efectokoleos13@gmail.com>2022-01-09 22:27:20 +0100
committerShauren <shauren.trinity@gmail.com>2022-01-09 23:12:00 +0100
commit9dc11391c570ebc75a580aceed0c7eeaa1dedcf0 (patch)
tree6c5035b128487f6b30d820f3d3715827ef4f7f2e /src/server/game/Guilds/Guild.cpp
parent0d3235f56969a6e414071edbb669ac63b4398958 (diff)
Core/Guilds: Implemented reordering guild ranks
Diffstat (limited to 'src/server/game/Guilds/Guild.cpp')
-rw-r--r--src/server/game/Guilds/Guild.cpp40
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