fixed a possible problem with occupied spawn points and cleaned up spawn code a bit

This commit is contained in:
oy 2011-02-10 12:05:55 +01:00
parent 0698243c6b
commit 3f05289328
4 changed files with 19 additions and 21 deletions

View file

@ -62,6 +62,10 @@ void IGameController::EvaluateSpawnType(CSpawnEval *pEval, int T)
// get spawn point // get spawn point
for(int i = 0; i < m_aNumSpawnPoints[T]; i++) for(int i = 0; i < m_aNumSpawnPoints[T]; i++)
{ {
// check if the position is occupado
if(GameServer()->m_World.FindEntities(m_aaSpawnPoints[T][i], 64, 0, 1, CGameWorld::ENTTYPE_CHARACTER))
continue;
vec2 P = m_aaSpawnPoints[T][i]; vec2 P = m_aaSpawnPoints[T][i];
float S = EvaluateSpawnPos(pEval, P); float S = EvaluateSpawnPos(pEval, P);
if(!pEval->m_Got || pEval->m_Score > S) if(!pEval->m_Got || pEval->m_Score > S)
@ -73,25 +77,25 @@ void IGameController::EvaluateSpawnType(CSpawnEval *pEval, int T)
} }
} }
bool IGameController::CanSpawn(CPlayer *pPlayer, vec2 *pOutPos) bool IGameController::CanSpawn(int Team, vec2 *pOutPos)
{ {
CSpawnEval Eval; CSpawnEval Eval;
// spectators can't spawn // spectators can't spawn
if(pPlayer->GetTeam() == TEAM_SPECTATORS) if(Team == TEAM_SPECTATORS)
return false; return false;
if(IsTeamplay()) if(IsTeamplay())
{ {
Eval.m_FriendlyTeam = pPlayer->GetTeam(); Eval.m_FriendlyTeam = Team;
// try first try own team spawn, then normal spawn and then enemy // first try own team spawn, then normal spawn and then enemy
EvaluateSpawnType(&Eval, 1+(pPlayer->GetTeam()&1)); EvaluateSpawnType(&Eval, 1+(Team&1));
if(!Eval.m_Got) if(!Eval.m_Got)
{ {
EvaluateSpawnType(&Eval, 0); EvaluateSpawnType(&Eval, 0);
if(!Eval.m_Got) if(!Eval.m_Got)
EvaluateSpawnType(&Eval, 1+((pPlayer->GetTeam()+1)&1)); EvaluateSpawnType(&Eval, 1+((Team+1)&1));
} }
} }
else else

View file

@ -129,7 +129,7 @@ public:
virtual void OnPlayerInfoChange(class CPlayer *pP); virtual void OnPlayerInfoChange(class CPlayer *pP);
// //
virtual bool CanSpawn(class CPlayer *pP, vec2 *pPos); virtual bool CanSpawn(int Team, vec2 *pPos);
/* /*

View file

@ -48,7 +48,8 @@ int CGameWorld::FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max,
{ {
if(distance(pEnt->m_Pos, Pos) < Radius+pEnt->m_ProximityRadius) if(distance(pEnt->m_Pos, Pos) < Radius+pEnt->m_ProximityRadius)
{ {
ppEnts[Num] = pEnt; if(ppEnts)
ppEnts[Num] = pEnt;
Num++; Num++;
if(Num == Max) if(Num == Max)
break; break;

View file

@ -201,20 +201,13 @@ void CPlayer::SetTeam(int Team)
void CPlayer::TryRespawn() void CPlayer::TryRespawn()
{ {
vec2 SpawnPos = vec2(100.0f, -60.0f); vec2 SpawnPos;
if(!GameServer()->m_pController->CanSpawn(this, &SpawnPos)) if(!GameServer()->m_pController->CanSpawn(m_Team, &SpawnPos))
return; return;
// check if the position is occupado m_Spawning = false;
CEntity *apEnts[2] = {0}; Character = new(m_ClientID) CCharacter(&GameServer()->m_World);
int NumEnts = GameServer()->m_World.FindEntities(SpawnPos, 64, apEnts, 2, CGameWorld::ENTTYPE_CHARACTER); Character->Spawn(this, SpawnPos);
GameServer()->CreatePlayerSpawn(SpawnPos);
if(NumEnts == 0)
{
m_Spawning = false;
Character = new(m_ClientID) CCharacter(&GameServer()->m_World);
Character->Spawn(this, SpawnPos);
GameServer()->CreatePlayerSpawn(SpawnPos);
}
} }