[6883] Avoid DB access on deleting guild member.

This commit is contained in:
hunuza 2008-12-07 15:41:05 +01:00
parent e81af0b739
commit 66c98859cf
3 changed files with 40 additions and 39 deletions

View file

@ -22,6 +22,7 @@
#include "Log.h" #include "Log.h"
#include "Database/DatabaseEnv.h" #include "Database/DatabaseEnv.h"
#include "Database/DatabaseImpl.h"
#include "Platform/Define.h" #include "Platform/Define.h"
#include "MapManager.h" #include "MapManager.h"
#include "ObjectAccessor.h" #include "ObjectAccessor.h"

View file

@ -417,53 +417,53 @@ void Guild::DelMember(uint64 guid, bool isDisbanding)
{ {
if(leaderGuid == guid && !isDisbanding) if(leaderGuid == guid && !isDisbanding)
{ {
QueryResult *result = CharacterDatabase.PQuery("SELECT guid FROM guild_member WHERE guildid='%u' AND guid != '%u' ORDER BY rank ASC LIMIT 1", Id, GUID_LOPART(leaderGuid)); MemberSlot* oldLeader = NULL;
if( result ) MemberSlot* best = NULL;
uint64 newLeaderGUID = 0;
for(Guild::MemberList::iterator i = members.begin(); i != members.end(); ++i)
{ {
uint64 newLeaderGUID; if(i->first == GUID_LOPART(guid))
Player *newLeader;
std::string newLeaderName, oldLeaderName;
newLeaderGUID = (*result)[0].GetUInt64();
delete result;
SetLeader(newLeaderGUID);
newLeader = objmgr.GetPlayer(newLeaderGUID);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
if(newLeader)
{ {
newLeader->SetRank(GR_GUILDMASTER); oldLeader = &(i->second);
newLeaderName = newLeader->GetName(); continue;
}
else
objmgr.GetPlayerNameByGUID(newLeaderGUID, newLeaderName);
// when leader non-exist (at guild load with deleted leader only) not send broadcasts
if(objmgr.GetPlayerNameByGUID(guid, oldLeaderName))
{
WorldPacket data(SMSG_GUILD_EVENT, (1+1+oldLeaderName.size()+1+newLeaderName.size()+1));
data << (uint8)GE_LEADER_CHANGED;
data << (uint8)2;
data << oldLeaderName;
data << newLeaderName;
BroadcastPacket(&data);
data.Initialize(SMSG_GUILD_EVENT, (1+1+oldLeaderName.size()+1));
data << (uint8)GE_LEFT;
data << (uint8)1;
data << oldLeaderName;
BroadcastPacket(&data);
} }
sLog.outDebug( "WORLD: Sent (SMSG_GUILD_EVENT)" ); if(!best || best->RankId > i->second.RankId)
{
best = &(i->second);
newLeaderGUID = i->first;
}
} }
else if(!best)
{ {
Disband(); Disband();
return; return;
} }
SetLeader(newLeaderGUID);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
if(Player *newLeader = objmgr.GetPlayer(newLeaderGUID))
newLeader->SetRank(GR_GUILDMASTER);
// when leader non-exist (at guild load with deleted leader only) not send broadcasts
if(oldLeader)
{
WorldPacket data(SMSG_GUILD_EVENT, (1+1+(oldLeader->name).size()+1+(best->name).size()+1));
data << (uint8)GE_LEADER_CHANGED;
data << (uint8)2;
data << oldLeader->name;
data << best->name;
BroadcastPacket(&data);
data.Initialize(SMSG_GUILD_EVENT, (1+1+(oldLeader->name).size()+1));
data << (uint8)GE_LEFT;
data << (uint8)1;
data << oldLeader->name;
BroadcastPacket(&data);
}
sLog.outDebug( "WORLD: Sent (SMSG_GUILD_EVENT)" );
} }
members.erase(GUID_LOPART(guid)); members.erase(GUID_LOPART(guid));

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "6882" #define REVISION_NR "6883"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__