@ -29,6 +29,7 @@
@@ -29,6 +29,7 @@
* Version : $ Id $
*/
# include <amtl/am-string.h>
# include "extension.h"
/**
@ -40,11 +41,11 @@ Outputinfo g_Outputinfo; /**< Global singleton for extension's main interface *
@@ -40,11 +41,11 @@ Outputinfo g_Outputinfo; /**< Global singleton for extension's main interface *
SMEXT_LINK ( & g_Outputinfo ) ;
IGameConfig * g_pGameConf = NULL ;
# include <isaverestore.h>
# include <variant_t.h>
# define EVENT_FIRE_ALWAYS -1
class CEventAction
{
public :
@ -54,66 +55,108 @@ public:
@@ -54,66 +55,108 @@ public:
string_t m_iTargetInput ; // the name of the action to fire
string_t m_iParameter ; // parameter to send, 0 if none
float m_flDelay ; // the number of seconds to wait before firing the action
int m_nTimesToFire ; // The number of times to fire this event, or EVENT_FIRE_ALWAYS.
int m_nTimesToFire ; // The number of times to fire this event, or EVENT_FIRE_ALWAYS (-1) .
int m_iIDStamp ; // unique identifier stamp
static int s_iNextIDStamp ;
CEventAction * m_pNext ;
/*
// allocates memory from engine.MPool/g_EntityListPool
static void * operator new ( size_t stAllocateBlock ) ;
static void * operator new ( size_t stAllocateBlock , int nBlockUse , const char * pFileName , int nLine ) ;
static void operator delete ( void * pMem ) ;
static void operator delete ( void * pMem , int nBlockUse , const char * pFileName , int nLine ) { operator delete ( pMem ) ; }
*/
DECLARE_SIMPLE_DATADESC ( ) ;
static void ( * s_pOperatorDeleteFunc ) ( void * pMem ) ;
static void operator delete ( void * pMem ) ;
} ;
void ( * CEventAction : : s_pOperatorDeleteFunc ) ( void * pMem ) ;
void CEventAction : : operator delete ( void * pMem )
{
s_pOperatorDeleteFunc ( pMem ) ;
}
class CBaseEntityOutput
{
public :
variant_t m_Value ;
CEventAction * m_ActionList ;
DECLARE_SIMPLE_DATADESC ( ) ;
~ CBaseEntityOutput ( ) ;
int NumberOfElements ( void ) ;
CEventAction * GetElement ( int Index ) ;
int DeleteElement ( int Index ) ;
int DeleteAllElements ( void ) ;
} ;
int CBaseEntityOutput : : NumberOfElements ( void )
{
int Count = 0 ;
for ( CEventAction * ev = m_ActionList ; ev ! = NULL ; ev = ev - > m_pNext )
Count + + ;
void ParseEventAction ( const char * EventData ) ;
void AddEventAction ( CEventAction * pEventAction ) ;
return Count ;
}
CEventAction * CBaseEntityOutput : : GetElement ( int Index )
{
int Count = 0 ;
for ( CEventAction * ev = m_ActionList ; ev ! = NULL ; ev = ev - > m_pNext )
{
if ( Count = = Index )
return ev ;
int Save ( ISave & save ) ;
int Restore ( IRestore & restore , int elementCount ) ;
Count + + ;
}
int NumberOfElements ( void ) ;
return NULL ;
}
float GetMaxDelay ( void ) ;
int CBaseEntityOutput : : DeleteElement ( int Index )
{
CEventAction * pPrevEvent = NULL ;
CEventAction * pEvent = NULL ;
fieldtype_t ValueFieldType ( ) { return m_Value . FieldType ( ) ; }
int Count = 0 ;
for ( CEventAction * ev = m_ActionList ; ev ! = NULL ; ev = ev - > m_pNext )
{
if ( Count = = Index )
{
pEvent = ev ;
break ;
}
pPrevEvent = ev ;
Count + + ;
}
void FireOutput ( variant_t Value , CBaseEntity * pActivator , CBaseEntity * pCaller , float fDelay = 0 ) ;
/*
/// Delete every single action in the action list.
void DeleteAllElements ( void ) ;
*/
public :
variant_t m_Value ;
CEventAction * m_ActionList ;
DECLARE_SIMPLE_DATADESC ( ) ;
if ( pEvent = = NULL )
return 0 ;
CBaseEntityOutput ( ) { } // this class cannot be created, only it's children
if ( pPrevEvent ! = NULL )
pPrevEvent - > m_pNext = pEvent - > m_pNext ;
else
m_ActionList = pEvent - > m_pNext ;
private :
CBaseEntityOutput ( CBaseEntityOutput & ) ; // protect from accidental copying
} ;
delete pEvent ;
return 1 ;
}
int CBaseEntityOutput : : NumberOf Elements( void )
int CBaseEntityOutput : : DeleteAll Elements( void )
{
int count = 0 ;
for ( CEventAction * ev = m_ActionList ; ev ! = NULL ; ev = ev - > m_pNext )
// walk front to back, deleting as we go. We needn't fix up pointers because
// EVERYTHING will die.
int Count = 0 ;
CEventAction * pNext = m_ActionList ;
// wipe out the head
m_ActionList = NULL ;
while ( pNext )
{
count + + ;
CEventAction * pStrikeThis = pNext ;
pNext = pNext - > m_pNext ;
delete pStrikeThis ;
Count + + ;
}
return count ;
return Count ;
}
inline int GetDataMapOffset ( CBaseEntity * pEnt , const char * pName )
@ -153,7 +196,7 @@ cell_t GetOutputCount(IPluginContext *pContext, const cell_t *params)
@@ -153,7 +196,7 @@ cell_t GetOutputCount(IPluginContext *pContext, const cell_t *params)
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
if ( pEntityOutput = = NULL )
return 0 ;
return - 1 ;
return pEntityOutput - > NumberOfElements ( ) ;
}
@ -169,23 +212,38 @@ cell_t GetOutputTarget(IPluginContext *pContext, const cell_t *params)
@@ -169,23 +212,38 @@ cell_t GetOutputTarget(IPluginContext *pContext, const cell_t *params)
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return 0 ;
CEventAction * pActionList = pEntityOutput - > m_ActionList ;
for ( int i = 0 ; i < params [ 3 ] ; i + + )
{
if ( pActionList - > m_pNext = = NULL )
return 0 ;
CEventAction * pAction = pEntityOutput - > GetElement ( params [ 3 ] ) ;
if ( ! pAction )
return 0 ;
pActionList = pActionList - > m_pNext ;
}
size_t Length ;
pContext - > StringToLocalUTF8 ( params [ 4 ] , params [ 5 ] , pAction - > m_iTarget . ToCStr ( ) , & Length ) ;
int Len = strlen ( pActionList - > m_iTarget . ToCStr ( ) ) ;
return Length ;
}
pContext - > StringToLocal ( params [ 4 ] , Len + 1 , pActionList - > m_iTarget . ToCStr ( ) ) ;
cell_t GetOutputTargetInput ( IPluginContext * pContext , const cell_t * params )
{
char * pOutput ;
pContext - > LocalToString ( params [ 2 ] , & pOutput ) ;
return Len ;
CBaseEntity * pEntity = gamehelpers - > ReferenceToEntity ( gamehelpers - > IndexToReference ( params [ 1 ] ) ) ;
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return 0 ;
CEventAction * pAction = pEntityOutput - > GetElement ( params [ 3 ] ) ;
if ( ! pAction )
return 0 ;
size_t Length ;
pContext - > StringToLocalUTF8 ( params [ 4 ] , params [ 5 ] , pAction - > m_iTargetInput . ToCStr ( ) , & Length ) ;
return Length ;
}
cell_t GetOutputTargetInput ( IPluginContext * pContext , const cell_t * params )
cell_t GetOutputParameter ( IPluginContext * pContext , const cell_t * params )
{
char * pOutput ;
pContext - > LocalToString ( params [ 2 ] , & pOutput ) ;
@ -193,26 +251,38 @@ cell_t GetOutputTargetInput(IPluginContext *pContext, const cell_t *params)
@@ -193,26 +251,38 @@ cell_t GetOutputTargetInput(IPluginContext *pContext, const cell_t *params)
CBaseEntity * pEntity = gamehelpers - > ReferenceToEntity ( gamehelpers - > IndexToReference ( params [ 1 ] ) ) ;
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return 0 ;
CEventAction * pActionList = pEntityOutput - > m_ActionList ;
for ( int i = 0 ; i < params [ 3 ] ; i + + )
{
if ( pActionList - > m_pNext = = NULL )
return 0 ;
CEventAction * pAction = pEntityOutput - > GetElement ( params [ 3 ] ) ;
if ( ! pAction )
return 0 ;
pActionList = pActionList - > m_pNext ;
}
size_t Length ;
pContext - > StringToLocalUTF8 ( params [ 4 ] , params [ 5 ] , pAction - > m_iParameter . ToCStr ( ) , & Length ) ;
int Len = strlen ( pActionList - > m_iTargetInput . ToCStr ( ) ) ;
return Length ;
}
pContext - > StringToLocal ( params [ 4 ] , Len + 1 , pActionList - > m_iTargetInput . ToCStr ( ) ) ;
cell_t GetOutputDelay ( IPluginContext * pContext , const cell_t * params )
{
char * pOutput ;
pContext - > LocalToString ( params [ 2 ] , & pOutput ) ;
CBaseEntity * pEntity = gamehelpers - > ReferenceToEntity ( gamehelpers - > IndexToReference ( params [ 1 ] ) ) ;
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
return Len ;
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return - 1 ;
CEventAction * pAction = pEntityOutput - > GetElement ( params [ 3 ] ) ;
if ( ! pAction )
return - 1 ;
return * ( cell_t * ) & pAction - > m_flDelay ;
}
cell_t GetOutputParameter ( IPluginContext * pContext , const cell_t * params )
cell_t GetOutputFormatted ( IPluginContext * pContext , const cell_t * params )
{
char * pOutput ;
pContext - > LocalToString ( params [ 2 ] , & pOutput ) ;
@ -220,26 +290,28 @@ cell_t GetOutputParameter(IPluginContext *pContext, const cell_t *params)
@@ -220,26 +290,28 @@ cell_t GetOutputParameter(IPluginContext *pContext, const cell_t *params)
CBaseEntity * pEntity = gamehelpers - > ReferenceToEntity ( gamehelpers - > IndexToReference ( params [ 1 ] ) ) ;
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return 0 ;
CEventAction * pActionList = pEntityOutput - > m_ActionList ;
for ( int i = 0 ; i < params [ 3 ] ; i + + )
{
if ( pActionList - > m_pNext = = NULL )
return 0 ;
pActionList = pActionList - > m_pNext ;
}
CEventAction * pAction = pEntityOutput - > GetElement ( params [ 3 ] ) ;
if ( ! pAction )
return 0 ;
int Len = strlen ( pActionList - > m_iParameter . ToCStr ( ) ) ;
char aBuffer [ 1024 ] ;
ke : : SafeSprintf ( aBuffer , sizeof ( aBuffer ) , " %s,%s,%s,%g,%d " ,
pAction - > m_iTarget . ToCStr ( ) ,
pAction - > m_iTargetInput . ToCStr ( ) ,
pAction - > m_iParameter . ToCStr ( ) ,
pAction - > m_flDelay ,
pAction - > m_nTimesToFire ) ;
pContext - > StringToLocal ( params [ 4 ] , Len + 1 , pActionList - > m_iParameter . ToCStr ( ) ) ;
size_t Length ;
pContext - > StringToLocalUTF8 ( params [ 4 ] , params [ 5 ] , aBuffer , & Length ) ;
return Len ;
return Length ;
}
cell_t GetOutputDelay ( IPluginContext * pContext , const cell_t * params )
cell_t FindOutput ( IPluginContext * pContext , const cell_t * params )
{
char * pOutput ;
pContext - > LocalToString ( params [ 2 ] , & pOutput ) ;
@ -247,19 +319,76 @@ cell_t GetOutputDelay(IPluginContext *pContext, const cell_t *params)
@@ -247,19 +319,76 @@ cell_t GetOutputDelay(IPluginContext *pContext, const cell_t *params)
CBaseEntity * pEntity = gamehelpers - > ReferenceToEntity ( gamehelpers - > IndexToReference ( params [ 1 ] ) ) ;
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return - 1 ;
CEventAction * pActionList = pEntityOutput - > m_ActionList ;
for ( int i = 0 ; i < params [ 3 ] ; i + + )
char * piTarget ;
pContext - > LocalToStringNULL ( params [ 4 ] , & piTarget ) ;
char * piTargetInput ;
pContext - > LocalToStringNULL ( params [ 5 ] , & piTargetInput ) ;
char * piParameter ;
pContext - > LocalToStringNULL ( params [ 6 ] , & piParameter ) ;
float flDelay = * ( float * ) & params [ 7 ] ;
cell_t nTimesToFire = params [ 8 ] ;
int StartCount = params [ 3 ] ;
int Count = 0 ;
for ( CEventAction * ev = pEntityOutput - > m_ActionList ; ev ! = NULL ; ev = ev - > m_pNext )
{
if ( pActionList - > m_pNext = = NULL )
return - 1 ;
Count + + ;
if ( StartCount > 0 )
{
StartCount - - ;
continue ;
}
if ( piTarget ! = NULL & & strcmp ( ev - > m_iTarget . ToCStr ( ) , piTarget ) ! = 0 )
continue ;
if ( piTargetInput ! = NULL & & strcmp ( ev - > m_iTargetInput . ToCStr ( ) , piTargetInput ) ! = 0 )
continue ;
if ( piParameter ! = NULL & & strcmp ( ev - > m_iParameter . ToCStr ( ) , piParameter ) ! = 0 )
continue ;
if ( flDelay > = 0 & & flDelay ! = ev - > m_flDelay )
continue ;
if ( nTimesToFire ! = 0 & & nTimesToFire ! = ev - > m_nTimesToFire )
continue ;
pActionList = pActionList - > m_pNext ;
return Count - 1 ;
}
return * ( cell_t * ) & pActionList - > m_flDelay ;
return - 1 ;
}
cell_t DeleteOutput ( IPluginContext * pContext , const cell_t * params )
{
char * pOutput ;
pContext - > LocalToString ( params [ 2 ] , & pOutput ) ;
CBaseEntity * pEntity = gamehelpers - > ReferenceToEntity ( gamehelpers - > IndexToReference ( params [ 1 ] ) ) ;
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return - 1 ;
return pEntityOutput - > DeleteElement ( params [ 3 ] ) ;
}
cell_t DeleteAllOutputs ( IPluginContext * pContext , const cell_t * params )
{
char * pOutput ;
pContext - > LocalToString ( params [ 2 ] , & pOutput ) ;
CBaseEntity * pEntity = gamehelpers - > ReferenceToEntity ( gamehelpers - > IndexToReference ( params [ 1 ] ) ) ;
CBaseEntityOutput * pEntityOutput = GetOutput ( pEntity , pOutput ) ;
if ( pEntityOutput = = NULL | | pEntityOutput - > m_ActionList = = NULL )
return - 1 ;
return pEntityOutput - > DeleteAllElements ( ) ;
}
@ -270,9 +399,39 @@ const sp_nativeinfo_t MyNatives[] =
@@ -270,9 +399,39 @@ const sp_nativeinfo_t MyNatives[] =
{ " GetOutputTargetInput " , GetOutputTargetInput } ,
{ " GetOutputParameter " , GetOutputParameter } ,
{ " GetOutputDelay " , GetOutputDelay } ,
{ " GetOutputFormatted " , GetOutputFormatted } ,
{ " FindOutput " , FindOutput } ,
{ " DeleteOutput " , DeleteOutput } ,
{ " DeleteAllOutputs " , DeleteAllOutputs } ,
{ NULL , NULL } ,
} ;
bool Outputinfo : : SDK_OnLoad ( char * error , size_t maxlen , bool late )
{
char conf_error [ 255 ] = " " ;
if ( ! gameconfs - > LoadGameConfigFile ( " outputinfo " , & g_pGameConf , conf_error , sizeof ( conf_error ) ) )
{
if ( conf_error [ 0 ] )
{
snprintf ( error , maxlen , " Could not read outputinfo.txt: %s \n " , conf_error ) ;
}
return false ;
}
if ( ! g_pGameConf - > GetMemSig ( " CEventAction__operator_delete " , ( void * * ) ( & CEventAction : : s_pOperatorDeleteFunc ) ) | | ! CEventAction : : s_pOperatorDeleteFunc )
{
snprintf ( error , maxlen , " Failed to find CEventAction__operator_delete function. \n " ) ;
return false ;
}
return true ;
}
void Outputinfo : : SDK_OnUnload ( )
{
gameconfs - > CloseGameConfigFile ( g_pGameConf ) ;
}
void Outputinfo : : SDK_OnAllLoaded ( )
{
sharesys - > AddNatives ( myself , MyNatives ) ;