multi_manager: Adopt 16-trigger limit and the MULTITHREADED spawnflag. This will prevent overflows on maps such as doublecross.

This commit is contained in:
Marco Cawthorne 2019-03-01 17:14:33 +01:00
parent e21d6e94e5
commit 29ebe5775e

View file

@ -6,46 +6,66 @@
*
****/
#define MM_MULTITHREADED 1
class multi_manager : CBaseTrigger
{
CBaseTrigger m_eTriggers[16];
string m_strBuffer;
int m_iBusy;
virtual void() Trigger;
};
void multi_manager :: Trigger ( void )
void multi_manager :: Trigger (void)
{
static void mm_enttrigger ( void ) {
spawnfunc_CBaseTrigger();
static void mm_enttrigger (void) {
CBaseTrigger wow = (CBaseTrigger) self;
wow.m_strTarget = wow.netname;
entity eFind = find( world, CBaseTrigger::m_strTargetName, self.netname );
//dprint( sprintf( "multi_manager: %s (%s)\n", wow.m_strTarget, eFind.classname ) );
entity eFind = find(world, CBaseTrigger::m_strTargetName, self.netname);
#ifdef GS_DEVELOPER
print(sprintf("multi_manager: %s (%s)\n", wow.m_strTarget, eFind.classname));
#endif
CBaseTrigger::UseTargets();
remove( wow );
}
/* If not multi-threaded, we have to watch out 'til all triggers are done. */
if (!(spawnflags & MM_MULTITHREADED)) {
for (int i = 0; i < 16; i++) {
if (m_eTriggers[i].nextthink > time) {
return;
}
}
}
int iFields = tokenizebyseparator( m_strBuffer, " " );
for ( int i = 0; i < iFields; i+=2 ) {
int iFields = tokenizebyseparator(m_strBuffer, " ");
int b = 0;
for (int i = 0; i < iFields; i+=2) {
if (b >= 16) {
break;
}
// HACK: Avoid infinite loops
if ( m_strTargetName != argv( i ) ) {
entity eTemp = spawn();
eTemp.netname = argv( i );
if (m_strTargetName != argv(i)) {
entity eTemp = m_eTriggers[b];
eTemp.netname = argv(i);
eTemp.think = mm_enttrigger;
eTemp.nextthink = time + stof( argv( i + 1 ) );
eTemp.nextthink = time + stof(argv(i + 1));
b++;
}
}
}
void multi_manager :: multi_manager ( void )
void multi_manager :: multi_manager (void)
{
m_strBuffer = "";
int iFields = tokenize( __fullspawndata );
for ( int i = 1; i < ( iFields - 1 ); i += 2 ) {
int iFields = tokenize(__fullspawndata);
for (int i = 1; i < (iFields - 1); i += 2) {
// Sigh, let's attempt to sanitize this
switch ( argv( i ) ) {
switch (argv(i)) {
case "{":
case "}":
case "classname":
@ -55,15 +75,19 @@ void multi_manager :: multi_manager ( void )
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 ) );
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 ) );
m_strBuffer = sprintf("%s%s %s ", m_strBuffer, argv(i), argv(i + 1));
}
}
}
for (int b = 0; b < 16; b++) {
m_eTriggers[b] = spawn(CBaseTrigger);
}
CBaseTrigger::CBaseTrigger();
}