mirror of
https://github.com/celisej567/source-engine.git
synced 2026-09-27 16:15:14 +03:00
upload "kind" alien swarm
This commit is contained in:
108
game/shared/swarm/asw_laser_mine_shared.cpp
Normal file
108
game/shared/swarm/asw_laser_mine_shared.cpp
Normal file
@@ -0,0 +1,108 @@
|
||||
#include "cbase.h"
|
||||
#ifdef CLIENT_DLL
|
||||
#include "c_asw_laser_mine.h"
|
||||
#define CASW_Laser_Mine C_ASW_Laser_Mine
|
||||
#else
|
||||
#include "asw_laser_mine.h"
|
||||
#endif
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
#ifdef GAME_DLL
|
||||
extern ConVar asw_debug_mine;
|
||||
#endif
|
||||
|
||||
void CASW_Laser_Mine::UpdateLaser()
|
||||
{
|
||||
// trace along the laser to see if anything's there
|
||||
const float ASW_LASER_DETECTION_RANGE = 200.0f;
|
||||
const float ASW_LASER_START_DIST = 14.0f;
|
||||
Vector vecLaserDir, vecForward;
|
||||
QAngle angAimOffset = m_angLaserAim.Get();
|
||||
|
||||
matrix3x4_t facingMatrix;
|
||||
AngleMatrix( GetAbsAngles(), facingMatrix );
|
||||
|
||||
QAngle angRotateMine( 0, 90, 90 );
|
||||
matrix3x4_t fRotateMatrix;
|
||||
AngleMatrix( angRotateMine, fRotateMatrix );
|
||||
matrix3x4_t fRotateMatrixInv;
|
||||
MatrixInvert( fRotateMatrix, fRotateMatrixInv );
|
||||
|
||||
matrix3x4_t finalMatrix;
|
||||
QAngle angMine;
|
||||
ConcatTransforms( facingMatrix, fRotateMatrixInv, finalMatrix );
|
||||
MatrixAngles( finalMatrix, angMine );
|
||||
|
||||
AngleVectors( angMine, &vecForward );
|
||||
VectorRotate( vecForward, angAimOffset, vecLaserDir );
|
||||
|
||||
Vector vecSrc = WorldSpaceCenter() + vecLaserDir * ASW_LASER_START_DIST;
|
||||
Vector vecDest = vecSrc + vecLaserDir * ASW_LASER_DETECTION_RANGE;
|
||||
|
||||
#ifdef CLIENT_DLL
|
||||
if ( m_bMineActive.Get() )
|
||||
{
|
||||
if ( !m_pLaserEffect )
|
||||
{
|
||||
CreateLaserEffect();
|
||||
}
|
||||
|
||||
if ( m_pLaserEffect )
|
||||
{
|
||||
trace_t tr;
|
||||
UTIL_TraceLine( vecSrc, vecDest, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr );
|
||||
|
||||
m_pLaserEffect->SetControlPoint( 1, vecSrc );
|
||||
Vector vecLaserEnd = vecDest;
|
||||
if ( tr.startsolid )
|
||||
{
|
||||
vecLaserEnd = vecSrc;
|
||||
}
|
||||
else if ( tr.DidHit() )
|
||||
{
|
||||
vecLaserEnd = tr.endpos;
|
||||
}
|
||||
m_pLaserEffect->SetControlPoint( 2, vecLaserEnd );
|
||||
m_pLaserEffect->SetControlPointForwardVector ( 1, vecLaserDir );
|
||||
Vector vecImpactY, vecImpactZ;
|
||||
VectorVectors( tr.plane.normal, vecImpactY, vecImpactZ );
|
||||
vecImpactY *= -1.0f;
|
||||
m_pLaserEffect->SetControlPointOrientation( 2, vecImpactY, vecImpactZ, tr.plane.normal );
|
||||
float alpha = 1.0f; // TODO: fade this up as laser mine charges up
|
||||
m_pLaserEffect->SetControlPoint( 3, Vector( alpha, 0, 0 ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( m_pLaserEffect )
|
||||
{
|
||||
RemoveLaserEffect();
|
||||
}
|
||||
}
|
||||
#else
|
||||
Ray_t ray;
|
||||
ray.Init( vecSrc, vecDest, Vector( -10.0f, -10.0f, -10.0f ), Vector( 10.0f, 10.0f, 10.0f ) );
|
||||
|
||||
CBaseEntity *(pEntities[ 16 ]);
|
||||
CHurtableEntitiesEnum hurtableEntities( pEntities, 16 );
|
||||
partition->EnumerateElementsAlongRay( PARTITION_ENGINE_NON_STATIC_EDICTS | PARTITION_ENGINE_SOLID_EDICTS, ray, false, &hurtableEntities );
|
||||
|
||||
trace_t tr;
|
||||
|
||||
for ( int i = 0; i < hurtableEntities.GetCount(); ++i )
|
||||
{
|
||||
if ( ValidMineTarget( pEntities[ i ] ) )
|
||||
{
|
||||
if ( asw_debug_mine.GetBool() )
|
||||
{
|
||||
NDebugOverlay::Line( vecSrc, tr.endpos, 255, 0, 0, false, 0.1f );
|
||||
}
|
||||
Explode();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
Reference in New Issue
Block a user