mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-13 15:44:36 +00:00
Merge pull request #1548 from Azaezel/alpha41/eventManagerSafeties
reformulation of subscriber message consumer
This commit is contained in:
commit
d7d64fdd9f
2 changed files with 26 additions and 19 deletions
|
|
@ -79,24 +79,26 @@ bool EventManagerListener::onMessageReceived( StringTableEntry queue, const char
|
||||||
if( subscribers == NULL )
|
if( subscribers == NULL )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for( Vector<Subscriber>::iterator iter = subscribers->begin(); iter != subscribers->end(); iter++ )
|
for (U32 i = 0; i < subscribers->size(); i++)
|
||||||
{
|
{
|
||||||
if( iter->listener == NULL )
|
Subscriber* itter = &((*subscribers)[i]);
|
||||||
|
if (itter->listener == NULL)
|
||||||
{
|
{
|
||||||
subscribers->erase_fast( iter -- );
|
(*subscribers).erase(i);
|
||||||
continue;
|
}
|
||||||
|
else if (!itter->removeFlag)
|
||||||
|
{
|
||||||
|
itter->callDepth++;
|
||||||
|
Con::executef(itter->listener, itter->callback, data);
|
||||||
|
itter->callDepth--;
|
||||||
|
if (itter->removeFlag && itter->callDepth == 0)
|
||||||
|
{
|
||||||
|
(*subscribers).erase(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!iter->removeFlag)
|
if (subscribers->size() == 0)
|
||||||
{
|
return true;
|
||||||
iter->callDepth++;
|
|
||||||
Con::executef( iter->listener, iter->callback, data );
|
|
||||||
iter->callDepth--;
|
|
||||||
if (iter->removeFlag && iter->callDepth==0)
|
|
||||||
{
|
|
||||||
subscribers->erase_fast(iter--);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -136,8 +136,6 @@ function GameConnectionListener::onSetSpawnObjectTypeComplete( %this, %client )
|
||||||
return; //continue to wait
|
return; //continue to wait
|
||||||
%client.GetEventManager().remove( %client.listener, "setSpawnObjectTypeComplete" );
|
%client.GetEventManager().remove( %client.listener, "setSpawnObjectTypeComplete" );
|
||||||
%client.GetEventManager().remove( %client.listener, "setSpawnObjectTypeFailed" );
|
%client.GetEventManager().remove( %client.listener, "setSpawnObjectTypeFailed" );
|
||||||
%client.GetEventManager().subscribe( %client.listener, "setSpawnPointComplete" );
|
|
||||||
%client.GetEventManager().subscribe( %client.listener, "setSpawnPointFailed" );
|
|
||||||
|
|
||||||
if (isObject(%client.player))
|
if (isObject(%client.player))
|
||||||
{
|
{
|
||||||
|
|
@ -177,7 +175,11 @@ function GameConnection::setSpawnPoint( %this )
|
||||||
%this.numModsNeedingLoaded = getNumCanCallOnObjectList("setSpawnPoint", %modulesIDList);
|
%this.numModsNeedingLoaded = getNumCanCallOnObjectList("setSpawnPoint", %modulesIDList);
|
||||||
|
|
||||||
if (%this.numModsNeedingLoaded)
|
if (%this.numModsNeedingLoaded)
|
||||||
callOnObjectList("setSpawnPoint", %modulesIdList, %this);
|
{
|
||||||
|
%this.GetEventManager().subscribe( %this.listener, "setSpawnPointComplete" );
|
||||||
|
%this.GetEventManager().subscribe( %this.listener, "setSpawnPointFailed" );
|
||||||
|
callOnObjectList("setSpawnPoint", %modulesIdList, %this);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
%this.listener.onSetSpawnPointComplete(%this);
|
%this.listener.onSetSpawnPointComplete(%this);
|
||||||
}
|
}
|
||||||
|
|
@ -189,8 +191,7 @@ function GameConnectionListener::onSetSpawnPointComplete( %this, %client )
|
||||||
return; //continue to wait
|
return; //continue to wait
|
||||||
|
|
||||||
%client.GetEventManager().remove( %client.listener, "setSpawnPointComplete" );
|
%client.GetEventManager().remove( %client.listener, "setSpawnPointComplete" );
|
||||||
%client.GetEventManager().remove( %client.listener, "setSpawnPointFailed" );
|
%client.GetEventManager().remove( %client.listener, "setSpawnPointFailed" );
|
||||||
%client.GetEventManager().subscribe( %client.listener, "postSpawnComplete" );
|
|
||||||
|
|
||||||
%client.spawnProperties = "position =\""@ getWords(%client.spawnLocation,0,2) @"\";" @ %client.spawnProperties;
|
%client.spawnProperties = "position =\""@ getWords(%client.spawnLocation,0,2) @"\";" @ %client.spawnProperties;
|
||||||
|
|
||||||
|
|
@ -280,9 +281,13 @@ function GameConnection::onPostSpawn( %this )
|
||||||
%this.numModsNeedingLoaded = getNumCanCallOnObjectList("onPostSpawn", %modulesIDList);
|
%this.numModsNeedingLoaded = getNumCanCallOnObjectList("onPostSpawn", %modulesIDList);
|
||||||
|
|
||||||
if (%this.numModsNeedingLoaded)
|
if (%this.numModsNeedingLoaded)
|
||||||
|
{
|
||||||
|
%this.GetEventManager().subscribe( %this.listener, "postSpawnComplete" );
|
||||||
callOnObjectList("onPostSpawn", %modulesIdList, %this);
|
callOnObjectList("onPostSpawn", %modulesIdList, %this);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
%this.listener.onPostSpawnComplete(%this);
|
%this.listener.onPostSpawnComplete(%this);
|
||||||
|
|
||||||
if (isObject(%this.player.getDatablock().controlMap))
|
if (isObject(%this.player.getDatablock().controlMap))
|
||||||
commandToClient(%this, 'setMoveMap', %this.player.getDatablock().controlMap);
|
commandToClient(%this, 'setMoveMap', %this.player.getDatablock().controlMap);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue