mirror of
https://github.com/Gigaslav/HL2Overcharged.git
synced 2026-01-04 02:10:18 +03:00
459 lines
14 KiB
C++
459 lines
14 KiB
C++
|
|
#include "cbase.h"
|
|
#include "c_weapon__stubs.h"
|
|
#include "ClientEffectPrecacheSystem.h"
|
|
#include "c_basehlcombatweapon.h"
|
|
#include "basehlcombatweapon_shared.h"
|
|
#include "iviewrender_beams.h"
|
|
#include "beam_shared.h"
|
|
#include "iefx.h"
|
|
#include "dlight.h"
|
|
|
|
#include "input.h"//
|
|
#include "engine/ivdebugoverlay.h"
|
|
|
|
|
|
#include "dlight.h"
|
|
#include "r_efx.h"
|
|
#include "c_te_effect_dispatch.h"
|
|
|
|
//extern bool UTIL_GetWeaponAttachment( C_BaseCombatWeapon *pWeapon, int attachmentID, Vector &absOrigin, QAngle &absAngles );
|
|
extern void FormatViewModelAttachment( Vector &vOrigin, bool bInverse );
|
|
|
|
class C_WeaponIonRifle : public C_BaseHLCombatWeapon
|
|
{
|
|
DECLARE_CLASS(C_WeaponIonRifle, C_BaseHLCombatWeapon);
|
|
public:
|
|
|
|
DECLARE_CLIENTCLASS();
|
|
DECLARE_PREDICTABLE();
|
|
|
|
C_WeaponIonRifle();
|
|
|
|
virtual bool VisibleInWeaponSelection( void ) { return true; }
|
|
virtual bool CanBeSelected( void ) { return true; }
|
|
virtual bool HasAnyAmmo( void ) { return true; }
|
|
virtual bool HasAmmo( void ) { return true; }
|
|
|
|
void OnRestore( void );
|
|
void UpdateOnRemove( void );
|
|
|
|
bool IsCarriedByLocalPlayer();
|
|
|
|
virtual void ClientThink( void );
|
|
virtual void OnDataChanged( DataUpdateType_t updateType );
|
|
|
|
virtual bool IsWeaponCamera() { return (m_nZoomLevel == 0); }
|
|
|
|
void SetupAttachmentPoints();
|
|
|
|
CNewParticleEffect *pEffect;
|
|
EHANDLE m_hEntAttached;
|
|
|
|
bool EnableLaser;
|
|
|
|
protected:
|
|
|
|
float m_fNextZoom;
|
|
int m_nZoomLevel;
|
|
|
|
int iLaserAttachment;
|
|
|
|
};
|
|
|
|
STUB_WEAPON_CLASS_IMPLEMENT(weapon_ionrifle, C_WeaponIonRifle);
|
|
|
|
IMPLEMENT_CLIENTCLASS_DT(C_WeaponIonRifle, DT_WeaponIonRifle, CWeaponIonRifle)
|
|
RecvPropBool(RECVINFO(EnableLaser)),
|
|
END_RECV_TABLE()
|
|
|
|
C_WeaponIonRifle::C_WeaponIonRifle()
|
|
{
|
|
iLaserAttachment = -1;
|
|
|
|
m_nZoomLevel = 0;
|
|
|
|
//m_pELight = NULL;
|
|
}
|
|
|
|
void C_WeaponIonRifle::UpdateOnRemove()
|
|
{
|
|
BaseClass::UpdateOnRemove();
|
|
}
|
|
|
|
void C_WeaponIonRifle::OnRestore(void)
|
|
{
|
|
SetupAttachmentPoints();
|
|
|
|
BaseClass::OnRestore();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Starts the client-side version thinking
|
|
//-----------------------------------------------------------------------------
|
|
void C_WeaponIonRifle::OnDataChanged(DataUpdateType_t updateType)
|
|
{
|
|
BaseClass::OnDataChanged( updateType );
|
|
if ( iLaserAttachment == -1 )
|
|
{
|
|
SetupAttachmentPoints();
|
|
}
|
|
|
|
SetNextClientThink( CLIENT_THINK_ALWAYS );
|
|
}
|
|
|
|
bool C_WeaponIonRifle::IsCarriedByLocalPlayer(void)
|
|
{
|
|
CBaseViewModel *vm = NULL;
|
|
CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
|
|
if ( pOwner )
|
|
{
|
|
if ( pOwner->GetActiveWeapon() != this )
|
|
return false;
|
|
|
|
vm = pOwner->GetViewModel( m_nViewModelIndex );
|
|
if ( vm )
|
|
return ( !vm->IsEffectActive(EF_NODRAW) );
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
static ConVar oc_weapon_ionrifle_laser_pos_x("oc_weapon_ionrifle_laser_pos_x", "0.0", FCVAR_ARCHIVE);
|
|
static ConVar oc_weapon_ionrifle_laser_pos_y("oc_weapon_ionrifle_laser_pos_y", "-1.0", FCVAR_ARCHIVE);
|
|
static ConVar oc_weapon_ionrifle_laser_pos_z("oc_weapon_ionrifle_laser_pos_z", "-1.01", FCVAR_ARCHIVE);
|
|
|
|
static ConVar oc_weapon_ionrifle_laser_ang_x("oc_weapon_ionrifle_laser_ang_x", "-0", FCVAR_ARCHIVE);
|
|
static ConVar oc_weapon_ionrifle_laser_ang_y("oc_weapon_ionrifle_laser_ang_y", "-0", FCVAR_ARCHIVE);
|
|
static ConVar oc_weapon_ionrifle_laser_ang_z("oc_weapon_ionrifle_laser_ang_z", "-0", FCVAR_ARCHIVE);
|
|
|
|
void C_WeaponIonRifle::ClientThink(void)
|
|
{
|
|
|
|
if (iLaserAttachment == -1)
|
|
{
|
|
SetNextClientThink( CLIENT_THINK_NEVER );
|
|
|
|
/*if (m_pELight)
|
|
{
|
|
m_pELight->die = gpGlobals->curtime;
|
|
m_pELight = NULL;
|
|
}*/
|
|
return;
|
|
}
|
|
|
|
if ((IsCarriedByLocalPlayer() && !IsEffectActive(EF_NODRAW) && gpGlobals->frametime != 0.0f && m_fNextZoom <= gpGlobals->curtime) && EnableLaser)
|
|
{
|
|
|
|
|
|
Vector vecOrigin, vecAngles;
|
|
QAngle angAngles;
|
|
|
|
// Inner beams
|
|
BeamInfo_t beamInfo;
|
|
|
|
trace_t tr;
|
|
|
|
/*if (cvar->FindVar("oc_state_InReload")->GetInt() == 1)// || (cvar->FindVar("oc_state_near_wall_standing")->GetInt() == 1))//(m_nZoomLevel == 1)
|
|
{
|
|
C_BasePlayer *pOwner = ToBasePlayer(GetOwner());
|
|
C_BaseViewModel *pBeamEnt = pOwner->GetViewModel();
|
|
//C_BaseViewModel *pBeamEnt2 = pOwner->GetViewModel();
|
|
//C_BaseEntity *pEntity = m_hEntAttached;
|
|
|
|
iLaserAttachment = pOwner->GetViewModel()->LookupAttachment("Laser");
|
|
//pEntity->FollowEntity(pBeamEnt);
|
|
pBeamEnt->GetAttachment(iLaserAttachment, vecOrigin, angAngles);
|
|
|
|
//UTIL_GetWeaponAttachment( this, iLaserAttachment, vecOrigin, angAngles );
|
|
::FormatViewModelAttachment( vecOrigin, false );
|
|
|
|
beamInfo.m_vecEnd = vec3_origin;
|
|
beamInfo.m_pEndEnt = pBeamEnt;
|
|
beamInfo.m_nEndAttachment = iLaserAttachment;
|
|
|
|
|
|
Vector forward, right, up;
|
|
pOwner->EyeVectors(&forward, &right, &up);
|
|
|
|
|
|
AngleVectors(angAngles, &vecAngles);
|
|
UTIL_TraceLine(vecOrigin, vecOrigin + (vecAngles * MAX_TRACE_LENGTH), MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr);
|
|
//debugoverlay->AddLineOverlay(vecOrigin, pOwner->EyePosition() + (forward * MAX_TRACE_LENGTH), 255, 0, 0, true, 0.2f);
|
|
|
|
beamInfo.m_vecStart = tr.endpos;
|
|
beamInfo.m_pStartEnt = NULL;
|
|
beamInfo.m_nStartAttachment = -1;
|
|
|
|
|
|
Vector Muzzle;
|
|
Muzzle.x = cvar->FindVar("oc_muzzle_vector_x")->GetFloat();
|
|
Muzzle.y = cvar->FindVar("oc_muzzle_vector_y")->GetFloat();
|
|
Muzzle.z = cvar->FindVar("oc_muzzle_vector_z")->GetFloat();
|
|
|
|
|
|
pBeamEnt->SetAbsOrigin(vecOrigin);*/
|
|
|
|
|
|
//pBeamEnt2->SetAbsOrigin(vecOrigin);
|
|
|
|
/*vecOrigin += forward * oc_test_entity_x.GetFloat();
|
|
vecOrigin += right * oc_test_entity_y.GetFloat();
|
|
vecOrigin += up * oc_test_entity_z.GetFloat();*/
|
|
|
|
/*vecOrigin.x += oc_test_entity_x.GetFloat();
|
|
vecOrigin.y += oc_test_entity_y.GetFloat();
|
|
vecOrigin.z += oc_test_entity_z.GetFloat();*/
|
|
|
|
//if (Do)
|
|
/*{
|
|
pEffect = ParticleProp()->Create("sniper_laser", PATTACH_POINT_FOLLOW);
|
|
|
|
ParticleProp()->AddControlPoint(pEffect, 0, pBeamEnt2, PATTACH_ABSORIGIN_FOLLOW, "Laser", vecOrigin);
|
|
//ParticleProp()->AddControlPoint(pEffect, 1, pBeamEnt, PATTACH_POINT, "Laser", tr.endpos);
|
|
//pEffect->SetControlPoint(1, vecOrigin + vecOrigin * 100);// +(vecAngles * MAX_TRACE_LENGTH));
|
|
//pEffect->SetControlPointEntity(1, pBeamEnt);
|
|
pEffect->SetControlPoint(1, tr.endpos);
|
|
//pEffect->SetControlPoint(0, vecOrigin);// +(vecAngles * MAX_TRACE_LENGTH));
|
|
//pEffect->SetControlPointEntity(0, pBeamEnt);
|
|
pEffect->SetControlPointEntity(1, pBeamEnt);
|
|
|
|
|
|
}*/
|
|
|
|
//}
|
|
if ((cvar->FindVar("oc_state_is_running")->GetInt() == 0) && (cvar->FindVar("oc_state_InReload")->GetInt() == 0) && (cvar->FindVar("oc_state_near_wall_standing")->GetInt() == 0))
|
|
{
|
|
Vector vecOrigin2, vecOriginEnd2;
|
|
QAngle angAngles2;
|
|
C_BasePlayer *pOwner = ToBasePlayer(GetOwner());
|
|
C_BaseViewModel *pBeamEnt = pOwner->GetViewModel();
|
|
iLaserAttachment = pOwner->GetViewModel()->LookupAttachment("Laser");
|
|
pBeamEnt->GetAttachment(iLaserAttachment, vecOrigin2, angAngles);
|
|
::FormatViewModelAttachment(vecOrigin2, false);
|
|
|
|
Vector forward2, right2, Up2;
|
|
angAngles.x += oc_weapon_ionrifle_laser_ang_x.GetFloat();
|
|
angAngles.y += oc_weapon_ionrifle_laser_ang_y.GetFloat();
|
|
angAngles.z += oc_weapon_ionrifle_laser_ang_z.GetFloat();
|
|
AngleVectors(angAngles, &forward2, &right2, &Up2);
|
|
|
|
//Straith from muzzle
|
|
/*Vector vecOrigin3 = forward2 + right2 + Up2 * MAX_TRACE_LENGTH;
|
|
UTIL_TraceLine(vecOrigin2, vecOrigin2 + vecOrigin3, MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr);
|
|
beamInfo.m_vecEnd = vecOrigin2;
|
|
beamInfo.m_pEndEnt = pBeamEnt;
|
|
beamInfo.m_nEndAttachment = iLaserAttachment;
|
|
beamInfo.m_vecStart = tr.endpos;
|
|
beamInfo.m_pStartEnt = NULL;
|
|
beamInfo.m_nStartAttachment = -1;*/
|
|
|
|
Vector vecOrigin, vecForward, vecRight, vecUp;
|
|
pOwner->EyePositionAndVectors(&vecOrigin, &vecForward, &vecRight, &vecUp);
|
|
|
|
Vector vecStart = vecOrigin + (vecRight * 4) - (vecUp * 4);
|
|
|
|
/*beamInfo.m_vecEnd = vecOrigin2;
|
|
beamInfo.m_pEndEnt = pBeamEnt;
|
|
beamInfo.m_nEndAttachment = iLaserAttachment;
|
|
//beamInfo.m_vecCenter += RandomVector(-30.f,30.f);
|
|
vecOriginEnd2 = vecForward + vecRight + vecUp;//vecForward
|
|
vecOriginEnd2 += forward2 * oc_weapon_ionrifle_laser_x.GetFloat();
|
|
vecOriginEnd2 += right2 * oc_weapon_ionrifle_laser_y.GetFloat();
|
|
vecOriginEnd2 += Up2 * oc_weapon_ionrifle_laser_z.GetFloat();
|
|
|
|
UTIL_TraceLine(vecOrigin, vecOrigin + (vecOriginEnd2 * MAX_TRACE_LENGTH), MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr);//vecOrigin + (vecOriginEnd2 * MAX_TRACE_LENGTH)
|
|
|
|
beamInfo.m_vecStart = tr.endpos;
|
|
beamInfo.m_pStartEnt = NULL;
|
|
beamInfo.m_nStartAttachment = -1;*/
|
|
|
|
|
|
if (cvar->FindVar("oc_weapon_free_aim")->GetInt())
|
|
{
|
|
beamInfo.m_vecEnd = vecOrigin2;
|
|
beamInfo.m_pEndEnt = pBeamEnt;
|
|
beamInfo.m_nEndAttachment = iLaserAttachment;
|
|
vecOriginEnd2 = vecForward;
|
|
vecOriginEnd2 += vecForward + forward2 * oc_weapon_ionrifle_laser_pos_x.GetFloat();
|
|
vecOriginEnd2 += vecRight + right2 * oc_weapon_ionrifle_laser_pos_y.GetFloat();
|
|
vecOriginEnd2 += vecUp + Up2 * oc_weapon_ionrifle_laser_pos_z.GetFloat();
|
|
UTIL_TraceLine(vecOrigin, vecOrigin + (vecForward * MAX_TRACE_LENGTH), MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr);
|
|
beamInfo.m_vecStart = tr.endpos;
|
|
beamInfo.m_pStartEnt = NULL;
|
|
beamInfo.m_nStartAttachment = -1;
|
|
}
|
|
else if (cvar->FindVar("oc_state_IRsight_on")->GetInt() || cvar->FindVar("oc_state_InSecondFire")->GetInt())
|
|
{
|
|
beamInfo.m_vecEnd = vecOrigin2;
|
|
beamInfo.m_pEndEnt = pBeamEnt;
|
|
beamInfo.m_nEndAttachment = iLaserAttachment;
|
|
vecOriginEnd2 = vecForward;
|
|
vecOriginEnd2 += vecForward + forward2 * oc_weapon_ionrifle_laser_pos_x.GetFloat();
|
|
vecOriginEnd2 += vecRight + right2 * oc_weapon_ionrifle_laser_pos_y.GetFloat();
|
|
vecOriginEnd2 += vecUp + Up2 * oc_weapon_ionrifle_laser_pos_z.GetFloat();
|
|
UTIL_TraceLine(vecOrigin, vecOrigin + (vecForward * MAX_TRACE_LENGTH), MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr);
|
|
beamInfo.m_vecStart = tr.endpos;
|
|
beamInfo.m_pStartEnt = NULL;
|
|
beamInfo.m_nStartAttachment = -1;
|
|
}
|
|
else
|
|
{
|
|
beamInfo.m_vecEnd = vecOrigin2;
|
|
beamInfo.m_pEndEnt = pBeamEnt;
|
|
beamInfo.m_nEndAttachment = iLaserAttachment;
|
|
vecOriginEnd2 = vecForward + vecRight + vecUp;
|
|
vecOriginEnd2 += forward2 * oc_weapon_ionrifle_laser_pos_x.GetFloat();
|
|
vecOriginEnd2 += right2 * oc_weapon_ionrifle_laser_pos_y.GetFloat();
|
|
vecOriginEnd2 += Up2 * oc_weapon_ionrifle_laser_pos_z.GetFloat();
|
|
UTIL_TraceLine(vecOrigin, vecOrigin + (vecOriginEnd2 * MAX_TRACE_LENGTH), MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr);
|
|
beamInfo.m_vecStart = tr.endpos;
|
|
beamInfo.m_pStartEnt = NULL;
|
|
beamInfo.m_nStartAttachment = -1;
|
|
}
|
|
|
|
|
|
dlight_t *el = effects->CL_AllocDlight(LIGHT_INDEX_MUZZLEFLASH);//( index );
|
|
el->origin = tr.endpos;
|
|
|
|
el->color.r = 38;
|
|
el->color.g = 151;
|
|
el->color.b = 191;
|
|
el->color.exponent = 5;
|
|
|
|
el->radius = random->RandomInt(12, 18);
|
|
el->decay = el->radius / 0.05f;
|
|
el->die = gpGlobals->curtime + 0.07f;
|
|
|
|
|
|
/*if (pEffect == NULL)
|
|
{
|
|
pEffect = ParticleProp()->Create("ion_laser_dot", PATTACH_POINT_FOLLOW, iLaserAttachment);
|
|
pEffect->SetOwner(pBeamEnt);
|
|
pEffect->StartEmission();
|
|
|
|
ParticleProp()->AddControlPoint(pEffect, 0, pBeamEnt, PATTACH_POINT_FOLLOW);
|
|
//ParticleProp()->AddControlPoint(pEffect, 1, pBeamEnt, PATTACH_POINT_FOLLOW);
|
|
}
|
|
if (pEffect != NULL)
|
|
{
|
|
pEffect->SetControlPoint(0, vecOrigin);
|
|
|
|
//pEffect->SetControlPoint(1, vecOrigin);
|
|
}*/
|
|
|
|
//DispatchParticleEffect("ion_laser_dot", PATTACH_POINT_FOLLOW, pBeamEnt, "laser", false);
|
|
}
|
|
else if ((cvar->FindVar("oc_state_is_running")->GetInt() == 1) || (cvar->FindVar("oc_state_InReload")->GetInt() == 1) || (cvar->FindVar("oc_state_near_wall_standing")->GetInt() == 1))
|
|
{
|
|
Vector vecOrigin3, vecAngles3;
|
|
QAngle angAngles3;
|
|
C_BasePlayer *pOwner = ToBasePlayer(GetOwner());
|
|
C_BaseViewModel *pBeamEnt = pOwner->GetViewModel();
|
|
iLaserAttachment = pOwner->GetViewModel()->LookupAttachment("Laser");
|
|
pBeamEnt->GetAttachment(iLaserAttachment, vecOrigin3, angAngles3);
|
|
::FormatViewModelAttachment(vecOrigin3, false);
|
|
|
|
|
|
beamInfo.m_vecEnd = vecOrigin3;
|
|
beamInfo.m_pEndEnt = NULL;
|
|
beamInfo.m_nEndAttachment = -1;
|
|
AngleVectors(angAngles3, &vecAngles3);
|
|
UTIL_TraceLine(vecOrigin3, vecOrigin3 + (vecAngles3 * MAX_TRACE_LENGTH), MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr);
|
|
|
|
beamInfo.m_vecStart = vecOrigin3;
|
|
beamInfo.m_pStartEnt = NULL;
|
|
beamInfo.m_nStartAttachment = -1;
|
|
|
|
/*if (pEffect != NULL)
|
|
{
|
|
pEffect->StopEmission();
|
|
pEffect = NULL;
|
|
}*/
|
|
//StopParticleEffects(pBeamEnt);
|
|
}
|
|
|
|
|
|
beamInfo.m_pszModelName = "effects/bluelaser1.vmt";
|
|
|
|
if ( !(tr.surface.flags & SURF_SKY) )
|
|
{
|
|
beamInfo.m_pszHaloName = "sprites/light_glow03.vmt";
|
|
beamInfo.m_flHaloScale = 4.0f;
|
|
}
|
|
|
|
beamInfo.m_flLife = 0.01f;
|
|
beamInfo.m_flWidth = 1.0f; //random->RandomFloat( 1.0f, 2.0f );
|
|
beamInfo.m_flEndWidth = 0;
|
|
beamInfo.m_flFadeLength = 0.0f;
|
|
beamInfo.m_flAmplitude = 0.0f; //random->RandomFloat( 16, 32 );
|
|
beamInfo.m_flBrightness = 255.0;
|
|
beamInfo.m_flSpeed = 0.0;
|
|
beamInfo.m_nStartFrame = 0.0;
|
|
beamInfo.m_flFrameRate = 1.0f;
|
|
beamInfo.m_flRed = 0.0f;;
|
|
beamInfo.m_flGreen = 0.0f;
|
|
beamInfo.m_flBlue = 255.0f;
|
|
beamInfo.m_nSegments = 0;
|
|
beamInfo.m_bRenderable = true;
|
|
beamInfo.m_nFlags = 0;
|
|
|
|
beams->CreateBeamEntPoint( beamInfo );
|
|
}
|
|
else
|
|
{
|
|
//StopParticleEffects(this);
|
|
/*if (pEffect != NULL)
|
|
{
|
|
pEffect->StopEmission();
|
|
pEffect = NULL;
|
|
}*/
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Sets up the attachment point lookup for the model
|
|
//-----------------------------------------------------------------------------
|
|
void C_WeaponIonRifle::SetupAttachmentPoints(void)
|
|
{
|
|
CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
|
|
|
|
if ( pOwner != NULL && pOwner->GetViewModel() != NULL )
|
|
{
|
|
// Setup the center beam point
|
|
iLaserAttachment = pOwner->GetViewModel()->LookupAttachment( "Laser" );
|
|
}
|
|
else
|
|
{
|
|
iLaserAttachment = -1;
|
|
}
|
|
}
|
|
|
|
void IonMuzzleLightEffectCallback(const CEffectData &data)
|
|
{
|
|
IClientRenderable *pRenderable = data.GetRenderable();
|
|
if (!pRenderable)
|
|
return;
|
|
|
|
Vector position;
|
|
QAngle angles;
|
|
|
|
// If we found the attachment, emit sparks there
|
|
if (pRenderable->GetAttachment(data.m_nAttachmentIndex, position, angles))
|
|
{
|
|
Vector vecOrigin;
|
|
//TODO: Play startup sound
|
|
dlight_t *dl = effects->CL_AllocDlight(2); // BriJee OVR : Light our entity
|
|
dl->origin = position; //effect_origin;
|
|
dl->color.r = 40;
|
|
dl->color.g = 135;
|
|
dl->color.b = 255;
|
|
dl->color.exponent = 5;
|
|
dl->radius = 50.0f;
|
|
dl->die = gpGlobals->curtime + 0.9f; //0.2f;
|
|
dl->decay = 512.0f;//0.05f; //512
|
|
}
|
|
|
|
}
|
|
DECLARE_CLIENT_EFFECT("IonMuzzleLight", IonMuzzleLightEffectCallback); |