Decompiled source of ShipMaid v4.0.9
ShipMaid.dll
Decompiled 6 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using GameNetcodeStuff; using HarmonyLib; using LethalCompanyInputUtils.Api; using Microsoft.CodeAnalysis; using ShipMaid.Configuration; using ShipMaid.EntityHelpers; using ShipMaid.HelperFunctions; using ShipMaid.InputUtils; using ShipMaid.Networking; using ShipMaid.ObjectHelpers; using Unity.Collections; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ShipMaid")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("On scan within the ship, items in the ship will be organized.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+09d324c92056b5b6b8e025659c99cf02e6753edd")] [assembly: AssemblyProduct("ShipMaid")] [assembly: AssemblyTitle("ShipMaid")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ShipMaid { [HarmonyPatch] internal static class Keybinds { public static PlayerControllerB localPlayerController; [HarmonyPatch(typeof(PlayerControllerB), "OnDisable")] [HarmonyPostfix] public static void OnDisable(PlayerControllerB __instance) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0021: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_007d: Expected O, but got Unknown //IL_00c5: 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) //IL_00d9: Expected O, but got Unknown //IL_00d9: Expected O, but got Unknown if (ShipMaid.InputActionsInstance.ShipCleanupKey != null && !((Object)__instance != (Object)localPlayerController)) { ShipMaid.InputActionsInstance.ShipCleanupKey.performed -= OnShipMaidShipCleanupCalled; ShipMaid.InputActionsInstance.ShipCleanupKey.Disable(); } if (ShipMaid.InputActionsInstance.StorageCleanupKey != null && !((Object)__instance != (Object)localPlayerController)) { ShipMaid.InputActionsInstance.StorageCleanupKey.performed -= OnShipMaidClosetCleanupCalled; ShipMaid.InputActionsInstance.StorageCleanupKey.Disable(); } if (ShipMaid.InputActionsInstance.LocationOverrideKey != null && !((Object)__instance != (Object)localPlayerController)) { ShipMaid.InputActionsInstance.LocationOverrideKey.performed -= OnShipMaidDropAndSetObjectTypePositionCalled; ShipMaid.InputActionsInstance.LocationOverrideKey.Disable(); } } [HarmonyPatch(typeof(PlayerControllerB), "OnEnable")] [HarmonyPostfix] public static void OnEnable(PlayerControllerB __instance) { //IL_0001: 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_0015: Expected O, but got Unknown //IL_0015: Expected O, but got Unknown if ((Object)__instance == (Object)localPlayerController) { SubscribeToEvents(); } } [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] [HarmonyPostfix] public static void OnLocalPlayerConnect(PlayerControllerB __instance) { localPlayerController = __instance; ShipMaidFunctions.initItemLocations(); if (((Component)localPlayerController).gameObject.activeSelf) { SubscribeToEvents(); } ShipMaid.Log("Local Player Connect"); NetworkFunctions.NetworkingObjectManager.NetworkManagerInit(); ShipMaid.Log("Registering Manager"); } private static void OnShipMaidClosetCleanupCalled(CallbackContext context) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown if (!((Object)localPlayerController == (Object)null) && localPlayerController.isPlayerControlled && !localPlayerController.isTypingChat && !localPlayerController.inTerminalMenu && (!((NetworkBehaviour)localPlayerController).IsServer || localPlayerController.isHostPlayerObject) && !ConfigSettings.UseOnlyTerminal.Key.Value) { if (!StartOfRound.Instance.shipHasLanded && !StartOfRound.Instance.inShipPhase) { ShipMaid.Log("Ship Has Not Landed and Not In Ship Phase, do not cleanup"); return; } ShipMaid.Log("Cleanup Closet"); LootOrganizingFunctions.OrganizeStorageCloset(); } } private static void OnShipMaidDropAndSetObjectTypePositionCalled(CallbackContext context) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown if (!((Object)localPlayerController == (Object)null) && localPlayerController.isPlayerControlled && !localPlayerController.isTypingChat && !localPlayerController.inTerminalMenu && (!((NetworkBehaviour)localPlayerController).IsServer || localPlayerController.isHostPlayerObject)) { ShipMaid.Log("Set object cleanup position"); ShipMaidFunctions.DropAndSetObjectTypePosition(); } } private static void OnShipMaidShipCleanupCalled(CallbackContext context) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown if (!((Object)localPlayerController == (Object)null) && localPlayerController.isPlayerControlled && !localPlayerController.isTypingChat && !localPlayerController.inTerminalMenu && (!((NetworkBehaviour)localPlayerController).IsServer || localPlayerController.isHostPlayerObject) && !ConfigSettings.UseOnlyTerminal.Key.Value) { if (!StartOfRound.Instance.shipHasLanded && !StartOfRound.Instance.inShipPhase) { ShipMaid.Log("Ship Has Not Landed and Not In Ship Phase, do not cleanup"); return; } ShipMaid.Log("Cleanup Ship"); LootOrganizingFunctions.OrganizeShipLoot(); } } private static void SubscribeToEvents() { if (ShipMaid.InputActionsInstance.ShipCleanupKey != null) { ShipMaid.InputActionsInstance.ShipCleanupKey.Enable(); ShipMaid.InputActionsInstance.ShipCleanupKey.performed += OnShipMaidShipCleanupCalled; } if (ShipMaid.InputActionsInstance.StorageCleanupKey != null) { ShipMaid.InputActionsInstance.StorageCleanupKey.Enable(); ShipMaid.InputActionsInstance.StorageCleanupKey.performed += OnShipMaidClosetCleanupCalled; } if (ShipMaid.InputActionsInstance.LocationOverrideKey != null) { ShipMaid.InputActionsInstance.LocationOverrideKey.Enable(); ShipMaid.InputActionsInstance.LocationOverrideKey.performed += OnShipMaidDropAndSetObjectTypePositionCalled; } } } [BepInPlugin("ShipMaid", "ShipMaid", "4.0.9")] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class ShipMaid : BaseUnityPlugin { public static ShipMaid instance; public static ShipMaidFunctions smf = new ShipMaidFunctions(); internal static InputUtilsKeybinds InputActionsInstance = new InputUtilsKeybinds(); private const string GUID = "ShipMaid"; private const string NAME = "ShipMaid"; private const string VERSION = "4.0.9"; public static void Log(string message) { ((BaseUnityPlugin)instance).Logger.LogInfo((object)message); } public static void LogError(string message) { ((BaseUnityPlugin)instance).Logger.LogError((object)message); } private void Awake() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) instance = this; ConfigSettings.BindConfigSettings(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin ShipMaid is loaded!"); new Harmony("ShipMaid").PatchAll(Assembly.GetExecutingAssembly()); } } [HarmonyPatch] internal class ShipMaidFunctions { public static List<GrabbableObjectPositionHelper> GrabbablesPositions = new List<GrabbableObjectPositionHelper>(); public static List<GrabbableObjectPositionHelperShotgun> GrabbablesPositionsShotgun = new List<GrabbableObjectPositionHelperShotgun>(); public static Vector3 OneHandedPosition = new Vector3(UnsetPosition.x, UnsetPosition.y, UnsetPosition.z); public static Vector3 TwoHandedPosition = new Vector3(UnsetPosition.x, UnsetPosition.y, UnsetPosition.z); public static Vector3 UnsetPosition = new Vector3(-9f, -9f, -9f); internal static void DropAndSetObjectTypePosition() { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02fa: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) //IL_02cb: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Unknown result type (might be due to invalid IL or missing references) GrabbableObject obj = GetCurrentlyHeldObject(); if ((Object)(object)obj != (Object)null) { string text = ((Object)obj).name; if (text.Contains("(Clone)")) { text = text.Substring(0, text.IndexOf("(Clone)")); } HUDManager.Instance.DisplayGlobalNotification("Setting object location for " + text); Vector3 position = ((Component)obj).gameObject.transform.position; ShotgunItem shotgun = default(ShotgunItem); ref ShotgunItem reference = ref shotgun; GrabbableObject obj2 = obj; reference = (ShotgunItem)(object)((obj2 is ShotgunItem) ? obj2 : null); if (shotgun != null && GrabbablesPositionsShotgun.Where((GrabbableObjectPositionHelperShotgun o) => o.objName == ((Object)obj).name && shotgun.shellsLoaded == o.AmmoQuantity).Any()) { GrabbablesPositionsShotgun.Where((GrabbableObjectPositionHelperShotgun o) => o.objName == ((Object)shotgun).name && shotgun.shellsLoaded == o.AmmoQuantity).First().PlacementPosition = new Vector3(position.x, position.y, position.z); GrabbableObjectPositionHelperShotgun shotgunPositionHelper = new GrabbableObjectPositionHelperShotgun(((Object)obj).name, position, shotgun.shellsLoaded); ConfigSettings.ShotgunPlacementOverrideLocation.AddOrUpdateObjectPositionSetting(shotgunPositionHelper); ((BaseUnityPlugin)ShipMaid.instance).Config.Save(); } else { GrabbableObject obj3 = obj; ShotgunItem val = (ShotgunItem)(object)((obj3 is ShotgunItem) ? obj3 : null); if (val != null) { GrabbablesPositionsShotgun.Add(new GrabbableObjectPositionHelperShotgun(((Object)obj).name, position, val.shellsLoaded)); GrabbableObjectPositionHelperShotgun shotgunPositionHelper2 = new GrabbableObjectPositionHelperShotgun(((Object)obj).name, position, val.shellsLoaded); ConfigSettings.ShotgunPlacementOverrideLocation.AddOrUpdateObjectPositionSetting(shotgunPositionHelper2); ((BaseUnityPlugin)ShipMaid.instance).Config.Save(); } } if (GrabbablesPositions.Where((GrabbableObjectPositionHelper o) => o.objName == ((Object)obj).name).Any()) { GrabbablesPositions.Where((GrabbableObjectPositionHelper o) => o.objName == ((Object)obj).name).First().PlacementPosition = new Vector3(position.x, position.y, position.z); GrabbableObjectPositionHelper objectPositionHelper = new GrabbableObjectPositionHelper(((Object)obj).name, position); ConfigSettings.ItemPlacementOverrideLocation.AddOrUpdateObjectPositionSetting(objectPositionHelper); ((BaseUnityPlugin)ShipMaid.instance).Config.Save(); } else { GrabbablesPositions.Add(new GrabbableObjectPositionHelper(((Object)obj).name, position)); GrabbableObjectPositionHelper objectPositionHelper2 = new GrabbableObjectPositionHelper(((Object)obj).name, position); ConfigSettings.ItemPlacementOverrideLocation.AddOrUpdateObjectPositionSetting(objectPositionHelper2); ((BaseUnityPlugin)ShipMaid.instance).Config.Save(); } if (obj.itemProperties.twoHanded) { TwoHandedPosition = new Vector3(position.x, position.y, position.z); ConfigSettings.TwoHandedItemPlacementOverrideLocation.SetVector3(TwoHandedPosition); ((BaseUnityPlugin)ShipMaid.instance).Config.Save(); } else { OneHandedPosition = new Vector3(position.x, position.y, position.z); ConfigSettings.OneHandedItemPlacementOverrideLocation.SetVector3(OneHandedPosition); ((BaseUnityPlugin)ShipMaid.instance).Config.Save(); } } else { ShipMaid.LogError("Failed to get held object"); } } internal static GrabbableObject GetCurrentlyHeldObject() { if ((Object)(object)Keybinds.localPlayerController != (Object)null) { for (int i = 0; i < Keybinds.localPlayerController.ItemSlots.Count(); i++) { if (Keybinds.localPlayerController.ItemSlots[i].isHeld && !Keybinds.localPlayerController.ItemSlots[i].isPocketed) { return Keybinds.localPlayerController.ItemSlots[i]; } } } return null; } internal static GrabbableObjectPositionHelper GetObjectPositionTarget(GrabbableObject obj) { if (GrabbablesPositions.Where((GrabbableObjectPositionHelper o) => o.objName == ((Object)obj).name).Any()) { return GrabbablesPositions.Where((GrabbableObjectPositionHelper o) => o.objName == ((Object)obj).name).First(); } return null; } internal static GrabbableObjectPositionHelperShotgun GetObjectPositionTargetShotgun(ShotgunItem obj) { if (GrabbablesPositionsShotgun.Where((GrabbableObjectPositionHelperShotgun o) => o.objName == ((Object)obj).name && obj.shellsLoaded == o.AmmoQuantity).Any()) { return GrabbablesPositionsShotgun.Where((GrabbableObjectPositionHelperShotgun o) => o.objName == ((Object)obj).name && obj.shellsLoaded == o.AmmoQuantity).First(); } return null; } internal static Vector3? GetOneHandedPositionTarget() { //IL_0000: 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_0011: Unknown result type (might be due to invalid IL or missing references) if (OneHandedPosition != UnsetPosition) { return OneHandedPosition; } return null; } internal static Vector3? GetTwoHandedPositionTarget() { //IL_0000: 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_0011: Unknown result type (might be due to invalid IL or missing references) if (TwoHandedPosition != UnsetPosition) { return TwoHandedPosition; } return null; } internal static void initItemLocations() { //IL_0385: Unknown result type (might be due to invalid IL or missing references) //IL_0387: Unknown result type (might be due to invalid IL or missing references) //IL_0453: Unknown result type (might be due to invalid IL or missing references) //IL_0455: Unknown result type (might be due to invalid IL or missing references) //IL_0329: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_03dd: Unknown result type (might be due to invalid IL or missing references) //IL_03e2: Unknown result type (might be due to invalid IL or missing references) //IL_04a7: Unknown result type (might be due to invalid IL or missing references) //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_03ff: Unknown result type (might be due to invalid IL or missing references) //IL_0404: Unknown result type (might be due to invalid IL or missing references) //IL_04c9: Unknown result type (might be due to invalid IL or missing references) //IL_04ce: Unknown result type (might be due to invalid IL or missing references) List<string> strings = ConfigSettings.ClosetLocationOverride.GetStrings(ConfigSettings.ClosetLocationOverride.Key.Value); List<GrabbableObject> list = new HangarShipHelper().FindAllScrapShip(); if (ConfigSettings.OrganizeShotgunByAmmo.Key.Value) { List<GrabbableObjectPositionHelperShotgun> objectPositionList = ConfigSettings.ShotgunPlacementOverrideLocation.GetObjectPositionList(ConfigSettings.ShotgunPlacementOverrideLocation.Key.Value); if (objectPositionList.Count > 0 && objectPositionList.First().objName != "name") { foreach (GrabbableObjectPositionHelperShotgun item in objectPositionList) { GrabbablesPositionsShotgun.Add(item); } } else { ShotgunItem shotgun = default(ShotgunItem); foreach (GrabbableObject obj2 in list) { ref ShotgunItem reference = ref shotgun; GrabbableObject obj5 = obj2; reference = (ShotgunItem)(object)((obj5 is ShotgunItem) ? obj5 : null); if (shotgun == null || strings.Where((string ifsc) => ifsc.Equals(((Object)obj2).name)).Any()) { continue; } if (GrabbablesPositionsShotgun.Where((GrabbableObjectPositionHelperShotgun o) => o.objName == ((Object)shotgun).name && o.AmmoQuantity == shotgun.shellsLoaded).Any()) { GrabbablesPositionsShotgun.Where((GrabbableObjectPositionHelperShotgun o) => o.objName == ((Object)obj2).name && o.AmmoQuantity == shotgun.shellsLoaded).First().PlacementPosition = ((Component)obj2).gameObject.transform.position; } else { GrabbablesPositionsShotgun.Add(new GrabbableObjectPositionHelperShotgun(((Object)obj2).name, ((Component)obj2).gameObject.transform.position, shotgun.shellsLoaded)); } } } } if (ConfigSettings.UseItemTypePlacementOverrides.Key.Value) { List<GrabbableObjectPositionHelper> objectPositionList2 = ConfigSettings.ItemPlacementOverrideLocation.GetObjectPositionList(ConfigSettings.ItemPlacementOverrideLocation.Key.Value); if (objectPositionList2.Count > 0 && objectPositionList2.First().objName != "name") { foreach (GrabbableObjectPositionHelper item2 in objectPositionList2) { GrabbablesPositions.Add(item2); } } else { foreach (GrabbableObject obj3 in list) { if (strings.Where((string ifsc) => ifsc.Equals(((Object)obj3).name)).Any()) { continue; } if (GrabbablesPositions.Where((GrabbableObjectPositionHelper o) => o.objName == ((Object)obj3).name).Any()) { GrabbablesPositions.Where((GrabbableObjectPositionHelper o) => o.objName == ((Object)obj3).name).First().PlacementPosition = ((Component)obj3).gameObject.transform.position; } else { GrabbablesPositions.Add(new GrabbableObjectPositionHelper(((Object)obj3).name, ((Component)obj3).gameObject.transform.position)); } } } } if (ConfigSettings.UseOneHandedPlacementOverrides.Key.Value) { if (ConfigSettings.OneHandedItemPlacementOverrideLocation.GetVector3(ConfigSettings.OneHandedItemPlacementOverrideLocation.Key.Value, out var resultVector)) { OneHandedPosition = resultVector; } else { foreach (GrabbableObject obj4 in list) { if (!strings.Where((string ifsc) => ifsc.Equals(((Object)obj4).name)).Any() && !obj4.itemProperties.twoHanded && OneHandedPosition == UnsetPosition) { OneHandedPosition = ((Component)obj4).gameObject.transform.position; } } } } if (!ConfigSettings.UseTwoHandedPlacementOverrides.Key.Value) { return; } if (ConfigSettings.TwoHandedItemPlacementOverrideLocation.GetVector3(ConfigSettings.TwoHandedItemPlacementOverrideLocation.Key.Value, out var resultVector2)) { TwoHandedPosition = resultVector2; return; } foreach (GrabbableObject obj in list) { if (!strings.Where((string ifsc) => ifsc.Equals(((Object)obj).name)).Any() && obj.itemProperties.twoHanded && TwoHandedPosition == UnsetPosition) { TwoHandedPosition = ((Component)obj).gameObject.transform.position; break; } } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "ShipMaid"; public const string PLUGIN_NAME = "ShipMaid"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace ShipMaid.Patchers { public class CommandInfo { public string Category { get; set; } public string Description { get; set; } public Func<string> DisplayTextSupplier { get; set; } public string Title { get; set; } public TerminalNode TriggerNode { get; set; } } public static class ShipMaidTerminalCommands { public static string PerformCleanup() { ShipMaid.Log("Perform Cleanup Called from terminal"); LootOrganizingFunctions.OrganizeShipLoot(); return "Cleaning Ship\n\n"; } public static string PerformStorageClosetCleanup() { ShipMaid.Log("Perform Storage Cleanup Called from terminal"); LootOrganizingFunctions.OrganizeStorageCloset(); return "Cleaning Storage\n\n"; } } public static class TerminalExtensions { public static T[] Add<T>(this T[] array, T newItem) { int num = array.Length + 1; Array.Resize(ref array, num); array[num - 1] = newItem; return array; } public static TerminalKeyword CreateTerminalKeyword(string word, bool isVerb = false, TerminalNode triggeringNode = null) { TerminalKeyword obj = ScriptableObject.CreateInstance<TerminalKeyword>(); obj.word = word.ToLower(); obj.isVerb = isVerb; obj.specialKeywordResult = triggeringNode; return obj; } public static TerminalNode CreateTerminalNode(string displayText, bool clearPreviousText = false, string terminalEvent = "") { TerminalNode obj = ScriptableObject.CreateInstance<TerminalNode>(); obj.displayText = displayText; obj.clearPreviousText = clearPreviousText; obj.terminalEvent = terminalEvent; return obj; } } [HarmonyPatch(typeof(Terminal))] internal class TerminalPatcher { public static List<CommandInfo> Commands = new List<CommandInfo> { new CommandInfo { Title = "cleanup", Category = "ShipMaid", TriggerNode = TerminalExtensions.CreateTerminalNode("cleanup", clearPreviousText: true), Description = "Ship Maid Ship Cleanup", DisplayTextSupplier = ShipMaidTerminalCommands.PerformCleanup }, new CommandInfo { Title = "cleanup storage", Category = "ShipMaid", TriggerNode = TerminalExtensions.CreateTerminalNode("cleanup storage", clearPreviousText: true), Description = "Ship Maid Storage Cleanup", DisplayTextSupplier = ShipMaidTerminalCommands.PerformStorageClosetCleanup } }; public static Terminal Terminal; [HarmonyPatch("Awake")] [HarmonyPostfix] public static void Awake(ref Terminal __instance) { Terminal = __instance; ShipMaid.Log("Adding Terminal Commands"); foreach (CommandInfo command in Commands) { Terminal.terminalNodes.allKeywords = Terminal.terminalNodes.allKeywords.Add(TerminalExtensions.CreateTerminalKeyword(command.Title, isVerb: false, command.TriggerNode)); } } [HarmonyPatch("BeginUsingTerminal")] [HarmonyPrefix] public static void OnBeginUsing(ref Terminal __instance) { } [HarmonyPatch("QuitTerminal")] [HarmonyPostfix] public static void OnQuitTerminal(ref Terminal __instance) { } [HarmonyPatch("TextChanged")] [HarmonyPostfix] public static void OnTextChanged(ref Terminal __instance, string newText) { if (newText.Trim().Length >= __instance.textAdded) { newText.Substring(newText.Length - __instance.textAdded); } } [HarmonyPatch("ParsePlayerSentence")] [HarmonyPostfix] public static void ParsePlayerSentence(ref Terminal __instance, TerminalNode __result) { CommandInfo commandInfo = Commands.FirstOrDefault((CommandInfo cI) => (Object)(object)cI.TriggerNode == (Object)(object)__result); if (commandInfo != null) { __result.displayText = commandInfo?.DisplayTextSupplier(); } __instance.screenText.text.Substring(__instance.screenText.text.Length - __instance.textAdded); } } } namespace ShipMaid.ObjectHelpers { public class GrabbableObjectPositionHelper { public string objName; public Vector3 PlacementPosition; public GrabbableObjectPositionHelper(string name, Vector3 pos) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) objName = name; PlacementPosition = pos; } public GrabbableObjectPositionHelper(string name, float xPos, float yPos, float zPos) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) objName = name; PlacementPosition = new Vector3(xPos, yPos, zPos); } } public class GrabbableObjectPositionHelperShotgun { public int AmmoQuantity; public string objName; public Vector3 PlacementPosition; public GrabbableObjectPositionHelperShotgun(string name, Vector3 pos, int ammoQuantity) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) objName = name; PlacementPosition = pos; AmmoQuantity = ammoQuantity; } public GrabbableObjectPositionHelperShotgun(string name, float xPos, float yPos, float zPos, int ammoQuantity) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) objName = name; PlacementPosition = new Vector3(xPos, yPos, zPos); AmmoQuantity = ammoQuantity; } } } namespace ShipMaid.Networking { internal class NetworkFunctions { public class NetworkingObjectManager : NetworkBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static HandleNamedMessageDelegate <>9__3_0; internal void <NetworkManagerInit>b__3_0(ulong senderClientId, FastBufferReader reader) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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) if (senderClientId != Keybinds.localPlayerController.playerClientId) { NetworkObjectReference val = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref val, default(ForNetworkSerializable)); Vector3 placementPosition = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementPosition); Quaternion placementRotation = default(Quaternion); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementRotation); bool shipParent = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref shipParent, default(ForPrimitives)); NetworkObject val2 = default(NetworkObject); if (((NetworkObjectReference)(ref val)).TryGet(ref val2, (NetworkManager)null)) { MakeObjectFall(((Component)val2).GetComponent<GrabbableObject>(), placementPosition, placementRotation, shipParent); } } } } public static void MakeObjectFall(GrabbableObject obj, Vector3 placementPosition, Quaternion placementRotation, bool shipParent) { //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //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) GameObject val = GameObject.Find("/Environment/HangarShip"); GameObject val2 = GameObject.Find("/Environment/HangarShip/StorageCloset"); _ = string.Empty; if (shipParent) { if ((Object)(object)((Component)obj).gameObject.transform.GetParent() == (Object)null || ((Object)((Component)obj).gameObject.transform.GetParent()).name != "HangarShip") { ((Component)obj).gameObject.transform.SetParent(val.transform); } } else if ((Object)(object)((Component)obj).gameObject.transform.GetParent() == (Object)null || ((Object)((Component)obj).gameObject.transform.GetParent()).name != "StorageCloset") { ((Component)obj).gameObject.transform.SetParent(val2.transform); } ((Component)obj).gameObject.transform.SetPositionAndRotation(placementPosition, placementRotation); obj.hasHitGround = false; obj.startFallingPosition = placementPosition; obj.floorYRot = -1; if ((Object)(object)((Component)obj).transform.parent != (Object)null) { obj.startFallingPosition = ((Component)obj).transform.parent.InverseTransformPoint(obj.startFallingPosition); } obj.FallToGround(false); obj.floorYRot = -1; } [ClientRpc] public static void MakeObjectFallClientRpc(NetworkObjectReference obj, Vector3 placementPosition, Quaternion placementRotation, bool shipParent) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) NetworkManager singleton = NetworkManager.Singleton; if (singleton == null || !singleton.IsListening) { return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(256, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<NetworkObjectReference>(ref obj, default(ForNetworkSerializable)); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementPosition); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementRotation); ((FastBufferWriter)(ref val)).WriteValueSafe<bool>(ref shipParent, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("MakeObjectFall", val, (NetworkDelivery)2); NetworkObject val2 = default(NetworkObject); if (!((NetworkObjectReference)(ref obj)).TryGet(ref val2, (NetworkManager)null)) { return; } GrabbableObject obj2 = default(GrabbableObject); if (((Component)val2).TryGetComponent<GrabbableObject>(ref obj2)) { if (!((NetworkBehaviour)Keybinds.localPlayerController).IsOwner) { MakeObjectFall(obj2, placementPosition, placementRotation, shipParent); } } else { ShipMaid.LogError("Failed to get grabbable object ref from network object - ClientRpc"); } } [ServerRpc] public static void MakeObjectFallServerRpc(NetworkObjectReference obj, Vector3 placementPosition, Quaternion placementRotation, bool shipParent) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Invalid comparison between Unknown and I4 //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) NetworkManager singleton = NetworkManager.Singleton; if (singleton == null) { ShipMaid.LogError("Network Manager == null"); return; } if (!singleton.IsListening) { ShipMaid.LogError("Network Manager not listening"); return; } if (((NetworkBehaviour)Keybinds.localPlayerController).OwnerClientId != singleton.LocalClientId) { if ((int)singleton.LogLevel <= 1) { ShipMaid.LogError("Only the owner can invoke a ServerRpc that requires ownership!"); } return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(256, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<NetworkObjectReference>(ref obj, default(ForNetworkSerializable)); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementPosition); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementRotation); ((FastBufferWriter)(ref val)).WriteValueSafe<bool>(ref shipParent, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("MakeObjectFall", val, (NetworkDelivery)2); NetworkObject val2 = default(NetworkObject); if (((NetworkObjectReference)(ref obj)).TryGet(ref val2, (NetworkManager)null)) { GrabbableObject obj2 = default(GrabbableObject); if (((Component)val2).TryGetComponent<GrabbableObject>(ref obj2)) { MakeObjectFall(obj2, placementPosition, placementRotation, shipParent); } else { ShipMaid.LogError("Failed to get grabbable object ref from network object - ServerRpc"); } } } public static void NetworkManagerInit() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown ShipMaid.Log("Registering named message"); CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager; object obj = <>c.<>9__3_0; if (obj == null) { HandleNamedMessageDelegate val = delegate(ulong senderClientId, FastBufferReader reader) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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) if (senderClientId != Keybinds.localPlayerController.playerClientId) { NetworkObjectReference val2 = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref val2, default(ForNetworkSerializable)); Vector3 placementPosition = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementPosition); Quaternion placementRotation = default(Quaternion); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementRotation); bool shipParent = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref shipParent, default(ForPrimitives)); NetworkObject val3 = default(NetworkObject); if (((NetworkObjectReference)(ref val2)).TryGet(ref val3, (NetworkManager)null)) { MakeObjectFall(((Component)val3).GetComponent<GrabbableObject>(), placementPosition, placementRotation, shipParent); } } }; <>c.<>9__3_0 = val; obj = (object)val; } customMessagingManager.RegisterNamedMessageHandler("MakeObjectFall", (HandleNamedMessageDelegate)obj); } [ClientRpc] public static void RunClientRpc(NetworkObjectReference obj, Vector3 placementPosition, Quaternion placementRotation, bool shipParent) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //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) MakeObjectFallServerRpc(obj, placementPosition, placementRotation, shipParent); } } } } namespace ShipMaid.InputUtils { internal class InputUtilsKeybinds : LcInputActions { [InputAction("<Keyboard>/j", Name = "Set Location Override")] public InputAction LocationOverrideKey { get; set; } [InputAction("<Keyboard>/m", Name = "Cleanup Ship")] public InputAction ShipCleanupKey { get; set; } [InputAction("<Keyboard>/n", Name = "Cleanup Storage")] public InputAction StorageCleanupKey { get; set; } } } namespace ShipMaid.HelperFunctions { public class LootOrganizingFunctions { private static List<string> ItemsForStorageCloset = ConfigSettings.ClosetLocationOverride.GetStrings(ConfigSettings.ClosetLocationOverride.Key.Value); private static List<string> SortingBlacklist = ConfigSettings.SortingLocationBlacklist.GetStrings(ConfigSettings.SortingLocationBlacklist.Key.Value); public static void OrganizeShipLoot() { StorageClosetHelper storageClosetHelper = new StorageClosetHelper(); List<GrabbableObject> list = new HangarShipHelper().ObjectsInShip(); foreach (GrabbableObject item in storageClosetHelper.GetObjectsInStorageCloset()) { if (list.Contains(item)) { list.Remove(item); } } List<GrabbableObject> list2 = new List<GrabbableObject>(); List<GrabbableObject> list3 = new List<GrabbableObject>(); foreach (GrabbableObject item2 in list) { if (item2.itemProperties.twoHanded) { list2.Add(item2); } else { list3.Add(item2); } } OrganizeItems(storageClosetHelper, list3, twoHanded: false); OrganizeItems(storageClosetHelper, list2, twoHanded: true); } public static void OrganizeStorageCloset() { StorageClosetHelper storageClosetHelper = new StorageClosetHelper(); List<GrabbableObject> objectsInStorageCloset = storageClosetHelper.GetObjectsInStorageCloset(); List<string> list = new List<string>(); foreach (GrabbableObject item in objectsInStorageCloset) { if (!list.Contains(((Object)item).name)) { list.Add(((Object)item).name); } } foreach (string objectType in list) { List<GrabbableObject> list2 = objectsInStorageCloset.Where((GrabbableObject obj) => ((Object)obj).name.Contains(objectType)).ToList(); if ((Object)(object)((IEnumerable<GrabbableObject>)list2).FirstOrDefault((Func<GrabbableObject, bool>)((GrabbableObject obj) => !obj.isHeld)) != (Object)null) { storageClosetHelper.PlaceStorageObjectOnShelve(list2); } } } private static float GetXOffsetFromScrapValue(GrabbableObject obj, float highestScrapValue, float maxXOffset) { if (obj.scrapValue != 0 && highestScrapValue != 0f) { return (float)(obj.scrapValue - 10) / highestScrapValue * maxXOffset; } ShipMaid.Log($"Refraining from breaking math - HighestScrapValue {highestScrapValue} - obj.scrapValue {obj.scrapValue}"); return 0f; } private static void OrganizeItems(StorageClosetHelper sch, List<GrabbableObject> objects, bool twoHanded) { //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_03a5: Unknown result type (might be due to invalid IL or missing references) //IL_03b0: Unknown result type (might be due to invalid IL or missing references) //IL_03bb: Unknown result type (might be due to invalid IL or missing references) //IL_0332: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Unknown result type (might be due to invalid IL or missing references) //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_0382: Unknown result type (might be due to invalid IL or missing references) //IL_0399: Unknown result type (might be due to invalid IL or missing references) //IL_039b: Unknown result type (might be due to invalid IL or missing references) //IL_0437: Unknown result type (might be due to invalid IL or missing references) //IL_071d: Unknown result type (might be due to invalid IL or missing references) //IL_0733: Unknown result type (might be due to invalid IL or missing references) //IL_0749: Unknown result type (might be due to invalid IL or missing references) //IL_075f: Unknown result type (might be due to invalid IL or missing references) //IL_054b: Unknown result type (might be due to invalid IL or missing references) //IL_0550: Unknown result type (might be due to invalid IL or missing references) //IL_07e9: Unknown result type (might be due to invalid IL or missing references) //IL_06cf: Unknown result type (might be due to invalid IL or missing references) //IL_06ea: Unknown result type (might be due to invalid IL or missing references) //IL_0705: Unknown result type (might be due to invalid IL or missing references) //IL_08d3: Unknown result type (might be due to invalid IL or missing references) //IL_08d8: Unknown result type (might be due to invalid IL or missing references) //IL_07f6: Unknown result type (might be due to invalid IL or missing references) //IL_07f8: Unknown result type (might be due to invalid IL or missing references) //IL_07fd: Unknown result type (might be due to invalid IL or missing references) //IL_0816: Unknown result type (might be due to invalid IL or missing references) //IL_0825: Unknown result type (might be due to invalid IL or missing references) //IL_0834: Unknown result type (might be due to invalid IL or missing references) //IL_084f: Unknown result type (might be due to invalid IL or missing references) //IL_0864: Unknown result type (might be due to invalid IL or missing references) //IL_086b: Unknown result type (might be due to invalid IL or missing references) //IL_0872: Unknown result type (might be due to invalid IL or missing references) //IL_0879: Unknown result type (might be due to invalid IL or missing references) //IL_087e: Unknown result type (might be due to invalid IL or missing references) //IL_0897: Unknown result type (might be due to invalid IL or missing references) //IL_08a6: Unknown result type (might be due to invalid IL or missing references) //IL_08b5: Unknown result type (might be due to invalid IL or missing references) //IL_07c5: Unknown result type (might be due to invalid IL or missing references) //IL_07dc: Unknown result type (might be due to invalid IL or missing references) //IL_07e1: Unknown result type (might be due to invalid IL or missing references) //IL_07e6: Unknown result type (might be due to invalid IL or missing references) //IL_08fb: Unknown result type (might be due to invalid IL or missing references) //IL_090a: Unknown result type (might be due to invalid IL or missing references) //IL_0919: Unknown result type (might be due to invalid IL or missing references) //IL_0937: Unknown result type (might be due to invalid IL or missing references) //IL_093c: Unknown result type (might be due to invalid IL or missing references) //IL_093e: Unknown result type (might be due to invalid IL or missing references) //IL_0607: Unknown result type (might be due to invalid IL or missing references) //IL_096d: Unknown result type (might be due to invalid IL or missing references) //IL_0617: Unknown result type (might be due to invalid IL or missing references) HangarShipHelper hangarShipHelper = new HangarShipHelper(); List<string> list = new List<string>(); foreach (GrabbableObject @object in objects) { if (!list.Contains(((Object)@object).name)) { list.Add(((Object)@object).name); } } float num = 0f; float num2 = 2.25f / (float)list.Count; float num3 = 0f; float num4 = 2.75f / (float)list.Count; float num5 = 7f; bool flag = false; float num6 = 0f; float num7 = 0f; if (twoHanded) { if (ConfigSettings.TwoHandedItemLocation.Key.Value == "Front") { num7 = num3; num6 = num2; flag = true; } else { num7 = num5; num6 = num4; } } else if (ConfigSettings.TwoHandedItemLocation.Key.Value == "Front") { num6 = num4; num7 = num5; } else { num7 = num3; num6 = num2; flag = true; } int num8 = 0; Vector3 val2 = default(Vector3); Vector3 valueOrDefault = default(Vector3); Quaternion val6 = default(Quaternion); foreach (string objectType in list) { List<GrabbableObject> list2 = objects.Where((GrabbableObject obj) => ((Object)obj).name.Contains(objectType)).ToList(); if (ItemsForStorageCloset.Where(objectType.Contains).Any()) { sch.PlaceStorageObjectOnShelve(list2); continue; } if (SortingBlacklist.Where(objectType.Contains).Any()) { continue; } GrabbableObject val = ((IEnumerable<GrabbableObject>)list2).FirstOrDefault((Func<GrabbableObject, bool>)((GrabbableObject obj) => !obj.isHeld)); if (!((Object)(object)val != (Object)null)) { continue; } List<float> list3 = new List<float>(); if (ConfigSettings.OrganizationTechnique.Key.Value == "Stack" && !ConfigSettings.UseItemTypePlacementOverrides.Key.Value && !ConfigSettings.UseOneHandedPlacementOverrides.Key.Value && !ConfigSettings.UseTwoHandedPlacementOverrides.Key.Value) { Random random = new Random(); num = (float)random.NextDouble() * (float)random.Next(-1, 2); if (ConfigSettings.ItemGrouping.Key.Value == "Loose") { num *= 2f; } } GrabbableObjectPositionHelper objectPositionTarget = ShipMaidFunctions.GetObjectPositionTarget(val); if (objectPositionTarget != null && objectPositionTarget != null && ConfigSettings.UseItemTypePlacementOverrides.Key.Value) { ShipMaid.Log("Setting position from memory for " + ((Object)val).name); val2 = objectPositionTarget.PlacementPosition; } else { Vector3? twoHandedPositionTarget = ShipMaidFunctions.GetTwoHandedPositionTarget(); int num9; if (twoHandedPositionTarget.HasValue) { valueOrDefault = twoHandedPositionTarget.GetValueOrDefault(); num9 = (ConfigSettings.UseTwoHandedPlacementOverrides.Key.Value ? 1 : 0); } else { num9 = 0; } if (((uint)num9 & (twoHanded ? 1u : 0u)) != 0) { ShipMaid.Log($"Setting Two Handed position from memory for {((Object)val).name} - {valueOrDefault.x},{valueOrDefault.y},{valueOrDefault.z}"); val2 = valueOrDefault; } else { twoHandedPositionTarget = ShipMaidFunctions.GetOneHandedPositionTarget(); if (twoHandedPositionTarget.HasValue) { Vector3 valueOrDefault2 = twoHandedPositionTarget.GetValueOrDefault(); if (ConfigSettings.UseOneHandedPlacementOverrides.Key.Value && !twoHanded) { ShipMaid.Log($"Setting One Handed position from memory for {((Object)val).name} - {valueOrDefault2.x},{valueOrDefault2.y},{valueOrDefault2.z}"); val2 = valueOrDefault2; goto IL_0449; } } ((Vector3)(ref val2))..ctor(hangarShipHelper.GetShipCenterLocation().x, hangarShipHelper.GetShipCenterLocation().y, hangarShipHelper.GetShipCenterLocation().z); if (ConfigSettings.ItemGrouping.Key.Value == "Loose") { val2.z -= num6 * (float)num8; } else { val2.z -= num6 * (float)num8 * 0.1f + num6 * 0.9f * (float)list.Count; } if (!flag) { val2.z += 0.5f; } val2.x = hangarShipHelper.GetShipCenterLocation().x + num7; } } goto IL_0449; IL_0449: foreach (GrabbableObject item in list2) { if (item.isHeld) { continue; } if (((Object)((Component)item).transform.parent).name.Contains("Wheelbarrow")) { ShipMaid.Log("Ignoring " + ((Object)item).name + " that appears to be located in a Wheelbarrow/Shopping Cart"); continue; } ShotgunItem val3 = (ShotgunItem)(object)((val is ShotgunItem) ? val : null); if (val3 != null) { ShipMaid.Log("Item is Shotgun - " + ((Object)val3).name); } ShotgunItem val4 = (ShotgunItem)(object)((val is ShotgunItem) ? val : null); if (val4 != null) { GrabbableObjectPositionHelperShotgun objectPositionTargetShotgun = ShipMaidFunctions.GetObjectPositionTargetShotgun(val4); if (objectPositionTargetShotgun != null && objectPositionTargetShotgun != null) { ShipMaid.Log("Item is Shotgun and target retrieved"); } } ShotgunItem val5 = (ShotgunItem)(object)((item is ShotgunItem) ? item : null); if (val5 != null) { GrabbableObjectPositionHelperShotgun objectPositionTargetShotgun2 = ShipMaidFunctions.GetObjectPositionTargetShotgun(val5); if (objectPositionTargetShotgun2 != null && objectPositionTargetShotgun2 != null && ConfigSettings.OrganizeShotgunByAmmo.Key.Value) { int shellsLoaded = val5.shellsLoaded; ShipMaid.Log($"Setting position from memory for {((Object)val).name} - Ammo capacity {shellsLoaded}"); val2 = objectPositionTargetShotgun2.PlacementPosition; } } if (ConfigSettings.OrganizationTechnique.Key.Value == "Value" && !ConfigSettings.UseItemTypePlacementOverrides.Key.Value && !ConfigSettings.UseOneHandedPlacementOverrides.Key.Value && !ConfigSettings.UseTwoHandedPlacementOverrides.Key.Value) { if (flag) { val2.x += GetXOffsetFromScrapValue(item, ScrapHelperFunctions.CalculateHighestScrapValue(hangarShipHelper.ObjectsInShip()), 2.5f); } else { val2.x += GetXOffsetFromScrapValue(item, ScrapHelperFunctions.CalculateHighestScrapValue(hangarShipHelper.ObjectsInShip()), 4f); } while (list3.Contains(val2.x)) { val2.x += 0.1f; } list3.Add(val2.x); } else if (!ConfigSettings.UseItemTypePlacementOverrides.Key.Value && !ConfigSettings.UseOneHandedPlacementOverrides.Key.Value && !ConfigSettings.UseTwoHandedPlacementOverrides.Key.Value) { val2.x += num; } if (ConfigSettings.ItemPlacementOverrideOffsetPosition.GetVector3(ConfigSettings.ItemPlacementOverrideOffsetPosition.Key.Value, out var resultVector) && (ConfigSettings.UseOneHandedPlacementOverrides.Key.Value || ConfigSettings.UseTwoHandedPlacementOverrides.Key.Value || ConfigSettings.UseItemTypePlacementOverrides.Key.Value)) { Random random2 = new Random(); val2.x += (float)random2.NextDouble() * resultVector.x; val2.y += (float)random2.NextDouble() * resultVector.y; val2.z += (float)random2.NextDouble() * resultVector.z; } ((Quaternion)(ref val6))..ctor(((Component)((NetworkBehaviour)item).NetworkObject).transform.rotation.x, ((Component)((NetworkBehaviour)item).NetworkObject).transform.rotation.y, ((Component)((NetworkBehaviour)item).NetworkObject).transform.rotation.z, ((Component)((NetworkBehaviour)item).NetworkObject).transform.rotation.w); if (ConfigSettings.ItemPlacementOverrideOffsetRotation.GetFloat(ConfigSettings.ItemPlacementOverrideOffsetRotation.Key.Value, out var resultFloat) && (ConfigSettings.UseOneHandedPlacementOverrides.Key.Value || ConfigSettings.UseTwoHandedPlacementOverrides.Key.Value || ConfigSettings.UseItemTypePlacementOverrides.Key.Value)) { Random random3 = new Random(); val6 *= Quaternion.Euler(0f, (float)random3.NextDouble() * resultFloat, 0f); } if (!hangarShipHelper.IsPositionWithinShip(val2)) { Vector3 val7 = hangarShipHelper.AdjustPositionWithinShip(val2); ShipMaid.Log($"Ship loot detected outside of ship - {((Object)item).name} - {val2.x},{val2.y},{val2.z} - ship bounds {HangarShipHelper.GetDebugLocationShip(((Component)item).gameObject.transform.position)}"); val2 = new Vector3(val7.x, val7.y, val7.z); ShipMaid.Log($"Corrected to- {((Object)item).name} - {val2.x},{val2.y},{val2.z}"); } if (!PositionHelperFunctions.SameLocation(((Component)item).transform.position, val2)) { ShipMaid.Log($"Moving item - {((Object)item).name} to {val2.x},{val2.y},{val2.z}"); NetworkFunctions.NetworkingObjectManager.RunClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)item).NetworkObject), val2, val6, shipParent: true); if (!hangarShipHelper.IsObjectWithinShip(item)) { ShipMaid.Log("Found item outside of the ship - " + ((Object)item).name + " - where ship bounds are " + HangarShipHelper.GetDebugLocationShip(((Component)item).gameObject.transform.position)); } } } num8++; } } } public static class PositionHelperFunctions { public static Vector3 AdjustPositionWithinBounds(Vector3 targetPosition, Vector3 min, Vector3 max) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) if (targetPosition.x > max.x) { targetPosition.x = max.x; } if (targetPosition.y > max.y) { targetPosition.y = max.y; } if (targetPosition.z > max.z) { targetPosition.z = max.z; } if (targetPosition.x < min.x) { targetPosition.x = min.x; } if (targetPosition.y < min.y) { targetPosition.y = min.y; } if (targetPosition.z < min.z) { targetPosition.z = min.z; } return targetPosition; } public static string DebugQuaterion(Quaternion rot) { return rot.x + "," + rot.y + "," + rot.z + "," + rot.w; } public static string DebugVector3(Vector3 pos) { return pos.x + "," + pos.y + "," + pos.z; } public static bool IsPositionWithinBounds(Vector3 testPosition, Vector3 boundingPositionMin, Vector3 boundingPositionMax) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (testPosition.x <= boundingPositionMax.x && testPosition.y <= boundingPositionMax.y && testPosition.z <= boundingPositionMax.z && testPosition.x >= boundingPositionMin.x && testPosition.y >= boundingPositionMin.y) { return testPosition.z >= boundingPositionMin.z; } return false; } public static bool NearLocation(float f1, float f2, float offset) { if (f1 < f2 + offset) { return f1 > f2 - offset; } return false; } public static bool SameLocation(Vector3 pos1, Vector3 pos2) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (NearLocation(pos1.x, pos2.x, 0.01f)) { return NearLocation(pos1.z, pos2.z, 0.01f); } return false; } } public static class ScrapHelperFunctions { private static void ReportScrapList(string where) { if (where == "ship") { CollectionExtensions.Do<GrabbableObject>((IEnumerable<GrabbableObject>)new HangarShipHelper().ObjectsInShip(), (Action<GrabbableObject>)delegate(GrabbableObject scrap) { ShipMaid.Log($"{((Object)scrap).name} - ${scrap.scrapValue} - ${scrap.targetFloorPosition.x}- ${scrap.targetFloorPosition.y}- ${scrap.targetFloorPosition.z}"); }); } else if (where == "closet") { CollectionExtensions.Do<GrabbableObject>((IEnumerable<GrabbableObject>)new StorageClosetHelper().GetObjectsInStorageCloset(), (Action<GrabbableObject>)delegate(GrabbableObject scrap) { ShipMaid.Log($"{((Object)scrap).name} - ${scrap.scrapValue} - ${scrap.targetFloorPosition.x}- ${scrap.targetFloorPosition.y}- ${scrap.targetFloorPosition.z}"); }); } } public static float CalculateHighestScrapValue(List<GrabbableObject> objects) { float num = 0f; foreach (GrabbableObject @object in objects) { if ((float)@object.scrapValue > num) { num = @object.scrapValue; } } return num; } internal static List<GrabbableObject> FindAllScrapOnMap() { List<GrabbableObject> list = new List<GrabbableObject>(); GrabbableObject[] array = Object.FindObjectsByType<GrabbableObject>((FindObjectsSortMode)0); foreach (GrabbableObject val in array) { if (!val.isInShipRoom) { list.Add(val); ShipMaid.Log("Found scrap: " + ((Object)val).name); } } return list; } } } namespace ShipMaid.EntityHelpers { public class HangarShipHelper { public static Vector3 ShipBoundsCenter; public static Vector3 ShipBoundsExtents; public static Vector3 ShipBoundsMaxBack; public static Vector3 ShipBoundsMaxFront; public static Vector3 ShipBoundsMinBack; public static Vector3 ShipBoundsMinFront; public static Vector3 ShipCenter; public static Vector3 ShipCenterForPlacement; public static Vector3 ShipCollider; public static Vector3 ShipExtends; public static GameObject ShipObject; public static float XLocationZChange = 4f; public HangarShipHelper() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) ShipObject = GameObject.Find("/Environment/HangarShip"); ShipCenter = ShipObject.transform.position; MeshCollider componentInChildren = GameObject.Find("/Environment/HangarShip/ShipInside").GetComponentInChildren<MeshCollider>(); ShipBoundsCenter = ((Collider)componentInChildren).bounds.m_Center; ShipBoundsExtents = ((Collider)componentInChildren).bounds.m_Extents; ShipCenterForPlacement = new Vector3(ShipCenter.z - 6.25f, ShipCenter.x - 5.25f, ShipCenter.y + 1.66f); Bounds bounds = ((Collider)componentInChildren).bounds; float num = ((Bounds)(ref bounds)).min.x + 1.75f; bounds = ((Collider)componentInChildren).bounds; float y = ((Bounds)(ref bounds)).min.y; bounds = ((Collider)componentInChildren).bounds; ShipBoundsMinBack = new Vector3(num, y, ((Bounds)(ref bounds)).min.z + 0.5f); bounds = ((Collider)componentInChildren).bounds; float num2 = ((Bounds)(ref bounds)).max.x - 2f; bounds = ((Collider)componentInChildren).bounds; float y2 = ((Bounds)(ref bounds)).max.y; bounds = ((Collider)componentInChildren).bounds; ShipBoundsMaxBack = new Vector3(num2, y2, ((Bounds)(ref bounds)).max.z - 0.5f); bounds = ((Collider)componentInChildren).bounds; float num3 = ((Bounds)(ref bounds)).min.x + 1.75f; bounds = ((Collider)componentInChildren).bounds; float y3 = ((Bounds)(ref bounds)).min.y; bounds = ((Collider)componentInChildren).bounds; ShipBoundsMinFront = new Vector3(num3, y3, ((Bounds)(ref bounds)).min.z + 2f); bounds = ((Collider)componentInChildren).bounds; float num4 = ((Bounds)(ref bounds)).max.x - 2f; bounds = ((Collider)componentInChildren).bounds; float y4 = ((Bounds)(ref bounds)).max.y; bounds = ((Collider)componentInChildren).bounds; ShipBoundsMaxFront = new Vector3(num4, y4, ((Bounds)(ref bounds)).max.z - 1.75f); } public static string GetDebugLocationShip(Vector3 targetPosition) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if (targetPosition.x > XLocationZChange) { return $"{ShipBoundsMinBack.x},{ShipBoundsMinBack.y},{ShipBoundsMinBack.z} to {ShipBoundsMaxBack.x},{ShipBoundsMaxBack.y},{ShipBoundsMaxBack.z}"; } return $"{ShipBoundsMinFront.x},{ShipBoundsMinFront.y},{ShipBoundsMinFront.z} to {ShipBoundsMaxFront.x},{ShipBoundsMaxFront.y},{ShipBoundsMaxFront.z}"; } public static NetworkObject GetShipNetworkObject() { return GameObject.Find("/Environment/HangarShip").gameObject.GetComponent<NetworkObject>(); } public static Transform GetShipTransform() { return GameObject.Find("/Environment/HangarShip").gameObject.transform; } public Vector3 AdjustPositionWithinShip(Vector3 targetPosition) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) if (targetPosition.x > XLocationZChange) { return PositionHelperFunctions.AdjustPositionWithinBounds(targetPosition, ShipBoundsMinBack, ShipBoundsMaxBack); } return PositionHelperFunctions.AdjustPositionWithinBounds(targetPosition, ShipBoundsMinFront, ShipBoundsMaxFront); } public List<GrabbableObject> FindAllScrapShip() { List<GrabbableObject> list = new List<GrabbableObject>(); GrabbableObject[] array = Object.FindObjectsByType<GrabbableObject>((FindObjectsSortMode)0); foreach (GrabbableObject val in array) { if (val.isInShipRoom) { list.Add(val); } } return list; } public Vector3 GetShipCenterLocation() { //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_0045: Unknown result type (might be due to invalid IL or missing references) Vector3 position = GameObject.Find("/Environment/HangarShip").transform.position; position.z += -6.25f; position.x += -5.25f; position.y += 1.66f; return position; } public bool IsObjectWithinShip(GrabbableObject obj) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (((Component)obj).gameObject.transform.position.x > XLocationZChange) { return PositionHelperFunctions.IsPositionWithinBounds(((Component)obj).gameObject.transform.position, ShipBoundsMinBack, ShipBoundsMaxBack); } return PositionHelperFunctions.IsPositionWithinBounds(((Component)obj).gameObject.transform.position, ShipBoundsMinFront, ShipBoundsMaxFront); } public bool IsPositionWithinShip(Vector3 position) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) if (position.x > XLocationZChange) { return PositionHelperFunctions.IsPositionWithinBounds(position, ShipBoundsMinBack, ShipBoundsMaxBack); } return PositionHelperFunctions.IsPositionWithinBounds(position, ShipBoundsMinFront, ShipBoundsMaxFront); } public void MoveItemToShip(GrabbableObject obj) { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) obj.hasBeenHeld = true; obj.isInFactory = false; obj.isInShipRoom = true; RoundManager instance = RoundManager.Instance; instance.scrapCollectedInLevel += obj.scrapValue; PlayerStats obj2 = StartOfRound.Instance.gameStats.allPlayerStats[Keybinds.localPlayerController.playerClientId]; obj2.profitable += obj.scrapValue; RoundManager.Instance.CollectNewScrapForThisRound(obj); ((Component)obj).transform.SetParent(ShipObject.transform); obj.OnBroughtToShip(); NetworkFunctions.NetworkingObjectManager.RunClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)obj).NetworkObject), GetShipCenterLocation(), ((Component)obj).transform.rotation, shipParent: true); } public List<GrabbableObject> ObjectsInShip() { return (from obj in ShipObject.GetComponentsInChildren<GrabbableObject>() where ((Object)obj).name != "ClipboardManual" && ((Object)obj).name != "StickyNoteItem" select obj).ToList(); } } public class StorageClosetHelper { public static Vector3 ClosetBoundsMax; public static Vector3 ClosetBoundsMin; private const float StorageLocationXOffsetToShelve = 0.2f; private Vector3 ClosetRotation; private string LastItemPlaced = string.Empty; private float placementLocationAcrossOffset; private int shelveToPlaceOn = 1; private List<Vector3> ShevleListCenter = new List<Vector3>(); private GameObject StorageCloset; private Vector3 StorageLocationEnd; private Vector3 StorageLocationStart; private float StorageLocationXRange; private float StorageLocationXStepItem = 0.2f; private float StorageLocationXStepSize = 0.1f; private float StorageLocationZOffset = 0.2f; private float StorageLocationZRange; public StorageClosetHelper() { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0107: 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_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015b: 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_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02cb: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_030c: Unknown result type (might be due to invalid IL or missing references) StorageCloset = GameObject.Find("/Environment/HangarShip/StorageCloset"); MeshCollider componentInChildren = StorageCloset.GetComponentInChildren<MeshCollider>(); Quaternion rotation = StorageCloset.gameObject.transform.rotation; ClosetRotation = ((Quaternion)(ref rotation)).eulerAngles; Bounds bounds = ((Collider)componentInChildren).bounds; float num = ((Bounds)(ref bounds)).min.x + Mathf.Cos(0.0034906585f); bounds = ((Collider)componentInChildren).bounds; StorageLocationStart = new Vector3(num, 0f, ((Bounds)(ref bounds)).max.z - Mathf.Sin(0.0034906585f) - Mathf.Cos(0.0034906585f)); bounds = ((Collider)componentInChildren).bounds; float num2 = ((Bounds)(ref bounds)).max.x - Mathf.Cos(0.0034906585f); bounds = ((Collider)componentInChildren).bounds; StorageLocationEnd = new Vector3(num2, 0f, ((Bounds)(ref bounds)).min.z - Mathf.Cos(0.0034906585f)); bounds = ((Collider)componentInChildren).bounds; float num3 = ((Bounds)(ref bounds)).min.x + 0.2f; bounds = ((Collider)componentInChildren).bounds; float y = ((Bounds)(ref bounds)).min.y; bounds = ((Collider)componentInChildren).bounds; ClosetBoundsMin = new Vector3(num3, y, ((Bounds)(ref bounds)).min.z); bounds = ((Collider)componentInChildren).bounds; float num4 = ((Bounds)(ref bounds)).max.x - 0.2f; bounds = ((Collider)componentInChildren).bounds; float y2 = ((Bounds)(ref bounds)).max.y; bounds = ((Collider)componentInChildren).bounds; ClosetBoundsMax = new Vector3(num4, y2, ((Bounds)(ref bounds)).max.z); bounds = ((Collider)componentInChildren).bounds; float z = ((Bounds)(ref bounds)).max.z; bounds = ((Collider)componentInChildren).bounds; StorageLocationZRange = z - ((Bounds)(ref bounds)).min.z; bounds = ((Collider)componentInChildren).bounds; float x = ((Bounds)(ref bounds)).max.x; bounds = ((Collider)componentInChildren).bounds; StorageLocationXRange = x - ((Bounds)(ref bounds)).min.x; List<Vector3> shevleListCenter = ShevleListCenter; bounds = ((Collider)componentInChildren).bounds; float x2 = ((Bounds)(ref bounds)).center.x; bounds = ((Collider)componentInChildren).bounds; shevleListCenter.Add(new Vector3(x2, 0.75f, ((Bounds)(ref bounds)).min.z + 0.5f)); List<Vector3> shevleListCenter2 = ShevleListCenter; bounds = ((Collider)componentInChildren).bounds; float x3 = ((Bounds)(ref bounds)).center.x; bounds = ((Collider)componentInChildren).bounds; shevleListCenter2.Add(new Vector3(x3, 1.4f, ((Bounds)(ref bounds)).min.z + 0.5f)); List<Vector3> shevleListCenter3 = ShevleListCenter; bounds = ((Collider)componentInChildren).bounds; float x4 = ((Bounds)(ref bounds)).center.x; bounds = ((Collider)componentInChildren).bounds; shevleListCenter3.Add(new Vector3(x4, 2f, ((Bounds)(ref bounds)).min.z + 0.5f)); List<Vector3> shevleListCenter4 = ShevleListCenter; bounds = ((Collider)componentInChildren).bounds; float x5 = ((Bounds)(ref bounds)).center.x; bounds = ((Collider)componentInChildren).bounds; shevleListCenter4.Add(new Vector3(x5, 2.5f, ((Bounds)(ref bounds)).min.z + 0.5f)); } public static string GetDebugLocationCloset() { return $"{ClosetBoundsMin.x},{ClosetBoundsMin.y},{ClosetBoundsMin.z} to {ClosetBoundsMax.x},{ClosetBoundsMax.y},{ClosetBoundsMax.z}"; } public List<GrabbableObject> GetObjectsInStorageCloset() { return (from obj in StorageCloset.GetComponentsInChildren<GrabbableObject>() where ((Object)obj).name != "ClipboardManual" && ((Object)obj).name != "StickyNoteItem" select obj).ToList(); } public bool IsObjectWithinCloset(GrabbableObject obj) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) return PositionHelperFunctions.IsPositionWithinBounds(((Component)obj).gameObject.transform.position, ClosetBoundsMin, ClosetBoundsMax); } public bool IsPositionWithinCloset(Vector3 placementPosition) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) return PositionHelperFunctions.IsPositionWithinBounds(placementPosition, ClosetBoundsMin, ClosetBoundsMax); } public void PlaceStorageObjectOnShelve(List<GrabbableObject> objectsOfType) { //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Unknown result type (might be due to invalid IL or missing references) //IL_0309: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0277: 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_029b: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: 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_02aa: Unknown result type (might be due to invalid IL or missing references) string name = ((Object)objectsOfType.First()).name; if (!(name == "Key(Clone)")) { if (name == "WhoopieCushion(Clone)") { StorageLocationXStepSize = 0.2f; } else { StorageLocationXStepSize = 0.1f; } } else { StorageLocationXStepSize = 0.05f; } if (((Object)objectsOfType.First()).name != LastItemPlaced && LastItemPlaced != string.Empty) { if (placementLocationAcrossOffset + StorageLocationXStepItem + StorageLocationXStepSize * (float)objectsOfType.Count > 2.25f) { placementLocationAcrossOffset = 0f; if (shelveToPlaceOn < 4) { shelveToPlaceOn++; } } else { placementLocationAcrossOffset += StorageLocationXStepItem; } LastItemPlaced = ((Object)objectsOfType.First()).name; } else if (LastItemPlaced == string.Empty) { LastItemPlaced = ((Object)objectsOfType.First()).name; } int num = 2; bool flag = true; int num2 = 0; float num3 = 0.1f; float num4 = StorageLocationZOffset; Vector3 val2 = default(Vector3); Vector3 val5 = default(Vector3); for (int i = 0; i < objectsOfType.Count; i++) { GrabbableObject val = objectsOfType[i]; if (flag) { if (num2 < num) { num2++; } else { flag = false; } num4 += num3; } else { if (num2 >= 0) { num2--; } else { flag = true; } num4 -= num3; } ((Vector3)(ref val2))..ctor(placementLocationAcrossOffset, ShevleListCenter[shelveToPlaceOn - 1].y, num4); Vector3 val3 = Quaternion.Euler(0f, ClosetRotation.y, 0f) * val2; Vector3 val4 = Quaternion.Euler(0f, ClosetRotation.y, 0f) * new Vector3(-1.75f, 0f, -0.75f); ((Vector3)(ref val5))..ctor(val3.x + StorageCloset.gameObject.transform.position.x + val4.x, ShevleListCenter[shelveToPlaceOn - 1].y, val3.z + StorageCloset.gameObject.transform.position.z + val4.z); if (!IsPositionWithinCloset(val5)) { ShipMaid.Log("Fixed object location out of closet " + ((Object)val).name + " - Original Location " + PositionHelperFunctions.DebugVector3(val5) + " - Bounds are " + GetDebugLocationCloset()); val5 = PositionHelperFunctions.AdjustPositionWithinBounds(val5, ClosetBoundsMin, ClosetBoundsMax); } ShipMaid.Log($"Placing {((Object)val).name} [{i + 1} of {objectsOfType.Count}] on shelve {shelveToPlaceOn} at {PositionHelperFunctions.DebugVector3(val5)}"); NetworkFunctions.NetworkingObjectManager.RunClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)val).NetworkObject), val5, ((Component)val).transform.rotation, shipParent: false); placementLocationAcrossOffset += StorageLocationXStepSize; } if (LastItemPlaced == "Key(Clone)") { StorageLocationXStepSize = 0.1f; } else { StorageLocationXStepSize = 0.1f; } } } } namespace ShipMaid.Configuration { public static class ConfigSettings { public static ConfigSetupList ClosetLocationOverride = new ConfigSetupList { pluginName = "ShipMaid", SettingName = "ClosetLocationOverride", SettingValue = "Whoopie,Key,Flashlight,StunGrenade", SettingDescription = "List of items separated by comma that will be automatically placed in the storage container on ship cleanup." }; public static Dictionary<string, ConfigEntryBase> currentConfigEntries = new Dictionary<string, ConfigEntryBase>(); public static ConfigSetupString ItemGrouping = new ConfigSetupString { pluginName = "ShipMaid", SettingName = "ItemGrouping", SettingValue = "Tight", SettingDescription = "[Loose] Spread items accross the ship from left to right -or- [Tight] Pack the items to the side of the ship with the suit rack." }; public static ConfigSetupGrabbableObjectPositions ItemPlacementOverrideLocation = new ConfigSetupGrabbableObjectPositions { pluginName = "ShipMaid", SettingName = "ItemPlacementOverrideLocation", SettingValue = "name,0.00,0.00,0.00", SettingDescription = "Name and location of the item location (if UseItemTypePlacementOverrides is enabled)" }; public static ConfigSetupVector3 ItemPlacementOverrideOffsetPosition = new ConfigSetupVector3 { pluginName = "ShipMaid", SettingName = "ItemPlacementOverrideOffsetPosition", SettingValue = "0.10,0.10,0.10", SettingDescription = "Vector3 variation of items within a stack of items (if UseOneHandedPlacementOverrides or UseTwoHandedPlacementOverrides is enabled)" }; public static ConfigSetupFloat ItemPlacementOverrideOffsetRotation = new ConfigSetupFloat { pluginName = "ShipMaid", SettingName = "ItemPlacementOverrideOffsetRotation", SettingValue = "10", SettingDescription = "Float rotation variation of items within a stack of items (if UseOneHandedPlacementOverrides or UseTwoHandedPlacementOverrides is enabled)" }; public static ConfigSetupVector3 OneHandedItemPlacementOverrideLocation = new ConfigSetupVector3 { pluginName = "ShipMaid", SettingName = "OneHandedItemPlacementOverrideLocation", SettingValue = "0.00,0.00,0.00", SettingDescription = "Vector3 location of the One-handed item location (if UseOneHandedPlacementOverrides is enabled)" }; public static ConfigSetupString OrganizationTechnique = new ConfigSetupString { pluginName = "ShipMaid", SettingName = "OrganizationMethod", SettingValue = "Value", SettingDescription = "Choose organization method, spread items of a type by [Value] or [Stack] perfectly by item type." }; public static ConfigSetupBool OrganizeShotgunByAmmo = new ConfigSetupBool { pluginName = "ShipMaid", SettingName = "OrganizeShotgunByAmmo", SettingValue = false, SettingDescription = "If [true], setting position overrides on shotguns will permit them to be organized by how much ammo is loaded" }; public static ConfigSetupShotgunPositions ShotgunPlacementOverrideLocation = new ConfigSetupShotgunPositions { pluginName = "ShipMaid", SettingName = "ShotgunPlacementOverrideLocation", SettingValue = "name,0.00,0.00,0.00,0", SettingDescription = "Name,locationX,locationY,locationZ,shellCount of the shotgun (if OrganizeShotgunByAmmo is enabled)" }; public static ConfigSetupList SortingLocationBlacklist = new ConfigSetupList { pluginName = "ShipMaid", SettingName = "SortingDisabledList", SettingValue = "", SettingDescription = "List of items separated by comma that will be ignored on sorting." }; public static ConfigSetupString TwoHandedItemLocation = new ConfigSetupString { pluginName = "ShipMaid", SettingName = "TwoHandedItemLocation", SettingValue = "Front", SettingDescription = "Choose location for two handed objects, [Front] of ship, or [Back] of ship. The opposite location will have the single handed items" }; public static ConfigSetupVector3 TwoHandedItemPlacementOverrideLocation = new ConfigSetupVector3 { pluginName = "ShipMaid", SettingName = "TwoHandedItemPlacementOverrideLocation", SettingValue = "0.00,0.00,0.00", SettingDescription = "Vector3 location of the Two-handed item location (if UseTwoHandedPlacementOverrides is enabled)" }; public static ConfigSetupBool UseItemTypePlacementOverrides = new ConfigSetupBool { pluginName = "ShipMaid", SettingName = "UseItemTypePlacementOverrides", SettingValue = false, SettingDescription = "If [true], pressing J (or what ever keybind from SetObjectTypePositionKey) will set an objects item type location for organization" }; public static ConfigSetupBool UseOneHandedPlacementOverrides = new ConfigSetupBool { pluginName = "ShipMaid", SettingName = "UseOneHandedPlacementOverrides", SettingValue = false, SettingDescription = "If [true], pressing J (or what ever keybind from SetObjectTypePositionKey) with a one handed object will set all one handed objects location for organization" }; public static ConfigSetupBool UseOnlyTerminal = new ConfigSetupBool { pluginName = "ShipMaid", SettingName = "UseOnlyTerminal", SettingValue = false, SettingDescription = "If [true], the keybinding will be disabled and only the terminal will be used for cleanup commands" }; public static ConfigSetupBool UseTwoHandedPlacementOverrides = new ConfigSetupBool { pluginName = "ShipMaid", SettingName = "UseTwoHandedPlacementOverrides", SettingValue = false, SettingDescription = "If [true], pressing J (or what ever keybind from SetObjectTypePositionKey) with a two handed object will set all two handed objects location for organization" }; public static void BindConfigSettings() { ShipMaid.Log("BindingConfigs"); MaybeMigrateConfigFile(); currentConfigEntries = UseOnlyTerminal.Bind(currentConfigEntries); currentConfigEntries = OrganizationTechnique.Bind(currentConfigEntries); currentConfigEntries = TwoHandedItemLocation.Bind(currentConfigEntries); currentConfigEntries = ItemGrouping.Bind(currentConfigEntries); currentConfigEntries = ClosetLocationOverride.Bind(currentConfigEntries); currentConfigEntries = SortingLocationBlacklist.Bind(currentConfigEntries); currentConfigEntries = UseItemTypePlacementOverrides.Bind(currentConfigEntries); currentConfigEntries = ItemPlacementOverrideLocation.Bind(currentConfigEntries); currentConfigEntries = UseOneHandedPlacementOverrides.Bind(currentConfigEntries); currentConfigEntries = OneHandedItemPlacementOverrideLocation.Bind(currentConfigEntries); currentConfigEntries = UseTwoHandedPlacementOverrides.Bind(currentConfigEntries); currentConfigEntries = TwoHandedItemPlacementOverrideLocation.Bind(currentConfigEntries); currentConfigEntries = ItemPlacementOverrideOffsetPosition.Bind(currentConfigEntries); currentConfigEntries = ItemPlacementOverrideOffsetRotation.Bind(currentConfigEntries); currentConfigEntries = OrganizeShotgunByAmmo.Bind(currentConfigEntries); currentConfigEntries = ShotgunPlacementOverrideLocation.Bind(currentConfigEntries); TryRemoveOldConfigSettings(); } public static void MaybeMigrateConfigFile() { try { ConfigFile config = ((BaseUnityPlugin)ShipMaid.instance).Config; string configFilePath = config.ConfigFilePath; if (!File.Exists(configFilePath)) { return; } string text = ""; string[] array = File.ReadAllLines(configFilePath); _ = array.Length; for (int i = 0; i < array.Length; i++) { if (array[i].Contains(" Enabled") || array[i].Contains(" Disabled")) { ShipMaid.Log("Found line to replace " + array[i]); array[i] = array[i].Replace("Enabled", "true"); array[i] = array[i].Replace("Disabled", "false"); if (i > 2 && array[i - 2].Contains("String"