|
|
//========= Copyright � 1996-2009, Valve Corporation, All rights reserved. ============//
//
// Purpose: Healthshot Item, belt item
//
// $NoKeywords: $
//=====================================================================================//
#include "cbase.h"
#include "item_healthshot.h"
#include "cs_gamerules.h"
#include "econ_entity_creation.h"
#if defined( CLIENT_DLL )
#include "c_cs_player.h"
#else
#include "cs_player.h"
#endif // CLIENT_DLL
// NOTE: This has to be the last file included!
#include "tier0/memdbgon.h"
#define HEALTHSHOT_INJECT_TIME 1.65f
IMPLEMENT_NETWORKCLASS_ALIASED( Item_Healthshot, DT_Item_Healthshot )
BEGIN_NETWORK_TABLE( CItem_Healthshot, DT_Item_Healthshot ) END_NETWORK_TABLE()
BEGIN_PREDICTION_DATA( CItem_Healthshot ) END_PREDICTION_DATA()
LINK_ENTITY_TO_CLASS_ALIASED( weapon_healthshot, Item_Healthshot ); PRECACHE_WEAPON_REGISTER( weapon_healthshot );
// #ifndef CLIENT_DLL
// BEGIN_DATADESC( CItem_Healthshot )
// END_DATADESC()
// #endif
ConVar healthshot_health( "healthshot_health", "50", FCVAR_CHEAT | FCVAR_REPLICATED );
void CItem_Healthshot::WeaponIdle() { if (m_flTimeWeaponIdle > gpGlobals->curtime) return; SendWeaponAnim( ACT_VM_IDLE );
SetWeaponIdleTime( gpGlobals->curtime + 20 ); }
void CItem_Healthshot::Precache( void ) { //PrecacheScriptSound( "Healthshot.Shot" );
BaseClass::Precache(); }
bool CItem_Healthshot::CanPrimaryAttack( void ) { CCSPlayer *pPlayer = ToCSPlayer( GetPlayerOwner() ); if ( pPlayer == NULL ) return false;
return CanUseOnSelf( pPlayer ); }
bool CItem_Healthshot::CanUseOnSelf( CCSPlayer *pPlayer ) { if ( !pPlayer ) return false;
if ( pPlayer->GetHealth() >= pPlayer->GetMaxHealth() ) { #ifndef CLIENT_DLL
ClientPrint( pPlayer, HUD_PRINTCENTER, "#SFUI_Healthshot_AlreadyAtMax" ); #endif
return false; }
return true; }
void CItem_Healthshot::DropHealthshot( void ) { #ifndef CLIENT_DLL
CCSPlayer *pPlayer = ToCSPlayer( GetPlayerOwner() ); if ( !pPlayer ) return;
int iAmount = pPlayer->GetAmmoCount( GetPrimaryAmmoType() ); if ( iAmount <= 1 ) { pPlayer->CSWeaponDrop( this, false, true ); return; } else { pPlayer->RemoveAmmo( 1, AMMO_TYPE_HEALTHSHOT );
CItem_Healthshot *pHealth = static_cast< CItem_Healthshot * >( CreateEntityByName( "weapon_healthshot" ) );
if ( pHealth ) { Vector vecWeaponThrowFromPos = pPlayer->EyePosition(); QAngle angWeaponThrowFromAngle = pPlayer->EyeAngles();
Vector vForward; AngleVectors(angWeaponThrowFromAngle, &vForward, NULL, NULL); vecWeaponThrowFromPos = vecWeaponThrowFromPos + (vForward * 100); //NDebugOverlay::Box( vecWeaponThrowFromPos, Vector( 10, 10, 10 ), Vector( -10, -10, -10 ), 255, 0, 0, 200, 3 );
DispatchSpawn( pHealth );
// set it non-solid because it hits itself during the trace when trying to throw it
pHealth->SetSolidFlags( FSOLID_NOT_SOLID ); pHealth->SetMoveCollide( MOVECOLLIDE_FLY_BOUNCE );
pPlayer->Weapon_Drop( pHealth, &vecWeaponThrowFromPos, NULL );
pHealth->SetSolidFlags( FSOLID_NOT_STANDABLE | FSOLID_TRIGGER | FSOLID_USE_TRIGGER_BOUNDS ); pHealth->SetPreviousOwner( pPlayer ); pHealth->m_flDroppedAtTime = gpGlobals->curtime; pHealth->AddPriorOwner( pPlayer ); } }
#endif
}
//--------------------------------------------------------------------------------------------------------
void CItem_Healthshot::OnStartUse( CCSPlayer *pPlayer ) { SetWeaponIdleTime( gpGlobals->curtime + 20 ); // don't fidget for a bit
BaseClass::OnStartUse( pPlayer ); }
#ifndef CLIENT_DLL
//--------------------------------------------------------------------------------------------------------
void CItem_Healthshot::CompleteUse( CCSPlayer *pPlayer ) { pPlayer->OnHealthshotUsed();
// Give half health buffer
pPlayer->SetHealth( Min( pPlayer->GetHealth() + healthshot_health.GetInt(), pPlayer->GetMaxHealth() ) );
// emit event
// IGameEvent *event = gameeventmanager->CreateEvent( "healthshot_used" );
// if( event )
// {
// int userID = pPlayer->GetUserID();
// event->SetInt( "userid", userID );
// event->SetInt( "subject", userID );
// gameeventmanager->FireEvent( event );
// }
BaseClass::CompleteUse( pPlayer ); } #endif //CLIENT_DLL
float CItem_Healthshot::GetUseTimerDuration( void ) { return HEALTHSHOT_INJECT_TIME; }
|