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 ShipVoiceCommandsv2 v2.0.4
ShipVoiceCommandsv2.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using LethalSettings.UI; using LethalSettings.UI.Components; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.SceneManagement; using VoiceRecognitionAPI; [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("ShipVoiceCommandsv2")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Add voice commands")] [assembly: AssemblyFileVersion("2.0.4.0")] [assembly: AssemblyInformationalVersion("2.0.4")] [assembly: AssemblyProduct("ShipVoiceCommandsv2")] [assembly: AssemblyTitle("ShipVoiceCommandsv2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.4.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ShipVoiceCommandsv2 { [BepInPlugin("shipvoicecommandsv2.me.loaforc.arceusyoluffy", "ShipVoiceCommandsv2", "2.0.4")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class ShipVoiceCommandsBase : BaseUnityPlugin { private const string modGUID = "shipvoicecommandsv2.me.loaforc.arceusyoluffy"; private const string modName = "ShipVoiceCommandsv2"; private const string modVersion = "2.0.4"; private readonly Harmony harmony = new Harmony("shipvoicecommandsv2.me.loaforc.arceusyoluffy"); internal static ShipVoiceCommandsBase instance; internal static ManualLogSource logger; internal static ConfigEntry<int> CONFIG_VERSION; internal static ConfigEntry<bool> ARE_COMMANDS_GLOBAL; internal static ConfigEntry<string> OPEN_DOORS_COMMAND; internal static ConfigEntry<string> CLOSE_DOORS_COMMAND; internal static ConfigEntry<string> ACTIVATE_TELEPORT_COMMAND; internal static ConfigEntry<string> TOGGLE_CAMERA; internal static ConfigEntry<string> SWITCH_CAMERA; internal static ConfigEntry<string> TOGGLE_LIGHTS; internal static ConfigEntry<string> PULL_LEVER; internal static ConfigEntry<string> ACTIVATE_INVERSE_TELEPORT_COMMAND; internal static ConfigEntry<string> TOGGLE_SHIP_HORN; internal static ConfigEntry<string> RING_COMPANY_BELL; internal static ConfigEntry<string> TOGGLE_TELEVISION; internal static ConfigEntry<string> TOGGLE_PLUSHIE; internal static ConfigEntry<string> TOGGLE_SHOWER; internal static ConfigEntry<string> TOGGLE_TOILET; internal static ConfigEntry<string> TOGGLE_SPEAKER; internal static ConfigEntry<string> TOGGLE_JACKOLANTERN; internal static ConfigEntry<string> TOGGLE_COMPANY_TRAPDOOR; internal static ConfigEntry<string> ACTIVATE_RADAR_BOOSTER_FLASH; internal static ConfigEntry<string> ACTIVATE_RADAR_BOOSTER_PING; internal static ConfigEntry<double> CONFIDENCE; private void Awake() { //IL_0596: Unknown result type (might be due to invalid IL or missing references) //IL_059c: Expected O, but got Unknown //IL_05d5: Unknown result type (might be due to invalid IL or missing references) //IL_05da: Unknown result type (might be due to invalid IL or missing references) //IL_05e7: Expected O, but got Unknown //IL_05e9: Unknown result type (might be due to invalid IL or missing references) //IL_05ee: Unknown result type (might be due to invalid IL or missing references) //IL_05fa: Unknown result type (might be due to invalid IL or missing references) //IL_0612: Unknown result type (might be due to invalid IL or missing references) //IL_0639: Expected O, but got Unknown if (!((Object)(object)instance == (Object)null)) { return; } instance = this; logger = Logger.CreateLogSource("shipvoicecommandsv2.me.loaforc.arceusyoluffy"); logger.LogInfo((object)"Setting up config."); CONFIG_VERSION = ((BaseUnityPlugin)this).Config.Bind<int>("Config", "ConfigVersion", 1, "Yeah don't touch this lol. You could mess up your settings."); ARE_COMMANDS_GLOBAL = ((BaseUnityPlugin)this).Config.Bind<bool>("Gameplay", "AreCommandsGlobal", false, "Are the voice commands global? Or do you need to be near the ship? It is recommend to play with this off."); CONFIDENCE = ((BaseUnityPlugin)this).Config.Bind<double>("Recognition", "Confidence", 0.2, "What amount of confidence is require for it to be classified as recognized. Higher values may help with false positives but may increase times it does not work. Value between 0 and 1."); OPEN_DOORS_COMMAND = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "OpenShipDoors", "open doors,open ship doors", "What voice phrases should open the ship doors. Each phrase should be seperated with a comma"); CLOSE_DOORS_COMMAND = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "CloseShipDoors", "close doors,close ship doors", "What voice phrases should close the ship doors. Each phrase should be seperated with a comma"); ACTIVATE_TELEPORT_COMMAND = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ActivateTeleporter", "teleport,teleport player", "What voice phrases should activate the ship teleporter. Each phrase should be seperated with a comma"); TOGGLE_CAMERA = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleCamera", "camera on,camera off, camera toggle", "What voice phrases should toggle the camera. Each phrase should be seperated with a comma"); SWITCH_CAMERA = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "SwitchCamera", "camera switch,switch camera,camera next", "What voice phrases should switch the camera. Each phrase should be seperated with a comma"); TOGGLE_LIGHTS = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleLights", "lights on,lights off,toggle lights,night night", "What voice phrases should toggle the ship lights. Each phrase should be seperated with a comma"); PULL_LEVER = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "PullLever", "launch,take off", "What voice phrases should cause the ship to take off. Each phrase should be seperated with a comma"); ACTIVATE_INVERSE_TELEPORT_COMMAND = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ActivateInvertedTeleporter", "inverse teleport,inverse teleport player", "What voice phrases should activate the ship inverted teleporter. Each phrase should be seperated with a comma"); TOGGLE_SHIP_HORN = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleShipHorn", "ship horn", "What voice phrases should activate the ship loud horn. Each phrase should be seperated with a comma"); RING_COMPANY_BELL = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "RingCompanyBell", "ring bell", "What voice phrases should activate the company bell. Each phrase should be seperated with a comma"); TOGGLE_TELEVISION = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleTelevision", "television", "What voice phrases should toggle the television. Each phrase should be seperated with a comma"); TOGGLE_PLUSHIE = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "TogglePlushie", "plushie,plush", "What voice phrases should toggle the plushie pajama man. Each phrase should be seperated with a comma"); TOGGLE_SHOWER = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleShower", "shower", "What voice phrases should toggle the shower. Each phrase should be seperated with a comma"); TOGGLE_TOILET = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleToilet", "toilet,flush toilet,flush", "What voice phrases should flush the toilet. Each phrase should be seperated with a comma"); TOGGLE_SPEAKER = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleSpeaker", "speaker,skip,intro skip", "What voice phrases should toggle the speaker. Each phrase should be seperated with a comma"); TOGGLE_JACKOLANTERN = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleJackOLantern", "lantern,jacko", "What voice phrases should toggle the Jack-O-Lantern. Each phrase should be seperated with a comma"); TOGGLE_COMPANY_TRAPDOOR = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ToggleCompanyTrapdoor", "trap,trapdoor", "What voice phrases should toggle the trapdoor into at the Company Building. Each phrase should be seperated with a comma"); ACTIVATE_RADAR_BOOSTER_FLASH = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ActivateRadarBoosterFlash", "flash", "What voice phrases should activate the flash of the radar booster. Each phrase should be seperated with a comma"); ACTIVATE_RADAR_BOOSTER_PING = ((BaseUnityPlugin)this).Config.Bind<string>("Commands", "ActivateRadarBoosterPing", "ping", "What voice phrases should ping the radar booster. Each phrase should be seperated with a comma"); logger.LogInfo((object)"Performing any needed config migrations"); if (CONFIG_VERSION.Value == 1) { CONFIG_VERSION.Value = 2; if (CONFIDENCE.Value == 0.2) { CONFIDENCE.Value = 0.85; } } logger.LogInfo((object)"Registering voice commands!"); Voice.RegisterPhrases(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(CollectionExtensions.AddRangeToArray<string>(OPEN_DOORS_COMMAND.Value.Split(','), CLOSE_DOORS_COMMAND.Value.Split(',')), ACTIVATE_TELEPORT_COMMAND.Value.Split(',')), SWITCH_CAMERA.Value.Split(',')), TOGGLE_CAMERA.Value.Split(',')), TOGGLE_LIGHTS.Value.Split(',')), PULL_LEVER.Value.Split(',')), ACTIVATE_INVERSE_TELEPORT_COMMAND.Value.Split(',')), TOGGLE_SHIP_HORN.Value.Split(',')), RING_COMPANY_BELL.Value.Split(',')), TOGGLE_TELEVISION.Value.Split(',')), TOGGLE_PLUSHIE.Value.Split(',')), TOGGLE_SHOWER.Value.Split(',')), TOGGLE_TOILET.Value.Split(',')), TOGGLE_SPEAKER.Value.Split(',')), TOGGLE_JACKOLANTERN.Value.Split(',')), TOGGLE_COMPANY_TRAPDOOR.Value.Split(',')), ACTIVATE_RADAR_BOOSTER_FLASH.Value.Split(',')), ACTIVATE_RADAR_BOOSTER_PING.Value.Split(','))); Voice.RegisterCustomHandler((EventHandler<VoiceRecognitionEventArgs>)delegate(object __, VoiceRecognitionEventArgs args) { if (!((double)args.Confidence < CONFIDENCE.Value) && IsPlayerWithinShipBounds()) { if (OPEN_DOORS_COMMAND.Value.Split(',').Contains(args.Message)) { HangarShipDoor val2 = Object.FindFirstObjectByType<HangarShipDoor>(); if ((Object)(object)val2 != (Object)null) { InteractTrigger component = ((Component)((Component)val2).transform.Find("HangarDoorButtonPanel/StartButton/Cube (2)")).GetComponent<InteractTrigger>(); TriggerButton(component); logger.LogInfo((object)"Open Doors"); } } if (CLOSE_DOORS_COMMAND.Value.Split(',').Contains(args.Message)) { HangarShipDoor val3 = Object.FindFirstObjectByType<HangarShipDoor>(); if ((Object)(object)val3 != (Object)null) { InteractTrigger component2 = ((Component)((Component)val3).transform.Find("HangarDoorButtonPanel/StopButton/Cube (3)")).GetComponent<InteractTrigger>(); TriggerButton(component2); logger.LogInfo((object)"Close Doors"); } } if (ACTIVATE_TELEPORT_COMMAND.Value.Split(',').Contains(args.Message)) { GameObject val4 = GameObject.Find("Teleporter(Clone)/ButtonContainer/ButtonAnimContainer/RedButton"); if ((Object)(object)val4 != (Object)null) { TriggerButton(val4.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Teleport"); } } if (SWITCH_CAMERA.Value.Split(',').Contains(args.Message)) { GameObject val5 = GameObject.Find("Environment/HangarShip/ShipModels2b/MonitorWall/Cube.001/CameraMonitorSwitchButton/Cube (2)"); if ((Object)(object)val5 != (Object)null) { TriggerButton(val5.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Switch Camera"); } } if (TOGGLE_CAMERA.Value.Split(',').Contains(args.Message)) { GameObject val6 = GameObject.Find("Environment/HangarShip/ShipModels2b/MonitorWall/Cube.001/CameraMonitorOnButton/Cube (2)"); if ((Object)(object)val6 != (Object)null) { TriggerButton(val6.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Toggle Camera"); } } if (TOGGLE_LIGHTS.Value.Split(',').Contains(args.Message)) { GameObject val7 = GameObject.Find("Environment/HangarShip/LightSwitchContainer/LightSwitch"); if ((Object)(object)val7 != (Object)null) { TriggerButton(val7.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Lights"); } } if (PULL_LEVER.Value.Split(',').Contains(args.Message)) { logger.LogInfo((object)"This is bugged for the moment"); } if (ACTIVATE_INVERSE_TELEPORT_COMMAND.Value.Split(',').Contains(args.Message)) { GameObject val8 = GameObject.Find("InverseTeleporter(Clone)/ButtonContainer/ButtonAnimContainer/RedButton"); if ((Object)(object)val8 != (Object)null) { TriggerButton(val8.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Inverse Teleport"); } } if (TOGGLE_SHIP_HORN.Value.Split(',').Contains(args.Message)) { ShipAlarmCord val9 = Object.FindFirstObjectByType<ShipAlarmCord>(); if ((Object)(object)val9 != (Object)null) { val9.HoldCordDown(); logger.LogInfo((object)"Ship Horn"); } } if (RING_COMPANY_BELL.Value.Split(',').Contains(args.Message)) { GameObject val10 = GameObject.Find("BellDinger/Trigger"); if ((Object)(object)val10 != (Object)null) { TriggerButton(val10.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Company Bell"); } } if (TOGGLE_TELEVISION.Value.Split(',').Contains(args.Message)) { GameObject val11 = GameObject.Find("TelevisionContainer(Clone)/Cube"); if ((Object)(object)val11 != (Object)null) { TriggerButton(val11.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Television"); } } if (TOGGLE_PLUSHIE.Value.Split(',').Contains(args.Message)) { GameObject val12 = GameObject.Find("PlushiePJManContainer(Clone)/TouchTrigger"); if ((Object)(object)val12 != (Object)null) { TriggerButton(val12.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Plushie pajama man"); } } if (TOGGLE_SHOWER.Value.Split(',').Contains(args.Message)) { GameObject val13 = GameObject.Find("Shower(Clone)/InteractTrigger"); if ((Object)(object)val13 != (Object)null) { TriggerButton(val13.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Shower"); } } if (TOGGLE_TOILET.Value.Split(',').Contains(args.Message)) { GameObject val14 = GameObject.Find("Toilet(Clone)/Cube"); if ((Object)(object)val14 != (Object)null) { TriggerButton(val14.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Toilet"); } } if (TOGGLE_SPEAKER.Value.Split(',').Contains(args.Message)) { GameObject val15 = GameObject.Find("Environment/HangarShip/ShipModels2b/Cube.005 (2)/Cube"); if ((Object)(object)val15 != (Object)null) { TriggerButton(val15.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Speaker"); } } if (TOGGLE_JACKOLANTERN.Value.Split(',').Contains(args.Message)) { GameObject val16 = GameObject.Find("PumpkinUnlockableContainer/HitPumpkinTrigger"); if ((Object)(object)val16 != (Object)null) { TriggerButton(val16.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Jack-O-Lantern"); } } if (TOGGLE_COMPANY_TRAPDOOR.Value.Split(',').Contains(args.Message)) { GameObject val17 = GameObject.Find("Environment/Map/CompanyPlanet/TrapDoor"); if ((Object)(object)val17 != (Object)null) { TriggerButton(val17.GetComponent<InteractTrigger>()); logger.LogInfo((object)"Company Trapdoor"); } } if (ACTIVATE_RADAR_BOOSTER_FLASH.Value.Split(',').Contains(args.Message)) { GameObject val18 = GameObject.Find(" Environment/HangarShip/RadarBoosterDevice(Clone)"); RadarBoosterItem val19 = Object.FindAnyObjectByType<RadarBoosterItem>(); if ((Object)(object)val19 != (Object)null) { logger.LogInfo((object)("C'est le flash enculé " + val19.radarBoosterName + " c'est lui")); } StartOfRound.Instance.mapScreen.FlashRadarBooster(StartOfRound.Instance.mapScreen.targetTransformIndex); logger.LogInfo((object)"FLAAAAAAAAAASH"); } if (ACTIVATE_RADAR_BOOSTER_PING.Value.Split(',').Contains(args.Message)) { GameObject val20 = GameObject.Find("Environment/HangarShip/RadarBoosterDevice(Clone)"); RadarBoosterItem[] array = Object.FindObjectsOfType<RadarBoosterItem>(); if (array != null) { List<string> list = new List<string>(); List<string> list2 = new List<string>(); for (int i = 0; i < StartOfRound.Instance.mapScreen.radarTargets.Count; i++) { list.Add(StartOfRound.Instance.mapScreen.radarTargets[i].name); Debug.Log((object)$"name {i}: {list[i]}"); } for (int j = 0; j < 2; j++) { if ((Object)(object)array[j] != (Object)null) { list2.Add(array[j].radarBoosterName); } Debug.Log((object)$"name {j}: {list2[j]}"); } } StartOfRound.Instance.mapScreen.PingRadarBooster(StartOfRound.Instance.mapScreen.targetTransformIndex); StartOfRound.Instance.mapScreen.PingRadarBooster(1); logger.LogInfo((object)"PING PONG"); } } }); logger.LogInfo((object)"Creating mod settings menu..."); ModSettingsConfig val = new ModSettingsConfig(); val.Name = "ShipVoiceCommandsv2"; val.Id = "shipvoicecommandsv2.me.loaforc.arceusyoluffy"; val.Version = "2.0.4"; val.Description = "Adds simple voice commands to control your ship!"; val.MenuComponents = (MenuComponent[])(object)new MenuComponent[2] { (MenuComponent)new LabelComponent { Text = "Increase confidence to decrease false positives. Increasing confidence may also make it not register sometimes." }, (MenuComponent)new SliderComponent { Text = "Confidence", Value = (float)CONFIDENCE.Value * 100f, OnValueChanged = delegate(SliderComponent self, float value) { logger.LogInfo((object)$"Confidence slider set to: {value}, current confidence percent: {CONFIDENCE.Value} setting to -> {value / 100f}"); CONFIDENCE.Value = value / 100f; } } }; ModMenu.RegisterMod(val); logger.LogInfo((object)"ShipVoiceCommandsv2:2.0.4 has succesfully loaded!"); } private void TriggerButton(InteractTrigger trigger) { trigger.Interact(((Component)GameNetworkManager.Instance.localPlayerController).transform); } private bool IsPlayerWithinShipBounds() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) StartOfRound val = Object.FindFirstObjectByType<StartOfRound>(); if ((Object)(object)val == (Object)null) { return false; } int sceneCount = SceneManager.sceneCount; Scene[] array = (Scene[])(object)new Scene[sceneCount]; int num = 0; for (int i = 0; i < sceneCount; i++) { array[i] = SceneManager.GetSceneAt(i); if (((Scene)(ref array[i])).name == "CompanyBuilding") { num++; } } if (num == 1) { return true; } if (ARE_COMMANDS_GLOBAL.Value) { return true; } if (GameNetworkManager.Instance.localPlayerController.isPlayerDead) { return false; } Bounds bounds = val.shipBounds.bounds; return ((Bounds)(ref bounds)).Contains(((Component)GameNetworkManager.Instance.localPlayerController).transform.position); } } public static class PluginInfo { public const string PLUGIN_GUID = "ShipVoiceCommandsv2"; public const string PLUGIN_NAME = "ShipVoiceCommandsv2"; public const string PLUGIN_VERSION = "2.0.4"; } }