using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; 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: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: IgnoresAccessChecksTo("Accessibility")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("assembly_googleanalytics")] [assembly: IgnoresAccessChecksTo("assembly_guiutils")] [assembly: IgnoresAccessChecksTo("assembly_lux")] [assembly: IgnoresAccessChecksTo("assembly_postprocessing")] [assembly: IgnoresAccessChecksTo("assembly_simplemeshcombine")] [assembly: IgnoresAccessChecksTo("assembly_steamworks")] [assembly: IgnoresAccessChecksTo("assembly_sunshafts")] [assembly: IgnoresAccessChecksTo("assembly_utils")] [assembly: IgnoresAccessChecksTo("assembly_valheim")] [assembly: IgnoresAccessChecksTo("com.rlabrecque.steamworks.net")] [assembly: IgnoresAccessChecksTo("ConnectedStorage")] [assembly: IgnoresAccessChecksTo("Fishlabs.Common")] [assembly: IgnoresAccessChecksTo("Fishlabs.Core")] [assembly: IgnoresAccessChecksTo("Mono.Posix")] [assembly: IgnoresAccessChecksTo("Mono.WebBrowser")] [assembly: IgnoresAccessChecksTo("netstandard")] [assembly: IgnoresAccessChecksTo("PlayFab")] [assembly: IgnoresAccessChecksTo("PlayFabParty")] [assembly: IgnoresAccessChecksTo("ui_lib")] [assembly: IgnoresAccessChecksTo("XblPCSandbox")] [assembly: IgnoresAccessChecksTo("XGamingRuntime")] [assembly: AssemblyCompany("RtDBrightener")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.9.0")] [assembly: AssemblyInformationalVersion("1.0.9+5dcae63ec13076e9f03446102f2c2938423e9d2f")] [assembly: AssemblyProduct("RtDBrightener")] [assembly: AssemblyTitle("RtDBrightener")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.9.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 RtDBrightener { [BepInPlugin("ashr4f.rtdbrightener", "RtDBrightener", "1.0.9")] public class RtDBrightenerPlugin : BaseUnityPlugin { public const string ModGuid = "ashr4f.rtdbrightener"; public const string ModName = "RtDBrightener"; public const string ModVersion = "1.0.9"; internal static ManualLogSource Log = null; private static ConfigEntry _enabled = null; private static ConfigEntry _brightness = null; private static ConfigEntry _saturation = null; private static ConfigEntry _iconSaturation = null; private static ConfigEntry _iconContrast = null; private static ConfigEntry _iconBrightness = null; private static ConfigEntry _iconExceptions = null; private static ConfigEntry _nameContains = null; private static ConfigEntry _brightenPlants = null; private static ConfigEntry _brightenIcons = null; private static readonly HashSet _doneMaterials = new HashSet(); private static readonly HashSet _doneIcons = new HashSet(); private static readonly Dictionary _texCache = new Dictionary(); private void Awake() { //IL_016c: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; _enabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Master switch."); _brightness = ((BaseUnityPlugin)this).Config.Bind("General", "Brightness Gamma", 0.55f, "Gamma curve applied to 3D materials. 1 = unchanged, lower = brighter shadows. 0.55 lifts dark assets a lot, 0.8 is subtle."); _saturation = ((BaseUnityPlugin)this).Config.Bind("General", "Saturation Multiplier", 1.4f, "Multiplier applied to 3D material color saturation. 1 = unchanged."); _iconSaturation = ((BaseUnityPlugin)this).Config.Bind("General", "Icon Saturation Boost", 2.2f, "Extra color boost for inventory and map icons. 1 = unchanged, higher = more colorful. Applied as a curve, mid colors gain the most."); _iconContrast = ((BaseUnityPlugin)this).Config.Bind("General", "Icon Contrast", 0.2f, "S curve strength for icons, restores depth after the gamma lift. 0 = flat, 0.2 = balanced, 0.5 = punchy."); _iconBrightness = ((BaseUnityPlugin)this).Config.Bind("General", "Icon Brightness Gamma", 0.45f, "Gamma curve for icons only. Lower = brighter. Icons need a stronger lift than 3D models since they get no scene lighting."); _iconExceptions = ((BaseUnityPlugin)this).Config.Bind("General", "Icon Exceptions", "Rice:0.5", "Comma-separated Name:Weight pairs. Weight scales the whole icon effect for matching items. 0 = untouched, 0.5 = half effect, 1 = full. Example: Rice:0.5"); _nameContains = ((BaseUnityPlugin)this).Config.Bind("General", "Name Contains", "Vegetable_*RtD, Pickable_*RtD, Sapling_*RtD, Seed*RtD, SeaWeed", "Comma-separated name fragments. World prefabs whose name contains one of these are brightened, along with the items they drop.\nA * means the name must contain the left part followed by the right part, so Vegetable_*RtD targets crops without touching animals."); _brightenPlants = ((BaseUnityPlugin)this).Config.Bind("General", "Brighten World Objects", true, "Brighten the 3D materials of matching prefabs (plants, pickables)."); _brightenIcons = ((BaseUnityPlugin)this).Config.Bind("General", "Brighten Icons", true, "Brighten the inventory icons of matching items."); new Harmony("ashr4f.rtdbrightener").PatchAll(); } private static float ExceptionWeight(string itemName) { string[] array = _iconExceptions.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { ':' }); if (array2.Length == 2 && itemName.IndexOf(array2[0].Trim(), StringComparison.OrdinalIgnoreCase) >= 0 && float.TryParse(array2[1].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return Mathf.Clamp01(result); } } return 1f; } internal static bool NameMatches(string name) { if (string.IsNullOrEmpty(name)) { return false; } string[] array = _nameContains.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string text = array[i].Trim(); if (text.Length == 0) { continue; } int num = text.IndexOf('*'); if (num >= 0) { string text2 = text.Substring(0, num).Trim(); string text3 = text.Substring(num + 1).Trim(); if (text2.Length != 0 && text3.Length != 0) { int num2 = name.IndexOf(text2, StringComparison.OrdinalIgnoreCase); if (num2 >= 0 && name.IndexOf(text3, num2 + text2.Length, StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } } else if (name.IndexOf(text, StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } return false; } private static Color Adjust(Color c, bool icon) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) float num = default(float); float num3 = default(float); float num2 = default(float); Color.RGBToHSV(c, ref num, ref num2, ref num3); float num4 = (icon ? _iconBrightness.Value : _brightness.Value); float num5 = Mathf.Clamp01(num3); num3 = Mathf.Clamp01(Mathf.Pow(num5, Mathf.Max(0.1f, num4))); if (icon) { float num6 = Mathf.Clamp01(_iconContrast.Value); num3 = Mathf.Lerp(num3, num3 * num3 * (3f - 2f * num3), num6); float num7 = Mathf.Min(2.2f, Mathf.Pow(num3 / Mathf.Max(num5, 0.05f), 0.7f)); float num8 = Mathf.Max(1f, _iconSaturation.Value); float num9 = Mathf.Clamp01(Mathf.Pow(Mathf.Clamp01(num2), 1f / num8)); num2 = Mathf.Clamp01(Mathf.Lerp(num2, num9, Mathf.SmoothStep(0f, 1f, num3)) * Mathf.Max(1f, num7)); if (num2 > 0.8f) { float num10 = (num2 - 0.8f) / 0.2f; num2 = 0.8f + 0.2f * (num10 / (1f + 0.25f * num10)); } } else { num2 = Mathf.Clamp01(num2 * _saturation.Value); } Color result = Color.HSVToRGB(num, num2, num3); result.a = c.a; return result; } private static List FindItemCandidates() { List list = new List(); if ((Object)(object)ObjectDB.instance != (Object)null) { foreach (GameObject item in ObjectDB.instance.m_items) { if ((Object)(object)item != (Object)null && NameMatches(((Object)item).name)) { list.Add(item); } } } if ((Object)(object)ZNetScene.instance != (Object)null) { foreach (GameObject prefab in ZNetScene.instance.m_prefabs) { if (!((Object)(object)prefab == (Object)null) && NameMatches(((Object)prefab).name)) { Pickable component = prefab.GetComponent(); if ((Object)(object)component != (Object)null && (Object)(object)component.m_itemPrefab != (Object)null) { list.Add(component.m_itemPrefab); } if ((Object)(object)prefab.GetComponent() != (Object)null) { list.Add(prefab); } } } } return list; } internal static void BrightenIcons(string phase) { if (!_enabled.Value || !_brightenIcons.Value) { return; } int num = 0; List list = new List(); foreach (GameObject item in FindItemCandidates()) { if ((Object)(object)item == (Object)null || _doneIcons.Contains(((Object)item).name)) { continue; } ItemDrop component = item.GetComponent(); if ((Object)(object)component == (Object)null || component.m_itemData.m_shared.m_icons == null) { continue; } _doneIcons.Add(((Object)item).name); float num2 = ExceptionWeight(((Object)item).name); if (num2 <= 0f) { continue; } int num3 = num; Sprite[] icons = component.m_itemData.m_shared.m_icons; for (int i = 0; i < icons.Length; i++) { Sprite val = BrightenSprite(icons[i], num2); if ((Object)(object)val != (Object)null) { icons[i] = val; num++; } } if (num > num3) { list.Add(((Object)item).name); } int mats = 0; BrightenRenderers(item, ref mats); } if (num > 0) { Log.LogInfo((object)string.Format("{0} [{1}]: brightened {2} icons on: {3}", "RtDBrightener", phase, num, string.Join(", ", list.ToArray()))); } else if (phase == "ZNetScene" && _doneIcons.Count == 0) { Log.LogWarning((object)"RtDBrightener: no item matched. Check the Name Contains filter."); } } private static void BrightenRenderers(GameObject root, ref int mats) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) Renderer[] componentsInChildren = root.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Material[] sharedMaterials = componentsInChildren[i].sharedMaterials; foreach (Material val in sharedMaterials) { if ((Object)(object)val == (Object)null || _doneMaterials.Contains(val)) { continue; } _doneMaterials.Add(val); bool flag = false; if (val.HasProperty("_Color")) { val.SetColor("_Color", Adjust(val.GetColor("_Color"), icon: false)); flag = true; } if (val.HasProperty("_MainTex")) { Texture texture = val.GetTexture("_MainTex"); Texture2D val2 = BrightenTexture((Texture2D)(object)((texture is Texture2D) ? texture : null)); if ((Object)(object)val2 != (Object)null) { val.SetTexture("_MainTex", (Texture)(object)val2); flag = true; } } if (flag) { mats++; } } } } internal static void BrightenAll() { if (!_enabled.Value) { return; } int mats = 0; if (_brightenPlants.Value && (Object)(object)ZNetScene.instance != (Object)null) { foreach (GameObject prefab in ZNetScene.instance.m_prefabs) { if (!((Object)(object)prefab == (Object)null) && NameMatches(((Object)prefab).name)) { BrightenRenderers(prefab, ref mats); } } } BrightenIcons("ZNetScene"); Log.LogInfo((object)string.Format("{0}: adjusted {1} materials.", "RtDBrightener", mats)); } private static Texture2D? BrightenTexture(Texture2D src) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: 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) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)src == (Object)null || ((Texture)src).width > 4096 || ((Texture)src).height > 4096) { return null; } if (_texCache.TryGetValue(src, out Texture2D value)) { return value; } try { RenderTexture temporary = RenderTexture.GetTemporary(((Texture)src).width, ((Texture)src).height, 0, (RenderTextureFormat)0, (RenderTextureReadWrite)2); Graphics.Blit((Texture)(object)src, temporary); RenderTexture active = RenderTexture.active; RenderTexture.active = temporary; Texture2D val = new Texture2D(((Texture)src).width, ((Texture)src).height, (TextureFormat)4, true); val.ReadPixels(new Rect(0f, 0f, (float)((Texture)src).width, (float)((Texture)src).height), 0, 0); RenderTexture.active = active; RenderTexture.ReleaseTemporary(temporary); Color[] pixels = val.GetPixels(); for (int i = 0; i < pixels.Length; i++) { pixels[i] = Adjust(pixels[i], icon: false); } val.SetPixels(pixels); val.Apply(true); ((Object)val).name = ((Object)src).name + "_bright"; _texCache[src] = val; return val; } catch (Exception ex) { Log.LogWarning((object)("RtDBrightener: texture " + ((Object)src).name + " skipped (" + ex.Message + ")")); _texCache[src] = null; return null; } } private static Sprite? BrightenSprite(Sprite sprite, float weight) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //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_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)sprite == (Object)null) { return null; } try { Rect rect = sprite.rect; int num = (int)((Rect)(ref rect)).width; rect = sprite.rect; int num2 = (int)((Rect)(ref rect)).height; Texture2D texture = sprite.texture; RenderTexture temporary = RenderTexture.GetTemporary(((Texture)texture).width, ((Texture)texture).height, 0, (RenderTextureFormat)0, (RenderTextureReadWrite)2); Graphics.Blit((Texture)(object)texture, temporary); RenderTexture active = RenderTexture.active; RenderTexture.active = temporary; Texture2D val = new Texture2D(num, num2, (TextureFormat)4, true); ((Texture)val).wrapMode = (TextureWrapMode)1; rect = sprite.rect; float x = ((Rect)(ref rect)).x; float num3 = ((Texture)texture).height; rect = sprite.rect; val.ReadPixels(new Rect(x, num3 - ((Rect)(ref rect)).y - (float)num2, (float)num, (float)num2), 0, 0); val.Apply(); RenderTexture.active = active; RenderTexture.ReleaseTemporary(temporary); Color[] pixels = val.GetPixels(0); for (int i = 0; i < pixels.Length; i++) { if (!(pixels[i].a < 0.02f)) { pixels[i] = Color.Lerp(pixels[i], Adjust(pixels[i], icon: true), weight); } } val.SetPixels(pixels, 0); val.Apply(true); return Sprite.Create(val, new Rect(0f, 0f, (float)num, (float)num2), new Vector2(0.5f, 0.5f), sprite.pixelsPerUnit); } catch (Exception ex) { Log.LogWarning((object)("RtDBrightener: icon " + ((Object)sprite).name + " skipped (" + ex.Message + ")")); return null; } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] internal static class ObjectDB_Awake_Patch { [HarmonyPriority(0)] private static void Postfix() { RtDBrightenerPlugin.BrightenIcons("ObjectDB"); } } [HarmonyPatch(typeof(ZNetScene), "Awake")] internal static class ZNetScene_Awake_Patch { [HarmonyPriority(0)] private static void Postfix() { RtDBrightenerPlugin.BrightenAll(); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }