You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
4.9 KiB
187 lines
4.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "c_basehlcombatweapon.h" |
|
#include "iviewrender_beams.h" |
|
#include "beam_shared.h" |
|
#include "c_weapon__stubs.h" |
|
#include "materialsystem/imaterial.h" |
|
#include "clienteffectprecachesystem.h" |
|
#include "beamdraw.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
CLIENTEFFECT_REGISTER_BEGIN( PrecacheEffectStunstick ) |
|
CLIENTEFFECT_MATERIAL( "effects/stunstick" ) |
|
CLIENTEFFECT_REGISTER_END() |
|
|
|
class C_WeaponStunStick : public C_BaseHLBludgeonWeapon |
|
{ |
|
DECLARE_CLASS( C_WeaponStunStick, C_BaseHLBludgeonWeapon ); |
|
public: |
|
DECLARE_CLIENTCLASS(); |
|
DECLARE_PREDICTABLE(); |
|
|
|
int DrawModel( int flags ) |
|
{ |
|
//FIXME: This sucks, but I can't easily create temp ents... |
|
|
|
if ( m_bActive ) |
|
{ |
|
Vector vecOrigin; |
|
QAngle vecAngles; |
|
float color[3]; |
|
|
|
color[0] = color[1] = color[2] = random->RandomFloat( 0.1f, 0.2f ); |
|
|
|
GetAttachment( 1, vecOrigin, vecAngles ); |
|
|
|
Vector vForward; |
|
AngleVectors( vecAngles, &vForward ); |
|
|
|
Vector vEnd = vecOrigin - vForward * 1.0f; |
|
|
|
IMaterial *pMaterial = materials->FindMaterial( "effects/stunstick", NULL, false ); |
|
|
|
CMatRenderContextPtr pRenderContext( materials ); |
|
pRenderContext->Bind( pMaterial ); |
|
DrawHalo( pMaterial, vEnd, random->RandomFloat( 4.0f, 6.0f ), color ); |
|
|
|
color[0] = color[1] = color[2] = random->RandomFloat( 0.9f, 1.0f ); |
|
|
|
DrawHalo( pMaterial, vEnd, random->RandomFloat( 2.0f, 3.0f ), color ); |
|
} |
|
|
|
return BaseClass::DrawModel( flags ); |
|
} |
|
|
|
// Do part of our effect |
|
void ClientThink( void ) |
|
{ |
|
// Update our effects |
|
if ( m_bActive && |
|
gpGlobals->frametime != 0.0f && |
|
( random->RandomInt( 0, 5 ) == 0 ) ) |
|
{ |
|
Vector vecOrigin; |
|
QAngle vecAngles; |
|
|
|
GetAttachment( 1, vecOrigin, vecAngles ); |
|
|
|
Vector vForward; |
|
AngleVectors( vecAngles, &vForward ); |
|
|
|
Vector vEnd = vecOrigin - vForward * 1.0f; |
|
|
|
// Inner beams |
|
BeamInfo_t beamInfo; |
|
|
|
beamInfo.m_vecStart = vEnd; |
|
Vector offset = RandomVector( -6, 2 ); |
|
|
|
offset += Vector(2,2,2); |
|
beamInfo.m_vecEnd = vecOrigin + offset; |
|
|
|
beamInfo.m_pStartEnt= cl_entitylist->GetEnt( BEAMENT_ENTITY( entindex() ) ); |
|
beamInfo.m_pEndEnt = cl_entitylist->GetEnt( BEAMENT_ENTITY( entindex() ) ); |
|
beamInfo.m_nStartAttachment = 1; |
|
beamInfo.m_nEndAttachment = 2; |
|
|
|
beamInfo.m_nType = TE_BEAMTESLA; |
|
beamInfo.m_pszModelName = "sprites/physbeam.vmt"; |
|
beamInfo.m_flHaloScale = 0.0f; |
|
beamInfo.m_flLife = 0.01f; |
|
beamInfo.m_flWidth = random->RandomFloat( 0.5f, 2.0f ); |
|
beamInfo.m_flEndWidth = 0; |
|
beamInfo.m_flFadeLength = 0.0f; |
|
beamInfo.m_flAmplitude = random->RandomFloat( 1, 2 ); |
|
beamInfo.m_flBrightness = 255.0; |
|
beamInfo.m_flSpeed = 0.0; |
|
beamInfo.m_nStartFrame = 0.0; |
|
beamInfo.m_flFrameRate = 1.0f; |
|
beamInfo.m_flRed = 255.0f;; |
|
beamInfo.m_flGreen = 255.0f; |
|
beamInfo.m_flBlue = 255.0f; |
|
beamInfo.m_nSegments = 8; |
|
beamInfo.m_bRenderable = true; |
|
beamInfo.m_nFlags = (FBEAM_ONLYNOISEONCE|FBEAM_SHADEOUT); |
|
|
|
beams->CreateBeamPoints( beamInfo ); |
|
} |
|
} |
|
|
|
void OnDataChanged( DataUpdateType_t updateType ) |
|
{ |
|
BaseClass::OnDataChanged( updateType ); |
|
if ( updateType == DATA_UPDATE_CREATED ) |
|
{ |
|
SetNextClientThink( CLIENT_THINK_ALWAYS ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void StartStunEffect( void ) |
|
{ |
|
//TODO: Play startup sound |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void StopStunEffect( void ) |
|
{ |
|
//TODO: Play shutdown sound |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : RenderGroup_t |
|
//----------------------------------------------------------------------------- |
|
RenderGroup_t GetRenderGroup( void ) |
|
{ |
|
return RENDER_GROUP_TRANSLUCENT_ENTITY; |
|
} |
|
|
|
private: |
|
CNetworkVar( bool, m_bActive ); |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pData - |
|
// *pStruct - |
|
// *pOut - |
|
//----------------------------------------------------------------------------- |
|
void RecvProxy_StunActive( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
bool state = *((bool *)&pData->m_Value.m_Int); |
|
|
|
C_WeaponStunStick *pWeapon = (C_WeaponStunStick *) pStruct; |
|
|
|
if ( state ) |
|
{ |
|
// Turn on the effect |
|
pWeapon->StartStunEffect(); |
|
} |
|
else |
|
{ |
|
// Turn off the effect |
|
pWeapon->StopStunEffect(); |
|
} |
|
|
|
*(bool *)pOut = state; |
|
} |
|
|
|
STUB_WEAPON_CLASS_IMPLEMENT( weapon_stunstick, C_WeaponStunStick ); |
|
|
|
IMPLEMENT_CLIENTCLASS_DT( C_WeaponStunStick, DT_WeaponStunStick, CWeaponStunStick ) |
|
RecvPropInt( RECVINFO(m_bActive), 0, RecvProxy_StunActive ), |
|
END_RECV_TABLE() |
|
|
|
|