Started mod unloading/loading
This commit is contained in:
@@ -1,12 +1,17 @@
|
|||||||
using System;
|
using Sandbox.Definitions;
|
||||||
|
using Sandbox.Engine.Networking;
|
||||||
|
using Sandbox.Game.World;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using VRage.Game;
|
||||||
|
|
||||||
namespace SeamlessClientPlugin.SeamlessTransfer
|
namespace SeamlessClientPlugin.SeamlessTransfer
|
||||||
{
|
{
|
||||||
public class ModLoader
|
public static class ModLoader
|
||||||
{
|
{
|
||||||
/* Mod loader should download and load missing mods for target server, and unload ones that arent needed
|
/* Mod loader should download and load missing mods for target server, and unload ones that arent needed
|
||||||
*
|
*
|
||||||
@@ -22,5 +27,80 @@ namespace SeamlessClientPlugin.SeamlessTransfer
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//Mods that are currently loaded in this instance.
|
||||||
|
private static List<MyObjectBuilder_Checkpoint.ModItem> CurrentLoadedMods = new List<MyObjectBuilder_Checkpoint.ModItem>();
|
||||||
|
|
||||||
|
//Mods that we are switching to.
|
||||||
|
private static List<MyObjectBuilder_Checkpoint.ModItem> TargetServerMods = new List<MyObjectBuilder_Checkpoint.ModItem>();
|
||||||
|
|
||||||
|
|
||||||
|
private static bool FinishedDownloadingMods = false;
|
||||||
|
private static bool DownloadSuccess = false;
|
||||||
|
|
||||||
|
private static DateTime DownloadTimeout;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void DownloadNewMods(List<MyObjectBuilder_Checkpoint.ModItem> Target)
|
||||||
|
{
|
||||||
|
CurrentLoadedMods = MySession.Static.Mods;
|
||||||
|
TargetServerMods = Target;
|
||||||
|
|
||||||
|
|
||||||
|
DownloadTimeout = DateTime.Now + TimeSpan.FromMinutes(5);
|
||||||
|
SeamlessClient.TryShow("Downloading New Mods");
|
||||||
|
MyWorkshop.DownloadModsAsync(Target, ModDownloadingFinished);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ModDownloadingFinished(bool Success)
|
||||||
|
{
|
||||||
|
if (Success)
|
||||||
|
{
|
||||||
|
SeamlessClient.TryShow("Mod Downloading Finished!");
|
||||||
|
FinishedDownloadingMods = true;
|
||||||
|
DownloadSuccess = true;
|
||||||
|
//May need to wait seamless loading if mods have yet to finish downloading
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DownloadSuccess = false;
|
||||||
|
FinishedDownloadingMods = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ReadyModSwitch()
|
||||||
|
{
|
||||||
|
|
||||||
|
while (!FinishedDownloadingMods)
|
||||||
|
{
|
||||||
|
|
||||||
|
//Break out of loop
|
||||||
|
if (DownloadTimeout < DateTime.Now)
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
Thread.Sleep(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
FinishedDownloadingMods = false;
|
||||||
|
|
||||||
|
//Skip mod switch
|
||||||
|
if (!DownloadSuccess)
|
||||||
|
return;
|
||||||
|
|
||||||
|
MySession.Static.ScriptManager.LoadData();
|
||||||
|
MyDefinitionManager.Static.LoadData(TargetServerMods);
|
||||||
|
MyLocalCache.PreloadLocalInventoryConfig();
|
||||||
|
SeamlessClient.TryShow("Finished transfering!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -40,6 +40,8 @@ namespace SeamlessClientPlugin.SeamlessTransfer
|
|||||||
|
|
||||||
SeamlessClient.TryShow("Beginning Redirect to server: " + Transfer.TargetServerID);
|
SeamlessClient.TryShow("Beginning Redirect to server: " + Transfer.TargetServerID);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SwitchServers Switcher = new SwitchServers(E, Request.DeserializeWorldData());
|
SwitchServers Switcher = new SwitchServers(E, Request.DeserializeWorldData());
|
||||||
Switcher.BeginSwitch();
|
Switcher.BeginSwitch();
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using Sandbox;
|
using Sandbox;
|
||||||
|
using Sandbox.Definitions;
|
||||||
using Sandbox.Engine.Multiplayer;
|
using Sandbox.Engine.Multiplayer;
|
||||||
using Sandbox.Engine.Networking;
|
using Sandbox.Engine.Networking;
|
||||||
using Sandbox.Game;
|
using Sandbox.Game;
|
||||||
@@ -27,6 +28,7 @@ using VRage.Steam;
|
|||||||
using VRage.Utils;
|
using VRage.Utils;
|
||||||
using VRageMath;
|
using VRageMath;
|
||||||
using VRageRender;
|
using VRageRender;
|
||||||
|
using VRageRender.Messages;
|
||||||
|
|
||||||
namespace SeamlessClientPlugin.SeamlessTransfer
|
namespace SeamlessClientPlugin.SeamlessTransfer
|
||||||
{
|
{
|
||||||
@@ -42,6 +44,8 @@ namespace SeamlessClientPlugin.SeamlessTransfer
|
|||||||
{
|
{
|
||||||
this.TargetServer = TargetServer;
|
this.TargetServer = TargetServer;
|
||||||
this.TargetWorld = TargetWorld;
|
this.TargetWorld = TargetWorld;
|
||||||
|
|
||||||
|
ModLoader.DownloadNewMods(TargetWorld.Checkpoint.Mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -115,11 +119,31 @@ namespace SeamlessClientPlugin.SeamlessTransfer
|
|||||||
|
|
||||||
MyHud.Chat.RegisterChat(MyMultiplayer.Static);
|
MyHud.Chat.RegisterChat(MyMultiplayer.Static);
|
||||||
|
|
||||||
MyMultiplayer.Static.OnSessionReady();
|
|
||||||
|
|
||||||
LoadConnectedClients();
|
LoadConnectedClients();
|
||||||
LoadOnlinePlayers();
|
LoadOnlinePlayers();
|
||||||
SetWorldSettings();
|
SetWorldSettings();
|
||||||
|
|
||||||
|
|
||||||
|
ModLoader.ReadyModSwitch();
|
||||||
|
MySector.InitEnvironmentSettings(TargetWorld.Sector.Environment);
|
||||||
|
|
||||||
|
|
||||||
|
MyModAPIHelper.Initialize();
|
||||||
|
string text = ((!string.IsNullOrEmpty(TargetWorld.Checkpoint.CustomSkybox)) ? TargetWorld.Checkpoint.CustomSkybox : MySector.EnvironmentDefinition.EnvironmentTexture);
|
||||||
|
MyRenderProxy.PreloadTextures(new string[1] { text }, TextureType.CubeMap);
|
||||||
|
MySession.Static.LoadDataComponents();
|
||||||
|
MySession.Static.LoadObjectBuildersComponents(TargetWorld.Checkpoint.SessionComponents);
|
||||||
|
|
||||||
|
|
||||||
|
MethodInfo A = typeof(MySession).GetMethod("LoadGameDefinition", BindingFlags.Instance | BindingFlags.NonPublic);
|
||||||
|
A.Invoke(MySession.Static, new object[] { TargetWorld.Checkpoint });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MyMultiplayer.Static.OnSessionReady();
|
||||||
|
|
||||||
RemoveOldEntities();
|
RemoveOldEntities();
|
||||||
UpdateWorldGenerator();
|
UpdateWorldGenerator();
|
||||||
|
|
||||||
@@ -127,7 +151,7 @@ namespace SeamlessClientPlugin.SeamlessTransfer
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
MyModAPIHelper.Initialize();
|
|
||||||
// Allow the game to start proccessing incoming messages in the buffer
|
// Allow the game to start proccessing incoming messages in the buffer
|
||||||
MyMultiplayer.Static.StartProcessingClientMessages();
|
MyMultiplayer.Static.StartProcessingClientMessages();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user