void CGameTeams::OnCharacterFinish(int ClientID) { if(m_Core.Team(ClientID) == TEAM_FLOCK || m_Core.Team(ClientID) == TEAM_SUPER) { Character(ClientID)->OnFinish(); } else { m_TeeFinished[ClientID] = true; if(TeamFinished(m_Core.Team(ClientID))) { //ChangeTeamState(m_Core.Team(id), TEAMSTATE_FINISHED);//TODO: Make it better ChangeTeamState(m_Core.Team(ClientID), TEAMSTATE_OPEN); for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_Core.Team(ClientID) == m_Core.Team(i)) { CCharacter * pChar = Character(i); if(pChar != 0) { pChar->OnFinish(); m_TeeFinished[i] = false; } } } } } }
void CGameTeams::SetForceCharacterTeam(int ClientID, int Team) { m_TeeFinished[ClientID] = false; if(m_Core.Team(ClientID) != TEAM_FLOCK && m_Core.Team(ClientID) != TEAM_SUPER && m_TeamState[m_Core.Team(ClientID)] != TEAMSTATE_EMPTY) { bool NoOneInOldTeam = true; for(int i = 0; i < MAX_CLIENTS; ++i) if(i != ClientID && m_Core.Team(ClientID) == m_Core.Team(i)) { NoOneInOldTeam = false;//all good exists someone in old team break; } if(NoOneInOldTeam) m_TeamState[m_Core.Team(ClientID)] = TEAMSTATE_EMPTY; } if(Count(m_Core.Team(ClientID)) > 0) m_MembersCount[m_Core.Team(ClientID)]--; m_Core.Team(ClientID, Team); if(m_Core.Team(ClientID) != TEAM_SUPER) m_MembersCount[m_Core.Team(ClientID)]++; if(Team != TEAM_SUPER && m_TeamState[Team] == TEAMSTATE_EMPTY) ChangeTeamState(Team, TEAMSTATE_OPEN); for (int LoopClientID = 0; LoopClientID < MAX_CLIENTS; ++LoopClientID) { if(Character(LoopClientID) && Character(LoopClientID)->GetPlayer()->m_IsUsingDDRaceClient) SendTeamsState(LoopClientID); } }
void CGameTeams::CheckTeamFinished(int Team) { if (TeamFinished(Team)) { CPlayer *TeamPlayers[MAX_CLIENTS]; unsigned int PlayersCount = 0; for (int i = 0; i < MAX_CLIENTS; ++i) { if (Team == m_Core.Team(i)) { CPlayer* pPlayer = GetPlayer(i); if (pPlayer && pPlayer->IsPlaying()) { OnFinish(pPlayer); m_TeeFinished[i] = false; TeamPlayers[PlayersCount++] = pPlayer; } } } if (PlayersCount > 0) { ChangeTeamState(Team, TEAMSTATE_FINISHED); //TODO: Make it better //ChangeTeamState(Team, TEAMSTATE_OPEN); OnTeamFinish(TeamPlayers, PlayersCount); } } }
void CGameTeams::KillSavedTeam(int Team) { // Set so that no finish is accidentally given to some of the players ChangeTeamState(Team, CGameTeams::TEAMSTATE_OPEN); for (int i = 0; i < MAX_CLIENTS; i++) { if(m_Core.Team(i) == Team && GameServer()->m_apPlayers[i]) { // Set so that no finish is accidentally given to some of the players GameServer()->m_apPlayers[i]->GetCharacter()->m_DDRaceState = DDRACE_NONE; m_TeeFinished[i] = false; } } for (int i = 0; i < MAX_CLIENTS; i++) if(m_Core.Team(i) == Team && GameServer()->m_apPlayers[i]) GameServer()->m_apPlayers[i]->ThreadKillCharacter(-2); ChangeTeamState(Team, CGameTeams::TEAMSTATE_EMPTY); // unlock team when last player leaves SetTeamLock(Team, false); }
void CGameTeams::SetForceCharacterTeam(int ClientID, int Team) { int OldTeam = m_Core.Team(ClientID); if (Team != m_Core.Team(ClientID)) ForceLeaveTeam(ClientID); else { m_TeeFinished[ClientID] = false; if (Count(m_Core.Team(ClientID)) > 0) m_MembersCount[m_Core.Team(ClientID)]--; } m_Core.Team(ClientID, Team); if (m_Core.Team(ClientID) != TEAM_SUPER) m_MembersCount[m_Core.Team(ClientID)]++; if (Team != TEAM_SUPER && (m_TeamState[Team] == TEAMSTATE_EMPTY || m_TeamLocked[Team])) { if (!m_TeamLocked[Team]) ChangeTeamState(Team, TEAMSTATE_OPEN); if (GameServer()->Collision()->m_NumSwitchers > 0) { for (int i = 0; i < GameServer()->Collision()->m_NumSwitchers+1; ++i) { GameServer()->Collision()->m_pSwitchers[i].m_Status[Team] = GameServer()->Collision()->m_pSwitchers[i].m_Initial; GameServer()->Collision()->m_pSwitchers[i].m_EndTick[Team] = 0; GameServer()->Collision()->m_pSwitchers[i].m_Type[Team] = TILE_SWITCHOPEN; } } } if (OldTeam != Team) for (int LoopClientID = 0; LoopClientID < MAX_CLIENTS; ++LoopClientID) if (GetPlayer(LoopClientID)) SendTeamsState(LoopClientID); }
void CGameTeams::OnCharacterDeath(int ClientID, int Weapon) { m_Core.SetSolo(ClientID, false); int Team = m_Core.Team(ClientID); bool Locked = TeamLocked(Team) && Weapon != WEAPON_GAME; if (!Locked) { SetForceCharacterTeam(ClientID, 0); CheckTeamFinished(Team); } else { SetForceCharacterTeam(ClientID, Team); if (GetTeamState(Team) != TEAMSTATE_OPEN) { ChangeTeamState(Team, CGameTeams::TEAMSTATE_OPEN); char aBuf[512]; str_format(aBuf, sizeof(aBuf), "Everyone in your locked team was killed because you %s.", Weapon == WEAPON_SELF ? "killed" : "died"); GameServer()->SendChatTarget(ClientID, aBuf); str_format(aBuf, sizeof(aBuf), "Everyone in your locked team was killed because '%s' %s.", Server()->ClientName(ClientID), Weapon == WEAPON_SELF ? "killed" : "died"); for (int i = 0; i < MAX_CLIENTS; i++) if(m_Core.Team(i) == Team && i != ClientID && GameServer()->m_apPlayers[i]) { GameServer()->m_apPlayers[i]->KillCharacter(WEAPON_SELF); if (Weapon == WEAPON_SELF) GameServer()->m_apPlayers[i]->Respawn(true); // spawn the rest of team with weak hook on the killer GameServer()->SendChatTarget(i, aBuf); } } } }
void CGameTeams::OnCharacterStart(int ClientID) { int Tick = Server()->Tick(); CCharacter* pStartingChar = Character(ClientID); if(!pStartingChar) return; if(pStartingChar->m_DDRaceState == DDRACE_FINISHED) pStartingChar->m_DDRaceState = DDRACE_NONE; if(m_Core.Team(ClientID) == TEAM_FLOCK || m_Core.Team(ClientID) == TEAM_SUPER) { pStartingChar->m_DDRaceState = DDRACE_STARTED; pStartingChar->m_StartTime = Tick; pStartingChar->m_RefreshTime = Tick; } else { bool Waiting = false; for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_Core.Team(ClientID) == m_Core.Team(i)) { CCharacter* pChar = Character(i); if(pChar->m_DDRaceState == DDRACE_FINISHED) { Waiting = true; if(m_LastChat[ClientID] + Server()->TickSpeed() + g_Config.m_SvChatDelay < Tick) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%s has finished and didn't go through start yet, wait for him or join another team.", Server()->ClientName(i)); GameServer()->SendChatTarget(ClientID, aBuf); m_LastChat[ClientID] = Tick; } if(m_LastChat[i] + Server()->TickSpeed() + g_Config.m_SvChatDelay < Tick) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%s wants to start a new round, kill or walk to start.", Server()->ClientName(ClientID)); GameServer()->SendChatTarget(i, aBuf); m_LastChat[i] = Tick; } } } } if(m_TeamState[m_Core.Team(ClientID)] <= TEAMSTATE_CLOSED && !Waiting) { ChangeTeamState(m_Core.Team(ClientID), TEAMSTATE_STARTED); for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_Core.Team(ClientID) == m_Core.Team(i)) { CCharacter* pChar = Character(i); if(pChar) { pChar->m_DDRaceState = DDRACE_STARTED; pChar->m_StartTime = Tick; pChar->m_RefreshTime = Tick; } } } } } }
void CGameTeams::OnCharacterStart(int ClientID) { int Tick = Server()->Tick(); CCharacter* pStartingChar = Character(ClientID); if (!pStartingChar) return; if (m_Core.Team(ClientID) != TEAM_FLOCK && pStartingChar->m_DDRaceState == DDRACE_FINISHED) return; if (m_Core.Team(ClientID) == TEAM_FLOCK || m_Core.Team(ClientID) == TEAM_SUPER) { pStartingChar->m_DDRaceState = DDRACE_STARTED; pStartingChar->m_StartTime = Tick; } else { bool Waiting = false; for (int i = 0; i < MAX_CLIENTS; ++i) { if (m_Core.Team(ClientID) == m_Core.Team(i)) { CPlayer* pPlayer = GetPlayer(i); if (pPlayer && pPlayer->IsPlaying() && GetDDRaceState(pPlayer) == DDRACE_FINISHED) { Waiting = true; pStartingChar->m_DDRaceState = DDRACE_NONE; if (m_LastChat[ClientID] + Server()->TickSpeed() + g_Config.m_SvChatDelay < Tick) { char aBuf[128]; str_format( aBuf, sizeof(aBuf), "%s has finished and didn't go through start yet, wait for him or join another team.", Server()->ClientName(i)); GameServer()->SendChatTarget(ClientID, aBuf); m_LastChat[ClientID] = Tick; } if (m_LastChat[i] + Server()->TickSpeed() + g_Config.m_SvChatDelay < Tick) { char aBuf[128]; str_format( aBuf, sizeof(aBuf), "%s wants to start a new round, kill or walk to start.", Server()->ClientName(ClientID)); GameServer()->SendChatTarget(i, aBuf); m_LastChat[i] = Tick; } } } } if (m_TeamState[m_Core.Team(ClientID)] < TEAMSTATE_STARTED && !Waiting) { ChangeTeamState(m_Core.Team(ClientID), TEAMSTATE_STARTED); for (int i = 0; i < MAX_CLIENTS; ++i) { if (m_Core.Team(ClientID) == m_Core.Team(i)) { CPlayer* pPlayer = GetPlayer(i); // TODO: THE PROBLEM IS THAT THERE IS NO CHARACTER SO START TIME CAN'T BE SET! if (pPlayer && (pPlayer->IsPlaying() || TeamLocked(m_Core.Team(ClientID)))) { SetDDRaceState(pPlayer, DDRACE_STARTED); SetStartTime(pPlayer, Tick); } } } } } }