Decompiled source of Visuals Modifier v0.2.0
VisualsModifier.dll
Decompiled 5 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using ServerSync; using TMPro; using UnityEngine; using UnityEngine.Rendering; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<a93693c2-4568-48d4-8914-6dfb12dc7bc8>Embedded] internal sealed class <a93693c2-4568-48d4-8914-6dfb12dc7bc8>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [<a93693c2-4568-48d4-8914-6dfb12dc7bc8>Embedded] [CompilerGenerated] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <3b64ce3b-0775-471d-a42b-da39acf52a2e>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <3b64ce3b-0775-471d-a42b-da39acf52a2e>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <3b64ce3b-0775-471d-a42b-da39acf52a2e>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<a93693c2-4568-48d4-8914-6dfb12dc7bc8>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContextAttribute : Attribute { public readonly byte Flag; public <7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace VisualsModifier { [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class Colour { private static Color GRAYSCALE = new Color(0.2126729f, 0.7151522f, 0.072175f); public static Texture2D CloneTexture(Texture2D texture) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown RenderTexture temporary = RenderTexture.GetTemporary(((Texture)texture).width, ((Texture)texture).height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)1); Graphics.Blit((Texture)(object)texture, temporary); RenderTexture active = RenderTexture.active; RenderTexture.active = temporary; Texture2D val = new Texture2D(((Texture)texture).width, ((Texture)texture).height); val.ReadPixels(new Rect(0f, 0f, (float)((Texture)temporary).width, (float)((Texture)temporary).height), 0, 0); val.Apply(); RenderTexture.active = active; RenderTexture.ReleaseTemporary(temporary); return val; } public static Color Screen(Color pixel, Color screen) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: 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) Color result = pixel + screen - pixel * screen; result.a = pixel.a; return result; } public static Color Multiply(Color pixel, Color multiply) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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) Color result = pixel * multiply; result.a = pixel.a; return result; } public static Color Overlay(Color pixel, Color overlay) { //IL_0052: 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_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //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_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: 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) if (!((double)((Color)(ref pixel)).grayscale < 0.5)) { return Color.white - Color.white * 2f * (Color.white - pixel) * (Color.white - overlay); } return 2f * pixel * overlay; } private static float Luminance(Color a) { //IL_000a: 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) //IL_002d: Unknown result type (might be due to invalid IL or missing references) return GRAYSCALE.r * a.r + GRAYSCALE.g * a.g + GRAYSCALE.b * a.b; } public static Color32 Cell(Color32 initial, Color32 high, Color32 low, Color32 mid, float midHigh = 0.66f, float midLow = 0.33f) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: 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_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_0024: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_0085: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_006c: Unknown result type (might be due to invalid IL or missing references) float num = Luminance(Color32.op_Implicit(initial)); if (num >= midHigh) { Color val = Color.Lerp(Color32.op_Implicit(initial), Color32.op_Implicit(high), num / 2f); val.a = (int)initial.a; return Color32.op_Implicit(val); } if (num <= midLow) { Color val2 = Color.Lerp(Color32.op_Implicit(initial), Color32.op_Implicit(low), num / 2f); val2.a = (int)initial.a; return Color32.op_Implicit(val2); } return Color32.op_Implicit(Color.Lerp(Color32.op_Implicit(initial), Color32.op_Implicit(mid), num / 2f)); } public static Texture2D AsGrayscale(Texture2D texture) { //IL_0030: 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_0047: 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) //IL_004e: 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) Texture2D val = CloneTexture(texture); try { Color[] pixels = val.GetPixels(); Color[] array = (Color[])(object)new Color[pixels.Length]; for (uint num = 0u; num < ((Texture)texture).width; num++) { for (uint num2 = 0u; num2 < ((Texture)texture).height; num2++) { Color val2 = pixels[num + num2 * ((Texture)texture).width]; array[num + num2 * ((Texture)texture).width] = val2 * GRAYSCALE; } } val.SetPixels(array); val.Apply(); } catch (Exception ex) { Debug.Log((object)ex.Message); } return val; } public static Texture2D AsGrayscaleColoured(Texture2D texture, Color colour) { //IL_0030: 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_0047: 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) //IL_004e: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) Texture2D val = CloneTexture(texture); try { Color[] pixels = val.GetPixels(); Color[] array = (Color[])(object)new Color[pixels.Length]; for (uint num = 0u; num < ((Texture)texture).width; num++) { for (uint num2 = 0u; num2 < ((Texture)texture).height; num2++) { Color val2 = pixels[num + num2 * ((Texture)texture).width]; array[num + num2 * ((Texture)texture).width] = Screen(val2 * GRAYSCALE, colour); } } val.SetPixels(array); val.Apply(); } catch (Exception ex) { Debug.Log((object)ex.Message); } return val; } public static Texture2D AsScreen(Texture2D texture, Color colour) { //IL_0030: 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_0047: 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) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) Texture2D val = CloneTexture(texture); try { Color32[] pixels = val.GetPixels32(); Color32[] array = (Color32[])(object)new Color32[pixels.Length]; for (uint num = 0u; num < ((Texture)texture).width; num++) { for (uint num2 = 0u; num2 < ((Texture)texture).height; num2++) { Color32 val2 = pixels[num + num2 * ((Texture)texture).width]; array[num + num2 * ((Texture)texture).width] = Color32.op_Implicit(Screen(Color32.op_Implicit(val2), colour)); } } val.SetPixels32(array); val.Apply(); } catch (Exception ex) { Debug.Log((object)ex.Message); } return val; } public static Texture2D AsMultiply(Texture2D texture, Color colour) { //IL_0030: 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_0047: 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) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) Texture2D val = CloneTexture(texture); try { Color32[] pixels = val.GetPixels32(); Color32[] array = (Color32[])(object)new Color32[pixels.Length]; for (uint num = 0u; num < ((Texture)texture).width; num++) { for (uint num2 = 0u; num2 < ((Texture)texture).height; num2++) { Color32 val2 = pixels[num + num2 * ((Texture)texture).width]; array[num + num2 * ((Texture)texture).width] = Color32.op_Implicit(Multiply(Color32.op_Implicit(val2), colour)); } } val.SetPixels32(array); val.Apply(); } catch (Exception ex) { Debug.Log((object)ex.Message); } return val; } public static Texture2D AsCell(Texture2D texture, Color32 high, Color32 low, Color32? mid) { //IL_0036: 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_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0089: 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_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: 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_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_0070: Unknown result type (might be due to invalid IL or missing references) Texture2D val = CloneTexture(texture); try { Color32[] pixels = val.GetPixels32(); Color32[] array = (Color32[])(object)new Color32[pixels.Length]; for (uint num = 0u; num < ((Texture)texture).width; num++) { for (uint num2 = 0u; num2 < ((Texture)texture).height; num2++) { Color32 val2 = pixels[num + num2 * ((Texture)texture).width]; if (mid.HasValue) { array[num + num2 * ((Texture)texture).width] = Cell(val2, high, low, mid.Value); } else { array[num + num2 * ((Texture)texture).width] = Cell(val2, high, low, val2); } } } val.SetPixels32(array); val.Apply(); } catch (Exception ex) { Debug.Log((object)ex.Message); } return val; } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public static class DataManager { private static ColorConverter cc; private static ValheimTimeConverter vtc; private static ISerializer _serializer; private static IDeserializer _deserializer; public static Dictionary<string, Material> cache; public static Dictionary<string, Material> materials; public static event EventHandler<MaterialEventArgs> OnMaterialAdd; public static event EventHandler<MaterialEventArgs> OnMaterialChange; static DataManager() { cc = new ColorConverter(); vtc = new ValheimTimeConverter(); _serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).WithTypeConverter(cc).WithTypeConverter(vtc) .Build(); _deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).WithTypeConverter(cc).WithTypeConverter(vtc) .Build(); cache = new Dictionary<string, Material>(); materials = new Dictionary<string, Material>(); Material[] array = Resources.FindObjectsOfTypeAll<Material>(); foreach (Material val in array) { cache.Add(((Object)val).name, val); } } public static void LoadMaterials(string path) { string[] files = Directory.GetFiles(path, "*.yml", SearchOption.AllDirectories); for (int i = 0; i < files.Length; i++) { LoadMaterial(files[i]); } } public static MaterialInstance LoadMaterial(string file) { MaterialInstance materialInstance = _deserializer.Deserialize<MaterialInstance>(File.ReadAllText(file)); if (!materials.ContainsKey(materialInstance.Name) && cache.ContainsKey(materialInstance.Original)) { Material val = Object.Instantiate<Material>(cache[materialInstance.Original]); DataManager.OnMaterialAdd(null, new MaterialEventArgs(val, materialInstance)); materials.Add(materialInstance.Name, val); } else if (materials.ContainsKey(materialInstance.Name)) { DataManager.OnMaterialChange(null, new MaterialEventArgs(materials[materialInstance.Name], materialInstance)); } return materialInstance; } public static void SaveTexture(string name, Material material, string property) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown byte[] bytes = ImageConversion.EncodeToPNG((Texture2D)material.GetTexture(property)); File.WriteAllBytes(Path.Combine(Plugin.Storage, "Materials", name + ".png"), bytes); } public static Texture2D LoadTexture(string name) { //IL_0030: 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_003c: Expected O, but got Unknown //IL_003e: Expected O, but got Unknown string path = Path.Combine(Plugin.Storage, "Materials", name + ".png"); if (!File.Exists(path)) { return null; } byte[] array = File.ReadAllBytes(path); Texture2D val = new Texture2D(16, 16); ImageConversion.LoadImage(val, array); return val; } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class MaterialEventArgs : EventArgs { public Material Material { get; private set; } public MaterialInstance MaterialInstance { get; private set; } public MaterialEventArgs(Material m, MaterialInstance mi) { Material = m; MaterialInstance = mi; } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public interface IManipulator { void Invoke(Renderer m, GameObject prefab); void Invoke(Material m, GameObject prefab); } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] internal class MaterialsManipulator : IManipulator { private List<List<IMaterialEffect>> effects = new List<List<IMaterialEffect>>(); public MaterialsManipulator(MaterialData[] materialChanges) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < materialChanges.Length; i++) { MaterialData materialData = materialChanges[i]; effects.Add(new List<IMaterialEffect>()); if (materialData.Colors != null) { foreach (KeyValuePair<string, Color> color in materialData.Colors) { effects[i].Add(new MaterialColorEffect(color.Key, color.Value)); } } if (materialData.Floats == null) { continue; } foreach (KeyValuePair<string, float> @float in materialData.Floats) { effects[i].Add(new MaterialFloatEffect(@float.Key, @float.Value)); } } } public void Invoke(Renderer smr, GameObject prefab) { for (int j = 0; j < smr.sharedMaterials.Length && j < effects.Count; j++) { Material i = smr.sharedMaterials[j]; if (effects[j] != null) { effects[j].ForEach(delegate(IMaterialEffect e) { e.Apply(i); }); } } } public void Invoke(Material m, GameObject prefab) { } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public interface IMaterialEffect { void Apply(Material m); void Apply(MaterialPropertyBlock m); } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] internal interface IRealtimeApplicator { void Apply(Transform transform, GameObject prefab); } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class RealtimeApplicator : IRealtimeApplicator { private Type _type; public RealtimeApplicator(Type type) { _type = type; } public void Apply(Transform transform, GameObject prefab) { object obj = ((Component)transform).gameObject.GetComponent(_type); if (obj == null) { obj = ((Component)transform).gameObject.AddComponent(_type); } ((IRealtimeEffector)obj).SetVisuals(VisualController.GetVisualIndex(((Object)prefab).name)); } } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class RealtimeColorEffect : RealtimeMaterialEffect<Color> { public RealtimeColorEffect(string name, Color value) : base(name, value) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public override void Apply(MaterialPropertyBlock mpb, Material m, RealtimeEffectData context, float ratio) { //IL_0029: 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_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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) if (!Cached) { Cache = m.GetColor(base.Name); Cached = true; } mpb.SetColor(base.Name, Color.Lerp(Cache, base.Value, ratio)); } } [Serializable] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public abstract class RealtimeComponentEffect<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T> : IRealtimeEffect { protected T Component; protected bool Cached; public RealtimeComponentEffect() { Cached = false; } public static T GetNearestComponent<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T>(Transform transform) { T component = ((Component)transform).GetComponent<T>(); if (component != null) { return component; } if ((Object)(object)transform.parent != (Object)null) { return GetNearestComponent<T>(transform.parent); } return component; } public static T GetChildComponent<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T>(Transform t, string name) { Transform val = t.Find(name); if (Object.op_Implicit((Object)(object)val)) { return ((Component)val).GetComponent<T>(); } return default(T); } public abstract void Apply(Transform t, float ratio); public void Apply(MaterialPropertyBlock mpb, Material m, RealtimeEffectData data, float ratio) { } } [Serializable] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public abstract class RealtimeMaterialEffect<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T> : IRealtimeEffect { protected T Cache; protected bool Cached; public string Name { get; set; } public T Value { get; set; } public RealtimeMaterialEffect(string name, T value) { Name = name; Value = value; Cached = false; } public void Restore(T value) { Cache = value; } public abstract void Apply(MaterialPropertyBlock mpb, Material m, RealtimeEffectData context, float ratio); public void Apply(Transform t, float ratio) { } } [Serializable] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class RealtimeFloatEffect : RealtimeMaterialEffect<float> { public RealtimeFloatEffect(string name, float value) : base(name, value) { } public override void Apply(MaterialPropertyBlock mpb, Material m, RealtimeEffectData context, float ratio) { if (!Cached) { Cache = m.GetFloat(base.Name); Cached = true; } mpb.SetFloat(base.Name, Mathf.Lerp(Cache, base.Value, ratio)); } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class RealtimeManipulator : IManipulator { private RealtimeEffectData Effect; private List<IRealtimeApplicator> Applicators = new List<IRealtimeApplicator>(); public RealtimeManipulator(RealtimeEffectData effect) { Effect = effect; switch (Effect.Type) { case RealtimeEffectType.Time: AddValue(new RealtimeApplicator(typeof(TimeEffector))); break; case RealtimeEffectType.Proximity: AddValue(new RealtimeApplicator(typeof(ProximityEffector))); break; case RealtimeEffectType.Biome: AddValue(new RealtimeApplicator(typeof(BiomeEffector))); break; } } public void AddValue<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] IRealtimeApplicator>(IRealtimeApplicator data) { Applicators.Add((VisualsModifier.IRealtimeApplicator)(object)data); } public void Invoke(Renderer renderer, GameObject prefab) { Applicators.ForEach(delegate(IRealtimeApplicator e) { e.Apply(((Component)renderer).transform, prefab); }); } public void Invoke(Material m, GameObject prefab) { } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] internal class MaterialManipulator : IManipulator { private List<IMaterialEffect> properties = new List<IMaterialEffect>(); public MaterialManipulator(MaterialData data) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (data.Colors != null) { foreach (KeyValuePair<string, Color> color in data.Colors) { AddValue(new MaterialColorEffect(color.Key, color.Value)); } } if (data.Floats == null) { return; } foreach (KeyValuePair<string, float> @float in data.Floats) { AddValue(new MaterialFloatEffect(@float.Key, @float.Value)); } } public void Invoke(Renderer smr, GameObject prefab) { properties.ForEach(delegate(IMaterialEffect p) { Material[] sharedMaterials = smr.sharedMaterials; foreach (Material val in sharedMaterials) { if (Object.op_Implicit((Object)(object)val)) { p.Apply(val); } } }); } public void Invoke(Material m, GameObject prefab) { properties.ForEach(delegate(IMaterialEffect e) { if (Object.op_Implicit((Object)(object)m)) { e.Apply(m); } }); } public void AddValue<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] IMaterialEffect>(IMaterialEffect p) { if (p != null) { properties.Add((VisualsModifier.IMaterialEffect)(object)p); } } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class MaterialColorEffect : MaterialEffect<Color>, IMaterialEffect { public MaterialColorEffect(string name, Color value) : base(name, value) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public void Apply(Material m) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) m.SetColor(Name, Value); } public void Apply(MaterialPropertyBlock m) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) m.SetColor(Name, Value); } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public abstract class MaterialEffect<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T> { protected string Name; protected T Value; public MaterialEffect(string name, T value) { Name = name; Value = value; } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class MaterialFloatEffect : MaterialEffect<float>, IMaterialEffect { public MaterialFloatEffect(string name, float value) : base(name, value) { } public void Apply(Material m) { m.SetFloat(Name, Value); } public void Apply(MaterialPropertyBlock m) { m.SetFloat(Name, Value); } } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(new byte[] { 0, 1 })] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class RealtimeLightEffect : RealtimeComponentEffect<Light> { private float RangeCache; private Color ColorCache = new Color(1f, 1f, 1f, 1f); private LightData Value; public RealtimeLightEffect(LightData data) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) Value = data; } public override void Apply(Transform t, float ratio) { //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_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) if (!Cached) { Component = RealtimeComponentEffect<Light>.GetNearestComponent<Light>(t); if ((Object)(object)Component != (Object)null) { RangeCache = Component.range; ColorCache = Component.color; Cached = true; } } if ((Object)(object)Component == (Object)null) { Debug.LogError((object)"Visuals Modifier: Unable to update light effect, component not found."); Cached = true; return; } ((Behaviour)Component).enabled = ratio > 0f; if (Value.Range.HasValue) { Component.range = Mathf.Lerp(RangeCache, Value.Range.Value, ratio); } _ = Value.Color; Component.color = Color.Lerp(ColorCache, Value.Color, ratio); } } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(new byte[] { 0, 1 })] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class RealtimeParticleEffect : RealtimeComponentEffect<ParticleSystem> { private MainModule Cache; private LightData Value; private Transform Flare; private Renderer Renderer; private Vector3 ScaleCache = Vector3.one; public RealtimeParticleEffect(LightData data) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Value = data; } public override void Apply(Transform t, float ratio) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0104: 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_010f: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) if (!Cached) { Flare = t.Find("flare"); Component = RealtimeComponentEffect<ParticleSystem>.GetChildComponent<ParticleSystem>(t, "flare"); Renderer = ((Component)Flare).GetComponent<Renderer>(); if ((Object)(object)Component != (Object)null) { Cache = Component.main; ScaleCache = ((Component)Component).transform.localScale; Cached = true; } } if ((Object)(object)Component == (Object)null) { Debug.LogError((object)"Visuals Modifier: Unable to update particle effect, component not found."); Cached = true; return; } Renderer.enabled = ratio > 0f; if (Value.Range.HasValue) { ((Component)Component).transform.localScale = Vector3.Lerp(ScaleCache, Value.Range.Value * ScaleCache, ratio); } ((MainModule)(ref Cache)).startColor = MinMaxGradient.op_Implicit(Color.Lerp(Color.black, Value.Color, ratio)); } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] internal class RendererManipulator : IManipulator { private List<IRendererEffect> effects = new List<IRendererEffect>(); public RendererManipulator(ShaderData data) { if (data.MaterialInstances != null) { AddValue(new RendererMaterialsEffect(data.MaterialInstances)); } else if ((Object)(object)data.MaterialInstance != (Object)null) { AddValue(new RendererMaterialEffect(data.MaterialInstance)); } if (data.Name != null && data.Name != "") { AddValue(new RendererShaderEffect(data.Name)); } } public void Invoke(Renderer smr, GameObject _prefab) { effects.ForEach(delegate(IRendererEffect e) { e.Apply(smr); }); } public void Invoke(Material m, GameObject prefab) { throw new NotImplementedException(); } public void AddValue<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] IRendererEffect>(IRendererEffect e) { if (e != null) { effects.Add((VisualsModifier.IRendererEffect)(object)e); } } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public interface IRendererEffect { void Apply(Renderer r); } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class RendererMaterialEffect : IRendererEffect { public Material Value { get; set; } public RendererMaterialEffect(Material material) { Value = material; } public void Apply(Renderer r) { if (r.sharedMaterials.Length > 1) { Material[] sharedMaterials = r.sharedMaterials; for (int i = 0; i < sharedMaterials.Length; i++) { sharedMaterials[i] = Value; } r.sharedMaterials = sharedMaterials; } else { r.sharedMaterial = Value; } } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class RendererMaterialsEffect : IRendererEffect { public Material[] Value { get; set; } public RendererMaterialsEffect(Material[] materials) { Value = materials; } public void Apply(Renderer r) { if (r.sharedMaterials.Length > 1) { r.sharedMaterials = Value; } else { r.sharedMaterial = Value[0]; } } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class RendererShaderEffect : IRendererEffect { public string Value { get; set; } private Shader Shader { get; set; } public RendererShaderEffect(string shader) { Value = shader; Shader = Shader.Find(shader); } public void Apply(Renderer r) { Material[] sharedMaterials = r.sharedMaterials; for (int i = 0; i < sharedMaterials.Length; i++) { sharedMaterials[i].shader = Shader; } } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class TextureManipulator : IManipulator { private List<ITextureEffect> effects = new List<ITextureEffect>(); private Texture2D _texture; public TextureManipulator(TextureData data, Texture2D texture = null) { //IL_006a: 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) if (Object.op_Implicit((Object)(object)texture)) { _texture = texture; } switch (data.Effect) { case TextureEffect.Multiply: AddValue(new TextureMultiplyEffect(data.Name, data.Colors[0])); break; case TextureEffect.Screen: AddValue(new TextureScreenEffect(data.Name, data.Colors[0])); break; case TextureEffect.Edge: AddValue(new TextureToonEffect(data.Name, data.Colors.ToArray())); break; case TextureEffect.Overlay: break; } } public void AddValue<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] ITextureEffect>(ITextureEffect value) { if (value != null) { effects.Add((VisualsModifier.ITextureEffect)(object)value); } } public void Invoke(Renderer smr, GameObject _prefab) { effects.ForEach(delegate(ITextureEffect e) { Material[] sharedMaterials = smr.sharedMaterials; foreach (Material m in sharedMaterials) { e.Apply(m, _texture); } }); } public void Invoke(Material m, GameObject prefab) { effects.ForEach(delegate(ITextureEffect e) { e.Apply(m, _texture); }); } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public interface ITextureEffect { void Apply(Material m, Texture2D t = null); void Apply(MaterialPropertyBlock m, Texture2D t = null); } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public abstract class TextureEffect<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T> { public T Value { get; set; } public string Name { get; set; } protected Texture2D Cache { get; set; } public TextureEffect(string name, T value) { Name = name; Value = value; } public Texture2D GetTexture(Material m) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)Cache)) { Cache = (Texture2D)m.GetTexture(Name); } return Cache; } public Texture2D GetTexture(MaterialPropertyBlock m) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)Cache)) { Cache = (Texture2D)m.GetTexture(Name); } return Cache; } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class TextureMultiplyEffect : TextureEffect<Color>, ITextureEffect { public TextureMultiplyEffect(string name, Color value) : base(name, value) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public void Apply(Material m, Texture2D tex = null) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)tex == (Object)null) { tex = GetTexture(m); } if ((Object)(object)tex != (Object)null && m.HasProperty(base.Name)) { m.SetTexture(base.Name, (Texture)(object)Colour.AsMultiply(tex, base.Value)); } } public void Apply(MaterialPropertyBlock m, Texture2D tex = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)tex == (Object)null) { tex = GetTexture(m); } if ((Object)(object)tex != (Object)null) { m.SetTexture(base.Name, (Texture)(object)Colour.AsMultiply(tex, base.Value)); } } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class TextureScreenEffect : TextureEffect<Color>, ITextureEffect { public TextureScreenEffect(string name, Color value) : base(name, value) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public void Apply(Material m, Texture2D tex = null) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) _ = ((Object)m).name.Split(new string[1] { "(Clone)" }, StringSplitOptions.None)[0]; if (!VisualController.ProcessedTextures.ContainsKey(((Object)m).name) && m.HasProperty(base.Name)) { if ((Object)(object)tex == (Object)null) { tex = GetTexture(m); } if ((Object)(object)tex != (Object)null && m.HasProperty(base.Name)) { m.SetTexture(base.Name, (Texture)(object)Colour.AsScreen(tex, base.Value)); } } } public void Apply(MaterialPropertyBlock m, Texture2D tex = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)tex == (Object)null) { tex = GetTexture(m); } if ((Object)(object)tex != (Object)null) { m.SetTexture(base.Name, (Texture)(object)Colour.AsScreen(tex, base.Value)); } } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(new byte[] { 0, 1 })] public class TextureToonEffect : TextureEffect<Color[]>, ITextureEffect { public TextureToonEffect(string name, Color[] value) : base(name, value) { } public void Apply(Material m, Texture2D tex = null) { //IL_0035: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)tex == (Object)null) { tex = GetTexture(m); } if ((Object)(object)tex != (Object)null && base.Value.Length >= 3) { m.SetTexture(base.Name, (Texture)(object)Colour.AsCell(tex, Color32.op_Implicit(base.Value[0]), Color32.op_Implicit(base.Value[1]), Color32.op_Implicit(base.Value[2]))); } } public void Apply(MaterialPropertyBlock m, Texture2D tex = null) { //IL_002a: 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_0040: 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_0051: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)tex == (Object)null) { tex = GetTexture(m); } if ((Object)(object)tex != (Object)null) { m.SetTexture(base.Name, (Texture)(object)Colour.AsCell(tex, Color32.op_Implicit(base.Value[0]), Color32.op_Implicit(base.Value[1]), Color32.op_Implicit(base.Value[2]))); } } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public static class MaterialManager { private static Dictionary<string, Material> _materials = new Dictionary<string, Material>(); private static Dictionary<string, Material> _shared = new Dictionary<string, Material>(); public static Material RegisterMaterial(string name, Material original) { if (_materials.ContainsKey(name)) { return _materials[name]; } Material val = Object.Instantiate<Material>(original); ((Object)val).name = name; _materials[name] = val; return val; } public static void Clone(string name, Renderer[] renderers) { Dictionary<string, bool> dictionary = new Dictionary<string, bool>(); foreach (Renderer val in renderers) { bool flag = false; if ((Object)(object)val == (Object)null || dictionary.ContainsKey(((Object)val).name)) { continue; } dictionary[((Object)val).name] = true; if (val.sharedMaterials == null) { continue; } List<Material> list = new List<Material>(); for (int j = 0; j < val.sharedMaterials.Length; j++) { Material val2 = val.sharedMaterials[j]; if (!((Object)(object)val2 == (Object)null)) { string text = name + ((((Object)val2).name != null) ? ((Object)val2).name : "Unknown"); if (!_shared.ContainsKey(text) && !_shared.ContainsKey(((Object)val2).name)) { Material val3 = Object.Instantiate<Material>(val2); ((Object)val3).name = text; _shared[text] = val3; list.Add(val3); flag = true; } else if (_shared.ContainsKey(((Object)val2).name)) { list.Add(_shared[((Object)val2).name]); flag = true; } else { list.Add(_shared[text]); flag = true; } } } if (flag) { val.sharedMaterials = list.ToArray(); } } } public static void Clear() { foreach (Material value in _materials.Values) { Object.DestroyImmediate((Object)(object)value); } _materials.Clear(); } public static Material Get(string name) { return _materials[name]; } public static bool Contains(string name) { return _materials.ContainsKey(name); } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class BiomeEffector : MonoBehaviour, IRealtimeEffector { private const int UPDATE_INTERVAL = 1; private const int TRANSITION_DURATION = 1; private Renderer _renderer; private MaterialPropertyBlock _block; private List<IRealtimeEffect> _effects = new List<IRealtimeEffect>(); private float _currentRatio; private RealtimeEffectData _effectContext; private void Awake() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown _block = new MaterialPropertyBlock(); _renderer = ((Component)this).GetComponentInChildren<Renderer>(); if ((Object)(object)_renderer == (Object)null) { Debug.LogError((object)"BiomeEffector: Failed to retrieve renderer"); } VisualData visualByIndex = VisualController.GetVisualByIndex(_renderer.sharedMaterial.GetInt("_Item")); if (visualByIndex != null && visualByIndex.Effect != null) { ApplyContext(visualByIndex.Effect); } } private void Start() { _ = _effectContext; } private void Run() { ValheimTime.Get(); _currentRatio = Mathf.MoveTowards(_currentRatio, GetRatio(), 1f * Time.deltaTime); _effects.ForEach(delegate(IRealtimeEffect e) { e.Apply(_block, _renderer.sharedMaterial, _effectContext, _currentRatio); e.Apply(((Component)this).transform, _currentRatio); }); _renderer.SetPropertyBlock(_block); } private void LateUpdate() { if (_effectContext != null && Time.frameCount % 1 == 0) { Run(); } } private float GetRatio() { //IL_0005: 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) if (EnvMan.instance.GetBiome() != _effectContext.Trigger.Biome) { return 0f; } return 1f; } public void ApplyContext(RealtimeEffectData data) { _effectContext = data; _effects = Effector.ApplyContext(data); } public void SetVisuals(int item) { Material[] sharedMaterials = ((Component)this).GetComponent<Renderer>().sharedMaterials; for (int i = 0; i < sharedMaterials.Length; i++) { sharedMaterials[i].SetInt("_Item", item); } } } internal class Effector { [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public static List<IRealtimeEffect> ApplyContext(RealtimeEffectData data) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) List<IRealtimeEffect> list = new List<IRealtimeEffect>(); try { if (data.Material.Colors != null && data.Material.Colors.Count > 0) { foreach (KeyValuePair<string, Color> color in data.Material.Colors) { list.Add(new RealtimeColorEffect(color.Key, color.Value)); } } if (data.Material.Floats != null && data.Material.Floats.Count > 0) { foreach (KeyValuePair<string, float> @float in data.Material.Floats) { list.Add(new RealtimeFloatEffect(@float.Key, @float.Value)); } } if (data.Light != null) { list.Add(new RealtimeLightEffect(data.Light)); } if (data.Particle != null) { list.Add(new RealtimeParticleEffect(data.Light)); } } catch (Exception ex) { Debug.LogError((object)ex.Message); Debug.LogError((object)ex.InnerException); } return list; } } internal interface IRealtimeEffector { void SetVisuals(int visuals); } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [RequireComponent(typeof(SphereCollider))] public class ProximityEffector : MonoBehaviour, IRealtimeEffector { private const int UPDATE_INTERVAL = 8; private const int CHARACTER_TRIGGER = 14; private const int CHARACTER = 9; private const int TRANSITION_DURATION = 1; private float _currentRatio; private Renderer _renderer; private MaterialPropertyBlock _block; private SphereCollider _sphere; private RealtimeEffectData _effectContext; private List<IRealtimeEffect> _effects = new List<IRealtimeEffect>(); private Collider[] _hits = (Collider[])(object)new Collider[10]; private Collider[] _targets = (Collider[])(object)new Collider[5]; private bool _isClear = true; public void Awake() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown _renderer = ((Component)this).GetComponentInChildren<Renderer>(); _sphere = ((Component)this).GetComponent<SphereCollider>(); _block = new MaterialPropertyBlock(); VisualData visualByIndex = VisualController.GetVisualByIndex(_renderer.sharedMaterial.GetInt("_Item")); if (visualByIndex != null && visualByIndex.Effect != null) { ApplyContext(visualByIndex.Effect); RealtimeEffectData effect = visualByIndex.Effect; if (effect.Trigger != null) { ((Component)this).gameObject.layer = 14; ((Collider)_sphere).isTrigger = true; _sphere.radius = effect.Trigger.Radius; ((Collider)_sphere).enabled = true; } } } public void Start() { if (!((Collider)_sphere).enabled) { ((Collider)_sphere).enabled = true; } UpdateTargets(); Run(); } private void Run() { ValheimTime.Get(); _currentRatio = Mathf.MoveTowards(_currentRatio, GetRatio(), 8f * Time.deltaTime); _effects.ForEach(delegate(IRealtimeEffect e) { e.Apply(_block, _renderer.sharedMaterial, _effectContext, _currentRatio); e.Apply(((Component)this).transform, _currentRatio); }); _renderer.SetPropertyBlock(_block); } public void LateUpdate() { if (_effectContext != null) { if (!_isClear && Time.frameCount % 8 == 0) { VerifyTargets(); } if (Time.frameCount % 8 == 0) { Run(); } } } private float GetRatio() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) float num = _sphere.radius; for (int i = 0; i < 5; i++) { if ((Object)(object)_targets[i] != (Object)null) { float num2 = Vector3.Distance(((Component)_targets[i]).transform.position, ((Component)this).transform.position); if (num2 < num) { num = num2; } } } return 1f - num / _sphere.radius; } public void OnTriggerEnter(Collider other) { if (_effectContext != null && _effectContext.Trigger != null && _effectContext.Trigger.Entities.Count > 0 && _effectContext.Trigger.Entities.Contains(((Object)other).name)) { UpdateTargets(); } } private void UpdateTargets() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) int num = Physics.OverlapSphereNonAlloc(((Component)this).transform.position, _sphere.radius, _hits, 512); int num2 = 0; for (int i = 0; i < num; i++) { if (_effectContext.Trigger.Entities.Contains(((Object)_hits[i]).name)) { _targets[num2++] = _hits[i]; } } } private void VerifyTargets() { bool isClear = true; for (int i = 0; i < 5; i++) { if ((Object)(object)_targets[i] != (Object)null) { isClear = false; } } _isClear = isClear; if (!_isClear) { UpdateTargets(); } } public void SetVisuals(int item) { Material[] sharedMaterials = ((Component)this).GetComponent<Renderer>().sharedMaterials; for (int i = 0; i < sharedMaterials.Length; i++) { sharedMaterials[i].SetInt("_Item", item); } } public void ApplyContext(RealtimeEffectData data) { _effectContext = data; _effects = Effector.ApplyContext(data); } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class TimeEffector : MonoBehaviour, IRealtimeEffector { private const int UPDATE_INTERVAL = 15; private Renderer _renderer; private MaterialPropertyBlock _block; private List<IRealtimeEffect> _effects = new List<IRealtimeEffect>(); public RealtimeEffectData _effectContext; private void Awake() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown _block = new MaterialPropertyBlock(); _renderer = ((Component)this).GetComponentInChildren<Renderer>(); if ((Object)(object)_renderer == (Object)null) { Debug.LogError((object)"TimeEffector: Failed to retrieve renderer"); } VisualData visualByIndex = VisualController.GetVisualByIndex(_renderer.sharedMaterial.GetInt("_Item")); if (visualByIndex != null && visualByIndex.Effect != null) { ApplyContext(visualByIndex.Effect); } } private void Start() { if (_effectContext != null) { Run(); } } private void LateUpdate() { if (_effectContext != null && Time.frameCount % 15 == 0) { Run(); } } private void Run() { try { if ((Object)(object)_renderer == (Object)null) { Debug.LogError((object)"TimeEffector: Failed to retrieve renderer"); } if ((Object)(object)_renderer.sharedMaterial == (Object)null) { Debug.LogError((object)"TimeEffector: No material in renderer"); } ValheimTime a = ValheimTime.Get(); if (_effectContext == null) { Debug.LogError((object)"TimeEffector: Bad context"); } if (_effectContext.Trigger == null) { Debug.LogError((object)"TimeEffector: Bad Trigger"); } if (_effectContext.Trigger.Time == null) { Debug.LogError((object)"TimeEffector: Bad Time"); } if (_effectContext.Trigger.TimeSpan == null) { Debug.LogError((object)"TimeEffector: Bad Time Span"); } float ratio = ValheimTime.RatioUntilTime(a, _effectContext.Trigger.Time, _effectContext.Trigger.TimeSpan); _effects.ForEach(delegate(IRealtimeEffect e) { e.Apply(_block, _renderer.sharedMaterial, _effectContext, ratio); e.Apply(((Component)this).transform, ratio); }); _renderer.SetPropertyBlock(_block); } catch (Exception ex) { Debug.Log((object)ex.StackTrace); } } public void ApplyContext(RealtimeEffectData data) { _effectContext = data; _effects = Effector.ApplyContext(data); } public void SetVisuals(int item) { Material[] sharedMaterials = ((Component)this).GetComponent<Renderer>().sharedMaterials; for (int i = 0; i < sharedMaterials.Length; i++) { sharedMaterials[i].SetInt("_Item", item); } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] [HarmonyPriority(0)] public static class Patch_ObjectDBInit { [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] private static void Postfix(ObjectDB __instance) { VisualController.LoadVisuals(); VisualController.Apply(); } } [HarmonyPatch(typeof(Terminal), "InitTerminal")] public static class Console_Patch { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static ConsoleEvent <>9__0_0; public static ConsoleEvent <>9__0_1; internal void <Postfix>b__0_0(ConsoleEventArgs args) { VisualController.Export(VisualController.Describe(args[1])); } internal void <Postfix>b__0_1(ConsoleEventArgs args) { VisualController.LoadVisuals(); VisualController.Apply(); } } private static void Postfix() { //IL_0032: 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_0029: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown object obj = <>c.<>9__0_0; if (obj == null) { ConsoleEvent val = delegate(ConsoleEventArgs args) { VisualController.Export(VisualController.Describe(args[1])); }; <>c.<>9__0_0 = val; obj = (object)val; } new ConsoleCommand("vm_describe", "Export visual description information for an item", (ConsoleEvent)obj, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); object obj2 = <>c.<>9__0_1; if (obj2 == null) { ConsoleEvent val2 = delegate { VisualController.LoadVisuals(); VisualController.Apply(); }; <>c.<>9__0_1 = val2; obj2 = (object)val2; } new ConsoleCommand("vm_refresh", "Refresh materials, textures, and other effects on items", (ConsoleEvent)obj2, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] internal static class SetItemData_Patch { private static Type t = Type.GetType("wackydatabase.SetData.SetData, WackysDatabase"); private static FieldInfo fi = t.GetField("name", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public); public static void Postfix(object data, ObjectDB Instant) { string text = (string)fi.GetValue(data); if (VisualController.GetVisualByName(text) != null) { VisualController.UpdateVisuals(text, Instant); } } } internal static class GetRecipeDataFromFiles_Patch { public static void Prefix() { VisualController.LoadVisuals(); } } internal static class GetAllMaterials_Patch { public static void Postfix() { VisualController.LoadMaterials(); } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [BepInPlugin("org.bepinex.visualsmodifier", "Visuals Modifier", "0.2.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string PluginID = "org.bepinex.visualsmodifier"; public const string PluginName = "Visuals Modifier"; public const string PluginVersion = "0.2.0"; public static readonly string Storage = Path.Combine(Paths.ConfigPath, "Visuals"); private static ConfigSync configSync = new ConfigSync("org.bepinex.visualsmodifier"); public static CustomSyncedValue<Dictionary<string, string>> YamlData = new CustomSyncedValue<Dictionary<string, string>>(configSync, "Visual YAML", new Dictionary<string, string>()); private FileSystemWatcher fileSystemWatcher; private Harmony _harmony; public Plugin() { if (!Directory.Exists(Storage)) { Directory.CreateDirectory(Storage); } fileSystemWatcher = new FileSystemWatcher(Path.Combine(Paths.ConfigPath, "Visuals"), "Visual_*.yml"); fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.Changed += OnVisualFileChanged; fileSystemWatcher.Created += OnVisualFileChanged; fileSystemWatcher.Renamed += OnVisualFileChanged; fileSystemWatcher.EnableRaisingEvents = true; } [UsedImplicitly] public void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Expected O, but got Unknown _harmony = new Harmony("org.bepinex.visualsmodifier"); if (Type.GetType("wackydatabase, WackysDatabase") != null) { _harmony.Patch((MethodBase)AccessTools.DeclaredMethod(Type.GetType("wackydatabase.SetData.SetData, WackysDatabase"), "SetItemData", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(SetItemData_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); _harmony.Patch((MethodBase)AccessTools.DeclaredMethod(Type.GetType("wackydatabase.Read.ReadFlies, WackysDatabase"), "GetRecipeDataFromFiles", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(GetRecipeDataFromFiles_Patch), "Prefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); _harmony.Patch((MethodBase)AccessTools.DeclaredMethod(Type.GetType("wackydatabase.Util.Functions, WackysDatabase"), "GetAllMaterials", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(GetAllMaterials_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } _harmony.PatchAll(); YamlData.AssignLocalValue(Reload()); YamlData.ValueChanged += VisualSyncDetected; } private Dictionary<string, string> Reload() { Dictionary<string, string> dictionary = new Dictionary<string, string>(); string[] files = Directory.GetFiles(Storage, "Visual_*.yml", SearchOption.AllDirectories); foreach (string text in files) { try { dictionary.Add(Path.GetFileName(text), File.ReadAllText(text)); } catch (Exception) { Debug.LogError((object)("[$Visuals Modifier]: Failed to load visual data from " + text)); } } VisualController.LoadVisuals(dictionary); return dictionary; } [UsedImplicitly] public void OnDestroy() { _harmony.UnpatchSelf(); } private void OnVisualFileChanged(object sender, FileSystemEventArgs args) { try { if (configSync.IsSourceOfTruth) { Debug.Log((object)("[Visuals Modifier]: Config file changed: " + args.Name + ".")); VisualController.UpdateVisuals(VisualController.Import(args.FullPath).PrefabName, ObjectDB.instance); YamlData.Value = Reload(); } } catch (Exception ex) { Debug.LogError((object)("Detected config file change, but importing failed with an error.\n" + ex.Message + ((ex.InnerException != null) ? (": " + ex.InnerException.Message) : ""))); } } private void VisualSyncDetected() { Debug.Log((object)"[$Visuals Modifier]: Config sync detected"); VisualController.LoadVisuals(YamlData.Value); VisualController.Apply(); if (!configSync.IsSourceOfTruth) { Save(YamlData.Value); } } public static void Save(Dictionary<string, string> visuals) { foreach (KeyValuePair<string, string> visual in visuals) { File.WriteAllText(Path.Combine(Storage, visual.Key), visual.Value); } } private ConfigEntry<T> config<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { ConfigEntry<T> val = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, description); configSync.AddConfigEntry<T>(val).SynchronizedConfig = synchronizedSetting; return val; } private ConfigEntry<T> config<[<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(2)] T>(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting); } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class ColorConverter : IYamlTypeConverter { public bool Accepts(Type type) { return type == typeof(Color); } public object ReadYaml(IParser parser, Type type) { //IL_008d: Unknown result type (might be due to invalid IL or missing references) parser.Consume<SequenceStart>(); List<float> list = new List<float>(); SequenceEnd @event; while (!parser.TryConsume<SequenceEnd>(out @event)) { string value = parser.Consume<YamlDotNet.Core.Events.Scalar>().Value; list.Add(float.Parse(value)); } return (object)new Color((list.Count > 0) ? list[0] : 0f, (list.Count > 1) ? list[1] : 0f, (list.Count > 2) ? list[2] : 0f, (list.Count > 3) ? list[3] : 0f); } public void WriteYaml(IEmitter emitter, object value, Type type) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) emitter.Emit(new SequenceStart(null, null, isImplicit: false, SequenceStyle.Flow)); Color val = (Color)value; emitter.Emit(new YamlDotNet.Core.Events.Scalar(val.r.ToString())); emitter.Emit(new YamlDotNet.Core.Events.Scalar(val.g.ToString())); emitter.Emit(new YamlDotNet.Core.Events.Scalar(val.b.ToString())); emitter.Emit(new YamlDotNet.Core.Events.Scalar(val.a.ToString())); emitter.Emit(new SequenceEnd()); } } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class DescriptorData { public string Name; public List<RendererDescriptor> Renderers = new List<RendererDescriptor>(); } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class MaterialPropertyDescriptor { public string Name; public string Type; public string Value; public string Range; } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class MaterialDescriptor { public string Name; public string Shader; public List<MaterialPropertyDescriptor> MaterialProperties = new List<MaterialPropertyDescriptor>(); } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class RendererDescriptor { public string Name; public List<MaterialDescriptor> Materials = new List<MaterialDescriptor>(); } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class MaterialInstance { public string Name; public string Original; public MaterialData Changes; } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class MaterialProperties { public Dictionary<string, Color> Colors; public Dictionary<string, float> Floats; } [Serializable] public enum TextureEffect { Screen, Multiply, Overlay, Edge } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class TextureData { public string Name; public TextureEffect Effect; public List<Color> Colors; public TextureData() { Name = ""; Effect = TextureEffect.Screen; Colors = new List<Color>(); } } [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class ValheimTimeConverter : IYamlTypeConverter { public bool Accepts(Type type) { return type == typeof(ValheimTime); } public object ReadYaml(IParser parser, Type type) { parser.Consume<SequenceStart>(); List<int> list = new List<int>(); SequenceEnd @event; while (!parser.TryConsume<SequenceEnd>(out @event)) { string value = parser.Consume<YamlDotNet.Core.Events.Scalar>().Value; list.Add(int.Parse(value)); } return new ValheimTime((list.Count > 0) ? list[0] : 0, (list.Count > 1) ? list[1] : 0, (list.Count > 2) ? list[2] : 0, (list.Count > 3) ? list[3] : 0); } public void WriteYaml(IEmitter emitter, object value, Type type) { ValheimTime valheimTime = (ValheimTime)value; emitter.Emit(new SequenceStart(null, null, isImplicit: false, SequenceStyle.Flow)); emitter.Emit(new YamlDotNet.Core.Events.Scalar(valheimTime.Hour.ToString())); emitter.Emit(new YamlDotNet.Core.Events.Scalar(valheimTime.Minute.ToString())); emitter.Emit(new YamlDotNet.Core.Events.Scalar(valheimTime.Second.ToString())); emitter.Emit(new YamlDotNet.Core.Events.Scalar(valheimTime.Day.ToString())); emitter.Emit(new SequenceEnd()); } } [Serializable] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class VisualData { public string PrefabName; public bool Base; public ShaderData Shader; public MaterialData Material; public MaterialData[] Materials; public MaterialData Particle; public TextureData Texture; public LightData Light; public RealtimeEffectData Effect; public Vector3 Icon = Vector3.zero; } public class LightData { public Color Color; public float? Range; } public class ParticleData { public Color Color; public float? Range; } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class ShaderData { public string Material; public string[] Materials; public string Name; [YamlIgnore] public Material MaterialInstance; [YamlIgnore] public Material[] MaterialInstances; } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class MaterialData { public Dictionary<string, Color> Colors; public Dictionary<string, float> Floats; } [Serializable] public enum RealtimeEffectType { Proximity, Time, Biome } [Serializable] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public class RealtimeEffectTrigger { public ValheimTime Time; public ValheimTime TimeSpan; public List<string> Entities; public float Radius; public Biome Biome; } [Serializable] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class RealtimeEffectData { public RealtimeEffectType Type; public RealtimeEffectTrigger Trigger; public MaterialData Material; public LightData Light; public ParticleData Particle; } [Serializable] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] public class ValheimTime { private const int DAY_LENGTH = 86400; public int Hour { get; } public int Minute { get; } public int Second { get; } public int Day { get; } public ValheimTime(int hour = 0, int minute = 0, int second = 0, int day = -1) { Day = day; Hour = hour; Minute = minute; Second = second; } public string ToDataString() { return Hour + ":" + Minute + ":" + Second + " (" + Day + ")"; } public int ToSeconds() { return (int)new TimeSpan(Hour, Minute, Second).TotalSeconds; } public static float RatioUntilTime(ValheimTime a, ValheimTime b, ValheimTime span) { if (Mathf.Abs(a.ToSeconds() - b.ToSeconds()) < span.ToSeconds()) { float num = Mathf.Abs(a.ToSeconds() - b.ToSeconds()); return 1f - num / (float)span.ToSeconds(); } if (Mathf.Abs(a.ToSeconds() + 86400 - b.ToSeconds()) < span.ToSeconds()) { float num2 = Mathf.Abs(a.ToSeconds() + 86400 - b.ToSeconds()); return 1f - num2 / (float)span.ToSeconds(); } if (Mathf.Abs(a.ToSeconds() - (b.ToSeconds() + 86400)) < span.ToSeconds()) { float num3 = Mathf.Abs(a.ToSeconds() - (b.ToSeconds() + 86400)); return 1f - num3 / (float)span.ToSeconds(); } return 0f; } public static ValheimTime Get() { if (!Object.op_Implicit((Object)(object)EnvMan.instance)) { return new ValheimTime(-1); } float smoothDayFraction = EnvMan.instance.m_smoothDayFraction; int currentDay = EnvMan.instance.GetCurrentDay(); int num = (int)(smoothDayFraction * 24f); int num2 = (int)((smoothDayFraction * 24f - (float)num) * 60f); int second = (int)(((smoothDayFraction * 24f - (float)num) * 60f - (float)num2) * 60f); return new ValheimTime(num, num2, second, currentDay); } } [<3b64ce3b-0775-471d-a42b-da39acf52a2e>Nullable(0)] [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(1)] public static class VisualController { public static Dictionary<string, int> _visualsByName; public static Dictionary<int, int> _visualsByHash; public static List<VisualData> _visuals; public static Dictionary<string, Texture2D> _initialTextures; public static Dictionary<string, Material> _initialMaterials; public static Dictionary<string, bool> ProcessedTextures; public static Dictionary<string, Material> Materials; private static ColorConverter cc; private static ValheimTimeConverter vtc; private static ISerializer _serializer; private static IDeserializer _deserializer; static VisualController() { _visualsByName = new Dictionary<string, int>(); _visualsByHash = new Dictionary<int, int>(); _visuals = new List<VisualData>(); _initialTextures = new Dictionary<string, Texture2D>(); _initialMaterials = new Dictionary<string, Material>(); ProcessedTextures = new Dictionary<string, bool>(); Materials = new Dictionary<string, Material>(); cc = new ColorConverter(); vtc = new ValheimTimeConverter(); _serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).WithTypeConverter(cc).WithTypeConverter(vtc) .Build(); _deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).WithTypeConverter(cc).WithTypeConverter(vtc) .Build(); DataManager.OnMaterialAdd += DataManager_OnMaterialAdd; DataManager.OnMaterialChange += DataManager_OnMaterialChange; } private static void DataManager_OnMaterialChange(object sender, MaterialEventArgs e) { new MaterialManipulator(e.MaterialInstance.Changes).Invoke(e.Material, null); } private static void DataManager_OnMaterialAdd(object sender, MaterialEventArgs e) { new MaterialManipulator(e.MaterialInstance.Changes).Invoke(e.Material, null); } public static void Reload(List<VisualData> visuals) { foreach (VisualData visual in visuals) { Add(visual.PrefabName, visual); } } public static void Add(string prefabName, VisualData data) { int stableHashCode = StringExtensionMethods.GetStableHashCode(prefabName); if (_visualsByName.ContainsKey(prefabName)) { int visualIndex = GetVisualIndex(prefabName); _visuals[visualIndex] = data; _visualsByHash[stableHashCode] = visualIndex; _visualsByName[prefabName] = visualIndex; } else { _visuals.Add(data); _visualsByHash.Add(stableHashCode, _visuals.Count - 1); _visualsByName.Add(prefabName, _visuals.Count - 1); } } public static VisualData Import(string file) { try { VisualData visualData = _deserializer.Deserialize<VisualData>(File.ReadAllText(file)); Add(visualData.PrefabName, visualData); return visualData; } catch (Exception ex) { Debug.LogError((object)("Found Visuals Modifier config error in file " + file + ".\n" + ex.Message + ((ex.InnerException != null) ? (": " + ex.InnerException.Message) : ""))); return null; } } public static void Export(VisualData visual) { string contents = _serializer.Serialize(visual); string text = Path.Combine(Paths.ConfigPath, "Visuals"); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } File.WriteAllText(Path.Combine(text, "Visual_" + visual.PrefabName + ".yml"), contents); } public static void Export(DescriptorData data) { string contents = _serializer.Serialize(data); string text = Path.Combine(Paths.ConfigPath, "Visuals"); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } File.WriteAllText(Path.Combine(text, "Describe_" + data.Name + ".yml"), contents); } public static DescriptorData Describe(string prefabName) { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Invalid comparison between Unknown and I4 //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Invalid comparison between Unknown and I4 //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Invalid comparison between Unknown and I4 //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Invalid comparison between Unknown and I4 //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) DescriptorData descriptorData = new DescriptorData { Name = prefabName }; GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(prefabName); if (!Object.op_Implicit((Object)(object)itemPrefab)) { return descriptorData; } Transform val = itemPrefab.transform.Find("attach_skin") ?? itemPrefab.transform.Find("attach"); if (!Object.op_Implicit((Object)(object)val)) { val = GetDropChild(itemPrefab); } if (Object.op_Implicit((Object)(object)val)) { Renderer[] componentsInChildren = ((Component)val).GetComponentsInChildren<Renderer>(true); for (int i = 0; i < componentsInChildren.Length; i++) { RendererDescriptor rendererDescriptor = new RendererDescriptor { Name = ((Object)val).name }; for (int j = 0; j < componentsInChildren[i].sharedMaterials.Length; j++) { Material val2 = componentsInChildren[i].sharedMaterials[j]; MaterialDescriptor materialDescriptor = new MaterialDescriptor { Name = ((Object)componentsInChildren[i].sharedMaterials[j]).name, Shader = ((Object)val2.shader).name }; int propertyCount = val2.shader.GetPropertyCount(); for (int k = 0; k < propertyCount; k++) { ShaderPropertyType propertyType = val2.shader.GetPropertyType(k); string propertyName = val2.shader.GetPropertyName(k); MaterialPropertyDescriptor obj = new MaterialPropertyDescriptor { Name = propertyName, Type = ((object)(ShaderPropertyType)(ref propertyType)).ToString(), Range = (((int)propertyType == 3) ? $"{val2.shader.GetPropertyRangeLimits(k).x} to {val2.shader.GetPropertyRangeLimits(k).y}" : null) }; object value; if ((int)propertyType != 0) { if ((int)propertyType != 3) { if ((int)propertyType != 2) { if ((int)propertyType != 1) { value = null; } else { Vector4 vector = val2.GetVector(propertyName); value = ((object)(Vector4)(ref vector)).ToString(); } } else { value = val2.GetFloat(propertyName).ToString(); } } else { value = val2.GetFloat(propertyName).ToString(); } } else { Color color = val2.GetColor(propertyName); value = ((object)(Color)(ref color)).ToString(); } obj.Value = (string)value; MaterialPropertyDescriptor item = obj; materialDescriptor.MaterialProperties.Add(item); } rendererDescriptor.Materials.Add(materialDescriptor); } descriptorData.Renderers.Add(rendererDescriptor); } } else { Debug.LogError((object)("[Visuals Modifier]: Unable to find base Renderer for " + prefabName)); } return descriptorData; } public static bool TryUpdateTexture(VisualData data, string prefabName, GameObject armor) { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown if (data.Texture == null) { return false; } ItemDrop component = armor.GetComponent<ItemDrop>(); Material val = (Object.op_Implicit((Object)(object)component) ? component.m_itemData.m_shared.m_armorMaterial : null); if (!Object.op_Implicit((Object)(object)val)) { return false; } try { string key = ((Object)val).name.Split(new string[1] { "(Clone)" }, StringSplitOptions.None)[0]; if (!_initialMaterials.ContainsKey(key)) { _initialMaterials.Add(key, Object.Instantiate<Material>(val)); } val = _initialMaterials[key]; if (!_initialTextures.ContainsKey(key)) { _initialTextures.Add(key, Colour.CloneTexture((Texture2D)val.GetTexture(data.Texture.Name))); } new TextureManipulator(data.Texture, _initialTextures[key]).Invoke(val, armor); component.m_itemData.m_shared.m_armorMaterial = val; ProcessedTextures.Add(key, value: true); return true; } catch (Exception) { return false; } } public static Transform GetDropChild(GameObject item) { for (int i = 0; i < item.transform.childCount; i++) { Transform child = item.transform.GetChild(i); if (!((Object)child).name.Contains("attach")) { return child; } } return null; } public static void UpdateVisuals(string prefabName, ObjectDB instance) { //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Unknown result type (might be due to invalid IL or missing references) VisualData visualByName = GetVisualByName(prefabName); GameObject item = instance.GetItemPrefab(prefabName); if ((Object)(object)item == (Object)null) { return; } try { Transform val = item.transform.Find("attach_skin"); Transform val2 = item.transform.Find("attach"); Transform dropChild = GetDropChild(item); List<Renderer> renderers = new List<Renderer>(); Renderer[] array = (Renderer[])(object)(((Object)(object)val != (Object)null) ? ((Component)val).GetComponentsInChildren<SkinnedMeshRenderer>(true) : null); Renderer[] array2 = array; array = (Renderer[])(object)(((Object)(object)dropChild != (Object)null) ? ((Component)dropChild).GetComponentsInChildren<MeshRenderer>(true) : null); Renderer[] array3 = array; array = (Renderer[])(object)(((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponentsInChildren<MeshRenderer>(true) : null); Renderer[] array4 = array; if (array2 != null) { renderers.AddRange(array2); } if (array3 != null) { renderers.AddRange(array3); } if (array4 != null) { renderers.AddRange(array4); } List<IManipulator> rendererChanges = GetRendererChanges(prefabName); foreach (Renderer renderer in renderers) { if (!(((object)renderer).GetType() == typeof(ParticleSystemRenderer))) { rendererChanges.ForEach(delegate(IManipulator change) { change.Invoke(renderer, item); }); } } if (array2 != null) { MaterialManager.Clone("skn_" + prefabName, array2); } if (array4 != null) { MaterialManager.Clone("msh_" + prefabName, array4); } if (array3 != null) { MaterialManager.Clone("drp_" + prefabName, array3); } List<IManipulator> manipulations = GetManipulations(prefabName); List<IManipulator> particleChanges = GetParticleChanges(prefabName); TryUpdateTexture(visualByName, prefabName, item); Transform val3 = val2 ?? val; if ((Object)(object)val3 == (Object)null) { val3 = dropChild; } if (val3.childCount > 0) { val3 = val3.GetChild(0); } if ((Object)(object)val3 != (Object)null) { UpdateComponents(visualByName, val3); } int i; for (i = 0; i < renderers.Count; i++) { if (((object)renderers[i]).GetType() == typeof(ParticleSystemRenderer)) { particleChanges.ForEach(delegate(IManipulator change) { change.Invoke(renderers[i], item); }); } else { manipulations.ForEach(delegate(IManipulator change) { change.Invoke(renderers[i], item); }); } } } catch (Exception ex) { Debug.LogError((object)("[Visuals Modifier]: Failed to update material - " + ex.Message)); } ItemDrop component = item.GetComponent<ItemDrop>(); if (Object.op_Implicit((Object)(object)component)) { _ = visualByName.Icon; UpdateIcon(component, visualByName.Icon); } } private static Transform AddFlare(Transform t) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) Transform obj = Object.Instantiate<Transform>(ObjectDB.instance.GetItemPrefab("BattleaxeCrystal").transform.Find("attach").Find("flare"), t, false); ((Object)obj).name = "flare"; obj.localPosition = Vector3.zero; return obj; } private static void UpdateComponents(VisualData data, Transform t) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (data.Light != null) { Light val = ((Component)t).GetComponent<Light>(); if ((Object)(object)val == (Object)null) { val = ((Component)t).gameObject.AddComponent<Light>(); } if ((Object)(object)val != (Object)null) { _ = data.Light.Color; val.color = data.Light.Color; if (data.Light.Range.HasValue) { val.range = data.Light.Range.Value; } } } if (data.Particle != null) { AddFlare(t); } } public static void UpdateIcon(ItemDrop item, Vector3 r) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: 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_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Expected O, but got Unknown //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02d9: Unknown result type (might be due to invalid IL or missing references) Camera component = new GameObject("Camera", new Type[1] { typeof(Camera) }).GetComponent<Camera>(); component.backgroundColor = Color.clear; component.clearFlags = (CameraClearFlags)2; component.fieldOfView = 0.5f; component.farClipPlane = 10000000f; component.cullingMask = 1073741824; Light component2 = new GameObject("Light", new Type[1] { typeof(Light) }).GetComponent<Light>(); ((Component)component2).transform.rotation = Quaternion.Euler(60f, -5f, 0f); component2.type = (LightType)1; component2.cullingMask = 1073741824; component2.intensity = 0.7f; try { Rect val = default(Rect); ((Rect)(ref val))..ctor(0f, 0f, 64f, 64f); Quaternion val2 = Quaternion.Euler(r.x, r.y, r.z); Transform val3 = ((Component)item).transform.Find("attach"); if (!Object.op_Implicit((Object)(object)val3)) { val3 = GetDropChild(((Component)item).gameObject); } GameObject val4 = Object.Instantiate<GameObject>(((Component)val3).gameObject, Vector3.zero, val2); Transform[] componentsInChildren = val4.GetComponentsInChildren<Transform>(true); for (int i = 0; i < componentsInChildren.Length; i++) { ((Component)componentsInChildren[i]).gameObject.layer = 30; } Renderer[] componentsInChildren2 = val4.GetComponentsInChildren<Renderer>(true); Vector3 val5 = componentsInChildren2.Aggregate<Renderer, Vector3>(Vector3.positiveInfinity, [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(0)] (Vector3 cur, Renderer renderer) => { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_0017: Unknown result type (might be due to invalid IL or missing references) if (!(renderer is ParticleSystemRenderer)) { Bounds bounds2 = renderer.bounds; return Vector3.Min(cur, ((Bounds)(ref bounds2)).min); } return cur; }); Vector3 val6 = componentsInChildren2.Aggregate<Renderer, Vector3>(Vector3.negativeInfinity, [<7e95fbe5-0192-49cc-9c04-eabf3a488096>NullableContext(0)] (Vector3 cur, Renderer renderer) => { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_0017: Unknown result type (might be due to invalid IL or missing references) if (!(renderer is ParticleSystemRenderer)) { Bounds bounds = renderer.bounds; return Vector3.Max(cur, ((Bounds)(ref bounds)).max); } return cur; }); Vector3 val7 = val6 - val5; component.targetTexture = RenderTexture.GetTemporary((int)((Rect)(ref val)).width, (int)((Rect)(ref val)).height); float num = Mathf.Max(val7.x, val7.y) * 1.05f / Mathf.Tan(component.fieldOfView * ((float)Math.PI / 180f)); Transform transform = ((Component)component).transform; transform.position = (val5 + val6) / 2f + new Vector3(0f, 0f, 0f - num); ((Component)component2).transform.position = transform.position + new Vector3(-2f, 0.2f) / 3f * num; component.Render(); RenderTexture active = RenderTexture.active; RenderTexture.active = component.targetTexture; Texture2D val8 = new Texture2D((int)((Rect)(ref val)).width, (int)((Rect)(ref val)).height, (TextureFormat)4, false); val8.ReadPixels(val, 0, 0); val8.Apply(); RenderTexture.active = active; item.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { Sprite.Create(val8, val, new Vector2(0.5f, 0.5f)) }; Object.DestroyImmediate((Object)(object)val4); component.targetTexture.Release(); } catch (Exception ex) { Debug.LogError((object)("[Visuals Modifier]: Failed to update icon - " + ex.Message)); } finally { Object.Destroy((Object)(object)component); Object.Destroy((Object)(object)component2); } } public static int GetVisualIndex(string name) { return _visualsByName[name]; } public static int GetVisualIndex(int hash) { return _visualsByHash[hash]; } public static VisualData GetVisualByIndex(int index) { return _visuals[index]; } public static VisualData GetVisualByName(string name) { if (_visualsByName.ContainsKey(name)) { return _visuals[_visualsByName[name]]; } return null; } public static VisualData GetVisualByHash(int hash) { if (_visualsByHash.ContainsKey(hash)) { return _visuals[_visualsByHash[hash]]; } return null; } public static void LoadVisuals() { ProcessedTextures.Clear(); string[] files = Directory.GetFiles(Path.Combine(Paths.ConfigPath, "Visuals"), "Visual_*.yml", SearchOption.AllDirectories); foreach (string text in files) { try { Import(text); } catch (Exception) { Debug.LogError((object)("[Visuals Modifier]: Failed to load visual data from " + text)); } } } public static VisualData LoadYaml(string yaml) { try { VisualData visualData = _deserializer.Deserialize<VisualData>(yaml); Add(visualData.PrefabName, visualData); return visualData; } catch (Exception ex) { Debug.LogError((object)("Found Visuals Modifier config error in yaml.\n" + ex.Message + ((ex.InnerException != null) ? (": " + ex.InnerException.Message) : ""))); return null; } } public static void LoadVisuals(Dictionary<string, string> data) { ProcessedTextures.Clear(); foreach (KeyValuePair<string, string> datum in data) { LoadYaml(datum.Value); } } public static void LoadMaterials() { DataManager.LoadMaterials(Path.Combine(Paths.ConfigPath, "Materials")); } public static void LoadFromYaml(string yaml) { VisualData[] array = _deserializer.Deserialize<VisualData[]>(yaml); foreach (VisualData visualData in array) { Add(visualData.PrefabName, visualData); } } public static void Apply() { ObjectDB instance = ObjectDB.instance; _visuals.ForEach(delegate(VisualData action) { UpdateVisuals(action.PrefabName, instance); }); } public static List<IManipulator> GetRendererChanges(string prefab) { List<IManipulator> list = new List<IManipulator>(); VisualData visualByName = GetVisualByName(prefab); if (visualByName != null && visualByName.Shader != null) { if (visualByName.Shader.Material != null && visualByName.Shader.Material != "" && Materials.ContainsKey(visualByName.Shader.Material)) { visualByName.Shader.MaterialInstance = Materials[visualByName.Shader.Material]; } if (visualByName.Shader.Materials != null && visualByName.Shader.Materials.Length != 0) { visualByName.Shader.MaterialInstances = (Material[])(object)new Material[visualByName.Shader.Materials.Leng