From 917ffc030ea2ffaf698d2bd2b1e7967081a27beb Mon Sep 17 00:00:00 2001 From: Warpten Date: Sun, 9 Sep 2012 11:32:14 +0200 Subject: Core/Guilds: Implemented GuildFinder. --- src/server/game/Handlers/CharacterHandler.cpp | 2 +- src/server/game/Handlers/GuildFinderHandler.cpp | 443 ++++++++++++++++++++++++ 2 files changed, 444 insertions(+), 1 deletion(-) create mode 100644 src/server/game/Handlers/GuildFinderHandler.cpp (limited to 'src/server/game/Handlers') diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 32ed1d2b27f..33ffb5ba169 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -685,7 +685,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte std::string IP_str = GetRemoteAddress(); sLog->outInfo(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Create Character:[%s] (GUID: %u)", GetAccountId(), IP_str.c_str(), createInfo->Name.c_str(), newChar.GetGUIDLow()); sScriptMgr->OnPlayerCreate(&newChar); - sWorld->AddCharacterNameData(newChar.GetGUIDLow(), std::string(newChar.GetName()), newChar.getGender(), newChar.getRace(), newChar.getClass()); + sWorld->AddCharacterNameData(newChar.GetGUIDLow(), std::string(newChar.GetName()), newChar.getGender(), newChar.getRace(), newChar.getClass(), newChar.getLevel()); newChar.CleanupsBeforeDelete(); delete createInfo; diff --git a/src/server/game/Handlers/GuildFinderHandler.cpp b/src/server/game/Handlers/GuildFinderHandler.cpp new file mode 100644 index 00000000000..af57a5908f8 --- /dev/null +++ b/src/server/game/Handlers/GuildFinderHandler.cpp @@ -0,0 +1,443 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "WorldSession.h" +#include "WorldPacket.h" +#include "Object.h" +#include "SharedDefines.h" +#include "GuildFinderMgr.h" +#include "GuildMgr.h" + +void WorldSession::HandleGuildFinderAddRecruit(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_ADD_RECRUIT"); + + if (sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUIDLow()).size() == 10) + return; + + uint32 classRoles = 0; + uint32 availability = 0; + uint32 guildInterests = 0; + + recvPacket >> classRoles >> guildInterests >> availability; + + ObjectGuid guid; + guid[3] = recvPacket.ReadBit(); + guid[0] = recvPacket.ReadBit(); + guid[6] = recvPacket.ReadBit(); + guid[1] = recvPacket.ReadBit(); + uint16 commentLength = recvPacket.ReadBits(11); + guid[5] = recvPacket.ReadBit(); + guid[4] = recvPacket.ReadBit(); + guid[7] = recvPacket.ReadBit(); + uint8 nameLength = recvPacket.ReadBits(7); + guid[2] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guid[4]); + recvPacket.ReadByteSeq(guid[5]); + std::string comment = recvPacket.ReadString(commentLength); + std::string playerName = recvPacket.ReadString(nameLength); + recvPacket.ReadByteSeq(guid[7]); + recvPacket.ReadByteSeq(guid[2]); + recvPacket.ReadByteSeq(guid[0]); + recvPacket.ReadByteSeq(guid[6]); + recvPacket.ReadByteSeq(guid[1]); + recvPacket.ReadByteSeq(guid[3]); + + uint32 guildLowGuid = GUID_LOPART(uint64(guid)); + + if (!IS_GUILD_GUID(guid)) + return; + if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + return; + if (!(availability & ALL_WEEK) || availability > ALL_WEEK) + return; + if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + return; + + MembershipRequest request = MembershipRequest(GetPlayer()->GetGUIDLow(), guildLowGuid, availability, classRoles, guildInterests, comment, time(NULL)); + sGuildFinderMgr->AddMembershipRequest(guildLowGuid, request); +} + +void WorldSession::HandleGuildFinderBrowse(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_BROWSE"); + uint32 classRoles = 0; + uint32 availability = 0; + uint32 guildInterests = 0; + uint32 playerLevel = 0; // Raw player level (1-85), do they use MAX_FINDER_LEVEL when on level 85 ? + + recvPacket >> classRoles >> availability >> guildInterests >> playerLevel; + + if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + return; + if (!(availability & ALL_WEEK) || availability > ALL_WEEK) + return; + if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + return; + if (playerLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || playerLevel < 1) + return; + + Player* player = GetPlayer(); + + LFGuildPlayer settings(player->GetGUIDLow(), classRoles, availability, guildInterests, ANY_FINDER_LEVEL); + LFGuildStore guildList = sGuildFinderMgr->GetGuildsMatchingSetting(settings, player->GetTeamId()); + uint32 guildCount = guildList.size(); + + if (guildCount == 0) + { + WorldPacket packet(SMSG_LF_GUILD_BROWSE_UPDATED, 0); + player->SendDirectMessage(&packet); + return; + } + + ByteBuffer bufferData(65 * guildCount); + WorldPacket data(SMSG_LF_GUILD_BROWSE_UPDATED, 3 + guildCount * 65); // Estimated size + data.WriteBits(guildCount, 19); + + for (LFGuildStore::const_iterator itr = guildList.begin(); itr != guildList.end(); ++itr) + { + LFGuildSettings guildSettings = itr->second; + Guild* guild = sGuildMgr->GetGuildById(itr->first); + + ObjectGuid guildGUID = ObjectGuid(guild->GetGUID()); + + data.WriteBit(guildGUID[7]); + data.WriteBit(guildGUID[5]); + data.WriteBits(guild->GetName().size(), 8); + data.WriteBit(guildGUID[0]); + data.WriteBits(guildSettings.GetComment().size(), 11); + data.WriteBit(guildGUID[4]); + data.WriteBit(guildGUID[1]); + data.WriteBit(guildGUID[2]); + data.WriteBit(guildGUID[6]); + data.WriteBit(guildGUID[3]); + + bufferData << int32(guild->GetEmblemInfo().GetColor()); + bufferData << int32(guild->GetEmblemInfo().GetBorderStyle()); // Guessed + bufferData << int32(guild->GetEmblemInfo().GetStyle()); + + bufferData.WriteString(guildSettings.GetComment()); + + bufferData << uint8(0); // Cached ? Idk + + bufferData.WriteByteSeq(guildGUID[5]); + + bufferData << uint32(guildSettings.GetInterests()); // Guild Interests + + bufferData.WriteByteSeq(guildGUID[6]); + bufferData.WriteByteSeq(guildGUID[4]); + + bufferData << guild->GetLevel(); + + bufferData.WriteString(guild->GetName()); + + bufferData << int32(0); // guild->GetAchievementMgr().GetAchievementPoints() + + bufferData.WriteByteSeq(guildGUID[7]); + + bufferData << uint8(sGuildFinderMgr->HasRequest(player->GetGUIDLow(), guild->GetGUID())); // Request pending + + bufferData.WriteByteSeq(guildGUID[2]); + bufferData.WriteByteSeq(guildGUID[0]); + + bufferData << uint32(guildSettings.GetAvailability()); + + bufferData.WriteByteSeq(guildGUID[1]); + + bufferData << int32(guild->GetEmblemInfo().GetBackgroundColor()); + bufferData << uint32(0); // Unk Int 2 (+ 128) // Always 0 or 1 + bufferData << int32(guild->GetEmblemInfo().GetBorderColor()); + bufferData << uint32(guildSettings.GetClassRoles()); + + bufferData.WriteByteSeq(guildGUID[3]); + bufferData << int32(guild->GetMembersCount()); + } + + data.FlushBits(); + data.append(bufferData); + + player->SendDirectMessage(&data); +} + +void WorldSession::HandleGuildFinderDeclineRecruit(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_DECLINE_RECRUIT"); + + ObjectGuid playerGuid; + + playerGuid[1] = recvPacket.ReadBit(); + playerGuid[4] = recvPacket.ReadBit(); + playerGuid[5] = recvPacket.ReadBit(); + playerGuid[2] = recvPacket.ReadBit(); + playerGuid[6] = recvPacket.ReadBit(); + playerGuid[7] = recvPacket.ReadBit(); + playerGuid[0] = recvPacket.ReadBit(); + playerGuid[3] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(playerGuid[5]); + recvPacket.ReadByteSeq(playerGuid[7]); + recvPacket.ReadByteSeq(playerGuid[2]); + recvPacket.ReadByteSeq(playerGuid[3]); + recvPacket.ReadByteSeq(playerGuid[4]); + recvPacket.ReadByteSeq(playerGuid[1]); + recvPacket.ReadByteSeq(playerGuid[0]); + recvPacket.ReadByteSeq(playerGuid[6]); + + if (!IS_PLAYER_GUID(playerGuid)) + return; + + sGuildFinderMgr->RemoveMembershipRequest(GUID_LOPART(playerGuid), GetPlayer()->GetGuildId()); +} + +void WorldSession::HandleGuildFinderGetApplications(WorldPacket& /*recvPacket*/) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_GET_APPLICATIONS"); // Empty opcode + + std::list applicatedGuilds = sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUIDLow()); + uint32 applicationsCount = applicatedGuilds.size(); + WorldPacket data(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, 7 + 54 * applicationsCount); + data.WriteBits(applicationsCount, 20); + + if (applicationsCount > 0) + { + ByteBuffer bufferData(54 * applicationsCount); + for (std::list::const_iterator itr = applicatedGuilds.begin(); itr != applicatedGuilds.end(); ++itr) + { + Guild* guild = sGuildMgr->GetGuildById(itr->GetGuildId()); + LFGuildSettings guildSettings = sGuildFinderMgr->GetGuildSettings(itr->GetGuildId()); + MembershipRequest request = *itr; + + ObjectGuid guildGuid = ObjectGuid(guild->GetGUID()); + + data.WriteBit(guildGuid[1]); + data.WriteBit(guildGuid[0]); + data.WriteBit(guildGuid[5]); + data.WriteBits(request.GetComment().size(), 11); + data.WriteBit(guildGuid[3]); + data.WriteBit(guildGuid[7]); + data.WriteBit(guildGuid[4]); + data.WriteBit(guildGuid[6]); + data.WriteBit(guildGuid[2]); + data.WriteBits(guild->GetName().size(), 8); + + bufferData.WriteByteSeq(guildGuid[2]); + bufferData.WriteString(request.GetComment()); + bufferData.WriteByteSeq(guildGuid[5]); + bufferData.WriteString(guild->GetName()); + + bufferData << uint32(guildSettings.GetAvailability()); + bufferData << uint32(request.GetExpiryTime() - time(NULL)); // Time left to application expiry (seconds) + + bufferData.WriteByteSeq(guildGuid[0]); + bufferData.WriteByteSeq(guildGuid[6]); + bufferData.WriteByteSeq(guildGuid[3]); + bufferData.WriteByteSeq(guildGuid[7]); + + bufferData << uint32(guildSettings.GetClassRoles()); + + bufferData.WriteByteSeq(guildGuid[4]); + bufferData.WriteByteSeq(guildGuid[1]); + + bufferData << uint32(time(NULL) - request.GetSubmitTime()); // Time since application (seconds) + bufferData << uint32(guildSettings.GetInterests()); + } + + data.FlushBits(); + data.append(bufferData); + } + data << uint32(10 - sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUIDLow())); // Applications count left + + GetPlayer()->SendDirectMessage(&data); +} + +// Lists all recruits for a guild - Misses times +void WorldSession::HandleGuildFinderGetRecruits(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_GET_RECRUITS"); + + uint32 unkTime = 0; + recvPacket >> unkTime; + + Player* player = GetPlayer(); + if (!player->GetGuildId()) + return; + + std::vector recruitsList = sGuildFinderMgr->GetAllMembershipRequestsForGuild(player->GetGuildId()); + uint32 recruitCount = recruitsList.size(); + + ByteBuffer dataBuffer(53 * recruitCount); + WorldPacket data(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, 7 + 26 * recruitCount + 53 * recruitCount); + data.WriteBits(recruitCount, 20); + + for (std::vector::const_iterator itr = recruitsList.begin(); itr != recruitsList.end(); ++itr) + { + MembershipRequest request = *itr; + ObjectGuid playerGuid(MAKE_NEW_GUID(request.GetPlayerGUID(), 0, HIGHGUID_PLAYER)); + + data.WriteBits(request.GetComment().size(), 11); + data.WriteBit(playerGuid[2]); + data.WriteBit(playerGuid[4]); + data.WriteBit(playerGuid[3]); + data.WriteBit(playerGuid[7]); + data.WriteBit(playerGuid[0]); + data.WriteBits(request.GetName().size(), 7); + data.WriteBit(playerGuid[5]); + data.WriteBit(playerGuid[1]); + data.WriteBit(playerGuid[6]); + + dataBuffer.WriteByteSeq(playerGuid[4]); + + dataBuffer << int32(time(NULL) <= request.GetExpiryTime()); + + dataBuffer.WriteByteSeq(playerGuid[3]); + dataBuffer.WriteByteSeq(playerGuid[0]); + dataBuffer.WriteByteSeq(playerGuid[1]); + + dataBuffer << int32(request.GetLevel()); + + dataBuffer.WriteByteSeq(playerGuid[6]); + dataBuffer.WriteByteSeq(playerGuid[7]); + dataBuffer.WriteByteSeq(playerGuid[2]); + + dataBuffer << int32(time(NULL) - request.GetSubmitTime()); // Time in seconds since application submitted. + dataBuffer << int32(request.GetAvailability()); + dataBuffer << int32(request.GetClassRoles()); + dataBuffer << int32(request.GetInterests()); + dataBuffer << int32(request.GetExpiryTime() - time(NULL)); // TIme in seconds until application expires. + + dataBuffer.WriteString(request.GetName()); + dataBuffer.WriteString(request.GetComment()); + + dataBuffer << int32(request.GetClass()); + + dataBuffer.WriteByteSeq(playerGuid[5]); + } + + data.FlushBits(); + data.append(dataBuffer); + data << uint32(time(NULL)); // Unk time + + player->SendDirectMessage(&data); +} + +void WorldSession::HandleGuildFinderPostRequest(WorldPacket& /*recvPacket*/) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_POST_REQUEST"); // Empty opcode + + Player* player = GetPlayer(); + + if (!player->GetGuildId()) // Player must be in guild + return; + + bool isGuildMaster = true; + if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) + if (guild->GetLeaderGUID() != player->GetGUID()) + isGuildMaster = false; + + LFGuildSettings settings = sGuildFinderMgr->GetGuildSettings(player->GetGuildId()); + + /// Client does not seem to receive correct data as only the comment is correctly displayed. + WorldPacket data(SMSG_LF_GUILD_POST_UPDATED, 35); + data.WriteBit(isGuildMaster); // Guessed + + if (isGuildMaster) + { + data.WriteBits(settings.GetComment().size(), 11); + data.WriteBit(settings.IsListed()); + data << uint32(settings.GetLevel()); + data.WriteString(settings.GetComment()); + data << uint32(0); // Unk Int32 + data << uint32(settings.GetAvailability()); + data << uint32(settings.GetClassRoles()); + data << uint32(settings.GetInterests()); + } + else + data.FlushBits(); + player->SendDirectMessage(&data); +} + +void WorldSession::HandleGuildFinderRemoveRecruit(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_REMOVE_RECRUIT"); + + ObjectGuid guildGuid; + + guildGuid[0] = recvPacket.ReadBit(); + guildGuid[4] = recvPacket.ReadBit(); + guildGuid[3] = recvPacket.ReadBit(); + guildGuid[5] = recvPacket.ReadBit(); + guildGuid[7] = recvPacket.ReadBit(); + guildGuid[6] = recvPacket.ReadBit(); + guildGuid[2] = recvPacket.ReadBit(); + guildGuid[1] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guildGuid[4]); + recvPacket.ReadByteSeq(guildGuid[0]); + recvPacket.ReadByteSeq(guildGuid[3]); + recvPacket.ReadByteSeq(guildGuid[6]); + recvPacket.ReadByteSeq(guildGuid[5]); + recvPacket.ReadByteSeq(guildGuid[1]); + recvPacket.ReadByteSeq(guildGuid[2]); + recvPacket.ReadByteSeq(guildGuid[7]); + + if (!IS_GUILD_GUID(guildGuid)) + return; + + sGuildFinderMgr->RemoveMembershipRequest(GetPlayer()->GetGUIDLow(), GUID_LOPART(guildGuid)); +} + +// Sent any time a guild master sets an option in the interface and when listing / unlisting his guild +void WorldSession::HandleGuildFinderSetGuildPost(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_SET_GUILD_POST"); + + uint32 classRoles = 0; + uint32 availability = 0; + uint32 guildInterests = 0; + uint32 level = 0; + + recvPacket >> level >> availability >> guildInterests >> classRoles; + // Level sent is zero if untouched, force to any (from interface). Idk why + if (!level) + level = ANY_FINDER_LEVEL; + + uint16 length = recvPacket.ReadBits(11); + bool listed = recvPacket.ReadBit(); + std::string comment = recvPacket.ReadString(length); + + if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + return; + if (!(availability & ALL_WEEK) || availability > ALL_WEEK) + return; + if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + return; + if (!(level & ALL_GUILDFINDER_LEVELS) || level > ALL_GUILDFINDER_LEVELS) + return; + + Player* player = GetPlayer(); + + if (!player->GetGuildId()) // Player must be in guild + return; + + if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) // Player must be guild master + if (guild->GetLeaderGUID() != player->GetGUID()) + return; + + LFGuildSettings settings(listed, player->GetTeamId(), player->GetGuildId(), classRoles, availability, guildInterests, level, comment); + sGuildFinderMgr->SetGuildSettings(player->GetGuildId(), settings); +} -- cgit v1.2.3 From 4e0314e9546a6cda849533e6abebc931b954987d Mon Sep 17 00:00:00 2001 From: Warpten Date: Sun, 9 Sep 2012 21:03:28 +0200 Subject: Core/GuildFinder: Fix SMSG_LF_GUILD_POST_UPDATED, thanks @Shauren. --- src/server/game/Handlers/GuildFinderHandler.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/server/game/Handlers') diff --git a/src/server/game/Handlers/GuildFinderHandler.cpp b/src/server/game/Handlers/GuildFinderHandler.cpp index af57a5908f8..facbd98ffac 100644 --- a/src/server/game/Handlers/GuildFinderHandler.cpp +++ b/src/server/game/Handlers/GuildFinderHandler.cpp @@ -351,14 +351,13 @@ void WorldSession::HandleGuildFinderPostRequest(WorldPacket& /*recvPacket*/) LFGuildSettings settings = sGuildFinderMgr->GetGuildSettings(player->GetGuildId()); - /// Client does not seem to receive correct data as only the comment is correctly displayed. WorldPacket data(SMSG_LF_GUILD_POST_UPDATED, 35); data.WriteBit(isGuildMaster); // Guessed if (isGuildMaster) { - data.WriteBits(settings.GetComment().size(), 11); data.WriteBit(settings.IsListed()); + data.WriteBits(settings.GetComment().size(), 11); data << uint32(settings.GetLevel()); data.WriteString(settings.GetComment()); data << uint32(0); // Unk Int32 -- cgit v1.2.3 From a6c9cb00be419845655fcb50d23806236d3849a0 Mon Sep 17 00:00:00 2001 From: Warpten Date: Mon, 10 Sep 2012 12:28:40 +0200 Subject: Core/GuildFinder: Fixed a possible crash caused by membership requests left after a character is deleted. --- src/server/game/Guilds/GuildFinderMgr.cpp | 34 ++++++++++++++++++++++++--- src/server/game/Guilds/GuildFinderMgr.h | 6 +++++ src/server/game/Handlers/CharacterHandler.cpp | 4 +++- src/server/game/World/World.h | 2 +- 4 files changed, 41 insertions(+), 5 deletions(-) (limited to 'src/server/game/Handlers') 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::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::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 @@ -224,6 +224,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. 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; } -- cgit v1.2.3