mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-20 04:26:03 +08:00
Added original SDK code for Alien Swarm.
This commit is contained in:
135
game/server/env_player_surface_trigger.cpp
Normal file
135
game/server/env_player_surface_trigger.cpp
Normal file
@ -0,0 +1,135 @@
|
||||
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
//=============================================================================//
|
||||
|
||||
#include "cbase.h"
|
||||
#include "decals.h"
|
||||
#include "env_player_surface_trigger.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
LINK_ENTITY_TO_CLASS( env_player_surface_trigger, CEnvPlayerSurfaceTrigger );
|
||||
|
||||
BEGIN_DATADESC( CEnvPlayerSurfaceTrigger )
|
||||
DEFINE_KEYFIELD( m_iTargetGameMaterial, FIELD_INTEGER, "gamematerial" ),
|
||||
DEFINE_FIELD( m_iCurrentGameMaterial, FIELD_INTEGER ),
|
||||
DEFINE_FIELD( m_bDisabled, FIELD_BOOLEAN ),
|
||||
|
||||
DEFINE_THINKFUNC( UpdateMaterialThink ),
|
||||
|
||||
// Inputs
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
|
||||
|
||||
// Outputs
|
||||
DEFINE_OUTPUT(m_OnSurfaceChangedToTarget, "OnSurfaceChangedToTarget"),
|
||||
DEFINE_OUTPUT(m_OnSurfaceChangedFromTarget, "OnSurfaceChangedFromTarget"),
|
||||
END_DATADESC()
|
||||
|
||||
// Global list of surface triggers
|
||||
CUtlVector< CHandle<CEnvPlayerSurfaceTrigger> > g_PlayerSurfaceTriggers;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
CEnvPlayerSurfaceTrigger::~CEnvPlayerSurfaceTrigger( void )
|
||||
{
|
||||
g_PlayerSurfaceTriggers.FindAndRemove( this );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CEnvPlayerSurfaceTrigger::Spawn( void )
|
||||
{
|
||||
SetSolid( SOLID_NONE );
|
||||
SetMoveType( MOVETYPE_NONE );
|
||||
|
||||
m_iCurrentGameMaterial = 0;
|
||||
m_bDisabled = false;
|
||||
|
||||
g_PlayerSurfaceTriggers.AddToTail( this );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CEnvPlayerSurfaceTrigger::OnRestore( void )
|
||||
{
|
||||
BaseClass::OnRestore();
|
||||
|
||||
g_PlayerSurfaceTriggers.AddToTail( this );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CEnvPlayerSurfaceTrigger::SetPlayerSurface( CBasePlayer *pPlayer, char gameMaterial )
|
||||
{
|
||||
// Ignore players in the air (stops bunny hoppers escaping triggers)
|
||||
if ( gameMaterial == 0 )
|
||||
return;
|
||||
|
||||
// Loop through the surface triggers and tell them all about the change
|
||||
int iCount = g_PlayerSurfaceTriggers.Count();
|
||||
for ( int i = 0; i < iCount; i++ )
|
||||
{
|
||||
g_PlayerSurfaceTriggers[i]->PlayerSurfaceChanged( pPlayer, gameMaterial );
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CEnvPlayerSurfaceTrigger::PlayerSurfaceChanged( CBasePlayer *pPlayer, char gameMaterial )
|
||||
{
|
||||
if ( m_bDisabled )
|
||||
return;
|
||||
|
||||
// Fire the output if we've changed, but only if it involves the target material
|
||||
if ( gameMaterial != (char)m_iCurrentGameMaterial &&
|
||||
( gameMaterial == m_iTargetGameMaterial || m_iCurrentGameMaterial == m_iTargetGameMaterial ) )
|
||||
{
|
||||
DevMsg( 2, "Player changed material to %d (was %d)\n", gameMaterial, m_iCurrentGameMaterial );
|
||||
|
||||
m_iCurrentGameMaterial = (int)gameMaterial;
|
||||
|
||||
SetThink( &CEnvPlayerSurfaceTrigger::UpdateMaterialThink );
|
||||
SetNextThink( gpGlobals->curtime );
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Think function to fire outputs. Done this way so that sv_alternate ticks
|
||||
// doesn't allow multiple surface changes in the same tick to fire outputs.
|
||||
//-----------------------------------------------------------------------------
|
||||
void CEnvPlayerSurfaceTrigger::UpdateMaterialThink( void )
|
||||
{
|
||||
if ( m_iCurrentGameMaterial == m_iTargetGameMaterial )
|
||||
{
|
||||
m_OnSurfaceChangedToTarget.FireOutput( NULL, this );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_OnSurfaceChangedFromTarget.FireOutput( NULL, this );
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CEnvPlayerSurfaceTrigger::InputDisable( inputdata_t &inputdata )
|
||||
{
|
||||
m_bDisabled = true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CEnvPlayerSurfaceTrigger::InputEnable( inputdata_t &inputdata )
|
||||
{
|
||||
m_bDisabled = false;
|
||||
}
|
Reference in New Issue
Block a user