source-engine/game/shared/hl1/hl1mp_basecombatweapon_shared.cpp
2022-04-16 12:05:19 +03:00

136 lines
3.2 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "hl1mp_basecombatweapon_shared.h"
#include "effect_dispatch_data.h"
#ifdef CLIENT_DLL
#include "c_te_effect_dispatch.h"
#else
#include "te_effect_dispatch.h"
#endif
#include "hl1_player_shared.h"
LINK_ENTITY_TO_CLASS( basehl1mpcombatweapon, CBaseHL1MPCombatWeapon );
IMPLEMENT_NETWORKCLASS_ALIASED( BaseHL1MPCombatWeapon , DT_BaseHL1MPCombatWeapon )
BEGIN_NETWORK_TABLE( CBaseHL1MPCombatWeapon , DT_BaseHL1MPCombatWeapon )
END_NETWORK_TABLE()
BEGIN_PREDICTION_DATA( CBaseHL1MPCombatWeapon )
END_PREDICTION_DATA()
CBaseHL1MPCombatWeapon::CBaseHL1MPCombatWeapon()
{
SetPredictionEligible( true );
AddSolidFlags( FSOLID_TRIGGER ); // Nothing collides with these but it gets touches.
}
void CBaseHL1MPCombatWeapon::EjectShell( CBaseEntity *pPlayer, int iType )
{
QAngle angShellAngles = pPlayer->GetAbsAngles();
Vector vecForward, vecRight, vecUp;
AngleVectors( angShellAngles, &vecForward, &vecRight, &vecUp );
Vector vecShellPosition = pPlayer->GetAbsOrigin() + pPlayer->GetViewOffset();
switch ( iType )
{
case 0:
default:
vecShellPosition += vecRight * 4;
vecShellPosition += vecUp * -12;
vecShellPosition += vecForward * 20;
break;
case 1:
vecShellPosition += vecRight * 6;
vecShellPosition += vecUp * -12;
vecShellPosition += vecForward * 32;
break;
}
Vector vecShellVelocity = vec3_origin; // pPlayer->GetAbsVelocity();
vecShellVelocity += vecRight * random->RandomFloat( 50, 70 );
vecShellVelocity += vecUp * random->RandomFloat( 100, 150 );
vecShellVelocity += vecForward * 25;
angShellAngles.x = 0;
angShellAngles.z = 0;
CEffectData data;
data.m_vStart = vecShellVelocity;
data.m_vOrigin = vecShellPosition;
data.m_vAngles = angShellAngles;
data.m_fFlags = iType;
DispatchEffect( "HL1ShellEject", data );
}
#ifdef CLIENT_DLL
void CBaseHL1MPCombatWeapon::OnDataChanged( DataUpdateType_t type )
{
BaseClass::OnDataChanged( type );
if ( GetPredictable() && !ShouldPredict() )
ShutdownPredictable();
}
bool CBaseHL1MPCombatWeapon::ShouldPredict()
{
if ( GetOwner() && GetOwner() == C_BasePlayer::GetLocalPlayer() )
return true;
return BaseClass::ShouldPredict();
}
void CBaseHL1MPCombatWeapon::ApplyBoneMatrixTransform( matrix3x4_t& transform )
{
BaseClass::ApplyBoneMatrixTransform( transform );
}
#endif
bool CBaseHL1MPCombatWeapon::IsPredicted() const
{
return true;
}
CBasePlayer* CBaseHL1MPCombatWeapon::GetPlayerOwner() const
{
return dynamic_cast< CBasePlayer* >( GetOwner() );
}
void CBaseHL1MPCombatWeapon::WeaponSound( WeaponSound_t sound_type, float soundtime /* = 0.0f */ )
{
#ifdef CLIENT_DLL
// If we have some sounds from the weapon classname.txt file, play a random one of them
const char *shootsound = GetWpnData().aShootSounds[ sound_type ];
if ( !shootsound || !shootsound[0] )
return;
CBroadcastRecipientFilter filter; // this is client side only
if ( !te->CanPredict() )
return;
CBaseEntity::EmitSound( filter, GetPlayerOwner()->entindex(), shootsound, &GetPlayerOwner()->GetAbsOrigin() );
#else
BaseClass::WeaponSound( sound_type, soundtime );
#endif
}