143 lines
3.9 KiB
C++
143 lines
3.9 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: Used to create a path that can be followed by NPCs and trains.
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "trains.h"
|
||
|
#include "entitylist.h"
|
||
|
#include "ndebugoverlay.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
class CPathCorner : public CPointEntity
|
||
|
{
|
||
|
DECLARE_CLASS( CPathCorner, CPointEntity );
|
||
|
public:
|
||
|
|
||
|
void Spawn( );
|
||
|
float GetDelay( void ) { return m_flWait; }
|
||
|
int DrawDebugTextOverlays(void);
|
||
|
void DrawDebugGeometryOverlays(void);
|
||
|
|
||
|
// Input handlers
|
||
|
void InputSetNextPathCorner( inputdata_t &inputdata );
|
||
|
void InputInPass( inputdata_t &inputdata );
|
||
|
|
||
|
DECLARE_DATADESC();
|
||
|
|
||
|
private:
|
||
|
float m_flWait;
|
||
|
COutputEvent m_OnPass;
|
||
|
};
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( path_corner, CPathCorner );
|
||
|
|
||
|
|
||
|
class CPathCornerCrash : public CPathCorner
|
||
|
{
|
||
|
DECLARE_CLASS( CPathCornerCrash, CPathCorner );
|
||
|
};
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( path_corner_crash, CPathCornerCrash );
|
||
|
|
||
|
|
||
|
BEGIN_DATADESC( CPathCorner )
|
||
|
|
||
|
DEFINE_KEYFIELD( m_flWait, FIELD_FLOAT, "wait" ),
|
||
|
|
||
|
// Inputs
|
||
|
DEFINE_INPUTFUNC( FIELD_STRING, "SetNextPathCorner", InputSetNextPathCorner),
|
||
|
|
||
|
// Internal inputs - not exposed in the FGD
|
||
|
DEFINE_INPUTFUNC( FIELD_VOID, "InPass", InputInPass ),
|
||
|
|
||
|
// Outputs
|
||
|
DEFINE_OUTPUT( m_OnPass, "OnPass"),
|
||
|
|
||
|
END_DATADESC()
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CPathCorner::Spawn( void )
|
||
|
{
|
||
|
ASSERTSZ(GetEntityName() != NULL_STRING, "path_corner without a targetname");
|
||
|
}
|
||
|
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Purpose: Sets the next path corner by name.
|
||
|
// Input : String ID name of next path corner.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CPathCorner::InputSetNextPathCorner( inputdata_t &inputdata )
|
||
|
{
|
||
|
m_target = inputdata.value.StringID();
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Fired by path followers as they pass the path corner.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CPathCorner::InputInPass( inputdata_t &inputdata )
|
||
|
{
|
||
|
m_OnPass.FireOutput( inputdata.pActivator, inputdata.pCaller, 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Draw any debug text overlays
|
||
|
// Output : Current text offset from the top
|
||
|
//-----------------------------------------------------------------------------
|
||
|
int CPathCorner::DrawDebugTextOverlays(void)
|
||
|
{
|
||
|
int text_offset = BaseClass::DrawDebugTextOverlays();
|
||
|
|
||
|
if (m_debugOverlays & OVERLAY_TEXT_BIT)
|
||
|
{
|
||
|
// --------------
|
||
|
// Print Target
|
||
|
// --------------
|
||
|
char tempstr[255];
|
||
|
if (m_target!=NULL_STRING)
|
||
|
{
|
||
|
Q_snprintf(tempstr,sizeof(tempstr),"Target: %s",STRING(m_target));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Q_strncpy(tempstr,"Target: - ",sizeof(tempstr));
|
||
|
}
|
||
|
EntityText(text_offset,tempstr,0);
|
||
|
text_offset++;
|
||
|
}
|
||
|
return text_offset;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Override base class to add display of paths
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CPathCorner::DrawDebugGeometryOverlays(void)
|
||
|
{
|
||
|
// ----------------------------------------------
|
||
|
// Draw line to next target is bbox is selected
|
||
|
// ----------------------------------------------
|
||
|
if (m_debugOverlays & (OVERLAY_BBOX_BIT|OVERLAY_ABSBOX_BIT))
|
||
|
{
|
||
|
NDebugOverlay::Box(GetAbsOrigin(), Vector(-10,-10,-10), Vector(10,10,10), 255, 100, 100, 0 ,0);
|
||
|
|
||
|
if (m_target != NULL_STRING)
|
||
|
{
|
||
|
CBaseEntity *pTarget = gEntList.FindEntityByName( NULL, m_target );
|
||
|
if (pTarget)
|
||
|
{
|
||
|
NDebugOverlay::Line(GetAbsOrigin(),pTarget->GetAbsOrigin(),255,100,100,true,0.0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
BaseClass::DrawDebugGeometryOverlays();
|
||
|
}
|