mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[8560] Optimized guild and arena team loading at startup.
Signed-off-by: Triply <triply@getmangos.com>
This commit is contained in:
parent
e412e10de1
commit
0356924cf9
6 changed files with 239 additions and 197 deletions
|
|
@ -161,90 +161,87 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ArenaTeam::LoadArenaTeamFromDB(uint32 ArenaTeamId)
|
||||
bool ArenaTeam::LoadArenaTeamFromDB(QueryResult *arenaTeamDataResult)
|
||||
{
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT arenateamid,name,captainguid,type,BackgroundColor,EmblemStyle,EmblemColor,BorderStyle,BorderColor FROM arena_team WHERE arenateamid = '%u'", ArenaTeamId);
|
||||
|
||||
if(!result)
|
||||
if(!arenaTeamDataResult)
|
||||
return false;
|
||||
|
||||
Field *fields = result->Fetch();
|
||||
Field *fields = arenaTeamDataResult->Fetch();
|
||||
|
||||
m_TeamId = fields[0].GetUInt32();
|
||||
m_Name = fields[1].GetCppString();
|
||||
m_CaptainGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER);
|
||||
m_Type = fields[3].GetUInt32();
|
||||
m_BackgroundColor = fields[4].GetUInt32();
|
||||
m_EmblemStyle = fields[5].GetUInt32();
|
||||
m_EmblemColor = fields[6].GetUInt32();
|
||||
m_BorderStyle = fields[7].GetUInt32();
|
||||
m_BorderColor = fields[8].GetUInt32();
|
||||
|
||||
delete result;
|
||||
|
||||
// only load here, so additional checks can be made
|
||||
LoadStatsFromDB(ArenaTeamId);
|
||||
LoadMembersFromDB(ArenaTeamId);
|
||||
|
||||
if(Empty())
|
||||
{
|
||||
// arena team is empty, delete from db
|
||||
CharacterDatabase.BeginTransaction();
|
||||
CharacterDatabase.PExecute("DELETE FROM arena_team WHERE arenateamid = '%u'", ArenaTeamId);
|
||||
CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid = '%u'", ArenaTeamId);
|
||||
CharacterDatabase.PExecute("DELETE FROM arena_team_stats WHERE arenateamid = '%u'", ArenaTeamId);
|
||||
CharacterDatabase.CommitTransaction();
|
||||
return false;
|
||||
}
|
||||
m_TeamId = fields[0].GetUInt32();
|
||||
m_Name = fields[1].GetCppString();
|
||||
m_CaptainGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER);
|
||||
m_Type = fields[3].GetUInt32();
|
||||
m_BackgroundColor = fields[4].GetUInt32();
|
||||
m_EmblemStyle = fields[5].GetUInt32();
|
||||
m_EmblemColor = fields[6].GetUInt32();
|
||||
m_BorderStyle = fields[7].GetUInt32();
|
||||
m_BorderColor = fields[8].GetUInt32();
|
||||
//load team stats
|
||||
m_stats.rating = fields[9].GetUInt32();
|
||||
m_stats.games_week = fields[10].GetUInt32();
|
||||
m_stats.wins_week = fields[11].GetUInt32();
|
||||
m_stats.games_season = fields[12].GetUInt32();
|
||||
m_stats.wins_season = fields[13].GetUInt32();
|
||||
m_stats.rank = fields[14].GetUInt32();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ArenaTeam::LoadStatsFromDB(uint32 ArenaTeamId)
|
||||
bool ArenaTeam::LoadMembersFromDB(QueryResult *arenaTeamMembersResult)
|
||||
{
|
||||
// 0 1 2 3 4 5
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT rating,games,wins,played,wins2,rank FROM arena_team_stats WHERE arenateamid = '%u'", ArenaTeamId);
|
||||
if(!arenaTeamMembersResult)
|
||||
return false;
|
||||
|
||||
if(!result)
|
||||
return;
|
||||
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
m_stats.rating = fields[0].GetUInt32();
|
||||
m_stats.games_week = fields[1].GetUInt32();
|
||||
m_stats.wins_week = fields[2].GetUInt32();
|
||||
m_stats.games_season = fields[3].GetUInt32();
|
||||
m_stats.wins_season = fields[4].GetUInt32();
|
||||
m_stats.rank = fields[5].GetUInt32();
|
||||
|
||||
delete result;
|
||||
}
|
||||
|
||||
void ArenaTeam::LoadMembersFromDB(uint32 ArenaTeamId)
|
||||
{
|
||||
// 0 1 2 3 4 5 6 7
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT member.guid,played_week,wons_week,played_season,wons_season,personal_rating,name,class "
|
||||
"FROM arena_team_member member "
|
||||
"INNER JOIN characters chars on member.guid = chars.guid "
|
||||
"WHERE member.arenateamid = '%u'", ArenaTeamId);
|
||||
if(!result)
|
||||
return;
|
||||
bool captainPresentInTeam = false;
|
||||
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
Field *fields = arenaTeamMembersResult->Fetch();
|
||||
uint32 arenaTeamId = fields[0].GetUInt32();
|
||||
if (arenaTeamId < m_TeamId)
|
||||
{
|
||||
//there is in table arena_team_member record which doesn't have arenateamid in arena_team table, report error
|
||||
sLog.outErrorDb("ArenaTeam %u does not exist but it has record in arena_team_member table, deleting it!", arenaTeamId);
|
||||
CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid = '%u'", arenaTeamId);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arenaTeamId > m_TeamId)
|
||||
//we loaded all members for this arena_team already, break cycle
|
||||
break;
|
||||
|
||||
ArenaTeamMember newmember;
|
||||
newmember.guid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER);
|
||||
newmember.games_week = fields[1].GetUInt32();
|
||||
newmember.wins_week = fields[2].GetUInt32();
|
||||
newmember.games_season = fields[3].GetUInt32();
|
||||
newmember.wins_season = fields[4].GetUInt32();
|
||||
newmember.personal_rating = fields[5].GetUInt32();
|
||||
newmember.name = fields[6].GetCppString();
|
||||
newmember.Class = fields[7].GetUInt8();
|
||||
newmember.guid = MAKE_NEW_GUID(fields[1].GetUInt32(), 0, HIGHGUID_PLAYER);
|
||||
newmember.games_week = fields[2].GetUInt32();
|
||||
newmember.wins_week = fields[3].GetUInt32();
|
||||
newmember.games_season = fields[4].GetUInt32();
|
||||
newmember.wins_season = fields[5].GetUInt32();
|
||||
newmember.personal_rating = fields[6].GetUInt32();
|
||||
newmember.name = fields[7].GetCppString();
|
||||
newmember.Class = fields[8].GetUInt8();
|
||||
|
||||
//check if member exists in characters table
|
||||
if (newmember.name.empty())
|
||||
{
|
||||
sLog.outErrorDb("ArenaTeam %u has member with empty name - probably player %u doesn't exist, deleting him from memberlist!", arenaTeamId, GUID_LOPART(newmember.guid));
|
||||
this->DelMember(newmember.guid);
|
||||
continue;
|
||||
}
|
||||
if (newmember.guid == GetCaptain())
|
||||
captainPresentInTeam = true;
|
||||
|
||||
m_members.push_back(newmember);
|
||||
}while( result->NextRow() );
|
||||
delete result;
|
||||
}while (arenaTeamMembersResult->NextRow());
|
||||
|
||||
if(Empty() || !captainPresentInTeam)
|
||||
{
|
||||
// arena team is empty or captain is not in team, delete from db
|
||||
sLog.outErrorDb("ArenaTeam %u does not have any members or its captain is not in team, disbanding it...", m_TeamId);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ArenaTeam::SetCaptain(const uint64& guid)
|
||||
|
|
@ -296,9 +293,12 @@ void ArenaTeam::DelMember(uint64 guid)
|
|||
void ArenaTeam::Disband(WorldSession *session)
|
||||
{
|
||||
// event
|
||||
WorldPacket data;
|
||||
session->BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_DISBANDED_S, 2, session->GetPlayerName(), GetName(), "");
|
||||
BroadcastPacket(&data);
|
||||
if (session)
|
||||
{
|
||||
WorldPacket data;
|
||||
session->BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_DISBANDED_S, 2, session->GetPlayerName(), GetName(), "");
|
||||
BroadcastPacket(&data);
|
||||
}
|
||||
|
||||
while (!m_members.empty())
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue