using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Frailty.Manager;
using Frailty.Patches;
using Frailty.Properties;
using GameNetcodeStuff;
using HarmonyLib;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Rendering;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Frailty")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Frailty")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("fe19d81f-566d-4e7e-aa89-f207acbc7d11")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Frailty
{
	public class Configuration
	{
		public static ConfigEntry<bool> fracturedLeg;
		public static ConfigEntry<float> fracturedLegTime;
		public static ConfigEntry<float> fracturedLegChance;
		public static ConfigEntry<bool> fracturedArm;
		public static ConfigEntry<float> fracturedArmTime;
		public static ConfigEntry<float> fracturedArmChance;
		public static ConfigEntry<bool> brokenLeg;
		public static ConfigEntry<float> brokenLegTime;
		public static ConfigEntry<float> brokenLegChance;
		public static ConfigEntry<bool> brokenArm;
		public static ConfigEntry<float> brokenArmTime;
		public static ConfigEntry<float> brokenArmChance;
		public static ConfigEntry<bool> bleeding;
		public static ConfigEntry<float> bleedingTime;
		public static ConfigEntry<float> bleedingChance;
		public static ConfigEntry<bool> blindness;
		public static ConfigEntry<float> blindnessTime;
		public static ConfigEntry<float> blindnessChance;
		public static ConfigEntry<bool> concussed;
		public static ConfigEntry<float> concussedTime;
		public static ConfigEntry<float> concussedChance;
		public static void Load()
		{
			fracturedLeg = Plugin.config.Bind<bool>("Conditions", "Fractured Leg", true, "Can players fracture their legs? (Will also disable broken legs.)");
			fracturedLegTime = Plugin.config.Bind<float>("Condition Times", "Fractured Leg Time", 120f, "How long should fractured legs last?");
			fracturedLegChance = Plugin.config.Bind<float>("Condition Chances", "Fractured Leg Chance", 0.25f, "Chance of fractured legs to occur. (From 0 to 1.)");
			fracturedArm = Plugin.config.Bind<bool>("Conditions", "Fractured Arm", true, "Can players fracture their arms? (Will also disable broken arms.");
			fracturedArmTime = Plugin.config.Bind<float>("Condition Times", "Fractured Arm Time", 120f, "How long should fractured arms last?");
			fracturedArmChance = Plugin.config.Bind<float>("Condition Chances", "Fractured Arm Chance", 0.2f, "Chance of fractured arms to occur. (From 0 to 1.)");
			brokenLeg = Plugin.config.Bind<bool>("Conditions", "Broken Leg", true, "Can players break their legs?");
			brokenLegTime = Plugin.config.Bind<float>("Condition Times", "Broken Leg Time", 180f, "How long should broken legs last?");
			brokenLegChance = Plugin.config.Bind<float>("Condition Chances", "Broken Leg Chance", 0.25f, "Chance of broken legs to occur. (From 0 to 1.)");
			brokenArm = Plugin.config.Bind<bool>("Conditions", "Broken Arm", true, "Can players break their arms?");
			brokenArmTime = Plugin.config.Bind<float>("Condition Times", "Broken Arm Time", 180f, "How long should broken arms last?");
			brokenArmChance = Plugin.config.Bind<float>("Condition Chances", "Broken Arm Chance", 0.2f, "Chance of broken arms to occur. (From 0 to 1.)");
			bleeding = Plugin.config.Bind<bool>("Conditions", "Bleeding", true, "Can players bleed?");
			bleedingTime = Plugin.config.Bind<float>("Condition Times", "Bleeding Time", 45f, "How long should bleeding last?");
			bleedingChance = Plugin.config.Bind<float>("Condition Chances", "Bleeding Chance", 0.25f, "Chance of bleeding to occur. (From 0 to 1.)");
			blindness = Plugin.config.Bind<bool>("Conditions", "Blindness", true, "Can players be blinded?");
			blindnessTime = Plugin.config.Bind<float>("Condition Times", "Blindness Time", 15f, "How long should blindness last? (in seconds)");
			blindnessChance = Plugin.config.Bind<float>("Condition Chances", "Blindness Chance", 0.1f, "Chance of blindness to occur. (From 0 to 1.)");
			concussed = Plugin.config.Bind<bool>("Conditions", "Concussed", true, "Can players concussed?");
			concussedTime = Plugin.config.Bind<float>("Condition Times", "Concussed Time", 30f, "How long should concussed last? (in seconds)");
			concussedChance = Plugin.config.Bind<float>("Condition Chances", "Concussed Chance", 0.1f, "Chance of concussed to occur. (From 0 to 1.)");
		}
	}
	public class Content
	{
		public static AssetBundle MainContent;
		public static void Load()
		{
			Plugin.mls.LogDebug((object)"Loading internal assets...");
			MainContent = AssetBundle.LoadFromMemory(Plugin.assetFile);
			Plugin.mls.LogDebug((object)"Internal assets loaded!");
		}
	}
	[BepInPlugin("Chaos.Frailty", "Frailty", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		private const string modGUID = "Chaos.Frailty";
		private const string modName = "Frailty";
		private const string modVersion = "1.0.0";
		private readonly Harmony harmony = new Harmony("Chaos.Frailty");
		public static Plugin Instance;
		public static ManualLogSource mls;
		public static ConfigFile config;
		public static byte[] assetFile;
		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			assetFile = Resources.frailty;
			mls = ((BaseUnityPlugin)this).Logger;
			config = ((BaseUnityPlugin)this).Config;
			Configuration.Load();
			Content.Load();
			mls.LogDebug((object)"Patching Frailty...");
			harmony.PatchAll(typeof(HUDPatch));
			harmony.PatchAll(typeof(PlayerPatch));
			harmony.PatchAll(typeof(SteamValveHazardPatch));
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			mls.LogInfo((object)"Frailty loaded.");
		}
	}
}
namespace Frailty.Properties
{
	[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
	[DebuggerNonUserCode]
	[CompilerGenerated]
	internal class Resources
	{
		private static ResourceManager resourceMan;
		private static CultureInfo resourceCulture;
		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static ResourceManager ResourceManager
		{
			get
			{
				if (resourceMan == null)
				{
					ResourceManager resourceManager = new ResourceManager("Frailty.Properties.Resources", typeof(Resources).Assembly);
					resourceMan = resourceManager;
				}
				return resourceMan;
			}
		}
		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static CultureInfo Culture
		{
			get
			{
				return resourceCulture;
			}
			set
			{
				resourceCulture = value;
			}
		}
		internal static byte[] frailty
		{
			get
			{
				object @object = ResourceManager.GetObject("frailty", resourceCulture);
				return (byte[])@object;
			}
		}
		internal Resources()
		{
		}
	}
}
namespace Frailty.Patches
{
	[HarmonyPatch(typeof(HUDManager))]
	internal class HUDPatch
	{
		public static GameObject conditionHud;
		public static Transform bleedingHud;
		public static Transform blindnessHud;
		public static Transform brokenArmHud;
		public static Transform brokenLegHud;
		public static Transform concussedHud;
		public static Transform fracturedArmHud;
		public static Transform fracturedLegHud;
		public static Volume concussed;
		public static Volume blindness;
		[HarmonyPatch(typeof(HUDManager), "Awake")]
		[HarmonyPrefix]
		private static void Awake(HUDManager __instance)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: 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_008f: Unknown result type (might be due to invalid IL or missing references)
			conditionHud = Object.Instantiate<GameObject>(Content.MainContent.LoadAsset<GameObject>("Assets/custom/Frailty/hud/Conditions.prefab"), new Vector3(15.85f, 23.4f, -5.55f), Quaternion.Euler(0f, -14.141f, 0f), __instance.HUDContainer.transform);
			RectTransform component = conditionHud.GetComponent<RectTransform>();
			component.anchoredPosition3D = new Vector3(15.85f, 23.4f, -5.55f);
			((Transform)component).rotation = Quaternion.Euler(0f, -14.141f, 0f);
			((Transform)component).localScale = Vector3.one;
			bleedingHud = conditionHud.transform.Find("Bleeding");
			blindnessHud = conditionHud.transform.Find("Blindness");
			brokenArmHud = conditionHud.transform.Find("BrokenArm");
			brokenLegHud = conditionHud.transform.Find("BrokenLeg");
			concussedHud = conditionHud.transform.Find("Concussed");
			fracturedArmHud = conditionHud.transform.Find("FracturedArm");
			fracturedLegHud = conditionHud.transform.Find("FracturedLeg");
			Plugin.mls.LogDebug((object)"The condition hud has been added.");
			concussed = ((Component)__instance).gameObject.AddComponent<Volume>();
			concussed.profile = Content.MainContent.LoadAsset<VolumeProfile>("Assets/custom/Frailty/volumes/concussed.asset");
			concussed.isGlobal = true;
			concussed.weight = 0f;
			concussed.sharedProfile = Content.MainContent.LoadAsset<VolumeProfile>("Assets/custom/Frailty/volumes/concussed.asset");
			blindness = ((Component)__instance).gameObject.AddComponent<Volume>();
			blindness.profile = Content.MainContent.LoadAsset<VolumeProfile>("Assets/custom/Frailty/volumes/blind.asset");
			blindness.isGlobal = true;
			blindness.weight = 0f;
			blindness.sharedProfile = Content.MainContent.LoadAsset<VolumeProfile>("Assets/custom/Frailty/volumes/blind.asset");
			Plugin.mls.LogDebug((object)"Frailty volumes added!");
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerPatch
	{
		[HarmonyPatch(typeof(PlayerControllerB), "Awake")]
		[HarmonyPrefix]
		private static void Awake(PlayerControllerB __instance)
		{
			if (!Object.op_Implicit((Object)(object)((Component)__instance).gameObject.GetComponent<ConditionManager>()))
			{
				((Component)__instance).gameObject.AddComponent<ConditionManager>();
			}
		}
		[HarmonyPatch(typeof(PlayerControllerB), "DamagePlayer")]
		[HarmonyPrefix]
		private static void DamagePlayer(PlayerControllerB __instance, int damageNumber, bool hasDamageSFX = true, bool callRPC = true, CauseOfDeath causeOfDeath = 0, int deathAnimation = 0, bool fallDamage = false, Vector3 force = default(Vector3))
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			ConditionManager conditionManager = default(ConditionManager);
			if (((Component)__instance).gameObject.TryGetComponent<ConditionManager>(ref conditionManager))
			{
				Plugin.mls.LogDebug((object)(__instance.playerUsername + " got damaged! Triggering OnDamage!"));
				conditionManager.OnDamage(causeOfDeath, damageNumber);
			}
		}
	}
	[HarmonyPatch(typeof(SteamValveHazard))]
	internal class SteamValveHazardPatch
	{
		[HarmonyPatch(typeof(SteamValveHazard), "Update")]
		[HarmonyPrefix]
		private static void Update(SteamValveHazard __instance)
		{
			//IL_001b: 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)
			ConditionManager conditionManager = default(ConditionManager);
			if (__instance.valveHasBurst && Vector3.Distance(((Component)GameNetworkManager.Instance.localPlayerController).transform.position, ((Component)__instance.valveAudio).transform.position) < 9f && ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.TryGetComponent<ConditionManager>(ref conditionManager))
			{
				conditionManager.OnDamage(OtherDamageType.Gaz);
			}
		}
	}
}
namespace Frailty.Manager
{
	public class ConditionManager : NetworkBehaviour
	{
		public List<Condition> conditions = new List<Condition>();
		private PlayerControllerB player;
		private float concussedIntensity = 0f;
		private float blindnessIntensity = 0f;
		private void Start()
		{
			player = ((Component)this).GetComponent<PlayerControllerB>();
		}
		private void Update()
		{
			if (((NetworkBehaviour)this).IsOwner && (Object)(object)player == (Object)(object)StartOfRound.Instance.localPlayerController)
			{
				HUDPatch.concussed.weight = Mathf.Lerp(HUDPatch.concussed.weight, concussedIntensity, 2f * Time.deltaTime);
				HUDPatch.blindness.weight = Mathf.Lerp(HUDPatch.blindness.weight, blindnessIntensity, 2f * Time.deltaTime);
			}
			if (((NetworkBehaviour)this).IsOwner && player.isPlayerControlled)
			{
				if ((Object)(object)HUDPatch.concussed == (Object)null || (Object)(object)HUDPatch.blindness == (Object)null)
				{
					return;
				}
				foreach (Condition item in conditions.ToList())
				{
					float num = item.startTime + item.duration - Time.realtimeSinceStartup;
					if (num <= 0f)
					{
						RemoveConditionServerRpc(item.type);
						continue;
					}
					float num2 = 1f;
					if (player.drunkness > 0.02f)
					{
						num2 *= Mathf.Abs(StartOfRound.Instance.drunknessSpeedEffect.Evaluate(player.drunkness) - 1.25f);
					}
					switch (item.type)
					{
					case ConditionType.BrokenLeg:
						if (player.isSprinting)
						{
							player.sprintMeter = Mathf.Clamp(player.sprintMeter - Time.deltaTime / (player.sprintTime / 1.5f) * player.carryWeight * num2, 0f, 1f);
						}
						else if (player.isMovementHindered > 0)
						{
							if (player.isWalking)
							{
								player.sprintMeter = Mathf.Clamp(player.sprintMeter - Time.deltaTime / (player.sprintTime / 1.5f) * num2 * 0.5f, 0f, 1f);
							}
						}
						else if (!player.isWalking)
						{
							player.sprintMeter = Mathf.Clamp(player.sprintMeter + Time.deltaTime / (player.sprintTime / 1.5f + 4f) * num2, 0f, 1f);
						}
						else
						{
							player.sprintMeter = Mathf.Clamp(player.sprintMeter + Time.deltaTime / (player.sprintTime / 1.5f + 9f) * num2, 0f, 1f);
						}
						break;
					case ConditionType.BrokenArm:
						if ((Object)(object)player.currentlyHeldObject != (Object)null)
						{
							GrabbableObject currentlyHeldObject2 = player.currentlyHeldObject;
							Item itemProperties3 = currentlyHeldObject2.itemProperties;
							float num5 = Mathf.Clamp(itemProperties3.weight - 1f, 0f, 100f) * 105f;
							if (num5 > 15f && ((NetworkBehaviour)player).IsOwner)
							{
								if (player.timeSinceSwitchingSlots < 0.2f || player.isGrabbingObjectAnimation || player.timeSinceSwitchingSlots < 0.2f || player.isTypingChat || player.inSpecialInteractAnimation || player.activatingItem)
								{
									return;
								}
								((MonoBehaviour)player).StartCoroutine(player.waitToEndOfFrameToDiscard());
							}
						}
						else
						{
							if (!((Object)(object)player.currentlyHeldObjectServer != (Object)null))
							{
								break;
							}
							GrabbableObject currentlyHeldObjectServer2 = player.currentlyHeldObjectServer;
							Item itemProperties4 = currentlyHeldObjectServer2.itemProperties;
							float num6 = Mathf.Clamp(itemProperties4.weight - 1f, 0f, 100f) * 105f;
							if (num6 > 15f && ((NetworkBehaviour)player).IsOwner)
							{
								if (player.timeSinceSwitchingSlots < 0.2f || player.isGrabbingObjectAnimation || player.timeSinceSwitchingSlots < 0.2f || player.isTypingChat || player.inSpecialInteractAnimation || player.activatingItem)
								{
									return;
								}
								((MonoBehaviour)player).StartCoroutine(player.waitToEndOfFrameToDiscard());
							}
						}
						break;
					case ConditionType.FracturedLeg:
						if (player.isSprinting)
						{
							player.sprintMeter = Mathf.Clamp(player.sprintMeter - Time.deltaTime / (player.sprintTime / 1.2f) * player.carryWeight * num2, 0f, 1f);
						}
						else if (player.isMovementHindered > 0)
						{
							if (player.isWalking)
							{
								player.sprintMeter = Mathf.Clamp(player.sprintMeter - Time.deltaTime / (player.sprintTime / 1.2f) * num2 * 0.5f, 0f, 1f);
							}
						}
						else if (!player.isWalking)
						{
							player.sprintMeter = Mathf.Clamp(player.sprintMeter + Time.deltaTime / (player.sprintTime / 1.2f + 4f) * num2, 0f, 1f);
						}
						else
						{
							player.sprintMeter = Mathf.Clamp(player.sprintMeter + Time.deltaTime / (player.sprintTime / 1.2f + 9f) * num2, 0f, 1f);
						}
						break;
					case ConditionType.FracturedArm:
						if ((Object)(object)player.currentlyHeldObject != (Object)null)
						{
							GrabbableObject currentlyHeldObject = player.currentlyHeldObject;
							Item itemProperties = currentlyHeldObject.itemProperties;
							float num3 = Mathf.Clamp(itemProperties.weight - 1f, 0f, 100f) * 105f;
							if (num3 > 25f && ((NetworkBehaviour)player).IsOwner)
							{
								if (player.timeSinceSwitchingSlots < 0.2f || player.isGrabbingObjectAnimation || player.timeSinceSwitchingSlots < 0.2f || player.isTypingChat || player.inSpecialInteractAnimation || player.activatingItem)
								{
									return;
								}
								((MonoBehaviour)player).StartCoroutine(player.waitToEndOfFrameToDiscard());
							}
						}
						else
						{
							if (!((Object)(object)player.currentlyHeldObjectServer != (Object)null))
							{
								break;
							}
							GrabbableObject currentlyHeldObjectServer = player.currentlyHeldObjectServer;
							Item itemProperties2 = currentlyHeldObjectServer.itemProperties;
							float num4 = Mathf.Clamp(itemProperties2.weight - 1f, 0f, 100f) * 105f;
							if (num4 > 25f && ((NetworkBehaviour)player).IsOwner)
							{
								if (player.timeSinceSwitchingSlots < 0.2f || player.isGrabbingObjectAnimation || player.timeSinceSwitchingSlots < 0.2f || player.isTypingChat || player.inSpecialInteractAnimation || player.activatingItem)
								{
									return;
								}
								((MonoBehaviour)player).StartCoroutine(player.waitToEndOfFrameToDiscard());
							}
						}
						break;
					case ConditionType.Bleeding:
						player.healthRegenerateTimer = 1f;
						break;
					case ConditionType.Blindness:
						blindnessIntensity = 1f;
						break;
					case ConditionType.Concussed:
						concussedIntensity = 1f;
						break;
					}
				}
			}
			foreach (Condition item2 in conditions.ToList())
			{
				switch (item2.type)
				{
				case ConditionType.BrokenLeg:
					player.limpMultiplier = 1f;
					break;
				case ConditionType.Bleeding:
					player.bleedingHeavily = true;
					break;
				}
			}
			if (!HasCondition(ConditionType.Bleeding))
			{
				player.bleedingHeavily = false;
			}
			if (conditions.Count > 0 && player.isPlayerDead)
			{
				Plugin.mls.LogDebug((object)"PLAYER IS DEAD! REMOVING CONDITIONS!");
				if (((NetworkBehaviour)this).IsOwner)
				{
					ClearAllConditions();
				}
			}
		}
		public void OnDamage(CauseOfDeath damageType, int damage)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Invalid comparison between Unknown and I4
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Invalid comparison between Unknown and I4
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Invalid comparison between Unknown and I4
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Invalid comparison between Unknown and I4
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Invalid comparison between Unknown and I4
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Invalid comparison between Unknown and I4
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Invalid comparison between Unknown and I4
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Invalid comparison between Unknown and I4
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Invalid comparison between Unknown and I4
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Invalid comparison between Unknown and I4
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Invalid comparison between Unknown and I4
			if (!((NetworkBehaviour)this).IsOwner)
			{
				return;
			}
			if ((int)damageType == 6 || (int)damageType == 7 || (int)damageType == 15 || (int)damageType == 17 || (int)damageType == 14)
			{
				if (ShouldApplyCondition(((int)damageType == 7) ? 1f : Configuration.bleedingChance.Value, damage) && Configuration.bleeding.Value)
				{
					AddConditionServerRpc(ConditionType.Bleeding, Configuration.bleedingTime.Value);
				}
			}
			else if ((int)damageType == 1 || (int)damageType == 3 || (int)damageType == 12 || (int)damageType == 16)
			{
				if (ShouldApplyCondition(Configuration.concussedChance.Value, damage) && Configuration.concussed.Value)
				{
					AddConditionServerRpc(ConditionType.Concussed, Configuration.concussedTime.Value);
				}
				if (!ShouldApplyCondition(HasCondition(ConditionType.FracturedArm) ? Configuration.brokenArmChance.Value : Configuration.fracturedArmChance.Value, damage))
				{
					return;
				}
				if (!HasCondition(ConditionType.FracturedArm) && !HasCondition(ConditionType.BrokenArm))
				{
					if (Configuration.fracturedArm.Value)
					{
						AddConditionServerRpc(ConditionType.FracturedArm, Configuration.fracturedArmTime.Value);
					}
					return;
				}
				if (HasCondition(ConditionType.FracturedArm))
				{
					RemoveConditionServerRpc(ConditionType.FracturedArm);
				}
				if (Configuration.brokenArm.Value)
				{
					AddConditionServerRpc(ConditionType.BrokenArm, Configuration.brokenArmTime.Value);
				}
			}
			else if ((int)damageType == 2)
			{
				if (!ShouldApplyCondition(HasCondition(ConditionType.FracturedLeg) ? Configuration.brokenLegChance.Value : Configuration.fracturedLegChance.Value, damage))
				{
					return;
				}
				if (!HasCondition(ConditionType.FracturedLeg) && !HasCondition(ConditionType.BrokenLeg))
				{
					if (Configuration.fracturedLeg.Value)
					{
						AddConditionServerRpc(ConditionType.FracturedLeg, Configuration.fracturedLegTime.Value);
					}
					return;
				}
				RemoveConditionServerRpc(ConditionType.FracturedLeg);
				if (Configuration.brokenLeg.Value)
				{
					AddConditionServerRpc(ConditionType.BrokenLeg, Configuration.brokenLegTime.Value);
				}
			}
			else
			{
				Plugin.mls.LogWarning((object)("Damage type isn't supported yet: " + ((object)(CauseOfDeath)(ref damageType)).ToString()));
			}
		}
		public void OnDamage(OtherDamageType damageType)
		{
			if (((NetworkBehaviour)this).IsOwner && damageType == OtherDamageType.Gaz && ShouldApplyCondition(Configuration.blindnessChance.Value, 0) && Configuration.blindness.Value)
			{
				AddConditionServerRpc(ConditionType.Blindness, Configuration.blindnessTime.Value);
			}
		}
		public void OnDeath()
		{
			if (((NetworkBehaviour)this).IsOwner)
			{
				ClearAllConditions();
			}
		}
		private void ClearAllConditions()
		{
			Plugin.mls.LogDebug((object)("Removing all conditions of " + player.playerUsername + "."));
			foreach (Condition item in conditions.ToList())
			{
				RemoveConditionServerRpc(item.type);
			}
		}
		private float CalculateConditionProbability(int damage)
		{
			return (player.health == 0) ? 1f : Mathf.Clamp01((float)((1 + (1 - player.health / 100)) / 2 + damage / player.health / 2));
		}
		private bool ShouldApplyCondition(float chance, int damage)
		{
			return Random.value * CalculateConditionProbability(damage) <= chance;
		}
		[ServerRpc]
		public void AddConditionServerRpc(ConditionType type, float duration)
		{
			AddConditionClientRpc(type, duration);
		}
		[ClientRpc]
		public void AddConditionClientRpc(ConditionType type, float duration)
		{
			if (player.isPlayerDead)
			{
				return;
			}
			float realtimeSinceStartup = Time.realtimeSinceStartup;
			if (HasCondition(type))
			{
				conditions.Where((Condition x) => x.type == type).ToArray()[0].duration = duration;
				conditions.Where((Condition x) => x.type == type).ToArray()[0].startTime = realtimeSinceStartup;
			}
			else
			{
				conditions.Add(new Condition
				{
					startTime = realtimeSinceStartup,
					duration = duration,
					type = type
				});
			}
			if (((NetworkBehaviour)this).IsOwner)
			{
				ShowConditionHUD(type);
			}
			Plugin.mls.LogDebug((object)("Player '" + player.playerUsername + "' received the condition: " + type.ToString() + "."));
		}
		private void ShowConditionHUD(ConditionType type)
		{
			switch (type)
			{
			case ConditionType.BrokenLeg:
				HUDPatch.brokenLegHud.SetAsFirstSibling();
				((Component)HUDPatch.brokenLegHud).gameObject.SetActive(true);
				((Component)HUDPatch.brokenLegHud).GetComponent<Animator>().SetBool("Visible", true);
				break;
			case ConditionType.BrokenArm:
				HUDPatch.brokenArmHud.SetAsFirstSibling();
				((Component)HUDPatch.brokenArmHud).gameObject.SetActive(true);
				((Component)HUDPatch.brokenArmHud).GetComponent<Animator>().SetBool("Visible", true);
				break;
			case ConditionType.FracturedLeg:
				HUDPatch.fracturedLegHud.SetAsFirstSibling();
				((Component)HUDPatch.fracturedLegHud).gameObject.SetActive(true);
				((Component)HUDPatch.fracturedLegHud).GetComponent<Animator>().SetBool("Visible", true);
				break;
			case ConditionType.FracturedArm:
				HUDPatch.fracturedArmHud.SetAsFirstSibling();
				((Component)HUDPatch.fracturedArmHud).gameObject.SetActive(true);
				((Component)HUDPatch.fracturedArmHud).GetComponent<Animator>().SetBool("Visible", true);
				break;
			case ConditionType.Bleeding:
				HUDPatch.bleedingHud.SetAsFirstSibling();
				((Component)HUDPatch.bleedingHud).gameObject.SetActive(true);
				((Component)HUDPatch.bleedingHud).GetComponent<Animator>().SetBool("Visible", true);
				break;
			case ConditionType.Blindness:
				HUDPatch.blindnessHud.SetAsFirstSibling();
				((Component)HUDPatch.blindnessHud).gameObject.SetActive(true);
				((Component)HUDPatch.blindnessHud).GetComponent<Animator>().SetBool("Visible", true);
				break;
			case ConditionType.Concussed:
				HUDPatch.concussedHud.SetAsFirstSibling();
				((Component)HUDPatch.concussedHud).gameObject.SetActive(true);
				((Component)HUDPatch.concussedHud).GetComponent<Animator>().SetBool("Visible", true);
				break;
			}
		}
		private void HideConditionHUD(ConditionType type)
		{
			switch (type)
			{
			case ConditionType.BrokenLeg:
				((Component)HUDPatch.brokenLegHud).GetComponent<Animator>().SetBool("Visible", false);
				((MonoBehaviour)this).StartCoroutine(WaitFade(((Component)HUDPatch.brokenLegHud).GetComponent<Animator>()));
				break;
			case ConditionType.BrokenArm:
				((Component)HUDPatch.brokenArmHud).GetComponent<Animator>().SetBool("Visible", false);
				((MonoBehaviour)this).StartCoroutine(WaitFade(((Component)HUDPatch.brokenArmHud).GetComponent<Animator>()));
				break;
			case ConditionType.FracturedLeg:
				((Component)HUDPatch.fracturedLegHud).GetComponent<Animator>().SetBool("Visible", false);
				((MonoBehaviour)this).StartCoroutine(WaitFade(((Component)HUDPatch.fracturedLegHud).GetComponent<Animator>()));
				break;
			case ConditionType.FracturedArm:
				((Component)HUDPatch.fracturedArmHud).GetComponent<Animator>().SetBool("Visible", false);
				((MonoBehaviour)this).StartCoroutine(WaitFade(((Component)HUDPatch.fracturedArmHud).GetComponent<Animator>()));
				break;
			case ConditionType.Bleeding:
				((Component)HUDPatch.bleedingHud).GetComponent<Animator>().SetBool("Visible", false);
				((MonoBehaviour)this).StartCoroutine(WaitFade(((Component)HUDPatch.bleedingHud).GetComponent<Animator>()));
				break;
			case ConditionType.Blindness:
				((Component)HUDPatch.blindnessHud).GetComponent<Animator>().SetBool("Visible", false);
				((MonoBehaviour)this).StartCoroutine(WaitFade(((Component)HUDPatch.blindnessHud).GetComponent<Animator>()));
				break;
			case ConditionType.Concussed:
				((Component)HUDPatch.concussedHud).GetComponent<Animator>().SetBool("Visible", false);
				((MonoBehaviour)this).StartCoroutine(WaitFade(((Component)HUDPatch.concussedHud).GetComponent<Animator>()));
				break;
			}
		}
		[ServerRpc]
		public void RemoveConditionServerRpc(ConditionType type)
		{
			RemoveConditionClientRpc(type);
		}
		[ClientRpc]
		public void RemoveConditionClientRpc(ConditionType type)
		{
			if (!HasCondition(type))
			{
				return;
			}
			conditions.Remove(conditions.Where((Condition x) => x.type == type).ToArray()[0]);
			if (((NetworkBehaviour)this).IsOwner)
			{
				HideConditionHUD(type);
				switch (type)
				{
				case ConditionType.Blindness:
					blindnessIntensity = 0f;
					break;
				case ConditionType.Concussed:
					concussedIntensity = 0f;
					break;
				}
			}
			Plugin.mls.LogDebug((object)("Player '" + player.playerUsername + "' lost the condition: " + type.ToString() + "."));
		}
		private bool HasCondition(ConditionType type)
		{
			return conditions.Any((Condition x) => x.type == type);
		}
		public IEnumerator WaitFade(Animator anim)
		{
			yield return (object)new WaitUntil((Func<bool>)delegate
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				AnimatorStateInfo currentAnimatorStateInfo = anim.GetCurrentAnimatorStateInfo(1);
				return ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).normalizedTime >= 1f;
			});
			((Component)anim).gameObject.SetActive(false);
		}
	}
	public class Condition
	{
		public float startTime;
		public float duration;
		public ConditionType type;
	}
	public enum ConditionType
	{
		BrokenLeg,
		BrokenArm,
		FracturedLeg,
		FracturedArm,
		Bleeding,
		Blindness,
		Concussed
	}
	public enum OtherDamageType
	{
		Gaz
	}
}