2010-08-28 13:47:52 +00:00
|
|
|
#include "teams.h"
|
|
|
|
|
|
|
|
|
2010-08-30 12:13:43 +00:00
|
|
|
CGameTeams::CGameTeams(CGameContext *pGameContext) : m_pGameContext(pGameContext) {
|
2010-08-28 13:47:52 +00:00
|
|
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
|
|
|
m_TeamState[i] = EMPTY;
|
|
|
|
m_TeeFinished[i] = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-30 12:13:43 +00:00
|
|
|
void CGameTeams::OnCharacterStart(int id) {
|
2010-08-28 20:53:42 +00:00
|
|
|
int Tick = Server()->Tick();
|
2010-09-14 18:28:50 +00:00
|
|
|
if(m_Core.Team(id) == TEAM_FLOCK || m_Core.Team(id) == TEAM_SUPER) {
|
2010-08-28 20:53:42 +00:00
|
|
|
CCharacter* Char = Character(id);
|
|
|
|
Char->m_RaceState = RACE_STARTED;
|
|
|
|
Char->m_StartTime = Tick;
|
|
|
|
Char->m_RefreshTime = Tick;
|
|
|
|
} else {
|
2010-08-30 12:13:43 +00:00
|
|
|
if(m_TeamState[m_Core.Team(id)] <= CLOSED) {
|
|
|
|
ChangeTeamState(m_Core.Team(id), STARTED);
|
2010-08-28 20:53:42 +00:00
|
|
|
|
|
|
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
2010-08-30 12:13:43 +00:00
|
|
|
if(m_Core.SameTeam(i, id)) {
|
2010-08-28 20:53:42 +00:00
|
|
|
CCharacter* Char = Character(i);
|
2010-08-28 13:47:52 +00:00
|
|
|
|
2010-08-28 20:53:42 +00:00
|
|
|
Char->m_RaceState = RACE_STARTED;
|
|
|
|
Char->m_StartTime = Tick;
|
|
|
|
Char->m_RefreshTime = Tick;
|
|
|
|
}
|
2010-08-28 13:47:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-30 12:13:43 +00:00
|
|
|
void CGameTeams::OnCharacterFinish(int id) {
|
2010-09-14 18:28:50 +00:00
|
|
|
if(m_Core.Team(id) == TEAM_FLOCK || m_Core.Team(id) == TEAM_SUPER) {
|
2010-08-28 20:53:42 +00:00
|
|
|
Character(id)->OnFinish();
|
2010-08-28 13:47:52 +00:00
|
|
|
} else {
|
|
|
|
m_TeeFinished[id] = true;
|
2010-08-30 12:13:43 +00:00
|
|
|
if(TeamFinished(m_Core.Team(id))) {
|
|
|
|
ChangeTeamState(m_Core.Team(id), FINISHED);//TODO: Make it better
|
2010-08-28 20:53:42 +00:00
|
|
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
2010-08-30 12:13:43 +00:00
|
|
|
if(m_Core.SameTeam(i, id)) {
|
2010-08-28 20:53:42 +00:00
|
|
|
CCharacter * Char = Character(i);
|
|
|
|
if(Char != 0) {
|
|
|
|
Char->OnFinish();
|
|
|
|
m_TeeFinished[i] = false;
|
|
|
|
} //else {
|
2010-08-30 12:13:43 +00:00
|
|
|
// m_Core.Team(id) = 0; //i saw zomby =)
|
2010-08-28 20:53:42 +00:00
|
|
|
//}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-28 13:47:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-30 12:13:43 +00:00
|
|
|
bool CGameTeams::SetCharacterTeam(int id, int Team) {
|
2010-08-28 13:47:52 +00:00
|
|
|
//TODO: Send error message
|
2010-09-14 18:28:50 +00:00
|
|
|
if(id < 0 || id >= MAX_CLIENTS || Team < 0 || Team >= MAX_CLIENTS + 1) {
|
2010-08-28 13:47:52 +00:00
|
|
|
return false;
|
|
|
|
}
|
2010-09-14 18:28:50 +00:00
|
|
|
if(Team != TEAM_SUPER && m_TeamState[Team] >= CLOSED) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(m_Core.Team(id) == TEAM_SUPER) {
|
2010-08-28 13:47:52 +00:00
|
|
|
return false;
|
|
|
|
}
|
2010-09-14 17:05:18 +00:00
|
|
|
if(Character(id)->m_RaceState != RACE_NONE) {
|
2010-09-14 18:28:50 +00:00
|
|
|
if(Team == TEAM_FLOCK && m_Core.Team(id) != TEAM_FLOCK) {
|
2010-09-14 17:05:18 +00:00
|
|
|
Character(id)->GetPlayer()->KillCharacter(WEAPON_GAME);
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2010-09-14 18:28:50 +00:00
|
|
|
if(m_Core.Team(id) != TEAM_FLOCK && m_Core.Team(id) != TEAM_SUPER && m_TeamState[m_Core.Team(id)] != EMPTY) {
|
2010-08-28 20:53:42 +00:00
|
|
|
bool NoOneInOldTeam = true;
|
|
|
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
2010-09-11 20:45:56 +00:00
|
|
|
if(i != id && m_Core.SameTeam(i, id)) {
|
2010-08-28 20:53:42 +00:00
|
|
|
NoOneInOldTeam = false;//all good exists someone in old team
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(NoOneInOldTeam) {
|
2010-08-30 12:13:43 +00:00
|
|
|
m_TeamState[m_Core.Team(id)] = EMPTY;
|
2010-08-28 20:53:42 +00:00
|
|
|
}
|
2010-08-28 13:47:52 +00:00
|
|
|
}
|
2010-08-30 12:13:43 +00:00
|
|
|
m_Core.Team(id, Team);
|
2010-09-14 18:28:50 +00:00
|
|
|
if(Team != TEAM_SUPER && m_TeamState[Team] == EMPTY) {
|
2010-08-28 13:47:52 +00:00
|
|
|
ChangeTeamState(Team, OPEN);
|
|
|
|
}
|
2010-09-12 18:11:25 +00:00
|
|
|
//GameServer()->CreatePlayerSpawn(Character(id)->m_Core.m_Pos, TeamMask());
|
2010-09-11 20:45:56 +00:00
|
|
|
if(Character(id)->GetPlayer()->m_IsUsingRaceClient)
|
|
|
|
{
|
|
|
|
CNetMsg_Sv_PlayerTeam Msg;
|
|
|
|
Msg.m_Team = Team;
|
|
|
|
Msg.m_Cid = id;
|
|
|
|
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1);
|
2010-09-14 18:28:50 +00:00
|
|
|
//char aBuf[512];
|
|
|
|
//str_format(aBuf, sizeof(aBuf), "Id = %d Team = %d", id, Team);
|
|
|
|
//dbg_msg("Teams", aBuf);
|
2010-09-11 20:45:56 +00:00
|
|
|
}
|
2010-08-28 13:47:52 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-08-30 12:13:43 +00:00
|
|
|
void CGameTeams::ChangeTeamState(int Team, int State) {
|
2010-08-28 13:47:52 +00:00
|
|
|
m_TeamState[Team] = State;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-08-30 12:13:43 +00:00
|
|
|
bool CGameTeams::TeamFinished(int Team) {
|
2010-08-28 13:47:52 +00:00
|
|
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
2010-08-30 12:13:43 +00:00
|
|
|
if(m_Core.Team(i) == Team && !m_TeeFinished[i]) {
|
2010-08-28 13:47:52 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
2010-09-08 16:22:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int CGameTeams::TeamMask(int Team) {
|
|
|
|
int Mask = 0;
|
|
|
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
2010-09-12 19:09:19 +00:00
|
|
|
if(m_Core.Team(i) == Team || (Character(i)
|
|
|
|
&& Character(i)->GetPlayer()
|
|
|
|
&& Character(i)->GetPlayer()->m_ShowOthers)) {
|
2010-09-08 16:22:11 +00:00
|
|
|
Mask |= 1 << i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Mask;
|
|
|
|
}
|
2010-09-14 11:38:46 +00:00
|
|
|
|
|
|
|
void CGameTeams::SendAllInfo(int Cid) {
|
|
|
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
|
|
|
if(m_Core.Team(i) != 0) {
|
|
|
|
CNetMsg_Sv_PlayerTeam Msg;
|
|
|
|
Msg.m_Team = m_Core.Team(i);
|
|
|
|
Msg.m_Cid = i;
|
|
|
|
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, Cid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|