aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent0d3235f56969a6e414071edbb669ac63b4398958 (diff)
Core/Guilds: Implemented reordering guild ranks
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Guilds/Guild.cpp40
-rw-r--r--src/server/game/Guilds/Guild.h1
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp8
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h2
5 files changed, 52 insertions, 1 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);
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index 310dad71208..1e4cf28ed9e 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -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());
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index d9cf29b345c..1927ccc5bc2 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -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);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index ccb140a7905..1d63ec49e85 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -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);