Skip to content

Commit

Permalink
Merge pull request #96 from fortressforever/features/ramp-sliding-sparks
Browse files Browse the repository at this point in the history
Rampslide sparks (take 2)
  • Loading branch information
squeek502 committed Mar 22, 2015
2 parents 3d381cb + ace4f7f commit 7568ea4
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 2 deletions.
55 changes: 55 additions & 0 deletions cl_dll/ff/c_ff_player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "dlight.h"
#include "beamdraw.h"
#include "fx.h"
#include "decals.h"
#include "c_te_effect_dispatch.h"

#include "view.h"
Expand Down Expand Up @@ -133,6 +134,15 @@ ConVar cl_gib_blood_force_scale("cl_gib_blood_force_scale", ".1", FCVAR_ARCHIVE)
ConVar cl_gib_blood_count("cl_gib_blood_count", "3", FCVAR_ARCHIVE);
ConVar cl_gib_blood_force_randomness("cl_gib_blood_force_randomness", "1", FCVAR_ARCHIVE);

// rampslide effect settings
ConVar cl_rampslidefx("cl_rampslidefx", "1", FCVAR_ARCHIVE, "Enables/disables rampslide particle effects");
ConVar cl_rampslidefx_interval("cl_rampslidefx_interval", "0", FCVAR_ARCHIVE, "Time between spawning rampslide particles");
ConVar cl_rampslidefx_offset("cl_rampslidefx_offset", "8", FCVAR_ARCHIVE, "Maximum random horizontal offset from the feet of the player to spawn rampsliding effects");
ConVar cl_rampslidefx_offset_vertical("cl_rampslidefx_offset_vertical", "0", FCVAR_ARCHIVE, "Vertical offset from the feet of the player to spawn rampsliding effects", true, -4.0f, true, 32.0f);
ConVar cl_rampslidefx_spark_length("cl_rampslidefx_spark_length", "1", FCVAR_ARCHIVE, "Length of the sparks");
ConVar cl_rampslidefx_dust_size("cl_rampslidefx_dust_size", "4", FCVAR_ARCHIVE, "The number of dust particles spawned");
ConVar cl_rampslidefx_debug("cl_rampslidefx_alwayson", "0", FCVAR_CLIENTDLL | FCVAR_CHEAT, "If 1, spawns ramspliding particles regardless of whether or not player are actually rampsliding");

ConVar r_selfshadows( "r_selfshadows", "0", FCVAR_CLIENTDLL, "Toggles player & player carried objects' shadows", true, 0, true, 1 );
static ConVar cl_classautokill( "cl_classautokill", "0", FCVAR_USERINFO | FCVAR_ARCHIVE, "Change class instantly");

Expand Down Expand Up @@ -856,6 +866,7 @@ IMPLEMENT_CLIENTCLASS_DT( C_FFPlayer, DT_FFPlayer, CFFPlayer )
RecvPropBool( RECVINFO( m_bConcussed ) ),
RecvPropBool( RECVINFO( m_bTranqed ) ),
RecvPropBool( RECVINFO( m_bSliding ) ),
RecvPropBool( RECVINFO( m_bIsRampsliding ) ),
RecvPropEHandle( RECVINFO( m_hActiveSlowfield ) ),
RecvPropBool( RECVINFO( m_bInfected ) ),
RecvPropBool( RECVINFO( m_bImmune ) ),
Expand Down Expand Up @@ -1263,6 +1274,8 @@ C_FFPlayer::C_FFPlayer() :
m_flSlidingTime = 0;
m_bSliding = false;

m_bIsRampsliding = false;

m_flSpeedModifier = 1.0f;

m_iHallucinationIndex = 0;
Expand Down Expand Up @@ -2454,6 +2467,48 @@ void C_FFPlayer::ClientThink( void )
// Hopefully when the particles die the ::Create()
// stuff gets removed automagically?

if (cl_rampslidefx.GetBool() && (cl_rampslidefx_debug.GetBool() || IsRampsliding()) && gpGlobals->curtime >= m_flNextRampslideFX && GetAbsVelocity().LengthSqr() > 0)
{
bool bIsSlidingOnMetal = false;
Vector vecDir = Vector(0,0,1);

// get ground
trace_t tr;
Vector vecStartPos = GetAbsOrigin();
vecStartPos.z += GetPlayerMins()[ 2 ];
Vector vecEndPos = vecStartPos - Vector(0,0,32);
UTIL_TraceLine( vecStartPos, vecEndPos, MASK_PLAYERSOLID_BRUSHONLY, this, COLLISION_GROUP_PLAYER_MOVEMENT, &tr );

if (tr.DidHit())
{
surfacedata_t *pSurfaceData = physprops->GetSurfaceData( tr.surface.surfaceProps );
char cMaterial = pSurfaceData->game.material;

bIsSlidingOnMetal = cMaterial == CHAR_TEX_METAL || cMaterial == CHAR_TEX_VENT || cMaterial == CHAR_TEX_GRATE || cMaterial == CHAR_TEX_COMPUTER;

vecDir = tr.plane.normal;
}

int iRandomOffset = cl_rampslidefx_offset.GetFloat();
float flVerticalOffset = cl_rampslidefx_offset_vertical.GetFloat();

// sparks on metal, dust on everything else
if ( bIsSlidingOnMetal )
{
int iSparkMagnitude = 1.0f; // controls the width of the spark, but doesn't seem to affect much, so it's not particularly useful
int iSparkLength = cl_rampslidefx_spark_length.GetInt();
g_pEffects->Sparks(GetFeetOrigin() + Vector(random->RandomFloat(-iRandomOffset, iRandomOffset), random->RandomFloat(-iRandomOffset, iRandomOffset), flVerticalOffset), iSparkMagnitude, iSparkLength, &vecDir);
}
else
{
float flDustSize = cl_rampslidefx_dust_size.GetFloat();
float flDustSpeed = 0.0f; // controls how far apart the dust particles get spawned in vecDir's direction; not particularly useful
g_pEffects->Dust(GetFeetOrigin() + Vector(random->RandomFloat(-iRandomOffset, iRandomOffset), random->RandomFloat(-iRandomOffset, iRandomOffset), flVerticalOffset), vecDir, flDustSize, flDustSpeed);
}

m_flNextRampslideFX = gpGlobals->curtime + cl_rampslidefx_interval.GetFloat();
}

// Update infection emitters
if( IsAlive() && IsInfected() && !IsImmune() && !IsDormant() )
{
Expand Down
8 changes: 8 additions & 0 deletions cl_dll/ff/c_ff_player.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "ff_buildableobjects_shared.h"
#include "ff_radiotagdata.h"
#include "model_types.h"
#include "IEffects.h"

class C_FFBuildableObject;
class C_FFDetpack;
Expand Down Expand Up @@ -530,6 +531,13 @@ class C_FFPlayer : public C_BasePlayer, public IFFPlayerAnimStateHelpers
// ----------------------------------
// *** SQUEEK

public:
bool IsRampsliding( void ) const { return m_bIsRampsliding; }
void SetRampsliding( bool bIsRampsliding ) { m_bIsRampsliding = bIsRampsliding; }
protected:
bool m_bIsRampsliding;
float m_flNextRampslideFX;

// ----------------------------------
// Cloak stuff
public:
Expand Down
3 changes: 3 additions & 0 deletions dlls/ff/ff_player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,7 @@ IMPLEMENT_SERVERCLASS_ST( CFFPlayer, DT_FFPlayer )
SendPropBool( SENDINFO( m_bConcussed ) ),
SendPropBool( SENDINFO( m_bTranqed ) ),
SendPropBool( SENDINFO( m_bSliding ) ),
SendPropBool( SENDINFO( m_bIsRampsliding ) ),
SendPropEHandle( SENDINFO( m_hActiveSlowfield ) ),
SendPropBool( SENDINFO( m_bInfected ) ),
SendPropBool( SENDINFO( m_bImmune ) ),
Expand Down Expand Up @@ -575,6 +576,8 @@ CFFPlayer::CFFPlayer()
m_flSlidingTime = 0; // Not sliding on creation
m_bSliding = false;

m_bIsRampsliding = false;

m_bGassed = false;
m_hGasser = NULL;
m_flNextGas = 0;
Expand Down
6 changes: 6 additions & 0 deletions dlls/ff/ff_player.h
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,12 @@ class CFFPlayer : public CBasePlayer, public IFFPlayerAnimStateHelpers
void StopSliding( void ); // stop the overpressure friction/acceleration effect
CNetworkVar( bool, m_bSliding );

public:
bool IsRampsliding( void ) const { return m_bIsRampsliding; }
void SetRampsliding( bool bIsRampsliding ) { m_bIsRampsliding = bIsRampsliding; }
protected:
CNetworkVar( bool, m_bIsRampsliding );

public:
bool IsInfected( void ) const { return m_bInfected; }
bool IsImmune( void ) const { return m_bImmune; }
Expand Down
42 changes: 40 additions & 2 deletions game_shared/ff/ff_gamemovement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ class CFFGameMovement : public CGameMovement
virtual void WalkMove();
virtual void AirMove();
virtual void Friction();
bool IsRampSliding( CFFPlayer *pPlayer );

CFFGameMovement() {};
};
Expand Down Expand Up @@ -882,6 +883,42 @@ bool CFFGameMovement::CanAccelerate()
return true;
}

bool CFFGameMovement::IsRampSliding( CFFPlayer *pPlayer )
{
if (pPlayer->GetGroundEntity() == NULL) // Rampsliding occurs when normal ground detection fails
{
// Take the lateral velocity
Vector vecVelocity = mv->m_vecVelocity * Vector(1.0f, 1.0f, 0.0f);
float flHorizontalSpeed = vecVelocity.Length();

if (flHorizontalSpeed > SV_TRIMPTRIGGERSPEED)
{
trace_t pm;

Vector vecStart = mv->m_vecAbsOrigin;
Vector vecStop = vecStart - Vector(0, 0, 0.1f);

TracePlayerBBox(vecStart, vecStop, MASK_PLAYERSOLID, COLLISION_GROUP_PLAYER_MOVEMENT, pm); // but actually you are on the ground

// Found the floor
if(pm.fraction != 1.0f)
{
if (flHorizontalSpeed > 0)
vecVelocity /= flHorizontalSpeed;

float flDotProduct = DotProduct(vecVelocity, pm.plane.normal);
if (flDotProduct < -0.15f) // On an upwards ramp
{
return true;
}
}
}

}

return false;
}

//-----------------------------------------------------------------------------
// Purpose: Check player velocity & clamp if cloaked
//-----------------------------------------------------------------------------
Expand All @@ -895,7 +932,9 @@ void CFFGameMovement::CheckVelocity( void )
CFFPlayer *pPlayer = ToFFPlayer( player );
if( !pPlayer )
return;


pPlayer->SetRampsliding(IsRampSliding(pPlayer));

if( !pPlayer->IsCloaked() )
return;

Expand All @@ -908,7 +947,6 @@ void CFFGameMovement::CheckVelocity( void )
mv->m_vecVelocity.y *= 0.5f;
}
}

// Expose our interface.
static CFFGameMovement g_GameMovement;
IGameMovement *g_pGameMovement = ( IGameMovement * )&g_GameMovement;
Expand Down

0 comments on commit 7568ea4

Please sign in to comment.