using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("gaucl")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Fixes vanilla Sailwind bug where boat sails are omitted from save data when masts are inactive.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BoatSailSaveFix")] [assembly: AssemblyTitle("BoatSailSaveFix")] [assembly: AssemblyVersion("1.0.0.0")] namespace BoatSailSaveFix; [BepInPlugin("gaucl.boatsailsavefix", "Boat Sail Save Fix", "1.0.0")] public sealed class Plugin : BaseUnityPlugin { public const string PluginGuid = "gaucl.boatsailsavefix"; public const string PluginName = "Boat Sail Save Fix"; public const string PluginVersion = "1.0.0"; internal static ManualLogSource Log { get; private set; } private void Awake() { Log = ((BaseUnityPlugin)this).Logger; Harmony.CreateAndPatchAll(typeof(SaveableBoatCustomization_GetData_Patch), (string)null); Harmony.CreateAndPatchAll(typeof(SaveableBoatCustomization_LoadData_Patch), (string)null); Log.LogInfo((object)"Boat Sail Save Fix 1.0.0 loaded"); } } internal static class SailDataHelper { internal static SaveSailData FromSail(Sail sail, Mast mast) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0041: 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_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown return new SaveSailData { prefabIndex = sail.prefabIndex, mastIndex = mast.orderIndex, installHeight = sail.GetCurrentInstallHeight(), minAngle = sail.minAngle, maxAngle = sail.maxAngle, health = 100f, sailColor = sail.activeColor, scaleY = sail.GetScaleY(), scaleZ = sail.GetScaleZ() }; } internal static string Key(SaveSailData sail) { return sail.prefabIndex + ":" + sail.mastIndex + ":" + sail.installHeight.ToString("R"); } internal static List CloneList(List source) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown List list = new List(source.Count); foreach (SaveSailData item in source) { list.Add(new SaveSailData { prefabIndex = item.prefabIndex, mastIndex = item.mastIndex, installHeight = item.installHeight, minAngle = item.minAngle, maxAngle = item.maxAngle, health = item.health, sailColor = item.sailColor, scaleY = item.scaleY, scaleZ = item.scaleZ }); } return list; } } [HarmonyPatch(typeof(SaveableBoatCustomization), "GetData")] internal static class SaveableBoatCustomization_GetData_Patch { private static void Postfix(SaveableBoatCustomization __instance, ref SaveBoatCustomizationData __result) { if (__result?.sails == null) { return; } BoatRefs component = ((Component)__instance).GetComponent(); if (!Object.op_Implicit((Object)(object)component)) { return; } HashSet hashSet = new HashSet(); foreach (SaveSailData sail in __result.sails) { hashSet.Add(SailDataHelper.Key(sail)); } int num = 0; Mast[] masts = component.masts; foreach (Mast val in masts) { if (!Object.op_Implicit((Object)(object)val) || ((Component)val).gameObject.activeInHierarchy || val.sails == null) { continue; } foreach (GameObject sail2 in val.sails) { if (!Object.op_Implicit((Object)(object)sail2)) { continue; } Sail component2 = sail2.GetComponent(); if (Object.op_Implicit((Object)(object)component2)) { SaveSailData val2 = SailDataHelper.FromSail(component2, val); if (hashSet.Add(SailDataHelper.Key(val2))) { __result.sails.Add(val2); num++; } } } } if (num > 0) { Plugin.Log.LogInfo((object)$"Preserved {num} sail(s) from inactive masts while saving {((Object)((Component)__instance).gameObject).name}"); } } } [HarmonyPatch(typeof(SaveableBoatCustomization), "LoadData")] internal static class SaveableBoatCustomization_LoadData_Patch { private static readonly Dictionary> Cache = new Dictionary>(); private static void Prefix(SaveableBoatCustomization __instance, SaveBoatCustomizationData data) { if (data?.sails != null && data.sails.Count <= 0) { SaveableObject component = ((Component)__instance).GetComponent(); if (Object.op_Implicit((Object)(object)component) && Cache.TryGetValue(component.sceneIndex, out var value) && value.Count != 0) { data.sails = SailDataHelper.CloneList(value); Plugin.Log.LogInfo((object)$"Restored {value.Count} cached sail(s) for {((Object)((Component)__instance).gameObject).name} (sceneIndex {component.sceneIndex})"); } } } private static void Postfix(SaveableBoatCustomization __instance, SaveBoatCustomizationData data) { if (data?.sails != null && data.sails.Count != 0) { SaveableObject component = ((Component)__instance).GetComponent(); if (Object.op_Implicit((Object)(object)component)) { Cache[component.sceneIndex] = SailDataHelper.CloneList(data.sails); } } } }