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 VoiceShipControl v1.0.5
BepInEx/plugins/VoiceShipControl/VoiceShipControl.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using LethalConfig; using LethalSettings.UI; using LethalSettings.UI.Components; using Microsoft.CodeAnalysis; using Newtonsoft.Json.Linq; using Unity.Netcode; using UnityEngine; using VoiceShipControl; using VoiceShipControl.Helpers; using VoiceShipControl.Patches; using VoiceShipControl.Shared; [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: AssemblyCompany("VoiceShipControl")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+79825b0a2903cd4702a9c251865e1764677eaf9c")] [assembly: AssemblyProduct("VoiceShipControl")] [assembly: AssemblyTitle("VoiceShipControl")] [assembly: AssemblyVersion("1.0.0.0")] 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; } } } public delegate void MessageReceivedEvent(string message, EventArgs e); public delegate void ErrorReceivedEvent(string error, EventArgs e); public class SocketListener : MonoBehaviour { public static SocketListener Instance; private static Socket _socket; private static Socket _handler; private static IPEndPoint remoteEndPoint; public static int connectionPort = 5050; public static bool IsServerStarted = false; public static bool IsWaitingMessage = false; public static bool IsConnectionStarted = false; public static TaskScheduler mainThreadContext; public static event MessageReceivedEvent OnMessageReceivedEvent; public static event ErrorReceivedEvent OnErrorReceivedEvent; public static void InitSocketListener(bool visible = false, string name = "SocketListener") { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown if ((Object)(object)Instance != (Object)null) { return; } if (Application.isPlaying) { GameObject val = new GameObject(); if (!visible) { ((Object)val).hideFlags = (HideFlags)61; } Instance = val.AddComponent<SocketListener>(); Debug.Log((object)"SocketListener object created"); StartServer(); } mainThreadContext = TaskScheduler.FromCurrentSynchronizationContext(); } public static void StartServer() { IPAddress iPAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, connectionPort); _socket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _socket.Bind(iPEndPoint); Console.WriteLine($"Server listening on {iPEndPoint}"); _socket.Listen(10); Console.WriteLine("Waiting for a connection..."); } public void Update() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) if (!IsServerStarted) { if (!IsConnectionStarted && _socket != null) { IsConnectionStarted = true; Console.WriteLine("Connecting..."); ((MonoBehaviour)Instance).StartCoroutine(Connect()); } return; } KeyCode value = PluginConstants.VoiceActivationButton.Value; int mouseButton = KeyBindingHelper.GetMouseButton(value); if (Recognizer.IsProcessStarted && (UnityInput.Current.GetKeyDown(value) || UnityInput.Current.GetMouseButtonDown(mouseButton)) && !IsWaitingMessage) { Console.WriteLine("Broadcasting started"); ((MonoBehaviour)Instance).StartCoroutine(Broadcasting()); } } public static IEnumerator Connect() { yield return (object)new WaitForSeconds(0.5f); try { Console.WriteLine("Trying to connect"); _handler = _socket.Accept(); if (_handler != null) { IsServerStarted = true; Console.WriteLine("Socket listener started"); remoteEndPoint = (IPEndPoint)_handler.RemoteEndPoint; Console.WriteLine($"Accepted connection from {remoteEndPoint}"); } } catch (Exception e) { Console.WriteLine(e.ToString()); } } public static IEnumerator Broadcasting() { IsWaitingMessage = true; yield return (object)new WaitForSeconds(0f); SendData("continue"); Thread receiveDataThread = new Thread(OnReceiveData); receiveDataThread.Start(); } private static void OnReceiveData() { Task.Run(delegate { byte[] buffer = new byte[1024]; int bytesReceived = _handler.Receive(buffer); Task.Factory.StartNew(delegate { if (bytesReceived > 0) { string @string = Encoding.UTF8.GetString(buffer, 0, bytesReceived); if (@string.Contains("Error")) { Instance.ErrorRecivedEventTrigger(@string); } else { Instance.MessageRecivedEventTrigger(@string); } } IsWaitingMessage = false; }, CancellationToken.None, TaskCreationOptions.None, mainThreadContext); }); } public static void SendData(string data) { if (_handler == null) { Debug.Log((object)"Socket server not started SendData failed"); return; } try { byte[] bytes = Encoding.ASCII.GetBytes(data.ToString()); _handler.Send(bytes); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } protected virtual void MessageRecivedEventTrigger(string value) { SocketListener.OnMessageReceivedEvent?.Invoke(value, EventArgs.Empty); } protected virtual void ErrorRecivedEventTrigger(string value) { ErrorReceivedEvent onErrorReceivedEvent = SocketListener.OnErrorReceivedEvent; Debug.Log((object)value); onErrorReceivedEvent?.Invoke(value, EventArgs.Empty); } public static void StopSocketListener() { SendData("stop"); _socket = (_handler = null); IsServerStarted = (IsWaitingMessage = (IsConnectionStarted = false)); } private void OnDestroy() { Delegate[] invocationList = SocketListener.OnMessageReceivedEvent.GetInvocationList(); foreach (Delegate @delegate in invocationList) { OnMessageReceivedEvent -= (MessageReceivedEvent)@delegate; } Delegate[] invocationList2 = SocketListener.OnErrorReceivedEvent.GetInvocationList(); foreach (Delegate delegate2 in invocationList2) { OnErrorReceivedEvent -= (ErrorReceivedEvent)delegate2; } Debug.Log((object)"Destriy SocketListener"); StopSocketListener(); } private void OnApplicationQuit() { StopSocketListener(); Object.Destroy((Object)(object)this); } } namespace VoiceShipControl { public enum SupportedLanguages { Afrikaans, Albanian, Amharic, Arabic, Armenian, Azerbaijani, Basque, Belarusian, Bengali, Bosnian, Bulgarian, Catalan, ChineseCantonese, ChineseMandarinSimplified, ChineseMandarinTraditional, Croatian, Czech, Danish, Dutch, English, Estonian, Filipino, Finnish, French, Galician, Georgian, German, Greek, Gujarati, Hebrew, Hindi, Hungarian, Icelandic, Indonesian, Italian, Japanese, Javanese, Kannada, Kazakh, Khmer, Korean, Kurdish, Kyrgyz, Lao, Latvian, Lithuanian, Luxembourgish, Macedonian, Malay, Malayalam, Marathi, Mongolian, Nepali, Norwegian, Oriya, Pashto, Persian, Polish, PortugueseBrazil, PortuguesePortugal, Punjabi, Romanian, Russian, Serbian, Sinhala, Slovak, Slovenian, Somali, Spanish, Sundanese, Swahili, Swedish, Tamil, Telugu, Thai, Turkish, Ukrainian, Urdu, Uzbek, Vietnamese, Welsh, Xhosa, Yiddish, Yoruba, Zulu } public static class PluginConstants { public static ConfigEntry<bool> IsUserCanUseCommandsOutsideTheShip; public static ConfigEntry<bool> IsUserCanUseCommandsWhenDead; public static ConfigEntry<bool> IsUserCanUseTeleportAlways; public static ConfigEntry<KeyCode> VoiceActivationButton; public static ConfigEntry<SupportedLanguages> LanguageCode; public static string PathToFolder = ((BaseUnityPlugin)VoiceShipControl.Instance).Info.Location.TrimEnd("VoiceShipControl.dll".ToCharArray()); public static ConfigEntry<string> BuyKeyPhrase; public static ConfigEntry<string> TransmitKeyPhrase; public static ConfigEntry<string> RerouteKeyPhrase; public const string BuyVoiceCommandsKey = "buy-voice-commands"; public static Dictionary<string, ConfigEntry<string>> BuyVoiceCommands = new Dictionary<string, ConfigEntry<string>>(); public const string BuyVoiceCountCommandsKey = "buy-voice-count-commands"; public static Dictionary<string, ConfigEntry<string>> BuyVoiceCountCommands = new Dictionary<string, ConfigEntry<string>>(); public const string TerminalVoiceCommandsKey = "terminal-voice-commands"; public static Dictionary<string, ConfigEntry<string>> TerminalVoiceCommands = new Dictionary<string, ConfigEntry<string>>(); public const string VoiceCommandsKey = "voice-commands"; public static Dictionary<string, ConfigEntry<string>> VoiceCommands = new Dictionary<string, ConfigEntry<string>>(); public const string ReroutePlanetComandsKey = "reroute-planet-commands"; public static Dictionary<string, ConfigEntry<string>> ReroutePlanetComands = new Dictionary<string, ConfigEntry<string>>(); public const string VoicePlayAudioAssetsKey = "voice-assets"; public static Dictionary<string, ConfigEntry<string>> VoicePlayAudioAssetNames = new Dictionary<string, ConfigEntry<string>>(); public const string StartOfRoundAudioAssetNameKey = "start-game-voice-assets"; public static ConfigEntry<string> StartOfRoundAudioAssetName; public const string EndOfRoundAudioAssetNameKey = "end-game-voice-assets"; public static ConfigEntry<string> EndOfRoundAudioAssetName; public const string BuySuccessAudioAssetNameKey = "buy-success-voice-assets"; public static ConfigEntry<string> BuySuccessAudioAssetName; public const string BuyDeclinedAudioAssetNameKey = "buy-declined-voice-assets"; public static ConfigEntry<string> BuyDeclinedAudioAssetName; public const string ShipIntroAudioAssetNameKey = "ship-intro-assets"; public static ConfigEntry<string> ShipIntroAudioAssetName; public const string StartGameKey = "start-game"; public static ConfigEntry<string> StartGame; public const string EndGameKey = "end-game"; public static ConfigEntry<string> EndGame; public const string CloseDoorKey = "close-door"; public static ConfigEntry<string> CloseDoor; public const string OpenDoorKey = "open-door"; public static ConfigEntry<string> OpenDoor; public const string SwitchOnKey = "switch-on"; public static ConfigEntry<string> SwitchOn; public const string SwitchOffKey = "switch-off"; public static ConfigEntry<string> SwitchOff; public const string TeleporterKey = "teleporter"; public static ConfigEntry<string> Teleporter; public const string InverseTeleporterKey = "inverse-teleporter"; public static ConfigEntry<string> InverseTeleporter; public const string SwitchMonitorKey = "switch-monitor"; public static ConfigEntry<string> SwitchMonitor; public const string ToggleMonitorKey = "toggle-monitor"; public static ConfigEntry<string> ToggleMonitor; public static readonly Dictionary<SupportedLanguages, string> LanguageDictionary = new Dictionary<SupportedLanguages, string> { { SupportedLanguages.Afrikaans, "af-ZA" }, { SupportedLanguages.Albanian, "sq-AL" }, { SupportedLanguages.Amharic, "am-ET" }, { SupportedLanguages.Arabic, "ar-SA" }, { SupportedLanguages.Armenian, "hy-AM" }, { SupportedLanguages.Azerbaijani, "az-AZ" }, { SupportedLanguages.Basque, "eu-ES" }, { SupportedLanguages.Belarusian, "be-BY" }, { SupportedLanguages.Bengali, "bn-IN" }, { SupportedLanguages.Bosnian, "bs-BA" }, { SupportedLanguages.Bulgarian, "bg-BG" }, { SupportedLanguages.Catalan, "ca-ES" }, { SupportedLanguages.ChineseCantonese, "yue-Hant-HK" }, { SupportedLanguages.ChineseMandarinSimplified, "zh-CN" }, { SupportedLanguages.ChineseMandarinTraditional, "zh-TW" }, { SupportedLanguages.Croatian, "hr-HR" }, { SupportedLanguages.Czech, "cs-CZ" }, { SupportedLanguages.Danish, "da-DK" }, { SupportedLanguages.Dutch, "nl-NL" }, { SupportedLanguages.English, "en-US" }, { SupportedLanguages.Estonian, "et-EE" }, { SupportedLanguages.Filipino, "fil-PH" }, { SupportedLanguages.Finnish, "fi-FI" }, { SupportedLanguages.French, "fr-FR" }, { SupportedLanguages.Galician, "gl-ES" }, { SupportedLanguages.Georgian, "ka-GE" }, { SupportedLanguages.German, "de-DE" }, { SupportedLanguages.Greek, "el-GR" }, { SupportedLanguages.Gujarati, "gu-IN" }, { SupportedLanguages.Hebrew, "he-IL" }, { SupportedLanguages.Hindi, "hi-IN" }, { SupportedLanguages.Hungarian, "hu-HU" }, { SupportedLanguages.Icelandic, "is-IS" }, { SupportedLanguages.Indonesian, "id-ID" }, { SupportedLanguages.Italian, "it-IT" }, { SupportedLanguages.Japanese, "ja-JP" }, { SupportedLanguages.Javanese, "jv-ID" }, { SupportedLanguages.Kannada, "kn-IN" }, { SupportedLanguages.Kazakh, "kk-KZ" }, { SupportedLanguages.Khmer, "km-KH" }, { SupportedLanguages.Korean, "ko-KR" }, { SupportedLanguages.Kurdish, "ku-IQ" }, { SupportedLanguages.Kyrgyz, "ky-KG" }, { SupportedLanguages.Lao, "lo-LA" }, { SupportedLanguages.Latvian, "lv-LV" }, { SupportedLanguages.Lithuanian, "lt-LT" }, { SupportedLanguages.Luxembourgish, "lb-LU" }, { SupportedLanguages.Macedonian, "mk-MK" }, { SupportedLanguages.Malay, "ms-MY" }, { SupportedLanguages.Malayalam, "ml-IN" }, { SupportedLanguages.Marathi, "mr-IN" }, { SupportedLanguages.Mongolian, "mn-MN" }, { SupportedLanguages.Nepali, "ne-NP" }, { SupportedLanguages.Norwegian, "nb-NO" }, { SupportedLanguages.Oriya, "or-IN" }, { SupportedLanguages.Pashto, "ps-AF" }, { SupportedLanguages.Persian, "fa-IR" }, { SupportedLanguages.Polish, "pl-PL" }, { SupportedLanguages.PortugueseBrazil, "pt-BR" }, { SupportedLanguages.PortuguesePortugal, "pt-PT" }, { SupportedLanguages.Punjabi, "pa-IN" }, { SupportedLanguages.Romanian, "ro-RO" }, { SupportedLanguages.Russian, "ru-RU" }, { SupportedLanguages.Serbian, "sr-RS" }, { SupportedLanguages.Sinhala, "si-LK" }, { SupportedLanguages.Slovak, "sk-SK" }, { SupportedLanguages.Slovenian, "sl-SI" }, { SupportedLanguages.Somali, "so-SO" }, { SupportedLanguages.Spanish, "es-ES" }, { SupportedLanguages.Sundanese, "su-ID" }, { SupportedLanguages.Swahili, "sw-TZ" }, { SupportedLanguages.Swedish, "sv-SE" }, { SupportedLanguages.Tamil, "ta-IN" }, { SupportedLanguages.Telugu, "te-IN" }, { SupportedLanguages.Thai, "th-TH" }, { SupportedLanguages.Turkish, "tr-TR" }, { SupportedLanguages.Ukrainian, "uk-UA" }, { SupportedLanguages.Urdu, "ur-PK" }, { SupportedLanguages.Uzbek, "uz-UZ" }, { SupportedLanguages.Vietnamese, "vi-VN" }, { SupportedLanguages.Welsh, "cy-GB" }, { SupportedLanguages.Xhosa, "xh-ZA" }, { SupportedLanguages.Yiddish, "yi-DE" }, { SupportedLanguages.Yoruba, "yo-NG" }, { SupportedLanguages.Zulu, "zu-ZA" } }; } [BepInPlugin("Judik.VoiceShipControl", "Voice Ship Control", "1.0.4")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class VoiceShipControl : BaseUnityPlugin { private const string _modGUID = "Judik.VoiceShipControl"; private const string _modName = "Voice Ship Control"; private const string _modVersion = "1.0.4"; private readonly Harmony harmony = new Harmony("Judik.VoiceShipControl"); public static VoiceShipControl Instance; internal ManualLogSource _logger; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; ConfigureVoiceShipControlSettings(); _logger = Logger.CreateLogSource("Judik.VoiceShipControl"); _logger.LogInfo((object)"Judik.VoiceShipControl has started"); harmony.PatchAll(typeof(StartOfRoundPatch)); AddSettingsMenu(); } } public void AddSettingsMenu() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected O, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Expected O, but got Unknown //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Expected O, but got Unknown //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Expected O, but got Unknown //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Expected O, but got Unknown //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Expected O, but got Unknown //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Expected O, but got Unknown //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Expected O, but got Unknown //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Expected O, but got Unknown //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Expected O, but got Unknown //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Expected O, but got Unknown InputComponent terminalKeyInput = new InputComponent { Placeholder = "Terminal command (try use exist commands)" }; InputComponent terminalValueInput = new InputComponent { Placeholder = "Command key phrase" }; InputComponent voicePhraseValueInput = new InputComponent { Placeholder = "Command key phrase" }; InputComponent voicePhraseAssetValueInput = new InputComponent { Placeholder = "Asset name" }; ModSettingsConfig val = new ModSettingsConfig(); val.Name = "Voice Ship Controll"; val.Id = "Judik.VoiceShipControl"; val.Version = "1.0.4"; val.Description = "Here you can add your own key phrases with assets what should be played like an 'answer' to your in game 'assistant'. " + Environment.NewLine + "1. After any of 'Add' buttons click key phrase will be added to Lethal Config Settings, but not displayed untill game restart." + Environment.NewLine + "2. All key phrases can have multiple meaning. That's mean you can add more than 1 audio asset or phrase connected to same command. To separate it type '|' beetwen phrases/assets." + Environment.NewLine + "3. All key phrases stored in VoiceShipControl.json file. That's mean you can modify them directly there without this menu." + Environment.NewLine + "4. All assets what you can connect stored in VoiceShipControl/Assets folder." + Environment.NewLine + "5. For now there is no logic to remove commands, so if you want to do it go to VoiceShipControl.json and just remove raw with that command what you want."; MenuComponent[] obj = new MenuComponent[9] { (MenuComponent)new LabelComponent { Text = "Add terminal key phrases.", FontSize = 14f }, default(MenuComponent), default(MenuComponent), default(MenuComponent), default(MenuComponent), default(MenuComponent), default(MenuComponent), default(MenuComponent), default(MenuComponent) }; HorizontalComponent val2 = new HorizontalComponent(); val2.Children = (MenuComponent[])(object)new MenuComponent[2] { (MenuComponent)terminalKeyInput, (MenuComponent)terminalValueInput }; obj[1] = (MenuComponent)val2; obj[2] = (MenuComponent)new ButtonComponent { Text = "Add", OnClick = delegate { JsonHelper.SetKeyValuePair(terminalKeyInput.Value, "terminal-voice-commands", terminalValueInput.Value); terminalValueInput.Value = string.Empty; terminalKeyInput.Value = string.Empty; PluginConstants.TerminalVoiceCommands.Add(terminalKeyInput.Value, ((BaseUnityPlugin)this).Config.Bind<string>("Terminal voice commands", terminalKeyInput.Value, terminalValueInput.Value, "Key phrase what you need to say to make some action via terminal. You can separate text with '|' to add multiple options")); } }; obj[3] = (MenuComponent)new LabelComponent { Text = "Add custom voice commands.", FontSize = 14f }; val2 = new HorizontalComponent(); val2.Children = (MenuComponent[])(object)new MenuComponent[2] { (MenuComponent)new LabelComponent { Text = "Custom voice Key phrase: " + (PluginConstants.VoiceCommands.Count + 1), FontSize = 12f }, (MenuComponent)terminalValueInput }; obj[4] = (MenuComponent)val2; obj[5] = (MenuComponent)new ButtonComponent { Text = "Add", OnClick = delegate { JsonHelper.SetKeyValuePair("Custom voice Key phrase: " + PluginConstants.VoiceCommands.Count, "voice-commands", voicePhraseValueInput.Value); voicePhraseValueInput.Value = string.Empty; PluginConstants.VoiceCommands.Add("Custom Asset Key phrase: " + PluginConstants.VoiceCommands.Count, ((BaseUnityPlugin)this).Config.Bind<string>("Any voice commands", "Custom voice Key phrase: " + (PluginConstants.VoiceCommands.Count + 1), voicePhraseValueInput.Value, "Any Key phrase by which one will be played audio asset. You can separate text with '|' to add multiple options")); } }; obj[6] = (MenuComponent)new LabelComponent { Text = "Add custom voice asset.", FontSize = 14f }; val2 = new HorizontalComponent(); val2.Children = (MenuComponent[])(object)new MenuComponent[2] { (MenuComponent)new LabelComponent { Text = "Custom voice asset for Key phrase: " + (PluginConstants.VoiceCommands.Count + 1), FontSize = 12f }, (MenuComponent)terminalValueInput }; obj[7] = (MenuComponent)val2; obj[8] = (MenuComponent)new ButtonComponent { Text = "Add", OnClick = delegate { JsonHelper.SetKeyValuePair("Custom voice asset for Key phrase: " + PluginConstants.VoicePlayAudioAssetNames.Count, "voice-commands", voicePhraseAssetValueInput.Value); voicePhraseValueInput.Value = string.Empty; PluginConstants.VoicePlayAudioAssetNames.Add("Custom Asset Key phrase: " + PluginConstants.VoicePlayAudioAssetNames.Count, ((BaseUnityPlugin)this).Config.Bind<string>("Played by voice audio assets", "Custom voice asset for Key phrase: " + (PluginConstants.VoicePlayAudioAssetNames.Count + 1), voicePhraseAssetValueInput.Value, "Any audio asset what will play by 'Any voice command'. You can separate text with '|' to add multiple options")); } }; val.MenuComponents = (MenuComponent[])(object)obj; ModMenu.RegisterMod(val); } public void ConfigureVoiceShipControlSettings() { LethalConfigManager.SetModDescription("Enjoy my friends <3"); PluginConstants.LanguageCode = ((BaseUnityPlugin)this).Config.Bind<SupportedLanguages>("General", "Language Code", SupportedLanguages.English, "Voice recognizer language code"); PluginConstants.VoiceActivationButton = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "Voice Command Activation Button", (KeyCode)327, "Voice command activation button"); PluginConstants.IsUserCanUseCommandsOutsideTheShip = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Is user can use commands outside the ship?", false, "If user can use commands outside the ship then x if not empty"); PluginConstants.IsUserCanUseCommandsWhenDead = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Is user can use commands when dead?", false, "If user can use commands outside the ship then x if not empty"); PluginConstants.IsUserCanUseTeleportAlways = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Is user can use teleport always?", false, "If user can use teleport without cooldown"); PluginConstants.BuyKeyPhrase = ((BaseUnityPlugin)this).Config.Bind<string>("Main key phrases", "Buy Key Phrase", "buy|need|waiting", "Key phrase what you need to say to make related purchase. You can separate text with '|' to add multiple options"); PluginConstants.RerouteKeyPhrase = ((BaseUnityPlugin)this).Config.Bind<string>("Main key phrases", "Reroute Key Phrase", "route|go to|next planet", "Key phrase what you need to say to make rerouting to other planet. You can separate text with '|' to add multiple options"); PluginConstants.TransmitKeyPhrase = ((BaseUnityPlugin)this).Config.Bind<string>("Main key phrases", "Transmit Key Phrase", "transmit|send|all", "Key phrase what you need to say to make message transmiting with 'Message transmitter'. You can separate text with '|' to add multiple options"); string value = JsonHelper.GetValue("start-game"); PluginConstants.StartGame = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Start game", value, "Start game command. You can separate text with '|' to add multiple options"); string value2 = JsonHelper.GetValue("end-game"); PluginConstants.EndGame = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "End game", value2, "End game command. You can separate text with '|' to add multiple options"); string value3 = JsonHelper.GetValue("open-door"); PluginConstants.OpenDoor = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Open ship door", value3, "Open ship door command. You can separate text with '|' to add multiple options"); string value4 = JsonHelper.GetValue("close-door"); PluginConstants.CloseDoor = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Close ship door", value4, "Close ship door command. You can separate text with '|' to add multiple options"); string value5 = JsonHelper.GetValue("switch-on"); PluginConstants.SwitchOn = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Turn ON ship light", value5, "Turn ON ship light command. You can separate text with '|' to add multiple options"); string value6 = JsonHelper.GetValue("switch-off"); PluginConstants.SwitchOff = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Turn OFF ship light", value6, "Turn OFF ship light command. You can separate text with '|' to add multiple options"); string value7 = JsonHelper.GetValue("teleporter"); PluginConstants.Teleporter = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Start teleporter", value7, "Start ship teleporter command. You can separate text with '|' to add multiple options"); string value8 = JsonHelper.GetValue("inverse-teleporter"); PluginConstants.InverseTeleporter = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Start inverse teleporter", value8, "Start inverse teleporter command. You can separate text with '|' to add multiple options"); string value9 = JsonHelper.GetValue("switch-monitor"); PluginConstants.SwitchMonitor = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Switch monitor view", value9, "Switch monitor view command. You can separate text with '|' to add multiple options"); string value10 = JsonHelper.GetValue("toggle-monitor"); PluginConstants.ToggleMonitor = ((BaseUnityPlugin)this).Config.Bind<string>("Static commands", "Toggle monitor", value10, "Toggle monitor command. You can separate text with '|' to add multiple options"); string value11 = JsonHelper.GetValue("ship-intro-assets"); PluginConstants.ShipIntroAudioAssetName = ((BaseUnityPlugin)this).Config.Bind<string>("Static assets", "Ship intro audio asset name", value11, "Any audio asset what will play instead default audio on ship from speacker. You can separate text with '|' to add multiple options"); string value12 = JsonHelper.GetValue("buy-success-voice-assets"); PluginConstants.BuySuccessAudioAssetName = ((BaseUnityPlugin)this).Config.Bind<string>("Static assets", "Buy SUCCESS audio asset name", value12, "Any audio asset what will play if purchase was SUCCESS. You can separate text with '|' to add multiple options"); string value13 = JsonHelper.GetValue("buy-declined-voice-assets"); PluginConstants.BuyDeclinedAudioAssetName = ((BaseUnityPlugin)this).Config.Bind<string>("Static assets", "Buy DICLINED audio asset name", value13, "Any audio asset what will play if purchase was DICLINED. You can separate text with '|' to add multiple options"); string value14 = JsonHelper.GetValue("start-game-voice-assets"); PluginConstants.StartOfRoundAudioAssetName = ((BaseUnityPlugin)this).Config.Bind<string>("Static assets", "Start of round audio asset name", value14, "Any audio asset what will play when round is started. You can separate text with '|' to add multiple options"); string value15 = JsonHelper.GetValue("end-game-voice-assets"); PluginConstants.EndOfRoundAudioAssetName = ((BaseUnityPlugin)this).Config.Bind<string>("Static assets", "End of round audio asset name", value15, "Any audio asset what will play when round is ended. You can separate text with '|' to add multiple options"); Dictionary<string, string> keyValuePairs = JsonHelper.GetKeyValuePairs("reroute-planet-commands"); foreach (KeyValuePair<string, string> item in keyValuePairs) { PluginConstants.ReroutePlanetComands.Add(item.Key, ((BaseUnityPlugin)this).Config.Bind<string>("Reroute key Phrases", item.Key, item.Value, "Key phrase what you need to say with 'Reroute Key Phrase' to land on other planet. You can separate text with '|' to add multiple options")); } Dictionary<string, string> keyValuePairs2 = JsonHelper.GetKeyValuePairs("buy-voice-commands"); foreach (KeyValuePair<string, string> item2 in keyValuePairs2) { PluginConstants.BuyVoiceCommands.Add(item2.Key, ((BaseUnityPlugin)this).Config.Bind<string>("Buy key Phrases", item2.Key, item2.Value, "Key phrase what you need to say with 'Buy Key Phrase' to buy this item. You can separate text with '|' to add multiple options")); } Dictionary<string, string> keyValuePairs3 = JsonHelper.GetKeyValuePairs("buy-voice-count-commands"); foreach (KeyValuePair<string, string> item3 in keyValuePairs3) { PluginConstants.BuyVoiceCountCommands.Add(item3.Key, ((BaseUnityPlugin)this).Config.Bind<string>("Buy count key Phrases", item3.Key, item3.Value, "Key phrase what you need to say with 'Buy Key Phrase' to buy related count of items. You can separate text with '|' to add multiple options")); } Dictionary<string, string> keyValuePairs4 = JsonHelper.GetKeyValuePairs("terminal-voice-commands"); foreach (KeyValuePair<string, string> item4 in keyValuePairs4) { PluginConstants.TerminalVoiceCommands.Add(item4.Key, ((BaseUnityPlugin)this).Config.Bind<string>("Terminal voice commands", item4.Key, item4.Value, "Key phrase what you need to say to make some action via terminal. You can separate text with '|' to add multiple options")); } Dictionary<string, string> keyValuePairs5 = JsonHelper.GetKeyValuePairs("voice-commands"); for (int i = 0; i < keyValuePairs5.Count; i++) { PluginConstants.VoiceCommands.Add("Custom Asset Key phrase: " + i, ((BaseUnityPlugin)this).Config.Bind<string>("Any voice commands", "Custom voice Key phrase: " + (i + 1), keyValuePairs5.Values.ElementAt(i), "Any Key phrase by which one will be played audio asset. You can separate text with '|' to add multiple options")); } Dictionary<string, string> keyValuePairs6 = JsonHelper.GetKeyValuePairs("voice-assets"); for (int j = 0; j < keyValuePairs6.Count; j++) { PluginConstants.VoicePlayAudioAssetNames.Add("Custom Asset Key phrase: " + j, ((BaseUnityPlugin)this).Config.Bind<string>("Audio assets played by voice command", "Custom voice asset for Key phrase: " + (j + 1), keyValuePairs6.Values.ElementAt(j), "Any audio asset what will play by 'Any voice command'. You can separate text with '|' to add multiple options")); } } } } namespace VoiceShipControl.Shared { public static class FileHelper { public static string GetFilePath(string fileName) { string[] files = Directory.GetFiles(PluginConstants.PathToFolder, fileName, SearchOption.AllDirectories); if (files.Length != 0) { return files[0]; } Console.WriteLine("File '" + fileName + "' not found in '" + PluginConstants.PathToFolder + "' or its subdirectories."); return string.Empty; } } public class KeyBindingHelper { public static int GetMouseButton(KeyCode code) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected I4, but got Unknown return (code - 323) switch { 0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, _ => -1, }; } } } namespace VoiceShipControl.Helpers { internal class AssetData<T> { public T Result { get; set; } public AssetBundle Bundle { get; set; } public AssetData(T result, AssetBundle bundle) { Result = result; Bundle = bundle; } } internal class AssetLoader { public static AssetData<T> Load<T>(string assetName) where T : Object { AssetBundle val = AssetBundle.GetAllLoadedAssetBundles().FirstOrDefault((Func<AssetBundle, bool>)((AssetBundle x) => ((Object)x).name == assetName)); if ((Object)(object)val == (Object)null) { val = AssetBundle.LoadFromFile(FileHelper.GetFilePath(assetName)); } T val2; if ((Object)(object)val != (Object)null) { val2 = val.LoadAsset<T>(assetName); if ((Object)(object)val2 != (Object)null) { Debug.Log((object)(assetName + " loaded succesfuly")); } else { Debug.Log((object)(assetName + " asset not exist")); } } else { val2 = default(T); Debug.Log((object)("Error while loading " + assetName)); } return new AssetData<T>(val2, val); } } internal class AudioClipHelper { private static void PlayAudioSourceVoice(string assetName, AudioSource audioSource) { try { Console.WriteLine("Start Play audioSource " + assetName); AssetData<AudioClip> assetData = AssetLoader.Load<AudioClip>(assetName); if ((Object)(object)assetData.Result == (Object)null) { if ((Object)(object)assetData.Bundle != (Object)null) { assetData.Bundle.Unload(false); } return; } if ((Object)(object)audioSource == (Object)null) { assetData.Bundle.Unload(false); return; } Console.WriteLine("PlayAudioSourceVoice Play"); if (audioSource.isPlaying) { audioSource.Stop(); audioSource.PlayOneShot(assetData.Result); } else { audioSource.PlayOneShot(assetData.Result); } assetData.Bundle.Unload(false); } catch (Exception ex) { Debug.LogException(ex); } } public static void PlayValuePairAudioSourceByKey(string assetKey, AudioSource audioSource) { if ((Object)(object)audioSource == (Object)null) { Debug.Log((object)"audioSource empty"); return; } try { Debug.Log((object)assetKey); KeyValuePair<string, ConfigEntry<string>> keyValuePair = PluginConstants.VoicePlayAudioAssetNames.FirstOrDefault((KeyValuePair<string, ConfigEntry<string>> x) => x.Key == assetKey); if (keyValuePair.Value == null || string.IsNullOrEmpty(keyValuePair.Value.Value) || string.IsNullOrEmpty(keyValuePair.Key)) { return; } Console.WriteLine(keyValuePair.Value.Value + " founded asset"); if (!string.IsNullOrEmpty(keyValuePair.Value.Value)) { if (keyValuePair.Value.Value.Contains("|")) { Console.WriteLine(keyValuePair.Value.Value + " Contains |"); string[] array = keyValuePair.Value.Value.Split('|'); Random random = new Random(); int num = random.Next(0, array.Length); PlayAudioSourceVoice(array[num], audioSource); } else { PlayAudioSourceVoice(keyValuePair.Value.Value, audioSource); } } } catch (Exception ex) { Debug.LogException(ex); } } public static void PlayAudioSourceByValue(string assetValue, AudioSource audioSource) { if ((Object)(object)audioSource == (Object)null) { Debug.Log((object)"audioSource empty"); return; } try { Console.WriteLine(assetValue + " founded asset"); if (!string.IsNullOrEmpty(assetValue)) { if (assetValue.Contains("|")) { Console.WriteLine(assetValue + " Contains |"); string[] array = assetValue.Split('|'); Random random = new Random(); int num = random.Next(0, array.Length); PlayAudioSourceVoice(array[num], audioSource); } else { PlayAudioSourceVoice(assetValue, audioSource); } } } catch (Exception ex) { Debug.LogException(ex); } } } internal class JsonHelper { public static string GetValue(string key) { JObject val = JObject.Parse(File.ReadAllText(FileHelper.GetFilePath("VoiceShipControlSettings.json"))); return ((JToken)val).Value<string>((object)key); } public static Dictionary<string, string> GetKeyValuePairs(string key) { JObject val = JObject.Parse(File.ReadAllText(FileHelper.GetFilePath("VoiceShipControlSettings.json"))); return ((JToken)JObject.FromObject((object)val[key])).ToObject<Dictionary<string, string>>(); } public static void SetKeyValuePair(string key, string subKey, string value) { string filePath = FileHelper.GetFilePath("VoiceShipControlSettings.json"); string text = File.ReadAllText(filePath); JObject val = JObject.Parse(text); if (string.IsNullOrEmpty(subKey)) { val[key] = JToken.op_Implicit(value); } else { val[subKey][(object)key] = JToken.op_Implicit(value); } string contents = ((object)val).ToString(); File.WriteAllText(filePath, contents); } } internal class Recognizer : MonoBehaviour { public static Process recognitionProcess; public static Recognizer Instance; public static bool IsProcessStarted; public static bool IsStarted; public static void InitRecognizer(bool visible = false, string name = "Recognizer") { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown if (!((Object)(object)Instance != (Object)null) && Application.isPlaying) { GameObject val = new GameObject(); if (!visible) { ((Object)val).hideFlags = (HideFlags)61; } Instance = val.AddComponent<Recognizer>(); Debug.Log((object)"Recognizer object created"); } } public void Update() { if (!((Object)(object)Instance == (Object)null) && !IsStarted) { IsStarted = true; ((MonoBehaviour)Instance).StartCoroutine(Execute()); } } public static IEnumerator Execute() { string languageCode = PluginConstants.LanguageDictionary.GetValueOrDefault(PluginConstants.LanguageCode.Value); if (!string.IsNullOrEmpty(languageCode)) { IsProcessStarted = true; } else { Debug.LogWarning((object)"Recognizer not started Language incorrect!"); yield return null; } yield return (object)new WaitForSeconds(0f); try { Debug.Log((object)("Current lang: " + languageCode)); recognitionProcess = new Process(); recognitionProcess.StartInfo.FileName = FileHelper.GetFilePath("recognizer.exe"); recognitionProcess.StartInfo.Arguments = "\"" + languageCode + "\""; recognitionProcess.StartInfo.CreateNoWindow = true; recognitionProcess.StartInfo.UseShellExecute = false; recognitionProcess.Exited += delegate { Debug.LogWarning((object)"Process exited"); }; recognitionProcess.Start(); Debug.Log((object)"Recognizer started"); } catch (Exception e2) { Debug.Log((object)e2); } } public static void PythonError(string error, EventArgs e) { Debug.LogError((object)error); } public static void PythonSpeechRecognized(string spokenText, EventArgs e) { if (StartOfRound.Instance.localPlayerController.isPlayerDead && !PluginConstants.IsUserCanUseCommandsWhenDead.Value) { return; } Console.WriteLine("Spocken text: " + spokenText); if ((!StartOfRound.Instance.localPlayerController.isInHangarShipRoom && !PluginConstants.IsUserCanUseCommandsOutsideTheShip.Value) || (!DetectAndRunStartEndGameVoiceCommand(spokenText) && !DetectAndRunShipDoorVoiceCommand(spokenText) && !DetectAndRunSwitchVoiceCommand(spokenText) && !DetectAndRunTeleporterVoiceCommand(spokenText) && !DetectAndRunMonitorVoiceCommand(spokenText))) { DetectAndRunVoiceCommand(spokenText); if ((StartOfRound.Instance.localPlayerController.isInHangarShipRoom || PluginConstants.IsUserCanUseCommandsOutsideTheShip.Value) && !DetectAndRunBuyCommand(spokenText) && !DetectAndRunTransmitCommand(spokenText) && !DetectAndRunRerouteCommand(spokenText)) { DetectAndRunTerminalCommand(spokenText); } } } public static bool DetectAndRunStartEndGameVoiceCommand(string spokenText) { if (PluginConstants.StartGame.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { StartOfRound.Instance.StartGameServerRpc(); return true; } if (PluginConstants.EndGame.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { StartOfRound.Instance.EndGameServerRpc((int)StartOfRound.Instance.localPlayerController.playerClientId); return true; } return false; } public static bool DetectAndRunShipDoorVoiceCommand(string spokenText) { if (PluginConstants.CloseDoor.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { HangarShipDoor val = Object.FindFirstObjectByType<HangarShipDoor>(); if ((Object)(object)val != (Object)null) { InteractTrigger component = ((Component)((Component)val).transform.Find("HangarDoorButtonPanel/StopButton/Cube (3)")).GetComponent<InteractTrigger>(); component.Interact(((Component)GameNetworkManager.Instance.localPlayerController).transform); } return true; } if (PluginConstants.OpenDoor.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { HangarShipDoor val2 = Object.FindFirstObjectByType<HangarShipDoor>(); if ((Object)(object)val2 != (Object)null) { InteractTrigger component2 = ((Component)((Component)val2).transform.Find("HangarDoorButtonPanel/StartButton/Cube (2)")).GetComponent<InteractTrigger>(); component2.Interact(((Component)GameNetworkManager.Instance.localPlayerController).transform); } return true; } return false; } public static bool DetectAndRunSwitchVoiceCommand(string spokenText) { ShipLights val = Object.FindObjectOfType<ShipLights>(); if (PluginConstants.SwitchOn.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { val.SetShipLightsServerRpc(true); return true; } if (PluginConstants.SwitchOff.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { val.SetShipLightsServerRpc(false); return true; } return false; } public static bool DetectAndRunMonitorVoiceCommand(string spokenText) { if (PluginConstants.SwitchMonitor.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { InteractTrigger component = GameObject.Find("Environment/HangarShip/ShipModels2b/MonitorWall/Cube.001/CameraMonitorSwitchButton/Cube (2)").GetComponent<InteractTrigger>(); if ((Object)(object)component != (Object)null) { component.Interact(((Component)GameNetworkManager.Instance.localPlayerController).transform); } return true; } if (PluginConstants.ToggleMonitor.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { InteractTrigger component2 = GameObject.Find("Environment/HangarShip/ShipModels2b/MonitorWall/Cube.001/CameraMonitorOnButton/Cube (2)").GetComponent<InteractTrigger>(); if ((Object)(object)component2 != (Object)null) { component2.Interact(((Component)GameNetworkManager.Instance.localPlayerController).transform); } return true; } return false; } public static bool DetectAndRunTeleporterVoiceCommand(string spokenText) { ShipTeleporter[] source = Object.FindObjectsOfType<ShipTeleporter>(); ShipTeleporter val = ((IEnumerable<ShipTeleporter>)source).FirstOrDefault((Func<ShipTeleporter, bool>)((ShipTeleporter x) => !x.isInverseTeleporter)); ShipTeleporter val2 = ((IEnumerable<ShipTeleporter>)source).FirstOrDefault((Func<ShipTeleporter, bool>)((ShipTeleporter x) => x.isInverseTeleporter)); if (PluginConstants.Teleporter.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { if (((Behaviour)val).isActiveAndEnabled && (val2.buttonTrigger.interactable || PluginConstants.IsUserCanUseTeleportAlways.Value)) { val.PressTeleportButtonOnLocalClient(); } return true; } if (PluginConstants.InverseTeleporter.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { if (((Behaviour)val2).isActiveAndEnabled && (val2.buttonTrigger.interactable || PluginConstants.IsUserCanUseTeleportAlways.Value)) { val2.PressTeleportButtonOnLocalClient(); return true; } return true; } return false; } public static bool DetectAndRunVoiceCommand(string spokenText) { KeyValuePair<string, ConfigEntry<string>> keyValuePair = PluginConstants.VoiceCommands.FirstOrDefault((KeyValuePair<string, ConfigEntry<string>> x) => x.Value.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))); if (keyValuePair.Value != null && !string.IsNullOrEmpty(keyValuePair.Value.Value) && !string.IsNullOrEmpty(keyValuePair.Key)) { AudioSource val = ((Component)StartOfRound.Instance.localPlayerController).gameObject.GetComponent<AudioSource>(); if ((Object)(object)val == (Object)null) { val = ((Component)StartOfRound.Instance.localPlayerController).gameObject.AddComponent<AudioSource>(); } AudioClipHelper.PlayValuePairAudioSourceByKey(keyValuePair.Key, val); return true; } return false; } public static bool DetectAndRunBuyCommand(string spokenText) { if (PluginConstants.BuyKeyPhrase.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { KeyValuePair<string, ConfigEntry<string>> keyValuePair = PluginConstants.BuyVoiceCommands.FirstOrDefault((KeyValuePair<string, ConfigEntry<string>> x) => x.Value.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))); if (keyValuePair.Value != null && !string.IsNullOrEmpty(keyValuePair.Value.Value) && !string.IsNullOrEmpty(keyValuePair.Key)) { string text = string.Empty; KeyValuePair<string, ConfigEntry<string>> keyValuePair2 = PluginConstants.BuyVoiceCountCommands.FirstOrDefault((KeyValuePair<string, ConfigEntry<string>> x) => x.Value.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))); if (keyValuePair2.Value != null && !string.IsNullOrEmpty(keyValuePair2.Value.Value) && !string.IsNullOrEmpty(keyValuePair2.Key)) { text = keyValuePair2.Key; Console.WriteLine(text + " buy count command"); } ShipCommands.BuyCommand(keyValuePair.Key + " " + text); return true; } } return false; } public static bool DetectAndRunTerminalCommand(string spokenText) { KeyValuePair<string, ConfigEntry<string>> keyValuePair = PluginConstants.TerminalVoiceCommands.FirstOrDefault((KeyValuePair<string, ConfigEntry<string>> x) => x.Value.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))); if (keyValuePair.Value != null && !string.IsNullOrEmpty(keyValuePair.Value.Value) && !string.IsNullOrEmpty(keyValuePair.Key)) { ShipCommands.TerminalCommand(keyValuePair.Key); return true; } return false; } public static bool DetectAndRunTransmitCommand(string spokenText) { string value = PluginConstants.TransmitKeyPhrase.Value.Split('|').FirstOrDefault((string y) => spokenText.ToLower().Contains(y.ToLower())); if (!string.IsNullOrEmpty(value)) { int startIndex = spokenText.LastIndexOf(value); string text = spokenText.Substring(startIndex); if (char.IsWhiteSpace(text, 0)) { text.Remove(0); } else { int startIndex2 = text.IndexOf(" "); text = spokenText.Substring(startIndex2); } ShipCommands.TerminalCommand("transmit " + text); return true; } return false; } public static bool DetectAndRunRerouteCommand(string spokenText) { if (PluginConstants.RerouteKeyPhrase.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))) { KeyValuePair<string, ConfigEntry<string>> keyValuePair = PluginConstants.ReroutePlanetComands.FirstOrDefault((KeyValuePair<string, ConfigEntry<string>> x) => x.Value.Value.Split('|').Any((string y) => spokenText.ToLower().Contains(y.ToLower()))); if (keyValuePair.Value != null && !string.IsNullOrEmpty(keyValuePair.Value.Value) && !string.IsNullOrEmpty(keyValuePair.Key)) { ShipCommands.RerouteCommand(keyValuePair.Key); return true; } } return false; } public static void StopRecognizer() { Debug.Log((object)"Stop recognizer"); IsProcessStarted = (IsStarted = false); recognitionProcess.Kill(); } private void OnDestroy() { Debug.Log((object)"Destriy recognizer"); StopRecognizer(); } private void OnApplicationQuit() { StopRecognizer(); Object.Destroy((Object)(object)this); } } internal class ShipCommands { public static void RerouteCommand(string inputText) { try { Debug.Log((object)("isInHangarShipRoom: " + StartOfRound.Instance.localPlayerController.isInHangarShipRoom + " for player:" + ((Object)StartOfRound.Instance.localPlayerController).name)); Terminal val = Object.FindObjectOfType<Terminal>(); if ((Object)(object)HUDManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null || (Object)(object)val == (Object)null) { Console.WriteLine("terminal is null"); return; } val.BeginUsingTerminal(); val.screenText.text = string.Empty; val.currentText = string.Empty; val.textAdded = 0; val.TextChanged(inputText); val.screenText.text = inputText; val.OnSubmit(); if (((Object)val.currentNode).name == "CannotAfford") { val.QuitTerminal(); AudioClipHelper.PlayAudioSourceByValue(PluginConstants.BuyDeclinedAudioAssetName.Value, StartOfRound.Instance.speakerAudioSource); return; } val.TextChanged(string.Empty); val.screenText.text = string.Empty; val.currentText = string.Empty; val.textAdded = 0; val.TextChanged("confirm"); val.screenText.text = "confirm"; val.OnSubmit(); Debug.Log((object)((Object)val.currentNode).name); if (((Object)val.currentNode).name == "CannotAfford") { val.QuitTerminal(); AudioClipHelper.PlayAudioSourceByValue(PluginConstants.BuyDeclinedAudioAssetName.Value, StartOfRound.Instance.speakerAudioSource); } else { AudioClipHelper.PlayAudioSourceByValue(PluginConstants.BuySuccessAudioAssetName.Value, StartOfRound.Instance.speakerAudioSource); val.QuitTerminal(); } } catch (Exception ex) { Debug.Log((object)ex); } } public static void TerminalCommand(string inputText) { try { Debug.Log((object)("isInHangarShipRoom: " + StartOfRound.Instance.localPlayerController.isInHangarShipRoom + " for player:" + ((Object)StartOfRound.Instance.localPlayerController).name)); Terminal val = Object.FindObjectOfType<Terminal>(); if ((Object)(object)HUDManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null || (Object)(object)val == (Object)null) { Console.WriteLine("terminal is null"); } else if (StartOfRound.Instance.localPlayerController.inTerminalMenu) { val.screenText.text = string.Empty; val.currentText = string.Empty; val.textAdded = 0; val.TextChanged(inputText); val.screenText.text = inputText; val.OnSubmit(); } else { val.BeginUsingTerminal(); val.screenText.text = string.Empty; val.currentText = string.Empty; val.textAdded = 0; val.TextChanged(inputText); val.screenText.text = inputText; val.OnSubmit(); val.QuitTerminal(); } } catch (Exception ex) { Debug.Log((object)ex); } } public static void BuyCommand(string inputText) { Terminal val = Object.FindObjectOfType<Terminal>(); if ((Object)(object)HUDManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null || (Object)(object)val == (Object)null) { Console.WriteLine("terminal is null"); return; } try { val.terminalInUse = true; GameNetworkManager.Instance.localPlayerController.inTerminalMenu = true; val.LoadNewNode(val.terminalNodes.specialNodes[13]); val.TextChanged(string.Empty); val.SetTerminalInUseLocalClient(true); val.screenText.text = string.Empty; val.currentText = string.Empty; val.textAdded = 0; val.TextChanged(inputText); val.screenText.text = inputText; val.OnSubmit(); if (((Object)val.currentNode).name == "CannotAfford") { val.QuitTerminal(); AudioClipHelper.PlayAudioSourceByValue(PluginConstants.BuyDeclinedAudioAssetName.Value, StartOfRound.Instance.speakerAudioSource); return; } val.TextChanged(string.Empty); val.screenText.text = string.Empty; val.currentText = string.Empty; val.textAdded = 0; val.TextChanged("confirm"); val.screenText.text = "confirm"; val.OnSubmit(); if (((Object)val.currentNode).name != "ParserError1") { AudioClipHelper.PlayAudioSourceByValue(PluginConstants.BuySuccessAudioAssetName.Value, StartOfRound.Instance.speakerAudioSource); } val.QuitTerminal(); } catch (Exception ex) { Console.WriteLine(ex.Message + " " + ex.StackTrace); } } public static void ShowAllTerminalData() { Terminal val = Object.FindObjectOfType<Terminal>(); for (int i = 0; i < val.terminalNodes.allKeywords.Length; i++) { try { Console.WriteLine($"allKeywords {i}: " + ((Object)val.terminalNodes.allKeywords[i]).name); Console.WriteLine($"allKeywords {i}: " + val.terminalNodes.allKeywords[i].word); Console.WriteLine($"allKeywords {i}: " + (object)val.terminalNodes.allKeywords[i].defaultVerb); Console.WriteLine($"allKeywords {i}: " + string.Join(",", val.terminalNodes.allKeywords[i].compatibleNouns.Select((CompatibleNoun x) => ((Object)x.result).name))); } catch (Exception) { Console.WriteLine("option result not found"); } } for (int j = 0; j < val.terminalNodes.specialNodes.Count; j++) { Console.WriteLine($"specialNodes {j}: " + ((Object)val.terminalNodes.specialNodes[j]).name); for (int num = 0; num < val.terminalNodes.specialNodes[j].terminalOptions.Length; j++) { try { Console.WriteLine($"terminalOptions {j}: " + ((Object)val.terminalNodes.specialNodes[j].terminalOptions[num].result).name); } catch (Exception) { Console.WriteLine("option result not found"); } } } for (int k = 0; k < val.currentNode.terminalOptions.Length; k++) { Console.WriteLine($"terminalOptions {k}: " + ((Object)val.currentNode.terminalOptions[k].result).name); } for (int l = 0; l < val.currentNode.terminalOptions.Length; l++) { Console.WriteLine($"terminalOptions.noun {l}: " + ((Object)val.currentNode.terminalOptions[l].noun).name); Console.WriteLine($"terminalOptions.noun {l}: " + val.currentNode.terminalOptions[l].noun.word); } } } } namespace VoiceShipControl.Patches { [HarmonyPatch(typeof(StartOfRound))] public class StartOfRoundPatch : NetworkBehaviour { public static StartOfRound Instance; public static bool IsRecognitionEnabled; [HarmonyPatch("LateUpdate")] [HarmonyPostfix] private static void AddSoundRecognition(StartOfRound __instance) { Instance = __instance; if (!((Object)(object)Instance == (Object)null) && ((Component)__instance).gameObject.activeSelf && !IsRecognitionEnabled) { IsRecognitionEnabled = true; EnambleRecognition(); AssetData<AudioClip> assetData = AssetLoader.Load<AudioClip>(PluginConstants.ShipIntroAudioAssetName.Value); if ((Object)(object)assetData.Bundle != (Object)null && (Object)(object)assetData.Result != (Object)null) { __instance.shipIntroSpeechSFX = assetData.Result; } } } private static void EnambleRecognition() { if ((Object)(object)SocketListener.Instance == (Object)null) { Debug.Log((object)"SocketListener not founded initializing"); SocketListener.InitSocketListener(); SocketListener.OnErrorReceivedEvent += Recognizer.PythonError; SocketListener.OnMessageReceivedEvent += Recognizer.PythonSpeechRecognized; } else { SocketListener.StartServer(); } if ((Object)(object)Recognizer.Instance == (Object)null) { Debug.Log((object)"Recognizer not founded initializing"); Recognizer.InitRecognizer(); } else { Recognizer.IsStarted = (Recognizer.IsProcessStarted = false); } } [HarmonyPatch("StartGame")] [HarmonyPostfix] private static void PlayStartGameAudio() { Terminal val = Object.FindObjectOfType<Terminal>(); AudioClipHelper.PlayAudioSourceByValue(PluginConstants.StartOfRoundAudioAssetName.Value, StartOfRound.Instance.speakerAudioSource); } [HarmonyPatch("EndGameServerRpc")] [HarmonyPostfix] private static void PlayEndGameAudio() { AudioClipHelper.PlayAudioSourceByValue(PluginConstants.EndOfRoundAudioAssetName.Value, StartOfRound.Instance.speakerAudioSource); } [HarmonyPatch("OnDestroy")] [HarmonyPrefix] private static void OnDestroy() { Object.Destroy((Object)(object)Recognizer.Instance); Object.Destroy((Object)(object)SocketListener.Instance); IsRecognitionEnabled = false; Debug.Log((object)"recognizer stopped"); } } }