//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include "cbase.h" #include "fx.h" #include "c_te_effect_dispatch.h" #include "c_te_legacytempents.h" #include "tempent.h" #include "c_te_basebeam.h" #include "iviewrender_beams.h" #include "c_baseplayer.h" #include "beam_shared.h" #define GAUSS_GLOW_SPRITE "sprites/hotglow.vmt" #define GAUSS_BEAM_SPRITE "sprites/smoke.vmt" int m_nGlowIndex; int m_nBeamIndex; void PrecacheGaussEffects(void *pUser) { m_nGlowIndex = modelinfo->GetModelIndex( GAUSS_GLOW_SPRITE ); m_nBeamIndex = modelinfo->GetModelIndex( GAUSS_BEAM_SPRITE ); } PRECACHE_REGISTER_FN(PrecacheGaussEffects); void HL1GaussBeam( const CEffectData &data ) { // beam expects ent + attach to be encoded in the entity index (legacy system) int nStartEntity = data.entindex() | ((1 & 0xF)<<12); C_BaseEntity * pEnt = cl_entitylist->GetEnt( BEAMENT_ENTITY(nStartEntity) ); if ( !pEnt->IsPlayer() ) return; C_BasePlayer * pPlayer = static_cast(pEnt); int nStartAttachment = -1; if ( pPlayer->IsLocalPlayer() ) { nStartEntity = pPlayer->GetViewModel()->entindex(); } else { if ( !pPlayer->GetActiveWeapon() ) // TODO : make sure we have the gauss gun return; nStartEntity = pPlayer->GetActiveWeapon()->entindex(); nStartAttachment = 2; } nStartEntity |= ((1 & 0xF)<<12); Vector vecEndPoint = data.m_vOrigin; bool fIsPrimaryFire = data.m_fFlags; float flStartWidth; float flEndWidth; color32 beamColor; if ( fIsPrimaryFire ) // primary attack { flStartWidth = 1.0; flEndWidth = 1.0; beamColor.r = 255; beamColor.g = 255; beamColor.b = 0; beamColor.a = 255; } else // secondary { flStartWidth = 2.5; flEndWidth = 2.5; beamColor.r = 255; beamColor.g = 255; beamColor.b = 255; beamColor.a = 255; } beams->CreateBeamEntPoint( nStartEntity, // start ent NULL, // start pos 0, // end ent &vecEndPoint, // end pos m_nBeamIndex, // model index NULL, // halo index 0.0, // halo scale 0.1, // life flStartWidth, // startwidth flEndWidth, // endwidth 0.0, // fade length 0, // amplitude beamColor.a, // brightness 0, // speed 0, // startframe 0, // framerate beamColor.r, // R beamColor.g, // G beamColor.b // B ); //ADRIANHL1MP } DECLARE_CLIENT_EFFECT( "HL1GaussBeam", HL1GaussBeam ); void HL1GaussBeamReflect( const CEffectData &data ) { Vector vecStartPoint = data.m_vStart; Vector vecEndPoint = data.m_vOrigin; bool fIsPrimaryFire = data.m_fFlags; float flStartWidth; float flEndWidth; color32 beamColor; if ( fIsPrimaryFire ) // primary attack { flStartWidth = 1.0; flEndWidth = 1.0; beamColor.r = 255; beamColor.g = 255; beamColor.b = 0; beamColor.a = 255; } else // secondary { flStartWidth = 2.5; flEndWidth = 2.5; beamColor.r = 255; beamColor.g = 255; beamColor.b = 255; beamColor.a = 255; } beams->CreateBeamPoints( vecStartPoint, // start pos vecEndPoint, // end pos m_nBeamIndex, // model index NULL, // halo index 0.0, // halo scale 0.1, // life flStartWidth, // startwidth flEndWidth, // endwidth 0.0, // fade length 0, // amplitude beamColor.a, // brightness 0, // speed 0, // startframe 0, // framerate beamColor.r, // R beamColor.g, // G beamColor.b // B ); } DECLARE_CLIENT_EFFECT( "HL1GaussBeamReflect", HL1GaussBeamReflect ); void HL1GaussReflect( const CEffectData &data ) { Vector vecStart = data.m_vOrigin; Vector vecNormal = data.m_vNormal; float flMagnitude = data.m_flMagnitude; tempents->TempSprite( vecStart, vec3_origin, 0.2, m_nGlowIndex, kRenderGlow, kRenderFxNoDissipation, flMagnitude / 255.0, flMagnitude * 0.05, FTENT_FADEOUT ); Vector vecForward; VectorAdd( vecStart, vecNormal, vecForward ); tempents->Sprite_Trail( vecStart, vecForward, m_nGlowIndex, 3, 0.1, random->RandomFloat( 0.1, 0.2 ), 100, 255, 100 ); } DECLARE_CLIENT_EFFECT( "HL1GaussReflect", HL1GaussReflect ); void HL1GaussWallPunchEnter( const CEffectData &data ) { Vector vecStart = data.m_vOrigin; Vector vecNormal = data.m_vNormal; Vector vecForward; VectorSubtract( vecStart, vecNormal, vecForward ); tempents->Sprite_Trail( vecStart, vecForward, m_nGlowIndex, 3, 0.1, random->RandomFloat( 0.1, 0.2 ), 100, 255, 100 ); } DECLARE_CLIENT_EFFECT( "HL1GaussWallPunchEnter", HL1GaussWallPunchEnter ); void HL1GaussWallPunchExit( const CEffectData &data ) { Vector vecStart = data.m_vOrigin; Vector vecNormal = data.m_vNormal; float flMagnitude = data.m_flMagnitude; tempents->TempSprite( vecStart, vec3_origin, 0.1, m_nGlowIndex, kRenderGlow, kRenderFxNoDissipation, flMagnitude * 1.2 / 255.0, 6.0, FTENT_FADEOUT ); Vector vecForward; VectorSubtract( vecStart, vecNormal, vecForward ); tempents->Sprite_Trail( vecStart, vecForward, m_nGlowIndex, flMagnitude * 0.3, 0.1, random->RandomFloat( 0.1, 0.2 ), 200, 255, 40 ); } DECLARE_CLIENT_EFFECT( "HL1GaussWallPunchExit", HL1GaussWallPunchExit ); void HL1GaussWallImpact1( const CEffectData &data ) { Vector vecStart = data.m_vOrigin; float flMagnitude = data.m_flMagnitude; tempents->TempSprite( vecStart, vec3_origin, 1, m_nGlowIndex, kRenderGlow, kRenderFxNoDissipation, flMagnitude / 255.0, 6.0, FTENT_FADEOUT ); } DECLARE_CLIENT_EFFECT( "HL1GaussWallImpact1", HL1GaussWallImpact1 ); void HL1GaussWallImpact2( const CEffectData &data ) { Vector vecStart = data.m_vOrigin; Vector vecNormal = data.m_vNormal; tempents->TempSprite( vecStart, vec3_origin, 0.2, m_nGlowIndex, kRenderGlow, kRenderFxNoDissipation, 240.0 / 255.0, 0.3, FTENT_FADEOUT ); Vector vecForward; VectorAdd( vecStart, vecNormal, vecForward ); tempents->Sprite_Trail( vecStart, vecForward, m_nGlowIndex, 8, 0.6, random->RandomFloat( 0.1, 0.2 ), 100, 255, 200 ); } DECLARE_CLIENT_EFFECT( "HL1GaussWallImpact2", HL1GaussWallImpact2 );