aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Guilds/Guild.cpp
diff options
context:
space:
mode:
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