multi_manager: Adopt 16-trigger limit and the MULTITHREADED spawnflag. This will prevent overflows on maps such as doublecross.
This commit is contained in:
parent
e21d6e94e5
commit
29ebe5775e
1 changed files with 46 additions and 22 deletions
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue