Spawnpoint select

This commit is contained in:
mittorn 2016-10-19 13:57:19 +00:00
parent 18976a4c58
commit 18e1772857
3 changed files with 43 additions and 2 deletions

View File

@ -78,16 +78,22 @@ Vector FixupSpawnPoint(Vector spawn)
} }
return spawn; return spawn;
} }
extern EHANDLE g_pLastSpawn;
//========================================================= //=========================================================
//========================================================= //=========================================================
edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer ) edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer )
{ {
edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer ); edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer );
if( pPlayer->m_state == STATE_POINT_SELECT )
{
pPlayer->m_state = STATE_SPAWNED;
return pentSpawnSpot;
}
if( mp_coop.value ) if( mp_coop.value )
UTIL_CleanSpawnPoint( pentSpawnSpot->v.origin, 100 ); UTIL_CleanSpawnPoint( pentSpawnSpot->v.origin, 100 );
if( g_pLastSpawn )
pPlayer->pev->origin = VARS( pentSpawnSpot )->origin + Vector( 0, 0, 1 ); pPlayer->pev->origin = VARS( pentSpawnSpot )->origin + Vector( 0, 0, 1 );
pPlayer->pev->v_angle = g_vecZero; pPlayer->pev->v_angle = g_vecZero;
pPlayer->pev->velocity = g_vecZero; pPlayer->pev->velocity = g_vecZero;
@ -95,7 +101,25 @@ edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer )
pPlayer->pev->punchangle = g_vecZero; pPlayer->pev->punchangle = g_vecZero;
if( !(pPlayer->pev->flags & FL_SPECTATOR ) ) if( !(pPlayer->pev->flags & FL_SPECTATOR ) )
if( mp_coop_changelevel.value && !CoopRestorePlayerCoords( pPlayer, &pPlayer->pev->origin, &pPlayer->pev->angles )) if( mp_coop_changelevel.value && !CoopRestorePlayerCoords( pPlayer, &pPlayer->pev->origin, &pPlayer->pev->angles ))
CoopGetSpawnPoint( &pPlayer->pev->origin, &pPlayer->pev->angles ); if( !CoopGetSpawnPoint( &pPlayer->pev->origin, &pPlayer->pev->angles ) )
{
if( pPlayer->m_state == STATE_SPAWNED && !g_pLastSpawn )
{
hudtextparms_t params = {};
params.fadeinTime = 0.5;
params.fadeoutTime = .5;
params.holdTime = 10;
params.channel = 1;
params.y = 100;
params.r2 = params.g2 = params.b2 = params.a2 = params.r1 = params.g1 = params.b1 = params.a1 = 255;
UTIL_HudMessage( pPlayer, params, "Server cannot select a spawnpoint, please fly to it manually and press attack button\n" );
// select spawn point
pPlayer->m_state = STATE_POINT_SELECT;
}
}
pPlayer->pev->fixangle = TRUE; pPlayer->pev->fixangle = TRUE;
pPlayer->pev->origin = FixupSpawnPoint( pPlayer->pev->origin ); pPlayer->pev->origin = FixupSpawnPoint( pPlayer->pev->origin );
if( g_fSavedDuck ) if( g_fSavedDuck )

View File

@ -749,6 +749,12 @@ void CHalfLifeMultiplay::PlayerThink( CBasePlayer *pPlayer )
return; return;
} }
if( pPlayer->m_state == STATE_POINT_SELECT )
{
if( pPlayer->m_afButtonPressed & ( IN_DUCK | IN_ATTACK | IN_ATTACK2 | IN_USE | IN_JUMP ) )
SpawnPlayer( pPlayer );
}
if( g_fGameOver ) if( g_fGameOver )
{ {
// check for button presses // check for button presses
@ -783,6 +789,13 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer )
return; return;
} }
if( pPlayer->m_state == STATE_POINT_SELECT )
{
pPlayer->RemoveAllItems( TRUE );
BecomeSpectator( pPlayer );
return;
}
pPlayer->pev->weapons |= ( 1 << WEAPON_SUIT ); pPlayer->pev->weapons |= ( 1 << WEAPON_SUIT );
addDefault = TRUE; addDefault = TRUE;

View File

@ -2743,6 +2743,8 @@ edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer )
goto ReturnSpot; goto ReturnSpot;
} }
} }
#if 0
// landmark may still exists when no spawn spot // landmark may still exists when no spawn spot
if( FNullEnt( pSpot ) ) if( FNullEnt( pSpot ) )
{ {
@ -2754,11 +2756,13 @@ edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer )
if( FNullEnt( pSpot ) ) if( FNullEnt( pSpot ) )
pSpot = UTIL_FindEntityByClassname( NULL, "info_player_start" ); pSpot = UTIL_FindEntityByClassname( NULL, "info_player_start" );
#endif
ReturnSpot: ReturnSpot:
if( FNullEnt( pSpot ) ) if( FNullEnt( pSpot ) )
{ {
ALERT( at_error, "PutClientInServer: no info_player_start on level" ); ALERT( at_error, "PutClientInServer: no info_player_start on level" );
g_pLastSpawn = NULL;
return INDEXENT( 0 ); return INDEXENT( 0 );
} }