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