Decompiled source of Crimson Moons Semblance v0.0.11

BepInEx/plugins/Crimson_Moons_Semblance/CrimsonMoonsSemblance.dll

Decompiled 3 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 System.Security;
using System.Security.Permissions;
using BepInEx;
using CrimsonMoonsSemblance;
using CrimsonMoonsSemblance.Scripts;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("CrimsonMoonsSemblance")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CrimsonMoonsSemblance")]
[assembly: AssemblyTitle("CrimsonMoonsSemblance")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
[HarmonyPatch(typeof(HUDManager))]
internal class HudManagerPatch
{
	[HarmonyPostfix]
	[HarmonyPatch(typeof(HUDManager), "Update")]
	public static void Update()
	{
		try
		{
			if ((Object)(object)GameNetworkManager.Instance.localPlayerController.ItemSlots[GameNetworkManager.Instance.localPlayerController.currentItemSlot] != (Object)null)
			{
				if (GameNetworkManager.Instance.localPlayerController.ItemSlots[GameNetworkManager.Instance.localPlayerController.currentItemSlot].itemProperties.itemName == "Crimson Moon's Semblance")
				{
					float num = ((Component)GameNetworkManager.Instance.localPlayerController).GetComponent<PlayerScript>().BondOfLife;
					Plugin.meterContainer.SetActive(true);
					Plugin.meter.GetComponent<Image>().fillMethod = (FillMethod)0;
					Plugin.meter.GetComponent<Image>().fillAmount = num / 100f;
				}
				else
				{
					Plugin.meterContainer.SetActive(false);
				}
			}
			else
			{
				Plugin.meterContainer.SetActive(false);
			}
		}
		catch
		{
		}
	}
}
namespace CrimsonMoonsSemblance
{
	public class CSMInput : LcInputActions
	{
		[InputAction(/*Could not decode attribute arguments.*/)]
		public InputAction AllIsAshKey { get; set; }

		[InputAction(/*Could not decode attribute arguments.*/)]
		public InputAction BalemoonRisingKey { get; set; }
	}
	[BepInPlugin("Entity378.CrimsonMoonsSemblance", "CrimsonMoonsSemblance", "0.0.11")]
	[BepInDependency("evaisa.lethallib", "0.14.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private Harmony harmony = new Harmony("Entity378.CrimsonMoonsSemblance");

		private const string GUID = "Entity378.CrimsonMoonsSemblance";

		private const string NAME = "CrimsonMoonsSemblance";

		private const string VERSION = "0.0.11";

		public static string assetsDir;

		public static AssetBundle bundle;

		public static GameObject CrimsonMoonsSemblanceMarkPrefab;

		public static Item CrimsonMoonsSemblanceItem;

		public static GameObject meterContainer;

		public static GameObject meter;

		public static GameObject frame;

		public static GameObject warningL;

		public static GameObject warningR;

		public static CSMInput InputActionsInstance = new CSMInput();

		private void Awake()
		{
			assetsDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "crimsonmoonssemblance");
			bundle = AssetBundle.LoadFromFile(assetsDir);
			AudioClip crimsonMoonsSemblanceSwingSFX = bundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/ShovelSwing.ogg");
			AudioClip crimsonMoonsSemblanceReelUpSFX = bundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/ShovelReelUp.ogg");
			AudioClip[] crimsonMoonsSemblanceHitSFX = (AudioClip[])(object)new AudioClip[2]
			{
				bundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/ShovelHitDefault.ogg"),
				bundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/ShovelHitDefault.ogg")
			};
			CrimsonMoonsSemblanceItem = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/CrimsonMoonsSemblanceItem.asset");
			CrimsonMoonsSemblanceMarkPrefab = bundle.LoadAsset<GameObject>("Assets/LethalCompany/Mods/CrimsonMoonsSemblanceMark.prefab");
			CrimsonMoonsSemblanceScript crimsonMoonsSemblanceScript = CrimsonMoonsSemblanceItem.spawnPrefab.AddComponent<CrimsonMoonsSemblanceScript>();
			CrimsonMoonsSemblanceMarkPrefab.AddComponent<MarkScript>();
			((Component)CrimsonMoonsSemblanceMarkPrefab.transform.Find("CrimsonMoonsSemblanceMarkIcon")).gameObject.AddComponent<RotateMarkScript>();
			((GrabbableObject)crimsonMoonsSemblanceScript).itemProperties = CrimsonMoonsSemblanceItem;
			crimsonMoonsSemblanceScript.CrimsonMoonsSemblanceSwingSFX = crimsonMoonsSemblanceSwingSFX;
			crimsonMoonsSemblanceScript.CrimsonMoonsSemblanceReelUpSFX = crimsonMoonsSemblanceReelUpSFX;
			crimsonMoonsSemblanceScript.CrimsonMoonsSemblanceHitSFX = crimsonMoonsSemblanceHitSFX;
			NetworkPrefabs.RegisterNetworkPrefab(CrimsonMoonsSemblanceItem.spawnPrefab);
			Utilities.FixMixerGroups(CrimsonMoonsSemblanceItem.spawnPrefab);
			Items.RegisterScrap(CrimsonMoonsSemblanceItem, 10, (LevelTypes)(-1));
			Items.RegisterShopItem(CrimsonMoonsSemblanceItem, 60);
			harmony.PatchAll();
			SceneManager.sceneLoaded += OnSceneRelayLoaded;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"CMS: Loaded!");
		}

		private void OnSceneRelayLoaded(Scene scene, LoadSceneMode loadMode)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
			if (((Scene)(ref scene)).name == "SampleSceneRelay")
			{
				GameObject val = GameObject.Find("IngamePlayerHUD");
				meterContainer = new GameObject("BondOfLifeMeterContainer");
				meterContainer.AddComponent<CanvasGroup>();
				RectTransform val2 = meterContainer.AddComponent<RectTransform>();
				((Transform)val2).parent = val.transform;
				((Transform)val2).localScale = Vector3.one;
				val2.anchoredPosition = Vector2.zero;
				((Transform)val2).localPosition = Vector2.op_Implicit(new Vector2(0f, -235f));
				val2.sizeDelta = Vector2.one;
				meter = AddImageToHUD("BoL-MeterFull", scene);
				frame = AddImageToHUD("BoL-MeterEmpty", scene);
				warningL = AddImageToHUD("BoL-Icon", scene);
				warningR = AddImageToHUD("BoL-Icon", scene);
				GameObject[] array = (GameObject[])(object)new GameObject[4] { meter, frame, warningL, warningR };
				GameObject[] array2 = array;
				foreach (GameObject val3 in array2)
				{
					val3.transform.parent = meterContainer.transform;
					val3.transform.localPosition = Vector2.op_Implicit(Vector2.zero);
				}
				meter.GetComponent<Image>().type = (Type)3;
				meter.GetComponent<Image>().fillMethod = (FillMethod)1;
				Transform transform = warningL.transform;
				transform.localPosition += new Vector3(-115f, 0f);
				Transform transform2 = warningR.transform;
				transform2.localPosition += new Vector3(115f, 0f);
			}
		}

		private GameObject AddImageToHUD(string imageName, Scene scene)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_0024: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00a3: Unknown result type (might be due to invalid IL or missing references)
			Sprite val = bundle.LoadAsset<Sprite>("Assets/LethalCompany/Mods/" + imageName + ".png");
			GameObject val2 = new GameObject(imageName);
			SceneManager.MoveGameObjectToScene(val2, scene);
			GameObject val3 = GameObject.Find("IngamePlayerHUD");
			RectTransform val4 = val2.AddComponent<RectTransform>();
			((Transform)val4).parent = val3.transform;
			((Transform)val4).localScale = Vector2.op_Implicit(Vector2.one);
			val4.anchoredPosition = Vector2.zero;
			((Transform)val4).localPosition = Vector2.op_Implicit(Vector2.zero);
			Rect rect = val.rect;
			float num = ((Rect)(ref rect)).width / 2.5f;
			rect = val.rect;
			val4.sizeDelta = new Vector2(num, ((Rect)(ref rect)).height / 2.5f);
			Image val5 = val2.AddComponent<Image>();
			val5.sprite = val;
			CanvasRenderer val6 = val2.AddComponent<CanvasRenderer>();
			return val2;
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "CrimsonMoonsSemblance";

		public const string PLUGIN_NAME = "CrimsonMoonsSemblance";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace CrimsonMoonsSemblance.Scripts
{
	internal class CrimsonMoonsSemblanceScript : Shovel
	{
		public AudioClip[] CrimsonMoonsSemblanceHitSFX;

		public AudioClip CrimsonMoonsSemblanceSwingSFX;

		public AudioClip CrimsonMoonsSemblanceReelUpSFX;

		public List<EnemyAI> enemyList = new List<EnemyAI>();

		public override void Start()
		{
			((GrabbableObject)this).isInFactory = true;
			((GrabbableObject)this).grabbable = true;
			((GrabbableObject)this).grabbableToEnemies = false;
			((GrabbableObject)this).mainObjectRenderer = ((Component)this).GetComponent<MeshRenderer>();
			base.reelUp = CrimsonMoonsSemblanceReelUpSFX;
			base.swing = CrimsonMoonsSemblanceSwingSFX;
			base.shovelAudio = ((Component)this).GetComponent<AudioSource>();
			base.shovelHitForce = 1;
			base.hitSFX = CrimsonMoonsSemblanceHitSFX;
			((GrabbableObject)this).Start();
		}

		public override void SetControlTipsForItem()
		{
			HUDManager.Instance.ChangeControlTipMultiple(((GrabbableObject)this).itemProperties.toolTips, false, ((GrabbableObject)this).itemProperties);
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((Shovel)this).ItemActivate(used, buttonDown);
		}

		public override void EquipItem()
		{
			((GrabbableObject)this).EquipItem();
			PlayerScript component = ((Component)((GrabbableObject)this).playerHeldBy).GetComponent<PlayerScript>();
			component.UpdateHUD();
		}

		public override void GrabItem()
		{
			((GrabbableObject)this).GrabItem();
			PlayerScript component = ((Component)((GrabbableObject)this).playerHeldBy).GetComponent<PlayerScript>();
			component.BondDamage(component.BondOfLife, ((GrabbableObject)this).playerHeldBy);
			base.shovelHitForce = component.BondOfLife / 10 + 1;
			component.EmebrefireCheck();
			component.PassiveUltGainStatus = true;
			((MonoBehaviour)this).StartCoroutine(component.PassiveUltGain());
			component.UpdateHUD();
		}

		public override void DiscardItem()
		{
			PlayerScript component = ((Component)((GrabbableObject)this).playerHeldBy).GetComponent<PlayerScript>();
			component.BondHeal(component.BondOfLife, ((GrabbableObject)this).playerHeldBy);
			component.PassiveUltGainStatus = false;
			base.shovelHitForce = 1;
			component.EmebrefireCheck();
			((Shovel)this).DiscardItem();
		}

		public override void Update()
		{
			((GrabbableObject)this).Update();
			if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null && (Object)(object)((GrabbableObject)this).playerHeldBy.ItemSlots[((GrabbableObject)this).playerHeldBy.currentItemSlot] != (Object)null && ((GrabbableObject)this).playerHeldBy.ItemSlots[((GrabbableObject)this).playerHeldBy.currentItemSlot].itemProperties.itemName == "Crimson Moon's Semblance" && !((GrabbableObject)this).playerHeldBy.isGrabbingObjectAnimation && !((GrabbableObject)this).playerHeldBy.isTypingChat && !((GrabbableObject)this).playerHeldBy.inTerminalMenu && !((GrabbableObject)this).playerHeldBy.inSpecialInteractAnimation && (Object)(object)((GrabbableObject)this).playerHeldBy.hoveringOverTrigger == (Object)null)
			{
				SetupKeyCallbacks();
			}
			else
			{
				StopKeyCallbacks();
			}
		}

		public void SetupKeyCallbacks()
		{
			Plugin.InputActionsInstance.AllIsAshKey.performed += UseAllIsAsh;
			Plugin.InputActionsInstance.BalemoonRisingKey.performed += UseBalemoonRising;
		}

		public void StopKeyCallbacks()
		{
			Plugin.InputActionsInstance.AllIsAshKey.performed -= UseAllIsAsh;
			Plugin.InputActionsInstance.BalemoonRisingKey.performed -= UseBalemoonRising;
		}

		public void UseAllIsAsh(CallbackContext AllIsAshContext)
		{
			//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_003e: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
			if (!((CallbackContext)(ref AllIsAshContext)).performed)
			{
				return;
			}
			PlayerScript component = ((Component)((GrabbableObject)this).playerHeldBy).GetComponent<PlayerScript>();
			Vector3 position = ((Component)this).transform.position;
			int i = 0;
			if (!component.CanMark)
			{
				return;
			}
			for (Collider[] array = Physics.OverlapSphere(position, component.RangeE); i < array.Length; i++)
			{
				EnemyAI componentInParent = ((Component)array[i]).gameObject.GetComponentInParent<EnemyAI>();
				if ((Object)(object)componentInParent != (Object)null && !componentInParent.isEnemyDead && !enemyList.Contains(componentInParent))
				{
					enemyList.Add(componentInParent);
					Debug.Log((object)("CMS: Enemy " + ((Object)componentInParent).name + " has been hitted with All Is Ash!"));
					componentInParent.HitEnemyOnLocalClient(0, default(Vector3), ((GrabbableObject)this).playerHeldBy, true, -2);
				}
			}
			((MonoBehaviour)this).StartCoroutine(component.MarkCooldownE());
			enemyList.Clear();
		}

		public void UseBalemoonRising(CallbackContext BalemoonRisingContext)
		{
			//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_004d: 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_00d8: Unknown result type (might be due to invalid IL or missing references)
			if (!((CallbackContext)(ref BalemoonRisingContext)).performed)
			{
				return;
			}
			PlayerScript component = ((Component)((GrabbableObject)this).playerHeldBy).GetComponent<PlayerScript>();
			Vector3 position = ((Component)this).transform.position;
			int i = 0;
			if (!component.UltOffCooldown || component.UltEnergy != 100)
			{
				return;
			}
			for (Collider[] array = Physics.OverlapSphere(position, component.RangeQ); i < array.Length; i++)
			{
				EnemyAI componentInParent = ((Component)array[i]).gameObject.GetComponentInParent<EnemyAI>();
				if ((Object)(object)componentInParent != (Object)null && !componentInParent.isEnemyDead && !enemyList.Contains(componentInParent))
				{
					enemyList.Add(componentInParent);
					Debug.Log((object)("CMS: Enemy " + ((Object)componentInParent).name + " has been hitted with Balemoon Rising!"));
					componentInParent.HitEnemyOnLocalClient(1, default(Vector3), ((GrabbableObject)this).playerHeldBy, true, -3);
				}
			}
			component.UltHeal();
			((MonoBehaviour)this).StartCoroutine(component.MarkCooldownQ());
			enemyList.Clear();
		}
	}
	internal class MarkScript : MonoBehaviour
	{
		public bool AlreadyStarted = true;

		public bool RemoveMark = false;

		private void Update()
		{
			if (!AlreadyStarted)
			{
				AlreadyStarted = true;
				((MonoBehaviour)this).StartCoroutine(MarkDuration(((Component)this).gameObject));
			}
			if (RemoveMark)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}

		private static IEnumerator MarkDuration(GameObject gameObject)
		{
			yield return (object)new WaitForSeconds(30f);
			try
			{
				Object.Destroy((Object)(object)gameObject);
			}
			catch
			{
				Debug.Log((object)"CMS: The mark has already been removed");
			}
		}
	}
	internal class PlayerScript : MonoBehaviour
	{
		public int BondOfLife = 0;

		public int UltEnergy = 0;

		public bool CanMark = true;

		public bool UltOffCooldown = true;

		public bool ResetE = false;

		public bool Emberfire = false;

		public bool EmberfireGrace = false;

		public bool EmberfireGraceUsed = false;

		public int CurrentCooldownE = 0;

		public int CurrentCooldownQ = 0;

		public float RangeE = 7.5f;

		public float RangeQ = 10f;

		public int BondOfLifeIncrease = 20;

		public int BondOfLifeDecrease = 10;

		public int CooldownE = 30;

		public int CooldownQ = 15;

		public int UltGain = 12;

		public bool PassiveUltGainStatus = false;

		public int PassiveUltGainValue = 1;

		public int PassiveUltGainIntervall = 21;

		public string AllIsAshKey;

		public string BalemoonRisingKey;

		private PlayerControllerB Player;

		private void Start()
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			SetInputString();
		}

		public void EmebrefireCheck()
		{
			if (EmberfireGraceUsed)
			{
				Debug.Log((object)"CMS: Emberfire immortality effect is active");
			}
			else if (BondOfLife == 100)
			{
				Emberfire = true;
				EmberfireGrace = true;
				Debug.Log((object)"CMS: Emberfire is active");
			}
			else
			{
				Emberfire = false;
				EmberfireGrace = false;
				Debug.Log((object)"CMS: Emberfire is not active");
			}
		}

		public void UpdateDMG(PlayerControllerB currentPlayer)
		{
			if ((Object)(object)currentPlayer.ItemSlots[currentPlayer.currentItemSlot] != (Object)null)
			{
				Item itemProperties = currentPlayer.ItemSlots[currentPlayer.currentItemSlot].itemProperties;
				if (itemProperties.itemName == "Crimson Moon's Semblance")
				{
					Shovel component = ((Component)currentPlayer.ItemSlots[currentPlayer.currentItemSlot]).GetComponent<Shovel>();
					component.shovelHitForce = BondOfLife / 10 + 1;
					Debug.Log((object)("CMS: Weapon DMG = " + component.shovelHitForce));
					EmebrefireCheck();
				}
			}
		}

		public void SetBondOfLife(int bondOfLife)
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			if (((NetworkBehaviour)Player).IsOwner)
			{
				BondOfLife = Mathf.Clamp(bondOfLife, 0, 100);
				Debug.Log((object)("CMS: Applying Bond Of Life, Current Bond Of Life = " + BondOfLife));
				BondDamage(bondOfLife, Player);
				UpdateDMG(Player);
			}
		}

		public void AddBondOfLife(int bondOfLifeIncrease)
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			BondOfLife = Mathf.Clamp(BondOfLife + bondOfLifeIncrease, 0, 100);
			Debug.Log((object)("CMS: Applying Bond Of Life, Current Bond Of Life = " + BondOfLife));
			BondDamage(bondOfLifeIncrease, Player);
			UpdateDMG(Player);
		}

		public void RemoveBondOfLife(int bondOfLifeDecrease)
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			BondOfLife = Mathf.Clamp(BondOfLife - bondOfLifeDecrease, 0, 100);
			Debug.Log((object)("CMS: Removing Bond Of Life, Current Bond Of Life = " + BondOfLife));
			BondHeal(bondOfLifeDecrease, Player);
			UpdateDMG(Player);
		}

		public void BondDamage(int health, PlayerControllerB currentPlayer)
		{
			currentPlayer.health = Mathf.Clamp(currentPlayer.health - health, 1, 100);
			Debug.Log((object)("CMS: Player Health = " + currentPlayer.health));
			HUDManager.Instance.selfRedCanvasGroup.alpha = (float)(100 - Player.health) / 100f;
			if (((NetworkBehaviour)currentPlayer).IsServer)
			{
				currentPlayer.DamagePlayerClientRpc(0, currentPlayer.health);
			}
			else
			{
				currentPlayer.DamagePlayerServerRpc(0, currentPlayer.health);
			}
		}

		public void BondHeal(int health, PlayerControllerB currentPlayer)
		{
			currentPlayer.health = Mathf.Clamp(currentPlayer.health + health, 1, 100);
			Debug.Log((object)("CMS: Player Health = " + currentPlayer.health));
			HUDManager.Instance.selfRedCanvasGroup.alpha = (float)(100 - currentPlayer.health) / 100f;
			if (((NetworkBehaviour)currentPlayer).IsServer)
			{
				currentPlayer.DamagePlayerClientRpc(0, currentPlayer.health);
			}
			else
			{
				currentPlayer.DamagePlayerServerRpc(0, currentPlayer.health);
			}
		}

		public void AddUltProgress(int ultGain)
		{
			UltEnergy = Mathf.Clamp(UltEnergy + ultGain, 0, 100);
			if (UltEnergy == 100)
			{
				UltOffCooldown = true;
			}
			UpdateHUD();
			Debug.Log((object)("CMS: Balemoon Rising Energy = " + UltEnergy));
		}

		public void UltHeal()
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			Player.health = (int)Mathf.Clamp((float)Player.health + (float)BondOfLife * 1.5f, 1f, 100f);
			BondOfLife = 0;
			Debug.Log((object)("CMS: Removing Bond Of Life, Current Bond Of Life = " + BondOfLife));
			Debug.Log((object)("CMS: Player Health = " + Player.health));
			HUDManager.Instance.selfRedCanvasGroup.alpha = (float)(100 - Player.health) / 100f;
			if (((NetworkBehaviour)Player).IsServer)
			{
				Player.DamagePlayerClientRpc(0, Player.health);
			}
			else
			{
				Player.DamagePlayerServerRpc(0, Player.health);
			}
			UpdateDMG(Player);
		}

		public void UpdateHUD()
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			if (!((NetworkBehaviour)Player).IsOwner || !((Object)(object)Player.ItemSlots[Player.currentItemSlot] != (Object)null))
			{
				return;
			}
			Item itemProperties = Player.ItemSlots[Player.currentItemSlot].itemProperties;
			if (itemProperties.itemName == "Crimson Moon's Semblance")
			{
				SetInputString();
				itemProperties.toolTips[0] = "All Is Ash: [" + AllIsAshKey + "]";
				if (CurrentCooldownE != 0)
				{
					itemProperties.toolTips[1] = "[" + AllIsAshKey + "] Cooldown : " + CurrentCooldownE;
					HUDManager.Instance.ChangeControlTipMultiple(itemProperties.toolTips, false, itemProperties);
				}
				else
				{
					itemProperties.toolTips[1] = "[" + AllIsAshKey + "] Cooldown : Ready";
					HUDManager.Instance.ChangeControlTipMultiple(itemProperties.toolTips, false, itemProperties);
				}
				itemProperties.toolTips[2] = "Balemoon Rising: [" + BalemoonRisingKey + "]";
				if (CurrentCooldownQ != 0)
				{
					itemProperties.toolTips[3] = "[" + BalemoonRisingKey + "] Cooldown : " + CurrentCooldownQ;
					HUDManager.Instance.ChangeControlTipMultiple(itemProperties.toolTips, false, itemProperties);
				}
				else if (UltEnergy != 100)
				{
					itemProperties.toolTips[3] = "[" + BalemoonRisingKey + "] Energy : " + UltEnergy + "% (Not Ready)";
					HUDManager.Instance.ChangeControlTipMultiple(itemProperties.toolTips, false, itemProperties);
				}
				else
				{
					itemProperties.toolTips[3] = "[" + BalemoonRisingKey + "] Energy : " + UltEnergy + "% (Ready)";
					HUDManager.Instance.ChangeControlTipMultiple(itemProperties.toolTips, false, itemProperties);
				}
			}
		}

		public void SetInputString()
		{
			AllIsAshKey = InputActionRebindingExtensions.GetBindingDisplayString(Plugin.InputActionsInstance.AllIsAshKey, (DisplayStringOptions)0, (string)null);
			BalemoonRisingKey = InputActionRebindingExtensions.GetBindingDisplayString(Plugin.InputActionsInstance.BalemoonRisingKey, (DisplayStringOptions)0, (string)null);
			AllIsAshKey = AllIsAshKey.Substring(0, AllIsAshKey.IndexOf(" |"));
			BalemoonRisingKey = BalemoonRisingKey.Substring(0, BalemoonRisingKey.IndexOf(" |"));
		}

		public IEnumerator PassiveUltGain()
		{
			while (PassiveUltGainStatus)
			{
				yield return (object)new WaitForSeconds((float)PassiveUltGainIntervall);
				AddUltProgress(PassiveUltGainValue);
				Debug.Log((object)("CMS: Passively gained " + PassiveUltGainValue + " energy for Balemoon Rising"));
			}
		}

		public IEnumerator ActivateEmeberfireGrace(bool hitted = false)
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			if (EmberfireGraceUsed)
			{
				yield break;
			}
			Debug.Log((object)"CMS: Emberfire immortality effect has been activated");
			EmberfireGraceUsed = true;
			yield return (object)new WaitForSeconds(3f);
			if (hitted)
			{
				BondOfLife = 40;
				Player.health = Mathf.Clamp(Player.health - BondOfLife, 1, 100);
				HUDManager.Instance.selfRedCanvasGroup.alpha = (float)(100 - Player.health) / 100f;
				if (((NetworkBehaviour)Player).IsServer)
				{
					Player.DamagePlayerClientRpc(0, Player.health);
				}
				else
				{
					Player.DamagePlayerServerRpc(0, Player.health);
				}
			}
			EmberfireGraceUsed = false;
			Debug.Log((object)"CMS: Emberfire immortality effect has been disabled");
			EmebrefireCheck();
			UpdateDMG(Player);
		}

		public IEnumerator MarkCooldownE()
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			if (((NetworkBehaviour)Player).IsOwner)
			{
				CanMark = false;
				CurrentCooldownE = CooldownE;
				UpdateHUD();
				while (CurrentCooldownE > 0 && !ResetE)
				{
					yield return (object)new WaitForSeconds(1f);
					CurrentCooldownE--;
					UpdateHUD();
				}
				UpdateHUD();
				CanMark = true;
			}
		}

		public IEnumerator MarkCooldownQ()
		{
			Player = ((Component)this).GetComponent<PlayerControllerB>();
			if (((NetworkBehaviour)Player).IsOwner)
			{
				UltOffCooldown = false;
				ResetE = true;
				CanMark = true;
				UltEnergy = 0;
				CurrentCooldownQ = CooldownQ;
				UpdateHUD();
				while (CurrentCooldownQ > 0)
				{
					yield return (object)new WaitForSeconds(1f);
					CurrentCooldownQ--;
					UpdateHUD();
				}
				UpdateHUD();
				UltOffCooldown = true;
				ResetE = false;
			}
		}
	}
	internal class RotateMarkScript : MonoBehaviour
	{
		private void LateUpdate()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.LookAt(((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.position, Vector3.up);
		}
	}
}
namespace CrimsonMoonsSemblance.Patch
{
	[HarmonyPatch(typeof(EnemyAI))]
	internal class EnemyAIPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("HitEnemy")]
		private static void HitEnemyPatch(ref EnemyAI __instance, PlayerControllerB playerWhoHit, int hitID)
		{
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: 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)
			if (!((Object)(object)__instance != (Object)null) || !((Object)(object)playerWhoHit != (Object)null) || !((Object)(object)playerWhoHit == (Object)(object)StartOfRound.Instance.localPlayerController) || !((Object)(object)playerWhoHit.ItemSlots[playerWhoHit.currentItemSlot] != (Object)null))
			{
				return;
			}
			GrabbableObject val = playerWhoHit.ItemSlots[playerWhoHit.currentItemSlot];
			PlayerScript component = ((Component)playerWhoHit).GetComponent<PlayerScript>();
			if (!(val.itemProperties.itemName == "Crimson Moon's Semblance") || __instance.isEnemyDead)
			{
				return;
			}
			if (component.Emberfire)
			{
				if (hitID == -2)
				{
					Debug.Log((object)"CMS: Emberfire used on the enemy damaged by All Is Ash");
					component.AddBondOfLife(component.BondOfLifeIncrease);
				}
				else if (Object.op_Implicit((Object)(object)((Component)__instance).transform.Find("CrimsonMoonsSemblanceMark(Clone)")))
				{
					Debug.Log((object)"CMS: Emberfire used on the enemy damaged by an Attack with Mark");
					component.AddBondOfLife(component.BondOfLifeIncrease);
				}
				else if (component.BondOfLife >= 0)
				{
					Debug.Log((object)"CMS: Emberfire used on the enemy damaged by an Attack whitout Mark");
					component.RemoveBondOfLife(component.BondOfLifeDecrease);
				}
				((MonoBehaviour)__instance).StartCoroutine(component.ActivateEmeberfireGrace());
				KillEnemyCMS(__instance);
			}
			else
			{
				switch (hitID)
				{
				case -2:
					if (Object.op_Implicit((Object)(object)((Component)__instance).transform.Find("CrimsonMoonsSemblanceMark(Clone)")))
					{
						Debug.Log((object)"CMS: Mark found on the enemy after damaging him with All Is Ash");
						((Component)((Component)__instance).transform.Find("CrimsonMoonsSemblanceMark(Clone)")).GetComponent<MarkScript>().RemoveMark = true;
						GameObject val2 = Object.Instantiate<GameObject>(Plugin.CrimsonMoonsSemblanceMarkPrefab, ((Component)__instance).transform.position, Quaternion.Euler(0f, 0f, 0f));
						val2.transform.parent = ((Component)((Component)__instance).GetComponent<EnemyAI>()).transform;
					}
					else
					{
						Debug.Log((object)"CMS: Mark not found on enemy after damaging him with All Is Ash");
						GameObject val3 = Object.Instantiate<GameObject>(Plugin.CrimsonMoonsSemblanceMarkPrefab, ((Component)__instance).transform.position, Quaternion.Euler(0f, 0f, 0f));
						val3.transform.parent = ((Component)((Component)__instance).GetComponent<EnemyAI>()).transform;
					}
					break;
				default:
					if (Object.op_Implicit((Object)(object)((Component)__instance).transform.Find("CrimsonMoonsSemblanceMark(Clone)")))
					{
						Debug.Log((object)"CMS: Mark found on the enemy after damaging him with a Normal Attack");
						((Component)((Component)__instance).transform.Find("CrimsonMoonsSemblanceMark(Clone)")).GetComponent<MarkScript>().RemoveMark = true;
						component.AddBondOfLife(component.BondOfLifeIncrease);
					}
					else if (component.BondOfLife > 0)
					{
						Debug.Log((object)"CMS: Mark not found on enemy after damaging him with a Normal Attack");
						component.RemoveBondOfLife(component.BondOfLifeDecrease);
					}
					break;
				case -3:
					break;
				}
			}
			if (hitID != -3)
			{
				component.AddUltProgress(component.UltGain);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("KillEnemy")]
		private static void KillEnemyPatch(EnemyAI __instance)
		{
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Invalid comparison between Unknown and I4
			try
			{
				((Component)((Component)__instance).transform.Find("CrimsonMoonsSemblanceMark(Clone)")).GetComponent<MarkScript>().RemoveMark = true;
			}
			catch
			{
				Debug.Log((object)"CMS: Mark not found on the killed enemy");
			}
			if (!((Object)(object)__instance.creatureAnimator != (Object)null))
			{
				return;
			}
			AnimatorControllerParameter[] parameters = __instance.creatureAnimator.parameters;
			foreach (AnimatorControllerParameter val in parameters)
			{
				if ((int)val.type == 4)
				{
					__instance.creatureAnimator.SetBool(val.name, false);
				}
			}
			try
			{
				__instance.creatureAnimator.SetTrigger("KillEnemy");
				__instance.creatureAnimator.SetBool("Dead", true);
			}
			catch
			{
				Debug.Log((object)"CMS: creatureAnimator.SetBool() not found");
			}
			__instance.creatureSFX.Stop();
			__instance.creatureVoice.Stop();
		}

		private static void KillEnemyCMS(EnemyAI enemy)
		{
			Debug.Log((object)("Kill enemy called! destroy: " + enemy.enemyType.destroyOnDeath));
			if (enemy.enemyType.destroyOnDeath)
			{
				if (((NetworkBehaviour)enemy).IsServer)
				{
					Debug.Log((object)"Kill enemy called on server, destroy true");
					enemy.KillEnemy(true);
				}
				else
				{
					enemy.KillEnemyServerRpc(true);
				}
			}
			else
			{
				enemy.KillEnemy(false);
				if (((NetworkBehaviour)enemy).NetworkObject.IsSpawned)
				{
					enemy.KillEnemyServerRpc(false);
				}
			}
		}
	}
	[HarmonyPatch(typeof(IngamePlayerSettings))]
	internal class IngamePlayerSettingsPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("SaveChangedSettings")]
		private static void SaveChangedSettingsPatch()
		{
			try
			{
				((Component)StartOfRound.Instance.localPlayerController).GetComponent<PlayerScript>().UpdateHUD();
			}
			catch
			{
				Debug.Log((object)"CMS: Saving changed settings in the Main Menu");
			}
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerControllerBPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("AllowPlayerDeath")]
		private static bool AllowPlayerDeathPatch(ref PlayerControllerB __instance)
		{
			PlayerScript component = ((Component)__instance).GetComponent<PlayerScript>();
			if (component.EmberfireGrace && !component.EmberfireGraceUsed)
			{
				((MonoBehaviour)__instance).StartCoroutine(component.ActivateEmeberfireGrace(hitted: true));
				return false;
			}
			if (component.EmberfireGraceUsed)
			{
				return false;
			}
			if (!StartOfRound.Instance.allowLocalPlayerDeath)
			{
				return false;
			}
			if ((Object)(object)__instance.playersManager.testRoom == (Object)null)
			{
				if (StartOfRound.Instance.timeSinceRoundStarted < 2f)
				{
					return false;
				}
				if (!__instance.playersManager.shipDoorsEnabled)
				{
					return false;
				}
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void StartPatch()
		{
			List<PlayerControllerB> list = (from PlayerControllerB e in Resources.FindObjectsOfTypeAll(typeof(PlayerControllerB))
				where (Object)(object)e != (Object)null
				select e).ToList();
			foreach (PlayerControllerB item in list)
			{
				if ((Object)(object)((Component)item).GetComponent<PlayerScript>() == (Object)null)
				{
					((Component)item).gameObject.AddComponent<PlayerScript>();
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("ReviveDeadPlayers")]
		public static void ReviveDeadPlayersPatch()
		{
			List<PlayerControllerB> list = (from PlayerControllerB e in Resources.FindObjectsOfTypeAll(typeof(PlayerControllerB))
				where (Object)(object)e != (Object)null
				select e).ToList();
			foreach (PlayerControllerB item in list)
			{
				if (!((Object)(object)((Component)item).GetComponent<PlayerScript>() != (Object)null) || !((Object)(object)item == (Object)(object)StartOfRound.Instance.localPlayerController))
				{
					continue;
				}
				GrabbableObject[] itemSlots = item.ItemSlots;
				foreach (GrabbableObject val in itemSlots)
				{
					if ((Object)(object)val != (Object)null && val.itemProperties.itemName == "Crimson Moon's Semblance")
					{
						PlayerScript component = ((Component)item).gameObject.GetComponent<PlayerScript>();
						component.SetBondOfLife(component.BondOfLife);
					}
				}
			}
		}
	}
}