fix initialization issues

This commit is contained in:
zznty
2023-07-01 19:57:18 +07:00
parent 1396c8b1da
commit 343420f1d8
5 changed files with 52 additions and 20 deletions

View File

@@ -14,6 +14,9 @@ namespace Torch.API.Managers
/// <summary>
/// Fired when plugins are loaded.
/// </summary>
/// <remarks>
/// Fired when plugins are loaded and immediately if subscribed after the plugins are loaded.
/// </remarks>
event Action<IReadOnlyCollection<ITorchPlugin>> PluginsLoaded;
/// <summary>

View File

@@ -58,7 +58,9 @@ namespace Torch.Server
AddManager(new EntityControlManager(this));
AddManager(new RemoteAPIManager(this));
var sessionManager = Managers.GetManager<ITorchSessionManager>();
sessionManager.AddFactory(_ => new MultiplayerManagerDedicated(this));
sessionManager.SessionStateChanged += OnSessionStateChanged;
// Needs to be done at some point after MyVRageWindows.Init
// where the debug listeners are registered
@@ -128,10 +130,6 @@ namespace Torch.Server
{
Log.Info("Initializing server");
base.Init();
var sessionManager = Managers.GetManager<ITorchSessionManager>();
sessionManager.AddFactory(x => new MultiplayerManagerDedicated(this));
sessionManager.SessionStateChanged += OnSessionStateChanged;
GetManager<InstanceManager>().LoadInstance(InstancePath);
CanRun = true;
Initialized?.Invoke(this);

View File

@@ -52,8 +52,40 @@ namespace Torch.Managers
/// <inheritdoc />
public IReadOnlyDictionary<Guid, ITorchPlugin> Plugins => _plugins.AsReadOnlyObservable();
public event Action<IReadOnlyCollection<ITorchPlugin>> PluginsLoaded;
private Action<IReadOnlyCollection<ITorchPlugin>> _pluginsLoaded;
private bool _loaded;
public event Action<IReadOnlyCollection<ITorchPlugin>> PluginsLoaded
{
add
{
var action = _pluginsLoaded;
Action<IReadOnlyCollection<ITorchPlugin>> action2;
do
{
action2 = action;
var action3 = (Action<IReadOnlyCollection<ITorchPlugin>>)Delegate.Combine(action2, value);
action = Interlocked.CompareExchange(ref _pluginsLoaded, action3, action2);
}
while (action != action2);
if (_loaded)
value(_plugins.Values.AsReadOnly());
}
remove
{
var action = _pluginsLoaded;
Action<IReadOnlyCollection<ITorchPlugin>> action2;
do
{
action2 = action;
var action3 = (Action<IReadOnlyCollection<ITorchPlugin>>)Delegate.Remove(action2, value);
action = Interlocked.CompareExchange(ref _pluginsLoaded, action3, action2);
}
while (action != action2);
}
}
public PluginManager(ITorchBase torchInstance) : base(torchInstance)
{
if (!Directory.Exists(PluginDir))
@@ -145,7 +177,8 @@ namespace Torch.Managers
plugin.Init(Torch);
}
_log.Info($"Loaded {_plugins.Count} plugins.");
PluginsLoaded?.Invoke(_plugins.Values.AsReadOnly());
_loaded = true;
_pluginsLoaded?.Invoke(_plugins.Values.AsReadOnly());
return;
}
@@ -220,7 +253,8 @@ namespace Torch.Managers
plugin.Init(Torch);
}
_log.Info($"Loaded {_plugins.Count} plugins.");
PluginsLoaded?.Invoke(_plugins.Values.AsReadOnly());
_loaded = true;
_pluginsLoaded?.Invoke(_plugins.Values.AsReadOnly());
}
//debug flag is set when the user asks us to run with a specific plugin for plugin development debug

View File

@@ -49,8 +49,6 @@ namespace Torch.Session
public TorchSessionManager(ITorchBase torchInstance) : base(torchInstance)
{
_overrideMods = new Dictionary<ulong, MyObjectBuilder_Checkpoint.ModItem>();
if (Torch.Config.UgcServiceType == UGCServiceType.Steam)
_overrideMods.Add(ModCommunication.MOD_ID, ModItemUtils.Create(ModCommunication.MOD_ID));
}
/// <inheritdoc/>
@@ -193,6 +191,8 @@ namespace Torch.Session
MySession.AfterLoading += SessionLoaded;
MySession.OnUnloading += SessionUnloading;
MySession.OnUnloaded += SessionUnloaded;
if (Torch.Config.UgcServiceType == UGCServiceType.Steam)
_overrideMods.Add(ModCommunication.MOD_ID, ModItemUtils.Create(ModCommunication.MOD_ID));
}

View File

@@ -116,6 +116,12 @@ namespace Torch
Plugins = new PluginManager(this);
#pragma warning restore CS0618
var sessionManager = new TorchSessionManager(this);
sessionManager.AddFactory(_ => Sync.IsServer ? new ChatManagerServer(this) : new ChatManagerClient(this));
sessionManager.AddFactory(_ => Sync.IsServer ? new CommandManager(this) : null);
sessionManager.AddFactory(_ => new EntityManager(this));
Managers.AddManager(sessionManager);
Managers.AddManager(new PatchManager(this));
Managers.AddManager(new FilesystemManager(this));
Managers.AddManager(new UpdateManager(this));
@@ -283,15 +289,6 @@ namespace Torch
Game = new VRageGame(this, TweakGameSettings, SteamAppName, SteamAppId, InstancePath, RunArgs);
if (!Game.WaitFor(VRageGame.GameState.Stopped))
Log.Warn("Failed to wait for game to be initialized");
var sessionManager = new TorchSessionManager(this);
sessionManager.AddFactory((x) => Sync.IsServer ? new ChatManagerServer(this) : new ChatManagerClient(this));
sessionManager.AddFactory((x) => Sync.IsServer ? new CommandManager(this) : null);
sessionManager.AddFactory((x) => new EntityManager(this));
Managers.AddManager(sessionManager);
Managers.Attach();
_init = true;