555 lines
20 KiB
C++
555 lines
20 KiB
C++
#include "cbase.h"
|
|
#include "asw_marine_resource.h"
|
|
#include "asw_marine_profile.h"
|
|
#include "asw_player.h"
|
|
#include "asw_marine.h"
|
|
#include "asw_equipment_list.h"
|
|
#include "asw_weapon.h"
|
|
#include "asw_weapon_parse.h"
|
|
#include "asw_door.h"
|
|
#include "asw_director.h"
|
|
#include "asw_gamestats.h"
|
|
#include "asw_gamerules.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
LINK_ENTITY_TO_CLASS( asw_marine_resource, CASW_Marine_Resource );
|
|
|
|
//---------------------------------------------------------
|
|
// Save/Restore
|
|
//---------------------------------------------------------
|
|
BEGIN_DATADESC( CASW_Marine_Resource )
|
|
DEFINE_FIELD( m_MarineProfileIndex, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_MarineEntity, FIELD_EHANDLE ),
|
|
DEFINE_FIELD( m_Commander, FIELD_EHANDLE),
|
|
DEFINE_AUTO_ARRAY( m_iWeaponsInSlots, FIELD_INTEGER ),
|
|
DEFINE_AUTO_ARRAY( m_iInitialWeaponsInSlots, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_vecOutOfAmmoSpot, FIELD_VECTOR ),
|
|
DEFINE_FIELD( m_iHealCount, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_bInfested, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bInhabited, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_iServerFiring, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iCommanderIndex, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_MarineProfileIndex, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iShotsFired, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iPlayerShotsFired, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iPlayerShotsMissed, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_fDamageTaken, FIELD_FLOAT ),
|
|
DEFINE_FIELD( m_iAliensKilled, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_vecDeathPosition, FIELD_VECTOR ),
|
|
DEFINE_FIELD( m_fDeathTime, FIELD_FLOAT ),
|
|
DEFINE_FIELD( m_fFriendlyFireDamageDealt, FIELD_FLOAT ),
|
|
DEFINE_FIELD( m_iShieldbugsKilled, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iParasitesKilled, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iSingleGrenadeKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iKickedGrenadeKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iSavedLife, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_bHurt, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_iMadFiring, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iMadFiringAutogun, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_bOnlyWeaponExtra, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_iOnlyWeaponEquipIndex, FIELD_INTEGER ),
|
|
//DEFINE_FIELD( m_iLastStandKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iMedicHealing, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iCuredInfestation, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iMineKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iSentryKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iEggKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iGrubKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iBarrelKills, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iFiresPutOut, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_bDidFastReloadsInARow, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bDamageAmpMedal, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bKilledBoomerEarly, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bStunGrenadeMedal, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bFreezeGrenadeMedal, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bDodgedRanger, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bProtectedTech, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_bMeleeParasiteKill, FIELD_BOOLEAN ),
|
|
DEFINE_FIELD( m_iAliensKicked, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iFastDoorHacks, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iFastComputerHacks, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iAliensKilledByBouncingBullets, FIELD_INTEGER ),
|
|
END_DATADESC()
|
|
|
|
void *SendProxy_SendMarineResourceTimelinesDataTable( const SendProp *pProp, const void *pStruct, const void *pVarData, CSendProxyRecipients *pRecipients, int objectID )
|
|
{
|
|
if ( ASWGameRules() && ASWGameRules()->GetGameState() == ASW_GS_INGAME )
|
|
{
|
|
// Don't send timeline data while in the mission
|
|
pRecipients->ClearAllRecipients();
|
|
}
|
|
|
|
return ( void * )pVarData;
|
|
}
|
|
|
|
// Only send active weapon index to local player
|
|
BEGIN_SEND_TABLE_NOBASE( CASW_Marine_Resource, DT_MR_Timelines )
|
|
SendPropDataTable( SENDINFO_DT( m_TimelineFriendlyFire ), &REFERENCE_SEND_TABLE(DT_Timeline) ),
|
|
SendPropDataTable( SENDINFO_DT( m_TimelineKillsTotal ), &REFERENCE_SEND_TABLE(DT_Timeline) ),
|
|
SendPropDataTable( SENDINFO_DT( m_TimelineHealth ), &REFERENCE_SEND_TABLE(DT_Timeline) ),
|
|
SendPropDataTable( SENDINFO_DT( m_TimelineAmmo ), &REFERENCE_SEND_TABLE(DT_Timeline) ),
|
|
SendPropDataTable( SENDINFO_DT( m_TimelinePosX ), &REFERENCE_SEND_TABLE(DT_Timeline) ),
|
|
SendPropDataTable( SENDINFO_DT( m_TimelinePosY ), &REFERENCE_SEND_TABLE(DT_Timeline) ),
|
|
END_SEND_TABLE();
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Marine_Resource, DT_ASW_Marine_Resource)
|
|
// Timeline data only gets sent at mission end
|
|
SendPropDataTable( "mr_timelines", 0, &REFERENCE_SEND_TABLE(DT_MR_Timelines), SendProxy_SendMarineResourceTimelinesDataTable ),
|
|
SendPropInt (SENDINFO(m_MarineProfileIndex), 10 ),
|
|
SendPropEHandle (SENDINFO(m_MarineEntity) ),
|
|
SendPropEHandle (SENDINFO(m_Commander) ),
|
|
SendPropInt (SENDINFO(m_iCommanderIndex), 10),
|
|
SendPropArray( SendPropInt( SENDINFO_ARRAY( m_iWeaponsInSlots ), 30 ), m_iWeaponsInSlots ),
|
|
SendPropBool (SENDINFO(m_bInfested) ),
|
|
SendPropBool (SENDINFO(m_bInhabited) ),
|
|
SendPropInt (SENDINFO(m_iServerFiring), 8 ),
|
|
//SendPropFloat (SENDINFO(m_fDamageTaken) ),
|
|
SendPropInt (SENDINFO(m_iAliensKilled) ),
|
|
SendPropBool (SENDINFO(m_bTakenWoundDamage) ),
|
|
SendPropBool (SENDINFO(m_bHealthHalved) ),
|
|
SendPropString (SENDINFO(m_MedalsAwarded)),
|
|
SendPropEHandle (SENDINFO(m_hWeldingDoor)),
|
|
SendPropBool (SENDINFO(m_bUsingEngineeringAura)),
|
|
END_SEND_TABLE()
|
|
|
|
extern ConVar asw_leadership_radius;
|
|
extern ConVar asw_debug_marine_damage;
|
|
extern ConVar asw_debug_medals;
|
|
|
|
CASW_Marine_Resource::CASW_Marine_Resource()
|
|
{
|
|
m_bAwardedMedals = false;
|
|
m_MarineProfileIndex = -1;
|
|
m_bInfested = false;
|
|
SetCommander(NULL);
|
|
m_bInhabited = false;
|
|
m_iServerFiring = 0;
|
|
m_iShotsFired = 0;
|
|
m_iPlayerShotsFired = 0;
|
|
m_iPlayerShotsMissed = 0;
|
|
m_fDamageTaken = 0;
|
|
m_iAliensKilled = 0;
|
|
m_iAliensKilledSinceLastFriendlyFireIncident = 0;
|
|
m_bAwardedFFPartialAchievement = false;
|
|
m_bAwardedHealBeaconAchievement = false;
|
|
m_bDealtNonMeleeDamage = false;
|
|
m_iDamageTakenDuringHack = 0;
|
|
|
|
m_TimelineFriendlyFire.SetCompressionType( TIMELINE_COMPRESSION_SUM );
|
|
m_TimelineKillsTotal.SetCompressionType( TIMELINE_COMPRESSION_SUM );
|
|
m_TimelineHealth.SetCompressionType( TIMELINE_COMPRESSION_AVERAGE );
|
|
m_TimelineAmmo.SetCompressionType( TIMELINE_COMPRESSION_AVERAGE );
|
|
m_TimelinePosX.SetCompressionType( TIMELINE_COMPRESSION_AVERAGE );
|
|
m_TimelinePosY.SetCompressionType( TIMELINE_COMPRESSION_AVERAGE );
|
|
|
|
m_bHealthHalved = false;
|
|
m_bTakenWoundDamage = false;
|
|
m_iOnlyWeaponEquipIndex = -1; // equip index of the only weapon we've used (-1 means not used a weapon yet, -2 means we've used multiple weapons)
|
|
memset( m_MedalsAwarded.GetForModify(), 0, sizeof(m_MedalsAwarded) );
|
|
m_bUsingEngineeringAura = false;
|
|
m_pIntensity = new CASW_Intensity();
|
|
|
|
memset( m_iInitialWeaponsInSlots, -1, sizeof( m_iInitialWeaponsInSlots ) );
|
|
memset( const_cast<int*>( m_iWeaponsInSlots.Base() ), -1, sizeof( m_iInitialWeaponsInSlots ) );
|
|
}
|
|
|
|
|
|
CASW_Marine_Resource::~CASW_Marine_Resource()
|
|
{
|
|
if (GetMarineEntity())
|
|
GetMarineEntity()->SetMarineResource(NULL);
|
|
if ( m_pIntensity )
|
|
delete m_pIntensity;
|
|
}
|
|
|
|
// always send this info to players
|
|
int CASW_Marine_Resource::ShouldTransmit( const CCheckTransmitInfo *pInfo )
|
|
{
|
|
return FL_EDICT_ALWAYS;
|
|
}
|
|
|
|
|
|
void CASW_Marine_Resource::SetCommander(CASW_Player* pCommander)
|
|
{
|
|
m_Commander = pCommander;
|
|
m_iCommanderIndex = pCommander ? pCommander->entindex() : -1;
|
|
}
|
|
|
|
CASW_Player* CASW_Marine_Resource::GetCommander()
|
|
{
|
|
return m_Commander;
|
|
}
|
|
|
|
void CASW_Marine_Resource::GetDisplayName( char *pwchDisplayName, int nMaxBytes )
|
|
{
|
|
bool bPlayerName = false;
|
|
const char *pchName = NULL;
|
|
|
|
if ( gpGlobals->maxClients <= 1 )
|
|
{
|
|
// Always use the character name in singleplayer
|
|
pchName = GetProfile()->GetShortName();
|
|
}
|
|
else
|
|
{
|
|
bool bIsInhabited = IsInhabited();
|
|
|
|
CBasePlayer *pPlayer = UTIL_PlayerByIndex( m_iCommanderIndex );
|
|
|
|
if ( bIsInhabited && GetCommander() && pPlayer && pPlayer->IsConnected() )
|
|
{
|
|
// Use the player name
|
|
pchName = pPlayer->GetPlayerName();
|
|
bPlayerName = true;
|
|
}
|
|
else
|
|
{
|
|
// Use the character name
|
|
pchName = GetProfile()->GetShortName();
|
|
}
|
|
}
|
|
|
|
// Copy the name
|
|
V_strncpy( pwchDisplayName, pchName, nMaxBytes );
|
|
}
|
|
|
|
void CASW_Marine_Resource::SetMarineEntity(CASW_Marine* marine)
|
|
{
|
|
m_MarineEntity = marine;
|
|
}
|
|
|
|
void CASW_Marine_Resource::SetProfileIndex(int ProfileIndex)
|
|
{
|
|
m_MarineProfileIndex = ProfileIndex;
|
|
}
|
|
|
|
int CASW_Marine_Resource::GetProfileIndex()
|
|
{
|
|
return m_MarineProfileIndex;
|
|
}
|
|
|
|
CASW_Marine_Profile* CASW_Marine_Resource::GetProfile()
|
|
{
|
|
Assert(MarineProfileList());
|
|
|
|
if (m_MarineProfileIndex <0 || m_MarineProfileIndex >= MarineProfileList()->m_NumProfiles)
|
|
return NULL;
|
|
|
|
return MarineProfileList()->m_Profiles[m_MarineProfileIndex];
|
|
}
|
|
|
|
|
|
CASW_Marine* CASW_Marine_Resource::GetMarineEntity()
|
|
{
|
|
return m_MarineEntity;
|
|
}
|
|
|
|
// updates our primary/secondary/extra indices into the equipment list with what we're currently carrying
|
|
void CASW_Marine_Resource::UpdateWeaponIndices()
|
|
{
|
|
if ( !m_MarineEntity || !ASWEquipmentList() )
|
|
return;
|
|
|
|
for ( int iWpnSlot = 0; iWpnSlot < ASW_MAX_EQUIP_SLOTS; ++ iWpnSlot )
|
|
{
|
|
int idx = -1;
|
|
if ( CBaseCombatWeapon* pWpn = m_MarineEntity->GetWeapon( iWpnSlot ) )
|
|
{
|
|
const char *szClassName = pWpn->GetClassname();
|
|
idx = ASWEquipmentList()->GetIndexForSlot( iWpnSlot, szClassName );
|
|
}
|
|
if ( idx != m_iWeaponsInSlots.Get( iWpnSlot ) )
|
|
{
|
|
m_iWeaponsInSlots.Set( iWpnSlot, idx );
|
|
}
|
|
}
|
|
}
|
|
|
|
float CASW_Marine_Resource::GetHealthPercent()
|
|
{
|
|
CASW_Marine_Profile *profile = GetProfile();
|
|
CASW_Marine *marine = GetMarineEntity();
|
|
if (!profile || !marine)
|
|
return 0;
|
|
|
|
float max_health = marine->GetMaxHealth();
|
|
float health = marine->GetHealth();
|
|
|
|
return health / max_health;
|
|
}
|
|
|
|
bool CASW_Marine_Resource::IsInhabited()
|
|
{
|
|
return m_bInhabited;
|
|
}
|
|
|
|
void CASW_Marine_Resource::SetInhabited(bool bInhabited)
|
|
{
|
|
m_bInhabited = bInhabited;
|
|
}
|
|
|
|
bool CASW_Marine_Resource::IsFiring()
|
|
{
|
|
// if we can directly see the marine and his weapon, then check accurately if he's firing
|
|
//if (GetMarineEntity() && GetMarineEntity()->GetActiveASWWeapon())
|
|
//{
|
|
//return GetMarineEntity()->GetActiveASWWeapon()->IsFiring();
|
|
//}
|
|
// if not, then see what the server says
|
|
return (m_iServerFiring > 0);
|
|
}
|
|
|
|
// a game event has happened that is potentially affected by leadership or other damage scaling
|
|
float CASW_Marine_Resource::OnFired_GetDamageScale()
|
|
{
|
|
float flDamageScale = 1.0f;
|
|
|
|
// damage amp causes double damage always
|
|
CASW_Marine *pMarine = GetMarineEntity();
|
|
if ( pMarine && pMarine->GetDamageBuffEndTime() > gpGlobals->curtime )
|
|
{
|
|
flDamageScale *= 2.0f;
|
|
}
|
|
|
|
//m_iLeadershipCount++;
|
|
|
|
// find the shortest leadership interval of our nearby leaders
|
|
float fChance = MarineSkills()->GetHighestSkillValueNearby(GetMarineEntity()->GetAbsOrigin(),
|
|
asw_leadership_radius.GetFloat(),
|
|
ASW_MARINE_SKILL_LEADERSHIP, ASW_MARINE_SUBSKILL_LEADERSHIP_ACCURACY_CHANCE );
|
|
float f = random->RandomFloat();
|
|
static int iLeadershipAccCount = 0;
|
|
if ( f < fChance )
|
|
{
|
|
iLeadershipAccCount++;
|
|
|
|
flDamageScale *= 2.0f;
|
|
}
|
|
|
|
if (asw_debug_marine_damage.GetBool())
|
|
{
|
|
Msg("Doing leadership accuracy test. Chance is %f random float is %f\n", fChance, f);
|
|
Msg(" Leadership accuracy applied %d times so far\n", iLeadershipAccCount);
|
|
Msg( " OnFired_GetDamageScale returning scale of %f\n", flDamageScale );
|
|
}
|
|
|
|
return flDamageScale;
|
|
}
|
|
|
|
// marine has just used the weapon specified - track stats
|
|
void CASW_Marine_Resource::UsedWeapon(int iWeaponEquipIndex, bool bWeaponExtra, int iShots)
|
|
{
|
|
// call weapon pointer version to update hits/misses
|
|
UsedWeapon(NULL, iShots);
|
|
|
|
// update 'only used weapon'
|
|
|
|
// not used a weapon yet?
|
|
if (m_iOnlyWeaponEquipIndex == -1)
|
|
{
|
|
m_iOnlyWeaponEquipIndex = iWeaponEquipIndex;
|
|
m_bOnlyWeaponExtra = bWeaponExtra;
|
|
return;
|
|
}
|
|
|
|
// used a different type of weapon?
|
|
if (bWeaponExtra != m_bOnlyWeaponExtra)
|
|
{
|
|
m_iOnlyWeaponEquipIndex = -2;
|
|
return;
|
|
}
|
|
|
|
// used a different weapon index?
|
|
if (iWeaponEquipIndex != m_iOnlyWeaponEquipIndex)
|
|
{
|
|
m_iOnlyWeaponEquipIndex = -2;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// marine has just used the weapon specified - track stats
|
|
void CASW_Marine_Resource::UsedWeapon(CASW_Weapon *pWeapon, int iShots)
|
|
{
|
|
// track misses
|
|
if (GetMarineEntity())
|
|
{
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("used weapon: ");
|
|
if (gpGlobals->curtime <= GetMarineEntity()->m_fLastShotAlienTime + 1.0f) // give a 1 second window after hitting an alien to count shots as hitting
|
|
{
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("hit an alien (curtime=%f lastshotalientime=%f\n", gpGlobals->curtime, GetMarineEntity()->m_fLastShotAlienTime);
|
|
// shot hit an alien
|
|
m_iShotsFired += iShots;
|
|
if (GetMarineEntity()->IsInhabited())
|
|
m_iPlayerShotsFired += iShots;
|
|
}
|
|
else if (gpGlobals->curtime <= GetMarineEntity()->m_fLastShotJunkTime + 1.0f)
|
|
{
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("hit junk (curtime=%f last shotjunktime=%f lastshotalientime=%f\n", gpGlobals->curtime,GetMarineEntity()->m_fLastShotJunkTime, GetMarineEntity()->m_fLastShotAlienTime);
|
|
// we didn't hit an alien, but we did hit some junk, don't increase player shots
|
|
// so players can't shoot barrels and thinks to get their accuracy up
|
|
m_iShotsFired += iShots;
|
|
}
|
|
else
|
|
{
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("missed (curtime=%f last shotjunktime=%f lastshotalientime=%f\n", gpGlobals->curtime,GetMarineEntity()->m_fLastShotJunkTime, GetMarineEntity()->m_fLastShotAlienTime);
|
|
// we didn't an alien or any junk, this is a miss
|
|
m_iShotsFired += iShots;
|
|
m_iShotsMissed += iShots;
|
|
if (GetMarineEntity()->IsInhabited())
|
|
{
|
|
m_iPlayerShotsFired += iShots;
|
|
m_iPlayerShotsMissed += iShots;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!pWeapon || m_iOnlyWeaponEquipIndex == -2)
|
|
return;
|
|
|
|
// not used a weapon yet?
|
|
if (m_iOnlyWeaponEquipIndex == -1)
|
|
{
|
|
m_iOnlyWeaponEquipIndex = pWeapon->GetEquipmentListIndex();
|
|
if (pWeapon->GetWeaponInfo())
|
|
m_bOnlyWeaponExtra = pWeapon->GetWeaponInfo()->m_bExtra;
|
|
return;
|
|
}
|
|
|
|
// used a different type of weapon?
|
|
if (pWeapon->GetWeaponInfo() && pWeapon->GetWeaponInfo()->m_bExtra != m_bOnlyWeaponExtra)
|
|
{
|
|
m_iOnlyWeaponEquipIndex = -2;
|
|
return;
|
|
}
|
|
|
|
// used a different weapon index?
|
|
if (pWeapon->GetEquipmentListIndex() != m_iOnlyWeaponEquipIndex)
|
|
{
|
|
m_iOnlyWeaponEquipIndex = -2;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// prints debug info to the console about various stats collected for awarding medals
|
|
void CASW_Marine_Resource::DebugMedalStats()
|
|
{
|
|
if (!GetProfile())
|
|
return;
|
|
|
|
Msg("%s's stats for medals:\n", GetProfile()->m_ShortName);
|
|
Msg(" Shots fired: %d\n", m_iShotsFired);
|
|
float accuracy = 0;
|
|
if (m_iShotsFired > 0)
|
|
{
|
|
accuracy = float(m_iShotsFired - m_iShotsMissed) / float(m_iShotsFired);
|
|
}
|
|
Msg(" Shots missed: %d (accuracy = %f)\n", m_iShotsMissed, accuracy);
|
|
Msg(" Player shots fired: %d\n", m_iPlayerShotsFired);
|
|
if (m_iPlayerShotsFired > 0)
|
|
{
|
|
accuracy = float(m_iPlayerShotsFired - m_iPlayerShotsMissed) / float(m_iPlayerShotsFired);
|
|
}
|
|
Msg(" Player shots missed: %d (player acc = %f)\n", m_iPlayerShotsMissed, accuracy);
|
|
Msg(" Damage taken: %f\n", m_fDamageTaken);
|
|
Msg(" Alien kills: %d\n", m_iAliensKilled);
|
|
Msg(" FF damage dealt: %f\n", m_fFriendlyFireDamageDealt);
|
|
Msg(" FF damage taken: %f\n", GetMarineEntity() ? GetMarineEntity()->m_fFriendlyFireDamage : -1);
|
|
Msg(" Single explosion kills: %d\n", m_iSingleGrenadeKills);
|
|
Msg(" Kicked Grenade kills: %d\n", m_iKickedGrenadeKills);
|
|
Msg(" Shieldbugs killed: %d\n", m_iShieldbugsKilled);
|
|
Msg(" Parasites killed: %d\n", m_iParasitesKilled);
|
|
Msg(" Lifesaver kills: %d\n", m_iSavedLife);
|
|
Msg(" Been hurt: %d\n", m_bHurt);
|
|
Msg(" Been wounded: %d\n", m_bTakenWoundDamage);
|
|
Msg(" Mad Firing: %d\n", m_iMadFiring);
|
|
Msg(" Mad Firing Autogun: %d\n", m_iMadFiringAutogun);
|
|
//Msg(" Last Stand Kills: %d\n", m_iLastStandKills);
|
|
Msg(" Health Healed: %d\n", m_iMedicHealing);
|
|
Msg(" Cured Infestation: %d\n", m_iCuredInfestation);
|
|
Msg(" Only weapon used index: %d\n", m_iOnlyWeaponEquipIndex);
|
|
Msg(" Only weapon used extra: %d\n", m_bOnlyWeaponExtra);
|
|
Msg(" Mine burns: %d\n", m_iMineKills);
|
|
Msg(" Sentry kills: %d\n", m_iSentryKills);
|
|
Msg(" Eggs killed: %d\n", m_iEggKills);
|
|
Msg(" Grubs killed: %d\n", m_iGrubKills);
|
|
Msg(" Aliens killed by barrels: %d\n", m_iBarrelKills);
|
|
Msg(" Fires put out: %d\n", m_iFiresPutOut);
|
|
Msg(" Did several fast reloads: %s\n", m_bDidFastReloadsInARow ? "yes" : "no" );
|
|
Msg(" Damage Amp medal: %s\n", m_bDamageAmpMedal ? "yes" : "no" );
|
|
Msg(" Killed boomer early: %s\n", m_bKilledBoomerEarly ? "yes" : "no" );
|
|
Msg(" Stun grenade medal: %s\n", m_bStunGrenadeMedal ? "yes" : "no" );
|
|
Msg(" Freeze grenade medal: %s\n", m_bFreezeGrenadeMedal ? "yes" : "no" );
|
|
Msg(" Dodged ranger: %s\n", m_bDodgedRanger ? "yes" : "no" );
|
|
Msg(" Protected tech: %s\n", m_bProtectedTech ? "yes" : "no" );
|
|
Msg(" Melee parasite kill: %s\n", m_bMeleeParasiteKill ? "yes" : "no" );
|
|
Msg(" Aliens kicked: %d\n", m_iAliensKicked);
|
|
Msg(" Fast Door Hacks: %d\n", m_iFastDoorHacks);
|
|
Msg(" Fast Computer Hacks: %d\n", m_iFastComputerHacks);
|
|
}
|
|
|
|
void CASW_Marine_Resource::DebugMedalStatsOnScreen()
|
|
{
|
|
int i=2;
|
|
float accuracy = 0;
|
|
float player_acc = 0;
|
|
if (m_iShotsFired > 0)
|
|
{
|
|
accuracy = float(m_iShotsFired - m_iShotsMissed) / float(m_iShotsFired);
|
|
}
|
|
if (m_iPlayerShotsFired > 0)
|
|
{
|
|
player_acc = float(m_iPlayerShotsFired - m_iPlayerShotsMissed) / float(m_iPlayerShotsFired);
|
|
}
|
|
|
|
engine->Con_NPrintf( i++, "Shots fired: (%d)", m_iShotsFired);
|
|
engine->Con_NPrintf( i++, "Shots missed: %d (accuracy = %f)", m_iShotsMissed, accuracy);
|
|
engine->Con_NPrintf( i++, "Player Shots fired: (%d)", m_iPlayerShotsFired);
|
|
engine->Con_NPrintf( i++, "Player Shots missed: %d (accuracy = %f)", m_iPlayerShotsMissed, player_acc);
|
|
engine->Con_NPrintf( i++, "Damage taken: %f\n", m_fDamageTaken);
|
|
engine->Con_NPrintf( i++, "Alien kills: %d\n", m_iAliensKilled);
|
|
engine->Con_NPrintf( i++, "FF damage dealt: %f\n", m_fFriendlyFireDamageDealt);
|
|
engine->Con_NPrintf( i++, "FF damage taken: %f\n", GetMarineEntity() ? GetMarineEntity()->m_fFriendlyFireDamage : -1);
|
|
engine->Con_NPrintf( i++, "Single explosion kills: %d\n", m_iSingleGrenadeKills);
|
|
engine->Con_NPrintf( i++, "Kicked Grenade kills: %d\n", m_iKickedGrenadeKills);
|
|
engine->Con_NPrintf( i++, "Shieldbugs killed: %d\n", m_iShieldbugsKilled);
|
|
engine->Con_NPrintf( i++, "Parasites killed: %d\n", m_iParasitesKilled);
|
|
engine->Con_NPrintf( i++, "Lifesaver kills: %d\n", m_iSavedLife);
|
|
bool bHurt = m_bHurt;
|
|
engine->Con_NPrintf( i++, "Been hurt: %d\n", bHurt);
|
|
bool bWounded = m_bTakenWoundDamage;
|
|
engine->Con_NPrintf( i++, "Been wounded: %d\n", bWounded );
|
|
engine->Con_NPrintf( i++, "Mad Firing: %d\n", m_iMadFiring);
|
|
engine->Con_NPrintf( i++, "Mad Firing Autogun: %d\n", m_iMadFiringAutogun);
|
|
//engine->Con_NPrintf( i++, "Last Stand Kills: %d\n", m_iLastStandKills);
|
|
engine->Con_NPrintf( i++, "Health Healed: %d\n", m_iMedicHealing);
|
|
engine->Con_NPrintf( i++, "Cured Infestation: %d\n", m_iCuredInfestation);
|
|
engine->Con_NPrintf( i++, "Only weapon used index: %d\n", m_iOnlyWeaponEquipIndex);
|
|
engine->Con_NPrintf( i++, "Only weapon used extra: %d\n", m_bOnlyWeaponExtra);
|
|
engine->Con_NPrintf( i++, "Mine burns: %d\n", m_iMineKills);
|
|
engine->Con_NPrintf( i++, "Sentry kills: %d\n", m_iSentryKills);
|
|
engine->Con_NPrintf( i++, "Eggs killed: %d\n", m_iEggKills);
|
|
engine->Con_NPrintf( i++, "Grubs killed: %d\n", m_iGrubKills);
|
|
engine->Con_NPrintf( i++, "Aliens killed by barrels: %d\n", m_iBarrelKills);
|
|
engine->Con_NPrintf( i++, "Fires put out: %d\n", m_iFiresPutOut);
|
|
engine->Con_NPrintf( i++, "Aliens kicked: %d\n", m_iAliensKicked);
|
|
engine->Con_NPrintf( i++, "Fast door hacks: %d\n", m_iFastDoorHacks);
|
|
engine->Con_NPrintf( i++, "Fast computer hacks: %d\n", m_iFastComputerHacks);
|
|
}
|
|
|
|
bool CASW_Marine_Resource::IsReloading()
|
|
{
|
|
if (!GetMarineEntity())
|
|
return false;
|
|
|
|
CASW_Weapon *pWeapon = GetMarineEntity()->GetActiveASWWeapon();
|
|
if (!pWeapon)
|
|
return false;
|
|
|
|
return pWeapon->IsReloading();
|
|
} |