using 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");
}
}
}