using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("BetterLanternsAndLights")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("https://github.com/bryon82/SailwindBetterLanternsAndLights")] [assembly: AssemblyCompany("raddude")] [assembly: AssemblyProduct("BetterLanternsAndLights")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("609d6bc4-2d2c-4fb9-98b4-b62976cadb47")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace BetterLanternsAndLights; [BepInPlugin("com.raddude.betterlanternsandlights", "Better Lanterns and Lights", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class BLL_Plugin : BaseUnityPlugin { public const string PLUGIN_GUID = "com.raddude.betterlanternsandlights"; public const string PLUGIN_NAME = "Better Lanterns and Lights"; public const string PLUGIN_VERSION = "1.0.0"; public const string DYNAMIC_LIGHTS_GUID = "com.nandbrew.dynamiclights"; public const string BETTER_NPC_BOATS_GUID = "com.raddude.betternpcboats"; internal const string DRAGON_CLIFFS_SCENE = "island 9 E Dragon Cliffs"; private static ManualLogSource _logger; public static Light PlayerLight { get; internal set; } internal static BLL_Plugin Instance { get; private set; } internal static void LogDebug(string message) { _logger.LogDebug((object)message); } internal static void LogInfo(string message) { _logger.LogInfo((object)message); } internal static void LogWarning(string message) { _logger.LogWarning((object)message); } internal static void LogError(string message) { _logger.LogError((object)message); } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)((Component)this).gameObject); return; } Instance = this; _logger = ((BaseUnityPlugin)this).Logger; Configs.InitializeConfigs(); Harmony harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.raddude.betterlanternsandlights"); bool flag = false; bool flag2 = false; foreach (PluginInfo value in Chainloader.PluginInfos.Values) { if (value.Metadata.GUID == "com.nandbrew.dynamiclights") { LogInfo("Enabling compatibility with Dynamic Lights."); DynamicLights.ApplyPatch(harmony); flag = true; } else if (value.Metadata.GUID == "com.raddude.betternpcboats") { LogInfo("Enabling compatibility with Better NPC Boats."); BetterNPCBoats.ApplyPatch(harmony); flag2 = true; } if (flag && flag2) { break; } } SceneManager.sceneLoaded += SceneLoaded; } private void Update() { Configs.UpdateConfigs(); } private void SceneLoaded(Scene scene, LoadSceneMode _) { if (((Scene)(ref scene)).name == "island 9 E Dragon Cliffs") { DragonCliffs.Initialize(); } } } internal class BetterNPCBoats { public static void ApplyPatch(Harmony harmony) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown Type type = AccessTools.TypeByName("BetterNPCBoats.BetterNPCFishingBoat"); MethodInfo methodInfo = AccessTools.Method(type, "ToggleLanterns", (Type[])null, (Type[])null); harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(typeof(BetterNPCBoats), "ToggleLanternsPostfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } private static void ToggleLanternsPostfix(object __instance, bool state) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown Component val = (Component)__instance; LanternFlicker component = val.GetComponent(); if (!((Object)(object)component == (Object)null)) { component.SetFlicker(state); } } } internal class DynamicLights { public static void ApplyPatch(Harmony harmony) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown Type type = AccessTools.TypeByName("Dynamic_Lights.IslandStreetlightFire"); MethodInfo methodInfo = AccessTools.Method(type, "SetLight", (Type[])null, (Type[])null); harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(typeof(DynamicLights), "SetLightPostfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } private static void SetLightPostfix(object __instance, bool newState) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown Component val = (Component)__instance; LanternFlicker component = val.GetComponent(); if (!((Object)(object)component == (Object)null)) { component.SetFlicker(newState); } } } internal class LanternPatches { [HarmonyPatch(typeof(PrefabsDirectory), "PopulateShipItems")] internal class AddPaperLanternFlickerPatch { public static void Postfix(PrefabsDirectory __instance) { int[] array = new int[7] { 110, 111, 112, 113, 114, 133, 134 }; int[] array2 = array; foreach (int num in array2) { GameObject val = __instance.directory[num]; val.AddComponent(); } } } [HarmonyPatch(typeof(ShipItemLight), "SetLight")] internal class ShipItemLightSetLightPatch { public static void Postfix(ShipItemLight __instance, bool state) { LanternFlicker component = ((Component)__instance).GetComponent(); if (!((Object)(object)component == (Object)null)) { component.SetFlicker(state); } } } [HarmonyPatch(typeof(GPButtonInventorySlot), "Awake")] public class AddInventoryLantern { public static void Postfix(GPButtonInventorySlot __instance) { InventoryLantern inventoryLantern = ((Component)__instance).gameObject.AddComponent(); inventoryLantern.InventorySlot = __instance; } } } internal class PlayerLightPatches { [HarmonyPatch(typeof(PlayerControllerMirror), "Awake")] internal class PlayerControllerMirrorAwakePatch { public static void Postfix() { Camera main = Camera.main; BLL_Plugin.PlayerLight = ((main != null) ? ((Component)main).GetComponent() : null); } } } internal class StreetLightPatches { [HarmonyPatch(typeof(IslandStreetlight))] internal class IslandStreetlightPatches { [HarmonyPostfix] [HarmonyPatch("Awake")] public static void AddFlicker(IslandStreetlight __instance, Light ___light) { if (!(((Object)___light).name == "senna_lantern_light")) { ((Component)__instance).gameObject.AddComponent(); } } [HarmonyPostfix] [HarmonyPatch("SetLight")] public static void AddFlickerToLight(IslandStreetlight __instance, bool newState) { LanternFlicker component = ((Component)__instance).GetComponent(); if (!((Object)(object)component == (Object)null)) { component.SetFlicker(newState); } } } } internal class DragonCliffs { internal static List DCGateLampGOs { get; private set; } internal static void Initialize() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) DCGateLampGOs = new List(); Vector3[] array = (Vector3[])(object)new Vector3[2] { new Vector3(0f, 3.35f, 3.1f), new Vector3(0f, -3.35f, 3.1f) }; GameObject val = GameObject.Find("island 9 E (dragon cliffs) scenery"); Transform val2 = ((IEnumerable)((Component)val.transform).GetComponentsInChildren(true)).FirstOrDefault((Func)((Transform t) => ((Object)t).name.Equals("east_gate (4)"))); Transform child = ((IEnumerable)((Component)val.transform).GetComponentsInChildren(true)).FirstOrDefault((Func)((Transform t) => ((Object)t).name.Equals("east_street_rope (1)"))).GetChild(0); Vector3[] array2 = array; foreach (Vector3 localPosition in array2) { GameObject val3 = Object.Instantiate(((Component)child).gameObject, val2); val3.transform.localScale = new Vector3(1.33f, 1.33f, 1.33f); val3.transform.localPosition = localPosition; val3.transform.rotation = Quaternion.Euler(270f, 0f, 0f); val3.GetComponent().range = 50f; val3.GetComponent().intensity = 1.5f; DCGateLampGOs.Add(val3); } BLL_Plugin.LogDebug("Dragon Cliffs gate lamps added"); } } internal class InventoryLantern : MonoBehaviour { internal GPButtonInventorySlot InventorySlot { get; set; } private void LateUpdate() { if (Configs.enableInventoryLantern.Value && ((GoPointerButton)InventorySlot).IsLookedAt()) { ShipItem currentItem = InventorySlot.currentItem; if (currentItem is ShipItemLight && (GameInput.GetKeyDown((InputName)9) || Input.GetMouseButtonDown(1))) { ((GoPointerButton)currentItem).OnAltActivate(); } } } } internal class LanternFlicker : MonoBehaviour { private Coroutine flickerCoroutine; internal Material paperOnMat; internal Material paperOffMat; public Light light; public Renderer paperRenderer; private float minIntensity = 1f; private float maxIntensity = 1.5f; private float minEmission = 0.5f; private float maxEmission = 0.8f; private void Awake() { light = ((Component)this).GetComponentInChildren(); ShipItemLight component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null) { paperRenderer = component.GetPrivateField("paperRenderer"); paperOffMat = component.GetPrivateField("paperOffMat"); Renderer obj = paperRenderer; paperOnMat = ((obj != null) ? obj.sharedMaterial : null); } IslandStreetlight component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { paperRenderer = component2.GetPrivateField("renderer"); paperOffMat = component2.GetPrivateField("offMat"); Renderer obj2 = paperRenderer; paperOnMat = ((obj2 != null) ? obj2.sharedMaterial : null); } } internal void SetFlicker(bool enable) { if (Configs.enableLanternFlicker.Value && enable && flickerCoroutine == null) { flickerCoroutine = ((MonoBehaviour)this).StartCoroutine(Flicker()); } else if (!enable && flickerCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(flickerCoroutine); flickerCoroutine = null; } } private IEnumerator Flicker() { float slowTime = Random.value * 100f; float fastTime = Random.value * 100f; while (true) { slowTime += Time.deltaTime * 0.5f; fastTime += Time.deltaTime * 6f; float slow = Mathf.PerlinNoise(slowTime, 0f); float fast = Mathf.PerlinNoise(fastTime, 100f); float flicker = slow * 0.8f + fast * 0.2f; flicker = Mathf.Clamp01(flicker); light.intensity = Mathf.Lerp(minIntensity, maxIntensity, flicker); if ((Object)(object)paperOffMat == (Object)null) { yield return null; continue; } float materialAmount = Mathf.Lerp(0.9f, 1f, flicker); paperRenderer.material.Lerp(paperOffMat, paperOnMat, materialAmount); float emissionStrength = Mathf.Lerp(minEmission, maxEmission, flicker); Color baseEmission = paperOnMat.GetColor("_EmissionColor"); paperRenderer.material.SetColor("_EmissionColor", baseEmission * emissionStrength); yield return null; } } } internal class Configs { internal static ConfigEntry enableLanternFlicker; internal static ConfigEntry addDcGateLamps; internal static ConfigEntry enablePlayerLight; internal static ConfigEntry enableInventoryLantern; private static bool _lastAddDcGateLamps; internal static void InitializeConfigs() { ConfigFile config = ((BaseUnityPlugin)BLL_Plugin.Instance).Config; enableLanternFlicker = config.Bind("Settings", "Enable lantern flicker", true, (ConfigDescription)null); addDcGateLamps = config.Bind("Settings", "Add Dragon Cliffs Gate Lamps", true, (ConfigDescription)null); enablePlayerLight = config.Bind("Settings", "Ambient Player Light", false, "Light emanating from the player."); enableInventoryLantern = config.Bind("Settings", "Activate Lantern In Inventory", true, "The ability to activate the lantern in an inventory slot by right-clicking it (or using other activation button)."); _lastAddDcGateLamps = addDcGateLamps.Value; } internal static void UpdateConfigs() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) bool currentAddDcGateLamps = addDcGateLamps.Value; if (currentAddDcGateLamps != _lastAddDcGateLamps && DragonCliffs.DCGateLampGOs != null) { Scene sceneByName = SceneManager.GetSceneByName("island 9 E Dragon Cliffs"); if (((Scene)(ref sceneByName)).isLoaded) { DragonCliffs.DCGateLampGOs.ForEach(delegate(GameObject lamp) { if (lamp != null) { lamp.SetActive(currentAddDcGateLamps); } }); } _lastAddDcGateLamps = currentAddDcGateLamps; } if ((Object)(object)BLL_Plugin.PlayerLight != (Object)null && ((Behaviour)BLL_Plugin.PlayerLight).enabled != enablePlayerLight.Value) { ((Behaviour)BLL_Plugin.PlayerLight).enabled = enablePlayerLight.Value; } } } internal static class Extensions { public static T GetPrivateField(this object obj, string field) { return (T)Traverse.Create(obj).Field(field).GetValue(); } }