Decompiled source of Knight Templar v1.1.4

plugins/TemplarItems/TemplarItems.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using Alexandria.ItemAPI;
using Alexandria.Misc;
using Alexandria.VisualAPI;
using BepInEx;
using Dungeonator;
using Gungeon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Mod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Mod")]
[assembly: AssemblyCopyright("Copyright ©  2020")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("d6d7a494-722e-4763-959b-c2d6b6a42b01")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 TemplarItems
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("darius.etg.templaritems", "Templar Items", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public const string GUID = "darius.etg.templaritems";

		public const string NAME = "Templar Items";

		public const string VERSION = "1.0.0";

		public const string TEXT_COLOR = "#00FFFF";

		private Harmony _harmony;

		public void Start()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			try
			{
				_harmony = new Harmony("darius.etg.templaritems");
				_harmony.PatchAll();
			}
			catch (Exception ex)
			{
				Log("Harmony patching failed: " + ex.Message, "#FF0000");
			}
			ETGModMainBehaviour.WaitForGameManagerStart((Action<GameManager>)GMStart);
		}

		public void GMStart(GameManager g)
		{
			TemplarArmor.Register();
			TemplarHelmet.Register();
			TemplarRosary.Register();
			ReinforcedPauldrons.Register();
			TemplarArmorSynergies.RegisterAll();
			Log("Templar Items v1.0.0 started successfully.", "#00FFFF");
		}

		public static void Log(string text, string color = "#FFFFFF")
		{
			ETGModConsole.Log((object)("<color=" + color + ">" + text + "</color>"), false);
		}
	}
	public class ReinforcedPauldrons : PassiveItem
	{
		private const float BaseChance = 0.15f;

		private const float ArmoredChance = 0.25f;

		private PlayerController _subscribedPlayer;

		public static void Register()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			string text = "Reinforced Pauldrons";
			string text2 = "TemplarItems/Resources/ReinforcedPauldronsSprite";
			GameObject val = new GameObject(text);
			ReinforcedPauldrons reinforcedPauldrons = val.AddComponent<ReinforcedPauldrons>();
			ItemBuilder.AddSpriteToObject(text, text2, val, (Assembly)null);
			string text3 = "Proper Protection";
			string text4 = "15% chances of not taking damage upon being hit, 25% if you have armor.\n\nA set of decorated steel pauldrons to protect your shoulders.\nYou cant properly aim a gun if your shoulders are wounded you know?";
			ItemBuilder.SetupItem((PickupObject)(object)reinforcedPauldrons, text3, text4, "tkc");
			((PickupObject)reinforcedPauldrons).quality = (ItemQuality)3;
			LootUtility.AddItemToPool(GameManager.Instance.RewardManager.ItemsLootTable, (PickupObject)(object)reinforcedPauldrons, 1f);
		}

		public override void Pickup(PlayerController player)
		{
			if (!base.m_pickedUp)
			{
				HealthHaver healthHaver = ((BraveBehaviour)player).healthHaver;
				healthHaver.ModifyDamage = (Action<HealthHaver, ModifyDamageEventArgs>)Delegate.Combine(healthHaver.ModifyDamage, new Action<HealthHaver, ModifyDamageEventArgs>(ModifyIncomingDamage));
				_subscribedPlayer = player;
				((PassiveItem)this).Pickup(player);
			}
		}

		private void ModifyIncomingDamage(HealthHaver source, ModifyDamageEventArgs args)
		{
			if ((object)args != EventArgs.Empty)
			{
				float num = ((source.Armor >= 1f) ? 0.25f : 0.15f);
				PlayerController component = ((Component)source).GetComponent<PlayerController>();
				if ((Object)(object)component != (Object)null && CustomSynergies.PlayerHasActiveSynergy(component, "Heavy Plating"))
				{
					num += 0.05f;
				}
				if (Random.value < num)
				{
					args.ModifiedDamage = 0f;
					AkSoundEngine.PostEvent("Play_OBJ_metalskin_deflect_01", ((Component)source).gameObject);
				}
			}
		}

		public override DebrisObject Drop(PlayerController player)
		{
			DebrisObject result = ((PassiveItem)this).Drop(player);
			if ((Object)(object)player != (Object)null)
			{
				HealthHaver healthHaver = ((BraveBehaviour)player).healthHaver;
				healthHaver.ModifyDamage = (Action<HealthHaver, ModifyDamageEventArgs>)Delegate.Remove(healthHaver.ModifyDamage, new Action<HealthHaver, ModifyDamageEventArgs>(ModifyIncomingDamage));
			}
			_subscribedPlayer = null;
			return result;
		}

		public override void OnDestroy()
		{
			if (base.m_pickedUp && (Object)(object)_subscribedPlayer != (Object)null)
			{
				HealthHaver healthHaver = ((BraveBehaviour)_subscribedPlayer).healthHaver;
				healthHaver.ModifyDamage = (Action<HealthHaver, ModifyDamageEventArgs>)Delegate.Remove(healthHaver.ModifyDamage, new Action<HealthHaver, ModifyDamageEventArgs>(ModifyIncomingDamage));
			}
			((PassiveItem)this).OnDestroy();
		}
	}
	public class TemplarArmor : PassiveItem
	{
		private Gun _syncedGun;

		public static int TemplarArmorId { get; private set; }

		public static void Register()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			string text = "Templar Armor";
			string text2 = "TemplarItems/Resources/TemplarArmorSprite";
			GameObject val = new GameObject(text);
			TemplarArmor templarArmor = val.AddComponent<TemplarArmor>();
			ItemBuilder.AddSpriteToObject(text, text2, val, (Assembly)null);
			string text3 = "Sanctified Steel";
			string text4 = "Despite being worn and battered this armor still provides good protection, after all, you are covered in metal.\n\nGrants immunity to enemy contact damage, and multiplies dodge roll damage by 7.Also grants a piece of armor on pickup and the steady footing of Heavy Boots.";
			ItemBuilder.SetupItem((PickupObject)(object)templarArmor, text3, text4, "tkc");
			TemplarArmorId = ((PickupObject)templarArmor).PickupObjectId;
			ItemBuilder.AddPassiveStatModifier((PickupObject)(object)templarArmor, (StatType)21, 7f, (ModifyMethod)1);
			((PickupObject)templarArmor).quality = (ItemQuality)3;
		}

		public override void Pickup(PlayerController player)
		{
			if (!base.m_pickedUp)
			{
				PlayerOverrides.SetImmuneToContactDamage(player, true, "TemplarArmor");
				if (!base.m_pickedUpThisRun)
				{
					HealthHaver healthHaver = ((BraveBehaviour)player).healthHaver;
					healthHaver.Armor += 1f;
				}
				((PassiveItem)this).Pickup(player);
			}
		}

		public override DebrisObject Drop(PlayerController player)
		{
			DebrisObject val = ((PassiveItem)this).Drop(player);
			PlayerOverrides.SetImmuneToContactDamage(player, false, "TemplarArmor");
			((PassiveItem)((Component)val).GetComponent<TemplarArmor>()).m_pickedUpThisRun = true;
			RemoveSyncedModifiers();
			if ((Object)(object)player != (Object)null && (Object)(object)player.stats != (Object)null)
			{
				player.stats.RecalculateStats(player, false, false);
			}
			return val;
		}

		public override void OnDestroy()
		{
			RemoveSyncedModifiers();
			((PassiveItem)this).OnDestroy();
		}

		private void Update()
		{
			if (!base.m_pickedUp || (Object)(object)base.m_owner == (Object)null)
			{
				return;
			}
			PlayerController owner = base.m_owner;
			Gun val = ((owner.inventory != null) ? owner.inventory.CurrentGun : null);
			if ((Object)(object)val != (Object)null && TemplarArmorSynergies.IsBowTypeGun(val) && CustomSynergies.PlayerHasActiveSynergy(owner, "A Familiar Weapon"))
			{
				if ((Object)(object)_syncedGun != (Object)(object)val)
				{
					RemoveSyncedModifiers();
					val.currentGunStatModifiers = TemplarArmorSynergies.CreateCrossbowSynergyModifiers();
					_syncedGun = val;
					owner.stats.RecalculateStats(owner, false, false);
				}
			}
			else if ((Object)(object)_syncedGun != (Object)null)
			{
				RemoveSyncedModifiers();
				owner.stats.RecalculateStats(owner, false, false);
			}
		}

		private void RemoveSyncedModifiers()
		{
			if ((Object)(object)_syncedGun != (Object)null)
			{
				_syncedGun.currentGunStatModifiers = null;
				_syncedGun = null;
			}
		}
	}
	[HarmonyPatch(typeof(PassiveItem), "IsFlagSetForCharacter")]
	internal static class TemplarArmor_GrantsHeavyBootsFooting_Patch
	{
		private static void Postfix(PlayerController player, Type flagType, ref bool __result)
		{
			if (!__result && (object)flagType == typeof(HeavyBootsItem) && !((Object)(object)player == (Object)null) && player.HasPickupID(TemplarArmor.TemplarArmorId))
			{
				__result = true;
			}
		}
	}
	public static class TemplarArmorSynergies
	{
		public const string SteadyBulwarkSynergyName = "Armored Advance";

		public const string CrossbowSynergyName = "A Familiar Weapon";

		public const string HeavyPlatingSynergyName = "Heavy Plating";

		public const float ShieldMovementFraction = 0.5f;

		private const string CustomUpClipName = "templar_shield_up";

		private const string CustomOnClipName = "templar_shield_on";

		private const string CustomIconSpritePath = "TemplarItems/Resources/TemplarShield/shield_idle_001";

		private const int ShieldOfTheMaidenId = 447;

		private static GameObject _customShieldVisualPrefab;

		internal static int OriginalIconSpriteId = -1;

		internal static int CustomIconSpriteId = -1;

		private static HashSet<int> _bowTypeGunIds;

		public static void RegisterAll()
		{
			CustomSynergies.Add("Armored Advance", new List<string> { "tkc:templar_armor", "shield_of_the_maiden" }, (List<string>)null, true);
			CustomSynergies.Add("Heavy Plating", new List<string> { "tkc:templar_armor", "tkc:reinforced_pauldrons" }, (List<string>)null, true);
			RegisterCrossbowSynergy();
			BuildCustomShieldVisualPrefab();
			BuildCustomShieldIcon();
		}

		private static void RegisterCrossbowSynergy()
		{
			List<string> list = new List<string> { "bow", "charmed_bow", "crossbow", "sticky_crossbow", "shotbow", "triple_crossbow", "crescent_crossbow", "gunbow", "wristbow", "real_cool_bow" };
			_bowTypeGunIds = new HashSet<int>();
			foreach (string item in list)
			{
				if (Game.Items.ContainsID(item))
				{
					_bowTypeGunIds.Add(Game.Items[item].PickupObjectId);
				}
			}
			AdvancedSynergyEntry val = CustomSynergies.Add("A Familiar Weapon", new List<string> { "tkc:templar_armor" }, list, true);
			if (val == null)
			{
				Plugin.Log("[A familiar weapon] Failed to register synergy.", "#FF0000");
			}
		}

		internal static bool IsBowTypeGun(Gun gun)
		{
			return (Object)(object)gun != (Object)null && _bowTypeGunIds != null && _bowTypeGunIds.Contains(((PickupObject)gun).PickupObjectId);
		}

		internal static StatModifier[] CreateCrossbowSynergyModifiers()
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//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_0020: 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)
			//IL_0028: Expected O, but got Unknown
			//IL_002a: 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)
			//IL_0031: 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_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			//IL_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_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			//IL_006d: 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_0074: 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_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			return (StatModifier[])(object)new StatModifier[4]
			{
				new StatModifier
				{
					statToBoost = (StatType)5,
					amount = 0.25f,
					modifyType = (ModifyMethod)0
				},
				new StatModifier
				{
					statToBoost = (StatType)6,
					amount = 0.5f,
					modifyType = (ModifyMethod)0
				},
				new StatModifier
				{
					statToBoost = (StatType)9,
					amount = 0.5f,
					modifyType = (ModifyMethod)0
				},
				new StatModifier
				{
					statToBoost = (StatType)2,
					amount = -0.25f,
					modifyType = (ModifyMethod)0
				}
			};
		}

		private static void BuildCustomShieldIcon()
		{
			PickupObject byId = PickupObjectDatabase.GetById(447);
			ActiveShieldItem val = (ActiveShieldItem)(object)((byId is ActiveShieldItem) ? byId : null);
			if ((Object)(object)val == (Object)null || (Object)(object)((BraveBehaviour)val).sprite == (Object)null)
			{
				Plugin.Log("[Steady Bulwark] Could not find shield prototype/sprite for icon swap.", "#FF0000");
				return;
			}
			OriginalIconSpriteId = ((BraveBehaviour)val).sprite.spriteId;
			Assembly assembly = typeof(TemplarArmorSynergies).Assembly;
			CustomIconSpriteId = SpriteBuilder.AddSpriteToCollection("TemplarItems/Resources/TemplarShield/shield_idle_001", ((BraveBehaviour)val).sprite.Collection, assembly);
			Plugin.Log("[Steady Bulwark] Custom shield icon registered.");
		}

		private static void BuildCustomShieldVisualPrefab()
		{
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: 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)
			Assembly assembly = typeof(TemplarArmorSynergies).Assembly;
			List<string> list = new List<string> { "TemplarItems/Resources/TemplarShield/shield_up_001", "TemplarItems/Resources/TemplarShield/shield_up_002", "TemplarItems/Resources/TemplarShield/shield_up_003", "TemplarItems/Resources/TemplarShield/shield_up_004", "TemplarItems/Resources/TemplarShield/shield_up_005", "TemplarItems/Resources/TemplarShield/shield_up_006" };
			List<string> spritePaths = new List<string> { "TemplarItems/Resources/TemplarShield/shield_on_001", "TemplarItems/Resources/TemplarShield/shield_on_002", "TemplarItems/Resources/TemplarShield/shield_on_003", "TemplarItems/Resources/TemplarShield/shield_on_004", "TemplarItems/Resources/TemplarShield/shield_on_005", "TemplarItems/Resources/TemplarShield/shield_on_006" };
			GameObject val = SpriteBuilder.SpriteFromResource(list[0], (GameObject)null, assembly);
			((Object)val).name = "TemplarShieldVisual";
			tk2dSpriteCollectionData val2 = SpriteBuilder.ConstructCollection(val, "TemplarShieldVisual_Collection", false);
			AnimationBuilder.AddAnimationToObject(val, val2, "templar_shield_up", list, 12, new Vector2(20f, 18f), Vector2.zero, (Anchor)4, (WrapMode)2, true);
			tk2dSprite component = val.GetComponent<tk2dSprite>();
			AddClip(val2, ((BraveBehaviour)component).spriteAnimator, "templar_shield_on", (WrapMode)0, spritePaths, 12, new Vector2(16f, 15f));
			((BraveBehaviour)component).spriteAnimator.AnimationCompleted = (Action<tk2dSpriteAnimator, tk2dSpriteAnimationClip>)Delegate.Combine(((BraveBehaviour)component).spriteAnimator.AnimationCompleted, (Action<tk2dSpriteAnimator, tk2dSpriteAnimationClip>)delegate(tk2dSpriteAnimator a, tk2dSpriteAnimationClip clip)
			{
				if (clip.name == "templar_shield_up")
				{
					a.Play("templar_shield_on");
				}
			});
			FakePrefabExtensions.MakeFakePrefab(val);
			_customShieldVisualPrefab = val;
			Plugin.Log("[Steady Bulwark] Custom shield visual prefab built.");
		}

		internal static void ShowCustomShieldVisual(PlayerController user, ActiveShieldItem shieldItem, tk2dSprite vanillaShieldSprite)
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_customShieldVisualPrefab == (Object)null) && ((BraveBehaviour)vanillaShieldSprite).renderer.enabled)
			{
				((BraveBehaviour)vanillaShieldSprite).renderer.enabled = false;
				GameObject val = Object.Instantiate<GameObject>(_customShieldVisualPrefab, ((BraveBehaviour)user).transform);
				val.transform.localPosition = new Vector3(0.5f, 0.5625f, 0f);
				val.SetActive(true);
				tk2dSprite component = val.GetComponent<tk2dSprite>();
				if ((Object)(object)((BraveBehaviour)user).sprite != (Object)null && (Object)(object)((BraveBehaviour)((BraveBehaviour)user).sprite).renderer != (Object)null && (Object)(object)((BraveBehaviour)component).renderer != (Object)null)
				{
					((BraveBehaviour)component).renderer.sortingLayerName = ((BraveBehaviour)((BraveBehaviour)user).sprite).renderer.sortingLayerName;
					((BraveBehaviour)component).renderer.sortingOrder = ((BraveBehaviour)((BraveBehaviour)user).sprite).renderer.sortingOrder;
				}
				TemplarShieldVisualCleanup templarShieldVisualCleanup = val.AddComponent<TemplarShieldVisualCleanup>();
				templarShieldVisualCleanup.ShieldItem = shieldItem;
				templarShieldVisualCleanup.VanillaSprite = vanillaShieldSprite;
				((tk2dBaseSprite)component).HeightOffGround = 1.0625f;
				((tk2dBaseSprite)component).UpdateZDepth();
				((BraveBehaviour)component).spriteAnimator.Play("templar_shield_up");
			}
		}

		private static void AddClip(tk2dSpriteCollectionData collection, tk2dSpriteAnimator animator, string clipName, WrapMode wrapMode, List<string> spritePaths, int fps, Vector2 colliderDimensions)
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: 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_00fc: 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_0103: Expected O, but got Unknown
			Assembly assembly = typeof(TemplarArmorSynergies).Assembly;
			tk2dSpriteAnimationFrame[] array = (tk2dSpriteAnimationFrame[])(object)new tk2dSpriteAnimationFrame[spritePaths.Count];
			for (int i = 0; i < spritePaths.Count; i++)
			{
				int num = SpriteBuilder.AddSpriteToCollection(spritePaths[i], collection, assembly);
				tk2dSpriteDefinition val = collection.spriteDefinitions[num];
				val.colliderVertices = (Vector3[])(object)new Vector3[2]
				{
					new Vector3(0f, 0f, 0f),
					new Vector3(colliderDimensions.x / 16f, colliderDimensions.y / 16f, 0f)
				};
				GunTools.ConstructOffsetsFromAnchor(val, (Anchor)4, (Vector2?)null, false, true);
				array[i] = new tk2dSpriteAnimationFrame
				{
					spriteId = num,
					spriteCollection = collection
				};
			}
			tk2dSpriteAnimationClip val2 = new tk2dSpriteAnimationClip
			{
				name = clipName,
				fps = fps,
				frames = array,
				wrapMode = wrapMode
			};
			int num2 = animator.Library.clips.Length;
			Array.Resize(ref animator.Library.clips, num2 + 1);
			animator.Library.clips[num2] = val2;
		}
	}
	internal class TemplarShieldVisualCleanup : MonoBehaviour
	{
		public ActiveShieldItem ShieldItem;

		public tk2dSprite VanillaSprite;

		private tk2dSprite _sprite;

		private void Awake()
		{
			_sprite = ((Component)this).GetComponent<tk2dSprite>();
		}

		private void Update()
		{
			if ((Object)(object)ShieldItem == (Object)null || !((PlayerItem)ShieldItem).IsCurrentlyActive)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
				return;
			}
			if ((Object)(object)_sprite != (Object)null)
			{
				((tk2dBaseSprite)_sprite).HeightOffGround = 1.0625f;
				((tk2dBaseSprite)_sprite).UpdateZDepth();
			}
			float num = ((PlayerItem)ShieldItem).ActivePercentage * ShieldItem.MaxShieldTime;
			bool flag = num > ShieldItem.MaxShieldTime - ShieldItem.DurationPortionToFlicker;
			if ((Object)(object)_sprite != (Object)null)
			{
				((BraveBehaviour)_sprite).renderer.enabled = !flag || num * 6f % 1f > 0.5f;
			}
		}

		private void LateUpdate()
		{
			if ((Object)(object)VanillaSprite != (Object)null && ((BraveBehaviour)VanillaSprite).renderer.enabled)
			{
				((BraveBehaviour)VanillaSprite).renderer.enabled = false;
			}
		}
	}
	[HarmonyPatch(typeof(PlayerItem), "Use")]
	internal static class TemplarArmor_SteadyBulwarkShieldSkin_Patch
	{
		private static void Postfix(PlayerItem __instance, PlayerController user)
		{
			ActiveShieldItem val = (ActiveShieldItem)(object)((__instance is ActiveShieldItem) ? __instance : null);
			if (!((Object)(object)val == (Object)null) && __instance.IsCurrentlyActive && !((Object)(object)user == (Object)null) && CustomSynergies.PlayerHasActiveSynergy(user, "Armored Advance"))
			{
				tk2dSprite value = Traverse.Create((object)__instance).Field("instanceShieldSprite").GetValue<tk2dSprite>();
				if ((Object)(object)value != (Object)null)
				{
					TemplarArmorSynergies.ShowCustomShieldVisual(user, val, value);
				}
			}
		}
	}
	[HarmonyPatch(typeof(PlayerItem), "Update")]
	internal static class TemplarArmor_SteadyBulwarkIconSwap_Patch
	{
		private static void Postfix(PlayerItem __instance)
		{
			ActiveShieldItem val = (ActiveShieldItem)(object)((__instance is ActiveShieldItem) ? __instance : null);
			if (!((Object)(object)val == (Object)null) && !((Object)(object)((BraveBehaviour)val).sprite == (Object)null) && TemplarArmorSynergies.OriginalIconSpriteId >= 0)
			{
				int num = (((Object)(object)((PlayerItem)val).LastOwner != (Object)null && CustomSynergies.PlayerHasActiveSynergy(((PlayerItem)val).LastOwner, "Armored Advance")) ? TemplarArmorSynergies.CustomIconSpriteId : TemplarArmorSynergies.OriginalIconSpriteId);
				if (((BraveBehaviour)val).sprite.spriteId != num)
				{
					((BraveBehaviour)val).sprite.SetSprite(num);
				}
			}
		}
	}
	[HarmonyPatch(typeof(ActiveShieldItem), "NoMotionModifier")]
	internal static class TemplarArmor_SteadyBulwark_Patch
	{
		private static bool Prefix(ActiveShieldItem __instance, ref Vector2 voluntaryVel, ref Vector2 involuntaryVel)
		{
			//IL_0026: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			PlayerController lastOwner = ((PlayerItem)__instance).LastOwner;
			if ((Object)(object)lastOwner != (Object)null && CustomSynergies.PlayerHasActiveSynergy(lastOwner, "Armored Advance"))
			{
				voluntaryVel *= 0.5f;
				return false;
			}
			return true;
		}
	}
	[DefaultExecutionOrder(32000)]
	public class TemplarHelmet : PlayerItem
	{
		private const string EquipClipName = "templar_helmet_equip";

		private const int EquipFrameCount = 9;

		private const int EquipFps = 12;

		private const float EquipDuration = 0.75f;

		private const string TemplarCharacterNameMarker = "PlayerTemplar";

		private static GameObject _equipVisualPrefab;

		private bool _charged = true;

		private float _lastKnownHealth;

		private PlayerController _myOwner;

		private RoomHandler _subscribedRoom;

		private bool _isEquipping;

		private bool _equipInterrupted;

		private bool _hidingTemplarSprite;

		private GameObject _currentEquipVisual;

		private List<Renderer> _hiddenRenderers = new List<Renderer>();

		public static void Register()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			string text = "Templar Helmet";
			string text2 = "TemplarItems/Resources/TemplarHelmetSprite";
			GameObject val = new GameObject(text);
			TemplarHelmet templarHelmet = val.AddComponent<TemplarHelmet>();
			ItemBuilder.AddSpriteToObject(text, text2, val, (Assembly)null);
			string text3 = "My face is my shield";
			string text4 = "Lost you helmet? Just go pick it up or the next hit is gonna hurt, I guess you could look for it after the battle is done as well.\n\nGrants 1 armor upon use (2 if Heavy Plating synergy is active). Resuable. Can be charged after clearing a room or taking damage to health.";
			ItemBuilder.SetupItem((PickupObject)(object)templarHelmet, text3, text4, "tkc");
			ItemBuilder.SetCooldownType((PlayerItem)(object)templarHelmet, (CooldownType)3, 0f);
			((PlayerItem)templarHelmet).consumable = false;
			((PickupObject)templarHelmet).quality = (ItemQuality)4;
			BuildEquipVisualPrefab();
		}

		private static void BuildEquipVisualPrefab()
		{
			//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)
			Assembly assembly = typeof(TemplarHelmet).Assembly;
			List<string> list = new List<string>();
			for (int i = 1; i <= 9; i++)
			{
				list.Add($"TemplarItems/Resources/HelmetEquip/marine_select_select_{i:000}");
			}
			GameObject val = SpriteBuilder.SpriteFromResource(list[0], (GameObject)null, assembly);
			((Object)val).name = "TemplarHelmetEquipVisual";
			tk2dSpriteCollectionData val2 = SpriteBuilder.ConstructCollection(val, "TemplarHelmetEquipVisual_Collection", false);
			AnimationBuilder.AddAnimationToObject(val, val2, "templar_helmet_equip", list, 12, new Vector2(16f, 16f), Vector2.zero, (Anchor)4, (WrapMode)2, true);
			FakePrefabExtensions.MakeFakePrefab(val);
			_equipVisualPrefab = val;
		}

		public override void Update()
		{
			((PlayerItem)this).Update();
			PlayerController val = FindCurrentOwner();
			if ((Object)(object)val != (Object)(object)_myOwner)
			{
				if ((Object)(object)_myOwner != (Object)null)
				{
					_myOwner.OnReceivedDamage -= OnPlayerReceivedDamage;
				}
				_myOwner = val;
				if ((Object)(object)_myOwner != (Object)null)
				{
					_lastKnownHealth = ((BraveBehaviour)_myOwner).healthHaver.GetCurrentHealth();
					_myOwner.OnReceivedDamage += OnPlayerReceivedDamage;
				}
			}
			RoomHandler val2 = (((Object)(object)_myOwner != (Object)null) ? _myOwner.CurrentRoom : null);
			if (val2 != _subscribedRoom)
			{
				if (_subscribedRoom != null)
				{
					RoomHandler subscribedRoom = _subscribedRoom;
					subscribedRoom.OnEnemiesCleared = (Action)Delegate.Remove(subscribedRoom.OnEnemiesCleared, new Action(OnRoomCleared));
				}
				_subscribedRoom = val2;
				if (_subscribedRoom != null)
				{
					RoomHandler subscribedRoom2 = _subscribedRoom;
					subscribedRoom2.OnEnemiesCleared = (Action)Delegate.Combine(subscribedRoom2.OnEnemiesCleared, new Action(OnRoomCleared));
				}
			}
		}

		private PlayerController FindCurrentOwner()
		{
			if ((Object)(object)GameManager.Instance == (Object)null)
			{
				return null;
			}
			PlayerController primaryPlayer = GameManager.Instance.PrimaryPlayer;
			if ((Object)(object)primaryPlayer != (Object)null && primaryPlayer.HasPickupID(((PickupObject)this).PickupObjectId))
			{
				return primaryPlayer;
			}
			PlayerController secondaryPlayer = GameManager.Instance.SecondaryPlayer;
			if ((Object)(object)secondaryPlayer != (Object)null && secondaryPlayer.HasPickupID(((PickupObject)this).PickupObjectId))
			{
				return secondaryPlayer;
			}
			return null;
		}

		public override void OnDestroy()
		{
			if ((Object)(object)_myOwner != (Object)null)
			{
				_myOwner.OnReceivedDamage -= OnPlayerReceivedDamage;
			}
			if (_subscribedRoom != null)
			{
				RoomHandler subscribedRoom = _subscribedRoom;
				subscribedRoom.OnEnemiesCleared = (Action)Delegate.Remove(subscribedRoom.OnEnemiesCleared, new Action(OnRoomCleared));
			}
			((PlayerItem)this).OnDestroy();
		}

		private void OnRoomCleared()
		{
			if ((Object)(object)_myOwner != (Object)null && ((BraveBehaviour)_myOwner).healthHaver.Armor <= 0f)
			{
				_charged = true;
			}
		}

		private void OnPlayerReceivedDamage(PlayerController player)
		{
			float currentHealth = ((BraveBehaviour)player).healthHaver.GetCurrentHealth();
			if (currentHealth < _lastKnownHealth)
			{
				_charged = true;
				if (_isEquipping)
				{
					_equipInterrupted = true;
				}
			}
			_lastKnownHealth = currentHealth;
		}

		public override bool CanBeUsed(PlayerController user)
		{
			return _charged && ((BraveBehaviour)user).healthHaver.Armor <= 0f && !_isEquipping;
		}

		public override void DoEffect(PlayerController user)
		{
			if (((PlayerItem)this).CanBeUsed(user))
			{
				((MonoBehaviour)user).StartCoroutine(HandleEquipWindup(user));
			}
		}

		private IEnumerator HandleEquipWindup(PlayerController user)
		{
			_isEquipping = true;
			_equipInterrupted = false;
			user.IsStationary = true;
			((GameActor)user).MovementModifiers += new MovementModifier(ZeroMovement);
			bool isTemplar = ((Object)((Component)user).gameObject).name.Contains("PlayerTemplar");
			_currentEquipVisual = null;
			if (isTemplar)
			{
				_hidingTemplarSprite = true;
				_currentEquipVisual = SpawnEquipVisual(user);
			}
			float elapsed = 0f;
			while (elapsed < 0.75f && !_equipInterrupted)
			{
				elapsed += BraveTime.DeltaTime;
				yield return null;
			}
			_isEquipping = false;
			_hidingTemplarSprite = false;
			user.IsStationary = false;
			((GameActor)user).MovementModifiers -= new MovementModifier(ZeroMovement);
			RestoreHiddenRenderers();
			if ((Object)(object)_currentEquipVisual != (Object)null)
			{
				Object.Destroy((Object)(object)_currentEquipVisual);
				_currentEquipVisual = null;
			}
			if (!_equipInterrupted)
			{
				AkSoundEngine.PostEvent("Play_OBJ_metalskin_activate_01", ((Component)user).gameObject);
				int armorGranted = ((!CustomSynergies.PlayerHasActiveSynergy(user, "Heavy Plating")) ? 1 : 2);
				HealthHaver healthHaver = ((BraveBehaviour)user).healthHaver;
				healthHaver.Armor += (float)armorGranted;
				_charged = false;
			}
		}

		private void ZeroMovement(ref Vector2 voluntaryVel, ref Vector2 involuntaryVel)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			voluntaryVel = Vector2.zero;
		}

		private void HideAllRenderersExceptOverlay(PlayerController user)
		{
			Renderer[] componentsInChildren = ((Component)user).GetComponentsInChildren<Renderer>();
			foreach (Renderer val in componentsInChildren)
			{
				if ((!((Object)(object)_currentEquipVisual != (Object)null) || !((Object)(object)((Component)val).gameObject == (Object)(object)_currentEquipVisual)) && !((Object)((Component)val).gameObject).name.ToLowerInvariant().Contains("shadow") && val.enabled)
				{
					val.enabled = false;
					if (!_hiddenRenderers.Contains(val))
					{
						_hiddenRenderers.Add(val);
					}
				}
			}
		}

		private void RestoreHiddenRenderers()
		{
			for (int i = 0; i < _hiddenRenderers.Count; i++)
			{
				if ((Object)(object)_hiddenRenderers[i] != (Object)null)
				{
					_hiddenRenderers[i].enabled = true;
				}
			}
			_hiddenRenderers.Clear();
		}

		private static Vector3 GetEquipVisualLocalPosition(bool flip)
		{
			//IL_0029: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			return flip ? new Vector3(0.5f, 0.8125f, 0f) : new Vector3(0.5f, 0.8125f, 0f);
		}

		private void LateUpdate()
		{
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			if (!_hidingTemplarSprite || !((Object)(object)_myOwner != (Object)null))
			{
				return;
			}
			HideAllRenderersExceptOverlay(_myOwner);
			if ((Object)(object)_currentEquipVisual != (Object)null && (Object)(object)((BraveBehaviour)_myOwner).sprite != (Object)null)
			{
				tk2dSprite component = _currentEquipVisual.GetComponent<tk2dSprite>();
				if ((Object)(object)component != (Object)null && ((tk2dBaseSprite)component).FlipX != ((BraveBehaviour)_myOwner).sprite.FlipX)
				{
					bool flip = (((tk2dBaseSprite)component).FlipX = ((BraveBehaviour)_myOwner).sprite.FlipX);
					_currentEquipVisual.transform.localPosition = GetEquipVisualLocalPosition(flip);
				}
			}
		}

		private GameObject SpawnEquipVisual(PlayerController user)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_equipVisualPrefab == (Object)null)
			{
				return null;
			}
			GameObject val = Object.Instantiate<GameObject>(_equipVisualPrefab, ((BraveBehaviour)user).transform);
			bool flag = (Object)(object)((BraveBehaviour)user).sprite != (Object)null && ((BraveBehaviour)user).sprite.FlipX;
			val.transform.localPosition = GetEquipVisualLocalPosition(flag);
			val.SetActive(true);
			tk2dSprite component = val.GetComponent<tk2dSprite>();
			((tk2dBaseSprite)component).FlipX = flag;
			if ((Object)(object)((BraveBehaviour)user).sprite != (Object)null && (Object)(object)((BraveBehaviour)((BraveBehaviour)user).sprite).renderer != (Object)null && (Object)(object)((BraveBehaviour)component).renderer != (Object)null)
			{
				((BraveBehaviour)component).renderer.sortingLayerName = ((BraveBehaviour)((BraveBehaviour)user).sprite).renderer.sortingLayerName;
				((BraveBehaviour)component).renderer.sortingOrder = ((BraveBehaviour)((BraveBehaviour)user).sprite).renderer.sortingOrder + 1;
			}
			((tk2dBaseSprite)component).HeightOffGround = 1f;
			((tk2dBaseSprite)component).UpdateZDepth();
			((BraveBehaviour)component).spriteAnimator.Play("templar_helmet_equip");
			return val;
		}
	}
	public class TemplarRosary : BlankModificationItem
	{
		public const string HolyMetalSynergyName = "Holy Metal";

		private const float NormalJammedMultiplier = 1.5f;

		private const float SynergyJammedMultiplier = 2f;

		private const float NormalBlankStunTime = 2f;

		private const float SynergyBlankStunTime = 4f;

		private PlayerController _subscribedPlayer;

		public static void Register()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Expected O, but got Unknown
			string text = "Templar's Rosary";
			string text2 = "TemplarItems/Resources/TemplarRosarySprite";
			GameObject val = new GameObject(text);
			TemplarRosary templarRosary = val.AddComponent<TemplarRosary>();
			ItemBuilder.AddSpriteToObject(text, text2, val, (Assembly)null);
			string text3 = "Holy Trinket";
			string text4 = "Increases coolness by 2, reduces curse by 2 and blanks stuns enemies for 2 seconds. Also increase damage to bosses (25%) and the jammed (50%)\n\nIt is said that certain trinkets can protect you from the wicked and the damned.\nOne thing's for sure, this looks like its worth something at least.\nThe synergy Holy Metal doubles the damage and stun effects.";
			ItemBuilder.SetupItem((PickupObject)(object)templarRosary, text3, text4, "tkc");
			ItemBuilder.AddPassiveStatModifier((PickupObject)(object)templarRosary, (StatType)18, 1f, (ModifyMethod)0);
			((BlankModificationItem)templarRosary).BlankStunTime = 2f;
			ItemBuilder.AddPassiveStatModifier((PickupObject)(object)templarRosary, (StatType)22, 0.25f, (ModifyMethod)0);
			ItemBuilder.AddPassiveStatModifier((PickupObject)(object)templarRosary, (StatType)4, 2f, (ModifyMethod)0);
			ItemBuilder.AddPassiveStatModifier((PickupObject)(object)templarRosary, (StatType)14, -2f, (ModifyMethod)0);
			((PickupObject)templarRosary).quality = (ItemQuality)3;
			LootUtility.AddItemToPool(GameManager.Instance.RewardManager.ItemsLootTable, (PickupObject)(object)templarRosary, 1f);
			CustomSynergies.Add("Holy Metal", new List<string> { "tkc:templar's_rosary", "silver_bullets" }, (List<string>)null, true)?.statModifiers.Add(new StatModifier
			{
				statToBoost = (StatType)22,
				amount = 0.25f,
				modifyType = (ModifyMethod)0
			});
		}

		public override void Pickup(PlayerController player)
		{
			if (!((PassiveItem)this).m_pickedUp)
			{
				((BlankModificationItem)this).Pickup(player);
				_subscribedPlayer = player;
				player.PostProcessProjectile += PostProcessProjectile;
				player.PostProcessBeam += PostProcessBeam;
			}
		}

		public override DebrisObject Drop(PlayerController player)
		{
			DebrisObject result = ((BlankModificationItem)this).Drop(player);
			if ((Object)(object)player != (Object)null)
			{
				player.PostProcessProjectile -= PostProcessProjectile;
				player.PostProcessBeam -= PostProcessBeam;
			}
			_subscribedPlayer = null;
			return result;
		}

		public override void OnDestroy()
		{
			if (((PassiveItem)this).m_pickedUp && (Object)(object)_subscribedPlayer != (Object)null)
			{
				_subscribedPlayer.PostProcessProjectile -= PostProcessProjectile;
				_subscribedPlayer.PostProcessBeam -= PostProcessBeam;
			}
			((BlankModificationItem)this).OnDestroy();
		}

		private void PostProcessProjectile(Projectile obj, float effectChanceScalar)
		{
			if (!((Object)(object)obj == (Object)null))
			{
				bool flag = (Object)(object)((PassiveItem)this).m_owner != (Object)null && CustomSynergies.PlayerHasActiveSynergy(((PassiveItem)this).m_owner, "Holy Metal");
				obj.BlackPhantomDamageMultiplier *= (flag ? 2f : 1.5f);
			}
		}

		private void PostProcessBeam(BeamController beam)
		{
			if ((Object)(object)beam != (Object)null && (Object)(object)((BraveBehaviour)beam).projectile != (Object)null)
			{
				PostProcessProjectile(((BraveBehaviour)beam).projectile, 1f);
			}
		}

		private void Update()
		{
			if (((PassiveItem)this).m_pickedUp && !((Object)(object)((PassiveItem)this).m_owner == (Object)null))
			{
				bool flag = CustomSynergies.PlayerHasActiveSynergy(((PassiveItem)this).m_owner, "Holy Metal");
				base.BlankStunTime = (flag ? 4f : 2f);
			}
		}
	}
}