Files
HL2Overcharged/game/client/hl2/c_weapon_stunstick.cpp
2025-05-21 21:09:22 +03:00

188 lines
4.8 KiB
C++

//========= 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()