void CHL2MPScriptedWeapon::Precache( void ) { BaseClass::Precache(); InitScriptedWeapon(); // Get the ammo indexes for the ammo's specified in the data file if ( GetWpnData().szAmmo1[0] ) { m_iPrimaryAmmoType = GetAmmoDef()->Index( GetWpnData().szAmmo1 ); if (m_iPrimaryAmmoType == -1) { Msg("ERROR: Weapon (%s) using undefined primary ammo type (%s)\n",GetClassname(), GetWpnData().szAmmo1); } } if ( GetWpnData().szAmmo2[0] ) { m_iSecondaryAmmoType = GetAmmoDef()->Index( GetWpnData().szAmmo2 ); if (m_iSecondaryAmmoType == -1) { Msg("ERROR: Weapon (%s) using undefined secondary ammo type (%s)\n",GetClassname(),GetWpnData().szAmmo2); } } // Precache models (preload to avoid hitch) m_iViewModelIndex = 0; m_iWorldModelIndex = 0; if ( GetViewModel() && GetViewModel()[0] ) { m_iViewModelIndex = CBaseEntity::PrecacheModel( GetViewModel() ); } if ( GetWorldModel() && GetWorldModel()[0] ) { m_iWorldModelIndex = CBaseEntity::PrecacheModel( GetWorldModel() ); } // Precache sounds, too for ( int i = 0; i < NUM_SHOOT_SOUND_TYPES; ++i ) { const char *shootsound = GetShootSound( i ); if ( shootsound && shootsound[0] ) { CBaseEntity::PrecacheScriptSound( shootsound ); } } #if defined ( LUA_SDK ) && !defined( CLIENT_DLL ) BEGIN_LUA_CALL_WEAPON_METHOD( "Precache" ); END_LUA_CALL_WEAPON_METHOD( 0, 0 ); #endif }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- const char *CWeaponDODBase::GetViewModel( int /*viewmodelindex = 0 -- this is ignored in the base class here*/ ) const { if ( GetPlayerOwner() == NULL ) { return BaseClass::GetViewModel(); } return GetWpnData().szViewModel; }
const char *CASW_Weapon::GetASWShootSound( int iIndex, int &iPitch ) { if ( iIndex == SINGLE || iIndex == SINGLE_NPC ) { iIndex = IsCarriedByLocalPlayer() ? SINGLE : SINGLE_NPC; } if ( iIndex == WPN_DOUBLE || iIndex == DOUBLE_NPC ) { iIndex = IsCarriedByLocalPlayer() ? WPN_DOUBLE : DOUBLE_NPC; } if ( iIndex == RELOAD || iIndex == RELOAD_NPC ) { iIndex = IsCarriedByLocalPlayer() ? RELOAD : RELOAD_NPC; // play the weapon sound according to marine skill int iSkill = MarineSkills()->GetSkillBasedValueByMarine(GetMarine(), ASW_MARINE_SKILL_RELOADING, ASW_MARINE_SUBSKILL_RELOADING_SOUND); switch (iSkill) { case 5: return GetWpnData().aShootSounds[ FAST_RELOAD ]; break; case 4: iPitch = 120; return GetWpnData().aShootSounds[ iIndex ]; break; case 3: iPitch = 115; return GetWpnData().aShootSounds[ iIndex ]; break; case 2: iPitch = 110; return GetWpnData().aShootSounds[ iIndex ]; break; case 1: iPitch = 105; return GetWpnData().aShootSounds[ iIndex ]; break; default: return GetWpnData().aShootSounds[ iIndex ]; break; }; } return GetShootSound( iIndex ); }
const CHL2MPSWeaponInfo &CWeaponHL2MPBase::GetHL2MPWpnData() const { const FileWeaponInfo_t *pWeaponInfo = &GetWpnData(); const CHL2MPSWeaponInfo *pHL2MPInfo; #ifdef _DEBUG pHL2MPInfo = dynamic_cast< const CHL2MPSWeaponInfo* >( pWeaponInfo ); Assert( pHL2MPInfo ); #else pHL2MPInfo = static_cast< const CHL2MPSWeaponInfo* >( pWeaponInfo ); #endif return *pHL2MPInfo; }
const CSDKWeaponInfo &CWeaponSDKBase::GetSDKWpnData() const { const FileWeaponInfo_t *pWeaponInfo = &GetWpnData(); const CSDKWeaponInfo *pSDKInfo; #ifdef _DEBUG pSDKInfo = dynamic_cast< const CSDKWeaponInfo* >( pWeaponInfo ); Assert( pSDKInfo ); #else pSDKInfo = static_cast< const CSDKWeaponInfo* >( pWeaponInfo ); #endif return *pSDKInfo; }
const CDODWeaponInfo &CWeaponDODBase::GetDODWpnData() const { const FileWeaponInfo_t *pWeaponInfo = &GetWpnData(); const CDODWeaponInfo *pDODInfo; #ifdef _DEBUG pDODInfo = dynamic_cast< const CDODWeaponInfo* >( pWeaponInfo ); Assert( pDODInfo ); #else pDODInfo = static_cast< const CDODWeaponInfo* >( pWeaponInfo ); #endif return *pDODInfo; }
const CCSWeaponInfo &CWeaponCSBase::GetCSWpnData() const { const FileWeaponInfo_t *pWeaponInfo = &GetWpnData(); const CCSWeaponInfo *pCSInfo; #ifdef _DEBUG pCSInfo = dynamic_cast< const CCSWeaponInfo* >( pWeaponInfo ); Assert( pCSInfo ); #else pCSInfo = static_cast< const CCSWeaponInfo* >( pWeaponInfo ); #endif return *pCSInfo; }
const CTFCWeaponInfo &CWeaponTFCBase::GetTFCWpnData() const { const FileWeaponInfo_t *pWeaponInfo = &GetWpnData(); const CTFCWeaponInfo *pTFCInfo; #ifdef _DEBUG pTFCInfo = dynamic_cast< const CTFCWeaponInfo* >( pWeaponInfo ); Assert( pTFCInfo ); #else pTFCInfo = static_cast< const CTFCWeaponInfo* >( pWeaponInfo ); #endif return *pTFCInfo; }
void CWeaponHL2MPBase::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 }
void CWeapon357::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( !pPlayer ) { return; } if ( m_iClip1 <= 0 ) { if ( !m_bFireOnEmpty ) { Reload(); } else { WeaponSound( EMPTY ); m_flNextPrimaryAttack = 0.15; } return; } m_flNextPrimaryAttack = gpGlobals->curtime + 0.75; m_flNextSecondaryAttack = gpGlobals->curtime + 0.75; m_iPrimaryAttacks++; gamestats->Event_WeaponFired( pPlayer, true, GetClassname() ); WeaponSound( SINGLE ); pPlayer->DoMuzzleFlash(); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); if (GetWpnData().m_bUseMuzzleSmoke) { DispatchParticleEffect("weapon_muzzle_smoke", PATTACH_POINT_FOLLOW, pPlayer->GetViewModel(), "muzzle", true); } m_flNextPrimaryAttack = gpGlobals->curtime + 0.75; m_flNextSecondaryAttack = gpGlobals->curtime + 0.75; m_iClip1--; Vector vecSrc = pPlayer->Weapon_ShootPosition(); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_SCALE_DEFAULT ); pPlayer->FireBullets( 1, vecSrc, vecAiming, vec3_origin, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 0 ); pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 ); //Disorient the player QAngle angles = pPlayer->GetLocalAngles(); angles.x += random->RandomInt( -1, 1 ); angles.y += random->RandomInt( -1, 1 ); angles.z = 0; pPlayer->SnapEyeAngles( angles ); pPlayer->ViewPunch( QAngle( -8, random->RandomFloat( -2, 2 ), 0 ) ); CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 600, 0.2, GetOwner() ); if ( !m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); } }
//----------------------------------------------------------------------------- // Purpose: Draw the weapon's crosshair //----------------------------------------------------------------------------- void C_BaseCombatWeapon::DrawCrosshair() { C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return; Color clr = gHUD.m_clrNormal; /* // TEST: if the thing under your crosshair is on a different team, light the crosshair with a different color. Vector vShootPos, vShootAngles; GetShootPosition( vShootPos, vShootAngles ); Vector vForward; AngleVectors( vShootAngles, &vForward ); // Change the color depending on if we're looking at a friend or an enemy. CPartitionFilterListMask filter( PARTITION_ALL_CLIENT_EDICTS ); trace_t tr; traceline->TraceLine( vShootPos, vShootPos + vForward * 10000, COLLISION_GROUP_NONE, MASK_SHOT, &tr, true, ~0, &filter ); if ( tr.index != 0 && tr.index != INVALID_CLIENTENTITY_HANDLE ) { C_BaseEntity *pEnt = ClientEntityList().GetBaseEntityFromHandle( tr.index ); if ( pEnt ) { if ( pEnt->GetTeamNumber() != player->GetTeamNumber() ) { g = b = 0; } } } */ CHudCrosshair *crosshair = GET_HUDELEMENT( CHudCrosshair ); if ( !crosshair ) return; // Find out if this weapon's auto-aimed onto a target bool bOnTarget = ( m_iState == WEAPON_IS_ONTARGET ); if ( player->GetFOV() >= 90 ) { // normal crosshairs if ( bOnTarget && GetWpnData().iconAutoaim ) { clr[3] = 255; crosshair->SetCrosshair( GetWpnData().iconAutoaim, clr ); } else if ( GetWpnData().iconCrosshair ) { clr[3] = 255; crosshair->SetCrosshair( GetWpnData().iconCrosshair, clr ); } else { crosshair->ResetCrosshair(); } } else { Color white( 255, 255, 255, 255 ); // zoomed crosshairs if (bOnTarget && GetWpnData().iconZoomedAutoaim) crosshair->SetCrosshair(GetWpnData().iconZoomedAutoaim, white); else if ( GetWpnData().iconZoomedCrosshair ) crosshair->SetCrosshair( GetWpnData().iconZoomedCrosshair, white ); else crosshair->ResetCrosshair(); } }
const CASW_WeaponInfo* CASW_Weapon::GetWeaponInfo() const { return dynamic_cast<const CASW_WeaponInfo*>(&GetWpnData()); }