Decompiled source of ravenimpactfx v1.3.8

personplus.dll

Decompiled a year ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using Attributes;
using BepInEx;
using BepInEx.Configuration;
using Enum;
using HarmonyLib;
using Lua.Wrapper;
using Pathfinding;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.Rendering;
using UnityStandardAssets.Characters.FirstPerson;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.6", FrameworkDisplayName = ".NET Framework 4.6")]
[assembly: AssemblyCompany("personplus")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("personplus")]
[assembly: AssemblyTitle("personplus")]
[assembly: AssemblyVersion("1.0.0.0")]
public class Benchmark : MonoBehaviour
{
	public struct BenchmarkData
	{
		public readonly float Ms;

		public readonly float Fps;

		public float Time;

		public BenchmarkData(float ms, float fps, float timeSinceStart)
		{
			Ms = ms;
			Fps = fps;
			Time = timeSinceStart;
		}
	}

	public struct CSVData
	{
		public FrameData FrameData;

		public BenchmarkData BenchmarkData;

		public CSVData(FrameData frameData, BenchmarkData benchmarkData)
		{
			FrameData = frameData;
			BenchmarkData = benchmarkData;
		}
	}

	public struct FrameData
	{
		public readonly double fogDensityShaderTime;

		public readonly double applyBlurTime;

		public readonly double applySceneTime;

		public readonly double totalFrameTime;

		public FrameData(double fogDensityShaderTime, double applyBlurTime, double applySceneTime, double totalFrameTime)
		{
			this.fogDensityShaderTime = fogDensityShaderTime;
			this.applyBlurTime = applyBlurTime;
			this.applySceneTime = applySceneTime;
			this.totalFrameTime = totalFrameTime;
		}
	}

	public bool benchmarkModeEnabled;

	public Dictionary<float, List<CSVData>> Data;

	private FrameData _currentFrameData;

	private Animator _animator;

	public float TimeSpent;

	private void Awake()
	{
		Data = new Dictionary<float, List<CSVData>>();
		_animator = ((Component)this).GetComponent<Animator>();
		((MonoBehaviour)this).StartCoroutine(benchmarkModeEnabled ? RunBenchmarks() : DisplayFps());
	}

	private IEnumerator DisplayFps()
	{
		while (true)
		{
			TimeSpent += (Time.unscaledDeltaTime - TimeSpent) * 0.1f;
			_ = 1000f * TimeSpent;
			_ = 1f / TimeSpent;
			yield return null;
		}
	}

	private IEnumerator RunBenchmarks()
	{
		Screen.SetResolution(1920, 1080, true);
		yield return ((MonoBehaviour)this).StartCoroutine(StartBench("1080p"));
		Screen.SetResolution(1280, 720, true);
		yield return ((MonoBehaviour)this).StartCoroutine(StartBench("720p"));
		Screen.SetResolution(640, 480, true);
		yield return ((MonoBehaviour)this).StartCoroutine(StartBench("480p"));
		Application.Quit();
	}

	private IEnumerator StartBench(string runName, bool writeToCsv = true)
	{
		TimeSpent = 0f;
		Data = new Dictionary<float, List<CSVData>>();
		float timer = 0f;
		while (true)
		{
			float num;
			timer = (num = timer + Time.deltaTime);
			if (!(num < 4f))
			{
				break;
			}
			TimeSpent += (Time.unscaledDeltaTime - TimeSpent) * 0.1f;
			yield return (object)new WaitForSeconds(Time.deltaTime);
		}
		float time = Time.time;
		_animator.SetTrigger("StartBench");
		yield return (object)new WaitUntil((Func<bool>)delegate
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			AnimatorStateInfo currentAnimatorStateInfo2 = _animator.GetCurrentAnimatorStateInfo(0);
			return ((AnimatorStateInfo)(ref currentAnimatorStateInfo2)).IsName("Benchmark");
		});
		yield return (object)new WaitUntil((Func<bool>)delegate
		{
			//IL_00df: 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)
			TimeSpent += (Time.unscaledDeltaTime - TimeSpent) * 0.1f;
			float ms = 1000f * TimeSpent;
			float fps = 1f / TimeSpent;
			float num2 = Mathf.Round(Time.time - time);
			Data.TryGetValue(num2, out var value);
			if (value == null)
			{
				Data[num2] = new List<CSVData>();
			}
			BenchmarkData benchmarkData = new BenchmarkData(ms, fps, num2);
			FrameData currentFrameData = _currentFrameData;
			Data[num2].Add(new CSVData(currentFrameData, benchmarkData));
			AnimatorStateInfo currentAnimatorStateInfo = _animator.GetCurrentAnimatorStateInfo(0);
			return !((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Benchmark");
		});
		if (writeToCsv)
		{
			WriteToCsv(runName);
		}
	}

	private void WriteToCsv(string runName)
	{
		string path = Application.persistentDataPath + "/volumetricfog_" + runName + "_" + DateTime.Now.ToFileTimeUtc() + ".csv";
		if (!File.Exists(path))
		{
			File.WriteAllText(path, "Time since start(s).FPS.MS" + Environment.NewLine);
		}
		foreach (KeyValuePair<float, List<CSVData>> datum in Data)
		{
			string text = datum.Value.Average((CSVData val) => val.BenchmarkData.Fps).ToString(CultureInfo.InvariantCulture);
			string text2 = datum.Value.Average((CSVData val) => val.BenchmarkData.Ms).ToString(CultureInfo.InvariantCulture);
			string text3 = datum.Key.ToString(CultureInfo.InvariantCulture);
			File.AppendAllText(path, text3 + "." + text + "." + text2 + Environment.NewLine);
		}
	}
}
public static class EasingFunction
{
	public enum Ease
	{
		EaseInQuad,
		EaseOutQuad,
		EaseInOutQuad,
		EaseInCubic,
		EaseOutCubic,
		EaseInOutCubic,
		EaseInQuart,
		EaseOutQuart,
		EaseInOutQuart,
		EaseInQuint,
		EaseOutQuint,
		EaseInOutQuint,
		EaseInSine,
		EaseOutSine,
		EaseInOutSine,
		EaseInExpo,
		EaseOutExpo,
		EaseInOutExpo,
		EaseInCirc,
		EaseOutCirc,
		EaseInOutCirc,
		Linear,
		Spring,
		EaseInBounce,
		EaseOutBounce,
		EaseInOutBounce,
		EaseInBack,
		EaseOutBack,
		EaseInOutBack,
		EaseInElastic,
		EaseOutElastic,
		EaseInOutElastic
	}

	public delegate float Function(float s, float e, float v);

	private const float NATURAL_LOG_OF_2 = 0.6931472f;

	public static float Linear(float start, float end, float value)
	{
		return Mathf.Lerp(start, end, value);
	}

	public static float Spring(float start, float end, float value)
	{
		value = Mathf.Clamp01(value);
		value = (Mathf.Sin(value * (float)Math.PI * (0.2f + 2.5f * value * value * value)) * Mathf.Pow(1f - value, 2.2f) + value) * (1f + 1.2f * (1f - value));
		return start + (end - start) * value;
	}

	public static float EaseInQuad(float start, float end, float value)
	{
		end -= start;
		return end * value * value + start;
	}

	public static float EaseOutQuad(float start, float end, float value)
	{
		end -= start;
		return (0f - end) * value * (value - 2f) + start;
	}

	public static float EaseInOutQuad(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return end * 0.5f * value * value + start;
		}
		value -= 1f;
		return (0f - end) * 0.5f * (value * (value - 2f) - 1f) + start;
	}

	public static float EaseInCubic(float start, float end, float value)
	{
		end -= start;
		return end * value * value * value + start;
	}

	public static float EaseOutCubic(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return end * (value * value * value + 1f) + start;
	}

	public static float EaseInOutCubic(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return end * 0.5f * value * value * value + start;
		}
		value -= 2f;
		return end * 0.5f * (value * value * value + 2f) + start;
	}

	public static float EaseInQuart(float start, float end, float value)
	{
		end -= start;
		return end * value * value * value * value + start;
	}

	public static float EaseOutQuart(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return (0f - end) * (value * value * value * value - 1f) + start;
	}

	public static float EaseInOutQuart(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return end * 0.5f * value * value * value * value + start;
		}
		value -= 2f;
		return (0f - end) * 0.5f * (value * value * value * value - 2f) + start;
	}

	public static float EaseInQuint(float start, float end, float value)
	{
		end -= start;
		return end * value * value * value * value * value + start;
	}

	public static float EaseOutQuint(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return end * (value * value * value * value * value + 1f) + start;
	}

	public static float EaseInOutQuint(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return end * 0.5f * value * value * value * value * value + start;
		}
		value -= 2f;
		return end * 0.5f * (value * value * value * value * value + 2f) + start;
	}

	public static float EaseInSine(float start, float end, float value)
	{
		end -= start;
		return (0f - end) * Mathf.Cos(value * ((float)Math.PI / 2f)) + end + start;
	}

	public static float EaseOutSine(float start, float end, float value)
	{
		end -= start;
		return end * Mathf.Sin(value * ((float)Math.PI / 2f)) + start;
	}

	public static float EaseInOutSine(float start, float end, float value)
	{
		end -= start;
		return (0f - end) * 0.5f * (Mathf.Cos((float)Math.PI * value) - 1f) + start;
	}

	public static float EaseInExpo(float start, float end, float value)
	{
		end -= start;
		return end * Mathf.Pow(2f, 10f * (value - 1f)) + start;
	}

	public static float EaseOutExpo(float start, float end, float value)
	{
		end -= start;
		return end * (0f - Mathf.Pow(2f, -10f * value) + 1f) + start;
	}

	public static float EaseInOutExpo(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return end * 0.5f * Mathf.Pow(2f, 10f * (value - 1f)) + start;
		}
		value -= 1f;
		return end * 0.5f * (0f - Mathf.Pow(2f, -10f * value) + 2f) + start;
	}

	public static float EaseInCirc(float start, float end, float value)
	{
		end -= start;
		return (0f - end) * (Mathf.Sqrt(1f - value * value) - 1f) + start;
	}

	public static float EaseOutCirc(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return end * Mathf.Sqrt(1f - value * value) + start;
	}

	public static float EaseInOutCirc(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return (0f - end) * 0.5f * (Mathf.Sqrt(1f - value * value) - 1f) + start;
		}
		value -= 2f;
		return end * 0.5f * (Mathf.Sqrt(1f - value * value) + 1f) + start;
	}

	public static float EaseInBounce(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		return end - EaseOutBounce(0f, end, num - value) + start;
	}

	public static float EaseOutBounce(float start, float end, float value)
	{
		value /= 1f;
		end -= start;
		if (value < 0.36363637f)
		{
			return end * (7.5625f * value * value) + start;
		}
		if (value < 0.72727275f)
		{
			value -= 0.54545456f;
			return end * (7.5625f * value * value + 0.75f) + start;
		}
		if ((double)value < 0.9090909090909091)
		{
			value -= 0.8181818f;
			return end * (7.5625f * value * value + 0.9375f) + start;
		}
		value -= 21f / 22f;
		return end * (7.5625f * value * value + 63f / 64f) + start;
	}

	public static float EaseInOutBounce(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		if (value < num * 0.5f)
		{
			return EaseInBounce(0f, end, value * 2f) * 0.5f + start;
		}
		return EaseOutBounce(0f, end, value * 2f - num) * 0.5f + end * 0.5f + start;
	}

	public static float EaseInBack(float start, float end, float value)
	{
		end -= start;
		value /= 1f;
		float num = 1.70158f;
		return end * value * value * ((num + 1f) * value - num) + start;
	}

	public static float EaseOutBack(float start, float end, float value)
	{
		float num = 1.70158f;
		end -= start;
		value -= 1f;
		return end * (value * value * ((num + 1f) * value + num) + 1f) + start;
	}

	public static float EaseInOutBack(float start, float end, float value)
	{
		float num = 1.70158f;
		end -= start;
		value /= 0.5f;
		if (value < 1f)
		{
			num *= 1.525f;
			return end * 0.5f * (value * value * ((num + 1f) * value - num)) + start;
		}
		value -= 2f;
		num *= 1.525f;
		return end * 0.5f * (value * value * ((num + 1f) * value + num) + 2f) + start;
	}

	public static float EaseInElastic(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		float num2 = num * 0.3f;
		float num3 = 0f;
		if (value == 0f)
		{
			return start;
		}
		if ((value /= num) == 1f)
		{
			return start + end;
		}
		float num4;
		if (num3 == 0f || num3 < Mathf.Abs(end))
		{
			num3 = end;
			num4 = num2 / 4f;
		}
		else
		{
			num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3);
		}
		return 0f - num3 * Mathf.Pow(2f, 10f * (value -= 1f)) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2) + start;
	}

	public static float EaseOutElastic(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		float num2 = num * 0.3f;
		float num3 = 0f;
		if (value == 0f)
		{
			return start;
		}
		if ((value /= num) == 1f)
		{
			return start + end;
		}
		float num4;
		if (num3 == 0f || num3 < Mathf.Abs(end))
		{
			num3 = end;
			num4 = num2 * 0.25f;
		}
		else
		{
			num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3);
		}
		return num3 * Mathf.Pow(2f, -10f * value) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2) + end + start;
	}

	public static float EaseInOutElastic(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		float num2 = num * 0.3f;
		float num3 = 0f;
		if (value == 0f)
		{
			return start;
		}
		if ((value /= num * 0.5f) == 2f)
		{
			return start + end;
		}
		float num4;
		if (num3 == 0f || num3 < Mathf.Abs(end))
		{
			num3 = end;
			num4 = num2 / 4f;
		}
		else
		{
			num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3);
		}
		if (value < 1f)
		{
			return -0.5f * (num3 * Mathf.Pow(2f, 10f * (value -= 1f)) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2)) + start;
		}
		return num3 * Mathf.Pow(2f, -10f * (value -= 1f)) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2) * 0.5f + end + start;
	}

	public static float LinearD(float start, float end, float value)
	{
		return end - start;
	}

	public static float EaseInQuadD(float start, float end, float value)
	{
		return 2f * (end - start) * value;
	}

	public static float EaseOutQuadD(float start, float end, float value)
	{
		end -= start;
		return (0f - end) * value - end * (value - 2f);
	}

	public static float EaseInOutQuadD(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return end * value;
		}
		value -= 1f;
		return end * (1f - value);
	}

	public static float EaseInCubicD(float start, float end, float value)
	{
		return 3f * (end - start) * value * value;
	}

	public static float EaseOutCubicD(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return 3f * end * value * value;
	}

	public static float EaseInOutCubicD(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return 1.5f * end * value * value;
		}
		value -= 2f;
		return 1.5f * end * value * value;
	}

	public static float EaseInQuartD(float start, float end, float value)
	{
		return 4f * (end - start) * value * value * value;
	}

	public static float EaseOutQuartD(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return -4f * end * value * value * value;
	}

	public static float EaseInOutQuartD(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return 2f * end * value * value * value;
		}
		value -= 2f;
		return -2f * end * value * value * value;
	}

	public static float EaseInQuintD(float start, float end, float value)
	{
		return 5f * (end - start) * value * value * value * value;
	}

	public static float EaseOutQuintD(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return 5f * end * value * value * value * value;
	}

	public static float EaseInOutQuintD(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return 2.5f * end * value * value * value * value;
		}
		value -= 2f;
		return 2.5f * end * value * value * value * value;
	}

	public static float EaseInSineD(float start, float end, float value)
	{
		return (end - start) * 0.5f * (float)Math.PI * Mathf.Sin((float)Math.PI / 2f * value);
	}

	public static float EaseOutSineD(float start, float end, float value)
	{
		end -= start;
		return (float)Math.PI / 2f * end * Mathf.Cos(value * ((float)Math.PI / 2f));
	}

	public static float EaseInOutSineD(float start, float end, float value)
	{
		end -= start;
		return end * 0.5f * (float)Math.PI * Mathf.Sin((float)Math.PI * value);
	}

	public static float EaseInExpoD(float start, float end, float value)
	{
		return 6.931472f * (end - start) * Mathf.Pow(2f, 10f * (value - 1f));
	}

	public static float EaseOutExpoD(float start, float end, float value)
	{
		end -= start;
		return 3.465736f * end * Mathf.Pow(2f, 1f - 10f * value);
	}

	public static float EaseInOutExpoD(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return 3.465736f * end * Mathf.Pow(2f, 10f * (value - 1f));
		}
		value -= 1f;
		return 3.465736f * end / Mathf.Pow(2f, 10f * value);
	}

	public static float EaseInCircD(float start, float end, float value)
	{
		return (end - start) * value / Mathf.Sqrt(1f - value * value);
	}

	public static float EaseOutCircD(float start, float end, float value)
	{
		value -= 1f;
		end -= start;
		return (0f - end) * value / Mathf.Sqrt(1f - value * value);
	}

	public static float EaseInOutCircD(float start, float end, float value)
	{
		value /= 0.5f;
		end -= start;
		if (value < 1f)
		{
			return end * value / (2f * Mathf.Sqrt(1f - value * value));
		}
		value -= 2f;
		return (0f - end) * value / (2f * Mathf.Sqrt(1f - value * value));
	}

	public static float EaseInBounceD(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		return EaseOutBounceD(0f, end, num - value);
	}

	public static float EaseOutBounceD(float start, float end, float value)
	{
		value /= 1f;
		end -= start;
		if (value < 0.36363637f)
		{
			return 2f * end * 7.5625f * value;
		}
		if (value < 0.72727275f)
		{
			value -= 0.54545456f;
			return 2f * end * 7.5625f * value;
		}
		if ((double)value < 0.9090909090909091)
		{
			value -= 0.8181818f;
			return 2f * end * 7.5625f * value;
		}
		value -= 21f / 22f;
		return 2f * end * 7.5625f * value;
	}

	public static float EaseInOutBounceD(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		if (value < num * 0.5f)
		{
			return EaseInBounceD(0f, end, value * 2f) * 0.5f;
		}
		return EaseOutBounceD(0f, end, value * 2f - num) * 0.5f;
	}

	public static float EaseInBackD(float start, float end, float value)
	{
		float num = 1.70158f;
		return 3f * (num + 1f) * (end - start) * value * value - 2f * num * (end - start) * value;
	}

	public static float EaseOutBackD(float start, float end, float value)
	{
		float num = 1.70158f;
		end -= start;
		value -= 1f;
		return end * ((num + 1f) * value * value + 2f * value * ((num + 1f) * value + num));
	}

	public static float EaseInOutBackD(float start, float end, float value)
	{
		float num = 1.70158f;
		end -= start;
		value /= 0.5f;
		if (value < 1f)
		{
			num *= 1.525f;
			return 0.5f * end * (num + 1f) * value * value + end * value * ((num + 1f) * value - num);
		}
		value -= 2f;
		num *= 1.525f;
		return 0.5f * end * ((num + 1f) * value * value + 2f * value * ((num + 1f) * value + num));
	}

	public static float EaseInElasticD(float start, float end, float value)
	{
		return EaseOutElasticD(start, end, 1f - value);
	}

	public static float EaseOutElasticD(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		float num2 = num * 0.3f;
		float num3 = 0f;
		float num4;
		if (num3 == 0f || num3 < Mathf.Abs(end))
		{
			num3 = end;
			num4 = num2 * 0.25f;
		}
		else
		{
			num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3);
		}
		return num3 * (float)Math.PI * num * Mathf.Pow(2f, 1f - 10f * value) * Mathf.Cos((float)Math.PI * 2f * (num * value - num4) / num2) / num2 - 3.465736f * num3 * Mathf.Pow(2f, 1f - 10f * value) * Mathf.Sin((float)Math.PI * 2f * (num * value - num4) / num2);
	}

	public static float EaseInOutElasticD(float start, float end, float value)
	{
		end -= start;
		float num = 1f;
		float num2 = num * 0.3f;
		float num3 = 0f;
		float num4;
		if (num3 == 0f || num3 < Mathf.Abs(end))
		{
			num3 = end;
			num4 = num2 / 4f;
		}
		else
		{
			num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3);
		}
		if (value < 1f)
		{
			value -= 1f;
			return -3.465736f * num3 * Mathf.Pow(2f, 10f * value) * Mathf.Sin((float)Math.PI * 2f * (num * value - 2f) / num2) - num3 * (float)Math.PI * num * Mathf.Pow(2f, 10f * value) * Mathf.Cos((float)Math.PI * 2f * (num * value - num4) / num2) / num2;
		}
		value -= 1f;
		return num3 * (float)Math.PI * num * Mathf.Cos((float)Math.PI * 2f * (num * value - num4) / num2) / (num2 * Mathf.Pow(2f, 10f * value)) - 3.465736f * num3 * Mathf.Sin((float)Math.PI * 2f * (num * value - num4) / num2) / Mathf.Pow(2f, 10f * value);
	}

	public static float SpringD(float start, float end, float value)
	{
		value = Mathf.Clamp01(value);
		end -= start;
		return end * (6f * (1f - value) / 5f + 1f) * (-2.2f * Mathf.Pow(1f - value, 1.2f) * Mathf.Sin((float)Math.PI * value * (2.5f * value * value * value + 0.2f)) + Mathf.Pow(1f - value, 2.2f) * ((float)Math.PI * (2.5f * value * value * value + 0.2f) + 23.561945f * value * value * value) * Mathf.Cos((float)Math.PI * value * (2.5f * value * value * value + 0.2f)) + 1f) - 6f * end * (Mathf.Pow(1f - value, 2.2f) * Mathf.Sin((float)Math.PI * value * (2.5f * value * value * value + 0.2f)) + value / 5f);
	}

	public static Function GetEasingFunction(Ease easingFunction)
	{
		return easingFunction switch
		{
			Ease.EaseInQuad => EaseInQuad, 
			Ease.EaseOutQuad => EaseOutQuad, 
			Ease.EaseInOutQuad => EaseInOutQuad, 
			Ease.EaseInCubic => EaseInCubic, 
			Ease.EaseOutCubic => EaseOutCubic, 
			Ease.EaseInOutCubic => EaseInOutCubic, 
			Ease.EaseInQuart => EaseInQuart, 
			Ease.EaseOutQuart => EaseOutQuart, 
			Ease.EaseInOutQuart => EaseInOutQuart, 
			Ease.EaseInQuint => EaseInQuint, 
			Ease.EaseOutQuint => EaseOutQuint, 
			Ease.EaseInOutQuint => EaseInOutQuint, 
			Ease.EaseInSine => EaseInSine, 
			Ease.EaseOutSine => EaseOutSine, 
			Ease.EaseInOutSine => EaseInOutSine, 
			Ease.EaseInExpo => EaseInExpo, 
			Ease.EaseOutExpo => EaseOutExpo, 
			Ease.EaseInOutExpo => EaseInOutExpo, 
			Ease.EaseInCirc => EaseInCirc, 
			Ease.EaseOutCirc => EaseOutCirc, 
			Ease.EaseInOutCirc => EaseInOutCirc, 
			Ease.Linear => Linear, 
			Ease.Spring => Spring, 
			Ease.EaseInBounce => EaseInBounce, 
			Ease.EaseOutBounce => EaseOutBounce, 
			Ease.EaseInOutBounce => EaseInOutBounce, 
			Ease.EaseInBack => EaseInBack, 
			Ease.EaseOutBack => EaseOutBack, 
			Ease.EaseInOutBack => EaseInOutBack, 
			Ease.EaseInElastic => EaseInElastic, 
			Ease.EaseOutElastic => EaseOutElastic, 
			Ease.EaseInOutElastic => EaseInOutElastic, 
			_ => null, 
		};
	}

	public static Function GetEasingFunctionDerivative(Ease easingFunction)
	{
		return easingFunction switch
		{
			Ease.EaseInQuad => EaseInQuadD, 
			Ease.EaseOutQuad => EaseOutQuadD, 
			Ease.EaseInOutQuad => EaseInOutQuadD, 
			Ease.EaseInCubic => EaseInCubicD, 
			Ease.EaseOutCubic => EaseOutCubicD, 
			Ease.EaseInOutCubic => EaseInOutCubicD, 
			Ease.EaseInQuart => EaseInQuartD, 
			Ease.EaseOutQuart => EaseOutQuartD, 
			Ease.EaseInOutQuart => EaseInOutQuartD, 
			Ease.EaseInQuint => EaseInQuintD, 
			Ease.EaseOutQuint => EaseOutQuintD, 
			Ease.EaseInOutQuint => EaseInOutQuintD, 
			Ease.EaseInSine => EaseInSineD, 
			Ease.EaseOutSine => EaseOutSineD, 
			Ease.EaseInOutSine => EaseInOutSineD, 
			Ease.EaseInExpo => EaseInExpoD, 
			Ease.EaseOutExpo => EaseOutExpoD, 
			Ease.EaseInOutExpo => EaseInOutExpoD, 
			Ease.EaseInCirc => EaseInCircD, 
			Ease.EaseOutCirc => EaseOutCircD, 
			Ease.EaseInOutCirc => EaseInOutCircD, 
			Ease.Linear => LinearD, 
			Ease.Spring => SpringD, 
			Ease.EaseInBounce => EaseInBounceD, 
			Ease.EaseOutBounce => EaseOutBounceD, 
			Ease.EaseInOutBounce => EaseInOutBounceD, 
			Ease.EaseInBack => EaseInBackD, 
			Ease.EaseOutBack => EaseOutBackD, 
			Ease.EaseInOutBack => EaseInOutBackD, 
			Ease.EaseInElastic => EaseInElasticD, 
			Ease.EaseOutElastic => EaseOutElasticD, 
			Ease.EaseInOutElastic => EaseInOutElasticD, 
			_ => null, 
		};
	}
}
public class MoveSun : MonoBehaviour
{
	public bool shouldMove;

	public float moveSpeed;

	private void Update()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		if (shouldMove)
		{
			((Component)this).transform.Rotate(Vector3.right, moveSpeed * Time.unscaledDeltaTime);
		}
	}
}
public class SpringPlus
{
	public float spring;

	public float drag;

	public float simSpeed = 1f;

	public Vector3 position;

	public Vector3 velocity;

	public Vector3 min;

	public Vector3 max;

	public int iterations;

	public float distanceCoefficient;

	public float control;

	public SpringPlus(float spring, float drag, Vector3 min, Vector3 max, int iterations, float simSpeed, float distanceCoefficient)
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: 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)
		this.spring = spring;
		this.drag = drag;
		position = Vector3.zero;
		velocity = Vector3.zero;
		this.min = min;
		this.max = max;
		this.iterations = iterations;
		this.simSpeed = simSpeed;
		this.distanceCoefficient = distanceCoefficient;
	}

	public void AddVelocity(Vector3 delta)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		velocity += delta;
	}

	public void Update()
	{
		//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_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_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: 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_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: 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_008c: 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_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
		float num = Vector3.Distance(position, Vector3.zero) * distanceCoefficient;
		float num2 = Time.deltaTime / (float)iterations * simSpeed * (num + 1f);
		for (int i = 0; i < iterations; i++)
		{
			velocity -= (position * spring + velocity * drag) * num2;
			position = Vector3.Min(Vector3.Max(position + velocity * num2, min), max);
		}
		control -= Time.deltaTime;
		control = ((control < 0f) ? 0f : control);
	}
}
public static class TextureUtilities
{
	public static Texture3D CreateFogLUT3DFrom2DSlices(Texture2D tex, Vector3Int dimensions)
	{
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Expected O, but got Unknown
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		Texture2D readableTexture = GetReadableTexture(tex);
		Color[] array = (Color[])(object)new Color[((Vector3Int)(ref dimensions)).x * ((Vector3Int)(ref dimensions)).y * ((Vector3Int)(ref dimensions)).z];
		int num = 0;
		for (int i = 0; i < ((Vector3Int)(ref dimensions)).z; i++)
		{
			for (int j = 0; j < ((Vector3Int)(ref dimensions)).y; j++)
			{
				int num2 = 0;
				while (num2 < ((Vector3Int)(ref dimensions)).x)
				{
					array[num] = readableTexture.GetPixel(num2 + i * ((Vector3Int)(ref dimensions)).z, j);
					num2++;
					num++;
				}
			}
		}
		Texture3D val = new Texture3D(((Vector3Int)(ref dimensions)).x, ((Vector3Int)(ref dimensions)).y, ((Vector3Int)(ref dimensions)).z, (TextureFormat)17, true);
		val.SetPixels(array);
		val.Apply();
		return val;
	}

	private static Texture2D GetReadableTexture(Texture2D texture)
	{
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Expected O, but got Unknown
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		RenderTexture temporary = RenderTexture.GetTemporary(((Texture)texture).width, ((Texture)texture).height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)1);
		Graphics.Blit((Texture)(object)texture, temporary);
		RenderTexture active = RenderTexture.active;
		RenderTexture.active = temporary;
		Texture2D val = new Texture2D(((Texture)texture).width, ((Texture)texture).height);
		val.ReadPixels(new Rect(0f, 0f, (float)((Texture)temporary).width, (float)((Texture)temporary).height), 0, 0);
		val.Apply();
		RenderTexture.active = active;
		RenderTexture.ReleaseTemporary(temporary);
		return val;
	}

	public static RenderTexture CreateFogLUT3DFrom2DSlicesCompute(Texture2D fogTexture, Vector3Int dimensions, ComputeShader shader)
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Expected O, but got Unknown
		int num = shader.FindKernel("Create3DLUTFrom2D");
		RenderTexture val = new RenderTexture(((Vector3Int)(ref dimensions)).x, ((Vector3Int)(ref dimensions)).y, 0, (RenderTextureFormat)0, (RenderTextureReadWrite)1)
		{
			volumeDepth = ((Vector3Int)(ref dimensions)).z,
			dimension = (TextureDimension)3,
			enableRandomWrite = true,
			name = "FogLUT3DFrom2D"
		};
		val.Create();
		shader.SetTexture(num, "_FogLUT3DFrom2D", (Texture)(object)val);
		shader.SetTexture(num, "_FogTexture2D", (Texture)(object)fogTexture);
		shader.Dispatch(num, ((Vector3Int)(ref dimensions)).x, ((Vector3Int)(ref dimensions)).y, ((Vector3Int)(ref dimensions)).z);
		return val;
	}

	public static RenderTexture CreateFogLUT3DFromSimplexNoise(Vector3Int dimensions, ComputeShader shader)
	{
		//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_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Expected O, but got Unknown
		int num = shader.FindKernel("Create3DLUTSimplexNoise");
		RenderTexture val = new RenderTexture(((Vector3Int)(ref dimensions)).x, ((Vector3Int)(ref dimensions)).y, 0, (RenderTextureFormat)24, (RenderTextureReadWrite)1)
		{
			volumeDepth = ((Vector3Int)(ref dimensions)).z,
			dimension = (TextureDimension)3,
			enableRandomWrite = true,
			name = "FogLUT3DSnoise"
		};
		val.Create();
		shader.SetTexture(num, "_FogLUT3DSNoise", (Texture)(object)val);
		shader.Dispatch(num, ((Vector3Int)(ref dimensions)).x, ((Vector3Int)(ref dimensions)).y, ((Vector3Int)(ref dimensions)).z);
		return val;
	}
}
public struct TimedActionPlus
{
	public float lifetime;

	public float end;

	private bool unscaledTime;

	private bool lied;

	public TimedActionPlus(float lifetime, bool unscaledTime = false)
	{
		this.lifetime = lifetime;
		end = 0f;
		lied = true;
		this.unscaledTime = unscaledTime;
	}

	public void Start()
	{
		end = GetTime() + lifetime;
		lied = false;
	}

	public void StartLifetime(float lifetime)
	{
		this.lifetime = lifetime;
		Start();
	}

	public void Stop()
	{
		end = 0f;
		lied = true;
	}

	public float Remaining()
	{
		return end - GetTime();
	}

	public float Elapsed()
	{
		return lifetime - Remaining();
	}

	public float Ratio()
	{
		return Mathf.Clamp01(1f - (end - GetTime()) / lifetime);
	}

	public bool TrueDone()
	{
		return end <= GetTime();
	}

	private float GetTime()
	{
		if (!unscaledTime)
		{
			return Time.time;
		}
		return Time.unscaledTime;
	}

	public bool Done()
	{
		if (!TrueDone())
		{
			return false;
		}
		if (!lied)
		{
			lied = true;
			return false;
		}
		return true;
	}
}
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class VolumetricFog : MonoBehaviour
{
	private const RenderTextureFormat FormatFogrendertexture = 2;

	[Expandable]
	public VolumetricFogOptions fogOptions;

	[Header("Required assets")]
	public Shader calculateFogShader;

	public Shader applyBlurShader;

	public Shader applyFogShader;

	public ComputeShader create3DLutShader;

	public List<Light> fogLightCasters = new List<Light>();

	public Texture2D fogTexture2D;

	public Texture2D blueNoiseTexture2D;

	[Header("Will be found automatically on startup")]
	public Light sunLight;

	private Material _applyBlurMaterial;

	private Material _calculateFogMaterial;

	private Material _applyFogMaterial;

	private float _kFactor;

	private Texture3D _fogTexture3D;

	private RenderTexture _fogTexture3DCompute;

	private RenderTexture _fogTexture3DSimplex;

	private Benchmark _benchmark;

	private MoveSun _moveSun;

	private Camera _currentCamera;

	private CommandBuffer _afterShadowPass;

	private static readonly int BlueNoiseTexture = Shader.PropertyToID("_BlueNoiseTexture");

	private static readonly int FogSpeed = Shader.PropertyToID("_FogSpeed");

	private static readonly int FogDirection = Shader.PropertyToID("_FogDirection");

	private static readonly int AmbientFog = Shader.PropertyToID("_AmbientFog");

	private static readonly int LightDir = Shader.PropertyToID("_LightDir");

	private static readonly int FogColor = Shader.PropertyToID("_FogColor");

	private static readonly int ShadowColor = Shader.PropertyToID("_ShadowColor");

	private static readonly int LightColor = Shader.PropertyToID("LightColor");

	private static readonly int LightIntensity = Shader.PropertyToID("_LightIntensity");

	private static readonly int FogSize = Shader.PropertyToID("_FogSize");

	private static readonly int FogWorldPosition = Shader.PropertyToID("_FogWorldPosition");

	private static readonly int HeightDensityCoef = Shader.PropertyToID("_HeightDensityCoef");

	private static readonly int BaseHeightDensity = Shader.PropertyToID("_BaseHeightDensity");

	private static readonly int Anisotropy = Shader.PropertyToID("_Anisotropy");

	private static readonly int ExtinctionCoef = Shader.PropertyToID("_ExtinctionCoef");

	private static readonly int NoiseScale = Shader.PropertyToID("_NoiseScale");

	private static readonly int FogDensity = Shader.PropertyToID("_FogDensity");

	private static readonly int RaymarchSteps = Shader.PropertyToID("_RaymarchSteps");

	private static readonly int RayleighScatteringCoef = Shader.PropertyToID("_RayleighScatteringCoef");

	private static readonly int BlurDepthFalloff = Shader.PropertyToID("_BlurDepthFalloff");

	private static readonly int Offsets = Shader.PropertyToID("_BlurOffsets");

	private static readonly int BlurWeights = Shader.PropertyToID("_BlurWeights");

	private static readonly int BlurDir = Shader.PropertyToID("BlurDir");

	private static readonly int FogRendertargetLinear = Shader.PropertyToID("FogRendertargetLinear");

	private static readonly int MieScatteringCoef = Shader.PropertyToID("_MieScatteringCoef");

	private static readonly int KFactor = Shader.PropertyToID("_kFactor");

	private static readonly int NoiseTexture = Shader.PropertyToID("_NoiseTexture");

	private static readonly int NoiseTex3D = Shader.PropertyToID("_NoiseTex3D");

	private static readonly int InverseProjectionMatrix = Shader.PropertyToID("InverseProjectionMatrix");

	private static readonly int InverseViewMatrix = Shader.PropertyToID("InverseViewMatrix");

	public Material ApplyFogMaterial
	{
		get
		{
			//IL_0028: 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_003b: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)_applyFogMaterial) && Object.op_Implicit((Object)(object)applyFogShader))
			{
				_applyFogMaterial = new Material(applyFogShader)
				{
					hideFlags = (HideFlags)61
				};
			}
			return _applyFogMaterial;
		}
	}

	public Material ApplyBlurMaterial
	{
		get
		{
			//IL_0028: 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_003b: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)_applyBlurMaterial) && Object.op_Implicit((Object)(object)applyBlurShader))
			{
				_applyBlurMaterial = new Material(applyBlurShader)
				{
					hideFlags = (HideFlags)61
				};
			}
			return _applyBlurMaterial;
		}
	}

	public Material CalculateFogMaterial
	{
		get
		{
			//IL_0028: 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_003b: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)_calculateFogMaterial) && Object.op_Implicit((Object)(object)calculateFogShader))
			{
				_calculateFogMaterial = new Material(calculateFogShader)
				{
					hideFlags = (HideFlags)61
				};
			}
			return _calculateFogMaterial;
		}
	}

	public Camera CurrentCamera
	{
		get
		{
			if (!Object.op_Implicit((Object)(object)_currentCamera))
			{
				_currentCamera = ((Component)this).GetComponent<Camera>();
			}
			return _currentCamera;
		}
	}

	private void OnEnable()
	{
		sunLight = ((IEnumerable<Light>)Object.FindObjectsOfType<Light>()).FirstOrDefault((Func<Light, bool>)((Light l) => (int)l.type == 1));
		if (!Object.op_Implicit((Object)(object)sunLight))
		{
			sunLight = Object.FindObjectOfType<Light>();
		}
		_moveSun = ((Component)sunLight).GetComponent<MoveSun>() ?? ((Component)sunLight).gameObject.AddComponent<MoveSun>();
		_moveSun.moveSpeed = 0f;
		if (!fogLightCasters.Contains(sunLight))
		{
			fogLightCasters.Add(sunLight);
		}
	}

	private void Start()
	{
		_benchmark = Object.FindObjectOfType<Benchmark>();
		fogLightCasters.ForEach(AddLightCommandBuffer);
		Regenerate3DTexture();
	}

	public void Regenerate3DTexture()
	{
		//IL_0096: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
		if (fogOptions.noiseSource.HasFlag(NoiseSource.SimplexNoiseCompute) || fogOptions.noiseSource.HasFlag(NoiseSource.Texture3DCompute) || fogOptions.noiseSource.HasFlag(NoiseSource.Texture3D))
		{
			switch (fogOptions.noiseSource)
			{
			case NoiseSource.Texture3D:
				_fogTexture3D = TextureUtilities.CreateFogLUT3DFrom2DSlices(fogTexture2D, fogOptions.noiseTexture3DDimensions);
				break;
			case NoiseSource.Texture3DCompute:
				_fogTexture3DCompute = TextureUtilities.CreateFogLUT3DFrom2DSlicesCompute(fogTexture2D, fogOptions.noiseTexture3DDimensions, create3DLutShader);
				break;
			case NoiseSource.SimplexNoiseCompute:
				_fogTexture3DSimplex = TextureUtilities.CreateFogLUT3DFromSimplexNoise(fogOptions.noiseTexture3DDimensions, create3DLutShader);
				break;
			}
		}
	}

	private void CalculateKFactor()
	{
		_kFactor = 1.55f * fogOptions.anisotropy - 0.55f * Mathf.Pow(fogOptions.anisotropy, 3f);
	}

	private void OnDestroy()
	{
		fogLightCasters.ForEach(RemoveLightCommandBuffer);
	}

	private void RemoveLightCommandBuffer(Light lightComponent)
	{
		if (_afterShadowPass != null && Object.op_Implicit((Object)(object)lightComponent))
		{
			lightComponent.RemoveCommandBuffer((LightEvent)1, _afterShadowPass);
		}
	}

	private void AddLightCommandBuffer(Light lightComponent)
	{
		//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_0018: Expected O, but got Unknown
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		_afterShadowPass = new CommandBuffer
		{
			name = "Volumetric Fog ShadowMap"
		};
		_afterShadowPass.SetGlobalTexture("ShadowMap", new RenderTargetIdentifier((BuiltinRenderTextureType)1));
		if (Object.op_Implicit((Object)(object)lightComponent))
		{
			lightComponent.AddCommandBuffer((LightEvent)1, _afterShadowPass);
		}
	}

	private bool HasRequiredAssets()
	{
		return Object.op_Implicit((Object)(object)fogTexture2D) && Object.op_Implicit((Object)(object)ApplyFogMaterial) && Object.op_Implicit((Object)(object)applyFogShader) && Object.op_Implicit((Object)(object)CalculateFogMaterial) && Object.op_Implicit((Object)(object)calculateFogShader) && Object.op_Implicit((Object)(object)ApplyBlurMaterial) && Object.op_Implicit((Object)(object)applyBlurShader);
	}

	[ImageEffectOpaque]
	private void OnRenderImage(RenderTexture source, RenderTexture destination)
	{
		//IL_0181: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_019c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: 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_00e0: Unknown result type (might be due to invalid IL or missing references)
		if (!HasRequiredAssets())
		{
			Graphics.Blit((Texture)(object)source, destination);
			return;
		}
		if (fogOptions.shadowsEnabled)
		{
			Shader.EnableKeyword("SHADOWS_ON");
			Shader.DisableKeyword("SHADOWS_OFF");
		}
		else
		{
			Shader.DisableKeyword("SHADOWS_ON");
			Shader.EnableKeyword("SHADOWS_OFF");
		}
		if (Object.op_Implicit((Object)(object)sunLight))
		{
			sunLight.intensity = fogOptions.lightIntensity;
			if (fogOptions.sunShouldMove)
			{
				_moveSun.shouldMove = true;
				_moveSun.moveSpeed = fogOptions.moveSpeed;
				VolumetricFogOptions volumetricFogOptions = fogOptions;
				Quaternion rotation = ((Component)sunLight).transform.rotation;
				volumetricFogOptions.sunAngle = ((Quaternion)(ref rotation)).eulerAngles;
			}
			else
			{
				_moveSun.shouldMove = false;
				((Component)sunLight).transform.rotation = Quaternion.Euler(fogOptions.sunAngle);
			}
		}
		int num = ((Texture)source).width >> fogOptions.renderTextureResDivision;
		int num2 = ((Texture)source).height >> fogOptions.renderTextureResDivision;
		RenderTexture temporary = RenderTexture.GetTemporary(num, num2, 0, (RenderTextureFormat)2);
		RenderTexture temporary2 = RenderTexture.GetTemporary(num, num2, 0, (RenderTextureFormat)2);
		((Texture)temporary).filterMode = (FilterMode)1;
		((Texture)temporary2).filterMode = (FilterMode)1;
		SetMieScattering();
		SetNoiseSource();
		Shader.SetGlobalMatrix(InverseViewMatrix, CurrentCamera.cameraToWorldMatrix);
		int inverseProjectionMatrix = InverseProjectionMatrix;
		Matrix4x4 projectionMatrix = CurrentCamera.projectionMatrix;
		Shader.SetGlobalMatrix(inverseProjectionMatrix, ((Matrix4x4)(ref projectionMatrix)).inverse);
		RenderFog(temporary, source);
		BlurFog(temporary, temporary2);
		BlendWithScene(source, destination, temporary);
		RenderTexture.ReleaseTemporary(temporary);
		RenderTexture.ReleaseTemporary(temporary2);
	}

	private void RenderFog(RenderTexture fogRenderTexture, RenderTexture source)
	{
		//IL_0175: 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_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_0220: Unknown result type (might be due to invalid IL or missing references)
		//IL_0213: Unknown result type (might be due to invalid IL or missing references)
		//IL_0241: Unknown result type (might be due to invalid IL or missing references)
		//IL_0246: Unknown result type (might be due to invalid IL or missing references)
		//IL_027e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0283: Unknown result type (might be due to invalid IL or missing references)
		if (fogOptions.useRayleighScattering)
		{
			CalculateFogMaterial.EnableKeyword("RAYLEIGH_SCATTERING");
			CalculateFogMaterial.SetFloat(RayleighScatteringCoef, fogOptions.rayleighScatteringCoef);
		}
		else
		{
			CalculateFogMaterial.DisableKeyword("RAYLEIGH_SCATTERING");
		}
		ToggleShaderKeyword(CalculateFogMaterial, "LIMITFOGSIZE", fogOptions.limitFogInSize);
		ToggleShaderKeyword(CalculateFogMaterial, "HEIGHTFOG", fogOptions.heightFogEnabled);
		float num = CalculateRaymarchStepRatio();
		CalculateFogMaterial.SetFloat(RaymarchSteps, (float)fogOptions.rayMarchSteps * Mathf.Pow(num, 2f));
		CalculateFogMaterial.SetFloat(FogDensity, fogOptions.fogDensityCoef);
		CalculateFogMaterial.SetFloat(NoiseScale, fogOptions.noiseScale);
		CalculateFogMaterial.SetFloat(ExtinctionCoef, fogOptions.extinctionCoef);
		CalculateFogMaterial.SetFloat(Anisotropy, fogOptions.anisotropy);
		CalculateFogMaterial.SetFloat(BaseHeightDensity, fogOptions.baseHeightDensity);
		CalculateFogMaterial.SetFloat(HeightDensityCoef, fogOptions.heightDensityCoef);
		CalculateFogMaterial.SetVector(FogWorldPosition, Vector4.op_Implicit(fogOptions.fogWorldPosition));
		CalculateFogMaterial.SetFloat(FogSize, fogOptions.fogSize);
		CalculateFogMaterial.SetFloat(LightIntensity, fogOptions.lightIntensity);
		CalculateFogMaterial.SetColor(LightColor, sunLight.color);
		CalculateFogMaterial.SetColor(ShadowColor, fogOptions.fogInShadowColor);
		CalculateFogMaterial.SetColor(FogColor, fogOptions.useLightColorForFog ? sunLight.color : fogOptions.fogInLightColor);
		CalculateFogMaterial.SetVector(LightDir, Vector4.op_Implicit(((Component)sunLight).transform.forward));
		CalculateFogMaterial.SetFloat(AmbientFog, fogOptions.ambientFog);
		CalculateFogMaterial.SetVector(FogDirection, Vector4.op_Implicit(fogOptions.windDirection));
		CalculateFogMaterial.SetFloat(FogSpeed, fogOptions.speed);
		CalculateFogMaterial.SetTexture(BlueNoiseTexture, (Texture)(object)blueNoiseTexture2D);
		Graphics.Blit((Texture)(object)source, fogRenderTexture, CalculateFogMaterial);
	}

	private float CalculateRaymarchStepRatio()
	{
		if (!fogOptions.optimizeSettingsFps)
		{
			return 1f;
		}
		float num = 1f / _benchmark.TimeSpent;
		float num2 = 30f;
		switch (fogOptions.fpsTarget)
		{
		case FPSTarget.Max30:
			num2 = 30f;
			break;
		case FPSTarget.Max60:
			num2 = 60f;
			break;
		case FPSTarget.Max120:
			num2 = 120f;
			break;
		case FPSTarget.Unlimited:
			num2 = num;
			break;
		default:
			Debug.Log((object)"FPS Target not found");
			break;
		}
		return Mathf.Clamp01(num / num2);
	}

	private void BlurFog(RenderTexture fogTarget1, RenderTexture fogTarget2)
	{
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_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)
		if (fogOptions.blurEnabled)
		{
			ApplyBlurMaterial.SetFloat(BlurDepthFalloff, fogOptions.blurDepthFalloff);
			Vector4 val = default(Vector4);
			((Vector4)(ref val))..ctor(0f, fogOptions.blurOffsets.x, fogOptions.blurOffsets.y, fogOptions.blurOffsets.z);
			ApplyBlurMaterial.SetVector(Offsets, val);
			Vector4 val2 = default(Vector4);
			((Vector4)(ref val2))..ctor(fogOptions.blurWeights.x + fogOptions.blurWeights.y + fogOptions.blurWeights.z, fogOptions.blurWeights.x, fogOptions.blurWeights.y, fogOptions.blurWeights.z);
			ApplyBlurMaterial.SetVector(BlurWeights, val2);
			for (int i = 0; i < fogOptions.blurIterations; i++)
			{
				ApplyBlurMaterial.SetVector(BlurDir, Vector4.op_Implicit(new Vector2(0f, 1f)));
				Graphics.Blit((Texture)(object)fogTarget1, fogTarget2, ApplyBlurMaterial);
				ApplyBlurMaterial.SetVector(BlurDir, Vector4.op_Implicit(new Vector2(1f, 0f)));
				Graphics.Blit((Texture)(object)fogTarget2, fogTarget1, ApplyBlurMaterial);
			}
		}
	}

	private void BlendWithScene(RenderTexture source, RenderTexture destination, RenderTexture fogTarget)
	{
		if (!fogOptions.addSceneColor)
		{
			Graphics.Blit((Texture)(object)fogTarget, destination);
			return;
		}
		ApplyFogMaterial.SetTexture(FogRendertargetLinear, (Texture)(object)fogTarget);
		Graphics.Blit((Texture)(object)source, destination, ApplyFogMaterial);
	}

	private void SetMieScattering()
	{
		ToggleShaderKeyword(CalculateFogMaterial, "HG_SCATTERING", shouldEnable: false);
		ToggleShaderKeyword(CalculateFogMaterial, "CS_SCATTERING", shouldEnable: false);
		ToggleShaderKeyword(CalculateFogMaterial, "SCHLICK_HG_SCATTERING", shouldEnable: false);
		switch (fogOptions.mieScatteringApproximation)
		{
		case MieScatteringApproximation.HenyeyGreenstein:
			ToggleShaderKeyword(CalculateFogMaterial, "HG_SCATTERING", shouldEnable: true);
			CalculateFogMaterial.SetFloat(MieScatteringCoef, fogOptions.mieScatteringCoef);
			break;
		case MieScatteringApproximation.CornetteShanks:
			ToggleShaderKeyword(CalculateFogMaterial, "CS_SCATTERING", shouldEnable: true);
			CalculateFogMaterial.SetFloat(MieScatteringCoef, fogOptions.mieScatteringCoef);
			break;
		case MieScatteringApproximation.Schlick:
			CalculateKFactor();
			ToggleShaderKeyword(CalculateFogMaterial, "SCHLICK_HG_SCATTERING", shouldEnable: true);
			CalculateFogMaterial.SetFloat(KFactor, _kFactor);
			CalculateFogMaterial.SetFloat(MieScatteringCoef, fogOptions.mieScatteringCoef);
			break;
		case MieScatteringApproximation.Off:
			break;
		default:
			Debug.LogWarning((object)$"Mie scattering approximation {fogOptions.mieScatteringApproximation} is not handled by SetMieScattering()");
			break;
		}
	}

	private void SetNoiseSource()
	{
		ToggleShaderKeyword(CalculateFogMaterial, "SNOISE", shouldEnable: false);
		ToggleShaderKeyword(CalculateFogMaterial, "NOISE2D", shouldEnable: false);
		ToggleShaderKeyword(CalculateFogMaterial, "NOISE3D", shouldEnable: false);
		switch (fogOptions.noiseSource)
		{
		case NoiseSource.SimplexNoise:
			ToggleShaderKeyword(CalculateFogMaterial, "SNOISE", shouldEnable: true);
			break;
		case NoiseSource.Texture2D:
			CalculateFogMaterial.SetTexture(NoiseTexture, (Texture)(object)fogTexture2D);
			ToggleShaderKeyword(CalculateFogMaterial, "NOISE2D", shouldEnable: true);
			break;
		case NoiseSource.Texture3D:
			CalculateFogMaterial.SetTexture(NoiseTex3D, (Texture)(object)_fogTexture3D);
			ToggleShaderKeyword(CalculateFogMaterial, "NOISE3D", shouldEnable: true);
			break;
		case NoiseSource.SimplexNoiseCompute:
			CalculateFogMaterial.SetTexture(NoiseTex3D, (Texture)(object)_fogTexture3DSimplex);
			ToggleShaderKeyword(CalculateFogMaterial, "NOISE3D", shouldEnable: true);
			break;
		case NoiseSource.Texture3DCompute:
			CalculateFogMaterial.SetTexture(NoiseTex3D, (Texture)(object)_fogTexture3DCompute);
			ToggleShaderKeyword(CalculateFogMaterial, "NOISE3D", shouldEnable: true);
			break;
		}
	}

	private static void ToggleShaderKeyword(Material shaderMat, string keyword, bool shouldEnable)
	{
		if (shouldEnable)
		{
			shaderMat.EnableKeyword(keyword);
		}
		else
		{
			shaderMat.DisableKeyword(keyword);
		}
	}
}
[Serializable]
[CreateAssetMenu(fileName = "VolumetricFogOptions", menuName = "Volumetric Fog/Fog Options")]
public class VolumetricFogOptions : ScriptableObject
{
	[Header("Position and size(in m³)")]
	public bool limitFogInSize;

	public Vector3 fogWorldPosition;

	public float fogSize = 50f;

	[Header("Performance")]
	[Range(0f, 8f)]
	public int renderTextureResDivision;

	[Range(1f, 1024f)]
	public int rayMarchSteps = 350;

	public bool optimizeSettingsFps;

	public FPSTarget fpsTarget = FPSTarget.Max60;

	[Header("Physical coefficients")]
	public bool useRayleighScattering = true;

	[Range(-1f, 2f)]
	public float rayleighScatteringCoef = 0.003f;

	[Range(-1f, 2f)]
	public float mieScatteringCoef = 0.007f;

	public MieScatteringApproximation mieScatteringApproximation = MieScatteringApproximation.HenyeyGreenstein;

	[Range(0f, 100f)]
	public float fogDensityCoef = 12f;

	[Range(0f, 1f)]
	public float extinctionCoef = 0.01f;

	[Range(-1f, 1f)]
	public float anisotropy = -0.3f;

	[Range(0f, 1f)]
	public float heightDensityCoef = 0.2f;

	[Range(0f, 10000f)]
	public float baseHeightDensity = 6000f;

	[Header("Blur")]
	[Range(1f, 8f)]
	public int blurIterations = 4;

	[Range(0f, 2000f)]
	public float blurDepthFalloff = 100f;

	public Vector3 blurOffsets = new Vector3(1f, 2f, 3f);

	public Vector3 blurWeights = new Vector3(0.213f, 0.17f, 0.036f);

	[Header("Color")]
	public bool useLightColorForFog = true;

	public Color fogInShadowColor = Color32.op_Implicit(new Color32((byte)10, (byte)70, (byte)200, byte.MaxValue));

	public Color fogInLightColor = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)65, (byte)0, byte.MaxValue));

	[Range(0f, 1f)]
	public float ambientFog = 0.4f;

	[Header("Sun")]
	[Range(0f, 10f)]
	public float lightIntensity = 1f;

	public bool sunShouldMove;

	public Vector3 sunAngle = new Vector3(13f, 0f, 0f);

	[Range(-10f, 10f)]
	public float moveSpeed = 2f;

	[Header("Animation")]
	public Vector3 windDirection = Vector3.right;

	public float speed = 1f;

	[Header("Debug")]
	public NoiseSource noiseSource = NoiseSource.Texture3D;

	public bool addSceneColor = true;

	public bool blurEnabled = true;

	public bool shadowsEnabled = true;

	public bool heightFogEnabled;

	[Range(-100f, 100f)]
	public float noiseScale = 0.9f;

	public Vector3Int noiseTexture3DDimensions = new Vector3Int(64, 64, 86);
}
namespace Enum
{
	public enum FPSTarget
	{
		Max30,
		Max60,
		Max120,
		Unlimited
	}
	public enum MieScatteringApproximation
	{
		HenyeyGreenstein,
		CornetteShanks,
		Schlick,
		Off
	}
	public enum NoiseSource
	{
		Texture2D = 1,
		Texture3D = 2,
		Texture3DCompute = 4,
		SimplexNoise = 8,
		SimplexNoiseCompute = 0x10
	}
}
namespace personplus
{
	[BepInPlugin("com.personperhaps.ravenimpactfx", "ravenimpactfx", "1.2")]
	public class ravenimpactfx : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(PlayerFpParent), "ApplyWeaponSnap")]
		public class ApplyRecoilPatch
		{
			public static void Prefix(PlayerFpParent __instance, ref float magnitude, ref float duration, ref float frequency)
			{
				magnitude *= instance.weaponSnapMagnitudeMultiplier.Value;
				frequency *= instance.weaponSnapFrequencyMultiplier.Value;
				duration *= instance.weaponSnapDurationMultiplier.Value;
			}
		}

		[HarmonyPatch(typeof(FirstPersonControllerInput), "Update")]
		public class AutoJumpPatch
		{
			public static void Postfix(FirstPersonControllerInput __instance)
			{
				if (instance.autoJump.Value)
				{
					((Component)__instance).gameObject.GetComponent<FirstPersonController>().SetInput(0f - SteelInput.GetAxis((KeyBinds)0), SteelInput.GetAxis((KeyBinds)1), SteelInput.GetButton((KeyBinds)9), 0f - SteelInput.GetAxis((KeyBinds)18), SteelInput.GetAxis((KeyBinds)19));
				}
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "DeployParachute")]
		public class AutoJumpPatch2
		{
			public static void Postfix(FpsActorController __instance, bool __result)
			{
				if (instance.autoJump.Value && !SmoothMovementPatch2.wallRunning && SmoothMovementPatch2.wallJumpCooldown.Done() && SmoothMovementPatch2.leaveGroundCooldown.Done())
				{
					__result = SteelInput.GetButtonDown((KeyBinds)9) && SteelInput.GetButton((KeyBinds)6);
				}
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "Update")]
		public class SmoothCameraPatch
		{
			public static void Prefix(out float __state, FpsActorController __instance)
			{
				__state = __instance.fpParent.lean;
			}

			public static void Postfix(float __state, FpsActorController __instance)
			{
				if (instance.tacticalMovement.Value)
				{
					__instance.fpParent.lean = Mathf.Lerp(__state, ((ActorController)__instance).Lean() * 1.4f, Time.fixedDeltaTime * 5f);
				}
			}
		}

		[HarmonyPatch(typeof(Animator), "SetBool", new Type[]
		{
			typeof(int),
			typeof(bool)
		})]
		public class TuckPatch
		{
			public static bool Prefix(int id, bool value, Animator __instance)
			{
				if (instance.noKickTuck.Value)
				{
					if (id == Animator.StringToHash("tuck"))
					{
						return false;
					}
					return true;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Animator), "SetTrigger", new Type[] { typeof(string) })]
		public class TuckPatch2
		{
			public static bool Prefix(string name, Animator __instance)
			{
				if (name == "kick" && instance.noKickTuck.Value)
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "WantsToFire")]
		public class WantsToFirePatch
		{
			public static void Postfix(FpsActorController __instance, ref bool __result)
			{
				if (instance.gungho.Value)
				{
					__result = __instance.inputEnabled && !GameManager.gameOver && SteelInput.GetButton((KeyBinds)2) && !__instance.IsCursorFree();
				}
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "IsReloading")]
		public class ReloadCheckPatch
		{
			public static void Postfix(FpsActorController __instance, ref bool __result)
			{
				if (instance.gungho.Value)
				{
					__result = false;
				}
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "Reload")]
		public class ReloadPatch
		{
			public static void Postfix(FpsActorController __instance, ref bool __result)
			{
				if (instance.reloadDuringKick.Value)
				{
					__result = __instance.inputEnabled && SteelInput.GetButton((KeyBinds)5) && !__instance.IsCursorFree() && !GameManager.gameOver;
				}
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "IsSprinting")]
		public class IsSprintingPatch
		{
			public static void Postfix(FpsActorController __instance, ref bool __result)
			{
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				if (instance.noKickTuck.Value)
				{
					__result = (int)((ActorController)__instance).actor.stance == 0 && !((ActorController)__instance).Aiming() && ((ActorController)__instance).HoldingSprint() && !((ActorController)__instance).actor.IsSeated();
				}
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "ReceivedDamage")]
		public class ReceiveDamagePatch
		{
			public static bool Prefix(FpsActorController __instance, bool friendlyFire, float damage, float balanceDamage, Vector3 point, Vector3 direction, Vector3 force)
			{
				//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00be: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ce: 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_008e: 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)
				if (balanceDamage > 5f)
				{
					__instance.fpParent.ApplyScreenshake(balanceDamage / (6f * instance.damageScreenShakeReduction.Value), Mathf.CeilToInt(balanceDamage / (20f * instance.damageScreenShakeReduction.Value)));
				}
				if (damage > 5f)
				{
					__instance.fpParent.KickCamera(new Vector3(Random.Range(-5f, 5f), Random.Range(-10f, 10f), Random.Range(-5f, 5f)) / instance.damageScreenShakeReduction.Value);
				}
				Matrix4x4 worldToLocalMatrix = ((Component)__instance.GetActiveCamera()).transform.worldToLocalMatrix;
				Vector3 val = ((Matrix4x4)(ref worldToLocalMatrix)).MultiplyVector(-direction);
				float num = Mathf.Atan2(val.z, val.x) * 57.29578f - 90f;
				DamageUI.instance.ShowDamageIndicator(num, damage < 2f && balanceDamage > damage);
				return false;
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "UpdateGameplay")]
		public class StancePatch
		{
			private static float beforeCameraHeight = 1.5f;

			private static float beforeTargetCameraHeight = 1.5f;

			public static void Prefix(FpsActorController __instance)
			{
				if (instance.tacticalMovement.Value && !((ActorController)__instance).actor.IsSeated() && !((ActorController)__instance).actor.IsOnLadder())
				{
					beforeCameraHeight = (float)typeof(FpsActorController).GetField("cameraHeight", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
					beforeTargetCameraHeight = (float)typeof(FpsActorController).GetField("targetCameraHeight", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
				}
			}

			public static void Postfix(FpsActorController __instance)
			{
				//IL_008f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0095: Expected O, but got Unknown
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				if (instance.tacticalMovement.Value && !((ActorController)__instance).actor.IsSeated() && !((ActorController)__instance).actor.IsOnLadder())
				{
					float num = EasingFunction.EaseOutSine(beforeCameraHeight, beforeTargetCameraHeight, 4f * RealDelta());
					typeof(FpsActorController).GetField("cameraHeight", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(__instance, num);
					Transform val = (Transform)typeof(FpsActorController).GetField("fpCameraRoot", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
					val.localPosition = new Vector3(0f, num, 0f);
				}
			}
		}

		[HarmonyPatch(typeof(PlayerFpParent), "Awake")]
		public class FpSpringsPatch
		{
			public static void Postfix(PlayerFpParent __instance)
			{
				//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_002e: 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_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_0049: Expected O, but got Unknown
				//IL_0085: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0094: 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_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_00af: Expected O, but got Unknown
				Spring value = new Spring(instance.weaponPositionSpring.Value, instance.weaponPositionDrag.Value, -Vector3.one * 0.2f, Vector3.one * 0.2f, 8);
				typeof(PlayerFpParent).GetField("positionSpring", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(__instance, value);
				Spring value2 = new Spring(instance.weaponRotationSpring.Value, instance.weaponRotationDrag.Value, -Vector3.one * 15f, Vector3.one * 15f, 8);
				typeof(PlayerFpParent).GetField("rotationSpring", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(__instance, value2);
			}
		}

		[HarmonyPatch(typeof(PlayerFpParent), "FixedUpdate")]
		public class FovPatch
		{
			private static float beforeFovRatio = 1.5f;

			public static float swayAmount = 0f;

			public static void Prefix(PlayerFpParent __instance)
			{
				beforeFovRatio = (float)typeof(PlayerFpParent).GetField("fovRatio", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
			}

			public static void Postfix(PlayerFpParent __instance)
			{
				//IL_0140: Unknown result type (might be due to invalid IL or missing references)
				//IL_0145: 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_0159: 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_00a6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ad: Expected O, but got Unknown
				//IL_010f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0114: Unknown result type (might be due to invalid IL or missing references)
				float value = instance.aimSmoothing.Value;
				bool flag = (bool)typeof(PlayerFpParent).GetField("aiming", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
				float num = Mathf.Lerp(beforeFovRatio, flag ? 1f : 0f, RealDelta() * value);
				typeof(PlayerFpParent).GetField("fovRatio", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(__instance, num);
				FieldInfo field = typeof(PlayerFpParent).GetField("fpCameraRoot", BindingFlags.Instance | BindingFlags.NonPublic);
				if (field != null)
				{
					Camera val = (Camera)field.GetValue(__instance);
					if ((Object)(object)val != (Object)null)
					{
						float end = (float)typeof(PlayerFpParent).GetField("zoomFov", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
						float start = (float)typeof(PlayerFpParent).GetField("normalFov", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
						float num2 = EasingFunction.EaseInOutQuint(start, end, num);
						Vector3 kickLocalEuler = __instance.GetKickLocalEuler();
						val.fieldOfView = num2 + ((Vector3)(ref kickLocalEuler)).magnitude * 20f + GetSnap(__instance) * 20f;
					}
				}
				Transform shoulderParent = __instance.shoulderParent;
				shoulderParent.localEulerAngles += Vector3.back * CoolTiltingPatch.slideTilt * -20f;
			}
		}

		[HarmonyPatch(typeof(Weapon), "Equip")]
		public class EquipFix
		{
			public static void Postfix(Weapon __instance)
			{
				//IL_0078: 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_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: 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)
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				if (__instance.UserIsPlayer() && (Object)(object)__instance.arms != (Object)null)
				{
					CoolTiltingPatch.bones = __instance.arms.bones.ToDictionary((Transform x) => x, (Transform x) => new Tuple<Vector3, Vector3>(Vector3.zero, Vector3.zero));
					CoolTiltingPatch.ravenCoil.velocity = Vector3.zero;
					CoolTiltingPatch.ravenCoil.position = Vector3.zero;
					CoolTiltingPatch.shakeCoil.velocity = Vector3.zero;
					CoolTiltingPatch.shakeCoil.position = Vector3.zero;
				}
			}
		}

		[HarmonyPatch(typeof(PlayerFpParent), "LateUpdate")]
		public class CoolTiltingPatch
		{
			public static float swayAmount = 0f;

			public static SpringPlus ravenCoil = new SpringPlus(instance.cameraSpring.Value, instance.cameraDrag.Value, -Vector3.one * 20f, Vector3.one * 20f, 16, instance.cameraSimSpeed.Value, 0.5f);

			public static SpringPlus shakeCoil = new SpringPlus(70f, 7f, -Vector3.one * 20f, Vector3.one * 20f, 16, 1f, 0.5f);

			public static Vector3 averageDelta = Vector3.zero;

			public static Dictionary<Transform, Tuple<Vector3, Vector3>> bones = new Dictionary<Transform, Tuple<Vector3, Vector3>>();

			public static float lastSnap = 0f;

			public static Vector3 slideNoise;

			public static Vector3 lerpNoise;

			public static float slideTilt = 0f;

			public static float max = 50f;

			public static float wallTilt = 0f;

			public static Vector3 offsetPos = Vector3.zero;

			public static Vector3 origPos = Vector3.zero;

			public static TimedActionPlus vaultAction = new TimedActionPlus(0.4f);

			public static void Postfix(PlayerFpParent __instance)
			{
				//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_02bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_02eb: 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_032d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0332: Unknown result type (might be due to invalid IL or missing references)
				//IL_0333: Unknown result type (might be due to invalid IL or missing references)
				//IL_0338: 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_00b3: 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_00d6: 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_00f3: 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_00ff: Unknown result type (might be due to invalid IL or missing references)
				//IL_0103: Unknown result type (might be due to invalid IL or missing references)
				//IL_0108: Unknown result type (might be due to invalid IL or missing references)
				//IL_0112: 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_0130: Unknown result type (might be due to invalid IL or missing references)
				//IL_0135: Unknown result type (might be due to invalid IL or missing references)
				//IL_013a: Unknown result type (might be due to invalid IL or missing references)
				//IL_013b: Unknown result type (might be due to invalid IL or missing references)
				//IL_013e: 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_0154: 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_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_017c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0369: Unknown result type (might be due to invalid IL or missing references)
				//IL_036e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0371: Unknown result type (might be due to invalid IL or missing references)
				//IL_0376: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_03d7: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e1: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0467: Unknown result type (might be due to invalid IL or missing references)
				//IL_046c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0477: Unknown result type (might be due to invalid IL or missing references)
				//IL_0481: Unknown result type (might be due to invalid IL or missing references)
				//IL_0486: Unknown result type (might be due to invalid IL or missing references)
				//IL_048d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0497: Unknown result type (might be due to invalid IL or missing references)
				//IL_04ab: Unknown result type (might be due to invalid IL or missing references)
				//IL_04b0: 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_04df: 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_04ee: Unknown result type (might be due to invalid IL or missing references)
				//IL_04f8: Unknown result type (might be due to invalid IL or missing references)
				//IL_0502: Unknown result type (might be due to invalid IL or missing references)
				//IL_0516: Unknown result type (might be due to invalid IL or missing references)
				//IL_051b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0520: Unknown result type (might be due to invalid IL or missing references)
				//IL_052a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0534: Unknown result type (might be due to invalid IL or missing references)
				//IL_0539: Unknown result type (might be due to invalid IL or missing references)
				//IL_0543: Unknown result type (might be due to invalid IL or missing references)
				//IL_0548: Unknown result type (might be due to invalid IL or missing references)
				//IL_0552: Unknown result type (might be due to invalid IL or missing references)
				//IL_0557: Unknown result type (might be due to invalid IL or missing references)
				//IL_0568: Unknown result type (might be due to invalid IL or missing references)
				//IL_057f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0596: 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_022a: Expected O, but got Unknown
				//IL_05c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_05ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_05d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_05e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_05e7: 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_0249: Unknown result type (might be due to invalid IL or missing references)
				//IL_024d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0254: Unknown result type (might be due to invalid IL or missing references)
				//IL_087e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0883: Unknown result type (might be due to invalid IL or missing references)
				//IL_0888: Unknown result type (might be due to invalid IL or missing references)
				//IL_0848: Unknown result type (might be due to invalid IL or missing references)
				//IL_084d: Unknown result type (might be due to invalid IL or missing references)
				//IL_086b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0870: Unknown result type (might be due to invalid IL or missing references)
				//IL_063d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0642: Unknown result type (might be due to invalid IL or missing references)
				//IL_064c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0651: Unknown result type (might be due to invalid IL or missing references)
				//IL_0661: Unknown result type (might be due to invalid IL or missing references)
				//IL_0666: Unknown result type (might be due to invalid IL or missing references)
				//IL_066f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0674: Unknown result type (might be due to invalid IL or missing references)
				//IL_0678: Unknown result type (might be due to invalid IL or missing references)
				//IL_067d: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a2: Unknown result type (might be due to invalid IL or missing references)
				//IL_06ad: Unknown result type (might be due to invalid IL or missing references)
				//IL_06b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_06bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_06c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_06cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_06d2: Unknown result type (might be due to invalid IL or missing references)
				//IL_06d7: Unknown result type (might be due to invalid IL or missing references)
				//IL_06db: Unknown result type (might be due to invalid IL or missing references)
				//IL_06e5: Unknown result type (might be due to invalid IL or missing references)
				//IL_06ef: Unknown result type (might be due to invalid IL or missing references)
				//IL_06f4: Unknown result type (might be due to invalid IL or missing references)
				//IL_06fe: Unknown result type (might be due to invalid IL or missing references)
				//IL_0707: Unknown result type (might be due to invalid IL or missing references)
				//IL_070c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0710: Unknown result type (might be due to invalid IL or missing references)
				//IL_074d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0752: Unknown result type (might be due to invalid IL or missing references)
				//IL_0759: Unknown result type (might be due to invalid IL or missing references)
				//IL_075e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0763: Unknown result type (might be due to invalid IL or missing references)
				//IL_0767: Unknown result type (might be due to invalid IL or missing references)
				//IL_076c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0773: Unknown result type (might be due to invalid IL or missing references)
				//IL_0778: Unknown result type (might be due to invalid IL or missing references)
				//IL_077d: Unknown result type (might be due to invalid IL or missing references)
				//IL_077f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0783: Unknown result type (might be due to invalid IL or missing references)
				//IL_0788: Unknown result type (might be due to invalid IL or missing references)
				//IL_078d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0791: Unknown result type (might be due to invalid IL or missing references)
				//IL_0796: Unknown result type (might be due to invalid IL or missing references)
				//IL_07c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_07c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_07dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_07fb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0810: Unknown result type (might be due to invalid IL or missing references)
				//IL_0812: Unknown result type (might be due to invalid IL or missing references)
				//IL_0817: Unknown result type (might be due to invalid IL or missing references)
				//IL_082c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0836: Unknown result type (might be due to invalid IL or missing references)
				Vector3 val = Vector3.zero;
				if (!((Object)(object)((ActorController)FpsActorController.instance).actor != (Object)null) || GameManager.IsSpectating())
				{
					return;
				}
				if ((Object)(object)((ActorController)FpsActorController.instance).actor.activeWeapon != (Object)null && (Object)(object)((ActorController)FpsActorController.instance).actor.activeWeapon.arms != (Object)null)
				{
					Dictionary<Transform, Tuple<Vector3, Vector3>> dictionary = new Dictionary<Transform, Tuple<Vector3, Vector3>>();
					Quaternion localRotation;
					foreach (Transform key in bones.Keys)
					{
						_ = key.localPosition;
						if (false)
						{
							break;
						}
						Vector3 localPosition = key.localPosition;
						dictionary.Add(key, new Tuple<Vector3, Vector3>(bones[key].Item1, bones[key].Item2));
						Vector3 val2 = val;
						Vector3 item = bones[key].Item1;
						localRotation = key.localRotation;
						val = val2 + Vector3.ClampMagnitude((item - ((Quaternion)(ref localRotation)).eulerAngles) / 5f, max) * instance.cameraParkinsonsAdditiveAmount.Value;
						val += Vector3.ClampMagnitude(key.localPosition - bones[key].Item2, max) * instance.cameraParkinsonsAdditiveAmount.Value;
					}
					Dictionary<Transform, Tuple<Vector3, Vector3>> dictionary2 = ((ActorController)FpsActorController.instance).actor.activeWeapon.arms.bones.ToDictionary((Transform x) => x, delegate(Transform x)
					{
						//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_000f: Unknown result type (might be due to invalid IL or missing references)
						Quaternion localRotation2 = x.localRotation;
						return new Tuple<Vector3, Vector3>(((Quaternion)(ref localRotation2)).eulerAngles, x.localPosition);
					});
					foreach (Transform componentInChild in ((Component)((Component)((ActorController)FpsActorController.instance).actor.activeWeapon).transform).GetComponentInChildren<Transform>())
					{
						Transform val3 = componentInChild;
						if (!dictionary2.ContainsKey(val3))
						{
							localRotation = val3.localRotation;
							dictionary2.Add(val3, new Tuple<Vector3, Vector3>(((Quaternion)(ref localRotation)).eulerAngles, val3.localPosition));
						}
					}
					bones = dictionary2;
				}
				if (((Vector3)(ref averageDelta)).sqrMagnitude > 0.1f)
				{
					shakeCoil.AddVelocity(averageDelta);
				}
				else
				{
					averageDelta = Vector3.zero;
				}
				float num = ((((Vector3)(ref val)).magnitude < ((Vector3)(ref averageDelta)).magnitude) ? (Mathf.Pow(2f, Vector3.Distance(averageDelta, Vector3.zero) * -0.4f - 6f) * 400f + 1f) : 1f);
				float num2;
				Vector3 val4;
				if (!((double)((Vector3)(ref val)).magnitude > 0.2))
				{
					num2 = 1f;
				}
				else
				{
					val4 = averageDelta - val;
					num2 = Mathf.Log10(Mathf.Abs(((Vector3)(ref val4)).magnitude + 1f)) + 2.3f;
				}
				float num3 = num2;
				float num4 = RealDelta() * num3 * num / 4f;
				averageDelta = Vector3.Lerp(averageDelta, val, num4);
				ravenCoil.Update();
				shakeCoil.Update();
				swayAmount = Mathf.Lerp(swayAmount, SteelInput.GetAxis((KeyBinds)0), RealDelta() * 2f);
				((Component)__instance.weaponParent).transform.localEulerAngles = ((Component)__instance.weaponParent).transform.localEulerAngles + Vector3.back * (0f - swayAmount) * 6f;
				lastSnap = Mathf.Lerp(lastSnap, GetSnap(__instance), RealDelta() * 10f);
				slideTilt = Mathf.Lerp(slideTilt, (float)((!SmoothMovementPatch2.slidingAction.Done()) ? 1 : 0), RealDelta() * 3f);
				wallTilt = Mathf.Lerp(wallTilt, SmoothMovementPatch2.wallTilt, RealDelta() * 3f);
				__instance.fpCameraParent.localEulerAngles = __instance.fpCameraParent.localEulerAngles + Vector3.back * (0f - swayAmount) * 2f + __instance.GetSpringLocalEuler(true) / 2f * instance.cameraSwing.Value + new Vector3(lastSnap * -6f * instance.cameraSnap.Value, 0f, 0f) + ravenCoil.position + shakeCoil.position * 0.8f * instance.cameraParkinsons.Value + Vector3.back * slideTilt * -5f + wallTilt * Vector3.back * -20f;
				if (__instance.fpCameraParent.localEulerAngles.x == float.NaN || __instance.fpCameraParent.localEulerAngles.y == float.NaN || __instance.fpCameraParent.localEulerAngles.z == float.NaN)
				{
					Debug.Log((object)"SHITE");
				}
				Transform transform = ((Component)__instance.weaponParent).transform;
				transform.localEulerAngles += Vector3.back * slideTilt * -20f;
				FirstPersonController component = ((Component)FpsActorController.instance).GetComponent<FirstPersonController>();
				CharacterController component2 = ((Component)FpsActorController.instance).GetComponent<CharacterController>();
				if (instance.vaulting.Value)
				{
					if (vaultAction.Done())
					{
						Vector3 val5 = __instance.fpCameraParent.position - Vector3.up * 0.6f;
						Vector3 val6 = Extensions.ToGround(__instance.fpCameraParent.forward);
						Bounds bounds = ((Collider)component2).bounds;
						val4 = ((Bounds)(ref bounds)).size;
						RaycastHit val7 = default(RaycastHit);
						if (Physics.SphereCast(val5, 0.3f, val6, ref val7, ((Vector3)(ref val4)).magnitude / 4f, -12945153))
						{
							Vector3 val8 = ((RaycastHit)(ref val7)).point + __instance.fpCameraParent.forward * 0.3f;
							Vector3 val9 = Vector3.up * 1f;
							bounds = ((Collider)component2).bounds;
							Vector3 val10 = val8 + val9 * ((Bounds)(ref bounds)).size.y / 2f;
							Vector3 down = Vector3.down;
							bounds = ((Collider)component2).bounds;
							RaycastHit val11 = default(RaycastHit);
							if (Physics.SphereCast(val10, 0.1f, down, ref val11, ((Bounds)(ref bounds)).size.y * 5f, -12945153))
							{
								float num5 = component2.height / 2f - component2.radius;
								Vector3 val12 = component2.center - Vector3.up * num5;
								Vector3 val13 = component2.center + Vector3.up * num5;
								if (Physics.OverlapCapsule(val12 + ((RaycastHit)(ref val11)).point, val13 + ((RaycastHit)(ref val11)).point, component2.radius, -12945153).Length == 0)
								{
									Vector3 position = PlayerFpParent.instance.fpCameraParent.position;
									((Component)FpsActorController.instance.controller).transform.position = ((RaycastHit)(ref val11)).point;
									((Component)((ActorController)FpsActorController.instance).actor.animator).transform.localPosition = Vector3.zero;
									origPos = PlayerFpParent.instance.fpCameraParent.InverseTransformPoint(position);
									vaultAction.Start();
									PlayerFpParent.instance.KickCamera(Vector3.left * 8f);
								}
							}
						}
					}
					else
					{
						offsetPos = Vector3.Lerp(origPos, Vector3.zero, EasingFunction.EaseOutSine(0f, 1f, vaultAction.Ratio()));
					}
				}
				Transform fpCameraParent = __instance.fpCameraParent;
				fpCameraParent.localPosition += offsetPos;
			}

			public static Vector3 LerpWithoutClamp(Vector3 A, Vector3 B, float t)
			{
				//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)
				//IL_0004: 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_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				return A + (B - A) * t;
			}

			public static Dictionary<TKey, TValue> CloneDictionaryCloningValues<TKey, TValue>(Dictionary<TKey, TValue> original) where TValue : ICloneable
			{
				Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>(original.Count, original.Comparer);
				foreach (KeyValuePair<TKey, TValue> item in original)
				{
					dictionary.Add(item.Key, (TValue)item.Value.Clone());
				}
				return dictionary;
			}
		}

		[HarmonyPatch(typeof(Weapon), "ApplyRecoil")]
		public class BetterRecoilPatch
		{
			public static void Postfix(Weapon __instance)
			{
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0052: Unknown result type (might be due to invalid IL or missing references)
				//IL_0057: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				//IL_0071: 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_008c: 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_0098: Unknown result type (might be due to invalid IL or missing references)
				//IL_009e: Invalid comparison between Unknown and I4
				//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d7: 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_00a5: 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_00b6: Unknown result type (might be due to invalid IL or missing references)
				if (__instance.UserIsPlayer() || (!__instance.IsMountedWeapon() && !__instance.UserIsAI()))
				{
					float num = (__instance.configuration.auto ? 1.8f : 0.6f);
					Vector3 val = __instance.configuration.kickback * Vector3.back + Random.insideUnitSphere * __instance.configuration.randomKick * 1.4f * __instance.configuration.snapDuration * num;
					if ((int)__instance.user.stance == 2)
					{
						val *= __instance.configuration.kickbackProneMultiplier;
					}
					((Vector3)(ref val))..ctor(val.z, val.x, 0f - val.x);
					CoolTiltingPatch.ravenCoil.AddVelocity(val * 50f);
					CoolTiltingPatch.ravenCoil.distanceCoefficient = __instance.configuration.cooldown / 3f * instance.cameraRecoveryCoefficient.Value;
				}
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "OnJump")]
		public class OnJumpPatch
		{
			public static bool Prefix(FpsActorController __instance)
			{
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_0059: Unknown result type (might be due to invalid IL or missing references)
				//IL_005e: 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_006a: 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_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_0077: 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)
				if (((ActorController)__instance).actor.IsSeated())
				{
					return true;
				}
				Vector3 val = default(Vector3);
				((Vector3)(ref val))..ctor(0f, 0.2f * instance.jumpScreenShakeMultiplier.Value, 0f);
				if (((ActorController)__instance).IsSprinting())
				{
					Matrix4x4 worldToLocalMatrix = ((Component)__instance.fpCamera).transform.worldToLocalMatrix;
					Vector3 val2 = ((Matrix4x4)(ref worldToLocalMatrix)).MultiplyVector(((ActorController)__instance).Velocity());
					val -= Vector3.ClampMagnitude(val2, 1f);
				}
				__instance.fpParent.ApplyRecoil(val, true);
				SmoothMovementPatch2.wallJumpCooldown.StartLifetime(0.4f);
				return false;
			}
		}

		[HarmonyPatch(typeof(FpsActorController), "OnLand")]
		public class OnLandPatch
		{
			public static bool Prefix(FpsActorController __instance)
			{
				//IL_001e: 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_009e: Unknown result type (might be due to invalid IL or missing references)
				if (((ActorController)__instance).actor.IsSeated())
				{
					return false;
				}
				float num = Mathf.Clamp((0f - ((ActorController)__instance).actor.Velocity().y - 2f) * 0.3f, 0f, 2f) * instance.jumpScreenShakeMultiplier.Value;
				if (((ActorController)__instance).IsSprinting())
				{
					num *= 2f;
				}
				__instance.fpParent.ApplyRecoil(new Vector3(0f, (0f - num) * 0.3f, 0f), true);
				__instance.fpParent.KickCamera(new Vector3(num, 0f, 0f));
				return false;
			}
		}

		[HarmonyPatch(typeof(FirstPersonController), "GetInput")]
		public class SmoothMovementPatch
		{
			private static float beforeSpeed = 1f;

			public static void Postfix(FirstPersonController __instance, out float speed)
			{
				if (instance.tacticalMovement.Value)
				{
					float num = (float)typeof(FirstPersonController).GetField("m_SwamSpeed", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
					bool flag = (bool)typeof(FirstPersonController).GetField("m_IsWalking", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
					float walkSpeed = __instance.m_WalkSpeed;
					walkSpeed = ((!__instance.inWater) ? (flag ? __instance.m_WalkSpeed : __instance.m_RunSpeed) : num);
					speed = Mathf.Lerp(beforeSpeed, walkSpeed, RealDelta() * 5f);
					beforeSpeed = speed;
				}
				else
				{
					float num2 = (float)typeof(FirstPersonController).GetField("m_SwamSpeed", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
					bool flag2 = (bool)typeof(FirstPersonController).GetField("m_IsWalking", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
					if (__instance.inWater)
					{
						speed = num2;
					}
					else
					{
						speed = (flag2 ? __instance.m_WalkSpeed : __instance.m_RunSpeed);
					}
				}
			}
		}

		[HarmonyPatch(typeof(WPlayer), "MoveActor")]
		public class SmoothMovementPatch3
		{
			public static void Prefix(Vector3 delta)
			{
				MoveActorCalled = 1f;
			}
		}

		[HarmonyPatch(typeof(CharacterController), "Move")]
		public class SmoothMovementPatch2
		{
			private static Vector3 beforeSpeed = Vector3.zero;

			private static float playerSpeed = 0f;

			public static TimedActionPlus slidingAction = new TimedActionPlus(2f);

			public static TimedActionPlus wallrunningAction = new TimedActionPlus(5f);

			public static TimedActionPlus wallJumpCooldown = new TimedActionPlus(1f);

			public static TimedActionPlus leaveGroundCooldown = new TimedActionPlus(1f);

			public static Dictionary<Actor, TimedActionPlus> knockOverCooldown = new Dictionary<Actor, TimedActionPlus>();

			private static bool lastAction;

			public static float wallTilt = 0f;

			public static Vector3 slidingVector;

			public static bool wallRunning = false;

			public static bool lastWallRunning = false;

			public static Vector3 extraVelocity = Vector3.zero;

			public static float origGravity = 1.2f;

			public static bool beforeGrounded;

			public static float vaultSpeedMultiplier = 0.8f;

			public float extraSlidePower = 0f;

			public static void Prefix(CharacterController __instance, ref Vector3 motion)
			{
				//IL_03be: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0308: Unknown result type (might be due to invalid IL or missing references)
				//IL_030d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0210: Unknown result type (might be due to invalid IL or missing references)
				//IL_0215: 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_0462: Unknown result type (might be due to invalid IL or missing references)
				//IL_0472: Unknown result type (might be due to invalid IL or missing references)
				//IL_047c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0490: Unknown result type (might be due to invalid IL or missing references)
				//IL_049a: Unknown result type (might be due to invalid IL or missing references)
				//IL_049f: Unknown result type (might be due to invalid IL or missing references)
				//IL_04c1: 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_0420: Unknown result type (might be due to invalid IL or missing references)
				//IL_0425: Unknown result type (might be due to invalid IL or missing references)
				//IL_042a: Unknown result type (might be due to invalid IL or missing references)
				//IL_076b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0770: Unknown result type (might be due to invalid IL or missing references)
				//IL_0775: Unknown result type (might be due to invalid IL or missing references)
				//IL_077a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0646: Unknown result type (might be due to invalid IL or missing references)
				//IL_064c: Unknown result type (might be due to invalid IL or missing references)
				//IL_066a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0674: Unknown result type (might be due to invalid IL or missing references)
				//IL_0679: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a8