using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
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.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using SoftReferenceableAssets;
using Steamworks;
using TMPro;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
using UnityEngine.UI;
using ValheimMod.External;
using ValheimMod.External.MiniJSON;
using ValheimMod.Monobehaviours;
using ValheimMod.Monobehaviours.FireBehaviors;
using ValheimMod.Monobehaviours.Lava;
using ValheimMod.Monobehaviours.Runes;
using ValheimMod.Patches;
using ValheimMod.Profiling;
using ValheimMod.ScriptableObjects;
using ValheimMod.Setup;
using ValheimMod.Utilities;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("ValheimMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ValheimMod")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("a1efb0fd-0465-47c9-8041-8ba880e78354")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
public class DeferredDecalSystem
{
private static DeferredDecalSystem m_Instance;
internal HashSet<Decal> m_DecalsDiffuse = new HashSet<Decal>();
internal HashSet<Decal> m_DecalsNormals = new HashSet<Decal>();
internal HashSet<Decal> m_DecalsBoth = new HashSet<Decal>();
public static DeferredDecalSystem instance
{
get
{
if (m_Instance == null)
{
m_Instance = new DeferredDecalSystem();
}
return m_Instance;
}
}
public void AddDecal(Decal d)
{
RemoveDecal(d);
}
public void RemoveDecal(Decal d)
{
m_DecalsDiffuse.Remove(d);
m_DecalsNormals.Remove(d);
m_DecalsBoth.Remove(d);
}
}
[ExecuteInEditMode]
public class DeferredDecalRenderer : MonoBehaviour
{
public Mesh m_CubeMesh;
private Dictionary<Camera, CommandBuffer> m_Cameras = new Dictionary<Camera, CommandBuffer>();
public void OnDisable()
{
foreach (KeyValuePair<Camera, CommandBuffer> camera in m_Cameras)
{
if (Object.op_Implicit((Object)(object)camera.Key))
{
camera.Key.RemoveCommandBuffer((CameraEvent)6, camera.Value);
}
}
}
public void OnWillRenderObject()
{
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_0111: 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_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_017b: Unknown result type (might be due to invalid IL or missing references)
//IL_0180: 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)
//IL_018e: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
if (!((Component)this).gameObject.activeInHierarchy || !((Behaviour)this).enabled)
{
OnDisable();
return;
}
Camera current = Camera.current;
if (!Object.op_Implicit((Object)(object)current))
{
return;
}
CommandBuffer val = null;
if (m_Cameras.ContainsKey(current))
{
val = m_Cameras[current];
val.Clear();
}
else
{
val = new CommandBuffer();
val.name = "Deferred decals";
m_Cameras[current] = val;
current.AddCommandBuffer((CameraEvent)6, val);
}
DeferredDecalSystem instance = DeferredDecalSystem.instance;
int num = Shader.PropertyToID("_NormalsCopy");
val.GetTemporaryRT(num, -1, -1);
val.Blit(RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)12), RenderTargetIdentifier.op_Implicit(num));
val.SetRenderTarget(RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)10), RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)2));
foreach (Decal item in instance.m_DecalsDiffuse)
{
val.DrawMesh(m_CubeMesh, ((Component)item).transform.localToWorldMatrix, item.m_Material);
}
val.SetRenderTarget(RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)12), RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)2));
foreach (Decal decalsNormal in instance.m_DecalsNormals)
{
val.DrawMesh(m_CubeMesh, ((Component)decalsNormal).transform.localToWorldMatrix, decalsNormal.m_Material);
}
RenderTargetIdentifier[] array = (RenderTargetIdentifier[])(object)new RenderTargetIdentifier[2]
{
RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)10),
RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)12)
};
val.SetRenderTarget(array, RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)2));
foreach (Decal item2 in instance.m_DecalsBoth)
{
val.DrawMesh(m_CubeMesh, ((Component)item2).transform.localToWorldMatrix, item2.m_Material);
}
val.ReleaseTemporaryRT(num);
}
}
namespace ValheimMod
{
public class Analytics
{
public class AnalyticsData
{
private Dictionary<string, string> data = new Dictionary<string, string>();
public string this[string key]
{
get
{
return data[key];
}
set
{
data[key] = value;
}
}
public void Add(string name, string value)
{
if (data.ContainsKey(name))
{
throw new Exception("Attempting to send duplicate key: " + name);
}
if (name.Contains(",") || value.Contains(","))
{
throw new Exception("Entry " + name + ":" + value + " contains commas");
}
data.Add(name, value);
}
public bool ContainsKey(string name)
{
return data.ContainsKey(name);
}
public Dictionary<string, string> getDataForPost()
{
HashSet<string> hashSet = new HashSet<string>();
string text = "";
string text2 = "";
List<string> list = data.Keys.OrderBy((string k) => k).ToList();
foreach (string item in list)
{
text = text + item + ",";
text2 = text2 + data[item] + ",";
ValheimMod.DevModeLog(item + ":" + data[item]);
}
if (text.EndsWith(","))
{
text = text.Substring(0, text.Length - 1);
text2 = text2.Substring(0, text2.Length - 1);
}
ValheimMod.DevModeLog("Body size (bytes): " + Encoding.UTF8.GetByteCount(text2));
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("header", text);
dictionary.Add("body", text2);
return dictionary;
}
}
private const string PLAYER_PREFS_UUID_KEY = "runemagic-uuid";
private readonly List<string> CONFIG_ENTRIES_TO_SEND = new List<string> { "RepairRune_HealRate", "RepairRune_EffectRadius", "ExtinguishingRune_EffectRadius", "runestoneMaxStoredEnergy", "runestoneSecondsToFullCharge", "runestoneUnlockNewRuneChance", "energyCost_runemagic_passive_WaterWalking-hotWaterCostMultiplier", "energyCost_runemagic_passive_WaterWalking-lavaCostMultiplier" };
private Dictionary<string, int> placedRunes = new Dictionary<string, int>();
private Dictionary<string, int> removedRunes = new Dictionary<string, int>();
private Dictionary<string, List<string>> terminalCommandsRun = new Dictionary<string, List<string>>();
private Dictionary<string, float> passiveRuneActiveTime = new Dictionary<string, float>();
public bool otherPlayersConnected;
public bool wasPvpDamageTaken;
public HashSet<string> exceptions = new HashSet<string>();
private Dictionary<string, string> uniqueEngravedRunesLoaded = new Dictionary<string, string>();
public Analytics()
{
foreach (string analyticsPieceName in ValheimMod.getAnalyticsPieceNames())
{
if (!placedRunes.ContainsKey(analyticsPieceName))
{
placedRunes.Add(analyticsPieceName, 0);
}
}
foreach (string engravedRunePrefabName in ValheimMod.getEngravedRunePrefabNames())
{
removedRunes.Add(engravedRunePrefabName, 0);
}
terminalCommandsRun.Add("discoverRune", new List<string>());
terminalCommandsRun.Add("forgetRune", new List<string>());
foreach (StatusEffect registeredStatusEffect in CustomContentSetupHandler.RegisteredStatusEffects)
{
passiveRuneActiveTime.Add(((Object)registeredStatusEffect).name, 0f);
if (((object)registeredStatusEffect).GetType() == typeof(SE_WaterWalking))
{
passiveRuneActiveTime.Add(((Object)registeredStatusEffect).name + "-hot", 0f);
passiveRuneActiveTime.Add(((Object)registeredStatusEffect).name + "-cold", 0f);
passiveRuneActiveTime.Add(((Object)registeredStatusEffect).name + "-lava", 0f);
}
}
}
public void piecePlaced(string name)
{
if (placedRunes.ContainsKey(name))
{
placedRunes[name]++;
}
}
public void engravedRuneRemoved(string name)
{
if (removedRunes.ContainsKey(name))
{
removedRunes[name]++;
}
}
public void registerUniqueRune(string name, ZDO zdo)
{
uniqueEngravedRunesLoaded[((object)(ZDOID)(ref zdo.m_uid)).ToString()] = name;
}
public void terminalCommandRun(string command, string args)
{
if (terminalCommandsRun.ContainsKey(command))
{
terminalCommandsRun[command].Add(args.Replace(",", ".."));
}
}
public void updatePassiveRuneTime(StatusEffect se, float dt)
{
if (passiveRuneActiveTime.ContainsKey(((Object)se).name))
{
passiveRuneActiveTime[((Object)se).name] += dt;
if (((object)se).GetType() == typeof(SE_WaterWalking))
{
bool flag = IceTimedDestruction.anyInstancesActiveForPlayer(Player.m_localPlayer);
bool flag2 = se.m_character.InLava();
bool flag3 = SE_WaterWalking.latestHotWaterFactor > 0f && flag;
bool flag4 = SE_WaterWalking.latestColdWaterFactor > 0f && flag;
passiveRuneActiveTime[((Object)se).name + "-hot"] += (flag3 ? dt : 0f);
passiveRuneActiveTime[((Object)se).name + "-cold"] += (flag4 ? dt : 0f);
passiveRuneActiveTime[((Object)se).name + "-lava"] += (flag2 ? dt : 0f);
}
}
}
public void sendAnalytics()
{
try
{
AnalyticsData analyticsData = getAnalyticsData();
postDataAsync(ConfigLoader.getString("analytics_address"), analyticsData.getDataForPost());
}
catch (Exception ex)
{
sendErrorAnalytics(ex);
}
ValheimMod.analytics = new Analytics();
}
private void sendErrorAnalytics(Exception ex)
{
try
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("analyticsFailure", getVersion() + " : " + getValheimVersion() + " : " + ex.ToString().Replace(',', '_'));
postDataAsync(ConfigLoader.getString("analytics_error_address"), dictionary);
}
catch (Exception ex2)
{
ValheimMod.DevModeLog(ex2);
}
}
private void postDataAsync(string address, Dictionary<string, string> data)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
byte[] bytes = FormUrlEncoder.GetContentByteArray(data);
request.BeginGetRequestStream(delegate(IAsyncResult ar)
{
try
{
Stream stream = request.EndGetRequestStream(ar);
stream.Write(bytes, 0, bytes.Length);
stream.Close();
using ((HttpWebResponse)request.GetResponse())
{
}
}
catch (Exception)
{
}
}, null);
}
private AnalyticsData getAnalyticsData()
{
AnalyticsData analyticsData = new AnalyticsData();
appendPlacedAndRemovedRunes(analyticsData);
appendUniqueEngravedRunes(analyticsData);
appendConfigEntries(analyticsData);
appendPassiveRuneTimes(analyticsData);
analyticsData.Add("version", getVersion());
analyticsData.Add("isPTR", toString(isPTRBranch()));
analyticsData.Add("valheimVersion", getValheimVersion());
analyticsData.Add("worldUid", getWorldUid());
bool flag = ZNet.instance.IsServer();
analyticsData.Add("isMultiplayerServer", toString(flag && otherPlayersConnected));
analyticsData.Add("isMultiplayerClient", toString(!flag));
analyticsData.Add("pvp", getPVPStatus(Player.m_localPlayer));
analyticsData.Add("numRuneFocus", getRuneFocusCount().ToString());
analyticsData.Add("compShadSupport", toString(SystemInfo.supportsComputeShaders && SystemInfo.supportsAsyncGPUReadback));
analyticsData.Add("uniqueId", getUniqueId());
analyticsData.Add("pvpDmg", toString(wasPvpDamageTaken));
analyticsData.Add("allUnlocked", toString(ConfigLoader.getBool("allRunesStartUnlocked")));
analyticsData.Add("canopyHidden", toString(ConfigLoader.getInt("canopyRune_visualQuality") == 0));
analyticsData.Add("canopyQuality", ConfigLoader.getInt("canopyRune_visualQuality").ToString());
analyticsData.Add("repairVisQuality", ConfigLoader.getInt("repairRune_visualQuality").ToString());
analyticsData.Add("rangeExtensionOff", toString(ConfigLoader.getBool("disableRangeExtensionForLargePieces")));
appendEngravedRunes(analyticsData);
analyticsData.Add("exceptions", string.Join(" +++ ", exceptions).Replace("\n", "\\n").Replace("\r", "\\r")
.Replace(',', '_'));
return analyticsData;
}
private void appendEngravedRunes(AnalyticsData holder)
{
foreach (string engravedRunePrefabName in ValheimMod.getEngravedRunePrefabNames())
{
List<ZDO> list = new List<ZDO>();
int num = 0;
int num2 = -1;
try
{
if (ZDOMan.instance != null)
{
while (!ZDOMan.instance.GetAllZDOsWithPrefabIterative(engravedRunePrefabName, list, ref num))
{
}
num2 = list.Count();
}
}
catch (IndexOutOfRangeException)
{
}
catch (NullReferenceException)
{
}
holder.Add("worldCount-" + engravedRunePrefabName, num2.ToString());
}
}
private void appendPlacedAndRemovedRunes(AnalyticsData holder)
{
foreach (string key in placedRunes.Keys)
{
holder.Add("placed-" + key, placedRunes[key].ToString());
}
foreach (string key2 in removedRunes.Keys)
{
holder.Add("removed-" + key2, removedRunes[key2].ToString());
}
}
private void appendUniqueEngravedRunes(AnalyticsData holder)
{
foreach (string engravedRunePrefabName in ValheimMod.getEngravedRunePrefabNames())
{
holder.Add("uniqueLoaded-" + engravedRunePrefabName, "0");
}
foreach (string key in uniqueEngravedRunesLoaded.Keys)
{
string text = uniqueEngravedRunesLoaded[key];
string text2 = "uniqueLoaded-" + text;
if (holder.ContainsKey(text2))
{
holder[text2] = (int.Parse(holder[text2]) + 1).ToString();
}
}
}
private void appendConfigEntries(AnalyticsData holder)
{
foreach (string key in terminalCommandsRun.Keys)
{
holder.Add("cmd-" + key, string.Join(":", terminalCommandsRun[key]));
}
foreach (RunemagicPieceConfig runemagicPieceConfig in ValheimMod.runemagicPieceConfigs)
{
bool value = runemagicPieceConfig.isEnabled();
holder.Add("enabled-" + runemagicPieceConfig.pieceName, toString(value));
if (ConfigLoader.containsKey("energyCost_" + runemagicPieceConfig.configName))
{
string @string = ConfigLoader.getString("energyCost_" + runemagicPieceConfig.configName);
@string = parseNumericConfigValue(@string);
holder.Add("energyCost-" + runemagicPieceConfig.pieceName, @string);
}
}
foreach (string item in CONFIG_ENTRIES_TO_SEND)
{
string value2 = parseNumericConfigValue(ConfigLoader.getString(item));
holder.Add("cfg-" + item, value2);
}
}
private void appendPassiveRuneTimes(AnalyticsData holder)
{
foreach (string key in passiveRuneActiveTime.Keys)
{
holder.Add("passiveInUse-" + key, Mathf.RoundToInt(passiveRuneActiveTime[key]).ToString());
}
}
private string parseNumericConfigValue(string val)
{
int num = val.LastIndexOf(',');
if (num != -1)
{
val = val.Substring(0, num) + "." + val.Substring(num + 1);
val = val.Replace(",", "");
int num2 = val.LastIndexOf(".");
val = val.Substring(0, num2).Replace(".", "") + "." + val.Substring(num2 + 1);
}
return val;
}
private string getPVPStatus(Player p)
{
if ((Object)(object)p == (Object)null)
{
return "N/A";
}
try
{
return toString(((Character)p).IsPVPEnabled());
}
catch (NullReferenceException)
{
return "N/A";
}
}
private static string getVersion()
{
string text = "1.4.0";
if (ValheimMod.PLATFORM == ValheimMod.Platform.NEXUS_MODS)
{
text += "-NM";
}
else if (ValheimMod.PLATFORM == ValheimMod.Platform.THUNDERSTORE)
{
text += "-TS";
}
if (ValheimMod.DEV_MODE)
{
text += "-devmode";
}
return text;
}
private string getUniqueId()
{
if (!PlayerPrefs.HasKey("runemagic-uuid"))
{
PlayerPrefs.SetString("runemagic-uuid", Guid.NewGuid().ToString());
}
return PlayerPrefs.GetString("runemagic-uuid");
}
private string toString(bool value)
{
if (!value)
{
return "f";
}
return "t";
}
private int getRuneFocusCount()
{
try
{
if ((Object)(object)Player.m_localPlayer == (Object)null || ((Humanoid)Player.m_localPlayer).GetInventory() == null)
{
return -1;
}
Inventory inventory = ((Humanoid)Player.m_localPlayer).GetInventory();
return inventory.CountItems("$item_runemagic_runefocus", -1, true);
}
catch (NullReferenceException)
{
return -1;
}
}
private string getValheimVersion()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
try
{
GameVersion currentVersion = Version.CurrentVersion;
string text = ((object)(GameVersion)(ref currentVersion)).ToString();
if (isPTRBranch())
{
text += "-ptr";
}
return text;
}
catch (Exception ex)
{
ValheimMod.DevModeLog(ex);
}
return "unknown";
}
private bool isPTRBranch()
{
try
{
return getBranch().Equals("public-test");
}
catch (Exception)
{
return false;
}
}
private string getBranch()
{
try
{
string result = default(string);
if (SteamApps.GetCurrentBetaName(ref result, 512))
{
return result;
}
return "";
}
catch (Exception)
{
return "unknown";
}
}
private string getWorldUid()
{
if (ZNetPatch.CurrentWorldUID != 0L)
{
byte[] bytes = BitConverter.GetBytes(ZNetPatch.CurrentWorldUID);
return Convert.ToBase64String(bytes);
}
return "";
}
}
internal class BoundingCircle
{
public Vector2 center;
public float radius;
public BoundingCircle(Vector2 center, float radius)
{
//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)
this.center = center;
this.radius = radius;
}
public BoundingCircle(float x, float y, float radius)
{
//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)
center = new Vector2(x, y);
this.radius = radius;
}
public static BoundingCircle minimumCircle(IEnumerable<Vector2> points)
{
HashSet<Vector2> points2 = new HashSet<Vector2>(points);
return welzlInner(points2, new HashSet<Vector2>());
}
private static BoundingCircle welzlInner(HashSet<Vector2> points, HashSet<Vector2> boundary)
{
//IL_0019: 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_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: 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_0039: Unknown result type (might be due to invalid IL or missing references)
if (points.Count() == 0 || boundary.Count() == 3)
{
return trivial(boundary);
}
Vector2 val = points.First();
points.Remove(val);
BoundingCircle boundingCircle = welzlInner(points, boundary);
if (boundingCircle.contains(val))
{
points.Add(val);
return boundingCircle;
}
boundary.Add(val);
BoundingCircle result = welzlInner(points, boundary);
points.Add(val);
boundary.Remove(val);
return result;
}
public bool contains(Vector2 p)
{
//IL_0000: 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)
float num = p.x - center.x;
float num2 = p.y - center.y;
return num * num + num2 * num2 < radius * radius;
}
public static BoundingCircle trivial(IEnumerable<Vector2> points)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: 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_003d: 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)
List<Vector2> list = new List<Vector2>(points);
if (points.Count() == 3)
{
return trivial3(list[0], list[1], list[2]);
}
if (points.Count() == 2)
{
return trivial2(list[0], list[1]);
}
if (points.Count() == 1)
{
return new BoundingCircle(list[0], 0f);
}
if (points.Count() == 0)
{
return new BoundingCircle(0f, 0f, 0f);
}
throw new Exception("Can't have a trivial circle with more than 3 points: " + points.Count());
}
public static BoundingCircle trivial2(Vector2 a, Vector2 b)
{
//IL_0002: 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_0015: 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)
//IL_0033: 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_0041: 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)
Vector2 val = default(Vector2);
((Vector2)(ref val))..ctor((a.x + b.x) / 2f, (a.y + b.y) / 2f);
float num = a.x - val.x;
float num2 = a.y - val.y;
float num3 = (float)Math.Sqrt(num * num + num2 * num2);
return new BoundingCircle(val, num3);
}
public static BoundingCircle trivial3(Vector2 a, Vector2 b, Vector2 c)
{
//IL_0000: 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)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: 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_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: 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_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: 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_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_0181: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: 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_00c3: 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)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: 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_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
float num = b.x - a.x;
float num2 = b.y - a.y;
float num3 = c.x - a.x;
float num4 = c.y - a.y;
float num5 = num * (a.x + b.x) + num2 * (a.y + b.y);
float num6 = num3 * (a.x + c.x) + num4 * (a.y + c.y);
float num7 = 2f * (num * (c.y - b.y) - num2 * (c.x - b.x));
float num10;
float num11;
if ((double)Math.Abs(num7) < 1E-06)
{
float num8 = Math.Min(a.x, Math.Min(b.x, c.x));
float num9 = Math.Min(a.y, Math.Min(b.y, c.y));
num10 = (Math.Max(a.x, Math.Max(b.x, c.x)) - num8) * 0.5f;
num11 = (Math.Max(a.y, Math.Max(b.y, c.y)) - num9) * 0.5f;
return new BoundingCircle(num8 + num10, num9 + num11, (float)Math.Sqrt(num10 * num10 + num11 * num11));
}
float num12 = (num4 * num5 - num2 * num6) / num7;
float num13 = (num * num6 - num3 * num5) / num7;
num10 = num12 - a.x;
num11 = num13 - a.y;
float num14 = (float)Math.Sqrt(num10 * num10 + num11 * num11);
return new BoundingCircle(num12, num13, num14);
}
}
public class BoundingSphere
{
public Vector3 center;
public float radius;
public BoundingSphere(Vector3 aCenter, float aRadius)
{
//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)
center = aCenter;
radius = aRadius;
}
public static BoundingSphere Calculate(Renderer rend)
{
//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)
//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_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)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
Bounds bounds = rend.bounds;
Vector3 aCenter = ((Bounds)(ref bounds)).center;
bounds = rend.bounds;
Vector3 extents = ((Bounds)(ref bounds)).extents;
float magnitude = ((Vector3)(ref extents)).magnitude;
return new BoundingSphere(aCenter, magnitude);
}
public static BoundingSphere Calculate(GameObject obj)
{
Renderer[] componentsInChildren = obj.GetComponentsInChildren<Renderer>(true);
BoundingSphere boundingSphere = null;
Renderer[] array = componentsInChildren;
foreach (Renderer rend in array)
{
if (boundingSphere == null)
{
boundingSphere = Calculate(rend);
continue;
}
BoundingSphere boundingSphere2 = Calculate(rend);
if (boundingSphere2.radius > boundingSphere.radius)
{
boundingSphere = boundingSphere2;
}
}
return boundingSphere;
}
public static BoundingSphere Calculate(Transform xform, IEnumerable<Vector3> aPoints)
{
//IL_0000: 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_0010: 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_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: 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)
//IL_001f: 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_0025: 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_0028: 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_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: 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_0051: 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_0063: 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_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_00d4: 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_00d6: 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)
//IL_00e6: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_010d: 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_0110: 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_0075: 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_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: 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_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_0181: Unknown result type (might be due to invalid IL or missing references)
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
Vector3 val2;
Vector3 val;
Vector3 val3 = (val2 = (val = Vector3.one * float.PositiveInfinity));
Vector3 val5;
Vector3 val4;
Vector3 val6 = (val5 = (val4 = Vector3.one * float.NegativeInfinity));
foreach (Vector3 aPoint in aPoints)
{
Vector3 val7 = xform.TransformPoint(aPoint);
if (val7.x < val3.x)
{
val3 = val7;
}
if (val7.x > val6.x)
{
val6 = val7;
}
if (val7.y < val2.y)
{
val2 = val7;
}
if (val7.y > val5.y)
{
val5 = val7;
}
if (val7.z < val.z)
{
val = val7;
}
if (val7.z > val4.z)
{
val4 = val7;
}
}
Vector3 val8 = val6 - val3;
float sqrMagnitude = ((Vector3)(ref val8)).sqrMagnitude;
val8 = val5 - val2;
float sqrMagnitude2 = ((Vector3)(ref val8)).sqrMagnitude;
val8 = val4 - val;
float sqrMagnitude3 = ((Vector3)(ref val8)).sqrMagnitude;
Vector3 val9 = val3;
Vector3 val10 = val6;
float num = sqrMagnitude;
if (sqrMagnitude2 > num)
{
num = sqrMagnitude2;
val9 = val2;
val10 = val5;
}
if (sqrMagnitude3 > num)
{
val9 = val;
val10 = val4;
}
Vector3 val11 = (val9 + val10) * 0.5f;
val8 = val10 - val11;
float num2 = ((Vector3)(ref val8)).sqrMagnitude;
float num3 = Mathf.Sqrt(num2);
foreach (Vector3 aPoint2 in aPoints)
{
Vector3 val12 = xform.TransformPoint(aPoint2);
val8 = val12 - val11;
float sqrMagnitude4 = ((Vector3)(ref val8)).sqrMagnitude;
if (sqrMagnitude4 > num2)
{
float num4 = Mathf.Sqrt(sqrMagnitude4);
num3 = (num3 + num4) * 0.5f;
num2 = num3 * num3;
float num5 = num4 - num3;
val11 = (num3 * val11 + num5 * val12) / num4;
}
}
return new BoundingSphere(val11, num3);
}
}
public static class ExtensionMethods
{
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> container, TKey key, TValue defaultValue)
{
if (!container.ContainsKey(key))
{
return defaultValue;
}
return container[key];
}
public static void AddToKey<TKey>(this IDictionary<TKey, int> container, TKey key, int toAdd)
{
container[key] = container.GetValueOrDefault(key, 0) + toAdd;
}
public static void AddToKey<TKey>(this IDictionary<TKey, float> container, TKey key, float toAdd)
{
container[key] = container.GetValueOrDefault(key, 0f) + toAdd;
}
public static void AddToKey<TKey>(this IDictionary<TKey, double> container, TKey key, double toAdd)
{
container[key] = container.GetValueOrDefault(key, 0.0) + toAdd;
}
public static bool ContainsRegex(this IList<string> container, string keyRegex)
{
Regex regex = new Regex(keyRegex);
foreach (string item in container)
{
Match match = regex.Match(item);
if (match.Success)
{
return true;
}
}
return false;
}
public static void Merge(this IDictionary<string, Measurement> dict, IDictionary<string, Measurement> other)
{
foreach (string key in other.Keys)
{
if (!dict.ContainsKey(key))
{
dict.Add(key, other[key]);
}
else
{
dict[key].Merge(other[key]);
}
}
}
public static string RemoveWhitespace(this string str)
{
return string.Join("", str.Split((string[]?)null, StringSplitOptions.RemoveEmptyEntries));
}
public static Vector2 GetXZVector(this Vector3 vec)
{
//IL_0000: 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)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
return new Vector2(vec.x, vec.z);
}
public static Vector3 GetXYZVector(this Vector4 vec)
{
//IL_0000: 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)
//IL_000c: 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)
return new Vector3(vec.x, vec.y, vec.z);
}
public static float GetAvgEmission(this MinMaxCurve curve)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Invalid comparison between Unknown and I4
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Invalid comparison between Unknown and I4
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Invalid comparison between Unknown and I4
if ((int)((MinMaxCurve)(ref curve)).mode == 3)
{
return (((MinMaxCurve)(ref curve)).constantMax + ((MinMaxCurve)(ref curve)).constantMin) / 2f;
}
if ((int)((MinMaxCurve)(ref curve)).mode == 1)
{
return ((MinMaxCurve)(ref curve)).curve.GetAverageValueFromKeyframes() * ((MinMaxCurve)(ref curve)).curveMultiplier;
}
if ((int)((MinMaxCurve)(ref curve)).mode == 2)
{
float num = (((MinMaxCurve)(ref curve)).curveMin.GetAverageValueFromKeyframes() + ((MinMaxCurve)(ref curve)).curveMax.GetAverageValueFromKeyframes()) / 2f;
return num * ((MinMaxCurve)(ref curve)).curveMultiplier;
}
return ((MinMaxCurve)(ref curve)).constant;
}
public static float GetAverageValueFromKeyframes(this AnimationCurve curve)
{
if (curve == null || curve.length == 0)
{
return 0f;
}
if (curve.length == 1)
{
return ((Keyframe)(ref curve.keys[0])).value;
}
Keyframe[] keys = curve.keys;
float num = 0f;
float num2 = 0f;
for (int i = 0; i < keys.Length - 1; i++)
{
float time = ((Keyframe)(ref keys[i])).time;
float time2 = ((Keyframe)(ref keys[i + 1])).time;
float value = ((Keyframe)(ref keys[i])).value;
float value2 = ((Keyframe)(ref keys[i + 1])).value;
float num3 = time2 - time;
if (!(num3 <= 0f))
{
float num4 = (value + value2) * 0.5f;
num += num4 * num3;
num2 += num3;
}
}
if (!(num2 > 0f))
{
return 0f;
}
return num / num2;
}
public static bool IsInView(this Camera cam, Vector3 worldPoint)
{
//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_0015: 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_002f: 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)
Vector3 val = cam.WorldToViewportPoint(worldPoint);
if (val.z > 0f && val.x > 0f && val.x < 1f && val.y > 0f)
{
return val.y < 1f;
}
return false;
}
}
public class ColorUtils
{
private const byte k_MaxByteForOverexposedColor = 191;
public static void DecomposeHdrColor(Color linearColorHdr, out Color32 baseLinearColor, out float exposure)
{
//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_0034: 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_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
baseLinearColor = Color32.op_Implicit(linearColorHdr);
float maxColorComponent = ((Color)(ref linearColorHdr)).maxColorComponent;
if (maxColorComponent == 0f || (maxColorComponent <= 1f && maxColorComponent >= 0.003921569f))
{
exposure = 0f;
baseLinearColor.r = (byte)Mathf.RoundToInt(linearColorHdr.r * 255f);
baseLinearColor.g = (byte)Mathf.RoundToInt(linearColorHdr.g * 255f);
baseLinearColor.b = (byte)Mathf.RoundToInt(linearColorHdr.b * 255f);
}
else
{
float num = 191f / maxColorComponent;
exposure = Mathf.Log(255f / num) / Mathf.Log(2f);
baseLinearColor.r = Math.Min((byte)191, (byte)Mathf.CeilToInt(num * linearColorHdr.r));
baseLinearColor.g = Math.Min((byte)191, (byte)Mathf.CeilToInt(num * linearColorHdr.g));
baseLinearColor.b = Math.Min((byte)191, (byte)Mathf.CeilToInt(num * linearColorHdr.b));
}
}
public static Color fromHSVVector(Vector4 vec, bool zeroToOne)
{
//IL_0043: 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_004f: 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_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
if (!zeroToOne)
{
vec.x /= 360f;
vec.y /= 100f;
vec.z /= 100f;
vec.w /= 100f;
}
Color result = Color.HSVToRGB(vec.x, vec.y, vec.z);
result.a = vec.w;
return result;
}
public static Color applyIntensity(Color color, float intensity)
{
//IL_000c: 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)
float num = Mathf.Pow(2f, intensity);
return color * num;
}
public static Color fromVec(Vector4 vec)
{
//IL_0000: 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)
//IL_000c: 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_0018: Unknown result type (might be due to invalid IL or missing references)
return new Color(vec.x, vec.y, vec.z, vec.w);
}
public static Texture2D duplicateTexture(Texture2D source)
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Expected O, but got Unknown
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
RenderTexture temporary = RenderTexture.GetTemporary(((Texture)source).width, ((Texture)source).height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)1);
Graphics.Blit((Texture)(object)source, temporary);
RenderTexture active = RenderTexture.active;
RenderTexture.active = temporary;
Texture2D val = new Texture2D(((Texture)source).width, ((Texture)source).height);
val.ReadPixels(new Rect(0f, 0f, (float)((Texture)temporary).width, (float)((Texture)temporary).height), 0, 0);
RenderTexture.active = active;
RenderTexture.ReleaseTemporary(temporary);
return val;
}
public static Texture2D GetRenderTexturePixels(RenderTexture rt)
{
//IL_0019: 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_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Expected O, but got Unknown
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
RenderTexture active = RenderTexture.active;
RenderTexture.active = rt;
Texture2D val = new Texture2D(((Texture)rt).width, ((Texture)rt).height, GraphicsFormatUtility.GetTextureFormat(rt.graphicsFormat), false);
val.ReadPixels(new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), 0, 0);
RenderTexture.active = active;
return val;
}
}
public class DebugUtils
{
public static void LogIfNearPlayer(string content, Vector3 pos, float distance = 10f)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)Player.m_localPlayer == (Object)null) && Utils.DistanceSqr(((Component)Player.m_localPlayer).transform.position, pos) <= distance * distance)
{
ValheimMod.DevModeLog(content);
}
}
private static void getDebugObjectDetails()
{
PlayerRaycast playerRaycast = new PlayerRaycast(Player.m_localPlayer);
if (playerRaycast.hit)
{
if ((Object)(object)((RaycastHit)(ref playerRaycast.hitInfo)).collider != (Object)null)
{
GameObject gameObject = ((Component)((RaycastHit)(ref playerRaycast.hitInfo)).collider).gameObject;
printCompleteGameObject(gameObject);
}
else
{
ValheimMod.DevModeLog("Raycast returned true, but no hit");
}
}
else
{
ValheimMod.DevModeLog("Raycast returned false");
}
}
public static void printCompleteGameObject(GameObject obj)
{
while ((Object)(object)obj.transform.parent != (Object)null && !((Object)((Component)obj.transform.parent).gameObject).name.Equals("_NetSceneRoot"))
{
obj = ((Component)obj.transform.parent).gameObject;
}
printGameObjectDebugInfoHierarchy(obj, 0);
}
public static void printGameObjectDebugInfoHierarchy(GameObject obj, int level)
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Expected O, but got Unknown
string text = new string(' ', level * 6);
if ((Object)(object)obj == (Object)null)
{
ValheimMod.DevModeLog(text + "Gameobject is null");
return;
}
printGameObjectDebugInfo(text, obj);
if (obj.transform.childCount < 100)
{
foreach (Transform item in obj.transform)
{
Transform val = item;
printGameObjectDebugInfoHierarchy(((Component)val).gameObject, level + 1);
}
return;
}
ValheimMod.DevModeLog($"Too many children: {obj.transform.childCount}");
}
public static void printGameObjectDebugInfo(string prefix, GameObject obj)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
ValheimMod.DevModeLog($"{prefix}Gameobject: {((Object)obj).name}, active {obj.activeInHierarchy}, localPos {obj.transform.localPosition}, worldPos {obj.transform.position}");
ValheimMod.DevModeLog($"{prefix}Layer: {obj.layer}, name: {LayerMask.LayerToName(obj.layer)}");
Component[] components = obj.GetComponents(typeof(Component));
Component[] array = components;
foreach (Component val in array)
{
if (((object)val).ToString().Contains("(UnityEngine.Transform)"))
{
continue;
}
ValheimMod.DevModeLog(prefix + " Attached component: " + ((object)val).ToString());
Renderer val2 = (Renderer)(object)((val is Renderer) ? val : null);
if (val2 != null)
{
Material[] materials = val2.materials;
foreach (Material val3 in materials)
{
ValheimMod.DevModeLog(prefix + $"Material {((Object)val3).name} Shader: {((Object)val3.shader).name} ShaderInstId: {((Object)val3.shader).GetInstanceID()}");
}
}
}
}
public static void printParticleSystemDebugInfoHierarchy(GameObject obj, int level = 0)
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Expected O, but got Unknown
string text = new string(' ', level * 6);
if ((Object)(object)obj == (Object)null)
{
ValheimMod.DevModeLog(text + "Gameobject is null");
return;
}
printParticleSystemDebugInfo(text, obj);
if (obj.transform.childCount < 100)
{
foreach (Transform item in obj.transform)
{
Transform val = item;
printParticleSystemDebugInfoHierarchy(((Component)val).gameObject, level + 1);
}
return;
}
ValheimMod.DevModeLog($"Too many children: {obj.transform.childCount}");
}
public static void printParticleSystemDebugInfo(string prefix, GameObject obj)
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: 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_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: 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_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_0180: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_01a7: 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_01bf: Unknown result type (might be due to invalid IL or missing references)
//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
//IL_025a: Unknown result type (might be due to invalid IL or missing references)
//IL_025f: Unknown result type (might be due to invalid IL or missing references)
ValheimMod.DevModeLog($"{prefix}Gameobject: {((Object)obj).name}, active {obj.activeInHierarchy}, activeSelf {obj.activeSelf}");
ValheimMod.DevModeLog($"{prefix} localPos {obj.transform.localPosition}, worldPos {obj.transform.position}");
ValheimMod.DevModeLog($"{prefix} localRot {obj.transform.localEulerAngles}, worldRot {obj.transform.eulerAngles}");
ParticleSystem[] components = obj.GetComponents<ParticleSystem>();
ParticleSystem[] array = components;
foreach (ParticleSystem val in array)
{
ValheimMod.DevModeLog($"{prefix} playing {val.isPlaying}, paused {val.isPaused}, stopped {val.isStopped}, emitting {val.isEmitting}, alive {val.IsAlive()}");
MainModule main = val.main;
EmissionModule emission = val.emission;
object[] obj2 = new object[4]
{
prefix,
((MainModule)(ref main)).maxParticles,
val.particleCount,
null
};
MinMaxCurve rateOverTime = ((EmissionModule)(ref emission)).rateOverTime;
obj2[3] = ((MinMaxCurve)(ref rateOverTime)).constant;
ValheimMod.DevModeLog(string.Format("{0} maxParticles {1}, current# {2}, emission {3}", obj2));
ValheimMod.DevModeLog($"{prefix} culling {((MainModule)(ref main)).cullingMode} emissionEnabled {((EmissionModule)(ref emission)).enabled}");
CustomDataModule customData = val.customData;
if (((CustomDataModule)(ref customData)).enabled)
{
MinMaxGradient color = ((CustomDataModule)(ref customData)).GetColor((ParticleSystemCustomData)0);
MinMaxGradient color2 = ((CustomDataModule)(ref customData)).GetColor((ParticleSystemCustomData)1);
ValheimMod.DevModeLog(prefix + " CustomData: Grad1: " + minMaxGradientToString(color) + " Grad2: " + minMaxGradientToString(color2));
}
else
{
ValheimMod.DevModeLog(prefix + " CustomData disabled");
}
}
ParticleSystemRenderer component = obj.GetComponent<ParticleSystemRenderer>();
if ((Object)(object)component == (Object)null)
{
ValheimMod.DevModeLog(prefix + " null ParticleSystemRenderer");
return;
}
List<ParticleSystemVertexStream> list = new List<ParticleSystemVertexStream>();
component.GetActiveVertexStreams(list);
foreach (ParticleSystemVertexStream item in list)
{
ParticleSystemVertexStream current = item;
ValheimMod.DevModeLog(prefix + " VertexData: " + ((object)(ParticleSystemVertexStream)(ref current)).ToString());
}
}
public static string minMaxGradientToString(MinMaxGradient mmg)
{
//IL_0002: 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_0028: Invalid comparison between Unknown and I4
//IL_0010: 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_0055: Invalid comparison between Unknown and I4
//IL_0031: 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_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Invalid comparison between Unknown and I4
if ((int)((MinMaxGradient)(ref mmg)).mode == 0)
{
return $"MinMaxGradient({((MinMaxGradient)(ref mmg)).color})";
}
if ((int)((MinMaxGradient)(ref mmg)).mode == 2)
{
return $"MinMaxGradient({((MinMaxGradient)(ref mmg)).colorMin}, {((MinMaxGradient)(ref mmg)).colorMax})";
}
if ((int)((MinMaxGradient)(ref mmg)).mode == 1)
{
return "MinMaxGradient(alpha " + string.Join(",", ((MinMaxGradient)(ref mmg)).gradient.alphaKeys.Select((GradientAlphaKey x) => gradientKeyToString(x))) + " : color " + string.Join(",", ((MinMaxGradient)(ref mmg)).gradient.colorKeys.Select((GradientColorKey x) => gradientKeyToString(x))) + ")";
}
if ((int)((MinMaxGradient)(ref mmg)).mode == 3)
{
return "MinMaxGradient(alpha1 " + string.Join(",", ((MinMaxGradient)(ref mmg)).gradientMin.alphaKeys.Select((GradientAlphaKey x) => gradientKeyToString(x))) + " : color1 " + string.Join(",", ((MinMaxGradient)(ref mmg)).gradientMin.colorKeys.Select((GradientColorKey x) => gradientKeyToString(x))) + " : alpha2 " + string.Join(",", ((MinMaxGradient)(ref mmg)).gradientMax.alphaKeys.Select((GradientAlphaKey x) => gradientKeyToString(x))) + " : color2 " + string.Join(",", ((MinMaxGradient)(ref mmg)).gradientMax.colorKeys.Select((GradientColorKey x) => gradientKeyToString(x))) + ")";
}
return "MinMaxGradient(RandomColor)";
}
public static string gradientKeyToString(GradientAlphaKey key)
{
//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)
return "{" + $"{key.alpha}:{key.time:0.##}" + "}";
}
public static string gradientKeyToString(GradientColorKey key)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: 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)
return "{" + $"{key.color}:{key.time:0.##}" + "}";
}
public static void deepObjectComparison(object a, object b)
{
List<string> list = new List<string>();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(a))
{
string name = property.Name;
list.Add(name);
object value = property.GetValue(a);
object value2 = property.GetValue(b);
ValheimMod.DevModeLog($"{name}: {value} | {value2}");
}
foreach (PropertyDescriptor property2 in TypeDescriptor.GetProperties(b))
{
string name2 = property2.Name;
if (!list.Contains(name2))
{
object value3 = property2.GetValue(a);
object value4 = property2.GetValue(b);
ValheimMod.DevModeLog($"{name2}: {value3} | {value4}");
}
}
}
public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration = 5f)
{
}
public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration = 5f)
{
//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_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: 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)
if (ValheimMod.DEV_MODE)
{
DrawLine(start, start + dir, color, duration);
}
}
public static void DrawBounds(Bounds bounds, Color color, float duration = 5f)
{
//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_0003: Unknown result type (might be due to invalid IL or missing references)
DrawBounds(bounds, color, color, color, duration);
}
public static void DrawBounds(Bounds bounds, Color top, Color bottom, Color sides, float duration = 5f)
{
}
public static void DrawWireSphere(Vector3 center, float radius, Color color, float duration)
{
}
public static void DrawWireDisc(Vector3 center, float radius, Color color, float duration)
{
}
public static GameObject addDebugLocatorVFX(Vector3 position)
{
//IL_0019: 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)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Expected O, but got Unknown
if (!ValheimMod.DEV_MODE)
{
return new GameObject();
}
GameObject prefabFromAssetBundle = AssetLoader.GetPrefabFromAssetBundle("vfx_DebugLocator");
return Object.Instantiate<GameObject>(prefabFromAssetBundle, position, Quaternion.identity);
}
public static RaycastHit debugRaycast(Player player, bool ignoreRigidbody, int layerMask = -1)
{
//IL_0038: 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_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: 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_0096: Unknown result type (might be due to invalid IL or missing references)
if (layerMask == -1)
{
layerMask = (int)Traverse.Create((object)player).Field("m_placeRayMask").GetValue();
}
Transform eye = ((Character)player).m_eye;
float maxPlaceDistance = player.m_maxPlaceDistance;
RaycastHit result = default(RaycastHit);
if (Physics.Raycast(((Component)GameCamera.instance).transform.position, ((Component)GameCamera.instance).transform.forward, ref result, 50f, layerMask) && Object.op_Implicit((Object)(object)((RaycastHit)(ref result)).collider) && (ignoreRigidbody || !Object.op_Implicit((Object)(object)((RaycastHit)(ref result)).collider.attachedRigidbody)) && Vector3.Distance(eye.position, ((RaycastHit)(ref result)).point) < maxPlaceDistance)
{
return result;
}
return default(RaycastHit);
}
public static Transform findInHierarchy(Transform t, string regex)
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Expected O, but got Unknown
Match match = Regex.Match(((Object)t).name, regex, RegexOptions.IgnoreCase);
if (match.Success)
{
return t;
}
foreach (Transform item in t)
{
Transform t2 = item;
Transform val = findInHierarchy(t2, regex);
if ((Object)(object)val != (Object)null)
{
return val;
}
}
return null;
}
}
internal class DecalManager
{
private static Dictionary<Camera, CommandBuffer> bufferMap = new Dictionary<Camera, CommandBuffer>();
public static void registerCamera(Camera cam)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Expected O, but got Unknown
if (!bufferMap.ContainsKey(cam))
{
CommandBuffer val = new CommandBuffer();
val.name = "Deferred decals";
bufferMap[cam] = val;
cam.AddCommandBuffer((CameraEvent)20, val);
}
}
public static CommandBuffer getBuffer(Camera cam)
{
return bufferMap[cam];
}
}
internal class GameObjectUtils
{
public static ParticleSystem CopyParticleSystem(ParticleSystem original, GameObject destination)
{
//IL_001b: 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)
//IL_002c: 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_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: 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_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: 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)
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: 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_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: 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_00e7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: 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_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
ParticleSystem val = GameObjectUtils.CopyComponent<ParticleSystem>(original, destination);
ParticleSystemRenderer val2 = GameObjectUtils.CopyComponent<ParticleSystemRenderer>(((Component)original).gameObject.GetComponent<ParticleSystemRenderer>(), destination);
CopyFields<MainModule>(original.main, val.main);
CopyFields<EmissionModule>(original.emission, val.emission);
CopyFields<ShapeModule>(original.shape, val.shape);
CopyFields<VelocityOverLifetimeModule>(original.velocityOverLifetime, val.velocityOverLifetime);
CopyFields<LimitVelocityOverLifetimeModule>(original.limitVelocityOverLifetime, val.limitVelocityOverLifetime);
CopyFields<InheritVelocityModule>(original.inheritVelocity, val.inheritVelocity);
CopyFields<ForceOverLifetimeModule>(original.forceOverLifetime, val.forceOverLifetime);
CopyFields<ColorOverLifetimeModule>(original.colorOverLifetime, val.colorOverLifetime);
CopyFields<ColorBySpeedModule>(original.colorBySpeed, val.colorBySpeed);
CopyFields<SizeOverLifetimeModule>(original.sizeOverLifetime, val.sizeOverLifetime);
CopyFields<SizeBySpeedModule>(original.sizeBySpeed, val.sizeBySpeed);
CopyFields<RotationOverLifetimeModule>(original.rotationOverLifetime, val.rotationOverLifetime);
CopyFields<RotationBySpeedModule>(original.rotationBySpeed, val.rotationBySpeed);
CopyFields<ExternalForcesModule>(original.externalForces, val.externalForces);
CopyFields<NoiseModule>(original.noise, val.noise);
CopyFields<CollisionModule>(original.collision, val.collision);
CopyFields<TriggerModule>(original.trigger, val.trigger);
CopyFields<TextureSheetAnimationModule>(original.textureSheetAnimation, val.textureSheetAnimation);
CopyFields<LightsModule>(original.lights, val.lights);
CopyFields<TrailModule>(original.trails, val.trails);
CopyParticleCustomDataModule(original.customData, val.customData);
return val;
}
public static T CopyComponent<T>(T original, GameObject destination) where T : Component
{
Type type = ((object)original).GetType();
Component component = destination.GetComponent(type);
T val = (T)(object)((component is T) ? component : null);
if (!Object.op_Implicit((Object)(object)val))
{
Component obj = destination.AddComponent(type);
val = (T)(object)((obj is T) ? obj : null);
}
CopyFields(original, val);
if (original is ParticleSystemRenderer)
{
object obj2 = original;
object original2 = ((obj2 is ParticleSystemRenderer) ? obj2 : null);
object obj3 = val;
CopyParticleSystemRendererSettings((ParticleSystemRenderer)original2, (ParticleSystemRenderer)((obj3 is ParticleSystemRenderer) ? obj3 : null));
}
return val;
}
public static void CopyFields<T>(T original, T dst)
{
Type type = original.GetType();
FieldInfo[] fields = type.GetFields();
FieldInfo[] array = fields;
foreach (FieldInfo fieldInfo in array)
{
if (!fieldInfo.IsStatic)
{
fieldInfo.SetValue(dst, fieldInfo.GetValue(original));
}
}
PropertyInfo[] properties = type.GetProperties();
Dictionary<string, PropertyInfo> dictionary = new Dictionary<string, PropertyInfo>();
PropertyInfo[] array2 = properties;
foreach (PropertyInfo propertyInfo in array2)
{
dictionary[propertyInfo.Name] = propertyInfo;
if (propertyInfo.CanWrite && propertyInfo.CanWrite && !(propertyInfo.Name == "name") && !(propertyInfo.Name == "material") && !(propertyInfo.Name == "materials"))
{
propertyInfo.SetValue(dst, propertyInfo.GetValue(original, null), null);
}
}
if (dictionary.ContainsKey("material") && dictionary.ContainsKey("sharedMaterial"))
{
dictionary["material"].SetValue(dst, dictionary["sharedMaterial"].GetValue(original, null), null);
}
if (dictionary.ContainsKey("materials") && dictionary.ContainsKey("sharedMaterials"))
{
dictionary["materials"].SetValue(dst, dictionary["sharedMaterials"].GetValue(original, null), null);
}
}
public static void CopyParticleCustomDataModule(CustomDataModule original, CustomDataModule dst)
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_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_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Invalid comparison between Unknown and I4
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Invalid comparison between Unknown and I4
//IL_0044: 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_0048: 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_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
((CustomDataModule)(ref dst)).enabled = ((CustomDataModule)(ref original)).enabled;
ParticleSystemCustomData[] array = (ParticleSystemCustomData[])(object)new ParticleSystemCustomData[2]
{
default(ParticleSystemCustomData),
(ParticleSystemCustomData)1
};
ParticleSystemCustomData[] array2 = array;
foreach (ParticleSystemCustomData val in array2)
{
((CustomDataModule)(ref dst)).SetMode(val, ((CustomDataModule)(ref original)).GetMode(val));
ParticleSystemCustomDataMode mode = ((CustomDataModule)(ref original)).GetMode(val);
if ((int)mode == 2)
{
((CustomDataModule)(ref dst)).SetColor(val, ((CustomDataModule)(ref original)).GetColor(val));
}
else if ((int)mode == 1)
{
int vectorComponentCount = ((CustomDataModule)(ref original)).GetVectorComponentCount(val);
((CustomDataModule)(ref dst)).SetVectorComponentCount(val, vectorComponentCount);
for (int j = 0; j < vectorComponentCount; j++)
{
((CustomDataModule)(ref dst)).SetVector(val, j, ((CustomDataModule)(ref original)).GetVector(val, j));
}
}
}
}
public static void CopyParticleSystemRendererSettings(ParticleSystemRenderer original, ParticleSystemRenderer dst)
{
List<ParticleSystemVertexStream> list = new List<ParticleSystemVertexStream>();
original.GetActiveVertexStreams(list);
dst.SetActiveVertexStreams(list);
list.Clear();
original.GetActiveTrailVertexStreams(list);
dst.SetActiveTrailVertexStreams(list);
}
public static GameObject copyGameObjectChain(GameObject root, GameObject leaf, GameObject attachTo = null)
{
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Expected O, but got Unknown
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Expected O, but got Unknown
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: 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)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: 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_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Expected O, but got Unknown
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0223: Unknown result type (might be due to invalid IL or missing references)
//IL_0229: Unknown result type (might be due to invalid IL or missing references)
//IL_0236: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)root == (Object)(object)leaf)
{
GameObject val = new GameObject();
val.transform.parent = root.transform;
val.transform.localPosition = default(Vector3);
val.transform.localRotation = Quaternion.identity;
val.transform.localScale = new Vector3(1f, 1f, 1f);
val.layer = leaf.layer;
return val;
}
string name = ((Object)leaf).name;
GameObject val2 = new GameObject(((Object)leaf).name);
GameObject val3 = val2;
GameObject val4 = new GameObject();
val3.transform.parent = val4.transform;
val3.layer = leaf.layer;
val3.transform.localPosition = leaf.transform.localPosition;
val3.transform.localRotation = leaf.transform.localRotation;
val3.transform.localScale = leaf.transform.localScale;
while ((Object)(object)leaf.transform.parent != (Object)null && (Object)(object)((Component)leaf.transform.parent).gameObject != (Object)(object)root)
{
leaf = ((Component)leaf.transform.parent).gameObject;
val3 = val4;
val4 = new GameObject();
((Object)val3).name = ((Object)leaf).name;
val3.layer = leaf.layer;
val3.transform.parent = val4.transform;
val3.transform.localPosition = leaf.transform.localPosition;
val3.transform.localRotation = leaf.transform.localRotation;
val3.transform.localScale = leaf.transform.localScale;
}
if ((Object)(object)leaf.transform.parent == (Object)null)
{
throw new Exception("Leaf " + name + " doesn't have " + ((Object)root).name + " in its hierarchy");
}
val4.transform.parent = (attachTo ?? root).transform;
val4.layer = (attachTo ?? root).layer;
val4.transform.localPosition = default(Vector3);
val4.transform.localRotation = Quaternion.identity;
val4.transform.localScale = new Vector3(1f, 1f, 1f);
return val2;
}
public static Transform getChildByPath(GameObject root, params string[] path)
{
if ((Object)(object)root == (Object)null)
{
return null;
}
if (path.Length == 0)
{
return null;
}
Transform val = root.transform;
foreach (string text in path)
{
val = val.Find(text);
if ((Object)(object)val == (Object)null)
{
return null;
}
}
return val;
}
public static bool isTrueNull(Component c)
{
return c == null;
}
}
public class GradientUtils
{
public static void rescaleAlphaTimes(Gradient grad, float minBound, float maxBound)
{
//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)
GradientAlphaKey[] alphaKeys = grad.alphaKeys;
GradientAlphaKey[] array = (GradientAlphaKey[])(object)new GradientAlphaKey[alphaKeys.Length];
for (int i = 0; i < alphaKeys.Length; i++)
{
array[i] = new GradientAlphaKey(alphaKeys[i].alpha, Mathf.Lerp(minBound, maxBound, alphaKeys[i].time));
}
grad.SetKeys(grad.colorKeys, array);
}
public static Gradient getNormalizedGradient(Material mat, Gradient grad, Color baseColor)
{
//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_0044: 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_005a: 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_007c: 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_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: 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_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0159: Unknown result type (might be due to invalid IL or missing references)
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: 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_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_03d1: Unknown result type (might be due to invalid IL or missing references)
//IL_03d8: Expected O, but got Unknown
//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
//IL_0215: 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_0418: Unknown result type (might be due to invalid IL or missing references)
//IL_041d: Unknown result type (might be due to invalid IL or missing references)
//IL_0421: Unknown result type (might be due to invalid IL or missing references)
//IL_0284: Unknown result type (might be due to invalid IL or missing references)
//IL_028f: Unknown result type (might be due to invalid IL or missing references)
//IL_0296: Unknown result type (might be due to invalid IL or missing references)
//IL_029b: Unknown result type (might be due to invalid IL or missing references)
//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
//IL_02d2: 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)
//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
//IL_0302: Unknown result type (might be due to invalid IL or missing references)
//IL_0311: Unknown result type (might be due to invalid IL or missing references)
//IL_0327: Unknown result type (might be due to invalid IL or missing references)
//IL_0336: Unknown result type (might be due to invalid IL or missing references)
//IL_0238: Unknown result type (might be due to invalid IL or missing references)
//IL_0244: Unknown result type (might be due to invalid IL or missing references)
//IL_024b: Unknown result type (might be due to invalid IL or missing references)
//IL_0250: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
//IL_026d: Unknown result type (might be due to invalid IL or missing references)
//IL_0274: Unknown result type (might be due to invalid IL or missing references)
//IL_0453: Unknown result type (might be due to invalid IL or missing references)
//IL_0458: Unknown result type (might be due to invalid IL or missing references)
//IL_045c: Unknown result type (might be due to invalid IL or missing references)
//IL_04bb: Unknown result type (might be due to invalid IL or missing references)
//IL_04c0: Unknown result type (might be due to invalid IL or missing references)
//IL_04c4: Unknown result type (might be due to invalid IL or missing references)
//IL_04cb: Unknown result type (might be due to invalid IL or missing references)
//IL_04d3: Unknown result type (might be due to invalid IL or missing references)
//IL_04da: Unknown result type (might be due to invalid IL or missing references)
//IL_04e2: Unknown result type (might be due to invalid IL or missing references)
//IL_04e9: Unknown result type (might be due to invalid IL or missing references)
//IL_04fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0508: Unknown result type (might be due to invalid IL or missing references)
//IL_0512: Unknown result type (might be due to invalid IL or missing references)
//IL_05a6: Unknown result type (might be due to invalid IL or missing references)
//IL_05b0: Unknown result type (might be due to invalid IL or missing references)
//IL_05ba: Unknown result type (might be due to invalid IL or missing references)
//IL_05d0: Unknown result type (might be due to invalid IL or missing references)
//IL_05d4: Unknown result type (might be due to invalid IL or missing references)
//IL_05e4: Unknown result type (might be due to invalid IL or missing references)
//IL_0536: Unknown result type (might be due to invalid IL or missing references)
//IL_0540: Unknown result type (might be due to invalid IL or missing references)
//IL_054a: Unknown result type (might be due to invalid IL or missing references)
//IL_055b: Unknown result type (might be due to invalid IL or missing references)
//IL_0565: Unknown result type (might be due to invalid IL or missing references)
//IL_056f: Unknown result type (might be due to invalid IL or missing references)
//IL_057e: Unknown result type (might be due to invalid IL or missing references)
//IL_0585: Unknown result type (might be due to invalid IL or missing references)
//IL_0598: Unknown result type (might be due to invalid IL or missing references)
GradientColorKey[] colorKeys = grad.colorKeys;
GradientAlphaKey[] alphaKeys = grad.alphaKeys;
List<GradientColorKey> list = new List<GradientColorKey>();
List<GradientAlphaKey> list2 = new List<GradientAlphaKey>();
StandardShaderUtils.ParticleColorMode particleColorMode = (((Object)(object)mat != (Object)null) ? StandardShaderUtils.getColorMode(mat) : StandardShaderUtils.ParticleColorMode.Multiply);
GradientColorKey[] array = colorKeys;
foreach (GradientColorKey val in array)
{
Color color = val.color;
switch (particleColorMode)
{
case StandardShaderUtils.ParticleColorMode.Multiply:
color.r *= baseColor.r;
color.g *= baseColor.g;
color.b *= baseColor.b;
break;
case StandardShaderUtils.ParticleColorMode.Additive:
color.r += baseColor.r;
color.g += baseColor.g;
color.b += baseColor.b;
break;
case StandardShaderUtils.ParticleColorMode.Subtractive:
color.r = 1f - (baseColor.r - color.r);
color.g = 1f - (baseColor.g - color.g);
color.b = 1f - (baseColor.b - color.b);
break;
}
list.Add(new GradientColorKey(color, val.time));
}
GradientAlphaKey[] array2 = alphaKeys;
foreach (GradientAlphaKey val2 in array2)
{
list2.Add(new GradientAlphaKey(val2.alpha * baseColor.a, val2.time));
}
List<GradientAlphaKey> list3 = new List<GradientAlphaKey>();
float num = 0.0001f;
if (list.Count > 1)
{
GradientColorKey item = default(GradientColorKey);
GradientColorKey item2 = default(GradientColorKey);
for (int k = 0; k < list.Count; k++)
{
GradientColorKey val3 = list[k];
if (val3.color != Color.black)
{
list3.Add(new GradientAlphaKey(1f, val3.time));
continue;
}
if (k == 0)
{
list.Remove(val3);
list.Insert(0, new GradientColorKey(getNonblackAfter(list, val3.time).color, val3.time));
list3.Insert(0, new GradientAlphaKey(0f, val3.time));
continue;
}
if (k == list.Count - 1)
{
list.Remove(val3);
list.Insert(k, new GradientColorKey(getNonblackBefore(list, val3.time).color, val3.time));
list3.Add(new GradientAlphaKey(0f, val3.time));
continue;
}
list.Remove(val3);
((GradientColorKey)(ref item))..ctor(getNonblackBefore(list, val3.time).color, Mathf.Max(0f, val3.time - num));
((GradientColorKey)(ref item2))..ctor(getNonblackAfter(list, val3.time).color, Mathf.Min(1f, val3.time + num));
list.Add(item);
list.Add(item2);
list3.Add(new GradientAlphaKey(0f, Mathf.Max(0f, val3.time - num)));
list3.Add(new GradientAlphaKey(0f, Mathf.Min(1f, val3.time + num)));
list.Sort((GradientColorKey x, GradientColorKey y) => x.time.CompareTo(y.time));
k++;
}
}
list2 = combineAlphas(list2, list3);
list.Sort((GradientColorKey x, GradientColorKey y) => x.time.CompareTo(y.time));
list2.Sort((GradientAlphaKey x, GradientAlphaKey y) => x.time.CompareTo(y.time));
Gradient val4 = new Gradient();
val4.SetKeys(list.ToArray(), list2.ToArray());
HashSet<float> hashSet = new HashSet<float>();
hashSet.Add(0f);
hashSet.Add(1f);
foreach (GradientColorKey item3 in list)
{
hashSet.Add(item3.time);
}
foreach (GradientAlphaKey item4 in list2)
{
hashSet.Add(item4.time);
}
List<float> list4 = new List<float>(hashSet);
list4.Sort();
List<GradientColorKey> list5 = new List<GradientColorKey>();
List<GradientAlphaKey> list6 = new List<GradientAlphaKey>();
Color val6 = default(Color);
Color val7 = default(Color);
foreach (float item5 in list4)
{
Color val5 = val4.Evaluate(item5);
((Color)(ref val6))..ctor(val5.r * val5.a, val5.g * val5.a, val5.b * val5.a);
float num2 = Mathf.Max(new float[3] { val6.r, val6.g, val6.b });
float num3 = num2;
if (num3 == 0f)
{
num2 = Mathf.Max(new float[3] { val5.r, val5.g, val5.b });
list5.Add(new GradientColorKey(new Color(val5.r / num2, val5.g / num2, val5.b / num2, 1f), item5));
list6.Add(new GradientAlphaKey(0f, item5));
}
else
{
((Color)(ref val7))..ctor(val6.r / num3, val6.g / num3, val6.b / num3, 1f);
list5.Add(new GradientColorKey(val7, item5));
list6.Add(new GradientAlphaKey(num3, item5));
}
}
dedupeColorKeys(list5, num * 2f);
dedupeAlphaKeys(list6, num * 2f);
val4.SetKeys(list5.ToArray(), list6.ToArray());
return val4;
}
private static List<GradientAlphaKey> combineAlphas(List<GradientAlphaKey> a, List<GradientAlphaKey> b)
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Expected O, but got Unknown
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: 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_007e: 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_0094: Expected O, but got Unknown
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: 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_00c2: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: 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_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
//IL_01bc: 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)
a.Sort((GradientAlphaKey x, GradientAlphaKey y) => x.time.CompareTo(y.time));
b.Sort((GradientAlphaKey x, GradientAlphaKey y) => x.time.CompareTo(y.time));
Gradient val = new Gradient();
val.SetKeys((GradientColorKey[])(object)new GradientColorKey[2]
{
new GradientColorKey(Color.black, 0f),
new GradientColorKey(Color.black, 1f)
}, a.ToArray());
Gradient val2 = new Gradient();
val2.SetKeys((GradientColorKey[])(object)new GradientColorKey[2]
{
new GradientColorKey(Color.black, 0f),
new GradientColorKey(Color.black, 1f)
}, b.ToArray());
List<GradientAlphaKey> list = new List<GradientAlphaKey>();
foreach (GradientAlphaKey item in a)
{
float num = item.alpha * val2.Evaluate(item.time).a;
list.Add(new GradientAlphaKey(num, item.time));
}
foreach (GradientAlphaKey item2 in b)
{
float num2 = item2.alpha * val.Evaluate(item2.time).a;
list.Add(new GradientAlphaKey(num2, item2.time));
}
list.Sort((GradientAlphaKey x, GradientAlphaKey y) => x.time.CompareTo(y.time));
for (int i = 0; i < list.Count - 1; i++)
{
if (list[i].time == list[i + 1].time)
{
list.RemoveAt(i);
i--;
}
}
return list;
}
private static void dedupeColorKeys(List<GradientColorKey> keys, float timeEpsilon)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: 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_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_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: 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_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: 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_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
while (keys.Count > 1 && approxEqual(keys[0].color, keys[1].color))
{
keys.RemoveAt(0);
}
while (keys.Count > 1 && approxEqual(keys[keys.Count - 1].color, keys[keys.Count - 2].color))
{
keys.RemoveAt(keys.Count - 1);
}
for (int i = 1; i < keys.Count - 1; i++)
{
if (approxEqual(keys[i - 1].color, keys[i].color) && approxEqual(keys[i].color, keys[i + 1].color))
{
keys.RemoveAt(i);
i--;
}
}
for (int j = 0; j < keys.Count - 1; j++)
{
if (approxEqual(keys[j].color, keys[j + 1].color) && Mathf.Abs(keys[j].time - keys[j + 1].time) < t