Browse Source

Implement semclip and unduck

hlzbot-dirty
mittorn 8 years ago
parent
commit
910a68d4a5
  1. 5
      dlls/game.cpp
  2. 3
      dlls/game.h
  3. 4
      dlls/gamerules.cpp
  4. 45
      dlls/player.cpp
  5. 18
      dlls/triggers.cpp

5
dlls/game.cpp

@ -54,6 +54,9 @@ cvar_t mp_coop = { "mp_coop", "0", FCVAR_SERVER };
cvar_t mp_coop_changelevel = { "mp_coop_changelevel", "0", FCVAR_SERVER }; cvar_t mp_coop_changelevel = { "mp_coop_changelevel", "0", FCVAR_SERVER };
cvar_t mp_coop_nofriendlyfire = { "mp_coop_nofriendlyfire", "0", FCVAR_SERVER }; cvar_t mp_coop_nofriendlyfire = { "mp_coop_nofriendlyfire", "0", FCVAR_SERVER };
cvar_t mp_coop_disabledmap = { "mp_coop_disabledmap", "", FCVAR_SERVER }; cvar_t mp_coop_disabledmap = { "mp_coop_disabledmap", "", FCVAR_SERVER };
cvar_t mp_unduck = { "mp_unduck", "0", FCVAR_SERVER };
cvar_t mp_semclip = { "mp_semclip", "0", FCVAR_SERVER };
// Engine Cvars // Engine Cvars
cvar_t *g_psv_gravity = NULL; cvar_t *g_psv_gravity = NULL;
cvar_t *g_psv_aim = NULL; cvar_t *g_psv_aim = NULL;
@ -499,6 +502,8 @@ void GameDLLInit( void )
CVAR_REGISTER( &mp_coop_changelevel ); CVAR_REGISTER( &mp_coop_changelevel );
CVAR_REGISTER( &mp_coop_nofriendlyfire ); CVAR_REGISTER( &mp_coop_nofriendlyfire );
CVAR_REGISTER( &mp_coop_disabledmap ); CVAR_REGISTER( &mp_coop_disabledmap );
CVAR_REGISTER( &mp_unduck );
CVAR_REGISTER( &mp_semclip );
CVAR_REGISTER( &mp_chattime ); CVAR_REGISTER( &mp_chattime );

3
dlls/game.h

@ -52,6 +52,9 @@ extern cvar_t mp_coop;
extern cvar_t mp_coop_changelevel; extern cvar_t mp_coop_changelevel;
extern cvar_t mp_coop_nofriendlyfire; extern cvar_t mp_coop_nofriendlyfire;
extern cvar_t mp_coop_disabledmap; extern cvar_t mp_coop_disabledmap;
extern cvar_t mp_unduck;
extern cvar_t mp_semclip;
extern bool g_fSavedDuck;
// Engine Cvars // Engine Cvars
extern cvar_t *g_psv_gravity; extern cvar_t *g_psv_gravity;

4
dlls/gamerules.cpp

@ -69,7 +69,7 @@ Vector FixupSpawnPoint(Vector spawn)
{ {
Vector point = spawn + Vector( 0, 0, 36 * i ); Vector point = spawn + Vector( 0, 0, 36 * i );
TraceResult tr; TraceResult tr;
UTIL_TraceHull( point, point, ignore_monsters, 1, NULL, &tr ); UTIL_TraceHull( point, point, ignore_monsters, (mp_unduck.value&&g_fSavedDuck)?head_hull:human_hull, NULL, &tr );
if( !tr.fStartSolid && !tr.fAllSolid ) if( !tr.fStartSolid && !tr.fAllSolid )
return point; return point;
i = -i; i = -i;
@ -98,6 +98,8 @@ edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer )
CoopGetSpawnPoint( &pPlayer->pev->origin, &pPlayer->pev->angles ); CoopGetSpawnPoint( &pPlayer->pev->origin, &pPlayer->pev->angles );
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 )
pPlayer->pev->flags |= FL_DUCKING;
return pentSpawnSpot; return pentSpawnSpot;
} }

45
dlls/player.cpp

@ -1849,6 +1849,35 @@ void CBasePlayer::PreThink( void )
{ {
pev->velocity = g_vecZero; pev->velocity = g_vecZero;
} }
if( mp_unduck.value )
{
if( (pev->button & IN_DUCK) && !(pev->button & IN_JUMP) )
{
TraceResult tr;
UTIL_TraceHull( pev->origin, pev->origin, ignore_monsters, human_hull, edict(), &tr );
if( tr.fStartSolid )
{
pev->view_ofs.z = 12;
pev->flags |= FL_DUCKING;
FixPlayerCrouchStuck(edict());
UTIL_SetSize( pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX );
}
}
}
if( mp_semclip.value )
{
for( int i = 1; i <= gpGlobals->maxClients; i++ )
{
CBaseEntity *plr = UTIL_PlayerByIndex( i );
if( plr && plr->pev->solid == SOLID_SLIDEBOX && plr->IsPlayer() )
{
plr->pev->solid = SOLID_TRIGGER;
}
}
}
} }
/* Time based Damage works as follows: /* Time based Damage works as follows:
1) There are several types of timebased damage: 1) There are several types of timebased damage:
@ -2418,6 +2447,20 @@ void CBasePlayer::PostThink()
if( !IsAlive() ) if( !IsAlive() )
goto pt_end; goto pt_end;
if( mp_semclip.value )
{
for( int i = 1; i < gpGlobals->maxClients; i++ )
{
CBaseEntity *plr = UTIL_PlayerByIndex( i );
if( plr && plr->pev->solid == SOLID_TRIGGER && plr->IsPlayer() )
{
plr->pev->solid = SOLID_SLIDEBOX;
UTIL_SetOrigin(pev, pev->origin);
}
}
}
// Handle Tank controlling // Handle Tank controlling
if( m_pTank != NULL ) if( m_pTank != NULL )
{ {
@ -2690,7 +2733,7 @@ edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer )
if( !FStrEq( STRING( pSpot->pev->netname ), STRING( gpGlobals->mapname ) ) ) if( !FStrEq( STRING( pSpot->pev->netname ), STRING( gpGlobals->mapname ) ) )
continue; continue;
// check if it is placed in wall // check if it is placed in wall
UTIL_TraceHull( pSpot->pev->origin, pSpot->pev->origin , missile, human_hull, NULL, &tr ); UTIL_TraceHull( pSpot->pev->origin, pSpot->pev->origin , missile, (mp_unduck.value&&g_fSavedDuck)?head_hull:human_hull, NULL, &tr );
if( tr.fStartSolid || tr.fAllSolid ) if( tr.fStartSolid || tr.fAllSolid )
continue; continue;
// trace down to find if there is no floor // trace down to find if there is no floor

18
dlls/triggers.cpp

@ -1496,14 +1496,21 @@ struct SavedCoords
Vector trainoffset; Vector trainoffset;
char trainglobal[256]; char trainglobal[256];
} g_SavedCoords; } g_SavedCoords;
void CoopClearData( void ) void CoopClearData( void )
{ {
// nullify // nullify
SavedCoords l_SavedCoords = {}; SavedCoords l_SavedCoords = {};
g_SavedCoords = l_SavedCoords; g_SavedCoords = l_SavedCoords;
} }
int g_iMenu; int g_iMenu;
void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot, signed char time = -1 ); void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot, signed char time = -1 );
bool g_fSavedDuck;
// Show to all spawned players: voting, etc.. // Show to all spawned players: voting, etc..
class GlobalMenu class GlobalMenu
{ {
@ -1741,7 +1748,8 @@ bool CoopRestorePlayerCoords(CBaseEntity *player, Vector *origin, Vector *angles
TraceResult tr; TraceResult tr;
Vector point = g_SavedCoords.origin[i] + g_SavedCoords.offset; Vector point = g_SavedCoords.origin[i] + g_SavedCoords.offset;
UTIL_TraceHull( point, point, missile, human_hull, NULL, &tr ); UTIL_TraceHull( point, point, missile, (mp_unduck.value&&g_fSavedDuck)?head_hull:human_hull, NULL, &tr );
g_SavedCoords.ip[i][0] = 0; g_SavedCoords.ip[i][0] = 0;
if( tr.fStartSolid || tr.fAllSolid ) if( tr.fStartSolid || tr.fAllSolid )
@ -1783,7 +1791,11 @@ bool CoopGetSpawnPoint( Vector *origin, Vector *angles)
point = point + g_SavedCoords.offset; point = point + g_SavedCoords.offset;
//UTIL_TraceHull( point, point, ignore_monsters, human_hull, NULL, &tr ); //UTIL_TraceHull( point, point, ignore_monsters, human_hull, NULL, &tr );
UTIL_TraceHull( point, point + angle * 100, missile, human_hull, NULL, &tr ); if( mp_unduck.value )
UTIL_TraceHull( point, point + angle * 100, missile, head_hull, NULL, &tr );
else
UTIL_TraceHull( point, point + angle * 100, missile, human_hull, NULL, &tr );
if( !tr.fStartSolid && !tr.fAllSolid ) if( !tr.fStartSolid && !tr.fAllSolid )
{ {
g_SavedCoords.triggerorigin = tr.vecEndPos; g_SavedCoords.triggerorigin = tr.vecEndPos;
@ -1973,12 +1985,14 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
} }
else else
{ {
g_fSavedDuck = false;
// Get current player's coordinated // Get current player's coordinated
if( pActivator && pActivator->IsPlayer() ) if( pActivator && pActivator->IsPlayer() )
{ {
l_SavedCoords.triggerangles = pActivator->pev->angles; l_SavedCoords.triggerangles = pActivator->pev->angles;
l_SavedCoords.triggerorigin = pActivator->pev->origin; l_SavedCoords.triggerorigin = pActivator->pev->origin;
l_SavedCoords.valid = true; l_SavedCoords.valid = true;
g_fSavedDuck = !!(pActivator->pev->flags & FL_DUCKING);
} }
} }

Loading…
Cancel
Save