瀏覽代碼

Merge pull request #932 from Azaezel/alpha402/LevelLoadInjection

adds a mechanism to inject additional steps into mission loading
Brian Roberts 2 年之前
父節點
當前提交
ad78f8686c

+ 69 - 0
Templates/BaseGame/game/core/clientServer/Core_ClientServer.tscript

@@ -12,6 +12,70 @@
 // When a local game is started - a listen server - via calling StartGame() a server is created and then the client is
 // connected to it via createAndConnectToLocalServer().
 
+function Core_ClientServer::clearLoadStatus()
+{
+   Core_ClientServer.moduleLoadedDone = 0;
+   Core_ClientServer.moduleLoadedFailed = 0;
+}
+function Core_ClientServer::onLoadMap(%this)
+{
+    %this.finishMapLoad();
+}
+
+function Core_ClientServer::finishMapLoad(%this)
+{
+    Core_ClientServer.GetEventManager().postEvent( "mapLoadComplete" );
+}
+
+function Core_ClientServer::FailMapLoad(%this, %moduleName, %isFine)
+{    
+    Core_ClientServer.failedModuleName = %moduleName;
+    Core_ClientServer.GetEventManager().postEvent( "mapLoadFail", %isFine );
+}
+
+function Core_ClientServerListener::onMapLoadComplete(%this)
+{
+    Core_ClientServer.moduleLoadedDone++;
+    %numModsNeedingLoaded = 0;
+    %modulesList = ModuleDatabase.findModules();
+    for(%i=0; %i < getWordCount(%modulesList); %i++)
+    {
+        %module = getWord(%modulesList, %i);
+        if (%module.ModuleId.isMethod("finishMapLoad"))
+            %numModsNeedingLoaded++;
+    }
+    if (Core_ClientServer.moduleLoadedDone == %numModsNeedingLoaded)
+    {
+        loadMissionStage3();  
+    }
+}
+
+function Core_ClientServerListener::onmapLoadFail(%this, %isFine)
+{   
+    if (%isFine) 
+    {
+        %this.onMapLoadComplete();
+        return;
+    }
+    
+    Core_ClientServer.moduleLoadedFailed++;
+    if (Core_ClientServer.moduleLoadedFailed>1) return; // yeah, we know
+        
+    $Server::LoadFailMsg = Core_ClientServer.failedModuleName @" failed to load mission specific data!";
+    error($Server::LoadFailMsg);
+    // Inform clients that are already connected
+    
+    for (%clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++)
+    {
+        %cl = ClientGroup.getObject( %clientIndex );
+        %cl.onConnectionDropped($Server::LoadFailMsg);
+        %cl.endMission();
+        %cl.resetGhosting();
+        %cl.clearPaths();
+    }
+    destroyServer();
+}
+
 function Core_ClientServer::onCreate( %this )
 {
    echo("\n--------- Initializing Directory: scripts ---------");
@@ -33,6 +97,11 @@ function Core_ClientServer::onCreate( %this )
    {
       initClient();
    }
+   %this.GetEventManager().registerEvent("mapLoadComplete");
+   %this.GetEventManager().registerEvent("mapLoadFail");
+   %this.listener = new ScriptMsgListener() {class = Core_ClientServerListener;}; 
+   %this.GetEventManager().subscribe( %this.listener, "mapLoadComplete" ); 
+   %this.GetEventManager().subscribe( %this.listener, "mapLoadFail" ); 
 }
 
 function Core_ClientServer::onDestroy( %this )

+ 8 - 1
Templates/BaseGame/game/core/clientServer/scripts/server/levelLoad.tscript

@@ -126,7 +126,14 @@ function loadMissionStage2()
    // Set mission name.
    if( isObject( theLevelInfo ) )
       $Server::MissionName = theLevelInfo.levelName;
+   Core_ClientServer.clearLoadStatus();
+   callOnModules("onLoadMap");
 
+}
+
+function loadMissionStage3() 
+{
+   echo("*** Stage 3 load");
    
    %hasGameMode = callGamemodeFunction("onCreateGame");
    
@@ -143,8 +150,8 @@ function loadMissionStage2()
 
    // Go ahead and launch the game
    %hasGameMode = callGamemodeFunction("onMissionStart");
+   
 }
-
 function endMission()
 {
    if (!isObject( getScene(0) ))

+ 7 - 0
Templates/BaseGame/game/core/utility/scripts/module.tscript

@@ -317,3 +317,10 @@ function SimSet::unQueueExec(%scopeSet, %execFilePath)
       %execFileList.echo();
 }
 
+function SimSet::GetEventManager(%this)
+{
+   if( !isObject( %this.eventManager ) )
+      %this.eventManager = new EventManager() { queue = "ModuleEventManager"; };
+      
+   return %this.eventManager;
+}