Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Singleplayer Cinematic v1.0.0
SPCinematic.dll
Decompiled 7 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("Omniscye")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("SPCinematic")] [assembly: AssemblyTitle("SPCinematic")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Empress.REPO.OfflineCommands { [BepInPlugin("empress.repo.offlinecommands", "REPO Offline Commands", "1.1.0")] public class OfflineCommandsPlugin : BaseUnityPlugin { public const string PluginGuid = "empress.repo.offlinecommands"; public const string PluginName = "REPO Offline Commands"; public const string PluginVersion = "1.1.0"; internal static ManualLogSource Log; internal static ConfigEntry<KeyCode> ToggleKeyPrimary; internal static ConfigEntry<KeyCode> ToggleKeySecondary; internal static ConfigEntry<bool> UseChatKeyT; internal static ConfigEntry<bool> PrefillSlashOnOpen; internal static ConfigEntry<bool> AllowInMultiplayer; internal static ConfigEntry<bool> SubmitCloses; internal static ConfigEntry<bool> ForceChatInSingleplayer; private Harmony _harmony; private void Awake() { //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Expected O, but got Unknown //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; ToggleKeyPrimary = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ToggleKeyPrimary", (KeyCode)96, "Primary key to open/close the offline command bar."); ToggleKeySecondary = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ToggleKeySecondary", (KeyCode)289, "Secondary key to open/close the bar (fallback)."); UseChatKeyT = ((BaseUnityPlugin)this).Config.Bind<bool>("Controls", "UseChatKeyT", true, "Open the bar when the game’s Chat key (InputKey.Chat, default: T) is pressed in singleplayer."); PrefillSlashOnOpen = ((BaseUnityPlugin)this).Config.Bind<bool>("Controls", "PrefillSlashOnOpen", true, "When opening via Chat key or '/' key, prefill the input with '/'."); AllowInMultiplayer = ((BaseUnityPlugin)this).Config.Bind<bool>("Safety", "AllowInMultiplayer", false, "If true, the overlay is allowed in multiplayer. Leave this OFF."); SubmitCloses = ((BaseUnityPlugin)this).Config.Bind<bool>("UX", "SubmitCloses", true, "Close the bar after submitting a command."); ForceChatInSingleplayer = ((BaseUnityPlugin)this).Config.Bind<bool>("Patches", "ForceChatInSingleplayer", true, "Let the Multiplayer chat system run in Singleplayer by spoofing IsMultiplayer() calls originating from ChatManager only."); _harmony = new Harmony("empress.repo.offlinecommands"); _harmony.PatchAll(); GameObject val = new GameObject("__OfflineCommandConsole__"); val.AddComponent<OfflineCommandConsole>(); Object.DontDestroyOnLoad((Object)(object)val); Log.LogInfo((object)string.Format("{0} {1} loaded. Keys: Primary={2}, Secondary={3}, UseChatKeyT={4}, ForceChatInSingleplayer={5}", "REPO Offline Commands", "1.1.0", ToggleKeyPrimary.Value, ToggleKeySecondary.Value, UseChatKeyT.Value, ForceChatInSingleplayer.Value)); } private void OnDestroy() { try { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } catch { } } } public class OfflineCommandConsole : MonoBehaviour { private bool _open; private string _input = string.Empty; private readonly List<string> _history = new List<string>(); private int _histIndex = -1; private float _blockedToastUntil; private const int BoxHeight = 36; private const int BoxWidth = 720; private const int Margin = 12; private const int Padding = 8; private void Update() { //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) if (IsMainMenu()) { _open = false; return; } bool flag = IsMultiplayer(); if (!(!_open && !OfflineCommandsPlugin.AllowInMultiplayer.Value && flag)) { if (OfflineCommandsPlugin.UseChatKeyT.Value) { try { if (SemiFunc.InputDown((InputKey)7) && !_open) { _open = true; _histIndex = -1; if (OfflineCommandsPlugin.PrefillSlashOnOpen.Value) { _input = (string.IsNullOrEmpty(_input) ? "/" : _input); } TrySoftDisablePlayerInput(); UnlockCursor(); } } catch { } } if (Input.GetKeyDown(OfflineCommandsPlugin.ToggleKeyPrimary.Value) || Input.GetKeyDown(OfflineCommandsPlugin.ToggleKeySecondary.Value)) { ToggleOpen(); } if ((Input.GetKeyDown((KeyCode)47) || Input.GetKeyDown((KeyCode)267)) && !_open) { _open = true; _histIndex = -1; _input = (OfflineCommandsPlugin.PrefillSlashOnOpen.Value ? "/" : string.Empty); TrySoftDisablePlayerInput(); UnlockCursor(); } } if (_open) { TrySoftDisablePlayerInput(); } } private void ToggleOpen() { _open = !_open; if (_open) { _histIndex = -1; if (OfflineCommandsPlugin.PrefillSlashOnOpen.Value && string.IsNullOrEmpty(_input)) { _input = "/"; } TrySoftDisablePlayerInput(); UnlockCursor(); } else { LockCursorIfNeeded(); } } private void OnGUI() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Invalid comparison between Unknown and I4 //IL_0307: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Invalid comparison between Unknown and I4 //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Invalid comparison between Unknown and I4 //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Invalid comparison between Unknown and I4 //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Invalid comparison between Unknown and I4 //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Invalid comparison between Unknown and I4 if (Time.unscaledTime < _blockedToastUntil) { Rect val = default(Rect); ((Rect)(ref val))..ctor(12f, 12f, 520f, 26f); GUI.Box(val, GUIContent.none); GUI.Label(new Rect(((Rect)(ref val)).x + 8f, ((Rect)(ref val)).y + 4f, ((Rect)(ref val)).width - 16f, ((Rect)(ref val)).height - 8f), "OfflineCommands disabled in multiplayer. Enable it in config if you really want to."); } if (!_open) { return; } int num = 720; int num2 = 36; float num3 = (float)(Screen.width - num) / 2f; int num4 = Screen.height - num2 - 12; Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(num3, (float)num4, (float)num, (float)num2); GUI.Box(val2, GUIContent.none); Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(num3 + 8f, (float)num4 + 4f, (float)(num - 16), (float)(num2 - 8)); GUI.SetNextControlName("OfflineCmdField"); _input = GUI.TextField(val3, _input ?? string.Empty, 256); GUI.FocusControl("OfflineCmdField"); Event current = Event.current; if ((int)current.type == 4) { if ((int)current.keyCode == 13 || (int)current.keyCode == 271) { Submit(_input); if (OfflineCommandsPlugin.SubmitCloses.Value) { _open = false; LockCursorIfNeeded(); } _input = string.Empty; current.Use(); } else if ((int)current.keyCode == 27) { _open = false; LockCursorIfNeeded(); current.Use(); } else if ((int)current.keyCode == 273) { if (_history.Count > 0) { _histIndex = ((_histIndex < 0) ? (_history.Count - 1) : Mathf.Max(0, _histIndex - 1)); _input = _history[_histIndex]; current.Use(); } } else if ((int)current.keyCode == 274 && _history.Count > 0) { _histIndex = Mathf.Min(_history.Count, _histIndex + 1); _input = ((_histIndex >= 0 && _histIndex < _history.Count) ? _history[_histIndex] : string.Empty); current.Use(); } } string text = "T to open (Chat key) — Commands: /greenscreen, /cinematic, /hud on|off|toggle"; Rect val4 = default(Rect); ((Rect)(ref val4))..ctor(num3 + 8f, (float)(num4 - 20), (float)(num - 16), 18f); GUI.Label(val4, text); } private void Submit(string raw) { string text = (raw ?? string.Empty).Trim(); if (string.IsNullOrEmpty(text)) { return; } _history.Add(text); _histIndex = -1; try { if (text.Equals("/hud", StringComparison.OrdinalIgnoreCase) || text.Equals("/hud toggle", StringComparison.OrdinalIgnoreCase)) { ToggleHud(); } else if (text.Equals("/hud on", StringComparison.OrdinalIgnoreCase)) { ShowHud(on: true); } else if (text.Equals("/hud off", StringComparison.OrdinalIgnoreCase)) { ShowHud(on: false); } else if (text.Equals("/greenscreen on", StringComparison.OrdinalIgnoreCase)) { if ((Object)(object)VideoGreenScreen.instance == (Object)null) { SemiFunc.Command("/greenscreen"); } } else if (text.Equals("/greenscreen off", StringComparison.OrdinalIgnoreCase)) { if ((Object)(object)VideoGreenScreen.instance != (Object)null) { SemiFunc.Command("/greenscreen"); } } else { SemiFunc.Command(text); } } catch (Exception arg) { OfflineCommandsPlugin.Log.LogError((object)$"Command error: {arg}"); } } private static bool IsMultiplayer() { try { return SemiFunc.IsMultiplayer(); } catch { return false; } } private static bool IsMainMenu() { try { return SemiFunc.IsMainMenu(); } catch { return false; } } private static void TrySoftDisablePlayerInput() { try { SemiFunc.InputDisableMovement(); } catch { } try { SemiFunc.InputDisableAiming(); } catch { } } private static void ToggleHud() { HUD instance = HUD.instance; if (!((Object)(object)instance == (Object)null)) { if (instance.hidden) { instance.Show(); } else { instance.Hide(); } } } private static void ShowHud(bool on) { HUD instance = HUD.instance; if (!((Object)(object)instance == (Object)null)) { if (on) { instance.Show(); } else { instance.Hide(); } } } private static void UnlockCursor() { try { Cursor.visible = true; Cursor.lockState = (CursorLockMode)0; } catch { } } private static void LockCursorIfNeeded() { try { Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } catch { } } } [HarmonyPatch(typeof(SemiFunc), "IsMultiplayer")] internal static class Patch_IsMultiplayer_ForChatOnly { private static bool Prefix(ref bool __result) { if (!OfflineCommandsPlugin.ForceChatInSingleplayer.Value) { return true; } try { if ((Object)(object)GameManager.instance != (Object)null && GameManager.instance.gameMode == 1) { return true; } StackTrace stackTrace = new StackTrace(); for (int i = 1; i < Math.Min(12, stackTrace.FrameCount); i++) { MethodBase methodBase = stackTrace.GetFrame(i)?.GetMethod(); if (methodBase?.DeclaringType != null && methodBase.DeclaringType.FullName == "ChatManager") { __result = true; return false; } } } catch { } return true; } } } namespace SPCinematic { [BepInPlugin("Omniscye.SPCinematic", "SPCinematic", "1.0")] public class SPCinematic : BaseUnityPlugin { internal static SPCinematic Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void Update() { } } }