Decompiled source of AuroraBerserkir v1.0.4

plugins/Berserkir.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("Berserkir")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Berserkir")]
[assembly: AssemblyTitle("Berserkir")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace Berserkir
{
	[Serializable]
	public class BerserkData
	{
		private const string SaveKey = "Berserkir_v1";

		public float RageProgress;

		public int RageCheckpoint;

		public bool IsUnlocked;

		public int ZerkCharges;

		public float RageFloor => (float)RageCheckpoint * 20f;

		public int FilledSegments => Mathf.FloorToInt(RageProgress / 20f);

		public float CurrentSegmentFill => RageProgress % 20f / 20f;

		public string Serialize()
		{
			return JsonUtility.ToJson((object)this);
		}

		public static BerserkData Load(Player player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return new BerserkData();
			}
			if (player.m_customData.TryGetValue("Berserkir_v1", out var value))
			{
				try
				{
					BerserkData berserkData = JsonUtility.FromJson<BerserkData>(value);
					if (berserkData != null)
					{
						return berserkData;
					}
				}
				catch (Exception ex)
				{
					BerserkPlugin.Log.LogWarning((object)("[Berserkir] Failed to parse save data: " + ex.Message));
				}
			}
			return new BerserkData();
		}

		public void Save(Player player)
		{
			if (!((Object)(object)player == (Object)null))
			{
				player.m_customData["Berserkir_v1"] = Serialize();
			}
		}
	}
	public class BerserkHUD : MonoBehaviour
	{
		private BerserkData _data = new BerserkData();

		private Player? _trackedPlayer;

		private bool _isBerserking;

		private float _berserkTimer;

		private float _holdTimer;

		private float _lastCombatTime = -999f;

		private float _lastFatigueMsg = -999f;

		private bool _showInfoWindow;

		private float _flashAlpha;

		private float[] _circleFlashTimers = new float[5];

		private float _allCirclesFlash;

		private const float RagePerKill = 0.75f;

		private const float RageDrainRate = 0.083f;

		private const float CombatTimeout = 6f;

		private const float ChargeChance = 0.05f;

		private const float HoldThreshold = 1f;

		private const float AnchorX = 85f;

		private const float AnchorY = 998f;

		private int _zerkCirclesLeft;

		private float _zerkElapsed;

		public static float ShakeMag;

		private bool _zerkFadingOut;

		private float _zerkFadeTimer;

		private bool _stylesReady;

		private int _lastScreenH;

		private GUIStyle? _styleTitle;

		private GUIStyle? _styleBody;

		private GUIStyle? _styleCentered;

		private GUIStyle? _styleQE;

		private Texture2D? _texDark;

		private Texture2D? _texPink;

		private Texture2D? _texBorder;

		private Texture2D? _texSegEmpty;

		private Texture2D? _texCircleRing;

		private Texture2D? _texCircleFill;

		private Texture2D? _texCircleWhite;

		private Texture2D? _texFlash;

		private Sprite? _iconSprite;

		private bool _iconLoaded;

		public static BerserkHUD? Instance { get; private set; }

		public bool IsBerserking => _isBerserking;

		public static event Action? OnCircleFaded;

		private void Awake()
		{
			Instance = this;
		}

		private void OnDestroy()
		{
			if ((Object)(object)Instance == (Object)(object)this)
			{
				Instance = null;
			}
		}

		private void EnsurePlayer()
		{
			Player localPlayer = Player.m_localPlayer;
			if ((Object)(object)localPlayer == (Object)null)
			{
				_trackedPlayer = null;
			}
			else if (!((Object)(object)_trackedPlayer == (Object)(object)localPlayer))
			{
				_trackedPlayer = localPlayer;
				_data = BerserkData.Load(localPlayer);
			}
		}

		public void SaveData()
		{
			_data?.Save(_trackedPlayer);
		}

		public void AdminFill()
		{
			EnsurePlayer();
			if (!((Object)(object)_trackedPlayer == (Object)null))
			{
				_data.RageProgress = 100f;
				_data.RageCheckpoint = 5;
				_data.IsUnlocked = true;
				_data.ZerkCharges = 5;
				_data.Save(_trackedPlayer);
				_allCirclesFlash = 1f;
				SpawnGPEffect(_trackedPlayer);
			}
		}

		public static void TriggerShake(float mag)
		{
			ShakeMag = mag;
		}

		public void OnMonsterKilled(Character monster)
		{
			EnsurePlayer();
			if ((Object)(object)_trackedPlayer == (Object)null)
			{
				return;
			}
			_lastCombatTime = Time.time;
			if (!_data.IsUnlocked)
			{
				_data.RageProgress = Mathf.Min(100f, _data.RageProgress + 0.75f);
				int num = Mathf.FloorToInt(_data.RageProgress / 20f);
				if (num > _data.RageCheckpoint)
				{
					_data.RageCheckpoint = Mathf.Min(5, num);
				}
				if (_data.RageProgress >= 100f)
				{
					_data.IsUnlocked = true;
					_data.ZerkCharges = 5;
					_showInfoWindow = false;
					_allCirclesFlash = 1f;
					SpawnGPEffect(_trackedPlayer);
				}
			}
			else if (!_isBerserking && _data.ZerkCharges < 5 && Random.value < 0.05f)
			{
				_data.ZerkCharges++;
				_circleFlashTimers[_data.ZerkCharges - 1] = 0.6f;
				if (_data.ZerkCharges >= 5)
				{
					_allCirclesFlash = 1f;
					SpawnGPEffect(_trackedPlayer);
				}
			}
			_data.Save(_trackedPlayer);
		}

		private void SpawnGPEffect(Player player)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0029: 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)
			//IL_0056: Expected O, but got Unknown
			//IL_0070: 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 ((Object)(object)player == (Object)null)
			{
				return;
			}
			Vector3 position = ((Component)player).transform.position + Vector3.up * 0.5f;
			ZNetScene instance = ZNetScene.instance;
			GameObject val = ((instance != null) ? instance.GetPrefab("fx_GP_Player") : null);
			if (!((Object)(object)val == (Object)null))
			{
				GameObject val2 = new GameObject("_gpHolder");
				val2.SetActive(false);
				GameObject val3 = Object.Instantiate<GameObject>(val, val2.transform);
				val3.transform.position = position;
				val3.transform.rotation = Quaternion.identity;
				ZNetView[] componentsInChildren = val3.GetComponentsInChildren<ZNetView>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					Object.DestroyImmediate((Object)(object)componentsInChildren[i]);
				}
				ZSyncTransform[] componentsInChildren2 = val3.GetComponentsInChildren<ZSyncTransform>(true);
				for (int i = 0; i < componentsInChildren2.Length; i++)
				{
					Object.DestroyImmediate((Object)(object)componentsInChildren2[i]);
				}
				ZSyncAnimation[] componentsInChildren3 = val3.GetComponentsInChildren<ZSyncAnimation>(true);
				for (int i = 0; i < componentsInChildren3.Length; i++)
				{
					Object.DestroyImmediate((Object)(object)componentsInChildren3[i]);
				}
				val3.transform.SetParent((Transform)null);
				Object.DestroyImmediate((Object)(object)val2);
				val3.SetActive(true);
				Object.Destroy((Object)(object)val3, 5f);
			}
		}

		private static void ShowMsg(string msg)
		{
			MessageHud instance = MessageHud.instance;
			if (instance != null)
			{
				instance.ShowMessage((MessageType)1, msg, 0, (Sprite)null, false);
			}
		}

		private void Update()
		{
			EnsurePlayer();
			if ((Object)(object)_trackedPlayer == (Object)null)
			{
				return;
			}
			TryLoadIcon();
			HandleRageDrain();
			HandleKeyInput();
			HandleBerserkCountdown();
			if (_flashAlpha > 0f)
			{
				_flashAlpha = Mathf.Max(0f, _flashAlpha - Time.deltaTime * 3f);
			}
			for (int i = 0; i < 5; i++)
			{
				if (_circleFlashTimers[i] > 0f)
				{
					_circleFlashTimers[i] = Mathf.Max(0f, _circleFlashTimers[i] - Time.deltaTime * 2.5f);
				}
			}
			if (_allCirclesFlash > 0f)
			{
				_allCirclesFlash = Mathf.Max(0f, _allCirclesFlash - Time.deltaTime * 1.8f);
			}
			if (_zerkFadingOut)
			{
				_zerkFadeTimer = Mathf.Max(0f, _zerkFadeTimer - Time.deltaTime);
				if (_zerkFadeTimer <= 0f)
				{
					_zerkFadingOut = false;
				}
			}
			if (ShakeMag > 0f)
			{
				ShakeMag = Mathf.Max(0f, ShakeMag - Time.deltaTime * 5f);
			}
		}

		private void TryLoadIcon()
		{
			if (!_iconLoaded && !((Object)(object)ObjectDB.instance == (Object)null))
			{
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("TrophyBjorn");
				ItemDrop val = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null);
				if (val != null && val.m_itemData?.m_shared?.m_icons?.Length > 0)
				{
					_iconSprite = val.m_itemData.m_shared.m_icons[0];
				}
				_iconLoaded = true;
			}
		}

		private void HandleRageDrain()
		{
			if (!_data.IsUnlocked && !_isBerserking && !(Time.time - _lastCombatTime < 6f))
			{
				float rageFloor = _data.RageFloor;
				if (_data.RageProgress > rageFloor)
				{
					_data.RageProgress = Mathf.Max(rageFloor, _data.RageProgress - 0.083f * Time.deltaTime);
				}
			}
		}

		private void HandleKeyInput()
		{
			bool key = Input.GetKey((KeyCode)113);
			bool key2 = Input.GetKey((KeyCode)101);
			if (!_data.IsUnlocked)
			{
				if (key && key2)
				{
					if (_holdTimer >= 0f)
					{
						_holdTimer += Time.deltaTime;
						if (_holdTimer >= 0.3f)
						{
							_showInfoWindow = !_showInfoWindow;
							_holdTimer = -9999f;
						}
					}
				}
				else
				{
					_holdTimer = 0f;
				}
			}
			else if (_isBerserking || _data.ZerkCharges < 5)
			{
				_holdTimer = 0f;
			}
			else if (SE_Fatigue.HasFatigue((Character?)(object)_trackedPlayer))
			{
				_holdTimer = 0f;
				if (key && key2 && Time.time - _lastFatigueMsg > 3f)
				{
					_lastFatigueMsg = Time.time;
					MessageHud instance = MessageHud.instance;
					if (instance != null)
					{
						instance.ShowMessage((MessageType)2, "<color=#888888>You are too exhausted to rage...</color>", 0, (Sprite)null, false);
					}
				}
			}
			else if (key && key2)
			{
				_holdTimer += Time.deltaTime;
				if (_holdTimer >= 1f)
				{
					ActivateBerserk();
					_holdTimer = 0f;
				}
			}
			else
			{
				_holdTimer = 0f;
			}
		}

		private void HandleBerserkCountdown()
		{
			if (!_isBerserking)
			{
				return;
			}
			_berserkTimer -= Time.deltaTime;
			_zerkElapsed += Time.deltaTime;
			int num = 5 - Mathf.FloorToInt(_zerkElapsed / 12f);
			num = Mathf.Clamp(num, 0, 5);
			if (num < _zerkCirclesLeft)
			{
				_zerkCirclesLeft = num;
				for (int i = 0; i < _zerkCirclesLeft; i++)
				{
					_circleFlashTimers[i] = 0.5f;
				}
				BerserkHUD.OnCircleFaded?.Invoke();
			}
			bool flag = ((Character)_trackedPlayer).GetSEMan().HaveStatusEffect(SE_Berserk.EffectHash);
			if (_berserkTimer <= 0f || !flag)
			{
				EndBerserk();
			}
		}

		private void ActivateBerserk()
		{
			_isBerserking = true;
			_berserkTimer = 60f;
			_zerkCirclesLeft = 5;
			_zerkElapsed = 0f;
			_data.ZerkCharges = 0;
			_data.Save(_trackedPlayer);
			_flashAlpha = 0.85f;
			_allCirclesFlash = 1f;
			ObjectDB instance = ObjectDB.instance;
			StatusEffect val = ((instance != null) ? instance.GetStatusEffect(SE_Berserk.EffectHash) : null);
			if ((Object)(object)val != (Object)null)
			{
				((Character)_trackedPlayer).GetSEMan().AddStatusEffect(val, true, 0, 0f);
			}
			else
			{
				BerserkPlugin.Log.LogError((object)"[Berserkir] SE_Berserk not found in ObjectDB!");
			}
		}

		private void EndBerserk()
		{
			_isBerserking = false;
			_zerkFadingOut = true;
			_zerkFadeTimer = 2.2f;
			if (((Character)_trackedPlayer).GetSEMan().HaveStatusEffect(SE_Berserk.EffectHash))
			{
				((Character)_trackedPlayer).GetSEMan().RemoveStatusEffect(SE_Berserk.EffectHash, false);
			}
		}

		private void OnGUI()
		{
			//IL_00ae: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_trackedPlayer == (Object)null))
			{
				if (!_stylesReady || Screen.height != _lastScreenH)
				{
					InitStyles();
				}
				float num = (float)Screen.height / 1080f;
				float num2 = 85f * num;
				float num3 = 998f * num;
				if (!_data.IsUnlocked)
				{
					DrawPreUnlock(num2, num3, num);
				}
				else
				{
					DrawPostUnlock(num2, num3, num);
				}
				if (_showInfoWindow && !_data.IsUnlocked)
				{
					DrawInfoWindow(num2, num3, num);
				}
				if (_flashAlpha > 0.001f)
				{
					GUI.color = new Color(1f, 0.35f, 0.05f, _flashAlpha * 0.55f);
					GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)_texFlash);
					GUI.color = Color.white;
				}
			}
		}

		private void DrawPreUnlock(float x, float y, float s)
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			float num = 54f * s;
			float num2 = 54f * s;
			float num3 = y - num2 * 0.5f;
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(x, num3, num, num2);
			if ((Object)(object)_iconSprite != (Object)null)
			{
				GUI.color = new Color(1f, 0.2f, 0.2f, 1f);
				DrawSprite(_iconSprite, val);
				GUI.color = Color.white;
			}
			else
			{
				GUI.Label(val, "<color=#CC2222><size=36>☠</size></color>", _styleCentered);
			}
			if (GUI.Button(val, GUIContent.none, GUIStyle.none))
			{
				_showInfoWindow = !_showInfoWindow;
			}
			GUI.Label(new Rect(x - 6f * s, num3 + num2 + 2f * s, num + 12f * s, 18f * s), "Q + E", _styleQE);
		}

		private void DrawPostUnlock(float x, float y, float s)
		{
			//IL_0075: 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_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			float num = 22f * s;
			float num2 = 4f * s;
			float num3 = 5f * num + 4f * num2;
			float num4 = y - num3;
			for (int i = 0; i < 5; i++)
			{
				float num5 = num4 + (float)i * (num + num2);
				bool flag = (_isBerserking ? (i < _zerkCirclesLeft) : (i < _data.ZerkCharges));
				float flash = Mathf.Max(_circleFlashTimers[i], _allCirclesFlash);
				DrawCircle(new Rect(x, num5, num, num), flag, flash, _isBerserking && flag);
			}
			if (!_isBerserking && _data.ZerkCharges >= 5)
			{
				float num6 = num4 + 5f * (num + num2) + 3f * s;
				GUI.Label(new Rect(x - 6f * s, num6, num + 12f * s, 18f * s), "Q + E", _styleQE);
			}
			if (!_isBerserking && _holdTimer > 0f && _data.ZerkCharges >= 5)
			{
				float num7 = Mathf.Clamp01(_holdTimer / 1f);
				float num8 = num4 + 5f * (num + num2) + 22f * s;
				GUI.color = new Color(0.06f, 0.03f, 0.03f, 0.85f);
				GUI.DrawTexture(new Rect(x, num8, num, 4f * s), (Texture)(object)_texDark);
				GUI.color = new Color(0.75f, 0.07f, 0.1f, 1f);
				GUI.DrawTexture(new Rect(x, num8, num * num7, 4f * s), (Texture)(object)_texPink);
				GUI.color = Color.white;
			}
		}

		private void DrawInfoWindow(float anchorX, float anchorY, float s)
		{
			//IL_0036: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			float num = 470f * s;
			float num2 = 360f * s;
			float num3 = anchorY - num2 - 70f * s;
			num3 = Mathf.Max(4f, num3);
			Rect r = default(Rect);
			((Rect)(ref r))..ctor(anchorX, num3, num, num2);
			DrawWoodPanel(r, border: true);
			float num4 = 16f * s;
			float num5 = ((Rect)(ref r)).x + num4;
			float num6 = ((Rect)(ref r)).y + num4;
			float num7 = num - num4 * 2f;
			if (GUI.Button(new Rect(((Rect)(ref r)).xMax - 28f * s, ((Rect)(ref r)).y + 6f * s, 22f * s, 20f * s), "✕", _styleBody))
			{
				_showInfoWindow = false;
			}
			GUI.Label(new Rect(num5, num6, num7, 38f * s), "Berserkir", _styleTitle);
			num6 += 44f * s;
			string text = "Fill rage by killing monsters. Once you kill enough monsters, the bar will fill.\n\nWind down — the bar will fade until the checkpoint mark.\n\nFill all 5 bars to unlock Berserkir mode.\n\nActivate by holding <color=#FFD400><b>Q + E</b></color> at the same time.";
			GUI.Label(new Rect(num5, num6, num7, 170f * s), text, _styleBody);
			num6 += 175f * s;
			DrawRageBar(num5, num6, num7, 28f * s, s);
		}

		private void DrawRageBar(float x, float y, float w, float h, float s)
		{
			//IL_0000: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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)
			GUI.color = Color.white;
			GUI.DrawTexture(new Rect(x, y, w, h), (Texture)(object)_texDark);
			float num = Mathf.Clamp01(_data.RageProgress / 100f) * w;
			if (num >= 1f)
			{
				GUI.DrawTexture(new Rect(x, y, num, h), (Texture)(object)_texPink);
			}
			float num2 = 3f * s;
			for (int i = 1; i <= 4; i++)
			{
				float num3 = x + w / 5f * (float)i - num2 * 0.5f;
				if (_data.RageCheckpoint >= i)
				{
					GUI.color = new Color(0.9f, 0.65f, 0.1f, 1f);
				}
				else
				{
					GUI.color = new Color(0.75f, 0.73f, 0.71f, 1f);
				}
				GUI.DrawTexture(new Rect(num3, y, num2, h), (Texture)(object)_texBorder);
			}
			float num4 = 2f * s;
			GUI.color = new Color(0.72f, 0.48f, 0.08f, 1f);
			GUI.DrawTexture(new Rect(x, y, w, num4), (Texture)(object)_texBorder);
			GUI.DrawTexture(new Rect(x, y + h - num4, w, num4), (Texture)(object)_texBorder);
			GUI.DrawTexture(new Rect(x, y, num4, h), (Texture)(object)_texBorder);
			GUI.DrawTexture(new Rect(x + w - num4, y, num4, h), (Texture)(object)_texBorder);
			GUI.color = Color.white;
		}

		private void DrawWoodPanel(Rect r, bool border = false)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			GUI.color = new Color(0.12f, 0.07f, 0.04f, 0.92f);
			GUI.DrawTexture(r, (Texture)(object)_texDark);
			GUI.color = Color.white;
			if (border)
			{
				float num = 2f;
				GUI.color = new Color(0.72f, 0.48f, 0.08f, 0.92f);
				GUI.DrawTexture(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).y, ((Rect)(ref r)).width, num), (Texture)(object)_texBorder);
				GUI.DrawTexture(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).yMax - num, ((Rect)(ref r)).width, num), (Texture)(object)_texBorder);
				GUI.DrawTexture(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).y, num, ((Rect)(ref r)).height), (Texture)(object)_texBorder);
				GUI.DrawTexture(new Rect(((Rect)(ref r)).xMax - num, ((Rect)(ref r)).y, num, ((Rect)(ref r)).height), (Texture)(object)_texBorder);
				GUI.color = Color.white;
			}
		}

		private void DrawCircle(Rect r, bool filled, float flash = 0f, bool zerkGlow = false)
		{
			//IL_003e: 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_006c: 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_009e: 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)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: 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_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			float num = ((Rect)(ref r)).width * 0.05f;
			Rect val = new Rect(((Rect)(ref r)).x + num, ((Rect)(ref r)).y + num, ((Rect)(ref r)).width - num * 2f, ((Rect)(ref r)).height - num * 2f);
			GUI.color = new Color(0.04f, 0.02f, 0.02f, 0.28f);
			GUI.DrawTexture(val, (Texture)(object)_texCircleFill);
			GUI.color = Color.white;
			GUI.color = new Color(0.72f, 0.48f, 0.08f, filled ? 1f : 0.4f);
			GUI.DrawTexture(r, (Texture)(object)_texCircleRing);
			GUI.color = Color.white;
			if (filled)
			{
				float num2 = ((Rect)(ref r)).width * 0.18f;
				Rect val2 = new Rect(((Rect)(ref r)).x + num2, ((Rect)(ref r)).y + num2, ((Rect)(ref r)).width - num2 * 2f, ((Rect)(ref r)).height - num2 * 2f);
				GUI.color = new Color(0.8f, 0.05f, 0.08f, 1f);
				GUI.DrawTexture(val2, (Texture)(object)_texCircleFill);
				GUI.color = Color.white;
				GUI.color = new Color(1f, 0.4f, 0.1f, 0.55f);
				GUI.DrawTexture(r, (Texture)(object)_texCircleRing);
				GUI.color = Color.white;
			}
			if (zerkGlow)
			{
				float num3 = 0.55f + Mathf.Sin(Time.time * 3.5f) * 0.2f;
				float num4 = ((Rect)(ref r)).width * 0.18f;
				Rect val3 = new Rect(((Rect)(ref r)).x - num4, ((Rect)(ref r)).y - num4, ((Rect)(ref r)).width + num4 * 2f, ((Rect)(ref r)).height + num4 * 2f);
				GUI.color = new Color(1f, 0.2f, 0.05f, num3);
				GUI.DrawTexture(val3, (Texture)(object)_texCircleWhite);
				GUI.color = Color.white;
			}
			if (flash > 0.01f)
			{
				float num5 = Mathf.Clamp01(flash) * 0.9f;
				float num6 = ((Rect)(ref r)).width * 0.25f * Mathf.Clamp01(flash);
				Rect val4 = new Rect(((Rect)(ref r)).x - num6, ((Rect)(ref r)).y - num6, ((Rect)(ref r)).width + num6 * 2f, ((Rect)(ref r)).height + num6 * 2f);
				GUI.color = new Color(1f, 0.95f, 0.8f, num5);
				GUI.DrawTexture(val4, (Texture)(object)_texCircleWhite);
				GUI.color = Color.white;
			}
		}

		private static void DrawSprite(Sprite sprite, Rect rect)
		{
			//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_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			Rect textureRect = sprite.textureRect;
			Texture2D texture = sprite.texture;
			GUI.DrawTextureWithTexCoords(rect, (Texture)(object)texture, new Rect(((Rect)(ref textureRect)).x / (float)((Texture)texture).width, ((Rect)(ref textureRect)).y / (float)((Texture)texture).height, ((Rect)(ref textureRect)).width / (float)((Texture)texture).width, ((Rect)(ref textureRect)).height / (float)((Texture)texture).height));
		}

		private void InitStyles()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Expected O, but got Unknown
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: 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_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Expected O, but got Unknown
			//IL_0281: Unknown result type (might be due to invalid IL or missing references)
			//IL_0286: Unknown result type (might be due to invalid IL or missing references)
			//IL_028e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bc: Expected O, but got Unknown
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0301: 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_030f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0324: Unknown result type (might be due to invalid IL or missing references)
			//IL_0333: Expected O, but got Unknown
			_lastScreenH = Screen.height;
			float num = (float)Screen.height / 1080f;
			_texDark = MakeSolid(new Color(0.12f, 0.07f, 0.04f, 1f));
			_texPink = MakeSolid(new Color(0.75f, 0.07f, 0.1f, 1f));
			_texBorder = MakeSolid(new Color(0.72f, 0.48f, 0.08f, 1f));
			_texSegEmpty = MakeSolid(new Color(0.72f, 0.7f, 0.68f, 1f));
			_texCircleRing = MakeCircle(64, filled: false, new Color(0.72f, 0.48f, 0.08f, 0.95f));
			_texCircleFill = MakeCircle(64, filled: true, new Color(0.85f, 0.08f, 0.22f, 1f));
			_texCircleWhite = MakeCircle(64, filled: true, Color.white);
			_texFlash = MakeSolid(new Color(0.7f, 0.05f, 0.05f, 1f));
			Font val = ((IEnumerable<Font>)Resources.FindObjectsOfTypeAll<Font>()).FirstOrDefault((Func<Font, bool>)((Font f) => ((Object)f).name.Equals("Norsebold", StringComparison.OrdinalIgnoreCase) || ((Object)f).name.Equals("Norse Bold", StringComparison.OrdinalIgnoreCase)));
			Color textColor = default(Color);
			((Color)(ref textColor))..ctor(0.83f, 0.53f, 0.16f);
			Color textColor2 = default(Color);
			((Color)(ref textColor2))..ctor(0.78f, 0.66f, 0.51f);
			Color textColor3 = default(Color);
			((Color)(ref textColor3))..ctor(0.91f, 0.75f, 0.25f);
			int fontSize = Mathf.RoundToInt(24f * num);
			int fontSize2 = Mathf.RoundToInt(17f * num);
			Mathf.RoundToInt(17f * num);
			GUIStyle val2 = new GUIStyle(GUI.skin.label)
			{
				fontSize = fontSize,
				fontStyle = (FontStyle)1,
				richText = true,
				wordWrap = false,
				alignment = (TextAnchor)3
			};
			val2.normal.textColor = textColor;
			_styleTitle = val2;
			if ((Object)(object)val != (Object)null)
			{
				_styleTitle.font = val;
			}
			GUIStyle val3 = new GUIStyle(GUI.skin.label)
			{
				fontSize = fontSize2,
				fontStyle = (FontStyle)0,
				richText = true,
				wordWrap = true,
				alignment = (TextAnchor)0
			};
			val3.normal.textColor = textColor2;
			_styleBody = val3;
			if ((Object)(object)val != (Object)null)
			{
				_styleBody.font = val;
			}
			GUIStyle val4 = new GUIStyle(GUI.skin.label)
			{
				fontSize = fontSize2,
				fontStyle = (FontStyle)1,
				richText = true,
				wordWrap = false,
				alignment = (TextAnchor)4
			};
			val4.normal.textColor = textColor3;
			_styleCentered = val4;
			if ((Object)(object)val != (Object)null)
			{
				_styleCentered.font = val;
			}
			GUIStyle val5 = new GUIStyle(GUI.skin.label)
			{
				fontSize = Mathf.RoundToInt(12f * num),
				fontStyle = (FontStyle)1,
				richText = true,
				wordWrap = false,
				alignment = (TextAnchor)4
			};
			val5.normal.textColor = new Color(1f, 0.85f, 0.1f);
			_styleQE = val5;
			_stylesReady = true;
		}

		private static Texture2D MakeSolid(Color c)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Expected O, but got Unknown
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(4, 4, (TextureFormat)4, false);
			Color[] array = (Color[])(object)new Color[16];
			for (int i = 0; i < 16; i++)
			{
				array[i] = c;
			}
			val.SetPixels(array);
			val.Apply();
			return val;
		}

		private static Texture2D MakeCircle(int size, bool filled, Color c)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Expected O, but got Unknown
			//IL_0083: 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)
			Texture2D val = new Texture2D(size, size, (TextureFormat)4, false);
			float num = (float)size * 0.5f;
			float num2 = num - 1.5f;
			float num3 = num2 - 6f;
			for (int i = 0; i < size; i++)
			{
				for (int j = 0; j < size; j++)
				{
					float num4 = (float)j - num + 0.5f;
					float num5 = (float)i - num + 0.5f;
					float num6 = Mathf.Sqrt(num4 * num4 + num5 * num5);
					bool flag = (filled ? (num6 <= num2) : (num6 <= num2 && num6 >= num3));
					val.SetPixel(j, i, flag ? c : Color.clear);
				}
			}
			val.Apply();
			return val;
		}
	}
	public static class BerserkParticle
	{
		private static Material? _mat;

		public static void SpawnHitSplash(Vector3 worldPos, Vector3 hitDir)
		{
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Expected O, but got Unknown
			//IL_023b: 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_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_033a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0353: 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_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: 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_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)ZNetScene.instance != (Object)null)
			{
				string[] array = new string[4] { "vfx_BloodHit", "vfx_BloodDeath", "fx_bloodweapon_hit", "fx_TickBloodHit" };
				foreach (string text in array)
				{
					GameObject prefab = ZNetScene.instance.GetPrefab(text);
					if ((Object)(object)prefab == (Object)null)
					{
						continue;
					}
					try
					{
						GameObject val = new GameObject("_bloodHolder");
						val.SetActive(false);
						Quaternion rotation = ((hitDir != Vector3.zero) ? Quaternion.LookRotation(hitDir) : Quaternion.identity);
						GameObject val2 = Object.Instantiate<GameObject>(prefab, val.transform);
						val2.transform.position = worldPos;
						val2.transform.rotation = rotation;
						ZNetView[] componentsInChildren = val2.GetComponentsInChildren<ZNetView>(true);
						for (int j = 0; j < componentsInChildren.Length; j++)
						{
							Object.DestroyImmediate((Object)(object)componentsInChildren[j]);
						}
						ZSyncTransform[] componentsInChildren2 = val2.GetComponentsInChildren<ZSyncTransform>(true);
						for (int j = 0; j < componentsInChildren2.Length; j++)
						{
							Object.DestroyImmediate((Object)(object)componentsInChildren2[j]);
						}
						val2.transform.SetParent((Transform)null);
						Object.DestroyImmediate((Object)(object)val);
						val2.SetActive(true);
						ParticleSystem[] componentsInChildren3 = val2.GetComponentsInChildren<ParticleSystem>(true);
						for (int j = 0; j < componentsInChildren3.Length; j++)
						{
							MainModule main = componentsInChildren3[j].main;
							MinMaxGradient startColor = ((MainModule)(ref main)).startColor;
							Color colorMin = ((MinMaxGradient)(ref startColor)).colorMin;
							startColor = ((MainModule)(ref main)).startColor;
							Color colorMax = ((MinMaxGradient)(ref startColor)).colorMax;
							((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(Mathf.Max(colorMin.r, 0.8f), colorMin.g * 0.15f, colorMin.b * 0.1f, colorMin.a), new Color(Mathf.Max(colorMax.r, 0.95f), colorMax.g * 0.2f, colorMax.b * 0.1f, colorMax.a));
						}
						Object.Destroy((Object)(object)val2, 1.5f);
						return;
					}
					catch
					{
					}
				}
			}
			EnsureMaterial();
			if (!((Object)(object)_mat == (Object)null))
			{
				GameObject val3 = new GameObject("BerkHit");
				val3.transform.position = worldPos;
				if (hitDir != Vector3.zero)
				{
					val3.transform.rotation = Quaternion.LookRotation(hitDir);
				}
				ParticleSystem ps = AddBurst(val3, new Color(1f, 0.05f, 0.18f, 0.9f), new Color(0.8f, 0f, 0.32f, 1f), 12, 3f, 6f, 0.07f, 0.2f, 0.2f, 0.4f, 100f, 2f);
				ParticleSystem ps2 = AddBurst(val3, new Color(1f, 0.35f, 0.55f, 0.85f), new Color(1f, 0.1f, 0.28f, 0.9f), 20, 4f, 9f, 0.02f, 0.08f, 0.12f, 0.26f, 130f, 1.4f);
				ParticleSystem ps3 = AddBurst(val3, new Color(0.9f, 0.08f, 0.22f, 0.4f), new Color(1f, 0.03f, 0.38f, 0.55f), 6, 0.6f, 1.8f, 0.18f, 0.42f, 0.28f, 0.55f, 360f, 0.08f);
				ApplyMaterial(ps, (ParticleSystemRenderMode)1, 0.15f, 1.5f);
				ApplyMaterial(ps2, (ParticleSystemRenderMode)1, 0.1f, 1.2f);
				ApplyMaterial(ps3, (ParticleSystemRenderMode)0);
				Object.Destroy((Object)(object)val3, 0.7f);
			}
		}

		private static ParticleSystem AddBurst(GameObject parent, Color col1, Color col2, int count, float speed, float maxSpeed, float size, float maxSize, float lifetime, float maxLifetime, float spread, float gravity)
		{
			//IL_0005: 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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: 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_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: 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_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Expected O, but got Unknown
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Expected O, but got Unknown
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("L");
			val.transform.SetParent(parent.transform, false);
			ParticleSystem val2 = val.AddComponent<ParticleSystem>();
			MainModule main = val2.main;
			((MainModule)(ref main)).loop = false;
			((MainModule)(ref main)).playOnAwake = true;
			((MainModule)(ref main)).duration = 0.05f;
			((MainModule)(ref main)).startLifetime = new MinMaxCurve(lifetime, maxLifetime);
			((MainModule)(ref main)).startSpeed = new MinMaxCurve(speed, maxSpeed);
			((MainModule)(ref main)).startSize = new MinMaxCurve(size, maxSize);
			((MainModule)(ref main)).startColor = new MinMaxGradient(col1, col2);
			((MainModule)(ref main)).gravityModifier = new MinMaxCurve(gravity);
			((MainModule)(ref main)).maxParticles = count + 4;
			((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1;
			EmissionModule emission = val2.emission;
			((EmissionModule)(ref emission)).enabled = true;
			((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(0f);
			((EmissionModule)(ref emission)).SetBurst(0, new Burst(0f, MinMaxCurve.op_Implicit((float)count)));
			ShapeModule shape = val2.shape;
			((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)4;
			((ShapeModule)(ref shape)).angle = spread * 0.5f;
			((ShapeModule)(ref shape)).radius = 0.04f;
			ColorOverLifetimeModule colorOverLifetime = val2.colorOverLifetime;
			((ColorOverLifetimeModule)(ref colorOverLifetime)).enabled = true;
			Gradient val3 = new Gradient();
			val3.SetKeys((GradientColorKey[])(object)new GradientColorKey[2]
			{
				new GradientColorKey(col1, 0f),
				new GradientColorKey(col2, 1f)
			}, (GradientAlphaKey[])(object)new GradientAlphaKey[2]
			{
				new GradientAlphaKey(1f, 0f),
				new GradientAlphaKey(0f, 1f)
			});
			((ColorOverLifetimeModule)(ref colorOverLifetime)).color = new MinMaxGradient(val3);
			SizeOverLifetimeModule sizeOverLifetime = val2.sizeOverLifetime;
			((SizeOverLifetimeModule)(ref sizeOverLifetime)).enabled = true;
			AnimationCurve val4 = new AnimationCurve();
			val4.AddKey(0f, 1f);
			val4.AddKey(1f, 0.08f);
			((SizeOverLifetimeModule)(ref sizeOverLifetime)).size = new MinMaxCurve(1f, val4);
			return val2;
		}

		private static void ApplyMaterial(ParticleSystem ps, ParticleSystemRenderMode mode, float vScale = 0f, float lScale = 1f)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Invalid comparison between Unknown and I4
			ParticleSystemRenderer component = ((Component)ps).GetComponent<ParticleSystemRenderer>();
			((Renderer)component).material = _mat;
			component.renderMode = mode;
			if ((int)mode == 1)
			{
				component.velocityScale = vScale;
				component.lengthScale = lScale;
			}
			((Renderer)component).sortingOrder = 5;
		}

		private static void EnsureMaterial()
		{
			//IL_003c: 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_0051: Expected O, but got Unknown
			//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_00b2: Expected O, but got Unknown
			if ((Object)(object)_mat != (Object)null)
			{
				return;
			}
			ParticleSystem[] array = Object.FindObjectsByType<ParticleSystem>((FindObjectsSortMode)0);
			for (int i = 0; i < array.Length; i++)
			{
				ParticleSystemRenderer component = ((Component)array[i]).GetComponent<ParticleSystemRenderer>();
				if (!((Object)(object)((component != null) ? ((Renderer)component).sharedMaterial : null) == (Object)null))
				{
					_mat = new Material(((Renderer)component).sharedMaterial)
					{
						name = "BerkHitMat"
					};
					return;
				}
			}
			string[] array2 = new string[4] { "Custom/Particle", "Particles/Standard Unlit", "Legacy Shaders/Particles/Additive", "Sprites/Default" };
			for (int i = 0; i < array2.Length; i++)
			{
				Shader val = Shader.Find(array2[i]);
				if (!((Object)(object)val == (Object)null))
				{
					_mat = new Material(val)
					{
						name = "BerkHitMat"
					};
					_mat.SetInt("_SrcBlend", 5);
					_mat.SetInt("_DstBlend", 1);
					_mat.SetInt("_ZWrite", 0);
					_mat.renderQueue = 3000;
					break;
				}
			}
		}
	}
	public class BerserkSwirl : MonoBehaviour
	{
		private ParticleSystem? _ring;

		private ParticleSystem? _halo;

		private ParticleSystem? _embers;

		private float _time;

		private Material? _mat;

		public static BerserkSwirl Attach(Character c)
		{
			//IL_0005: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("BerkAura");
			val.transform.SetParent(((Component)c).transform, false);
			val.transform.localPosition = Vector3.zero;
			BerserkSwirl berserkSwirl = val.AddComponent<BerserkSwirl>();
			berserkSwirl.Build();
			return berserkSwirl;
		}

		private void Build()
		{
			_mat = MakeGlowMat();
			_ring = MakeGroundRing(((Component)this).transform, _mat);
			_halo = MakeBodyHalo(((Component)this).transform, _mat);
			_embers = MakeEmbers(((Component)this).transform, _mat);
		}

		private void OnDestroy()
		{
			if ((Object)(object)_mat != (Object)null)
			{
				Object.Destroy((Object)(object)_mat);
			}
		}

		private void Update()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: 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)
			//IL_008f: 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_00a4: Unknown result type (might be due to invalid IL or missing references)
			_time += Time.deltaTime;
			if ((Object)(object)_halo != (Object)null)
			{
				EmissionModule emission = _halo.emission;
				((EmissionModule)(ref emission)).rateOverTime = new MinMaxCurve(8f + Mathf.Abs(Mathf.Sin(_time * 2.8f)) * 28f);
			}
			if ((Object)(object)_ring != (Object)null)
			{
				float num = Mathf.Pow(Mathf.Abs(Mathf.Sin(_time * 1.4f)), 3f);
				EmissionModule emission2 = _ring.emission;
				((EmissionModule)(ref emission2)).rateOverTime = new MinMaxCurve(3f + num * 35f);
			}
		}

		private static Material MakeGlowMat()
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			Shader val = Shader.Find("Particles/Additive");
			if ((Object)(object)val == (Object)null)
			{
				val = Shader.Find("Mobile/Particles/Additive");
			}
			if ((Object)(object)val == (Object)null)
			{
				val = Shader.Find("Legacy Shaders/Particles/Additive");
			}
			Material val2 = new Material(val ?? Shader.Find("Sprites/Default"));
			Texture2D val3 = new Texture2D(64, 64, (TextureFormat)4, false);
			float num = 32f;
			for (int i = 0; i < 64; i++)
			{
				for (int j = 0; j < 64; j++)
				{
					float num2 = ((float)j - num + 0.5f) / num;
					float num3 = ((float)i - num + 0.5f) / num;
					float num4 = Mathf.Sqrt(num2 * num2 + num3 * num3);
					float num5 = Mathf.Clamp01(1f - num4);
					num5 *= num5;
					val3.SetPixel(j, i, new Color(1f, 1f, 1f, num5));
				}
			}
			val3.Apply();
			((Texture)val3).wrapMode = (TextureWrapMode)1;
			val2.mainTexture = (Texture)(object)val3;
			if (val2.HasProperty("_TintColor"))
			{
				val2.SetColor("_TintColor", new Color(0.9f, 0.1f, 0f, 0.6f));
			}
			return val2;
		}

		private static ParticleSystem MakeGroundRing(Transform parent, Material mat)
		{
			//IL_0005: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: 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_005e: 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_008a: 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)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("AuraRing");
			val.transform.SetParent(parent, false);
			val.transform.localPosition = new Vector3(0f, 0.05f, 0f);
			ParticleSystem obj = val.AddComponent<ParticleSystem>();
			MainModule main = obj.main;
			((MainModule)(ref main)).loop = true;
			((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1;
			((MainModule)(ref main)).startLifetime = new MinMaxCurve(0.5f, 0.9f);
			((MainModule)(ref main)).startSpeed = new MinMaxCurve(1.5f, 3f);
			((MainModule)(ref main)).startSize = new MinMaxCurve(0.14f, 0.26f);
			((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(1f, 0.1f, 0f, 1f), new Color(0.8f, 0f, 0f, 0.8f));
			((MainModule)(ref main)).gravityModifier = MinMaxCurve.op_Implicit(0.3f);
			((MainModule)(ref main)).maxParticles = 250;
			((MainModule)(ref main)).stopAction = (ParticleSystemStopAction)0;
			EmissionModule emission = obj.emission;
			((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(10f);
			ShapeModule shape = obj.shape;
			((ShapeModule)(ref shape)).enabled = true;
			((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)10;
			((ShapeModule)(ref shape)).radius = 0.05f;
			((ShapeModule)(ref shape)).radiusThickness = 1f;
			((ShapeModule)(ref shape)).rotation = new Vector3(-90f, 0f, 0f);
			ApplyFade(obj, new Color(1f, 0.1f, 0f), new Color(0.4f, 0f, 0f));
			ParticleSystemRenderer component = ((Component)obj).GetComponent<ParticleSystemRenderer>();
			component.renderMode = (ParticleSystemRenderMode)0;
			((Renderer)component).sharedMaterial = mat;
			obj.Play();
			return obj;
		}

		private static ParticleSystem MakeBodyHalo(Transform parent, Material mat)
		{
			//IL_0005: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: 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_005e: 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_008a: 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)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("AuraHalo");
			val.transform.SetParent(parent, false);
			val.transform.localPosition = new Vector3(0f, 1f, 0f);
			ParticleSystem obj = val.AddComponent<ParticleSystem>();
			MainModule main = obj.main;
			((MainModule)(ref main)).loop = true;
			((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1;
			((MainModule)(ref main)).startLifetime = new MinMaxCurve(0.7f, 1.5f);
			((MainModule)(ref main)).startSpeed = new MinMaxCurve(0.5f, 1.4f);
			((MainModule)(ref main)).startSize = new MinMaxCurve(0.1f, 0.24f);
			((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(1f, 0.1f, 0f, 0.9f), new Color(0.8f, 0f, 0f, 0.7f));
			((MainModule)(ref main)).gravityModifier = MinMaxCurve.op_Implicit(-0.05f);
			((MainModule)(ref main)).maxParticles = 180;
			((MainModule)(ref main)).stopAction = (ParticleSystemStopAction)0;
			EmissionModule emission = obj.emission;
			((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(18f);
			ShapeModule shape = obj.shape;
			((ShapeModule)(ref shape)).enabled = true;
			((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)0;
			((ShapeModule)(ref shape)).radius = 0.65f;
			((ShapeModule)(ref shape)).radiusThickness = 0f;
			VelocityOverLifetimeModule velocityOverLifetime = obj.velocityOverLifetime;
			((VelocityOverLifetimeModule)(ref velocityOverLifetime)).enabled = true;
			((VelocityOverLifetimeModule)(ref velocityOverLifetime)).radial = new MinMaxCurve(1.2f);
			ApplyFade(obj, new Color(1f, 0.05f, 0f), new Color(0.3f, 0f, 0f));
			ParticleSystemRenderer component = ((Component)obj).GetComponent<ParticleSystemRenderer>();
			component.renderMode = (ParticleSystemRenderMode)0;
			((Renderer)component).sharedMaterial = mat;
			obj.Play();
			return obj;
		}

		private static ParticleSystem MakeEmbers(Transform parent, Material mat)
		{
			//IL_0005: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: 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_005e: 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_008a: 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)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("AuraEmbers");
			val.transform.SetParent(parent, false);
			val.transform.localPosition = new Vector3(0f, 0.1f, 0f);
			ParticleSystem obj = val.AddComponent<ParticleSystem>();
			MainModule main = obj.main;
			((MainModule)(ref main)).loop = true;
			((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1;
			((MainModule)(ref main)).startLifetime = new MinMaxCurve(1f, 2.2f);
			((MainModule)(ref main)).startSpeed = new MinMaxCurve(1.5f, 3.5f);
			((MainModule)(ref main)).startSize = new MinMaxCurve(0.04f, 0.1f);
			((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(1f, 0.15f, 0f, 1f), new Color(0.8f, 0f, 0f, 0.8f));
			((MainModule)(ref main)).gravityModifier = MinMaxCurve.op_Implicit(-1.8f);
			((MainModule)(ref main)).maxParticles = 130;
			((MainModule)(ref main)).stopAction = (ParticleSystemStopAction)0;
			EmissionModule emission = obj.emission;
			((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(22f);
			ShapeModule shape = obj.shape;
			((ShapeModule)(ref shape)).enabled = true;
			((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)10;
			((ShapeModule)(ref shape)).radius = 0.3f;
			((ShapeModule)(ref shape)).radiusThickness = 1f;
			((ShapeModule)(ref shape)).rotation = new Vector3(-90f, 0f, 0f);
			ApplyFade(obj, new Color(1f, 0.1f, 0f), new Color(0.3f, 0f, 0f));
			ParticleSystemRenderer component = ((Component)obj).GetComponent<ParticleSystemRenderer>();
			component.renderMode = (ParticleSystemRenderMode)0;
			((Renderer)component).sharedMaterial = mat;
			obj.Play();
			return obj;
		}

		private static void ApplyFade(ParticleSystem ps, Color from, Color to)
		{
			//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_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			ColorOverLifetimeModule colorOverLifetime = ps.colorOverLifetime;
			((ColorOverLifetimeModule)(ref colorOverLifetime)).enabled = true;
			Gradient val = new Gradient();
			val.SetKeys((GradientColorKey[])(object)new GradientColorKey[2]
			{
				new GradientColorKey(from, 0f),
				new GradientColorKey(to, 1f)
			}, (GradientAlphaKey[])(object)new GradientAlphaKey[3]
			{
				new GradientAlphaKey(1f, 0f),
				new GradientAlphaKey(0.4f, 0.6f),
				new GradientAlphaKey(0f, 1f)
			});
			((ColorOverLifetimeModule)(ref colorOverLifetime)).color = MinMaxGradient.op_Implicit(val);
		}
	}
	public class BoneSync : MonoBehaviour
	{
		private struct WeaponClone
		{
			public MeshRenderer OriginalRenderer;

			public GameObject Clone;

			public Transform PlayerHand;

			public Transform ModelHand;
		}

		[CompilerGenerated]
		private sealed class <Setup>d__13 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public BoneSync <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <Setup>d__13(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				int num = <>1__state;
				BoneSync boneSync = <>4__this;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
				{
					<>1__state = -1;
					if ((Object)(object)boneSync._playerRoot == (Object)null || (Object)(object)boneSync._modelRoot == (Object)null)
					{
						return false;
					}
					boneSync._playerAnimator = ((Component)boneSync._playerRoot).GetComponentInChildren<Animator>();
					boneSync._modelAnimator = ((Component)boneSync._modelRoot).GetComponentInChildren<Animator>();
					if ((Object)(object)boneSync._playerAnimator == (Object)null)
					{
						BerserkPlugin.Log.LogError((object)"[BoneSync] Player animator not found!");
						return false;
					}
					if (boneSync._isDemonMode)
					{
						if ((Object)(object)boneSync._modelAnimator != (Object)null)
						{
							if ((Object)(object)boneSync._modelAnimator.runtimeAnimatorController != (Object)null)
							{
								AnimationClip[] animationClips = boneSync._modelAnimator.runtimeAnimatorController.animationClips;
								foreach (AnimationClip val in animationClips)
								{
									string text = ((Object)val).name.ToLower();
									if (text.Contains("idle") && !text.Contains("combat"))
									{
										boneSync._demonIdleAnims.Add(((Object)val).name);
									}
									else if (text.Contains("attack") || text.Contains("combat") || text.Contains("slash") || text.Contains("hit"))
									{
										boneSync._demonAttackAnims.Add(((Object)val).name);
									}
									else if (text.Contains("run") || text.Contains("walk") || text.Contains("move"))
									{
										boneSync._demonMoveAnims.Add(((Object)val).name);
									}
								}
							}
							AnimatorControllerParameter[] parameters = boneSync._modelAnimator.parameters;
							for (int i = 0; i < parameters.Length; i++)
							{
								_ = parameters[i];
							}
							((Behaviour)boneSync._modelAnimator).enabled = true;
							boneSync._modelAnimator.applyRootMotion = false;
							boneSync._modelAnimator.cullingMode = (AnimatorCullingMode)0;
							boneSync._modelAnimator.speed = 1f;
							if (!boneSync.TryPlayAnim("idlecombat00") && !boneSync.TryPlayAnim("idle00"))
							{
								boneSync.PlayDemonAnim(boneSync._demonIdleAnims, "idle");
							}
						}
					}
					else if ((Object)(object)boneSync._modelAnimator != (Object)null)
					{
						((Behaviour)boneSync._modelAnimator).enabled = true;
						boneSync._modelAnimator.runtimeAnimatorController = boneSync._playerAnimator.runtimeAnimatorController;
						boneSync._modelAnimator.applyRootMotion = false;
					}
					SkinnedMeshRenderer[] componentsInChildren = ((Component)boneSync._modelRoot).GetComponentsInChildren<SkinnedMeshRenderer>(true);
					for (int i = 0; i < componentsInChildren.Length; i++)
					{
						componentsInChildren[i].updateWhenOffscreen = true;
					}
					boneSync._playerBones = new Dictionary<string, Transform>(StringComparer.OrdinalIgnoreCase);
					Transform[] componentsInChildren2 = ((Component)boneSync._playerRoot).GetComponentsInChildren<Transform>(true);
					foreach (Transform val2 in componentsInChildren2)
					{
						if (!boneSync._playerBones.ContainsKey(((Object)val2).name))
						{
							boneSync._playerBones[((Object)val2).name] = val2;
						}
					}
					boneSync._modelBones = new Dictionary<string, Transform>(StringComparer.OrdinalIgnoreCase);
					componentsInChildren2 = ((Component)boneSync._modelRoot).GetComponentsInChildren<Transform>(true);
					foreach (Transform val3 in componentsInChildren2)
					{
						if (!boneSync._modelBones.ContainsKey(((Object)val3).name))
						{
							boneSync._modelBones[((Object)val3).name] = val3;
						}
					}
					if (!boneSync._isDemonMode)
					{
						boneSync.RefreshWeaponClones();
					}
					boneSync._ready = true;
					return false;
				}
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private Transform? _playerRoot;

		private Transform? _modelRoot;

		private Animator? _playerAnimator;

		private Animator? _modelAnimator;

		private bool _ready;

		private bool _isDemonMode;

		private List<WeaponClone> _weaponClones = new List<WeaponClone>();

		private Dictionary<string, Transform> _modelBones = new Dictionary<string, Transform>();

		private Dictionary<string, Transform> _playerBones = new Dictionary<string, Transform>();

		private float _refreshTimer;

		private const float RefreshInterval = 0.3f;

		private List<string> _demonIdleAnims = new List<string>();

		private List<string> _demonAttackAnims = new List<string>();

		private List<string> _demonMoveAnims = new List<string>();

		private int _attackAnimIndex;

		private float _attackAnimEndTime;

		private bool _isPlayingAttack;

		private bool _isCharging;

		private bool _wasMoving;

		private bool _wasRunning;

		private float _animRefreshTimer;

		public void Init(Transform playerRoot, Transform modelRoot)
		{
			_playerRoot = playerRoot;
			_modelRoot = modelRoot;
			_isDemonMode = (Object)(object)BerserkPlugin.DemonPrefab != (Object)null && ((Object)modelRoot).name.Contains("Demon");
			((MonoBehaviour)this).StartCoroutine(Setup());
		}

		[IteratorStateMachine(typeof(<Setup>d__13))]
		private IEnumerator Setup()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <Setup>d__13(0)
			{
				<>4__this = this
			};
		}

		private void PlayDemonAnim(List<string> anims, string fallbackPattern)
		{
			if ((Object)(object)_modelAnimator == (Object)null || TryPlayAnim(fallbackPattern + "00") || TryPlayAnim(fallbackPattern + "01") || TryPlayAnim(fallbackPattern))
			{
				return;
			}
			foreach (string anim in anims)
			{
				if (TryPlayAnim(anim))
				{
					break;
				}
			}
		}

		private bool TryPlayAnim(string animName, bool useBlend = true)
		{
			if ((Object)(object)_modelAnimator == (Object)null)
			{
				return false;
			}
			int num = Animator.StringToHash(animName);
			if (_modelAnimator.HasState(0, num))
			{
				if (useBlend)
				{
					_modelAnimator.CrossFadeInFixedTime(num, 0.15f, 0);
				}
				else
				{
					_modelAnimator.Play(num, 0, 0f);
				}
				return true;
			}
			int num2 = Animator.StringToHash("Base Layer." + animName);
			if (_modelAnimator.HasState(0, num2))
			{
				if (useBlend)
				{
					_modelAnimator.CrossFadeInFixedTime(num2, 0.15f, 0);
				}
				else
				{
					_modelAnimator.Play(num2, 0, 0f);
				}
				return true;
			}
			return false;
		}

		public void PlayAttackAnimation(float speedMult = 1f)
		{
			if ((Object)(object)_modelAnimator == (Object)null || !_isDemonMode)
			{
				return;
			}
			_isPlayingAttack = true;
			_attackAnimEndTime = Time.time + 0.7f / speedMult;
			_modelAnimator.speed = speedMult;
			string[] array = new string[3] { "attack00", "attack01", "attack02" };
			_attackAnimIndex = (_attackAnimIndex + 1) % array.Length;
			if (TryPlayAnim(array[_attackAnimIndex]))
			{
				return;
			}
			string[] array2 = array;
			foreach (string animName in array2)
			{
				if (TryPlayAnim(animName))
				{
					break;
				}
			}
		}

		public void PlaySlamAnimation()
		{
			if (!((Object)(object)_modelAnimator == (Object)null) && _isDemonMode)
			{
				_isPlayingAttack = true;
				_attackAnimEndTime = Time.time + 1.2f;
				if (!TryPlayAnim("attack02") && !TryPlayAnim("attack01"))
				{
					TryPlayAnim("attack00");
				}
			}
		}

		public void PlayChargeAnimation()
		{
			if ((Object)(object)_modelAnimator == (Object)null || !_isDemonMode)
			{
				return;
			}
			_isPlayingAttack = true;
			_attackAnimEndTime = Time.time + 30f;
			_isCharging = true;
			int num = Animator.StringToHash("attack01");
			if (_modelAnimator.HasState(0, num))
			{
				_modelAnimator.Play(num, 0, 0f);
				_modelAnimator.speed = 0.1f;
				return;
			}
			num = Animator.StringToHash("attack00");
			if (_modelAnimator.HasState(0, num))
			{
				_modelAnimator.Play(num, 0, 0f);
				_modelAnimator.speed = 0.1f;
			}
		}

		public void StopChargeAnimation()
		{
			_isPlayingAttack = false;
			_attackAnimEndTime = 0f;
			_isCharging = false;
			if ((Object)(object)_modelAnimator != (Object)null)
			{
				_modelAnimator.speed = 1f;
			}
		}

		private string? FindHandNameInParents(Transform t)
		{
			Transform parent = t.parent;
			int num = 0;
			while (num < 10 && (Object)(object)parent != (Object)null)
			{
				string text = ((Object)parent).name.ToLowerInvariant();
				if (text.Contains("righthand") || text.Contains("lefthand"))
				{
					return ((Object)parent).name;
				}
				num++;
				parent = parent.parent;
			}
			return null;
		}

		private void RefreshWeaponClones()
		{
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Expected O, but got Unknown
			if ((Object)(object)_playerRoot == (Object)null || (Object)(object)_modelRoot == (Object)null)
			{
				return;
			}
			for (int num = _weaponClones.Count - 1; num >= 0; num--)
			{
				WeaponClone weaponClone = _weaponClones[num];
				if ((Object)(object)weaponClone.OriginalRenderer == (Object)null || !((Component)weaponClone.OriginalRenderer).gameObject.activeInHierarchy)
				{
					if ((Object)(object)weaponClone.OriginalRenderer != (Object)null)
					{
						((Renderer)weaponClone.OriginalRenderer).enabled = true;
					}
					if ((Object)(object)weaponClone.Clone != (Object)null)
					{
						Object.Destroy((Object)(object)weaponClone.Clone);
					}
					_weaponClones.RemoveAt(num);
				}
			}
			MeshRenderer[] componentsInChildren = ((Component)_playerRoot).GetComponentsInChildren<MeshRenderer>(true);
			foreach (MeshRenderer val in componentsInChildren)
			{
				if (!((Component)val).gameObject.activeInHierarchy)
				{
					continue;
				}
				bool flag = false;
				foreach (WeaponClone weaponClone2 in _weaponClones)
				{
					if ((Object)(object)weaponClone2.OriginalRenderer == (Object)(object)val)
					{
						flag = true;
						break;
					}
				}
				if (flag)
				{
					continue;
				}
				string text = FindHandNameInParents(((Component)val).transform);
				if (text != null && _modelBones.TryGetValue(text, out Transform value) && _playerBones.TryGetValue(text, out Transform value2))
				{
					GameObject val2 = new GameObject("WeaponClone_" + ((Object)val).name);
					MeshFilter val3 = val2.AddComponent<MeshFilter>();
					MeshRenderer obj = val2.AddComponent<MeshRenderer>();
					MeshFilter component = ((Component)val).GetComponent<MeshFilter>();
					if ((Object)(object)component != (Object)null)
					{
						val3.sharedMesh = component.sharedMesh;
					}
					((Renderer)obj).sharedMaterials = ((Renderer)val).sharedMaterials;
					_weaponClones.Add(new WeaponClone
					{
						OriginalRenderer = val,
						Clone = val2,
						PlayerHand = value2,
						ModelHand = value
					});
					((Renderer)val).enabled = false;
				}
			}
		}

		private void LateUpdate()
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Expected I4, but got Unknown
			//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_038c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0398: Unknown result type (might be due to invalid IL or missing references)
			//IL_039d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_03db: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0406: Unknown result type (might be due to invalid IL or missing references)
			//IL_040b: Unknown result type (might be due to invalid IL or missing references)
			//IL_040d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0412: Unknown result type (might be due to invalid IL or missing references)
			//IL_042f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0434: Unknown result type (might be due to invalid IL or missing references)
			//IL_0436: Unknown result type (might be due to invalid IL or missing references)
			//IL_0458: Unknown result type (might be due to invalid IL or missing references)
			if (!_ready || (Object)(object)_playerRoot == (Object)null || (Object)(object)_modelRoot == (Object)null)
			{
				return;
			}
			_modelRoot.position = _playerRoot.position;
			_modelRoot.rotation = _playerRoot.rotation;
			if (_isDemonMode)
			{
				if (_isPlayingAttack)
				{
					if (!(Time.time > _attackAnimEndTime))
					{
						return;
					}
					_isPlayingAttack = false;
					if ((Object)(object)_modelAnimator != (Object)null)
					{
						_modelAnimator.speed = 1f;
					}
				}
				if (!((Object)(object)_playerAnimator != (Object)null) || _isPlayingAttack)
				{
					return;
				}
				float num = 0f;
				try
				{
					num = _playerAnimator.GetFloat("forward_speed");
				}
				catch
				{
				}
				bool flag = Mathf.Abs(num) > 0.1f;
				bool flag2 = Mathf.Abs(num) > 3f;
				_animRefreshTimer -= Time.deltaTime;
				bool flag3 = _animRefreshTimer <= 0f;
				if (flag3)
				{
					_animRefreshTimer = 2f;
				}
				if (flag2 && (!_wasRunning || flag3))
				{
					TryPlayAnim("run00");
					_wasMoving = true;
					_wasRunning = true;
				}
				else if (flag && !flag2 && (!_wasMoving || flag3))
				{
					TryPlayAnim("run00");
					_wasMoving = true;
					_wasRunning = false;
				}
				else if (!flag && (_wasMoving || flag3))
				{
					if (!TryPlayAnim("idlecombat00"))
					{
						TryPlayAnim("idle00");
					}
					_wasMoving = false;
					_wasRunning = false;
				}
			}
			else
			{
				if ((Object)(object)_playerAnimator == (Object)null || (Object)(object)_modelAnimator == (Object)null)
				{
					return;
				}
				AnimatorControllerParameter[] parameters = _playerAnimator.parameters;
				foreach (AnimatorControllerParameter val in parameters)
				{
					try
					{
						AnimatorControllerParameterType type = val.type;
						switch (type - 1)
						{
						case 0:
							_modelAnimator.SetFloat(val.nameHash, _playerAnimator.GetFloat(val.nameHash));
							break;
						case 2:
							_modelAnimator.SetInteger(val.nameHash, _playerAnimator.GetInteger(val.nameHash));
							break;
						case 3:
							_modelAnimator.SetBool(val.nameHash, _playerAnimator.GetBool(val.nameHash));
							break;
						case 1:
							break;
						}
					}
					catch
					{
					}
				}
				for (int j = 0; j < _playerAnimator.layerCount; j++)
				{
					AnimatorStateInfo currentAnimatorStateInfo = _playerAnimator.GetCurrentAnimatorStateInfo(j);
					_modelAnimator.Play(((AnimatorStateInfo)(ref currentAnimatorStateInfo)).fullPathHash, j, ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).normalizedTime);
				}
				_modelAnimator.speed = _playerAnimator.speed;
				_refreshTimer -= Time.deltaTime;
				if (_refreshTimer <= 0f)
				{
					_refreshTimer = 0.3f;
					RefreshWeaponClones();
				}
				foreach (WeaponClone weaponClone in _weaponClones)
				{
					if (!((Object)(object)weaponClone.Clone == (Object)null) && !((Object)(object)weaponClone.OriginalRenderer == (Object)null) && !((Object)(object)weaponClone.PlayerHand == (Object)null) && !((Object)(object)weaponClone.ModelHand == (Object)null))
					{
						Vector3 val2 = ((Component)weaponClone.OriginalRenderer).transform.position - weaponClone.PlayerHand.position;
						Vector3 val3 = Quaternion.Inverse(weaponClone.PlayerHand.rotation) * val2;
						Quaternion val4 = Quaternion.Inverse(weaponClone.PlayerHand.rotation) * ((Component)weaponClone.OriginalRenderer).transform.rotation;
						weaponClone.Clone.transform.position = weaponClone.ModelHand.position + weaponClone.ModelHand.rotation * val3;
						weaponClone.Clone.transform.rotation = weaponClone.ModelHand.rotation * val4;
						weaponClone.Clone.transform.localScale = ((Component)weaponClone.OriginalRenderer).transform.lossyScale;
					}
				}
			}
		}

		private void OnDestroy()
		{
			foreach (WeaponClone weaponClone in _weaponClones)
			{
				if ((Object)(object)weaponClone.OriginalRenderer != (Object)null)
				{
					((Renderer)weaponClone.OriginalRenderer).enabled = true;
				}
				if ((Object)(object)weaponClone.Clone != (Object)null)
				{
					Object.Destroy((Object)(object)weaponClone.Clone);
				}
			}
			_weaponClones.Clear();
		}
	}
	public class DemonSync : MonoBehaviour
	{
		private Transform? _playerRoot;

		private Transform? _demonRoot;

		private Animator? _playerAnimator;

		private Animator? _demonAnimator;

		private bool _ready;

		private bool _wasAttacking;

		private int _attackCombo;

		public void Init(Transform playerRoot, Transform demonRoot)
		{
			_playerRoot = playerRoot;
			_demonRoot = demonRoot;
			_playerAnimator = ((Component)playerRoot).GetComponentInChildren<Animator>();
			_demonAnimator = ((Component)demonRoot).GetComponentInChildren<Animator>();
			if ((Object)(object)_demonAnimator != (Object)null)
			{
				((Behaviour)_demonAnimator).enabled = true;
				_demonAnimator.cullingMode = (AnimatorCullingMode)0;
				_demonAnimator.Play("Idle", 0, 0f);
			}
			_ready = true;
		}

		private void LateUpdate()
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			if (_ready && !((Object)(object)_playerRoot == (Object)null) && !((Object)(object)_demonRoot == (Object)null))
			{
				_demonRoot.position = _playerRoot.position;
				_demonRoot.rotation = _playerRoot.rotation;
				if ((Object)(object)_playerAnimator != (Object)null && (Object)(object)_demonAnimator != (Object)null)
				{
					SyncAnimationState();
				}
			}
		}

		private void SyncAnimationState()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_playerAnimator == (Object)null) && !((Object)(object)_demonAnimator == (Object)null))
			{
				AnimatorStateInfo currentAnimatorStateInfo = _playerAnimator.GetCurrentAnimatorStateInfo(0);
				bool flag = ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsTag("attack") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Attack1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Attack2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Attack3") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_axe0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_axe1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_axe2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_pickaxe") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_sledge") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_longsword0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_longsword1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("swing_longsword2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("atgeir_attack0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("atgeir_attack1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("atgeir_attack2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("battleaxe_attack0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("battleaxe_attack1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("battleaxe_attack2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("knife_stab0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("knife_stab1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("knife_stab2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("mace_attack0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("mace_attack1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("mace_attack2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("spear_poke") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("sword_attack0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("sword_attack1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("sword_attack2") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("unarmed0") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("unarmed1") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("unarmed2");
				float num = 0f;
				try
				{
					num = _playerAnimator.GetFloat("forward_speed");
				}
				catch
				{
				}
				bool flag2 = num > 0.5f;
				bool flag3 = false;
				try
				{
					flag3 = !_playerAnimator.GetBool("inWater") && _playerAnimator.GetBool("jump");
				}
				catch
				{
				}
				if (flag && !_wasAttacking)
				{
					_attackCombo = (_attackCombo + 1) % 3;
					string text = _attackCombo switch
					{
						0 => "Attack1", 
						1 => "Attack2", 
						_ => "Attack3", 
					};
					TryPlayAnimation(text, "Attack", "attack", "Punch", "Slash", "Hit");
				}
				else if (flag3)
				{
					TryPlayAnimation("Jump", "jump", "Jumping");
				}
				else if (flag2 && !flag)
				{
					TryPlayAnimation("Run", "run", "Running", "Walk", "walk");
				}
				else if (!flag && !flag2 && !flag3)
				{
					TryPlayAnimation("Idle", "idle", "Breathing Idle");
				}
				_wasAttacking = flag;
			}
		}

		private void TryPlayAnimation(params string[] names)
		{
			//IL_0029: 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)
			if ((Object)(object)_demonAnimator == (Object)null)
			{
				return;
			}
			foreach (string text in names)
			{
				if (HasAnimation(text))
				{
					AnimatorStateInfo currentAnimatorStateInfo = _demonAnimator.GetCurrentAnimatorStateInfo(0);
					if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName(text))
					{
						_demonAnimator.CrossFade(text, 0.1f, 0);
					}
					break;
				}
			}
		}

		private bool HasAnimation(string name)
		{
			if ((Object)(object)_demonAnimator == (Object)null || (Object)(object)_demonAnimator.runtimeAnimatorController == (Object)null)
			{
				return false;
			}
			AnimationClip[] animationClips = _demonAnimator.runtimeAnimatorController.animationClips;
			foreach (AnimationClip val in animationClips)
			{
				if (((Object)val).name == name || ((Object)val).name.ToLower().Contains(name.ToLower()))
				{
					return true;
				}
			}
			return false;
		}
	}
	[BepInPlugin("com.aurora.berserkir", "Berserkir", "1.1.1")]
	public class BerserkPlugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private sealed class <LoadAudio>d__21 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public string relative;

			public Action<AudioClip> onLoaded;

			private UnityWebRequest <req>5__2;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <LoadAudio>d__21(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<req>5__2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Invalid comparison between Unknown and I4
				bool result;
				try
				{
					switch (<>1__state)
					{
					default:
						result = false;
						break;
					case 0:
					{
						<>1__state = -1;
						string text = Path.Combine(PluginFolder, relative);
						if (!File.Exists(text))
						{
							Log.LogWarning((object)("[Berserkir] Audio not found: " + text));
							result = false;
							break;
						}
						<req>5__2 = UnityWebRequestMultimedia.GetAudioClip("file://" + text, (AudioType)14);
						<>1__state = -3;
						<>2__current = <req>5__2.SendWebRequest();
						<>1__state = 1;
						result = true;
						break;
					}
					case 1:
						<>1__state = -3;
						if ((int)<req>5__2.result != 1)
						{
							Log.LogError((object)("[Berserkir] Audio load failed: " + <req>5__2.error));
							result = false;
						}
						else
						{
							AudioClip content = DownloadHandlerAudioClip.GetContent(<req>5__2);
							((Object)content).name = relative;
							onLoaded(content);
							result = false;
						}
						<>m__Finally1();
						break;
					}
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
				return result;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				if (<req>5__2 != null)
				{
					((IDisposable)<req>5__2).Dispose();
				}
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public const string PluginGUID = "com.aurora.berserkir";

		public const string PluginName = "Berserkir";

		public const string PluginVersion = "1.1.1";

		public const string PluginAuthor = "Freyja";

		internal static ManualLogSource Log;

		internal static BerserkPlugin Instance;

		internal static string PluginFolder;

		internal static AudioClip? ClipActivate;

		internal static AudioClip? ClipSlam;

		internal static AudioClip? ClipPulse;

		internal static AssetBundle? Bundle;

		internal static GameObject? FirePrefab;

		internal static AssetBundle? DemonBundle;

		internal static GameObject? DemonPrefab;

		private Harmony? _harmony;

		private bool _enabled = true;

		private void Awake()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			PluginFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			ServerGuard.Init(this);
			if (_enabled)
			{
				_harmony = new Harmony("com.aurora.berserkir");
				_harmony.PatchAll();
				((MonoBehaviour)this).StartCoroutine(LoadAudio("sounds/zerk_activate.ogg", delegate(AudioClip clip)
				{
					ClipActivate = clip;
				}));
				((MonoBehaviour)this).StartCoroutine(LoadAudio("sounds/zerk_slam.ogg", delegate(AudioClip clip)
				{
					ClipSlam = clip;
				}));
				((MonoBehaviour)this).StartCoroutine(LoadAudio("sounds/zerk_pulse.ogg", delegate(AudioClip clip)
				{
					ClipPulse = clip;
				}));
				LoadBundle();
				LoadDemonBundle();
				Log.LogInfo((object)"Berserkir v1.1.1 by Freyja — AWAKENED!");
			}
		}

		private void LoadBundle()
		{
			string text = Path.Combine(PluginFolder, "berserkir");
			if (!File.Exists(text))
			{
				Log.LogWarning((object)("[Berserkir] berserkir bundle not found at: " + text));
				return;
			}
			Bundle = AssetBundle.LoadFromFile(text);
			if ((Object)(object)Bundle == (Object)null)
			{
				Log.LogError((object)"[Berserkir] Bundle load failed.");
				return;
			}
			FirePrefab = Bundle.LoadAsset<GameObject>("BerserkFire");
			if ((Object)(object)FirePrefab != (Object)null)
			{
				Log.LogInfo((object)"[Berserkir] BerserkFire loaded OK");
			}
			else
			{
				Log.LogWarning((object)"[Berserkir] BerserkFire not found in bundle.");
			}
		}

		private void LoadDemonBundle()
		{
			string text = Path.Combine(PluginFolder, "berserkir_demon");
			if (!File.Exists(text))
			{
				Log.LogInfo((object)"[Berserkir] Custom demon bundle not found - will use default skeleton.");
				return;
			}
			DemonBundle = AssetBundle.LoadFromFile(text);
			if ((Object)(object)DemonBundle == (Object)null)
			{
				Log.LogError((object)"[Berserkir] Demon bundle load failed!");
				return;
			}
			DemonPrefab = DemonBundle.LoadAsset<GameObject>("DemonGirl 1 Variant");
			if ((Object)(object)DemonPrefab != (Object)null)
			{
				Log.LogInfo((object)"[Berserkir] Custom DemonGirl loaded OK!");
				return;
			}
			Log.LogWarning((object)"[Berserkir] DemonGirl prefab not found. Assets in bundle:");
			string[] allAssetNames = DemonBundle.GetAllAssetNames();
			foreach (string text2 in allAssetNames)
			{
				Log.LogWarning((object)("  - " + text2));
			}
		}

		public void DisablePlugin()
		{
			_enabled = false;
		}

		private void OnDestroy()
		{
			Harmony? harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		[IteratorStateMachine(typeof(<LoadAudio>d__21))]
		private static IEnumerator LoadAudio(string relative, Action<AudioClip> onLoaded)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <LoadAudio>d__21(0)
			{
				relative = relative,
				onLoaded = onLoaded
			};
		}
	}
	[HarmonyPatch]
	public static class BerserkPatches
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static ConsoleEvent <>9__21_0;

			internal void <Terminal_InitTerminal>b__21_0(ConsoleEventArgs args)
			{
				BerserkHUD instance = BerserkHUD.Instance;
				if ((Object)(object)instance == (Object)null)
				{
					Terminal.Log((object)"Berserkir HUD not active.");
					return;
				}
				instance.AdminFill();
				Terminal.Log((object)"<color=#FF3300>Berserkir: all bars filled — RAGE READY!</color>");
			}
		}

		[CompilerGenerated]
		private sealed class <DelayedClawDamage>d__44 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public float delay;

			public Player player;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedClawDamage>d__44(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(delay);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					DealClawDamage(player);
					SE_Berserk.PlaySlam();
					BerserkHUD.TriggerShake(0.4f);
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <DelayedSlamExplosion>d__48 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public float delay;

			public Player player;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedSlamExplosion>d__48(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Expected O, but got Unknown
				//IL_0043: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(delay);
					<>1__state = 1;
					return true;
				case 1:
				{
					<>1__state = -1;
					Vector3 position = ((Component)player).transform.position;
					SpawnSpecialSlamVfx(position);
					SE_Berserk.DealSlamNova((Character)(object)player, position);
					BerserkHUD.TriggerShake(2f);
					SE_Berserk.PlaySlam();
					return false;
				}
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static bool _inAoe;

		private static float _slamCooldown;

		private static readonly Dictionary<int, Character> LastAttacker = new Dictionary<int, Character>();

		private static readonly HashSet<Character> RecentlyHitByLocal = new HashSet<Character>();

		private static float _lastSlamTime;

		private const float SlamCooldownSeconds = 2f;

		private const float SlamHpCost = 0.1f;

		private static floa