diff options
-rw-r--r-- | src/server/game/Guilds/GuildFinderMgr.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Guilds/GuildFinderMgr.h | 6 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/World/World.h | 2 |
4 files changed, 41 insertions, 5 deletions
diff --git a/src/server/game/Guilds/GuildFinderMgr.cpp b/src/server/game/Guilds/GuildFinderMgr.cpp index 71a1a9ded0d..c81abeec47a 100644 --- a/src/server/game/Guilds/GuildFinderMgr.cpp +++ b/src/server/game/Guilds/GuildFinderMgr.cpp @@ -137,6 +137,34 @@ void GuildFinderMgr::AddMembershipRequest(uint32 guildGuid, MembershipRequest co SendApplicantListUpdate(*guild); } +void GuildFinderMgr::RemoveAllMembershipRequestsFromPlayer(uint32 playerId) +{ + for (MembershipRequestStore::iterator itr = _membershipRequests.begin(); itr != _membershipRequests.end(); ++itr) + { + std::vector<MembershipRequest>::iterator itr2 = itr->second.begin(); + for(; itr2 != itr->second.end(); ++itr2) + if (itr2->GetPlayerGUID() == playerId) + break; + + if (itr2 == itr->second.end()) + return; + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); + stmt->setUInt32(0, itr2->GetGuildId()); + stmt->setUInt32(1, itr2->GetPlayerGUID()); + trans->Append(stmt); + + CharacterDatabase.CommitTransaction(trans); + itr->second.erase(itr2); + + // Notify the guild master and officers the list changed + if (Guild* guild = sGuildMgr->GetGuildById(itr->first)) + SendApplicantListUpdate(*guild); + } +} + void GuildFinderMgr::RemoveMembershipRequest(uint32 playerId, uint32 guildId) { std::vector<MembershipRequest>::iterator itr = _membershipRequests[guildId].begin(); @@ -150,8 +178,8 @@ void GuildFinderMgr::RemoveMembershipRequest(uint32 playerId, uint32 guildId) SQLTransaction trans = CharacterDatabase.BeginTransaction(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); - stmt->setUInt32(0, (*itr).GetGuildId()); - stmt->setUInt32(1, (*itr).GetPlayerGUID()); + stmt->setUInt32(0, itr->GetGuildId()); + stmt->setUInt32(1, itr->GetPlayerGUID()); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); @@ -271,7 +299,7 @@ void GuildFinderMgr::DeleteGuild(uint32 guildId) trans->Append(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS); - stmt->setUInt32(0, (*itr).GetGuildId()); + stmt->setUInt32(0, itr->GetGuildId()); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h index 049071dbca9..169b42740aa 100644 --- a/src/server/game/Guilds/GuildFinderMgr.h +++ b/src/server/game/Guilds/GuildFinderMgr.h @@ -225,6 +225,12 @@ class GuildFinderMgr void AddMembershipRequest(uint32 guildGuid, MembershipRequest const& request); /** + * @brief Removes all membership request from a player. + * @param playerId The player's database guid whose application shall be deleted. + */ + void RemoveAllMembershipRequestsFromPlayer(uint32 playerId); + + /** * @brief Removes a membership request to a guild. * @param playerId The player's database guid whose application shall be deleted. * @param guildId The guild's database guid diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 33ffb5ba169..70c1bc5955b 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -30,6 +30,7 @@ #include "Chat.h" #include "Group.h" #include "Guild.h" +#include "GuildFinderMgr.h" #include "Language.h" #include "Log.h" #include "Opcodes.h" @@ -742,7 +743,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket & recvData) std::string IP_str = GetRemoteAddress(); sLog->outInfo(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Delete Character:[%s] (GUID: %u)", GetAccountId(), IP_str.c_str(), name.c_str(), GUID_LOPART(guid)); sScriptMgr->OnPlayerDelete(guid); - sWorld->DeleteCharaceterNameData(GUID_LOPART(guid)); + sWorld->DeleteCharacterNameData(GUID_LOPART(guid)); if (sLog->ShouldLog(LOG_FILTER_PLAYER_DUMP, LOG_LEVEL_INFO)) // optimize GetPlayerDump call { @@ -751,6 +752,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket & recvData) sLog->outCharDump(dump.c_str(), GetAccountId(), GUID_LOPART(guid), name.c_str()); } + sGuildFinderMgr->RemoveAllMembershipRequestsFromPlayer(guid); Player::DeleteFromDB(guid, GetAccountId()); WorldPacket data(SMSG_CHAR_DELETE, 1); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 83746bb6022..b8243cb0531 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -780,7 +780,7 @@ class World void AddCharacterNameData(uint32 guid, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level); void UpdateCharacterNameData(uint32 guid, std::string const& name, uint8 gender = GENDER_NONE, uint8 race = RACE_NONE); void UpdateCharacterNameDataLevel(uint32 guid, uint8 level); - void DeleteCharaceterNameData(uint32 guid) { _characterNameDataMap.erase(guid); }; + void DeleteCharacterNameData(uint32 guid) { _characterNameDataMap.erase(guid); } uint32 GetCleaningFlags() const { return m_CleaningFlags; } void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; } |