Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

185 lines
4.0 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
// NVNT haptic manager for tf2
#include "cbase.h"
#include "c_tf_haptics.h"
#include "c_tf_player.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
// for full cloak effect
extern ConVar tf_teammate_max_invis;
C_TFHaptics::C_TFHaptics()
{
memset(this, 0, sizeof(C_TFHaptics));
}
void C_TFHaptics::Revert() {
if ( haptics )
{
if(wasBeingHealed)
{
haptics->ProcessHapticEvent(2,"Game","being_healed_stop");
}
if(wasHealing)
{
haptics->ProcessHapticEvent(2,"Game","healing_stop");
}
if(wasUber)
{
haptics->ProcessHapticEvent(2, "Game", "uber_stop");
}
if(wasFullyCloaked)
{
haptics->ProcessHapticEvent(2, "Game", "cloak_full_stop");
}
if(wasCloaked)
{
haptics->ProcessHapticEvent(2, "Game", "cloak_stop");
}
if(wasBurning)
{
haptics->ProcessHapticEvent(2, "Game", "burning_stop");
}
}
memset(this, 0, sizeof(C_TFHaptics));
if ( haptics )
{
haptics->LocalPlayerReset();
haptics->SetNavigationClass("on_foot");
}
}
void C_TFHaptics::HapticsThink(C_TFPlayer *player)
{
if ( !haptics )
return;
Assert(player!=C_TFPlayer::GetLocalPlayer());
{// being healed check
C_TFPlayer *pHealer = NULL;
float uberCharge = 0.0f;
player->GetHealer(&pHealer,&uberCharge);
if(pHealer)
{
if(!wasBeingHealedMedic && !healingDispenserCount)
isBeingHealed = true;
}
else
{
if(wasBeingHealedMedic && !healingDispenserCount)
isBeingHealed = false;
}
wasBeingHealedMedic = pHealer!=NULL;
if(isBeingHealed&&!wasBeingHealed&&haptics)
haptics->ProcessHapticEvent(2,"Game","being_healed_start");
else if(!isBeingHealed&&wasBeingHealed&&haptics)
haptics->ProcessHapticEvent(2,"Game","being_healed_stop");
wasBeingHealed = isBeingHealed;
}
{// healing check
C_BaseEntity *pHealTarget = player->MedicGetHealTarget();
if(pHealTarget)
{
if(!wasHealing&&haptics)
haptics->ProcessHapticEvent(2,"Game","healing_start");
}
else
{
if(wasHealing&&haptics)
haptics->ProcessHapticEvent(2,"Game","healing_stop");
}
wasHealing = pHealTarget!=NULL;
}
//uber
if(player->m_Shared.InCond( TF_COND_INVULNERABLE ) && !player->m_Shared.InCond( TF_COND_INVULNERABLE_WEARINGOFF ) )
{
if(!wasUber&&haptics)
{
haptics->ProcessHapticEvent(2, "Game", "uber_start");
}
}else{
if(wasUber&&haptics)
{
haptics->ProcessHapticEvent(2, "Game", "uber_stop");
}
}
//burning
if(player->m_Shared.InCond( TF_COND_BURNING ) )
{
if(!wasBurning&&haptics)
{
haptics->ProcessHapticEvent(2, "Game", "burning_start");
wasBurning = true;
}
}else{
if(wasBurning)
{
haptics->ProcessHapticEvent(2, "Game", "burning_stop");
wasBurning = false;
}
}
//cloak
// note: theres some weird stuff going on here.
float cloakLevel = player->GetPercentInvisible();
if(readyForCloak)
{
if(cloakLevel>0.0f)
{
if(!wasCloaked)
{
haptics->ProcessHapticEvent(2, "Game", "cloak_start");
wasCloaked = true;
}
if(!wasFullyCloaked)
{
if(cloakLevel >= tf_teammate_max_invis.GetFloat())
{
haptics->ProcessHapticEvent(2, "Game", "cloak_full_start");
wasFullyCloaked = true;
}
}
else
{
if(cloakLevel < tf_teammate_max_invis.GetFloat())
{
haptics->ProcessHapticEvent(2, "Game", "cloak_full_stop");
wasFullyCloaked = false;
}
}
}else{
if(wasFullyCloaked)
{
haptics->ProcessHapticEvent(2, "Game", "cloak_full_stop");
wasFullyCloaked = false;
}
if(wasCloaked)
{
haptics->ProcessHapticEvent(2, "Game", "cloak_stop");
wasCloaked = false;
}
}
}else{
if(skippedFirstCloak)
{
if(cloakLevel==0.0f)
readyForCloak = true;
}else{
if(cloakLevel!=0.0f)
{
skippedFirstCloak = true;
}
}
}
}
class C_TFHapticsInternal : public C_TFHaptics
{
public:
C_TFHapticsInternal() : C_TFHaptics() {};
};
static C_TFHapticsInternal tfInternalHaptics;
C_TFHaptics &tfHaptics = *((C_TFHaptics*)&tfInternalHaptics);