removed hl2dm spawn crap, tweaked default spawn code a little.

it grabs random info_ff_teamspawn, and if cant find any tries a info_player_start as last ditch
no revolutionary changes here
This commit is contained in:
Dexter 2013-11-03 07:32:32 +00:00 committed by squeek
parent 0622f03f59
commit 88e40d9bc9
4 changed files with 54 additions and 72 deletions

View file

@ -34,8 +34,6 @@
int g_iLastCitizenModel = 0;
int g_iLastCombineModel = 0;
CBaseEntity *g_pLastCombineSpawn = NULL;
CBaseEntity *g_pLastRebelSpawn = NULL;
extern CBaseEntity *g_pLastSpawn;
#define FF_COMMAND_MAX_RATE 0.3
@ -47,6 +45,9 @@ LINK_ENTITY_TO_CLASS( player, CFF_SV_Player );
LINK_ENTITY_TO_CLASS( info_player_combine, CPointEntity );
LINK_ENTITY_TO_CLASS( info_player_rebel, CPointEntity );
// lets dance
LINK_ENTITY_TO_CLASS( info_ff_teamspawn, CPointEntity );
IMPLEMENT_SERVERCLASS_ST(CFF_SV_Player, DT_FF_Player)
SendPropAngle( SENDINFO_VECTORELEM(m_angEyeAngles, 0), 11, SPROP_CHANGES_OFTEN ),
SendPropAngle( SENDINFO_VECTORELEM(m_angEyeAngles, 1), 11, SPROP_CHANGES_OFTEN ),
@ -1320,27 +1321,10 @@ CBaseEntity* CFF_SV_Player::EntSelectSpawnPoint( void )
CBaseEntity *pSpot = NULL;
CBaseEntity *pLastSpawnPoint = g_pLastSpawn;
edict_t *player = edict();
const char *pSpawnpointName = "info_player_deathmatch";
if ( FFRules()->IsTeamplay() == true )
{
if ( GetTeamNumber() == TEAM_COMBINE )
{
pSpawnpointName = "info_player_combine";
pLastSpawnPoint = g_pLastCombineSpawn;
}
else if ( GetTeamNumber() == TEAM_REBELS )
{
pSpawnpointName = "info_player_rebel";
pLastSpawnPoint = g_pLastRebelSpawn;
}
if ( gEntList.FindEntityByClassname( NULL, pSpawnpointName ) == NULL )
{
pSpawnpointName = "info_player_deathmatch";
pLastSpawnPoint = g_pLastSpawn;
}
}
// this is safe cuz there is always at least one
// team in FF and the rest is handled by lua, right?
const char *pSpawnpointName = "info_ff_teamspawn";
pSpot = pLastSpawnPoint;
// Randomize the start spot
@ -1349,31 +1333,25 @@ CBaseEntity* CFF_SV_Player::EntSelectSpawnPoint( void )
if ( !pSpot ) // skip over the null point
pSpot = gEntList.FindEntityByClassname( pSpot, pSpawnpointName );
bool validSpawnFound = false;
CBaseEntity *pFirstSpot = pSpot;
// FF dexter note: this valve code had wacky goto and stuff, simplified
do
{
if ( pSpot )
if ( pSpot && g_pGameRules->IsSpawnPointValid( pSpot, this ) )
{
// check if pSpot is valid
if ( g_pGameRules->IsSpawnPointValid( pSpot, this ) )
{
if ( pSpot->GetLocalOrigin() == vec3_origin )
{
pSpot = gEntList.FindEntityByClassname( pSpot, pSpawnpointName );
continue;
validSpawnFound = true;
break;
}
// if so, go to pSpot
goto ReturnSpot;
}
}
// increment pSpot
pSpot = gEntList.FindEntityByClassname( pSpot, pSpawnpointName );
} while ( pSpot != pFirstSpot ); // loop if we're not back to the start
} while ( pSpot != pFirstSpot );
// we haven't found a place to spawn yet, so kill any guy at the first spawn point and spawn there
if ( pSpot )
if ( pSpot && !validSpawnFound )
{
CBaseEntity *ent = NULL;
for ( CEntitySphereQuery sphere( pSpot->GetAbsOrigin(), 128 ); (ent = sphere.GetCurrentEntity()) != NULL; sphere.NextEntity() )
@ -1382,33 +1360,13 @@ CBaseEntity* CFF_SV_Player::EntSelectSpawnPoint( void )
if ( ent->IsPlayer() && !(ent->edict() == player) )
ent->TakeDamage( CTakeDamageInfo( GetContainingEntity(INDEXENT(0)), GetContainingEntity(INDEXENT(0)), 300, DMG_GENERIC ) );
}
goto ReturnSpot;
}
// note: as a last ditch effort try a default spawn ent
if ( !pSpot )
{
pSpot = gEntList.FindEntityByClassname( pSpot, "info_player_start" );
if ( pSpot )
goto ReturnSpot;
}
ReturnSpot:
if ( FFRules()->IsTeamplay() == true )
{
if ( GetTeamNumber() == TEAM_COMBINE )
{
g_pLastCombineSpawn = pSpot;
}
else if ( GetTeamNumber() == TEAM_REBELS )
{
g_pLastRebelSpawn = pSpot;
}
}
g_pLastSpawn = pSpot;
m_flSlamProtectTime = gpGlobals->curtime + 0.5;
return pSpot;

View file

@ -47,9 +47,6 @@ ConVar sv_report_client_settings("sv_report_client_settings", "0", FCVAR_GAMEDLL
extern ConVar mp_chattime;
extern CBaseEntity *g_pLastCombineSpawn;
extern CBaseEntity *g_pLastRebelSpawn;
#define WEAPON_MAX_DISTANCE_FROM_SPAWN 64
#endif
@ -116,9 +113,8 @@ static const char *s_PreserveEnts[] =
"info_node",
"info_target",
"info_node_hint",
"info_player_deathmatch",
"info_player_combine",
"info_player_rebel",
// FF note, only info_ff_teamspawn is checked for spawnpoints, no fallback anymore
"info_ff_teamspawn",
"info_map_parameters",
"keyframe_rope",
"move_rope",
@ -241,9 +237,6 @@ void CFF_SH_Rules::CreateStandardEntities( void )
BaseClass::CreateStandardEntities();
g_pLastCombineSpawn = NULL;
g_pLastRebelSpawn = NULL;
#ifdef DBGFLAG_ASSERT
CBaseEntity *pEnt =
#endif
@ -1281,4 +1274,35 @@ const char *CFF_SH_Rules::GetChatFormat( bool bTeamOnly, CBasePlayer *pPlayer )
return pszFormat;
}
#endif
bool CFF_SH_Rules::IsSpawnPointValid( CBaseEntity *pSpot, CBasePlayer *pPlayer )
{
if ( !pSpot || pSpot->GetLocalOrigin() == vec3_origin )
return false;
// check base class (is there any dudes on the point ? )
if ( !BaseClass::IsSpawnPointValid( pSpot, pPlayer ) )
return false;
// might want to challenge this, not sure its really needed to check we're getting a FF player here
CFF_SV_Player *pFFPlayer = ToFFPlayer ( pPlayer );
if ( !pFFPlayer )
return false;
// FF TODO: run lua predicate against spot
/*
CFFLuaSC hAllowed;
hAllowed.Push( pFFPlayer );
if( _scriptman.RunPredicates_LUA( pSpot, &hAllowed, "validspawn" ) )
{
// Spot is a valid place for us to spawn
if( hAllowed.GetBool() )
{
return true;
}
}
*/
return true;
}
#endif // client

View file

@ -136,6 +136,7 @@ public:
void ManageObjectRelocation( void );
void CheckChatForReadySignal( CFF_SH_Player *pPlayer, const char *chatmsg );
const char *GetChatFormat( bool bTeamOnly, CBasePlayer *pPlayer );
bool IsSpawnPointValid( CBaseEntity *pSpot, CBasePlayer *pPlayer );
#endif
virtual void ClientDisconnected( edict_t *pClient );

View file

@ -12,7 +12,6 @@
#define FF_PUSHAWAY_THINK_INTERVAL (1.0f / 20.0f)
#include "studio.h"
enum
{
PLAYER_SOUNDS_CITIZEN = 0,