166 lines
6.4 KiB
C#
166 lines
6.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Immutable;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Barotrauma.CharacterEditor;
|
|
using Barotrauma.LuaCs;
|
|
using Barotrauma.LuaCs.Data;
|
|
|
|
// ReSharper disable ObjectCreationAsStatement
|
|
|
|
namespace Barotrauma
|
|
{
|
|
partial class LuaCsSetup
|
|
{
|
|
private bool _isClientPromptActive;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <returns>Returns whether execution should continue.</returns>
|
|
public bool CheckReadyToRun()
|
|
{
|
|
// fast exit if enabled or unavailable.
|
|
if (this.IsCsEnabled)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
foreach (ContentPackage cp in PackageManagementService.GetLoadedAssemblyPackages())
|
|
{
|
|
if (cp.UgcId.TryUnwrap(out ContentPackageId id))
|
|
sb.AppendLine($"- {cp.Name} ({id})");
|
|
else
|
|
sb.AppendLine($"- {cp.Name} (Not On Workshop)");
|
|
}
|
|
|
|
if (GameMain.Client == null || GameMain.Client.IsServerOwner)
|
|
{
|
|
DisplayCsModsPromptServer(sb);
|
|
}
|
|
else if (!_isClientPromptActive)
|
|
{
|
|
_isClientPromptActive = true;
|
|
DisplayCsModsPromptClient(sb);
|
|
}
|
|
|
|
return false;
|
|
|
|
|
|
|
|
void DisplayCsModsPromptServer(StringBuilder sb)
|
|
{
|
|
new GUIMessageBox("", $"You have CSharp mods enabled but don't have the CSharp Scripting enabled, those mods might not work, go to the Main Menu, click on LuaCs Settings and check Enable CSharp Scripting.\n\n{sb}");
|
|
}
|
|
|
|
void DisplayCsModsPromptClient(StringBuilder sb)
|
|
{
|
|
GUIMessageBox msg = new GUIMessageBox(
|
|
"Confirm",
|
|
$"This server has the following CSharp mods installed: \n{sb}\nDo you wish to run them? Cs mods are not sandboxed so make sure you trust these mods.",
|
|
new LocalizedString[2] { "Run", "Don't Run" });
|
|
|
|
msg.Buttons[0].OnClicked = (GUIButton button, object obj) =>
|
|
{
|
|
try
|
|
{
|
|
this.IsCsEnabled = true;
|
|
this._isClientPromptActive = false;
|
|
|
|
CoroutineManager.Invoke(() =>
|
|
{
|
|
SetRunState(RunState.LoadedNoExec);
|
|
SetRunState(RunState.Running);
|
|
}, 0f);
|
|
return true;
|
|
}
|
|
finally
|
|
{
|
|
msg.Close();
|
|
}
|
|
};
|
|
|
|
msg.Buttons[1].OnClicked = (GUIButton button, object obj) =>
|
|
{
|
|
try
|
|
{
|
|
// avoid a TOCTOU scenario.
|
|
this.IsCsEnabled = false;
|
|
this._isClientPromptActive = false;
|
|
return true;
|
|
}
|
|
finally
|
|
{
|
|
msg.Close();
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
private void SetupServicesProviderClient(IServicesProvider serviceProvider)
|
|
{
|
|
serviceProvider.RegisterServiceType<IUIStylesService, UIStylesService>(ServiceLifetime.Singleton);
|
|
// supplied via factory
|
|
//serviceProvider.RegisterServiceType<IUIStylesCollection, UIStylesCollection>(ServiceLifetime.Transient);
|
|
serviceProvider.RegisterServiceType<IParserServiceAsync<ResourceParserInfo, IStylesResourceInfo>, ModConfigFileParserService>(ServiceLifetime.Transient);
|
|
serviceProvider.RegisterServiceType<IUIStylesCollection.IFactory, UIStylesCollection.Factory>(ServiceLifetime.Transient);
|
|
serviceProvider.RegisterServiceType<ISettingsMenuSystem, SettingsMenuSystem>(ServiceLifetime.Singleton);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles changes in game states tracked by screen changes.
|
|
/// </summary>
|
|
/// <param name="screen">The new game screen.</param>
|
|
public partial void OnScreenSelected(Screen screen)
|
|
{
|
|
/*Note: This logic needs to be run after the triggering event so that recursion scenarios (ie. resetting the EventService)
|
|
do not occur, so we delay it by one game tick.*/
|
|
CoroutineManager.Invoke(() =>
|
|
{
|
|
switch (screen)
|
|
{
|
|
// menus and navigation states
|
|
case MainMenuScreen:
|
|
case ModDownloadScreen:
|
|
case ServerListScreen:
|
|
SetRunState(RunState.Unloaded);
|
|
SetRunState(RunState.LoadedNoExec);
|
|
break;
|
|
// running lobby or editor states
|
|
case CampaignEndScreen:
|
|
case CharacterEditorScreen:
|
|
case EventEditorScreen:
|
|
case GameScreen:
|
|
case LevelEditorScreen:
|
|
case NetLobbyScreen:
|
|
case ParticleEditorScreen:
|
|
case RoundSummaryScreen:
|
|
case SpriteEditorScreen:
|
|
case SubEditorScreen:
|
|
case TestScreen: // notes: TestScreen is a Linux edge case editor screen and is deprecated.
|
|
if (!CheckReadyToRun())
|
|
{
|
|
if (CurrentRunState >= RunState.Running)
|
|
{
|
|
SetRunState(RunState.LoadedNoExec);
|
|
}
|
|
return;
|
|
}
|
|
|
|
SetRunState(RunState.Running);
|
|
break;
|
|
default:
|
|
Logger.LogError(
|
|
$"{nameof(LuaCsSetup)}: Received an unknown screen {screen?.GetType().Name ?? "'null screen'"}. Retarding load state to 'unloaded'.");
|
|
SetRunState(RunState.Unloaded);
|
|
break;
|
|
}
|
|
}, delay: 0f); // min is one tick delay.
|
|
}
|
|
}
|
|
}
|