using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("assembly_utils")] [assembly: IgnoresAccessChecksTo("assembly_valheim")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("Pass-os")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Deixa a luz da Wisplight forte o suficiente para enxergar. So luz.")] [assembly: AssemblyFileVersion("1.2.1.0")] [assembly: AssemblyInformationalVersion("1.2.1+89bfa956d6149d4719bc244bdd6c8fc28c84acbe")] [assembly: AssemblyProduct("Brighter Wisplight")] [assembly: AssemblyTitle("BrighterWisplight")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 BrighterWisplight { internal static class ModConfig { internal static ConfigEntry Enabled; internal static ConfigEntry IntensityMultiplier; internal static ConfigEntry RangeMultiplier; internal static ConfigEntry CastShadows; internal static ConfigEntry SkipCreatures; internal static ConfigEntry NameFilter; internal static ConfigEntry VerboseLogging; internal static bool Active { get { if (Enabled != null) { return Enabled.Value; } return false; } } internal static void Init(ConfigFile config) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown Enabled = config.Bind("1 - Geral", "Enabled", true, "Liga/desliga o mod inteiro. Desligar restaura os valores originais."); IntensityMultiplier = config.Bind("2 - Luz", "IntensityMultiplier", 1.127699f, new ConfigDescription("Multiplicador do brilho da wisp. 1 = vanilla. Teto baixo de proposito: passar muito de 1 estoura a imagem.", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 1.5f), Array.Empty())); RangeMultiplier = config.Bind("2 - Luz", "RangeMultiplier", 4.397653f, new ConfigDescription("Multiplicador do alcance da luz (quao longe ela ilumina). 1 = vanilla. Aumentar aqui e o jeito seguro de enxergar mais, sem estourar o brilho.", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 5f), Array.Empty())); CastShadows = config.Bind("2 - Luz", "CastShadows", false, "Faz a wisp projetar sombras, como uma tocha de verdade. Fica bonito, mas custa FPS — por isso vem desligado."); SkipCreatures = config.Bind("3 - Avancado", "SkipCreatures", true, "Nao mexe em wisps presas a criaturas. Hugin, Munin e a Mistwalker carregam Demister; sem isto, a luz deles muda junto."); NameFilter = config.Bind("3 - Avancado", "NameFilter", "", "Vazio = afeta a wisp carregada e as tochas de wisp. Preencha com parte do nome do objeto para afetar so ele. Nomes reais: 'Demister' (wisp equipada), '_enabled' (tocha de wisp), 'Mistwalker'. Ligue VerboseLogging para descobrir os nomes reais no seu jogo."); VerboseLogging = config.Bind("3 - Avancado", "VerboseLogging", false, "Loga no console cada objeto afetado, com os valores antes e depois. Use para descobrir nomes para o NameFilter."); } } [BepInPlugin("com.pass-os.brighterwisplight", "Brighter Wisplight", "1.2.1")] [BepInProcess("valheim.exe")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; private Harmony _harmony; private void Awake() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ModConfig.Init(((BaseUnityPlugin)this).Config); ((BaseUnityPlugin)this).Config.SettingChanged += delegate { WispTweaks.ApplyToAll(); }; _harmony = new Harmony("com.pass-os.brighterwisplight"); _harmony.PatchAll(typeof(Plugin).Assembly); Log.LogInfo((object)"Brighter Wisplight v1.2.1 carregado."); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } internal static class WispTweaks { private sealed class LightState { internal Light Light; internal LightFlicker Flicker; internal LightLod Lod; internal float BaseIntensity; internal float BaseRange; internal LightShadows BaseShadows; } private sealed class WispState { internal List Lights = new List(); internal string RootName; } private static readonly ConditionalWeakTable Originals = new ConditionalWeakTable(); private const int MaxClimb = 3; internal static void Apply(Demister demister) { if ((Object)(object)demister == (Object)null) { return; } try { Transform root = FindVisualRoot(demister); if ((Object)(object)root == (Object)null) { if (ModConfig.VerboseLogging.Value) { Plugin.Log.LogInfo((object)("Nenhuma luz encontrada a partir de '" + ((Object)((Component)demister).gameObject).name + "' " + $"(subindo ate {3} niveis). Ignorando.")); } } else { if (!MatchesFilter(root) || (ModConfig.SkipCreatures.Value && IsCreature(root))) { return; } WispState value = Originals.GetValue(((Component)root).gameObject, (GameObject _) => Capture(root)); if (!ModConfig.Active) { Restore(value); return; } ApplyLights(value); if (ModConfig.VerboseLogging.Value) { LogState(demister, value); } } } catch (Exception arg) { Plugin.Log.LogError((object)$"Falha ao aplicar em '{((Object)demister).name}': {arg}"); } } internal static void ApplyToAll() { List demisters = Demister.GetDemisters(); if (demisters != null) { Demister[] array = demisters.ToArray(); for (int i = 0; i < array.Length; i++) { Apply(array[i]); } } } private static Transform FindVisualRoot(Demister demister) { Transform val = ((Component)demister).transform; for (int i = 0; i <= 3; i++) { if (!((Object)(object)val != (Object)null)) { break; } if (((Component)val).GetComponentsInChildren(true).Length != 0) { return val; } Transform parent = val.parent; if ((Object)(object)parent == (Object)null || (Object)(object)((Component)parent).GetComponent() != (Object)null) { break; } val = parent; } return null; } private static WispState Capture(Transform root) { //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) WispState wispState = new WispState { RootName = ((Object)root).name }; Light[] componentsInChildren = ((Component)root).GetComponentsInChildren(true); foreach (Light val in componentsInChildren) { LightFlicker component = ((Component)val).GetComponent(); LightLod component2 = ((Component)val).GetComponent(); wispState.Lights.Add(new LightState { Light = val, Flicker = component, Lod = component2, BaseIntensity = (((Object)(object)component != (Object)null && (Object)(object)component.m_light != (Object)null) ? component.m_baseIntensity : val.intensity), BaseRange = (((Object)(object)component2 != (Object)null && (Object)(object)component2.m_light != (Object)null) ? component2.m_baseRange : val.range), BaseShadows = val.shadows }); } return wispState; } private static void ApplyLights(WispState state) { //IL_00b7: Unknown result type (might be due to invalid IL or missing references) float value = ModConfig.IntensityMultiplier.Value; float value2 = ModConfig.RangeMultiplier.Value; foreach (LightState light in state.Lights) { if (!((Object)(object)light.Light == (Object)null)) { float num = light.BaseIntensity * value; float num2 = light.BaseRange * value2; light.Light.intensity = num; light.Light.range = num2; if ((Object)(object)light.Flicker != (Object)null) { light.Flicker.m_baseIntensity = num; } if ((Object)(object)light.Lod != (Object)null) { light.Lod.m_baseRange = num2; } light.Light.shadows = (LightShadows)(ModConfig.CastShadows.Value ? 2 : ((int)light.BaseShadows)); } } } private static void Restore(WispState state) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) foreach (LightState light in state.Lights) { if (!((Object)(object)light.Light == (Object)null)) { light.Light.intensity = light.BaseIntensity; light.Light.range = light.BaseRange; light.Light.shadows = light.BaseShadows; if ((Object)(object)light.Flicker != (Object)null) { light.Flicker.m_baseIntensity = light.BaseIntensity; } if ((Object)(object)light.Lod != (Object)null) { light.Lod.m_baseRange = light.BaseRange; } } } } private static bool MatchesFilter(Transform root) { string value = ModConfig.NameFilter.Value; if (string.IsNullOrEmpty(value)) { return true; } return ((Object)root).name.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0; } private static bool IsCreature(Transform root) { if (!((Object)(object)((Component)root).GetComponentInParent() != (Object)null) && !((Object)(object)((Component)root).GetComponentInParent() != (Object)null)) { return (Object)(object)((Component)root).GetComponentInParent() != (Object)null; } return true; } private static void LogState(Demister demister, WispState state) { Plugin.Log.LogInfo((object)("Wisp '" + ((Object)((Component)demister).gameObject).name + "' -> raiz visual '" + state.RootName + "': " + $"{state.Lights.Count} luz(es).")); foreach (LightState light in state.Lights) { if (!((Object)(object)light.Light == (Object)null)) { Plugin.Log.LogInfo((object)(" luz '" + ((Object)light.Light).name + "': " + $"intensidade {light.BaseIntensity:0.##} -> {light.Light.intensity:0.##}, " + $"alcance {light.BaseRange:0.##} -> {light.Light.range:0.##}")); } } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.pass-os.brighterwisplight"; public const string PLUGIN_NAME = "Brighter Wisplight"; public const string PLUGIN_VERSION = "1.2.1"; } } namespace BrighterWisplight.Patches { [HarmonyPatch(typeof(Demister))] internal static class DemisterPatches { [HarmonyPostfix] [HarmonyPatch("Awake")] private static void Awake_Postfix(Demister __instance) { WispTweaks.Apply(__instance); } [HarmonyPostfix] [HarmonyPatch("OnEnable")] private static void OnEnable_Postfix(Demister __instance) { WispTweaks.Apply(__instance); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } [EditorBrowsable(EditorBrowsableState.Never)] internal static class IsExternalInit { } }