191 lines
5.0 KiB
C++
191 lines
5.0 KiB
C++
|
#include "cbase.h"
|
||
|
#include "mathlib/mathlib.h"
|
||
|
#include "util_shared.h"
|
||
|
//#include "model_types.h"
|
||
|
#include "convar.h"
|
||
|
#include "IEffects.h"
|
||
|
//#include "vphysics/object_hash.h"
|
||
|
//#include "IceKey.H"
|
||
|
//#include "checksum_crc.h"
|
||
|
#include "asw_fx_shared.h"
|
||
|
#include "particle_parse.h"
|
||
|
|
||
|
#ifdef CLIENT_DLL
|
||
|
#include "c_te_effect_dispatch.h"
|
||
|
#else
|
||
|
#include "te_effect_dispatch.h"
|
||
|
#include "Sprite.h"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
#ifdef GAME_DLL
|
||
|
// link clientside sprite to CSprite - can remove this if we fixup all the maps to not have _clientside ones (do when we're sure we don't need clientside sprites)
|
||
|
LINK_ENTITY_TO_CLASS( env_sprite_clientside, CSprite );
|
||
|
#endif
|
||
|
|
||
|
void UTIL_ASW_EggGibs( const Vector &pos, int iFlags, int iEntIndex )
|
||
|
{
|
||
|
#ifdef GAME_DLL
|
||
|
Vector vecOrigin = pos;
|
||
|
CPASFilter filter( vecOrigin );
|
||
|
UserMessageBegin( filter, "ASWEggEffects" );
|
||
|
WRITE_FLOAT( vecOrigin.x );
|
||
|
WRITE_FLOAT( vecOrigin.y );
|
||
|
WRITE_FLOAT( vecOrigin.z );
|
||
|
WRITE_SHORT( iFlags );
|
||
|
WRITE_SHORT( iEntIndex );
|
||
|
MessageEnd();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void UTIL_ASW_BuzzerDeath( const Vector &pos )
|
||
|
{
|
||
|
#ifdef GAME_DLL
|
||
|
Vector vecExplosionPos = pos;
|
||
|
CPASFilter filter( vecExplosionPos );
|
||
|
UserMessageBegin( filter, "ASWBuzzerDeath" );
|
||
|
WRITE_FLOAT( vecExplosionPos.x );
|
||
|
WRITE_FLOAT( vecExplosionPos.y );
|
||
|
WRITE_FLOAT( vecExplosionPos.z );
|
||
|
MessageEnd();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void UTIL_ASW_DroneBleed( const Vector &pos, const Vector &dir, int amount )
|
||
|
{
|
||
|
CEffectData data;
|
||
|
|
||
|
data.m_vOrigin = pos;
|
||
|
data.m_vNormal = dir;
|
||
|
//data.m_flScale = (float)amount;
|
||
|
|
||
|
// todo: use filter?
|
||
|
QAngle vecAngles;
|
||
|
VectorAngles( data.m_vNormal, vecAngles );
|
||
|
DispatchParticleEffect( "drone_shot", data.m_vOrigin, vecAngles );
|
||
|
|
||
|
//DispatchEffect( "DroneBleed", data );
|
||
|
}
|
||
|
|
||
|
void UTIL_ASW_BloodImpact( const Vector &pos, const Vector &dir, int color, int amount )
|
||
|
{
|
||
|
CEffectData data;
|
||
|
|
||
|
data.m_vOrigin = pos;
|
||
|
data.m_vNormal = dir;
|
||
|
data.m_flScale = (float)amount;
|
||
|
data.m_nColor = (unsigned char)color;
|
||
|
|
||
|
DispatchEffect( "ASWBloodImpact", data );
|
||
|
}
|
||
|
|
||
|
void UTIL_ASW_BloodDrips( const Vector &origin, const Vector &direction, int color, int amount )
|
||
|
{
|
||
|
if ( !UTIL_ShouldShowBlood( color ) )
|
||
|
return;
|
||
|
|
||
|
if ( color == DONT_BLEED || amount == 0 )
|
||
|
return;
|
||
|
|
||
|
if ( g_Language.GetInt() == LANGUAGE_GERMAN && color == BLOOD_COLOR_RED )
|
||
|
color = 0;
|
||
|
|
||
|
if ( amount > 255 )
|
||
|
amount = 255;
|
||
|
|
||
|
if (color == BLOOD_COLOR_MECH)
|
||
|
{
|
||
|
g_pEffects->Sparks(origin);
|
||
|
if (random->RandomFloat(0, 2) >= 1)
|
||
|
{
|
||
|
UTIL_Smoke(origin, random->RandomInt(10, 15), 10);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Normal blood impact
|
||
|
//UTIL_ASW_BloodImpact( origin, direction, color, amount );
|
||
|
QAngle vecAngles;
|
||
|
VectorAngles( direction, vecAngles );
|
||
|
if ( amount < 4 )
|
||
|
DispatchParticleEffect( "marine_bloodsplat_light", origin, vecAngles );
|
||
|
else
|
||
|
DispatchParticleEffect( "marine_bloodsplat_heavy", origin, vecAngles );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UTIL_ASW_MarineTakeDamage( const Vector &origin, const Vector &direction, int color, int amount, CASW_Marine *pMarine, bool bFriendly )
|
||
|
{
|
||
|
if ( !UTIL_ShouldShowBlood( color ) )
|
||
|
return;
|
||
|
|
||
|
if ( color == DONT_BLEED || amount == 0 )
|
||
|
return;
|
||
|
|
||
|
if ( g_Language.GetInt() == LANGUAGE_GERMAN && color == BLOOD_COLOR_RED )
|
||
|
color = 0;
|
||
|
|
||
|
if ( amount > 255 )
|
||
|
amount = 255;
|
||
|
|
||
|
// TODO: use amount to determine large versus small attacks taken?
|
||
|
QAngle vecAngles;
|
||
|
VectorAngles( -direction, vecAngles );
|
||
|
Vector vecForward, vecRight, vecUp;
|
||
|
AngleVectors( vecAngles, &vecForward, &vecRight, &vecUp );
|
||
|
|
||
|
#ifdef CLIENT_DLL
|
||
|
const char *pchEffectName = NULL;
|
||
|
if ( bFriendly )
|
||
|
pchEffectName = "marine_hit_blood_ff";
|
||
|
else
|
||
|
pchEffectName = "marine_hit_blood";
|
||
|
|
||
|
CUtlReference< CNewParticleEffect > pEffect;
|
||
|
pEffect = pMarine->ParticleProp()->Create( pchEffectName, PATTACH_CUSTOMORIGIN );
|
||
|
|
||
|
if ( pEffect )
|
||
|
{
|
||
|
pMarine->ParticleProp()->AddControlPoint( pEffect, 2, pMarine, PATTACH_ABSORIGIN_FOLLOW );
|
||
|
pEffect->SetControlPoint( 0, origin );//origin - pMarine->GetAbsOrigin()
|
||
|
pEffect->SetControlPointOrientation( 0, vecForward, vecRight, vecUp );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Warning( "Could not create effect for marine hurt: %s", pchEffectName );
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void UTIL_ASW_GrenadeExplosion( const Vector &vecPos, float flRadius )
|
||
|
{
|
||
|
#ifdef GAME_DLL
|
||
|
Vector vecExplosionPos = vecPos;
|
||
|
CPASFilter filter( vecExplosionPos );
|
||
|
UserMessageBegin( filter, "ASWGrenadeExplosion" );
|
||
|
WRITE_FLOAT( vecExplosionPos.x );
|
||
|
WRITE_FLOAT( vecExplosionPos.y );
|
||
|
WRITE_FLOAT( vecExplosionPos.z );
|
||
|
WRITE_FLOAT( flRadius );
|
||
|
MessageEnd();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void UTIL_ASW_EnvExplosionFX( const Vector &vecPos, float flRadius, bool bOnGround )
|
||
|
{
|
||
|
#ifdef GAME_DLL
|
||
|
Vector vecExplosionPos = vecPos;
|
||
|
CPASFilter filter( vecExplosionPos );
|
||
|
UserMessageBegin( filter, "ASWEnvExplosionFX" );
|
||
|
WRITE_FLOAT( vecExplosionPos.x );
|
||
|
WRITE_FLOAT( vecExplosionPos.y );
|
||
|
WRITE_FLOAT( vecExplosionPos.z );
|
||
|
WRITE_FLOAT( flRadius );
|
||
|
WRITE_BOOL( bOnGround );
|
||
|
//damage.bFriendlyFire = msg.ReadOneBit() ? true : false;
|
||
|
MessageEnd();
|
||
|
#endif
|
||
|
}
|