Decompiled source of AALUND13 Armors Cards v1.0.0

plugins/AALUND13_Armors_Cards.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using AALUND13Cards.Armors.Armors;
using AALUND13Cards.Armors.Armors.Processors;
using AALUND13Cards.Armors.Cards;
using AALUND13Cards.Armors.Utils;
using AALUND13Cards.Core;
using AALUND13Cards.Core.Cards;
using AALUND13Cards.Core.Cards.Conditions;
using AALUND13Cards.Core.Extensions;
using AALUND13Cards.Core.Utils;
using BepInEx;
using HarmonyLib;
using JARL.Armor;
using JARL.Armor.Bases;
using JARL.Armor.Builtin;
using JARL.Armor.Processors;
using JARL.Armor.Utlis;
using JARL.Extensions;
using Microsoft.CodeAnalysis;
using TabInfo.Utils;
using UnboundLib;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")]
[assembly: AssemblyVersion("0.0.0.0")]
[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;
		}
	}
}
namespace AALUND13Cards.Armors
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("AALUND13.Cards.Armors", "AALUND13 Armors Cards", "1.0.0")]
	[BepInProcess("Rounds.exe")]
	internal class AAC_Armors : BaseUnityPlugin
	{
		internal const string ModId = "AALUND13.Cards.Armors";

		internal const string ModName = "AALUND13 Armors Cards";

		internal const string Version = "1.0.0";

		private static AssetBundle assets;

		private void Awake()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			assets = AssetsUtils.LoadAssetBundle("aac_armors_assets", typeof(AAC_Armors).Assembly);
			if ((Object)(object)assets != (Object)null)
			{
				new Harmony("AALUND13.Cards.Armors").PatchAll();
			}
		}

		private void Start()
		{
			if ((Object)(object)assets == (Object)null)
			{
				Unbound.BuildModal("AALUND13 Cards Error", "The mod \"AALUND13 Armors Cards\" assets failled to load, All the cards will be disable in this mod");
				throw new NullReferenceException("Failled to load \"AALUND13 Armors Cards\" assets");
			}
			ArmorTypeGetterUtils.RegiterArmorType<TitaniumArmor>("Titanium");
			ArmorTypeGetterUtils.RegiterArmorType<BattleforgedArmor>("Battleforged");
			ArmorFramework.RegisterArmorProcessor<DamageAgainstArmorPercentageProcessor>();
			ArmorFramework.RegisterArmorProcessor<ArmorDamageReductionProcessor>();
			CardResgester cardResgester = assets.LoadAsset<GameObject>("ArmorsModCards").GetComponent<CardResgester>();
			cardResgester.RegisterCards();
			AACMenu.OnMenuRegister = (Action)Delegate.Combine(AACMenu.OnMenuRegister, (Action)delegate
			{
				AACMenu.CreateModuleMenuWithReadmeGenerator("AALUND13 Armors Cards", "1.0.0", cardResgester);
			});
			if (AAC_Core.Plugins.Exists((BaseUnityPlugin plugin) => plugin.Info.Metadata.GUID == "com.willuwontu.rounds.tabinfo"))
			{
				TabinfoInterface.Setup();
			}
		}
	}
	internal class TabinfoInterface
	{
		public static void Setup()
		{
			StatCategory orCreateCategory = TabinfoInterface.GetOrCreateCategory("AA Stats", 6);
			TabInfoManager.RegisterStat(orCreateCategory, "Damage Against Armor Percentage", (Func<Player, bool>)((Player p) => GetArmorStatsFromPlayer(p).DamageAgainstArmorPercentage != 1f), (Func<Player, string>)((Player p) => $"{GetArmorStatsFromPlayer(p).DamageAgainstArmorPercentage * 100f:0}%"));
			TabInfoManager.RegisterStat(orCreateCategory, "Armor Damage Reduction", (Func<Player, bool>)((Player p) => GetArmorStatsFromPlayer(p).ArmorDamageReduction != 0f), (Func<Player, string>)((Player p) => $"{GetArmorStatsFromPlayer(p).ArmorDamageReduction * 100f:0}%"));
		}

		private static ArmorStats GetArmorStatsFromPlayer(Player player)
		{
			return CharacterDataExtensions.GetCustomStatsRegistry(player.data).GetOrCreate<ArmorStats>();
		}
	}
}
namespace AALUND13Cards.Armors.Utils
{
	public class ArmorTypeGetterUtils
	{
		private static Dictionary<string, Type> registerArmorType = new Dictionary<string, Type>();

		public static ReadOnlyDictionary<string, Type> RegisterArmorType => new ReadOnlyDictionary<string, Type>(RegisterArmorType);

		public static void RegiterArmorType<T>(string armorId) where T : ArmorBase, new()
		{
			if (registerArmorType.ContainsKey(armorId))
			{
				throw new ArgumentException("Armor with the type '" + armorId + "' already register");
			}
			ArmorFramework.RegisterArmorType<T>();
			registerArmorType.Add(armorId, typeof(T));
		}

		public static Type GetArmorType(string armorId)
		{
			return registerArmorType[armorId];
		}
	}
}
namespace AALUND13Cards.Armors.CardsEffects
{
	public class RestorationMono : MonoBehaviour
	{
		public float MnRegenCooldown;

		private bool isActive;

		private float regenAmount;

		private CharacterData data;

		private ArmorHandler armorHandler;

		private void Start()
		{
			data = ((Component)this).GetComponentInParent<CharacterData>();
			armorHandler = ((Component)this).GetComponentInParent<ArmorHandler>();
		}

		private void Update()
		{
			if (!isActive && data.health >= data.maxHealth)
			{
				regenAmount = data.healthHandler.regeneration;
				AddRegenerationAmountToAllArmors(regenAmount);
				isActive = true;
			}
			else if (isActive && data.health >= data.maxHealth && regenAmount != data.healthHandler.regeneration)
			{
				AddRegenerationAmountToAllArmors(0f - regenAmount);
				regenAmount = data.healthHandler.regeneration;
				AddRegenerationAmountToAllArmors(regenAmount);
			}
			else if (isActive && data.health < data.maxHealth)
			{
				AddRegenerationAmountToAllArmors(0f - regenAmount);
				isActive = false;
			}
		}

		private void AddRegenerationAmountToAllArmors(float regenerationAmount)
		{
			foreach (ArmorBase activeArmor in armorHandler.ActiveArmors)
			{
				if (!activeArmor.HasArmorTag("NoRestorationRegen"))
				{
					if (activeArmor.ArmorRegenCooldownSeconds < MnRegenCooldown)
					{
						activeArmor.ArmorRegenCooldownSeconds = MnRegenCooldown;
					}
					activeArmor.ArmorRegenerationRate += regenerationAmount;
				}
			}
		}
	}
}
namespace AALUND13Cards.Armors.MonoBehaviours.CardsEffects
{
	public class HealthToArmorConversion : MonoBehaviour
	{
		public float HealthToArmorConversions = 0.5f;

		private Dictionary<ArmorBase, float> armorAdded = new Dictionary<ArmorBase, float>();

		private CharacterData characterData;

		private ArmorHandler armorHandler;

		private float oldHealth;

		private int oldArmorCount;

		private void Start()
		{
			characterData = ((Component)this).GetComponentInParent<CharacterData>();
			armorHandler = ((Component)this).GetComponentInParent<ArmorHandler>();
			CharacterData obj = characterData;
			obj.maxHealth *= HealthToArmorConversions;
			CharacterData obj2 = characterData;
			obj2.health *= HealthToArmorConversions;
			oldHealth = characterData.maxHealth;
			oldArmorCount = Mathf.Max(armorHandler.ActiveArmors.Count, 1);
			UpdateArmorStats();
		}

		private void Update()
		{
			if (characterData.maxHealth != oldHealth || armorHandler.ActiveArmors.Count != oldArmorCount)
			{
				oldHealth = characterData.maxHealth;
				oldArmorCount = Mathf.Max(armorHandler.ActiveArmors.Count, 1);
				UpdateArmorStats();
			}
		}

		private void OnDestroy()
		{
			foreach (KeyValuePair<ArmorBase, float> item in armorAdded)
			{
				ArmorBase key = item.Key;
				key.MaxArmorValue -= item.Value;
				ArmorBase key2 = item.Key;
				key2.CurrentArmorValue -= item.Value;
			}
		}

		private void UpdateArmorStats()
		{
			Dictionary<ArmorBase, float> dictionary = new Dictionary<ArmorBase, float>(armorAdded);
			foreach (KeyValuePair<ArmorBase, float> item in armorAdded)
			{
				ArmorBase key = item.Key;
				key.MaxArmorValue -= item.Value;
			}
			armorAdded.Clear();
			if (armorHandler.ActiveArmors.Count == 0)
			{
				float num = characterData.maxHealth * HealthToArmorConversions * 2f;
				ArmorBase armorByType = armorHandler.GetArmorByType<DefaultArmor>();
				float num2 = num;
				if (dictionary.ContainsKey(armorByType))
				{
					num2 = num - dictionary[armorByType];
				}
				armorByType.MaxArmorValue += num;
				armorByType.CurrentArmorValue += num2;
				armorAdded[armorByType] = num;
			}
			else
			{
				float num3 = characterData.maxHealth * HealthToArmorConversions * 2f / (float)armorHandler.ActiveArmors.Count;
				foreach (ArmorBase activeArmor in armorHandler.ActiveArmors)
				{
					float num4 = num3;
					if (dictionary.ContainsKey(activeArmor))
					{
						num4 = num3 - dictionary[activeArmor];
					}
					activeArmor.MaxArmorValue += num3;
					activeArmor.CurrentArmorValue += num4;
					armorAdded[activeArmor] = num3;
				}
			}
			LoggerUtils.LogInfo($"Added armors to player with a id of {characterData.player.playerID}", false);
		}
	}
}
namespace AALUND13Cards.Armors.Cards
{
	public class ArmorStats : ICustomStats
	{
		public float DamageAgainstArmorPercentage = 1f;

		public float ArmorDamageReduction;

		public void ResetStats()
		{
			DamageAgainstArmorPercentage = 1f;
			ArmorDamageReduction = 0f;
		}
	}
}
namespace AALUND13Cards.Armors.Cards.StatModifers
{
	public class ArmorStatModifers : CustomStatModifers
	{
		[Header("Armors Stats")]
		public float ArmorDamageReduction;

		[Space(10f)]
		public string ArmorTypeId = "";

		public float ArmorHealth;

		public float ArmorHealthMultiplier = 1f;

		public float ArmorRegenRate;

		public float ArmorRegenCooldown;

		public bool RemoveArmorPirceTag;

		[Space(10f)]
		public bool OverrideArmorDamagePatchType;

		public bool PatchDoDamage;

		public bool PatchTakeDamage;

		public bool PatchTakeDamageOverTime;

		[Space(10f)]
		public ArmorReactivateType ArmorReactivateType;

		public float ArmorReactivateValue;

		[Header("Armor Pierce Stats")]
		public float ArmorPiercePercent;

		public float DamageAgainstArmorPercentage = 1f;

		public override void Apply(Player player)
		{
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: 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_018e: 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_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			ArmorStats orCreate = CharacterDataExtensions.GetCustomStatsRegistry(player.data).GetOrCreate<ArmorStats>();
			JARLCharacterDataAdditionalData additionalData = CharacterDataExtensions.GetAdditionalData(player.data);
			orCreate.ArmorDamageReduction = Mathf.Min(orCreate.ArmorDamageReduction + ArmorDamageReduction, 0.8f);
			if (!Utility.IsNullOrWhiteSpace(ArmorTypeId))
			{
				ArmorBase val = ArmorFramework.ArmorHandlers[player].Armors.First((ArmorBase x) => ((object)x).GetType() == ArmorTypeGetterUtils.GetArmorType(ArmorTypeId));
				if (val != null)
				{
					val.MaxArmorValue += ArmorHealth;
					if (AAC_Core.Plugins.Exists((BaseUnityPlugin plugin) => plugin.Info.Metadata.GUID == "Systems.R00t.AdditiveStats"))
					{
						val.MaxArmorValue += 100f * (ArmorHealthMultiplier - 1f);
					}
					else
					{
						val.MaxArmorValue *= ArmorHealthMultiplier;
					}
					val.ArmorRegenerationRate += ArmorRegenRate;
					val.ArmorRegenCooldownSeconds += ArmorRegenCooldown;
					if (ArmorReactivateValue > 0f)
					{
						val.reactivateArmorType = ArmorReactivateType;
						val.reactivateArmorValue = ArmorReactivateValue;
					}
					if (RemoveArmorPirceTag && val.HasArmorTag("CanArmorPierce"))
					{
						val.ArmorTags.Remove("CanArmorPierce");
					}
					if (OverrideArmorDamagePatchType)
					{
						val.ArmorDamagePatch = (ArmorDamagePatchType)0;
						if (PatchDoDamage)
						{
							val.ArmorDamagePatch = (ArmorDamagePatchType)(val.ArmorDamagePatch | 1);
						}
						if (PatchTakeDamage)
						{
							val.ArmorDamagePatch = (ArmorDamagePatchType)(val.ArmorDamagePatch | 2);
						}
						if (PatchTakeDamageOverTime)
						{
							val.ArmorDamagePatch = (ArmorDamagePatchType)(val.ArmorDamagePatch | 4);
						}
					}
				}
			}
			additionalData.ArmorPiercePercent = Mathf.Clamp(additionalData.ArmorPiercePercent + ArmorPiercePercent, 0f, 1f);
			orCreate.DamageAgainstArmorPercentage += DamageAgainstArmorPercentage - 1f;
		}
	}
}
namespace AALUND13Cards.Armors.Cards.Conditions
{
	public class PlayerHaveArmorCondition : CardCondition
	{
		public List<string> BlacklistedArmorTag = new List<string>();

		public override bool IsPlayerAllowedCard(Player player)
		{
			return ArmorFramework.ArmorHandlers[player].ActiveArmors.Any((ArmorBase armor) => !BlacklistedArmorTag.Any((string tag) => armor.ArmorTags.Contains(tag)));
		}
	}
}
namespace AALUND13Cards.Armors.Armors
{
	public class BattleforgedArmor : ArmorBase
	{
		public override BarColor GetBarColor()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			return new BarColor(Color.yellow * 0.6f, Color.yellow * 0.45f);
		}

		public override DamageArmorInfo OnDamage(float damage, Player DamagingPlayer, ArmorDamagePatchType? armorDamagePatchType)
		{
			//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)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			DamageArmorInfo val = ArmorUtils.ApplyDamage(base.CurrentArmorValue, damage);
			float num = base.CurrentArmorValue - val.Armor;
			base.MaxArmorValue += num * 0.1f;
			return val;
		}

		public BattleforgedArmor()
		{
			base.ArmorTags.Add("CanArmorPierce");
			base.ArmorRegenCooldownSeconds = 5f;
		}
	}
	public class TitaniumArmor : ArmorBase
	{
		public int SegmentsCount = 4;

		public float RegenThresholdPercent = 1.5f;

		private float segmentThresholdHealth;

		private Image segmentThresholdBar;

		public TitaniumArmor()
		{
			base.ArmorTags.Add("CanArmorPierce");
			base.ArmorRegenCooldownSeconds = 5f;
		}

		public override BarColor GetBarColor()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			return new BarColor(Color.magenta * 0.6f, Color.magenta * 0.45f);
		}

		public override void OnUpdate()
		{
			TryCreateArmorMinBar();
			float num = base.MaxArmorValue / (float)SegmentsCount;
			while (base.CurrentArmorValue >= segmentThresholdHealth + num * RegenThresholdPercent)
			{
				segmentThresholdHealth += num;
			}
			if ((Object)(object)segmentThresholdBar != (Object)null)
			{
				segmentThresholdBar.fillAmount = segmentThresholdHealth / base.MaxArmorValue;
			}
		}

		public override void OnRespawn()
		{
			segmentThresholdHealth = base.MaxArmorValue - base.MaxArmorValue / (float)SegmentsCount;
		}

		public override DamageArmorInfo OnDamage(float damage, Player DamagingPlayer, ArmorDamagePatchType? armorDamagePatchType)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			DamageArmorInfo val = ((ArmorBase)this).OnDamage(damage, DamagingPlayer, armorDamagePatchType);
			if (Mathf.Max(val.Armor, segmentThresholdHealth) <= segmentThresholdHealth + 0.1f && segmentThresholdHealth > 0f)
			{
				((DamageArmorInfo)(ref val))..ctor(0f, segmentThresholdHealth);
				segmentThresholdHealth = Mathf.Max(segmentThresholdHealth - base.MaxArmorValue / (float)SegmentsCount, 0f);
			}
			return val;
		}

		private void TryCreateArmorMinBar()
		{
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)segmentThresholdBar != (Object)null)
			{
				return;
			}
			Dictionary<ArmorBase, GameObject> dictionary = (Dictionary<ArmorBase, GameObject>)ExtensionMethods.GetFieldValue((object)((ArmorBase)this).ArmorHandler, "armorHealthBars");
			if (dictionary == null || !dictionary.ContainsKey((ArmorBase)(object)this))
			{
				return;
			}
			GameObject gameObject = ((Component)dictionary[(ArmorBase)(object)this].transform.Find("Healthbar(Clone)/Canvas/Image")).gameObject;
			if ((Object)(object)gameObject.transform.Find("MinArmorBar") == (Object)null)
			{
				gameObject.AddComponent<Mask>();
				GameObject obj = Object.Instantiate<GameObject>(((Component)gameObject.transform.Find("Health")).gameObject, gameObject.transform);
				((Object)obj).name = "MinArmorBar";
				obj.transform.SetAsLastSibling();
				Image component = obj.GetComponent<Image>();
				((Graphic)component).color = new Color(0.45f, 0f, 0.45f, 1f);
				component.fillAmount = segmentThresholdHealth / base.MaxArmorValue;
				segmentThresholdBar = component;
				GameObject gameObject2 = ((Component)gameObject.transform.Find("Grid")).gameObject;
				gameObject2.transform.SetAsLastSibling();
				((HorizontalOrVerticalLayoutGroup)gameObject2.GetComponent<HorizontalLayoutGroup>()).spacing = -10f;
				GameObject[] array = (GameObject[])(object)new GameObject[gameObject2.transform.childCount];
				for (int i = 0; i < gameObject2.transform.childCount; i++)
				{
					array[i] = ((Component)gameObject2.transform.GetChild(i)).gameObject;
				}
				int num = 8 - SegmentsCount;
				for (int j = 0; j < num; j++)
				{
					array[j].SetActive(false);
				}
				gameObject2.SetActive(true);
			}
			else
			{
				segmentThresholdBar = ((Component)gameObject.transform.Find("MinArmorBar")).GetComponent<Image>();
				segmentThresholdBar.fillAmount = segmentThresholdHealth / base.MaxArmorValue;
			}
		}
	}
}
namespace AALUND13Cards.Armors.Armors.Processors
{
	public class ArmorDamageReductionProcessor : ArmorProcessor
	{
		public override float BeforeArmorProcess(float remaindingDamage, float originalDamage)
		{
			if (!((ArmorProcessor)this).Armor.HasArmorTag("NoDamageReduction"))
			{
				if (CharacterDataExtensions.GetCustomStatsRegistry(((ArmorProcessor)this).HurtPlayer.data).GetOrCreate<ArmorStats>().ArmorDamageReduction == 0f)
				{
					return remaindingDamage;
				}
				return remaindingDamage * (1f - CharacterDataExtensions.GetCustomStatsRegistry(((ArmorProcessor)this).HurtPlayer.data).GetOrCreate<ArmorStats>().ArmorDamageReduction);
			}
			return remaindingDamage;
		}
	}
	internal class DamageAgainstArmorPercentageProcessor : ArmorProcessor
	{
		public override float AfterArmorProcess(float remaindingDamage, float originalDamage, float takenArmorDamage)
		{
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			if (((ArmorProcessor)this).Armor.HasArmorTag("CanArmorPierce"))
			{
				if ((Object)(object)((ArmorProcessor)this).DamagingPlayer == (Object)null || CharacterDataExtensions.GetCustomStatsRegistry(((ArmorProcessor)this).DamagingPlayer.data).GetOrCreate<ArmorStats>().DamageAgainstArmorPercentage == 1f || takenArmorDamage <= 0f)
				{
					return remaindingDamage;
				}
				DamageArmorInfo val = ((ArmorProcessor)this).Armor.OnDamage(takenArmorDamage * (CharacterDataExtensions.GetCustomStatsRegistry(((ArmorProcessor)this).DamagingPlayer.data).GetOrCreate<ArmorStats>().DamageAgainstArmorPercentage - 1f), ((ArmorProcessor)this).DamagingPlayer, (ArmorDamagePatchType?)((ArmorProcessor)this).ArmorDamagePatchType);
				((ArmorProcessor)this).Armor.CurrentArmorValue = val.Armor;
			}
			return remaindingDamage;
		}
	}
}