2008-10-02 16:23:55 -05:00
/*
2009-02-04 12:04:12 +01:00
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
2008-10-02 16:23:55 -05:00
*
* 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
2008-11-14 14:19:23 -06:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2008-10-02 16:23:55 -05:00
* 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, write to the Free Software
2008-11-14 14:19:23 -06:00
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2008-10-02 16:23:55 -05:00
*/
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
#include "ObjectMgr.h"
2010-06-08 13:05:47 -06:00
#include "WorldPacket.h"
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
#include "ArenaTeam.h"
2009-07-30 12:59:59 +02:00
#include "World.h"
2009-10-17 15:51:44 -07:00
2009-06-18 11:33:32 -05:00
void ArenaTeamMember :: ModifyPersonalRating ( Player * plr , int32 mod , uint32 slot )
{
2010-05-02 04:30:11 +02:00
if ( int32 ( personal_rating ) + mod < 0 )
personal_rating = 0 ;
else
personal_rating += mod ;
if ( plr )
plr -> SetArenaTeamInfoField ( slot , ARENA_TEAM_PERSONAL_RATING , personal_rating );
2009-06-18 11:33:32 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
ArenaTeam :: ArenaTeam ()
{
2009-07-31 11:22:27 +08:00
m_TeamId = 0 ;
m_Type = 0 ;
m_Name = "" ;
m_CaptainGuid = 0 ;
m_BackgroundColor = 0 ; // background
m_EmblemStyle = 0 ; // icon
m_EmblemColor = 0 ; // icon color
m_BorderStyle = 0 ; // border
m_BorderColor = 0 ; // border color
m_stats . games_week = 0 ;
m_stats . games_season = 0 ;
m_stats . rank = 0 ;
2010-04-07 23:56:35 +02:00
if ( sWorld . getConfig ( CONFIG_ARENA_START_RATING ) >= 0 )
2010-04-07 17:24:07 +02:00
m_stats . rating = sWorld . getConfig ( CONFIG_ARENA_START_RATING );
2010-02-14 19:13:14 -07:00
else if ( sWorld . getConfig ( CONFIG_ARENA_SEASON_ID ) >= 6 )
2009-07-31 11:22:27 +08:00
m_stats . rating = 0 ;
2009-07-30 12:59:59 +02:00
else
2009-07-31 11:22:27 +08:00
m_stats . rating = 1500 ;
m_stats . wins_week = 0 ;
m_stats . wins_season = 0 ;
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
ArenaTeam ::~ ArenaTeam ()
{
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
bool ArenaTeam :: Create ( uint64 captainGuid , uint32 type , std :: string ArenaTeamName )
2008-10-02 16:23:55 -05:00
{
2010-04-07 19:14:10 +02:00
if ( ! objmgr . GetPlayer ( captainGuid )) // player not exist
2008-10-02 16:23:55 -05:00
return false ;
2010-04-07 19:14:10 +02:00
if ( objmgr . GetArenaTeamByName ( ArenaTeamName )) // arena team with this name already exist
2008-10-02 16:23:55 -05:00
return false ;
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
sLog . outDebug ( "GUILD: creating arena team %s to leader: %u" , ArenaTeamName . c_str (), GUID_LOPART ( captainGuid ));
2009-10-17 15:51:44 -07:00
2009-07-31 11:22:27 +08:00
m_CaptainGuid = captainGuid ;
m_Name = ArenaTeamName ;
m_Type = type ;
2009-10-17 15:51:44 -07:00
2009-07-31 11:22:27 +08:00
m_TeamId = objmgr . GenerateArenaTeamId ();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// ArenaTeamName already assigned to ArenaTeam::name, use it to encode string for DB
CharacterDatabase . escape_string ( ArenaTeamName );
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
CharacterDatabase . BeginTransaction ();
2009-07-31 11:22:27 +08:00
// CharacterDatabase.PExecute("DELETE FROM arena_team WHERE arenateamid='%u'", m_TeamId); - MAX(arenateam)+1 not exist
CharacterDatabase . PExecute ( "DELETE FROM arena_team_member WHERE arenateamid='%u'" , m_TeamId );
2009-07-31 11:25:00 +08:00
CharacterDatabase . PExecute ( "INSERT INTO arena_team (arenateamid,name,captainguid,type,BackgroundColor,EmblemStyle,EmblemColor,BorderStyle,BorderColor) "
2008-10-02 16:23:55 -05:00
"VALUES('%u','%s','%u','%u','%u','%u','%u','%u','%u')" ,
2009-07-31 11:22:27 +08:00
m_TeamId , ArenaTeamName . c_str (), GUID_LOPART ( m_CaptainGuid ), m_Type , m_BackgroundColor , m_EmblemStyle , m_EmblemColor , m_BorderStyle , m_BorderColor );
2008-10-02 16:23:55 -05:00
CharacterDatabase . PExecute ( "INSERT INTO arena_team_stats (arenateamid, rating, games, wins, played, wins2, rank) VALUES "
2009-07-31 11:22:27 +08:00
"('%u', '%u', '%u', '%u', '%u', '%u', '%u')" , m_TeamId , m_stats . rating , m_stats . games_week , m_stats . wins_week , m_stats . games_season , m_stats . wins_season , m_stats . rank );
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
CharacterDatabase . CommitTransaction ();
2009-10-17 15:51:44 -07:00
2009-07-31 11:22:27 +08:00
AddMember ( m_CaptainGuid );
2009-06-01 20:44:23 +02:00
sLog . outArena ( "New ArenaTeam created [Id: %u] [Type: %u] [Captain GUID: %u]" , GetId (), GetType (), GetCaptain ());
2008-10-02 16:23:55 -05:00
return true ;
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
bool ArenaTeam :: AddMember ( const uint64 & PlayerGuid )
2008-10-02 16:23:55 -05:00
{
std :: string plName ;
uint8 plClass ;
2009-10-17 15:51:44 -07:00
2008-11-10 09:04:23 -06:00
// arena team is full (can't have more than type * 2 players!)
2010-04-07 19:14:10 +02:00
if ( GetMembersSize () >= GetType () * 2 )
2008-10-02 16:23:55 -05:00
return false ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Player * pl = objmgr . GetPlayer ( PlayerGuid );
2010-04-07 19:14:10 +02:00
if ( pl )
2008-10-02 16:23:55 -05:00
{
2010-04-07 19:14:10 +02:00
if ( pl -> GetArenaTeamId ( GetSlot ()))
2008-11-10 09:04:23 -06:00
{
sLog . outError ( "Arena::AddMember() : player already in this sized team" );
return false ;
}
2009-10-17 15:51:44 -07:00
2009-12-17 10:35:35 +01:00
plClass = pl -> getClass ();
2008-11-10 09:04:23 -06:00
plName = pl -> GetName ();
2008-10-02 16:23:55 -05:00
}
else
{
2008-11-10 09:04:23 -06:00
// 0 1
2010-01-23 14:45:58 +01:00
QueryResult_AutoPtr result = CharacterDatabase . PQuery ( "SELECT name, class FROM characters WHERE guid='%u'" , GUID_LOPART ( PlayerGuid ));
2010-04-07 19:14:10 +02:00
if ( ! result )
2008-10-02 16:23:55 -05:00
return false ;
2009-10-17 15:51:44 -07:00
2008-11-10 09:04:23 -06:00
plName = ( * result )[ 0 ]. GetCppString ();
plClass = ( * result )[ 1 ]. GetUInt8 ();
2009-10-17 15:51:44 -07:00
2008-11-10 09:04:23 -06:00
// check if player already in arenateam of that size
2010-04-07 19:14:10 +02:00
if ( Player :: GetArenaTeamIdFromDB ( PlayerGuid , GetType ()) != 0 )
2008-11-10 09:04:23 -06:00
{
sLog . outError ( "Arena::AddMember() : player already in this sized team" );
return false ;
}
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-11-10 09:04:23 -06:00
// remove all player signs from another petitions
// this will be prevent attempt joining player to many arenateams and corrupt arena team data integrity
Player :: RemovePetitionsAndSigns ( PlayerGuid , GetType ());
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
ArenaTeamMember newmember ;
2008-11-30 12:47:26 -06:00
newmember . name = plName ;
newmember . guid = PlayerGuid ;
newmember . Class = plClass ;
newmember . games_season = 0 ;
newmember . games_week = 0 ;
newmember . wins_season = 0 ;
newmember . wins_week = 0 ;
2010-05-04 16:53:19 +02:00
newmember . personal_rating = 0 ;
2010-05-05 01:17:50 +02:00
if ( sWorld . getConfig ( CONFIG_ARENA_START_PERSONAL_RATING ) > 0 )
newmember . personal_rating = sWorld . getConfig ( CONFIG_ARENA_START_PERSONAL_RATING );
else
2009-07-30 12:59:59 +02:00
{
2010-05-05 01:17:50 +02:00
if ( sWorld . getConfig ( CONFIG_ARENA_SEASON_ID ) < 6 )
newmember . personal_rating = 1500 ;
2009-07-30 12:59:59 +02:00
else
2010-05-05 01:17:50 +02:00
if ( GetRating () >= 1000 )
newmember . personal_rating = 1000 ;
2009-07-30 12:59:59 +02:00
}
2010-05-04 16:53:19 +02:00
2009-07-31 11:22:27 +08:00
m_members . push_back ( newmember );
2009-10-17 15:51:44 -07:00
2010-04-07 22:59:46 +02:00
CharacterDatabase . PExecute ( "INSERT INTO arena_team_member (arenateamid, guid, personal_rating) VALUES ('%u', '%u', '%u')" , m_TeamId , GUID_LOPART ( newmember . guid ), newmember . personal_rating );
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if ( pl )
2008-10-02 16:23:55 -05:00
{
2009-12-17 10:35:35 +01:00
pl -> SetInArenaTeam ( m_TeamId , GetSlot (), GetType ());
2008-10-02 16:23:55 -05:00
pl -> SetArenaTeamIdInvited ( 0 );
2010-04-11 11:08:26 +04:00
pl -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_PERSONAL_RATING , newmember . personal_rating );
2009-10-17 15:51:44 -07:00
2008-11-30 12:47:26 -06:00
// hide promote/remove buttons
2010-04-07 19:14:10 +02:00
if ( m_CaptainGuid != PlayerGuid )
2010-04-11 11:08:26 +04:00
pl -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_MEMBER , 1 );
2009-06-07 10:23:50 -05:00
sLog . outArena ( "Player: %s [GUID: %u] joined arena team type: %u [Id: %u]." , pl -> GetName (), pl -> GetGUIDLow (), GetType (), GetId ());
2008-11-30 12:47:26 -06:00
}
2008-10-02 16:23:55 -05:00
return true ;
}
2009-10-17 15:51:44 -07:00
2010-02-18 02:42:59 +01:00
bool ArenaTeam :: LoadArenaTeamFromDB ( QueryResult_AutoPtr arenaTeamDataResult )
2008-10-02 16:23:55 -05:00
{
2010-04-07 19:14:10 +02:00
if ( ! arenaTeamDataResult )
2008-10-02 16:23:55 -05:00
return false ;
2009-10-17 15:51:44 -07:00
2010-02-18 02:42:59 +01:00
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 ();
//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 ();
2010-04-07 18:09:10 +02:00
2008-10-02 16:23:55 -05:00
return true ;
}
2009-10-17 15:51:44 -07:00
2010-02-18 02:42:59 +01:00
bool ArenaTeam :: LoadMembersFromDB ( QueryResult_AutoPtr arenaTeamMembersResult )
2008-10-02 16:23:55 -05:00
{
2010-04-07 19:14:10 +02:00
if ( ! arenaTeamMembersResult )
2010-02-18 02:42:59 +01:00
return false ;
2009-10-17 15:51:44 -07:00
2010-02-18 02:42:59 +01:00
bool captainPresentInTeam = false ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
do
{
2010-02-18 02:42:59 +01:00
Field * fields = arenaTeamMembersResult -> Fetch ();
//prevent crash if db records are broken, when all members in result are already processed and current team hasn't got any members
if ( ! fields )
break ;
2010-04-07 17:24:07 +02:00
uint32 arenaTeamId = fields [ 0 ]. GetUInt32 ();
2010-02-18 02:42:59 +01:00
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 ;
2008-10-02 16:23:55 -05:00
ArenaTeamMember newmember ;
2010-02-18 02:42:59 +01:00
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 ;
2009-07-31 11:22:27 +08:00
m_members . push_back ( newmember );
2010-02-18 02:42:59 +01:00
} while ( arenaTeamMembersResult -> NextRow ());
2010-04-07 19:14:10 +02:00
if ( Empty () || ! captainPresentInTeam )
2010-02-18 02:42:59 +01:00
{
// 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 ;
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
void ArenaTeam :: SetCaptain ( const uint64 & guid )
2008-10-02 16:23:55 -05:00
{
// disable remove/promote buttons
Player * oldcaptain = objmgr . GetPlayer ( GetCaptain ());
2010-04-07 19:14:10 +02:00
if ( oldcaptain )
2010-04-11 11:08:26 +04:00
oldcaptain -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_MEMBER , 1 );
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// set new captain
2009-07-31 11:22:27 +08:00
m_CaptainGuid = guid ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// update database
2009-11-04 18:44:06 -08:00
CharacterDatabase . PExecute ( "UPDATE arena_team SET captainguid = '%u' WHERE arenateamid = '%u'" , GUID_LOPART ( guid ), GetId ());
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// enable remove/promote buttons
Player * newcaptain = objmgr . GetPlayer ( guid );
2010-04-07 19:14:10 +02:00
if ( newcaptain )
2009-06-01 20:44:23 +02:00
{
2010-04-11 11:08:26 +04:00
newcaptain -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_MEMBER , 0 );
2009-11-04 18:44:06 -08:00
sLog . outArena ( "Player: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team [Id: %u] [Type: %u]." , oldcaptain -> GetName (), oldcaptain -> GetGUIDLow (), newcaptain -> GetName (), newcaptain -> GetGUIDLow (), GetId (), GetType ());
2009-06-01 20:44:23 +02:00
}
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: DelMember ( uint64 guid )
{
2009-07-31 11:22:27 +08:00
for ( MemberList :: iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-02 16:23:55 -05:00
if ( itr -> guid == guid )
{
2009-07-31 11:22:27 +08:00
m_members . erase ( itr );
2008-10-02 16:23:55 -05:00
break ;
}
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if ( Player * player = objmgr . GetPlayer ( guid ))
2008-10-02 16:23:55 -05:00
{
player -> GetSession () -> SendArenaTeamCommandResult ( ERR_ARENA_TEAM_QUIT_S , GetName (), "" , 0 );
2008-10-05 08:48:32 -05:00
// delete all info regarding this team
2010-04-07 19:12:44 +02:00
for ( uint32 i = 0 ; i < ARENA_TEAM_END ; ++ i )
2010-04-11 11:08:26 +04:00
player -> SetArenaTeamInfoField ( GetSlot (), ArenaTeamInfoType ( i ), 0 );
2009-06-07 10:23:50 -05:00
sLog . outArena ( "Player: %s [GUID: %u] left arena team type: %u [Id: %u]." , player -> GetName (), player -> GetGUIDLow (), GetType (), GetId ());
2008-10-02 16:23:55 -05:00
}
2008-10-05 08:48:32 -05:00
CharacterDatabase . PExecute ( "DELETE FROM arena_team_member WHERE arenateamid = '%u' AND guid = '%u'" , GetId (), GUID_LOPART ( guid ));
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: Disband ( WorldSession * session )
{
// event
2010-02-18 02:42:59 +01:00
if ( session )
2010-04-11 20:20:38 +02:00
// probably only 1 string required...
2010-04-11 11:06:51 +04:00
BroadcastEvent ( ERR_ARENA_TEAM_DISBANDED_S , 0 , 2 , session -> GetPlayerName (), GetName (), "" );
2009-10-17 15:51:44 -07:00
2009-07-31 11:22:27 +08:00
while ( ! m_members . empty ())
2008-12-19 16:05:13 -06:00
// Removing from members is done in DelMember.
2009-07-31 11:22:27 +08:00
DelMember ( m_members . front (). guid );
2010-04-07 18:09:10 +02:00
2010-02-18 02:42:59 +01:00
if ( session )
2010-04-07 19:14:10 +02:00
if ( Player * player = session -> GetPlayer ())
2010-02-18 02:42:59 +01:00
sLog . outArena ( "Player: %s [GUID: %u] disbanded arena team type: %u [Id: %u]." , player -> GetName (), player -> GetGUIDLow (), GetType (), GetId ());
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
CharacterDatabase . BeginTransaction ();
2009-07-31 11:22:27 +08:00
CharacterDatabase . PExecute ( "DELETE FROM arena_team WHERE arenateamid = '%u'" , m_TeamId );
CharacterDatabase . PExecute ( "DELETE FROM arena_team_member WHERE arenateamid = '%u'" , m_TeamId ); //< this should be alredy done by calling DelMember(memberGuids[j]); for each member
CharacterDatabase . PExecute ( "DELETE FROM arena_team_stats WHERE arenateamid = '%u'" , m_TeamId );
2008-10-02 16:23:55 -05:00
CharacterDatabase . CommitTransaction ();
2009-07-31 11:22:27 +08:00
objmgr . RemoveArenaTeam ( m_TeamId );
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: Roster ( WorldSession * session )
{
Player * pl = NULL ;
2009-10-17 15:51:44 -07:00
2009-01-30 19:22:49 -06:00
uint8 unk308 = 0 ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data ( SMSG_ARENA_TEAM_ROSTER , 100 );
2009-07-31 11:22:27 +08:00
data << uint32 ( GetId ()); // team id
2009-01-30 19:22:49 -06:00
data << uint8 ( unk308 ); // 308 unknown value but affect packet structure
2008-10-02 16:23:55 -05:00
data << uint32 ( GetMembersSize ()); // members count
data << uint32 ( GetType ()); // arena team type?
2009-10-17 15:51:44 -07:00
2009-07-31 11:22:27 +08:00
for ( MemberList :: const_iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-02 16:23:55 -05:00
{
pl = objmgr . GetPlayer ( itr -> guid );
2009-10-17 15:51:44 -07:00
2009-01-30 19:22:49 -06:00
data << uint64 ( itr -> guid ); // guid
data << uint8 (( pl ? 1 : 0 )); // online flag
data << itr -> name ; // member name
2008-12-19 16:05:13 -06:00
data << uint32 (( itr -> guid == GetCaptain () ? 0 : 1 )); // captain flag 0 captain 1 member
2009-01-30 19:22:49 -06:00
data << uint8 (( pl ? pl -> getLevel () : 0 )); // unknown, level?
data << uint8 ( itr -> Class ); // class
data << uint32 ( itr -> games_week ); // played this week
data << uint32 ( itr -> wins_week ); // wins this week
data << uint32 ( itr -> games_season ); // played this season
data << uint32 ( itr -> wins_season ); // wins this season
data << uint32 ( itr -> personal_rating ); // personal rating
2010-04-07 19:14:10 +02:00
if ( unk308 )
2009-01-30 19:22:49 -06:00
{
data << float ( 0.0 ); // 308 unk
data << float ( 0.0 ); // 308 unk
}
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
session -> SendPacket ( & data );
sLog . outDebug ( "WORLD: Sent SMSG_ARENA_TEAM_ROSTER" );
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: Query ( WorldSession * session )
{
WorldPacket data ( SMSG_ARENA_TEAM_QUERY_RESPONSE , 4 * 7 + GetName (). size () + 1 );
data << uint32 ( GetId ()); // team id
data << GetName (); // team name
data << uint32 ( GetType ()); // arena team type (2=2x2, 3=3x3 or 5=5x5)
2009-07-31 11:22:27 +08:00
data << uint32 ( m_BackgroundColor ); // background color
data << uint32 ( m_EmblemStyle ); // emblem style
data << uint32 ( m_EmblemColor ); // emblem color
data << uint32 ( m_BorderStyle ); // border style
data << uint32 ( m_BorderColor ); // border color
2008-10-02 16:23:55 -05:00
session -> SendPacket ( & data );
sLog . outDebug ( "WORLD: Sent SMSG_ARENA_TEAM_QUERY_RESPONSE" );
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: Stats ( WorldSession * session )
{
WorldPacket data ( SMSG_ARENA_TEAM_STATS , 4 * 7 );
2009-07-31 11:22:27 +08:00
data << uint32 ( GetId ()); // team id
data << uint32 ( m_stats . rating ); // rating
data << uint32 ( m_stats . games_week ); // games this week
data << uint32 ( m_stats . wins_week ); // wins this week
data << uint32 ( m_stats . games_season ); // played this season
data << uint32 ( m_stats . wins_season ); // wins this season
data << uint32 ( m_stats . rank ); // rank
2008-10-02 16:23:55 -05:00
session -> SendPacket ( & data );
}
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
void ArenaTeam :: NotifyStatsChanged ()
{
// this is called after a rated match ended
// updates arena team stats for every member of the team (not only the ones who participated!)
2009-10-17 16:20:24 -07:00
for ( MemberList :: const_iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-05 08:48:32 -05:00
{
2008-12-19 16:05:13 -06:00
Player * plr = objmgr . GetPlayer ( itr -> guid );
2010-04-07 19:14:10 +02:00
if ( plr )
2008-10-05 08:48:32 -05:00
Stats ( plr -> GetSession ());
}
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: InspectStats ( WorldSession * session , uint64 guid )
{
2008-11-30 12:47:26 -06:00
ArenaTeamMember * member = GetMember ( guid );
2010-04-07 19:14:10 +02:00
if ( ! member )
2008-11-30 12:47:26 -06:00
return ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data ( MSG_INSPECT_ARENA_TEAMS , 8 + 1 + 4 * 6 );
data << uint64 ( guid ); // player guid
data << uint8 ( GetSlot ()); // slot (0...2)
data << uint32 ( GetId ()); // arena team id
2009-07-31 11:22:27 +08:00
data << uint32 ( m_stats . rating ); // rating
data << uint32 ( m_stats . games_season ); // season played
data << uint32 ( m_stats . wins_season ); // season wins
2008-12-19 16:05:13 -06:00
data << uint32 ( member -> games_season ); // played (count of all games, that the inspected member participated...)
data << uint32 ( member -> personal_rating ); // personal rating
2008-10-02 16:23:55 -05:00
session -> SendPacket ( & data );
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: SetEmblem ( uint32 backgroundColor , uint32 emblemStyle , uint32 emblemColor , uint32 borderStyle , uint32 borderColor )
{
2009-07-31 11:22:27 +08:00
m_BackgroundColor = backgroundColor ;
m_EmblemStyle = emblemStyle ;
m_EmblemColor = emblemColor ;
m_BorderStyle = borderStyle ;
m_BorderColor = borderColor ;
2009-10-17 15:51:44 -07:00
2009-07-31 11:25:00 +08:00
CharacterDatabase . PExecute ( "UPDATE arena_team SET BackgroundColor='%u', EmblemStyle='%u', EmblemColor='%u', BorderStyle='%u', BorderColor='%u' WHERE arenateamid='%u'" , m_BackgroundColor , m_EmblemStyle , m_EmblemColor , m_BorderStyle , m_BorderColor , m_TeamId );
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: SetStats ( uint32 stat_type , uint32 value )
{
switch ( stat_type )
{
case STAT_TYPE_RATING :
2009-07-31 11:22:27 +08:00
m_stats . rating = value ;
2008-10-02 16:23:55 -05:00
CharacterDatabase . PExecute ( "UPDATE arena_team_stats SET rating = '%u' WHERE arenateamid = '%u'" , value , GetId ());
break ;
2008-11-30 12:47:26 -06:00
case STAT_TYPE_GAMES_WEEK :
2009-07-31 11:22:27 +08:00
m_stats . games_week = value ;
2008-10-02 16:23:55 -05:00
CharacterDatabase . PExecute ( "UPDATE arena_team_stats SET games = '%u' WHERE arenateamid = '%u'" , value , GetId ());
break ;
2008-11-30 12:47:26 -06:00
case STAT_TYPE_WINS_WEEK :
2009-07-31 11:22:27 +08:00
m_stats . wins_week = value ;
2008-10-02 16:23:55 -05:00
CharacterDatabase . PExecute ( "UPDATE arena_team_stats SET wins = '%u' WHERE arenateamid = '%u'" , value , GetId ());
break ;
2008-11-30 12:47:26 -06:00
case STAT_TYPE_GAMES_SEASON :
2009-07-31 11:22:27 +08:00
m_stats . games_season = value ;
2008-10-02 16:23:55 -05:00
CharacterDatabase . PExecute ( "UPDATE arena_team_stats SET played = '%u' WHERE arenateamid = '%u'" , value , GetId ());
break ;
2008-11-30 12:47:26 -06:00
case STAT_TYPE_WINS_SEASON :
2009-07-31 11:22:27 +08:00
m_stats . wins_season = value ;
2008-10-02 16:23:55 -05:00
CharacterDatabase . PExecute ( "UPDATE arena_team_stats SET wins2 = '%u' WHERE arenateamid = '%u'" , value , GetId ());
break ;
case STAT_TYPE_RANK :
2009-07-31 11:22:27 +08:00
m_stats . rank = value ;
2008-10-02 16:23:55 -05:00
CharacterDatabase . PExecute ( "UPDATE arena_team_stats SET rank = '%u' WHERE arenateamid = '%u'" , value , GetId ());
break ;
default :
sLog . outDebug ( "unknown stat type in ArenaTeam::SetStats() %u" , stat_type );
break ;
}
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void ArenaTeam :: BroadcastPacket ( WorldPacket * packet )
{
2009-07-31 11:22:27 +08:00
for ( MemberList :: const_iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-02 16:23:55 -05:00
{
Player * player = objmgr . GetPlayer ( itr -> guid );
2010-04-07 19:14:10 +02:00
if ( player )
2008-10-02 16:23:55 -05:00
player -> GetSession () -> SendPacket ( packet );
}
}
2009-10-17 15:51:44 -07:00
2010-04-11 20:20:38 +02:00
void ArenaTeam :: BroadcastEvent ( ArenaTeamEvents event , uint64 guid , uint8 strCount , std :: string str1 , std :: string str2 , std :: string str3 )
{
WorldPacket data ( SMSG_ARENA_TEAM_EVENT , 1 + 1 + 1 );
data << uint8 ( event );
data << uint8 ( strCount );
switch ( strCount )
{
case 0 :
break ;
case 1 :
data << str1 ;
break ;
case 2 :
data << str1 << str2 ;
break ;
case 3 :
data << str1 << str2 << str3 ;
break ;
default :
sLog . outError ( "Unhandled strCount %u in ArenaTeam::BroadcastEvent" , strCount );
return ;
2010-04-11 11:06:51 +04:00
}
2010-04-11 20:20:38 +02:00
if ( guid )
data << uint64 ( guid );
BroadcastPacket ( & data );
sLog . outDebug ( "WORLD: Sent SMSG_ARENA_TEAM_EVENT" );
}
2010-04-11 11:06:51 +04:00
2010-04-07 22:59:46 +02:00
uint8 ArenaTeam :: GetSlotByType ( uint32 type )
2008-10-02 16:23:55 -05:00
{
switch ( type )
{
case ARENA_TEAM_2v2 : return 0 ;
case ARENA_TEAM_3v3 : return 1 ;
case ARENA_TEAM_5v5 : return 2 ;
default :
break ;
}
2008-12-19 16:05:13 -06:00
sLog . outError ( "FATAL: Unknown arena team type %u for some arena team" , type );
2008-10-02 16:23:55 -05:00
return 0xFF ;
}
2009-10-17 15:51:44 -07:00
2010-04-07 22:59:46 +02:00
bool ArenaTeam :: HaveMember ( const uint64 & guid ) const
2008-10-02 16:23:55 -05:00
{
2009-07-31 11:22:27 +08:00
for ( MemberList :: const_iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2010-04-07 19:14:10 +02:00
if ( itr -> guid == guid )
2008-10-02 16:23:55 -05:00
return true ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
return false ;
}
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
uint32 ArenaTeam :: GetPoints ( uint32 MemberRating )
{
// returns how many points would be awarded with this team type with this rating
float points ;
2009-10-17 15:51:44 -07:00
2009-07-31 11:22:27 +08:00
uint32 rating = MemberRating + 150 < m_stats . rating ? MemberRating : m_stats . rating ;
2009-10-17 15:51:44 -07:00
2010-04-07 23:56:35 +02:00
if ( rating <= 1500 )
2010-03-20 17:51:23 +01:00
{
2010-04-21 19:08:39 +02:00
if ( sWorld . getConfig ( CONFIG_ARENA_SEASON_ID ) < 6 )
2010-03-20 17:51:23 +01:00
points = ( float ) rating * 0.22f + 14.0f ;
else
points = 344 ;
}
2008-10-05 08:48:32 -05:00
else
points = 1511.26f / ( 1.0f + 1639.28f * exp ( - 0.00412f * ( float ) rating ));
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
// type penalties for <5v5 teams
2010-03-20 17:51:23 +01:00
if ( m_Type == ARENA_TEAM_2v2 )
2008-10-05 08:48:32 -05:00
points *= 0.76f ;
2010-03-20 17:51:23 +01:00
else if ( m_Type == ARENA_TEAM_3v3 )
2008-10-05 08:48:32 -05:00
points *= 0.88f ;
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
return ( uint32 ) points ;
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
float ArenaTeam :: GetChanceAgainst ( uint32 own_rating , uint32 enemy_rating )
2008-10-05 08:48:32 -05:00
{
// returns the chance to win against a team with the given rating, used in the rating adjustment calculation
// ELO system
2009-10-17 15:51:44 -07:00
2009-07-30 12:59:59 +02:00
if ( sWorld . getConfig ( CONFIG_ARENA_SEASON_ID ) >= 6 )
2009-12-17 10:35:35 +01:00
if ( enemy_rating < 1000 )
enemy_rating = 1000 ;
2008-12-19 16:05:13 -06:00
return 1.0f / ( 1.0f + exp ( log ( 10.0f ) * ( float )(( float ) enemy_rating - ( float ) own_rating ) / 400.0f ));
2008-10-05 08:48:32 -05:00
}
2009-10-17 15:51:44 -07:00
2009-07-30 12:59:59 +02:00
void ArenaTeam :: FinishGame ( int32 mod )
2008-10-05 08:48:32 -05:00
{
2009-07-31 11:22:27 +08:00
if ( int32 ( m_stats . rating ) + mod < 0 )
m_stats . rating = 0 ;
2009-07-30 12:59:59 +02:00
else
2009-07-31 11:22:27 +08:00
m_stats . rating += mod ;
2009-10-17 15:51:44 -07:00
2009-07-31 11:22:27 +08:00
m_stats . games_week += 1 ;
m_stats . games_season += 1 ;
2009-07-30 12:59:59 +02:00
// update team's rank
2009-07-31 11:22:27 +08:00
m_stats . rank = 1 ;
2009-04-29 00:26:07 -05:00
ObjectMgr :: ArenaTeamMap :: const_iterator i = objmgr . GetArenaTeamMapBegin ();
2009-10-17 16:20:24 -07:00
for (; i != objmgr . GetArenaTeamMapEnd (); ++ i )
2008-10-05 08:48:32 -05:00
{
2009-07-31 11:22:27 +08:00
if ( i -> second -> GetType () == m_Type && i -> second -> GetStats (). rating > m_stats . rating )
++ m_stats . rank ;
2008-10-05 08:48:32 -05:00
}
2009-07-30 12:59:59 +02:00
}
2009-10-17 15:51:44 -07:00
2009-07-30 12:59:59 +02:00
int32 ArenaTeam :: WonAgainst ( uint32 againstRating )
{
// called when the team has won
2009-12-17 10:35:35 +01:00
// 'chance' calculation - to beat the opponent
2009-07-31 11:22:27 +08:00
float chance = GetChanceAgainst ( m_stats . rating , againstRating );
2009-12-17 10:35:35 +01:00
float K = ( m_stats . rating < 1000 ) ? 48.0f : 32.0f ;
// calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
int32 mod = ( int32 ) floor ( K * ( 1.0f - chance ));
2009-07-30 12:59:59 +02:00
// modify the team stats accordingly
FinishGame ( mod );
2009-07-31 11:22:27 +08:00
m_stats . wins_week += 1 ;
m_stats . wins_season += 1 ;
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
// return the rating change, used to display it on the results screen
return mod ;
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
int32 ArenaTeam :: LostAgainst ( uint32 againstRating )
2008-10-05 08:48:32 -05:00
{
2008-12-19 16:05:13 -06:00
// called when the team has lost
//'chance' calculation - to loose to the opponent
2009-07-31 11:22:27 +08:00
float chance = GetChanceAgainst ( m_stats . rating , againstRating );
2010-04-21 19:08:39 +02:00
if ( m_stats . rating < 1000 )
{
FinishGame ( 0 );
return 0 ;
}
float K = 32.0f ;
2009-12-17 10:35:35 +01:00
int32 mod = ( int32 ) ceil ( K * ( 0.0f - chance ));
2008-10-05 08:48:32 -05:00
// modify the team stats accordingly
2009-07-30 12:59:59 +02:00
FinishGame ( mod );
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
// return the rating change, used to display it on the results screen
2008-10-05 08:48:32 -05:00
return mod ;
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
void ArenaTeam :: MemberLost ( Player * plr , uint32 againstRating )
2008-10-05 08:48:32 -05:00
{
// called for each participant of a match after losing
2009-10-17 16:20:24 -07:00
for ( MemberList :: iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-05 08:48:32 -05:00
{
2010-04-07 19:14:10 +02:00
if ( itr -> guid == plr -> GetGUID ())
2008-10-05 08:48:32 -05:00
{
// update personal rating
2008-12-19 16:05:13 -06:00
float chance = GetChanceAgainst ( itr -> personal_rating , againstRating );
2009-12-17 10:35:35 +01:00
float K = ( itr -> personal_rating < 1000 ) ? 48.0f : 32.0f ;
// calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
int32 mod = ( int32 ) ceil ( K * ( 0.0f - chance ));
2008-12-19 16:05:13 -06:00
itr -> ModifyPersonalRating ( plr , mod , GetSlot ());
2008-10-05 08:48:32 -05:00
// update personal played stats
2008-11-30 12:47:26 -06:00
itr -> games_week += 1 ;
itr -> games_season += 1 ;
2008-10-05 08:48:32 -05:00
// update the unit fields
2010-04-11 11:08:26 +04:00
plr -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_GAMES_WEEK , itr -> games_week );
plr -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_GAMES_SEASON , itr -> games_season );
2008-10-05 08:48:32 -05:00
return ;
}
}
}
2009-10-17 15:51:44 -07:00
2009-03-09 17:07:40 -06:00
void ArenaTeam :: OfflineMemberLost ( uint64 guid , uint32 againstRating )
{
// called for offline player after ending rated arena match!
2009-10-17 16:20:24 -07:00
for ( MemberList :: iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2009-03-09 17:07:40 -06:00
{
2010-04-07 19:14:10 +02:00
if ( itr -> guid == guid )
2009-03-09 17:07:40 -06:00
{
// update personal rating
float chance = GetChanceAgainst ( itr -> personal_rating , againstRating );
2009-12-17 10:35:35 +01:00
float K = ( itr -> personal_rating < 1000 ) ? 48.0f : 32.0f ;
// calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
int32 mod = ( int32 ) ceil ( K * ( 0.0f - chance ));
2009-03-09 17:07:40 -06:00
if ( int32 ( itr -> personal_rating ) + mod < 0 )
itr -> personal_rating = 0 ;
else
itr -> personal_rating += mod ;
// update personal played stats
itr -> games_week += 1 ;
itr -> games_season += 1 ;
return ;
}
}
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
void ArenaTeam :: MemberWon ( Player * plr , uint32 againstRating )
2008-10-05 08:48:32 -05:00
{
// called for each participant after winning a match
2009-10-17 16:20:24 -07:00
for ( MemberList :: iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-05 08:48:32 -05:00
{
2010-04-07 19:14:10 +02:00
if ( itr -> guid == plr -> GetGUID ())
2008-10-05 08:48:32 -05:00
{
// update personal rating
2008-12-19 16:05:13 -06:00
float chance = GetChanceAgainst ( itr -> personal_rating , againstRating );
2009-12-17 10:35:35 +01:00
float K = ( itr -> personal_rating < 1000 ) ? 48.0f : 32.0f ;
// calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
int32 mod = ( int32 ) floor ( K * ( 1.0f - chance ));
2008-12-19 16:05:13 -06:00
itr -> ModifyPersonalRating ( plr , mod , GetSlot ());
2008-10-05 08:48:32 -05:00
// update personal stats
2008-11-30 12:47:26 -06:00
itr -> games_week += 1 ;
itr -> games_season += 1 ;
itr -> wins_season += 1 ;
itr -> wins_week += 1 ;
2008-10-05 08:48:32 -05:00
// update unit fields
2010-04-11 20:20:38 +02:00
plr -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_GAMES_WEEK , itr -> games_week );
2010-04-11 11:08:26 +04:00
plr -> SetArenaTeamInfoField ( GetSlot (), ARENA_TEAM_GAMES_SEASON , itr -> games_season );
2008-10-05 08:48:32 -05:00
return ;
}
}
}
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
void ArenaTeam :: UpdateArenaPointsHelper ( std :: map < uint32 , uint32 >& PlayerPoints )
2008-10-05 08:48:32 -05:00
{
// called after a match has ended and the stats are already modified
// helper function for arena point distribution (this way, when distributing, no actual calculation is required, just a few comparisons)
// 10 played games per week is a minimum
2009-07-31 11:22:27 +08:00
if ( m_stats . games_week < 10 )
2008-10-05 08:48:32 -05:00
return ;
// to get points, a player has to participate in at least 30% of the matches
2009-07-31 11:22:27 +08:00
uint32 min_plays = ( uint32 ) ceil ( m_stats . games_week * 0.3 );
2009-10-17 16:20:24 -07:00
for ( MemberList :: const_iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-05 08:48:32 -05:00
{
// the player participated in enough games, update his points
2008-12-19 16:05:13 -06:00
uint32 points_to_add = 0 ;
if ( itr -> games_week >= min_plays )
points_to_add = GetPoints ( itr -> personal_rating );
2009-07-31 11:22:27 +08:00
// OBSOLETE : CharacterDatabase.PExecute("UPDATE arena_team_member SET points_to_add = '%u' WHERE arenateamid = '%u' AND guid = '%u'", points_to_add, m_TeamId, itr->guid);
2009-10-17 15:51:44 -07:00
2008-12-19 16:05:13 -06:00
std :: map < uint32 , uint32 >:: iterator plr_itr = PlayerPoints . find ( GUID_LOPART ( itr -> guid ));
if ( plr_itr != PlayerPoints . end ())
2008-10-05 08:48:32 -05:00
{
2008-12-19 16:05:13 -06:00
//check if there is already more points
if ( plr_itr -> second < points_to_add )
PlayerPoints [ GUID_LOPART ( itr -> guid )] = points_to_add ;
2008-10-05 08:48:32 -05:00
}
else
2008-12-19 16:05:13 -06:00
PlayerPoints [ GUID_LOPART ( itr -> guid )] = points_to_add ;
2008-10-05 08:48:32 -05:00
}
}
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
void ArenaTeam :: SaveToDB ()
{
// save team and member stats to db
2008-12-19 16:05:13 -06:00
// called after a match has ended, or when calculating arena_points
2009-02-24 11:14:28 -06:00
CharacterDatabase . BeginTransaction ();
2009-07-31 11:22:27 +08:00
CharacterDatabase . PExecute ( "UPDATE arena_team_stats SET rating = '%u',games = '%u',played = '%u',rank = '%u',wins = '%u',wins2 = '%u' WHERE arenateamid = '%u'" , m_stats . rating , m_stats . games_week , m_stats . games_season , m_stats . rank , m_stats . wins_week , m_stats . wins_season , GetId ());
2009-10-17 16:20:24 -07:00
for ( MemberList :: const_iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-05 08:48:32 -05:00
{
2009-07-31 11:22:27 +08:00
CharacterDatabase . PExecute ( "UPDATE arena_team_member SET played_week = '%u', wons_week = '%u', played_season = '%u', wons_season = '%u', personal_rating = '%u' WHERE arenateamid = '%u' AND guid = '%u'" , itr -> games_week , itr -> wins_week , itr -> games_season , itr -> wins_season , itr -> personal_rating , m_TeamId , GUID_LOPART ( itr -> guid ));
2008-10-05 08:48:32 -05:00
}
2009-02-24 11:14:28 -06:00
CharacterDatabase . CommitTransaction ();
2008-10-05 08:48:32 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-05 08:48:32 -05:00
void ArenaTeam :: FinishWeek ()
{
2009-07-31 11:22:27 +08:00
m_stats . games_week = 0 ; // played this week
m_stats . wins_week = 0 ; // wins this week
2009-10-17 16:20:24 -07:00
for ( MemberList :: iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2008-10-05 08:48:32 -05:00
{
2008-11-30 12:47:26 -06:00
itr -> games_week = 0 ;
itr -> wins_week = 0 ;
2008-10-05 08:48:32 -05:00
}
}
2009-10-17 15:51:44 -07:00
2009-02-09 22:08:06 -06:00
bool ArenaTeam :: IsFighting () const
{
2009-07-31 11:22:27 +08:00
for ( MemberList :: const_iterator itr = m_members . begin (); itr != m_members . end (); ++ itr )
2009-02-09 22:08:06 -06:00
if ( Player * p = objmgr . GetPlayer ( itr -> guid ))
if ( p -> GetMap () -> IsBattleArena ())
return true ;
return false ;
}