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.
135 lines
3.2 KiB
135 lines
3.2 KiB
//========= 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 |
|
}
|
|
|