mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-10 18:59:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,248 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
//=============================================================================//
|
||||
|
||||
#include "cbase.h"
|
||||
#include "util.h"
|
||||
#include "weapon_tfc_medikit.h"
|
||||
#include "tfc_gamerules.h"
|
||||
|
||||
#if defined( CLIENT_DLL )
|
||||
#include "c_tfc_player.h"
|
||||
#else
|
||||
#include "tfc_player.h"
|
||||
#include "tfc_timer.h"
|
||||
#endif
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------- //
|
||||
// CTFCMedikit tables.
|
||||
// ----------------------------------------------------------------------------- //
|
||||
|
||||
IMPLEMENT_NETWORKCLASS_ALIASED( TFCMedikit, DT_WeaponMedikit )
|
||||
|
||||
BEGIN_NETWORK_TABLE( CTFCMedikit, DT_WeaponMedikit )
|
||||
END_NETWORK_TABLE()
|
||||
|
||||
BEGIN_PREDICTION_DATA( CTFCMedikit )
|
||||
END_PREDICTION_DATA()
|
||||
|
||||
LINK_ENTITY_TO_CLASS( weapon_medikit, CTFCMedikit );
|
||||
PRECACHE_WEAPON_REGISTER( weapon_medikit );
|
||||
|
||||
#ifndef CLIENT_DLL
|
||||
|
||||
BEGIN_DATADESC( CTFCMedikit )
|
||||
END_DATADESC()
|
||||
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------- //
|
||||
// CTFCMedikit implementation.
|
||||
// ----------------------------------------------------------------------------- //
|
||||
|
||||
CTFCMedikit::CTFCMedikit()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CTFCMedikit::Precache()
|
||||
{
|
||||
BaseClass::Precache();
|
||||
}
|
||||
|
||||
|
||||
TFCWeaponID CTFCMedikit::GetWeaponID( void ) const
|
||||
{
|
||||
return WEAPON_MEDIKIT;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CLIENT_DLL
|
||||
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
// CLIENT DLL SPECIFIC CODE
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
|
||||
|
||||
#else
|
||||
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
// GAME DLL SPECIFIC CODE
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
|
||||
void CTFCMedikit::AxeHit( CBaseEntity *pHit, bool bFirstSwing, trace_t &tr, float *flDamage, bool *bDoEffects )
|
||||
{
|
||||
*flDamage = 0;
|
||||
*bDoEffects = false;
|
||||
|
||||
CTFCPlayer *pPlayer = GetPlayerOwner();
|
||||
if ( !pPlayer )
|
||||
return;
|
||||
|
||||
// We only care about players.
|
||||
CTFCPlayer *pTarget = ToTFCPlayer( pHit );
|
||||
if ( !pTarget )
|
||||
return;
|
||||
|
||||
// If other player is dead ( just changed teams? ) don't hit
|
||||
if ( !pTarget->IsAlive() )
|
||||
return;
|
||||
|
||||
Vector vAttackDir = tr.endpos - tr.startpos;
|
||||
VectorNormalize( vAttackDir );
|
||||
|
||||
// Heal if we're on the same team, Infect if not
|
||||
if ( pPlayer->IsAlly( pTarget ) )
|
||||
{
|
||||
// Heal Concussion
|
||||
CTimer *pTimer = Timer_FindTimer( pTarget, TF_TIMER_CONCUSSION );
|
||||
if ( pTimer )
|
||||
{
|
||||
// Tell everyone
|
||||
UTIL_ClientPrintAll( HUD_PRINTNOTIFY, "#Medic_cureconc", pPlayer->GetPlayerName(), pTarget->GetPlayerName() );
|
||||
|
||||
// Give the medic a frag if it was an enemy concussion
|
||||
if ( pTimer->GetTeamNumber() != pPlayer->GetTeamNumber() )
|
||||
pPlayer->TF_AddFrags(1);
|
||||
|
||||
Timer_Remove( pTimer );
|
||||
}
|
||||
|
||||
// Heal Hallucination
|
||||
if ( pTarget->m_Shared.GetStateFlags() & TFSTATE_HALLUCINATING )
|
||||
{
|
||||
pTimer = Timer_FindTimer( pTarget, TF_TIMER_HALLUCINATION );
|
||||
ASSERT(pTimer != NULL);
|
||||
|
||||
// Tell everyone
|
||||
UTIL_ClientPrintAll( HUD_PRINTNOTIFY, "#Medic_curehalluc", pPlayer->GetPlayerName(), pTarget->GetPlayerName() );
|
||||
|
||||
// Give the medic a frag if it was an enemy hallucination
|
||||
if (pTimer->GetTeamNumber() != pPlayer->GetTeamNumber())
|
||||
pPlayer->TF_AddFrags(1);
|
||||
|
||||
pTarget->m_Shared.RemoveStateFlags( TFSTATE_HALLUCINATING );
|
||||
Timer_Remove( pTimer );
|
||||
}
|
||||
|
||||
// Heal Tranquilisation
|
||||
if (pTarget->m_Shared.GetStateFlags() & TFSTATE_TRANQUILISED)
|
||||
{
|
||||
pTimer = Timer_FindTimer( pTarget, TF_TIMER_TRANQUILISATION );
|
||||
ASSERT(pTimer != NULL);
|
||||
|
||||
// Tell everyone
|
||||
UTIL_ClientPrintAll( HUD_PRINTNOTIFY, "#Medic_curetranq", pPlayer->GetPlayerName(), pTarget->GetPlayerName() );
|
||||
|
||||
// Give the medic a frag if it was an enemy tranquilisation
|
||||
if (pTimer->GetTeamNumber() != pPlayer->GetTeamNumber())
|
||||
pPlayer->TF_AddFrags(1);
|
||||
|
||||
pTarget->m_Shared.RemoveStateFlags( TFSTATE_TRANQUILISED );
|
||||
// TFCTODO: ((CBasePlayer*)pTarget)->TeamFortress_SetSpeed();
|
||||
Timer_Remove( pTimer );
|
||||
}
|
||||
|
||||
// Heal Infection
|
||||
if (pTarget->m_Shared.GetStateFlags() & TFSTATE_INFECTED)
|
||||
{
|
||||
int fDmg = pTarget->GetHealth() / 2;
|
||||
SpawnBlood(pTarget->GetAbsOrigin(), vAttackDir, pTarget->BloodColor(), fDmg);
|
||||
|
||||
#if !defined( CLIENT_DLL )
|
||||
pTimer = Timer_FindTimer( pTarget, TF_TIMER_INFECTION );
|
||||
ASSERT(pTimer != NULL);
|
||||
|
||||
// Tell everyone
|
||||
UTIL_ClientPrintAll( HUD_PRINTNOTIFY, "#Medic_cureinfection", pPlayer->GetPlayerName(), pTarget->GetPlayerName() );
|
||||
|
||||
// Give the medic a frag if it was an enemy tranquilisation
|
||||
if ( pTimer->GetTeamNumber() != pPlayer->GetTeamNumber() )
|
||||
pPlayer->TF_AddFrags(1);
|
||||
|
||||
// The operation removes half of the player's health
|
||||
CBaseEntity *pOwner = pTimer->m_hOwner;
|
||||
pTarget->TakeDamage( CTakeDamageInfo( this, pOwner, fDmg, DMG_IGNOREARMOR | DMG_NERVEGAS ) );
|
||||
|
||||
pTarget->m_Shared.RemoveStateFlags( TFSTATE_INFECTED );
|
||||
Timer_Remove( pTimer );
|
||||
#endif
|
||||
}
|
||||
|
||||
// Extinguish Flames
|
||||
if ( pTarget->GetNumFlames() > 0 )
|
||||
{
|
||||
// Tell everyone
|
||||
UTIL_ClientPrintAll( HUD_PRINTNOTIFY, "#Medic_curefire", pPlayer->GetPlayerName(), pTarget->GetPlayerName() );
|
||||
|
||||
pTarget->SetNumFlames( 0 );
|
||||
//PLAYBACK_EVENT( 0, pPlayer->edict(), m_usSteamShot );
|
||||
}
|
||||
|
||||
// Heal
|
||||
if ( pTarget->GetHealth() < pTarget->GetMaxHealth() )
|
||||
{
|
||||
//PLAYBACK_EVENT( 0, pPlayer->edict(), m_usNormalShot );
|
||||
|
||||
pTarget->TakeHealth( WEAP_MEDIKIT_HEAL, DMG_GENERIC ); // Heal fully in one hit
|
||||
}
|
||||
else if (pTarget->GetHealth() < pTarget->GetMaxHealth() + WEAP_MEDIKIT_OVERHEAL)
|
||||
{
|
||||
// "Heal" over and above the player's max health
|
||||
//PLAYBACK_EVENT( 0, pPlayer->edict(), m_usSuperShot );
|
||||
|
||||
pTarget->TakeHealth( 5, DMG_GENERIC | DMG_IGNORE_MAXHEALTH);
|
||||
|
||||
if ( !(pTarget->m_Shared.GetItemFlags() & IT_SUPERHEALTH) )
|
||||
{
|
||||
pTarget->m_Shared.AddItemFlags( IT_SUPERHEALTH );
|
||||
|
||||
#if !defined( CLIENT_DLL )
|
||||
// Start Superhealth rot timer
|
||||
Timer_CreateTimer( pTarget, TF_TIMER_ROTHEALTH );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Vector vecDir;
|
||||
AngleVectors( pPlayer->EyeAngles(), &vecDir );
|
||||
|
||||
// Damage Target
|
||||
ClearMultiDamage();
|
||||
pTarget->TraceAttack( CTakeDamageInfo( pPlayer, pPlayer, 10, DMG_CLUB ), vecDir, &tr );
|
||||
ApplyMultiDamage();
|
||||
|
||||
// Don't infect if the player's already infected, a medic, or we're still in prematch
|
||||
if ( (pTarget->m_Shared.GetStateFlags() & TFSTATE_INFECTED) ||
|
||||
(pTarget->m_Shared.GetPlayerClass() == PC_MEDIC) ||
|
||||
TFCGameRules()->IsInPreMatch() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Infect
|
||||
pTarget->m_Shared.AddStateFlags( TFSTATE_INFECTED );
|
||||
#if !defined( CLIENT_DLL )
|
||||
|
||||
// we don't want to create another timer if the player we're attacking
|
||||
// with the medikit is currently dying ( already "killed" but still playing
|
||||
// their death animation )
|
||||
if ( pTarget->m_lifeState != LIFE_ALIVE )
|
||||
return;
|
||||
|
||||
CTimer *pTimer = Timer_CreateTimer( pTarget, TF_TIMER_INFECTION );
|
||||
pTimer->m_hEnemy = pPlayer;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user