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 PersistentShipObjects v0.2.1
PersistentShipObjects.dll
Decompiled 2 years agousing 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 BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Newtonsoft.Json; using PersistentShipObjects.Patches; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("PersistentShipObjects")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("PersistentShipObjects")] [assembly: AssemblyTitle("PersistentShipObjects")] [assembly: AssemblyVersion("1.0.0.0")] namespace PersistentShipObjects { [BepInPlugin("VivianGreen.PersistentShipObjects", "PersistentShipObjects", "0.2.0")] public class PersistentShipObjects : BaseUnityPlugin { private const string GUID = "VivianGreen.PersistentShipObjects"; private const string NAME = "PersistentShipObjects"; private const string VERSION = "0.2.0"; private readonly Harmony harmony = new Harmony("VivianGreen.PersistentShipObjects"); public static PersistentShipObjects instance; public static string ObjTransformsPath = Application.persistentDataPath + "/PersistentShipObjects/Objects.json"; public static string ObjTransformsFolderPath = Application.persistentDataPath + "/PersistentShipObjects"; public static ConfigEntry<bool> doDebugPrints; public static List<TransformObject> TransformObjectsManager; private const int A_CONCERNING_AMOUNT_OF_NESTING = 30; private const string TAB = "| "; public static ManualLogSource MLS { get; private set; } public void Awake() { Debug.Log((object)ObjTransformsPath); doDebugPrints = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "doDebugPrints", false, "should PersistentShipObjects paint the console yellow?"); if (!File.Exists(ObjTransformsFolderPath)) { Directory.CreateDirectory(ObjTransformsFolderPath); } if (!File.Exists(ObjTransformsPath)) { File.Create(ObjTransformsPath).Dispose(); } TransformObjectsManager = ReadJSON(); Harmony.CreateAndPatchAll(typeof(ShipBuildModeManagerPatch), (string)null); } public static void SaveObjTransforms() { string text = JsonConvert.SerializeObject((object)TransformObjectsManager); Debug.Log((object)"JSON: "); Debug.Log((object)text); File.WriteAllText(ObjTransformsPath, text); } public static TransformObject FindObjectIfExists(int unlockableID) { return TransformObjectsManager.FirstOrDefault((TransformObject obj) => obj.unlockableID == unlockableID); } public static void UpdateObjectManager(TransformObject newObj) { if (newObj != null) { TransformObject transformObject = TransformObjectsManager.FirstOrDefault((TransformObject thisObj) => thisObj.unlockableID == newObj.unlockableID); if (transformObject != null) { TransformObjectsManager.Remove(transformObject); } TransformObjectsManager.Add(newObj); SaveObjTransforms(); } } public static List<TransformObject> ReadJSON() { Console.WriteLine("entering ReadJSON()"); try { string text = File.ReadAllText(ObjTransformsPath) ?? null; if (text != null) { Console.WriteLine(" json:\n" + text); List<TransformObject> list = JsonConvert.DeserializeObject<List<TransformObject>>(text); Console.WriteLine(" length of objs: " + list.Count); foreach (TransformObject item in list) { Console.WriteLine(" object found!"); Console.WriteLine(" named: " + item.unlockableName); } return list; } } catch (Exception ex) { Debug.Log((object)ex); } return new List<TransformObject>(); } public static void DebugLog(object logMessage, char logType = 'i') { ConfigEntry<bool> obj = doDebugPrints; if (obj != null && !obj.Value) { return; } if (logMessage == null) { Console.WriteLine("Error: logMessage is null"); return; } string text = logMessage.ToString(); if (text == null) { Console.WriteLine("Error: LogString is null"); return; } Console.BackgroundColor = ConsoleColor.DarkGray; try { string value = "PersistentShipObjects: " + text; switch (logType) { case 'w': Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(value); break; case 'm': Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(value); break; case 'e': Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(value); break; case 'i': Console.WriteLine(value); break; default: Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("DebugLogger received an invalid log type, but here's whatever this is:"); DebugLog(" " + text, 'w'); break; } Console.ResetColor(); } catch (Exception value2) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(value2); Console.ResetColor(); } } public static void DebugPrintDescendantsWrapper(Transform parent) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) if (doDebugPrints.Value && Object.op_Implicit((Object)(object)((Component)parent).gameObject)) { if (Object.op_Implicit((Object)(object)parent.parent)) { string name = ((Object)((Component)parent.parent).gameObject).name; Vector3 position = parent.parent.position; DebugLog("My parent: " + name + " at pos " + ((object)(Vector3)(ref position)).ToString(), 'w'); } DebugPrintDescendants(parent, ""); } } private static void DebugPrintDescendants(Transform parent, string indentMinusOne) { //IL_0091: 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) //IL_00fa: 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_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown indentMinusOne += "| "; if (indentMinusOne.Length > 30 * "| ".Length) { Console.WriteLine("DebugPrintDescendants: depth is " + indentMinusOne.Length / 4 + ", which is probably very wrong. If this is a mod conflict, got dang they are nesting too hard. Have probably a comical amount of error:"); StackTrace stackTrace = new StackTrace(); Debug.LogError((object)stackTrace); return; } DebugLog(((Component)parent).gameObject, 'w'); DebugLog(((object)((Component)parent).gameObject).GetType(), 'w'); string name = ((Object)((Component)parent).gameObject).name; Vector3 position = parent.position; DebugLog(name + " at pos " + ((object)(Vector3)(ref position)).ToString(), 'w'); string[] obj = new string[9] { indentMinusOne, "P ", ((object)((Component)parent).gameObject).GetType()?.ToString(), " named ", ((Object)parent).name, " at pos ", null, null, null }; position = parent.position; obj[6] = ((object)(Vector3)(ref position)).ToString(); obj[7] = "-------------------- P of "; obj[8] = parent.childCount.ToString(); DebugLog(string.Concat(obj), 'w'); foreach (Transform item in parent) { Transform val = item; DebugLog(indentMinusOne + "| " + ((object)val).GetType()?.ToString() + " named " + ((Object)val).name); if (val.childCount > 0) { DebugPrintDescendants(val, indentMinusOne); } } } } public class TransformObject { public AltVector3 pos; public AltVector3 rot; public int unlockableID; public string unlockableName; public TransformObject(Vector3 newPosition, Vector3 newRotation, int newUnlockableID, string newUnlockableName) { //IL_0009: 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) pos = new AltVector3(newPosition); rot = new AltVector3(newRotation); unlockableID = newUnlockableID; unlockableName = newUnlockableName; } public Vector3 Get(string val) { //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) //IL_004c: 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_0049: Unknown result type (might be due to invalid IL or missing references) string text = val.ToLower(); string text2 = text; if (!(text2 == "pos")) { if (text2 == "rot") { return rot.GetVector3(); } return Vector3.zero; } return pos.GetVector3(); } } public class AltVector3 { public float x; public float y; public float z; public AltVector3(Vector3 value) { //IL_0009: 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) //IL_0021: Unknown result type (might be due to invalid IL or missing references) x = value.x; y = value.y; z = value.z; } public Vector3 GetVector3() { //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) //IL_001b: Unknown result type (might be due to invalid IL or missing references) return new Vector3(x, y, z); } } } namespace PersistentShipObjects.Patches { internal class ShipBuildModeManagerPatch { [HarmonyPatch(typeof(ShipBuildModeManager), "PlaceShipObjectClientRpc")] [HarmonyPrefix] public static void PlaceShipObjectClientRpc(Vector3 newPosition, Vector3 newRotation, NetworkObjectReference objectRef, int playerWhoMoved) { //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_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: 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_0149: Unknown result type (might be due to invalid IL or missing references) NetworkObject val = default(NetworkObject); ((NetworkObjectReference)(ref objectRef)).TryGet(ref val, (NetworkManager)null); PlaceableShipObject componentInChildren = ((Component)val).GetComponentInChildren<PlaceableShipObject>(); if ((Object)(object)componentInChildren == (Object)null) { Debug.LogError((object)"ShipBuildModeManagerPatch: placeableObject is null"); } else if ((Object)(object)((Component)componentInChildren).transform == (Object)null) { Debug.LogError((object)"ShipBuildModeManagerPatch: placeableObject.transform is null"); } else { Transform parent = ((Component)componentInChildren).transform.parent; GameObject val2 = ((parent != null) ? ((Component)parent).gameObject : null); if ((Object)(object)val2 == (Object)null) { Debug.LogError((object)"ShipBuildModeManagerPatch: actualObject is null"); } else { string name = ((Object)val2).name; string[] obj = new string[6] { "ShipBuildModeManagerPatch: Saving trans of ", ((object)componentInChildren).GetType()?.ToString(), " named ", name, " at pos ", null }; Vector3 val3 = newPosition; obj[5] = ((object)(Vector3)(ref val3)).ToString(); Debug.Log((object)string.Concat(obj)); Transform transform = ((Component)((Component)componentInChildren).transform.parent).transform; val3 = ((Component)componentInChildren).transform.parent.position; Debug.Log((object)("old parent position: " + ((object)(Vector3)(ref val3)).ToString())); string unlockableName = StartOfRound.Instance.unlockablesList.unlockables[componentInChildren.unlockableID].unlockableName; TransformObject transformObject = new TransformObject(newPosition, newRotation, componentInChildren.unlockableID, unlockableName); Debug.Log((object)(transformObject.unlockableName + " ID " + transformObject.unlockableID)); PersistentShipObjects.UpdateObjectManager(transformObject); } } Console.WriteLine("early return"); } public static void makeAllPSOsFuckOff(string strxjksdf) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown Object[] array = Object.FindObjectsOfType(typeof(PlaceableShipObject)); for (int i = 0; i < array.Length; i++) { PlaceableShipObject obj = (PlaceableShipObject)array[i]; makePSOFuckOff(obj, strxjksdf); } } public static void makePSOFuckOff(PlaceableShipObject obj, string caller) { //IL_0064: 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) Debug.Log((object)("sending PSO " + ((Object)obj).name + " to fuck off land from " + caller + "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")); Vector3 position = default(Vector3); ((Vector3)(ref position))..ctor(1000f, 10000f, 1000f); if ((Object)(object)obj.parentObjectSecondary != (Object)null) { obj.parentObjectSecondary.position = position; } else if ((Object)(object)obj.parentObject != (Object)null) { ((Component)obj).transform.parent.position = position; } } [HarmonyPatch(typeof(StartOfRound), "OnEnable")] [HarmonyPostfix] public static void Start(ref StartOfRound __instance) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: 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_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(1000f, 1000f, 1000f); Debug.Log((object)"MOVING SHIT AROUND!!!"); Object[] array = Object.FindObjectsOfType(typeof(PlaceableShipObject)); for (int i = 0; i < array.Length; i++) { PlaceableShipObject val2 = (PlaceableShipObject)array[i]; PersistentShipObjects.DebugPrintDescendantsWrapper((val2 != null) ? ((Component)val2).transform : null); TransformObject transformObject = PersistentShipObjects.FindObjectIfExists(val2.unlockableID); if (transformObject != null) { string unlockableName = transformObject.unlockableName; Vector3 position = ((Component)((Component)val2).transform.parent).transform.position; Debug.Log((object)(" Item Found: " + unlockableName + " at pos " + ((object)(Vector3)(ref position)).ToString())); Debug.Log((object)(" type: " + ((object)val2).GetType())); Debug.Log((object)(" name: " + ((Object)val2).name)); Transform parent = ((Component)val2).transform.parent; Debug.Log((object)(" parent type: " + ((parent != null) ? ((object)((Component)parent).gameObject).GetType() : null))); Transform parent2 = ((Component)val2).transform.parent; Debug.Log((object)(" parent name: " + ((parent2 != null) ? ((Object)parent2).name : null))); ((Component)val2.parentObject).transform.position = transformObject.pos.GetVector3(); ((Component)val2.parentObject).transform.rotation = Quaternion.Euler(transformObject.rot.GetVector3()); position = ((Component)val2).transform.parent.position; Debug.Log((object)(" new pos: " + ((object)(Vector3)(ref position)).ToString())); } else { Transform parent3 = ((Component)val2).transform.parent; Debug.Log((object)(" couldn't find " + ((parent3 != null) ? ((Object)parent3).name : null))); } } } } }