Improve checkpoint system

This commit is contained in:
mittorn 2018-01-02 02:49:56 +07:00
parent 634e7e799c
commit 532c37ecde
4 changed files with 35 additions and 6 deletions

View File

@ -473,7 +473,7 @@ void UTIL_CoopCheckpointMenu( CBasePlayer *pPlayer )
"New checkpoint"
};
int i;
if( pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR || pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR_BEGIN )
if( pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR || pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR_BEGIN || pPlayer->pev->health <= 0 )
menu[0] = "Just spawn";
for( i = 1; g_checkpoints[i-1].time; i++ )
menu[i] = g_checkpoints[i-1].str;
@ -493,7 +493,7 @@ void UTIL_CoopNewCheckpoint( entvars_t *pevPlayer )
snprintf( g_checkpoints[0].str, 31, "%5s %d", STRING( pevPlayer->netname ), (int)( gpGlobals->time / 60 ) );
g_checkpoints[0].origin = pevPlayer->origin;
g_checkpoints[0].angles = pevPlayer->angles;
UTIL_CoopPrintMessage( "New checkpoint by %s!\n", STRING( pevPlayer->netname ) );
UTIL_CoopHudMessage( 1, 5, 0xFF0000FF, 0xFF0000FF, 0, 0.7, "New checkpoint by %s!\n", STRING( pevPlayer->netname ) );
}
@ -512,7 +512,7 @@ void UTIL_CoopVoteMenu( CBasePlayer *pPlayer )
}
if( count < 4 )
{
UTIL_CoopPlayerMessage( pPlayer, 0, 5, 0xFFFFFFFF, 0xFFFFFFFF, -1, -1, "Need at least 4 players to vote changelevel!\n");
UTIL_CoopPlayerMessage( pPlayer, 1, 5, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0.7, "Need at least 4 players to vote changelevel!\n");
return;
}
g_GlobalMenu.VoteMenu(pPlayer);
@ -553,6 +553,21 @@ void UTIL_CoopMenu( CBasePlayer *pPlayer )
}
bool UTIL_CoopPlayerDeath( CBasePlayer *pPlayer )
{
if( pPlayer->gravgunmod_data.m_iMenuState == MENUSTATE_CHECKPOINT )
return true;
if( g_checkpoints[0].time )
{
UTIL_CoopCheckpointMenu( pPlayer );
return true;
}
return false;
}
void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
{
switch( pPlayer->gravgunmod_data.m_iMenuState )
@ -608,7 +623,7 @@ void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
case MENUSTATE_CHECKPOINT:
if( imenu == 1 )
{
if( pPlayer->gravgunmod_data.m_state != STATE_SPAWNED )
if( pPlayer->gravgunmod_data.m_state != STATE_SPAWNED || ( pPlayer->pev->health <= 0 ) )
UTIL_SpawnPlayer( pPlayer );
else if( !UTIL_CoopIsBadPlayer( pPlayer ) )
UTIL_CoopNewCheckpoint( pPlayer->pev );
@ -620,6 +635,7 @@ void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
pPlayer->pev->origin = g_checkpoints[imenu-2].origin;
pPlayer->pev->angles = g_checkpoints[imenu-2].angles;
}
pPlayer->gravgunmod_data.m_iMenuState = MENUSTATE_NONE;
break;
case MENUSTATE_LOCAL_CONFIRM:
if( imenu - 1 == pPlayer->gravgunmod_data.m_iConfirmKey )
@ -767,6 +783,13 @@ void CWeaponList::GiveToPlayer(CBasePlayer *pPlayer)
void CWeaponList::AddWeapon( const char *classname )
{
int i;
if( !strcmp( classname, "item_suit") )
return;
if( !strcmp( classname, "item_healthkit") )
return;
for(i = 0; i < m_iWeapons;i++)
if(!strcmp(weapons[i], classname))
return;
@ -829,6 +852,7 @@ bool UTIL_CoopConfirmMenu(CBaseEntity *pTrigger, CBaseEntity *pActivator, int co
if( g_checkpoints[0].time && (g_checkpoints[0].origin - VecBModelOrigin(pTrigger->pev)).Length() > 150 )
{
g_GlobalMenu.m_iConfirm = 0;
UTIL_CoopPlayerMessage( pActivator, 1, 5, 0xFF0000FF, 0xFF0000FF, 0, 0.7, "Changelevel back locked by checkpoint\nCheckpoint here to activate trigger!");
return false;
}
//if( count2 < 2 )

View File

@ -61,7 +61,7 @@ void UTIL_CoopApplyData( void );
void UTIL_CoopPrintMessage( const char *format, ... );
void UTIL_CoopHudMessage( int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... );
void UTIL_CoopPlayerMessage( CBaseEntity *pPlayer, int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... );
bool UTIL_CoopPlayerDeath( CBasePlayer *pPlayer );
void COOP_RegisterCVars( void );
#ifdef PLAYER_H

View File

@ -1282,6 +1282,10 @@ void CBasePlayer::PlayerDeathThink( void )
if( fAnyButtonDown )
return;
if( UTIL_CoopPlayerDeath( this ) )
return;
if( g_pGameRules->FPlayerCanRespawn( this ) )
{
m_fDeadTime = gpGlobals->time;
@ -1291,6 +1295,7 @@ void CBasePlayer::PlayerDeathThink( void )
return;
}
// if the player has been dead for one second longer than allowed by forcerespawn,
// forcerespawn isn't on. Send the player off to an intermission camera until they
// choose to respawn.

View File

@ -1613,7 +1613,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
if( !strcmp( m_szMapName, mp_coop_disabledmap.string ) )
{
UTIL_CoopPlayerMessage( pActivator, 0, 5, 0xFF000FF, 0xFFFF00FF, -1, -1, "MAP %S IS DISABLED", m_szMapName );
UTIL_CoopPlayerMessage( pActivator, 1, 5, 0xFF000FF, 0xFFFF00FF, 0, 0.7, "MAP %S IS DISABLED", m_szMapName );
return;
}
// forget touch by some fool