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.
309 lines
8.3 KiB
309 lines
8.3 KiB
//========= Copyright © 1996-2008, Valve Corporation, All rights reserved. ====
|
|
//
|
|
// Purpose: Player for HL2.
|
|
//
|
|
//=============================================================================
|
|
|
|
#include "cbase.h"
|
|
#include "logic_playerproxy.h"
|
|
#include "filters.h"
|
|
|
|
#if defined HL2_EPISODIC
|
|
#include "hl2_player.h"
|
|
#endif // HL2_EPISODIC
|
|
|
|
#if defined ( PORTAL2 )
|
|
#include "portal_player.h"
|
|
#include "weapon_portalgun.h"
|
|
#endif
|
|
|
|
LINK_ENTITY_TO_CLASS( logic_playerproxy, CLogicPlayerProxy);
|
|
|
|
BEGIN_DATADESC( CLogicPlayerProxy )
|
|
|
|
// Base
|
|
DEFINE_OUTPUT( m_RequestedPlayerHealth, "PlayerHealth" ),
|
|
DEFINE_OUTPUT( m_PlayerDied, "PlayerDied" ),
|
|
DEFINE_FIELD( m_hPlayer, FIELD_EHANDLE ),
|
|
|
|
DEFINE_OUTPUT( m_OnJump, "OnJump" ),
|
|
DEFINE_OUTPUT( m_OnDuck, "OnDuck" ),
|
|
DEFINE_OUTPUT( m_OnUnDuck, "OnUnDuck" ),
|
|
|
|
// Portal 2
|
|
#ifdef PORTAL2
|
|
DEFINE_OUTPUT( m_OnStartSlowingTime, "OnStartSlowingTime" ),
|
|
DEFINE_OUTPUT( m_OnStopSlowingTime, "OnStopSlowingTime" ),
|
|
|
|
DEFINE_OUTPUT( m_OnPrimaryPortalPlaced, "OnPrimaryPortalPlaced" ),
|
|
DEFINE_OUTPUT( m_OnSecondaryPortalPlaced, "OnSecondaryPortalPlaced" ),
|
|
|
|
DEFINE_OUTPUT( m_OnCoopPing, "OnCoopPing" ),
|
|
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "AddPotatosToPortalgun", InputAddPotatosToPortalgun ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "RemovePotatosFromPortalgun", InputRemovePotatosFromPortalgun ),
|
|
|
|
DEFINE_INPUTFUNC( FIELD_BOOLEAN, "SetDropEnabled", InputSetDropEnabled ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "ForceVMGrabController", InputForceVMGrabController ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "ForcePhysicsGrabController", InputForcePhysicsGrabController ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "ResetGrabControllerBehavior", InputResetGrabControllerBehavior ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "PaintPlayerWithPortalPaint", InputPaintPlayerWithPortalPaint ),
|
|
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetMotionBlurAmount", InputSetMotionBlurAmount ),
|
|
#endif // PORTAL2
|
|
|
|
// HL2 / Episodic
|
|
#if defined HL2_EPISODIC && !defined( PORTAL2 )
|
|
DEFINE_OUTPUT( m_OnFlashlightOn, "OnFlashlightOn" ),
|
|
DEFINE_OUTPUT( m_OnFlashlightOff, "OnFlashlightOff" ),
|
|
DEFINE_OUTPUT( m_PlayerMissedAR2AltFire, "PlayerMissedAR2AltFire" ),
|
|
DEFINE_OUTPUT( m_PlayerHasAmmo, "PlayerHasAmmo" ),
|
|
DEFINE_OUTPUT( m_PlayerHasNoAmmo, "PlayerHasNoAmmo" ),
|
|
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "SetFlashlightSlowDrain", InputSetFlashlightSlowDrain ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "SetFlashlightNormalDrain", InputSetFlashlightNormalDrain ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "LowerWeapon", InputLowerWeapon ),
|
|
DEFINE_INPUTFUNC( FIELD_STRING, "SetLocatorTargetEntity", InputSetLocatorTargetEntity ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "RequestPlayerHealth", InputRequestPlayerHealth ),
|
|
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetPlayerHealth", InputSetPlayerHealth ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "RequestAmmoState", InputRequestAmmoState ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "EnableCappedPhysicsDamage", InputEnableCappedPhysicsDamage ),
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "DisableCappedPhysicsDamage", InputDisableCappedPhysicsDamage ),
|
|
#endif // HL2_EPISODIC
|
|
|
|
END_DATADESC()
|
|
|
|
void CLogicPlayerProxy::Activate( void )
|
|
{
|
|
BaseClass::Activate();
|
|
|
|
if ( m_hPlayer == NULL )
|
|
{
|
|
m_hPlayer = AI_GetSinglePlayer();
|
|
}
|
|
}
|
|
|
|
bool CLogicPlayerProxy::PassesDamageFilter( const CTakeDamageInfo &info )
|
|
{
|
|
if (m_hDamageFilter)
|
|
{
|
|
CBaseFilter *pFilter = (CBaseFilter *)(m_hDamageFilter.Get());
|
|
return pFilter->PassesDamageFilter(info);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputSetPlayerHealth( inputdata_t &inputdata )
|
|
{
|
|
if ( m_hPlayer == NULL )
|
|
return;
|
|
|
|
m_hPlayer->SetHealth( inputdata.value.Int() );
|
|
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputRequestPlayerHealth( inputdata_t &inputdata )
|
|
{
|
|
if ( m_hPlayer == NULL )
|
|
return;
|
|
|
|
m_RequestedPlayerHealth.Set( m_hPlayer->GetHealth(), inputdata.pActivator, inputdata.pCaller );
|
|
}
|
|
|
|
#if defined HL2_EPISODIC && !defined( PORTAL2 )
|
|
|
|
extern ConVar hl2_darkness_flashlight_factor;
|
|
|
|
void CLogicPlayerProxy::InputSetFlashlightSlowDrain( inputdata_t &inputdata )
|
|
{
|
|
if( m_hPlayer == NULL )
|
|
return;
|
|
|
|
CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(m_hPlayer.Get());
|
|
|
|
if( pPlayer )
|
|
pPlayer->SetFlashlightPowerDrainScale( hl2_darkness_flashlight_factor.GetFloat() );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputSetFlashlightNormalDrain( inputdata_t &inputdata )
|
|
{
|
|
if( m_hPlayer == NULL )
|
|
return;
|
|
|
|
CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(m_hPlayer.Get());
|
|
|
|
if( pPlayer )
|
|
pPlayer->SetFlashlightPowerDrainScale( 1.0f );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputLowerWeapon( inputdata_t &inputdata )
|
|
{
|
|
if( m_hPlayer == NULL )
|
|
return;
|
|
|
|
CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(m_hPlayer.Get());
|
|
|
|
pPlayer->Weapon_Lower();
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputSetLocatorTargetEntity( inputdata_t &inputdata )
|
|
{
|
|
if( m_hPlayer == NULL )
|
|
return;
|
|
|
|
CBaseEntity *pTarget = NULL; // assume no target
|
|
string_t iszTarget = MAKE_STRING( inputdata.value.String() );
|
|
|
|
if( iszTarget != NULL_STRING )
|
|
{
|
|
pTarget = gEntList.FindEntityByName( NULL, iszTarget );
|
|
}
|
|
|
|
CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(m_hPlayer.Get());
|
|
pPlayer->SetLocatorTargetEntity(pTarget);
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputRequestAmmoState( inputdata_t &inputdata )
|
|
{
|
|
if( m_hPlayer == NULL )
|
|
return;
|
|
|
|
CBasePlayer *pPlayer = ToBasePlayer( m_hPlayer );
|
|
|
|
for ( int i = 0 ; i < pPlayer->WeaponCount(); ++i )
|
|
{
|
|
CBaseCombatWeapon* pCheck = pPlayer->GetWeapon( i );
|
|
|
|
if ( pCheck )
|
|
{
|
|
if ( pCheck->HasAnyAmmo() && (pCheck->UsesPrimaryAmmo() || pCheck->UsesSecondaryAmmo()))
|
|
{
|
|
m_PlayerHasAmmo.FireOutput( this, this, 0 );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_PlayerHasNoAmmo.FireOutput( this, this, 0 );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputEnableCappedPhysicsDamage( inputdata_t &inputdata )
|
|
{
|
|
if ( m_hPlayer == NULL )
|
|
return;
|
|
|
|
CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(m_hPlayer.Get());
|
|
pPlayer->EnableCappedPhysicsDamage();
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputDisableCappedPhysicsDamage( inputdata_t &inputdata )
|
|
{
|
|
if ( m_hPlayer == NULL )
|
|
return;
|
|
|
|
CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(m_hPlayer.Get());
|
|
pPlayer->DisableCappedPhysicsDamage();
|
|
}
|
|
|
|
#endif // HL2_EPISODIC
|
|
|
|
#if defined ( PORTAL2 )
|
|
|
|
CPortal_Player* GetPortalPlayerFromProxy()
|
|
{
|
|
if ( GameRules()->IsMultiplayer() )
|
|
{
|
|
Assert( 0 );
|
|
Warning( "Can't use logic player proxy in multiplayer!\n" );
|
|
return NULL;
|
|
}
|
|
|
|
return (CPortal_Player*)UTIL_PlayerByIndex( 1 );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputAddPotatosToPortalgun( inputdata_t &inputdata )
|
|
{
|
|
CPortal_Player* pPlayer = GetPortalPlayerFromProxy();
|
|
if ( pPlayer == NULL )
|
|
return;
|
|
|
|
CWeaponPortalgun *pPortalgun = (CWeaponPortalgun*)pPlayer->GetActiveWeapon();
|
|
|
|
Assert( pPortalgun );
|
|
if ( !pPortalgun )
|
|
return;
|
|
|
|
pPortalgun->SetPotatosOnPortalgun( true );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputRemovePotatosFromPortalgun( inputdata_t &inputdata )
|
|
{
|
|
CPortal_Player* pPlayer = GetPortalPlayerFromProxy();
|
|
if ( pPlayer == NULL )
|
|
return;
|
|
|
|
CWeaponPortalgun *pPortalgun = (CWeaponPortalgun*)pPlayer->GetActiveWeapon();
|
|
|
|
Assert( pPortalgun );
|
|
if ( !pPortalgun )
|
|
return;
|
|
|
|
pPortalgun->SetPotatosOnPortalgun( false );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputSetDropEnabled( inputdata_t &inputdata )
|
|
{
|
|
CPortal_Player* pPlayer = GetPortalPlayerFromProxy();
|
|
if( pPlayer == NULL )
|
|
{
|
|
return;
|
|
}
|
|
pPlayer->SetDropEnabled( inputdata.value.Bool() );
|
|
}
|
|
|
|
void SetForcedGrabController( ForcedGrabControllerType type )
|
|
{
|
|
CPortal_Player* pPlayer = GetPortalPlayerFromProxy();
|
|
if( pPlayer == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
pPlayer->SetForcedGrabControllerType( type );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputForceVMGrabController( inputdata_t &inputdata )
|
|
{
|
|
SetForcedGrabController( FORCE_GRAB_CONTROLLER_VM );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputForcePhysicsGrabController( inputdata_t &inputdata )
|
|
{
|
|
SetForcedGrabController( FORCE_GRAB_CONTROLLER_PHYSICS );
|
|
}
|
|
|
|
|
|
void CLogicPlayerProxy::InputResetGrabControllerBehavior( inputdata_t &inputdata )
|
|
{
|
|
SetForcedGrabController( FORCE_GRAB_CONTROLLER_DEFAULT );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputPaintPlayerWithPortalPaint( inputdata_t &/*inputdata*/ )
|
|
{
|
|
CPortal_Player* pPlayer = GetPortalPlayerFromProxy();
|
|
if( pPlayer != NULL )
|
|
pPlayer->Paint( PORTAL_POWER, vec3_origin );
|
|
}
|
|
|
|
void CLogicPlayerProxy::InputSetMotionBlurAmount( inputdata_t &inputdata )
|
|
{
|
|
if ( GameRules() && GameRules()->IsMultiplayer() == false )
|
|
{
|
|
CPortal_Player* pPlayer = GetPortalPlayerFromProxy();
|
|
if( pPlayer != NULL )
|
|
{
|
|
pPlayer->SetMotionBlurAmount( inputdata.value.Float() );
|
|
}
|
|
}
|
|
}
|
|
#endif
|