diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 44 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 8 |
4 files changed, 28 insertions, 30 deletions
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 7c161440207..a514a35d096 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1753,8 +1753,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SendUpdateToOutOfRangeGroupMembers(); void SetInGuild(ObjectGuid::LowType guildId); - void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); } - uint8 GetRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); } + void SetGuildRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); } + uint8 GetGuildRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); } void SetGuildLevel(uint32 level) { SetUInt32Value(PLAYER_GUILDLEVEL, level); } uint32 GetGuildLevel() const { return GetUInt32Value(PLAYER_GUILDLEVEL); } void SetGuildIdInvited(ObjectGuid::LowType GuildId) { m_GuildIdInvited = GuildId; } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 431fcc7315b..cc91d056c59 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -583,8 +583,8 @@ void Guild::Member::ChangeRank(SQLTransaction& trans, uint8 newRank) m_rankId = newRank; // Update rank information in player's field, if he is online. - if (Player* player = FindPlayer()) - player->SetRank(newRank); + if (Player* player = FindConnectedPlayer()) + player->SetGuildRank(newRank); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MEMBER_RANK); stmt->setUInt8 (0, newRank); @@ -1516,12 +1516,14 @@ void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& na // Same for the new one if (Member* newGuildMaster = GetMember(name)) { - _SetLeaderGUID(newGuildMaster); + SQLTransaction trans = CharacterDatabase.BeginTransaction(); - SQLTransaction trans(nullptr); + _SetLeader(trans, newGuildMaster); oldGuildMaster->ChangeRank(trans, GR_INITIATE); SendEventNewLeader(newGuildMaster, oldGuildMaster); + + CharacterDatabase.CommitTransaction(trans); } } } @@ -2496,8 +2498,8 @@ bool Guild::Validate() // Repair the structure of the guild. // If the guildmaster doesn't exist or isn't member of the guild // attempt to promote another member. - Member* pLeader = GetMember(m_leaderGuid); - if (!pLeader) + Member* leader = GetMember(m_leaderGuid); + if (!leader) { SQLTransaction trans(nullptr); DeleteMember(trans, m_leaderGuid); @@ -2508,8 +2510,8 @@ bool Guild::Validate() return false; } } - else if (!pLeader->IsRank(GR_GUILDMASTER)) - _SetLeaderGUID(pLeader); + else if (!leader->IsRank(GR_GUILDMASTER)) + _SetLeader(trans, leader); // Check config if multiple guildmasters are allowed if (!sConfigMgr->GetBoolDefault("Guild.AllowMultipleGuildMaster", false)) @@ -2632,7 +2634,7 @@ bool Guild::AddMember(SQLTransaction& trans, ObjectGuid guid, uint8 rankId) m_members[guid] = member; player->SetInGuild(m_id); player->SetGuildIdInvited(UI64LIT(0)); - player->SetRank(rankId); + player->SetGuildRank(rankId); player->SetGuildLevel(GetLevel()); SendLoginInfo(player->GetSession()); name = player->GetName(); @@ -2712,11 +2714,7 @@ void Guild::DeleteMember(SQLTransaction& trans, ObjectGuid guid, bool isDisbandi return; } - _SetLeaderGUID(newLeader); - - // If player not online data in data field will be loaded from guild tabs no need to update it !! - if (Player* newLeaderPlayer = newLeader->FindPlayer()) - newLeaderPlayer->SetRank(GR_GUILDMASTER); + _SetLeader(trans, newLeader); // If leader does not exist (at guild loading with deleted leader) do not send broadcasts if (oldLeader) @@ -2737,7 +2735,7 @@ void Guild::DeleteMember(SQLTransaction& trans, ObjectGuid guid, bool isDisbandi if (player) { player->SetInGuild(UI64LIT(0)); - player->SetRank(0); + player->SetGuildRank(0); player->SetGuildLevel(0); for (GuildPerkSpellsEntry const* entry : sGuildPerkSpellsStore) @@ -2955,21 +2953,25 @@ bool Guild::_ModifyBankMoney(SQLTransaction& trans, uint64 amount, bool add) return true; } -void Guild::_SetLeaderGUID(Member* pLeader) +void Guild::_SetLeader(SQLTransaction& trans, Member* leader) { - if (!pLeader) + if (!leader) return; - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - m_leaderGuid = pLeader->GetGUID(); - pLeader->ChangeRank(trans, GR_GUILDMASTER); + bool isInTransaction = bool(trans); + if (!isInTransaction) + trans = CharacterDatabase.BeginTransaction(); + + m_leaderGuid = leader->GetGUID(); + leader->ChangeRank(trans, GR_GUILDMASTER); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_LEADER); stmt->setUInt64(0, m_leaderGuid.GetCounter()); stmt->setUInt64(1, m_id); trans->Append(stmt); - CharacterDatabase.CommitTransaction(trans); + if (!isInTransaction) + CharacterDatabase.CommitTransaction(trans); } void Guild::_SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index fc0699a5810..d8684ebd3ea 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -929,7 +929,7 @@ class TC_GAME_API Guild bool _IsLeader(Player* player) const; void _DeleteBankItems(SQLTransaction& trans, bool removeItemsFromDB = false); bool _ModifyBankMoney(SQLTransaction& trans, uint64 amount, bool add); - void _SetLeaderGUID(Member* pLeader); + void _SetLeader(SQLTransaction& trans, Member* leader); void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay); void _SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB = true); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 673ced13f10..a428843d6be 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -956,21 +956,17 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) { Field* fields = resultGuild->Fetch(); pCurrChar->SetInGuild(fields[0].GetUInt64()); - pCurrChar->SetRank(fields[1].GetUInt8()); + pCurrChar->SetGuildRank(fields[1].GetUInt8()); if (Guild* guild = sGuildMgr->GetGuildById(pCurrChar->GetGuildId())) pCurrChar->SetGuildLevel(guild->GetLevel()); } else if (pCurrChar->GetGuildId()) // clear guild related fields in case wrong data about non existed membership { pCurrChar->SetInGuild(UI64LIT(0)); - pCurrChar->SetRank(0); + pCurrChar->SetGuildRank(0); pCurrChar->SetGuildLevel(0); } - //WorldPacket data(SMSG_LEARNED_DANCE_MOVES, 4+4); - //data << uint64(0); - //SendPacket(&data); - // TODO: Move this to BattlePetMgr::SendJournalLock() just to have all packets in one file WorldPackets::BattlePet::BattlePetJournalLockAcquired lock; SendPacket(lock.Write()); |