nuclide/Source/gs-entbase/server/multi_manager.cpp

71 lines
1.9 KiB
C++

/***
*
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
*
* See the file LICENSE attached with the sources for usage details.
*
****/
class CMultiManager : CBaseTrigger
{
string m_strBuffer;
int m_iBusy;
virtual void() Trigger;
};
void CMultiManager :: Trigger ( void )
{
static void mm_enttrigger ( void ) {
spawnfunc_CBaseTrigger();
CBaseTrigger wow = (CBaseTrigger) self;
wow.m_strTarget = wow.netname;
entity eFind = find( world, CBaseTrigger::m_strTargetName, self.netname );
//dprint( sprintf( "CMultiManager: %s (%s)\n", wow.m_strTarget, eFind.classname ) );
CBaseTrigger::UseTargets();
remove( wow );
}
int iFields = tokenizebyseparator( m_strBuffer, " " );
for ( int i = 0; i < iFields; i+=2 ) {
// HACK: Avoid infinite loops
if ( m_strTargetName != argv( i ) ) {
entity eTemp = spawn();
eTemp.netname = argv( i );
eTemp.think = mm_enttrigger;
eTemp.nextthink = time + stof( argv( i + 1 ) );
}
}
}
void CMultiManager :: CMultiManager ( void )
{
m_strBuffer = "";
int iFields = tokenize( __fullspawndata );
for ( int i = 1; i < ( iFields - 1 ); i += 2 ) {
// Sigh, let's attempt to sanitize this
switch ( argv( i ) ) {
case "{":
case "}":
case "classname":
case "origin":
case "targetname":
case "spawnflags":
continue;
break;
default:
if ( substring( argv( i ), strlen( argv( i ) ) - 3, 1 ) == "#" ) {
m_strBuffer = sprintf( "%s%s %s ", m_strBuffer, substring( argv( i ), 0, strlen( argv( i ) ) - 3 ), argv( i + 1 ) );
} else if ( substring( argv( i ), strlen( argv( i ) ) - 2, 1 ) == "#" ) {
m_strBuffer = sprintf( "%s%s %s ", m_strBuffer, substring( argv( i ), 0, strlen( argv( i ) ) - 2 ), argv( i + 1 ) );
} else {
m_strBuffer = sprintf( "%s%s %s ", m_strBuffer, argv( i ), argv( i + 1 ) );
}
}
}
CBaseTrigger::CBaseTrigger();
}
CLASSEXPORT( multi_manager, CMultiManager )