From 6126ad50c444c9c3122980f17791c791bb249592 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 11 Jan 2014 15:19:34 +0100 Subject: [PATCH] Fix range of team related bugs by actually removing people from team when they spectate --- src/game/server/entities/character.cpp | 9 ------ src/game/server/player.cpp | 1 + src/game/server/teams.cpp | 44 +++++++++++++++++++------- src/game/server/teams.h | 1 + 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 3384d8225..8b2a0c558 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -811,15 +811,6 @@ void CCharacter::Die(int Killer, int Weapon) Msg.m_ModeSpecial = ModeSpecial; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1); - // reset switches if we are the last player in team to prevent door opening cheat - if (((Team() == TEAM_FLOCK && g_Config.m_SvTeam == 3) || (Team() > TEAM_FLOCK && Team() < TEAM_SUPER && (Teams()->Count(Team()) < 2 || Teams()->TeamLocked(Team())))) && GameServer()->Collision()->m_NumSwitchers > 0) { - for (int i = 0; i < GameServer()->Collision()->m_NumSwitchers+1; ++i) { - GameServer()->Collision()->m_pSwitchers[i].m_Status[Team()] = true; - GameServer()->Collision()->m_pSwitchers[i].m_EndTick[Team()] = 0; - GameServer()->Collision()->m_pSwitchers[i].m_Type[Team()] = TILE_SWITCHOPEN; - } - } - // a nice sound GameServer()->CreateSound(m_Pos, SOUND_PLAYER_DIE, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID())); diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index f8766add7..bd73755f9 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -419,6 +419,7 @@ void CPlayer::SetTeam(int Team, bool DoChatMsg) if(Team == TEAM_SPECTATORS) { CGameControllerDDRace* Controller = (CGameControllerDDRace*)GameServer()->m_pController; + Controller->m_Teams.ForceLeaveTeam(m_ClientID); Controller->m_Teams.m_Core.Team(m_ClientID, 0); } diff --git a/src/game/server/teams.cpp b/src/game/server/teams.cpp index a0eebcb9c..646be08c1 100644 --- a/src/game/server/teams.cpp +++ b/src/game/server/teams.cpp @@ -166,8 +166,39 @@ bool CGameTeams::SetCharacterTeam(int ClientID, int Team) } void CGameTeams::SetForceCharacterTeam(int ClientID, int Team) +{ + ForceLeaveTeam(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); + + 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] = true; + GameServer()->Collision()->m_pSwitchers[i].m_EndTick[Team] = 0; + GameServer()->Collision()->m_pSwitchers[i].m_Type[Team] = TILE_SWITCHOPEN; + } + } + } + + //for (int LoopClientID = 0; LoopClientID < MAX_CLIENTS; ++LoopClientID) + //{ + // if (GetPlayer(LoopClientID) + // && GetPlayer(LoopClientID)->m_IsUsingDDRaceClient) + // SendTeamsState(LoopClientID); + //} +} + +void CGameTeams::ForceLeaveTeam(int ClientID) { 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) @@ -187,20 +218,9 @@ void CGameTeams::SetForceCharacterTeam(int ClientID, int Team) SetTeamLock(m_Core.Team(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) - ChangeTeamState(Team, TEAMSTATE_OPEN); - - //for (int LoopClientID = 0; LoopClientID < MAX_CLIENTS; ++LoopClientID) - //{ - // if (GetPlayer(LoopClientID) - // && GetPlayer(LoopClientID)->m_IsUsingDDRaceClient) - // SendTeamsState(LoopClientID); - //} } int CGameTeams::Count(int Team) const diff --git a/src/game/server/teams.h b/src/game/server/teams.h index 5a02fcd21..5ec2065b5 100644 --- a/src/game/server/teams.h +++ b/src/game/server/teams.h @@ -61,6 +61,7 @@ public: //need to be very carefull using this method void SetForceCharacterTeam(int id, int Team); + void ForceLeaveTeam(int id); void Reset();