Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of CollectCruiserItemCompany v0.3.0
com.aoirint.CollectCruiserItemCompany.dll
Decompiled 6 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using CollectCruiserItemCompany.Commands; using CollectCruiserItemCompany.Extensions; using CollectCruiserItemCompany.Helpers; using CollectCruiserItemCompany.Managers; using CollectCruiserItemCompany.NetworkObjects; using CollectCruiserItemCompany.Utils; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using Unity.Mathematics; using Unity.Netcode; using UnityEngine; [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("com.aoirint.CollectCruiserItemCompany")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.3.0.0")] [assembly: AssemblyInformationalVersion("0.3.0+3257d0df9725840daa90290e5837dc28890fa2f0")] [assembly: AssemblyProduct("CollectCruiserItemCompany")] [assembly: AssemblyTitle("com.aoirint.CollectCruiserItemCompany")] [assembly: AssemblyVersion("0.3.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace CollectCruiserItemCompany { public enum Permission { HostOnly, Everone } [BepInPlugin("com.aoirint.CollectCruiserItemCompany", "CollectCruiserItemCompany", "0.3.0")] [BepInProcess("Lethal Company.exe")] public class CollectCruiserItemCompany : BaseUnityPlugin { internal static Harmony harmony = new Harmony("com.aoirint.CollectCruiserItemCompany"); internal static ManualLogSource? Logger { get; private set; } internal static LandingHistoryManager LandingHistoryManager { get; } = new LandingHistoryManager(); internal static TerminalCommandManager TerminalCommandManager { get; } = new TerminalCommandManager(); internal static CollectCruiserItemManager CollectCruiserItemManager { get; } = new CollectCruiserItemManager(); internal static ConfigEntry<Permission>? PermissionConfig { get; private set; } internal static ConfigEntry<string>? ExclusionListConfig { get; private set; } internal static ConfigEntry<string>? ScrapExclusionListConfig { get; private set; } internal static ConfigEntry<string>? ToolExclusionListConfig { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; PermissionConfig = ((BaseUnityPlugin)this).Config.Bind<Permission>("General", "Permission", Permission.HostOnly, "Controls who can collect items from cruiser by terminal. If HostOnly, only the host can collect items. If Everyone, all players can collect items if they have installed this mod."); ExclusionListConfig = ((BaseUnityPlugin)this).Config.Bind<string>("General", "Global Exclusion List", "", "Excludes items from being collected by any `collect` command. A comma-separated list of item names, exact match and case-insensitive. Example: `Easter egg, Shovel`"); ScrapExclusionListConfig = ((BaseUnityPlugin)this).Config.Bind<string>("General", "Scrap Exclusion List", "Shotgun, Knife", "Additional exclusion list for `collect scrap`."); ToolExclusionListConfig = ((BaseUnityPlugin)this).Config.Bind<string>("General", "Tool Exclusion List", "", "Additional exclusion list for `collect tool`."); harmony.PatchAll(); Logger.LogInfo((object)"Plugin CollectCruiserItemCompany v0.3.0 is loaded!"); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.aoirint.CollectCruiserItemCompany"; public const string PLUGIN_NAME = "CollectCruiserItemCompany"; public const string PLUGIN_VERSION = "0.3.0"; } } namespace CollectCruiserItemCompany.Utils { internal static class FindItemUtils { [CompilerGenerated] private sealed class <GetAllItems>d__2 : IEnumerable<GrabbableObject>, IEnumerable, IEnumerator<GrabbableObject>, IEnumerator, IDisposable { private int <>1__state; private GrabbableObject <>2__current; private int <>l__initialThreadId; private GrabbableObject[] <>7__wrap1; private int <>7__wrap2; GrabbableObject IEnumerator<GrabbableObject>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllItems>d__2(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { <>7__wrap1 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; goto IL_006a; } <>1__state = -1; GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>() ?? throw new Exception("Failed to find GrabbableObject objects."); <>7__wrap1 = array; <>7__wrap2 = 0; goto IL_0078; IL_006a: <>7__wrap2++; goto IL_0078; IL_0078: if (<>7__wrap2 < <>7__wrap1.Length) { GrabbableObject val = <>7__wrap1[<>7__wrap2]; if (!((Object)(object)val == (Object)null)) { <>2__current = val; <>1__state = 1; return true; } goto IL_006a; } <>7__wrap1 = null; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<GrabbableObject> IEnumerable<GrabbableObject>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <GetAllItems>d__2(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<GrabbableObject>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllItemsInCruiserInternal>d__3 : IEnumerable<GrabbableObject>, IEnumerable, IEnumerator<GrabbableObject>, IEnumerator, IDisposable { private int <>1__state; private GrabbableObject <>2__current; private int <>l__initialThreadId; private string commaSeparatedExclusionListString; public string <>3__commaSeparatedExclusionListString; private Transform <elevatorTransform>5__2; private Transform <shipTransform>5__3; private Transform[] <vehicleTransforms>5__4; private string[] <exclusionList>5__5; private IEnumerator<GrabbableObject> <>7__wrap5; private GrabbableObject <item>5__7; private string <itemName>5__8; private Transform[] <>7__wrap8; private int <>7__wrap9; GrabbableObject IEnumerator<GrabbableObject>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllItemsInCruiserInternal>d__3(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <elevatorTransform>5__2 = null; <shipTransform>5__3 = null; <vehicleTransforms>5__4 = null; <exclusionList>5__5 = null; <>7__wrap5 = null; <item>5__7 = null; <itemName>5__8 = null; <>7__wrap8 = null; <>1__state = -2; } private bool MoveNext() { try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; goto IL_041b; } <>1__state = -1; StartOfRound val = StartOfRound.Instance ?? throw new Exception("StartOfRound.Instance is null."); <elevatorTransform>5__2 = val.elevatorTransform ?? throw new Exception("StartOfRound.Instance.elevatorTransform is null."); <shipTransform>5__3 = ShipUtils.GetShipTransform() ?? throw new Exception("Ship transform is null."); <vehicleTransforms>5__4 = ShipUtils.GetVehicleTransforms() ?? throw new Exception("Vehicle transforms is null."); <exclusionList>5__5 = (from name in commaSeparatedExclusionListString.Split(',') select name.Trim().ToLower() into name where !string.IsNullOrEmpty(name) select name).ToArray(); Logger.LogInfo((object)("Exclusion list: " + string.Join(", ", <exclusionList>5__5))); IEnumerable<GrabbableObject> allItems = GetAllItems(); <>7__wrap5 = allItems.GetEnumerator(); <>1__state = -3; goto IL_046b; IL_041b: <>7__wrap9++; goto IL_0429; IL_0429: if (<>7__wrap9 < <>7__wrap8.Length) { Transform val2 = <>7__wrap8[<>7__wrap9]; if (!((Object)(object)val2 == (Object)null) && ((Component)<item>5__7).transform.IsChildOf(val2)) { Logger.LogDebug((object)("Take item. itemName=" + <itemName>5__8 + " vehicleParent=" + ((Object)val2).name)); <>2__current = <item>5__7; <>1__state = 1; return true; } goto IL_041b; } <>7__wrap8 = null; Logger.LogDebug((object)("Skipping item because it is outside cruiser. itemName=" + <itemName>5__8)); <itemName>5__8 = null; <item>5__7 = null; goto IL_046b; IL_046b: while (true) { if (<>7__wrap5.MoveNext()) { <item>5__7 = <>7__wrap5.Current; Item itemProperties = <item>5__7.itemProperties; if ((Object)(object)itemProperties == (Object)null) { Logger.LogError((object)("Skipping item because itemProperties is null. name=" + ((Object)<item>5__7).name)); continue; } <itemName>5__8 = itemProperties.itemName; bool isInShipRoom = <item>5__7.isInShipRoom; bool isInElevator = <item>5__7.isInElevator; bool isHeld = <item>5__7.isHeld; bool isHeldByEnemy = <item>5__7.isHeldByEnemy; bool isPocketed = <item>5__7.isPocketed; Transform parent = ((Component)<item>5__7).transform.parent; string text = ((parent != null) ? ((Object)parent).name : null) ?? "null"; Logger.LogDebug((object)("Checking item. itemName=" + <itemName>5__8 + $" isInShipRoom={isInShipRoom}" + $" isInElevator={isInElevator}" + $" isPocketed={isPocketed}" + $" isHeld={isHeld}" + $" isHeldByEnemy={isHeldByEnemy}" + " parent=" + text)); if (isInShipRoom) { Logger.LogDebug((object)("Skipping item because it is in ship room. itemName=" + <itemName>5__8)); continue; } if (isHeld) { Logger.LogDebug((object)("Skipping item because it is held. itemName=" + <itemName>5__8)); continue; } if (isHeldByEnemy) { Logger.LogDebug((object)("Skipping item because it is held by enemy. itemName=" + <itemName>5__8)); continue; } if (<exclusionList>5__5.Contains(<itemName>5__8.ToLower())) { Logger.LogDebug((object)("Skipping item because it is in the exclusion list. itemName=" + <itemName>5__8)); continue; } if (((Component)<item>5__7).transform.IsChildOf(<elevatorTransform>5__2)) { Logger.LogDebug((object)("Skipping item because it is on elevator. itemName=" + <itemName>5__8)); continue; } if (!((Component)<item>5__7).transform.IsChildOf(<shipTransform>5__3)) { break; } Logger.LogDebug((object)("Skipping item because it is on ship. itemName=" + <itemName>5__8)); continue; } <>m__Finally1(); <>7__wrap5 = null; return false; } <>7__wrap8 = <vehicleTransforms>5__4; <>7__wrap9 = 0; goto IL_0429; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap5 != null) { <>7__wrap5.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<GrabbableObject> IEnumerable<GrabbableObject>.GetEnumerator() { <GetAllItemsInCruiserInternal>d__3 <GetAllItemsInCruiserInternal>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetAllItemsInCruiserInternal>d__ = this; } else { <GetAllItemsInCruiserInternal>d__ = new <GetAllItemsInCruiserInternal>d__3(0); } <GetAllItemsInCruiserInternal>d__.commaSeparatedExclusionListString = <>3__commaSeparatedExclusionListString; return <GetAllItemsInCruiserInternal>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<GrabbableObject>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllScraps>d__5 : IEnumerable<GrabbableObject>, IEnumerable, IEnumerator<GrabbableObject>, IEnumerator, IDisposable { private int <>1__state; private GrabbableObject <>2__current; private int <>l__initialThreadId; private IEnumerator<GrabbableObject> <>7__wrap1; GrabbableObject IEnumerator<GrabbableObject>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllScraps>d__5(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <>7__wrap1 = null; <>1__state = -2; } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: { <>1__state = -1; string text = CollectCruiserItemCompany.ExclusionListConfig?.Value ?? ""; string text2 = CollectCruiserItemCompany.ScrapExclusionListConfig?.Value ?? ""; IEnumerable<GrabbableObject> allItemsInCruiserInternal = GetAllItemsInCruiserInternal(string.Join(",", text, text2)); <>7__wrap1 = allItemsInCruiserInternal.GetEnumerator(); <>1__state = -3; break; } case 1: <>1__state = -3; break; } while (<>7__wrap1.MoveNext()) { GrabbableObject current = <>7__wrap1.Current; Item itemProperties = current.itemProperties; if (!((Object)(object)itemProperties == (Object)null) && itemProperties.isScrap) { <>2__current = current; <>1__state = 1; return true; } } <>m__Finally1(); <>7__wrap1 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap1 != null) { <>7__wrap1.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<GrabbableObject> IEnumerable<GrabbableObject>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <GetAllScraps>d__5(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<GrabbableObject>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllTools>d__6 : IEnumerable<GrabbableObject>, IEnumerable, IEnumerator<GrabbableObject>, IEnumerator, IDisposable { private int <>1__state; private GrabbableObject <>2__current; private int <>l__initialThreadId; private IEnumerator<GrabbableObject> <>7__wrap1; GrabbableObject IEnumerator<GrabbableObject>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllTools>d__6(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <>7__wrap1 = null; <>1__state = -2; } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: { <>1__state = -1; string text = CollectCruiserItemCompany.ExclusionListConfig?.Value ?? ""; string text2 = CollectCruiserItemCompany.ToolExclusionListConfig?.Value ?? ""; IEnumerable<GrabbableObject> allItemsInCruiserInternal = GetAllItemsInCruiserInternal(string.Join(",", text, text2)); <>7__wrap1 = allItemsInCruiserInternal.GetEnumerator(); <>1__state = -3; break; } case 1: <>1__state = -3; break; } while (<>7__wrap1.MoveNext()) { GrabbableObject current = <>7__wrap1.Current; Item itemProperties = current.itemProperties; if (!((Object)(object)itemProperties == (Object)null) && !itemProperties.isScrap) { <>2__current = current; <>1__state = 1; return true; } } <>m__Finally1(); <>7__wrap1 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap1 != null) { <>7__wrap1.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<GrabbableObject> IEnumerable<GrabbableObject>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <GetAllTools>d__6(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<GrabbableObject>)this).GetEnumerator(); } } internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; [IteratorStateMachine(typeof(<GetAllItems>d__2))] internal static IEnumerable<GrabbableObject> GetAllItems() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetAllItems>d__2(-2); } [IteratorStateMachine(typeof(<GetAllItemsInCruiserInternal>d__3))] internal static IEnumerable<GrabbableObject> GetAllItemsInCruiserInternal(string commaSeparatedExclusionListString) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetAllItemsInCruiserInternal>d__3(-2) { <>3__commaSeparatedExclusionListString = commaSeparatedExclusionListString }; } internal static IEnumerable<GrabbableObject> GetAllItemsInCruiser() { return GetAllItemsInCruiserInternal(CollectCruiserItemCompany.ExclusionListConfig?.Value ?? ""); } [IteratorStateMachine(typeof(<GetAllScraps>d__5))] internal static IEnumerable<GrabbableObject> GetAllScraps() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetAllScraps>d__5(-2); } [IteratorStateMachine(typeof(<GetAllTools>d__6))] internal static IEnumerable<GrabbableObject> GetAllTools() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetAllTools>d__6(-2); } } internal static class KeywordUtils { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; internal static bool IsCollectCommand(string keyword) { keyword = keyword.ToLower(); switch (keyword) { case "collect": case "colect": case "collec": return true; default: return false; } } internal static bool IsScrapArgument(string keyword) { keyword = keyword.ToLower(); if (((keyword.Length > 0) ? keyword.Substring(0, 1) : "") == "s") { return true; } return false; } internal static bool IsToolArgument(string keyword) { keyword = keyword.ToLower(); if (((keyword.Length > 0) ? keyword.Substring(0, 1) : "") == "t") { return true; } return false; } internal static bool IsAllArgument(string keyword) { keyword = keyword.ToLower(); if (((keyword.Length > 0) ? keyword.Substring(0, 1) : "") == "a") { return true; } return false; } } internal static class NetworkBehaviourUtils { private static CollectionNetworkBehaviour? cachedCollectionNetworkBehaviour; internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public static CollectionNetworkBehaviour? GetCollectionNetworkBehaviour() { if ((Object)(object)cachedCollectionNetworkBehaviour != (Object)null) { return cachedCollectionNetworkBehaviour; } StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return null; } CollectionNetworkBehaviour component = ((Component)instance).GetComponent<CollectionNetworkBehaviour>(); if ((Object)(object)component == (Object)null) { Logger.LogError((object)"CollectionNetworkBehaviour component not found on StartOfRound instance."); return null; } cachedCollectionNetworkBehaviour = component; return component; } } internal static class NetworkUtils { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public static bool IsServer() { NetworkManager singleton = NetworkManager.Singleton; if ((Object)(object)singleton == (Object)null) { Logger.LogError((object)"NetworkManager.Singleton is null."); return false; } return singleton.IsServer; } public static bool IsHost() { NetworkManager singleton = NetworkManager.Singleton; if ((Object)(object)singleton == (Object)null) { Logger.LogError((object)"NetworkManager.Singleton is null."); return false; } return singleton.IsHost; } public static bool IsClient() { NetworkManager singleton = NetworkManager.Singleton; if ((Object)(object)singleton == (Object)null) { Logger.LogError((object)"NetworkManager.Singleton is null."); return false; } return singleton.IsClient; } } internal static class PlayerUtils { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; internal static PlayerControllerB? GetLocalPlayer() { GameNetworkManager instance = GameNetworkManager.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"GameNetworkManager.Instance is null."); return null; } PlayerControllerB localPlayerController = instance.localPlayerController; if ((Object)(object)localPlayerController == (Object)null) { Logger.LogError((object)"GameNetworkManager.Instance.localPlayerController is null."); return null; } return localPlayerController; } } internal static class RoundUtils { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public static bool IsInOrbit() { StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return false; } if (!instance.inShipPhase) { return false; } return true; } public static bool IsFirstDay() { StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return false; } EndOfGameStats gameStats = instance.gameStats; if (gameStats == null) { Logger.LogError((object)"StartOfRound.Instance.gameStats is null."); return false; } int daysSpent = gameStats.daysSpent; Logger.LogDebug((object)$"daysSpent={daysSpent}"); return daysSpent == 0; } public static bool IsSceneNameCompany(string sceneName) { Logger.LogDebug((object)("IsSceneNameCompany? sceneName=" + sceneName)); return sceneName == "CompanyBuilding"; } public static bool IsRoutingToCompany() { StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return false; } SelectableLevel currentLevel = instance.currentLevel; if ((Object)(object)currentLevel == (Object)null) { Logger.LogError((object)"StartOfRound.Instance.currentLevel is null."); return false; } return IsSceneNameCompany(currentLevel.sceneName); } public static SelectableLevel? GetLevelById(int levelId) { StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return null; } SelectableLevel[] levels = instance.levels; if (levels == null) { Logger.LogError((object)"StartOfRound.Instance.levels is null."); return null; } SelectableLevel val = levels.ElementAtOrDefault(levelId); if ((Object)(object)val == (Object)null) { Logger.LogError((object)$"Level not found. levelId={levelId}"); return null; } return val; } } internal static class ShipUtils { private static GameObject? cachedShipObject; internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public static GameObject? GetShipObject() { if ((Object)(object)cachedShipObject != (Object)null) { return cachedShipObject; } GameObject val = GameObject.Find("Environment/HangarShip"); if ((Object)(object)val == (Object)null) { Logger.LogError((object)"Failed to find ship object in scene."); return null; } cachedShipObject = val; return val; } public static Transform? GetShipTransform() { GameObject shipObject = GetShipObject(); if ((Object)(object)shipObject == (Object)null) { Logger.LogError((object)"Ship object is null. Cannot get transform."); return null; } Transform transform = shipObject.transform; if ((Object)(object)transform == (Object)null) { Logger.LogError((object)"Ship transform is null."); return null; } return transform; } public static Transform? GetElevatorTransform() { StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return null; } Transform elevatorTransform = instance.elevatorTransform; if ((Object)(object)elevatorTransform == (Object)null) { Logger.LogError((object)"StartOfRound.elevatorTransform is null."); return null; } return elevatorTransform; } public static Bounds? GetShipBounds() { //IL_0052: Unknown result type (might be due to invalid IL or missing references) StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return null; } Collider shipBounds = instance.shipBounds; if ((Object)(object)shipBounds == (Object)null) { Logger.LogError((object)"StartOfRound.shipBounds is null."); return null; } return shipBounds.bounds; } public static Transform[]? GetVehicleTransforms() { VehicleController[] array = Object.FindObjectsOfType<VehicleController>(); if (array == null) { Logger.LogError((object)"Failed to find VehicleController objects."); return null; } List<Transform> list = new List<Transform>(); VehicleController[] array2 = array; for (int i = 0; i < array2.Length; i++) { Transform transform = ((Component)array2[i]).transform; if ((Object)(object)transform == (Object)null) { Logger.LogError((object)"VehicleController.transform is null."); return null; } list.Add(transform); } return list.ToArray(); } public static Vector3? GetBaseSpawnPosition() { //IL_0076: Unknown result type (might be due to invalid IL or missing references) StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { Logger.LogError((object)"StartOfRound.Instance is null."); return null; } Transform[] playerSpawnPositions = instance.playerSpawnPositions; if (playerSpawnPositions == null) { Logger.LogError((object)"StartOfRound.Instance.playerSpawnPositions is null."); return null; } Transform val = playerSpawnPositions.ElementAtOrDefault(1); if ((Object)(object)val == (Object)null) { Logger.LogError((object)"Player spawn position is null for ID 1."); return null; } return val.position; } } internal enum ClientTeleportMethod { Throw, Place } internal static class TeleportItemUtils { [CompilerGenerated] private sealed class <>c__DisplayClass4_0 { public Vector3 localPosition; public Random random; public Func<GrabbableObject, Vector3> <>9__0; internal Vector3 <TeleportItemsToShip>b__0(GrabbableObject offsetVector) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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) return localPosition + new Vector3(((Random)(ref random)).NextFloat(-0.7f, 0.7f), 0.5f, 2f); } } [CompilerGenerated] private sealed class <>c__DisplayClass4_1 { public Vector3[] positions; internal Vector3 <TeleportItemsToShip>b__1(GrabbableObject item, int index) { //IL_0008: 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) return item.GetItemFloorPosition(positions[index]); } } [CompilerGenerated] private sealed class <TeleportItemsToShip>d__4 : IEnumerable<GrabbableObject>, IEnumerable, IEnumerator<GrabbableObject>, IEnumerator, IDisposable { private int <>1__state; private GrabbableObject <>2__current; private int <>l__initialThreadId; private Vector3 localPosition; public Vector3 <>3__localPosition; private IEnumerable<GrabbableObject> items; public IEnumerable<GrabbableObject> <>3__items; private <>c__DisplayClass4_0 <>8__1; private Transform newParentTransform; public Transform <>3__newParentTransform; private <>c__DisplayClass4_1 <>8__2; private PlayerControllerB localPlayer; public PlayerControllerB <>3__localPlayer; private IEnumerator<List<GrabbableObject>> <>7__wrap1; private Vector3[] <worldNewItemPositions>5__3; private IEnumerator<(GrabbableObject item, int index)> <>7__wrap3; GrabbableObject IEnumerator<GrabbableObject>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TeleportItemsToShip>d__4(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if ((uint)(num - -4) <= 1u || num == 1) { try { if (num == -4 || num == 1) { try { } finally { <>m__Finally2(); } } } finally { <>m__Finally1(); } } <>8__1 = null; <>8__2 = null; <>7__wrap1 = null; <worldNewItemPositions>5__3 = null; <>7__wrap3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0031: 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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: 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_0212: 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_022a: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: 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_02ce: Unknown result type (might be due to invalid IL or missing references) try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -4; goto IL_02f4; } <>1__state = -1; <>8__1 = new <>c__DisplayClass4_0(); <>8__1.localPosition = localPosition; uint num2 = BitConverter.ToUInt32(Guid.NewGuid().ToByteArray(), 0); if (num2 == 0) { num2 = 1u; } <>8__1.random = new Random(num2); <>7__wrap1 = IEnumerableExtensions.Chunk(items, 20).GetEnumerator(); <>1__state = -3; goto IL_031f; IL_031f: if (<>7__wrap1.MoveNext()) { List<GrabbableObject> current = <>7__wrap1.Current; <>8__2 = new <>c__DisplayClass4_1(); current.Count(); <>8__2.positions = current.Select((GrabbableObject offsetVector) => <>8__1.localPosition + new Vector3(((Random)(ref <>8__1.random)).NextFloat(-0.7f, 0.7f), 0.5f, 2f)).ToArray(); newParentTransform.TransformPoints((Span<Vector3>)<>8__2.positions); <>8__2.positions = current.Select((GrabbableObject item, int index) => item.GetItemFloorPosition(<>8__2.positions[index])).ToArray(); <worldNewItemPositions>5__3 = <>8__2.positions.ToArray(); newParentTransform.InverseTransformPoints((Span<Vector3>)<>8__2.positions); <>7__wrap3 = current.Select((GrabbableObject item, int index) => (item, index)).GetEnumerator(); <>1__state = -4; goto IL_02f4; } <>m__Finally1(); <>7__wrap1 = null; return false; IL_02f4: if (<>7__wrap3.MoveNext()) { (GrabbableObject item, int index) current2 = <>7__wrap3.Current; GrabbableObject item2 = current2.item; int item3 = current2.index; Vector3 position = ((Component)item2).transform.position; Vector3 val = <>8__2.positions[item3]; Vector3 val2 = <worldNewItemPositions>5__3[item3]; Logger.LogInfo((object)("Teleporting item. name=" + ((Object)item2).name + $" worldOldItemPosition=({position.x:F2}, {position.y:F2}, {position.z:F2})" + $" localNewItemPosition=({val.x:F2}, {val.y:F2}, {val.z:F2})" + $" worldNewItemPosition=({val2.x:F2}, {val2.y:F2}, {val2.z:F2})")); TeleportItemForOwnerInternal(item2, newParentTransform, val, localPlayer); ThrowObjectClientRpc(localPlayer, droppedInElevator: true, droppedInShipRoom: true, val, NetworkObjectReference.op_Implicit(((NetworkBehaviour)item2).NetworkObject), -1); <>2__current = item2; <>1__state = 1; return true; } <>m__Finally2(); <>7__wrap3 = null; <>8__2 = null; <worldNewItemPositions>5__3 = null; goto IL_031f; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap1 != null) { <>7__wrap1.Dispose(); } } private void <>m__Finally2() { <>1__state = -3; if (<>7__wrap3 != null) { <>7__wrap3.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<GrabbableObject> IEnumerable<GrabbableObject>.GetEnumerator() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) <TeleportItemsToShip>d__4 <TeleportItemsToShip>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <TeleportItemsToShip>d__ = this; } else { <TeleportItemsToShip>d__ = new <TeleportItemsToShip>d__4(0); } <TeleportItemsToShip>d__.items = <>3__items; <TeleportItemsToShip>d__.newParentTransform = <>3__newParentTransform; <TeleportItemsToShip>d__.localPosition = <>3__localPosition; <TeleportItemsToShip>d__.localPlayer = <>3__localPlayer; return <TeleportItemsToShip>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<GrabbableObject>)this).GetEnumerator(); } } internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; private static void ThrowObjectClientRpc(PlayerControllerB instance, bool droppedInElevator, bool droppedInShipRoom, Vector3 targetFloorPosition, NetworkObjectReference grabbedObject, int floorYRot) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) MethodInfo methodInfo = AccessTools.Method(typeof(PlayerControllerB), "ThrowObjectClientRpc", (Type[])null, (Type[])null); if (methodInfo == null) { Logger.LogError((object)"Could not find PlayerControllerB.ThrowObjectClientRpc method."); return; } try { methodInfo.Invoke(instance, new object[5] { droppedInElevator, droppedInShipRoom, targetFloorPosition, grabbedObject, floorYRot }); } catch (Exception arg) { Logger.LogError((object)$"Error invoking PlayerControllerB.ThrowObjectClientRpc: {arg}"); } } private static void TeleportItemForOwnerInternal(GrabbableObject item, Transform newParentTransform, Vector3 newLocalPosition, PlayerControllerB localPlayer) { //IL_0012: 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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) ((Component)item).transform.SetParent(newParentTransform); ((Component)item).transform.localPosition = newLocalPosition; ((Component)item).transform.rotation = Quaternion.identity; item.fallTime = 0f; item.startFallingPosition = newLocalPosition; item.targetFloorPosition = newLocalPosition; localPlayer.SetItemInElevator(true, true, item); } [IteratorStateMachine(typeof(<TeleportItemsToShip>d__4))] internal static IEnumerable<GrabbableObject> TeleportItemsToShip(IEnumerable<GrabbableObject> items, Transform newParentTransform, Vector3 localPosition, PlayerControllerB localPlayer) { //IL_0016: 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) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TeleportItemsToShip>d__4(-2) { <>3__items = items, <>3__newParentTransform = newParentTransform, <>3__localPosition = localPosition, <>3__localPlayer = localPlayer }; } } internal static class TerminalUtils { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public static TerminalNode CreateTerminalNode(string displayText, bool clearPreviousText) { TerminalNode obj = ScriptableObject.CreateInstance<TerminalNode>(); obj.displayText = displayText; obj.clearPreviousText = clearPreviousText; return obj; } } } namespace CollectCruiserItemCompany.Patches { [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatch { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; [HarmonyPatch("Awake")] [HarmonyPostfix] public static void AwakePrefix(StartOfRound __instance) { if ((Object)(object)((Component)__instance).gameObject == (Object)null) { Logger.LogError((object)"StartOfRound.gameObject is null."); } else { ((Component)__instance).gameObject.AddComponent<CollectionNetworkBehaviour>(); } } } [HarmonyPatch(typeof(Terminal))] internal class TerminalPatch { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; internal static string? RemovePunctuation(Terminal instance, string input) { MethodInfo methodInfo = AccessTools.Method(typeof(Terminal), "RemovePunctuation", (Type[])null, (Type[])null); if (methodInfo == null) { Logger.LogError((object)"Could not find Terminal.RemovePunctuation method."); return null; } try { return (methodInfo.Invoke(instance, new object[1] { input }) as string) ?? throw new Exception("Return value of Terminal.RemovePunctuation is not a string."); } catch (Exception arg) { Logger.LogError((object)$"Error invoking Terminal.RemovePunctuation: {arg}"); return null; } } [HarmonyPatch("ParsePlayerSentence")] [HarmonyPrefix] public static bool ParsePlayerSentencePrefix(Terminal __instance, ref TerminalNode __result) { TerminalCommandManager terminalCommandManager = CollectCruiserItemCompany.TerminalCommandManager; if (terminalCommandManager == null) { Logger.LogError((object)"TerminalCommandManager is null."); return true; } TMP_InputField screenText = __instance.screenText; if ((Object)(object)screenText == (Object)null) { Logger.LogError((object)"Terminal.screenText is null."); return true; } int textAdded = __instance.textAdded; string text = screenText.text; text = text.Substring(text.Length - textAdded); text = RemovePunctuation(__instance, text); if (text == null) { Logger.LogError((object)"Failed to remove punctuation from terminal input."); return true; } string[] args = text.Split(' ', StringSplitOptions.RemoveEmptyEntries); TerminalNode val = terminalCommandManager.ParseCommand(args); if ((Object)(object)val == (Object)null) { return true; } __result = val; return false; } } } namespace CollectCruiserItemCompany.NetworkObjects { internal class CollectionNetworkBehaviour : NetworkBehaviour { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; [ServerRpc(RequireOwnership = false)] public void CollectRequestServerRpc(CollectType collectType, ServerRpcParams rpcParams = default(ServerRpcParams)) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (!NetworkUtils.IsServer()) { Logger.LogError((object)"CollectRequestServerRpc called on client. Ignoring."); return; } Logger.LogInfo((object)"Received CollectRequestServerRpc from client."); CollectCruiserItemManager collectCruiserItemManager = CollectCruiserItemCompany.CollectCruiserItemManager; if (collectCruiserItemManager == null) { Logger.LogError((object)"CollectCruiserItemManager is null. Cannot process collect request."); return; } bool flag = rpcParams.Receive.SenderClientId == 0; Permission permission = CollectCruiserItemCompany.PermissionConfig?.Value ?? Permission.HostOnly; Logger.LogDebug((object)$"Current permission setting: {permission}"); if (permission == Permission.HostOnly && !flag) { Logger.LogInfo((object)"Cruiser collection is requested but cancelled. Permission is HostOnly and sender is not the host."); } else { ((MonoBehaviour)this).StartCoroutine(collectCruiserItemManager.CollectToShipCoroutine(collectType)); } } } } namespace CollectCruiserItemCompany.Managers { internal enum CollectType { All, Scrap, Tool } internal class CollectCruiserItemManager { [CompilerGenerated] private sealed class <CollectToShipCoroutine>d__3 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public CollectCruiserItemManager <>4__this; public CollectType collectType; private IEnumerator <innerCoroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CollectToShipCoroutine>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <innerCoroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; CollectCruiserItemManager collectCruiserItemManager = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (!NetworkUtils.IsServer()) { Logger.LogWarning((object)"CollectToShipCoroutine called on client. Ignoring."); return false; } if (!collectCruiserItemManager.IsCruiserCollectionAllowed()) { Logger.LogWarning((object)"Cruiser collection is not allowed in the current round state. Aborting collection."); return false; } Logger.LogInfo((object)$"Starting CollectToShipCoroutine. collectType={collectType}."); <innerCoroutine>5__2 = collectCruiserItemManager.CollectToShipCoroutineInternal(collectType); } bool flag; try { flag = <innerCoroutine>5__2.MoveNext(); } catch (Exception arg) { Logger.LogError((object)$"Exception in CollectToShipCoroutineInternal: {arg}"); return false; } if (flag) { <>2__current = <innerCoroutine>5__2.Current; <>1__state = 1; return true; } Logger.LogInfo((object)"Finished CollectToShipCoroutine."); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <CollectToShipCoroutineInternal>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public CollectType collectType; private IEnumerator<GrabbableObject> <>7__wrap1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CollectToShipCoroutineInternal>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <>7__wrap1 = null; <>1__state = -2; } private bool MoveNext() { //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Expected O, but got Unknown //IL_00ca: 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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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_00df: Unknown result type (might be due to invalid IL or missing references) try { switch (<>1__state) { default: return false; case 0: { <>1__state = -1; Transform val = (StartOfRound.Instance ?? throw new Exception("StartOfRound.Instance is null.")).elevatorTransform ?? throw new Exception("StartOfRound.Instance.elevatorTransform is null."); PlayerControllerB localPlayer = PlayerUtils.GetLocalPlayer() ?? throw new Exception("Local player is null."); IEnumerable<GrabbableObject> items; if (collectType == CollectType.All) { items = FindItemUtils.GetAllItemsInCruiser(); } else if (collectType == CollectType.Scrap) { items = FindItemUtils.GetAllScraps(); } else { if (collectType != CollectType.Tool) { throw new Exception($"Unknown CollectType: {collectType}"); } items = FindItemUtils.GetAllTools(); } Vector3 val2 = ShipUtils.GetBaseSpawnPosition() ?? throw new Exception("Base spawn position is null."); Vector3 localPosition = val.InverseTransformPoint(val2); <>7__wrap1 = TeleportItemUtils.TeleportItemsToShip(items, val, localPosition, localPlayer).GetEnumerator(); <>1__state = -3; break; } case 1: <>1__state = -3; break; } if (<>7__wrap1.MoveNext()) { _ = <>7__wrap1.Current; <>2__current = (object)new WaitForSecondsRealtime(0.1f); <>1__state = 1; return true; } <>m__Finally1(); <>7__wrap1 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap1 != null) { <>7__wrap1.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; internal bool IsCruiserCollectionAllowed() { Logger.LogDebug((object)"Checking if cruiser collection is allowed."); bool flag = RoundHelpers.IsLandedOnCompany(); bool flag2 = RoundHelpers.IsInFirstDayOrbitAndRoutingToCompany(); bool flag3 = RoundHelpers.IsInOrbitAndLastLandedOnCompanyAndRoutingToCompany(); Logger.LogDebug((object)("Flags:" + $" IsLandedOnCompany={flag}" + $" IsInFirstDayOrbitAndRoutingToCompany={flag2}" + $" isInOrbitAndLastLandedOnCompanyAndRoutingToCompany={flag3}")); return flag || flag2 || flag3; } [IteratorStateMachine(typeof(<CollectToShipCoroutine>d__3))] internal IEnumerator CollectToShipCoroutine(CollectType collectType) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CollectToShipCoroutine>d__3(0) { <>4__this = this, collectType = collectType }; } [IteratorStateMachine(typeof(<CollectToShipCoroutineInternal>d__4))] internal IEnumerator CollectToShipCoroutineInternal(CollectType collectType) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CollectToShipCoroutineInternal>d__4(0) { collectType = collectType }; } } internal class LandingHistoryManager { private const int LANDING_HISTORY_SIZE = 1; private List<string> landingEntries = new List<string>(); internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public bool AddLandingHistory(string sceneName) { if (string.IsNullOrEmpty(sceneName)) { Logger.LogError((object)"Scene name is null or empty. Cannot add to landing history."); return false; } landingEntries.Add(sceneName); landingEntries = landingEntries.TakeLast(1).ToList(); Logger.LogDebug((object)("Updated landing history. landingEntries=" + string.Join(", ", landingEntries))); return true; } public List<string> GetLandingHistory() { return landingEntries.ToList(); } public bool ClearLandingHistory() { landingEntries.Clear(); return true; } } internal class TerminalCommandManager { private ConfirmableCommand? waitingCommand; internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; internal static Command[] COMMANDS { get; } = new Command[4] { new CollectTypeCommand(CollectType.Scrap), new CollectTypeCommand(CollectType.Tool), new CollectTypeCommand(CollectType.All), new HelpCommand() }; internal TerminalNode? ParseCommand(string[] args) { if (waitingCommand != null) { ExecuteResult executeResult = waitingCommand.ExecuteConfirmation(args); if (executeResult == null) { Logger.LogError((object)"ExecuteConfirmation returned null."); Reset(); return CreateInvalidStateNode(); } waitingCommand = executeResult.NextWaitingCommand; return executeResult.TerminalNode; } Command[] cOMMANDS = COMMANDS; foreach (Command command in cOMMANDS) { if (command.IsMatch(args)) { ExecuteResult executeResult2 = command.Execute(args); if (executeResult2 == null) { Logger.LogError((object)"Execute returned null."); Reset(); return CreateInvalidStateNode(); } waitingCommand = executeResult2.NextWaitingCommand; return executeResult2.TerminalNode; } } return null; } internal void Reset() { Command[] cOMMANDS = COMMANDS; for (int i = 0; i < cOMMANDS.Length; i++) { cOMMANDS[i].Reset(); } waitingCommand = null; } internal TerminalNode CreateInvalidStateNode() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Invalid state."); return TerminalUtils.CreateTerminalNode(stringBuilder.ToString(), clearPreviousText: false); } } } namespace CollectCruiserItemCompany.Helpers { internal static class LandingHistoryHelpers { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public static bool AddLandingHistory(string sceneName) { LandingHistoryManager landingHistoryManager = CollectCruiserItemCompany.LandingHistoryManager; if (landingHistoryManager == null) { Logger.LogError((object)"LandingHistoryManager is null."); return false; } Logger.LogDebug((object)("Adding landing history. sceneName=" + sceneName)); if (!landingHistoryManager.AddLandingHistory(sceneName)) { Logger.LogError((object)("Failed to add landing history. sceneName=" + sceneName)); return false; } Logger.LogDebug((object)("Added landing history. sceneName=" + sceneName)); return true; } public static bool ClearLandingHistory() { LandingHistoryManager landingHistoryManager = CollectCruiserItemCompany.LandingHistoryManager; if (landingHistoryManager == null) { Logger.LogError((object)"LandingHistoryManager is null."); return false; } Logger.LogDebug((object)"Clearing landing history."); if (!landingHistoryManager.ClearLandingHistory()) { Logger.LogError((object)"Failed to clear landing history."); return false; } Logger.LogDebug((object)"Cleared landing history."); return true; } public static bool IsLastLandedOnCompany() { LandingHistoryManager landingHistoryManager = CollectCruiserItemCompany.LandingHistoryManager; if (landingHistoryManager == null) { Logger.LogError((object)"LandingHistoryManager is null."); return false; } List<string> landingHistory = landingHistoryManager.GetLandingHistory(); if (landingHistory == null) { Logger.LogError((object)"Landing history is null."); return false; } string text = landingHistory.LastOrDefault(); if (text == null) { Logger.LogDebug((object)"Last landed scene name is null."); return false; } if (!RoundUtils.IsSceneNameCompany(text)) { Logger.LogDebug((object)"Last landed scene is not company."); return false; } return true; } } internal static class RoundHelpers { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; public static bool IsInFirstDayOrbit() { if (!RoundUtils.IsInOrbit()) { Logger.LogDebug((object)"Not in orbit."); return false; } if (!RoundUtils.IsFirstDay()) { Logger.LogDebug((object)"Not first day."); return false; } return true; } public static bool IsInFirstDayOrbitAndRoutingToCompany() { if (!IsInFirstDayOrbit()) { Logger.LogDebug((object)"Not in first day orbit."); return false; } if (!RoundUtils.IsRoutingToCompany()) { Logger.LogDebug((object)"Not routing to company."); return false; } return true; } public static bool IsLandedOnCompany() { if (RoundUtils.IsInOrbit()) { Logger.LogDebug((object)"In orbit."); return false; } if (!RoundUtils.IsRoutingToCompany()) { Logger.LogDebug((object)"Not routing to company."); return false; } return true; } public static bool IsInOrbitAndLastLandedOnCompanyAndRoutingToCompany() { if (!RoundUtils.IsInOrbit()) { Logger.LogDebug((object)"Not in orbit."); return false; } if (!LandingHistoryHelpers.IsLastLandedOnCompany()) { Logger.LogDebug((object)"Last landed level is not company."); return false; } if (!RoundUtils.IsRoutingToCompany()) { Logger.LogDebug((object)"Not routing to company."); return false; } return true; } } } namespace CollectCruiserItemCompany.Extensions { internal static class IEnumerableExtensions { [CompilerGenerated] private sealed class <Chunk>d__0<T> : IEnumerable<List<T>>, IEnumerable, IEnumerator<List<T>>, IEnumerator, IDisposable { private int <>1__state; private List<T> <>2__current; private int <>l__initialThreadId; private int size; public int <>3__size; private IEnumerable<T> source; public IEnumerable<T> <>3__source; private IEnumerator<T> <e>5__2; List<T> IEnumerator<List<T>>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <Chunk>d__0(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <e>5__2 = null; <>1__state = -2; } private bool MoveNext() { bool result; try { switch (<>1__state) { default: result = false; goto end_IL_0000; case 0: <>1__state = -1; if (size <= 0) { throw new ArgumentOutOfRangeException("size", "Size must be greater than 0."); } <e>5__2 = source.GetEnumerator(); <>1__state = -3; break; case 1: <>1__state = -3; break; } if (<e>5__2.MoveNext()) { List<T> list = new List<T>(size) { <e>5__2.Current }; while (list.Count < size && <e>5__2.MoveNext()) { list.Add(<e>5__2.Current); } <>2__current = list; <>1__state = 1; result = true; } else { result = false; <>m__Finally1(); } end_IL_0000:; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } return result; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<e>5__2 != null) { <e>5__2.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<List<T>> IEnumerable<List<T>>.GetEnumerator() { <Chunk>d__0<T> <Chunk>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <Chunk>d__ = this; } else { <Chunk>d__ = new <Chunk>d__0<T>(0); } <Chunk>d__.source = <>3__source; <Chunk>d__.size = <>3__size; return <Chunk>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<List<T>>)this).GetEnumerator(); } } [IteratorStateMachine(typeof(<Chunk>d__0<>))] public static IEnumerable<List<T>> Chunk<T>(this IEnumerable<T> source, int size) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <Chunk>d__0<T>(-2) { <>3__source = source, <>3__size = size }; } } } namespace CollectCruiserItemCompany.Commands { internal class CollectTypeCommand : ConfirmableCommand { internal readonly CollectType CollectType; internal CollectTypeCommand(CollectType collectType) { CollectType = collectType; } internal override bool IsMatch(string[] args) { args = args.Select((string arg) => arg.ToLower()).ToArray(); if (args.Length < 2) { return false; } string keyword = args[0]; string keyword2 = args[1]; if (!KeywordUtils.IsCollectCommand(keyword)) { return false; } if (CollectType == CollectType.All && KeywordUtils.IsAllArgument(keyword2)) { return true; } if (CollectType == CollectType.Scrap && KeywordUtils.IsScrapArgument(keyword2)) { return true; } if (CollectType == CollectType.Tool && KeywordUtils.IsToolArgument(keyword2)) { return true; } return false; } internal override ExecuteResult? ExecuteCore(string[] args) { if (!CollectCruiserItemCompany.CollectCruiserItemManager.IsCruiserCollectionAllowed()) { Command.Logger.LogInfo((object)"Cruiser collection is not allowed in the current round state. Cannot proceed with collection request."); return new ExecuteResult(CreateCollectionRequestNotAllowedNode(), null); } StringBuilder stringBuilder = new StringBuilder(); if (CollectType == CollectType.All) { stringBuilder.AppendLine("You have requested to collect all items from the cruiser."); } else if (CollectType == CollectType.Scrap) { stringBuilder.AppendLine("You have requested to collect all scraps from the cruiser."); } else if (CollectType == CollectType.Tool) { stringBuilder.AppendLine("You have requested to collect all tools from the cruiser."); } stringBuilder.AppendLine(); stringBuilder.AppendLine("Please CONFIRM or DENY."); return new ExecuteResult(TerminalUtils.CreateTerminalNode(stringBuilder.ToString(), clearPreviousText: true), this); } internal override ExecuteResult ExecuteConfirm() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) if (!CollectCruiserItemCompany.CollectCruiserItemManager.IsCruiserCollectionAllowed()) { Command.Logger.LogInfo((object)"Cruiser collection is not allowed in the current round state. Cannot proceed with collection request."); return new ExecuteResult(CreateCollectionRequestNotAllowedNode(), null); } CollectionNetworkBehaviour collectionNetworkBehaviour = NetworkBehaviourUtils.GetCollectionNetworkBehaviour(); if ((Object)(object)collectionNetworkBehaviour == (Object)null) { Command.Logger.LogError((object)"CollectionNetworkBehaviour is null. Cannot send collect request."); return new ExecuteResult(CreateCollectionRequestNotAllowedNode(), null); } collectionNetworkBehaviour.CollectRequestServerRpc(CollectType); StringBuilder stringBuilder = new StringBuilder(); if (CollectType == CollectType.All) { stringBuilder.AppendLine("Starting collection of all items from the cruiser."); } else if (CollectType == CollectType.Scrap) { stringBuilder.AppendLine("Starting collection of all scraps from the cruiser."); } else { if (CollectType != CollectType.Tool) { Command.Logger.LogError((object)$"Unknown CollectType. CollectType={CollectType}"); return new ExecuteResult(CreateCollectionRequestFailedNode(), null); } stringBuilder.AppendLine("Starting collection of all tools from the cruiser."); } stringBuilder.AppendLine(""); stringBuilder.AppendLine("If the host player does not allow collection by clients, this request will be ignored."); return new ExecuteResult(TerminalUtils.CreateTerminalNode(stringBuilder.ToString(), clearPreviousText: false), null); } internal override ExecuteResult ExecuteDeny() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Cancelled collection."); return new ExecuteResult(TerminalUtils.CreateTerminalNode(stringBuilder.ToString(), clearPreviousText: false), null); } internal TerminalNode CreateCollectionRequestNotAllowedNode() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Collection is not allowed currently."); return TerminalUtils.CreateTerminalNode(stringBuilder.ToString(), clearPreviousText: false); } internal TerminalNode CreateCollectionRequestFailedNode() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Failed to start collection."); return TerminalUtils.CreateTerminalNode(stringBuilder.ToString(), clearPreviousText: false); } } internal sealed class ExecuteResult { internal TerminalNode TerminalNode { get; } internal ConfirmableCommand? NextWaitingCommand { get; } internal ExecuteResult(TerminalNode terminalNode, ConfirmableCommand? nextWaitingCommand) { TerminalNode = terminalNode; NextWaitingCommand = nextWaitingCommand; } } internal abstract class Command { internal static ManualLogSource Logger => CollectCruiserItemCompany.Logger; internal abstract bool IsMatch(string[] args); internal ExecuteResult? Execute(string[] args) { ExecuteResult executeResult = ExecuteCore(args); if (executeResult == null) { Logger.LogError((object)"ExecuteCore returned null."); return null; } ExecuteCorePostfix(executeResult); return executeResult; } internal abstract ExecuteResult? ExecuteCore(string[] args); internal virtual void ExecuteCorePostfix(ExecuteResult result) { } internal virtual void Reset() { } } internal abstract class ConfirmableCommand : Command { private TerminalNode? previousNode; internal abstract ExecuteResult ExecuteConfirm(); internal abstract ExecuteResult ExecuteDeny(); internal virtual ExecuteResult? ExecuteInvalid() { if ((Object)(object)previousNode == (Object)null) { Command.Logger.LogError((object)"previousNode is null."); return null; } return new ExecuteResult(previousNode, this); } internal ExecuteResult? ExecuteConfirmation(string[] args) { ExecuteResult executeResult = ExecuteConfirmationCore(args); if (executeResult == null) { Command.Logger.LogError((object)"ExecuteConfirmationCore returned null."); return null; } previousNode = executeResult.TerminalNode; return executeResult; } internal ExecuteResult? ExecuteConfirmationCore(string[] args) { bool? flag = IsConfirmed(args); if (flag.GetValueOrDefault()) { return ExecuteConfirm(); } if (flag == false) { return ExecuteDeny(); } return ExecuteInvalid(); } internal override void ExecuteCorePostfix(ExecuteResult result) { previousNode = result.TerminalNode; } internal override void Reset() { previousNode = null; } internal bool? IsConfirmed(string[] args) { args = args.Select((string arg) => arg.ToLower()).ToArray(); if (args.Length == 0) { return null; } string text = args[0]; string text2 = ((text.Length > 0) ? text.Substring(0, 1) : string.Empty); if (text2 == "c") { return true; } if (text2 == "d") { return false; } return null; } } internal class HelpCommand : Command { internal override bool IsMatch(string[] args) { args = args.Select((string arg) => arg.ToLower()).ToArray(); if (args.Length == 0) { return false; } if (!KeywordUtils.IsCollectCommand(args[0])) { return false; } return true; } internal override ExecuteResult? ExecuteCore(string[] args) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("CollectCruiserItemCompany v0.3.0"); stringBuilder.AppendLine(); stringBuilder.AppendLine(">COLLECT SCRAP"); stringBuilder.AppendLine("Collect all scraps from the cruiser into your ship."); stringBuilder.AppendLine(); stringBuilder.AppendLine(">COLLECT TOOL"); stringBuilder.AppendLine("Collect all tools from the cruiser into your ship."); stringBuilder.AppendLine(); stringBuilder.AppendLine(">COLLECT ALL"); stringBuilder.AppendLine("Collect all items from the cruiser into your ship."); stringBuilder.AppendLine(); return new ExecuteResult(TerminalUtils.CreateTerminalNode(stringBuilder.ToString(), clearPreviousText: true), null); } } }