Access cached member lists in guild handlers instead of querying the DB.

This commit is contained in:
hunuza 2008-11-07 11:49:27 +01:00
parent 8fc5ac7fd3
commit b681f5ac1a
2 changed files with 46 additions and 63 deletions

View file

@ -329,6 +329,18 @@ class Guild
{ {
return (members.find(LowGuid) != members.end()); return (members.find(LowGuid) != members.end());
} }
MemberSlot* GetMemberSlot(std::string const& name, uint64& guid)
{
for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
{
if(itr->second.name == name)
{
guid = itr->first;
return &itr->second;
}
}
return NULL;
}
void Roster(WorldSession *session); void Roster(WorldSession *session);
void Query(WorldSession *session); void Query(WorldSession *session);

View file

@ -171,26 +171,20 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
return; return;
} }
uint64 plGuid = objmgr.GetPlayerGUIDByName(plName); uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
if(!plGuid) if(!slot)
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND);
return;
}
if(plGuid == guild->GetLeader())
{
SendGuildCommandResult(GUILD_QUIT_S, "", GUILD_LEADER_LEAVE);
return;
}
if(!guild->IsMember(GUID_LOPART(plGuid)))
{ {
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S); SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
return; return;
} }
if(slot->RankId == GR_GUILDMASTER)
{
SendGuildCommandResult(GUILD_QUIT_S, "", GUILD_LEADER_LEAVE);
return;
}
guild->DelMember(plGuid); guild->DelMember(plGuid);
// Put record into guildlog // Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), 0); guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), 0);
@ -299,29 +293,25 @@ void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket)
return; return;
} }
uint64 plGuid = objmgr.GetPlayerGUIDByName(plName); uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
if(!plGuid) if(!slot)
{ {
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND); SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
return; return;
} }
else if(plGuid == GetPlayer()->GetGUID())
if(plGuid == GetPlayer()->GetGUID())
{ {
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_NAME_INVALID); SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_NAME_INVALID);
return; return;
} }
int32 plRankId = guild->GetRank(GUID_LOPART(plGuid)); if(slot->RankId < 2 || (slot->RankId-1) < GetPlayer()->GetRank())
if(plRankId == -1)
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
if(plRankId < 2 || (plRankId-1) < GetPlayer()->GetRank())
return; return;
uint32 newRankId = plRankId < guild->GetNrRanks() ? plRankId-1 : guild->GetNrRanks()-1; uint32 newRankId = slot->RankId < guild->GetNrRanks() ? slot->RankId-1 : guild->GetNrRanks()-1;
guild->ChangeRank(plGuid, newRankId); guild->ChangeRank(plGuid, newRankId);
// Put record into guildlog // Put record into guildlog
@ -363,11 +353,12 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
return; return;
} }
uint64 plGuid = objmgr.GetPlayerGUIDByName(plName); uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
if( !plGuid ) if (!slot)
{ {
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND); SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
return; return;
} }
@ -377,25 +368,19 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
return; return;
} }
int32 plRankId = guild->GetRank(GUID_LOPART(plGuid)); if((slot->RankId+1) >= guild->GetNrRanks() || slot->RankId <= GetPlayer()->GetRank())
if(plRankId == -1)
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
if((plRankId+1) >= guild->GetNrRanks() || plRankId <= GetPlayer()->GetRank())
return; return;
guild->ChangeRank(plGuid, (plRankId+1)); guild->ChangeRank(plGuid, (slot->RankId+1));
// Put record into guildlog // Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), (plRankId+1)); guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), (slot->RankId+1));
WorldPacket data(SMSG_GUILD_EVENT, (2+30)); // guess size WorldPacket data(SMSG_GUILD_EVENT, (2+30)); // guess size
data << (uint8)GE_DEMOTION; data << (uint8)GE_DEMOTION;
data << (uint8)3; data << (uint8)3;
data << GetPlayer()->GetName(); data << GetPlayer()->GetName();
data << plName; data << plName;
data << guild->GetRankName(plRankId+1); data << guild->GetRankName(slot->RankId+1);
guild->BroadcastPacket(&data); guild->BroadcastPacket(&data);
} }
@ -494,14 +479,10 @@ void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket)
return; return;
} }
uint64 newLeaderGUID = objmgr.GetPlayerGUIDByName(name); uint64 newLeaderGUID;
MemberSlot* slot = guild->GetMemberSlot(name, newLeaderGUID);
if (!newLeaderGUID) if (!slot)
{
SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_FOUND);
return;
}
if (!guild->IsMember(GUID_LOPART(newLeaderGUID)))
{ {
SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S); SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S);
return; return;
@ -582,15 +563,10 @@ void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket)
return; return;
} }
uint64 plGuid = objmgr.GetPlayerGUIDByName(name); uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(name, plGuid);
if (!plGuid) if (!slot)
{
SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_FOUND);
return;
}
if (!guild->IsMember(GUID_LOPART(plGuid)))
{ {
SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S); SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S);
return; return;
@ -628,15 +604,10 @@ void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket)
return; return;
} }
uint64 plGuid = objmgr.GetPlayerGUIDByName(plName); uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
if (!plGuid) if (!slot)
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND);
return;
}
if (!guild->IsMember(GUID_LOPART(plGuid)))
{ {
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S); SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
return; return;