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 | |
parent | 0d3235f56969a6e414071edbb669ac63b4398958 (diff) |
Core/Guilds: Implemented reordering guild ranks
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 40 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
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); |