Decompiled source of RelicKeeper v1.1.1

plugins/BaseDamageModifiers.dll

Decompiled a day ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace BaseDamageModifiers;

[BepInPlugin("com.ehaugw.basedamagemodifiers", "BaseDamageModifiers", "1.0.0")]
public class BaseDamageModifiers : BaseUnityPlugin
{
	public delegate void WeaponDamageModifier(Weapon weapon, DamageList original, ref DamageList result);

	public delegate void WeaponImpactModifier(Weapon weapon, float original, ref float result);

	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public class Weapon_BaseImpact
	{
		[HarmonyPostfix]
		public static void Postfix(Weapon __instance, ref float __result)
		{
			float original = __result;
			WeaponImpactModifiers(__instance, original, ref __result);
		}
	}

	[HarmonyPatch(typeof(WeaponStats), "GetAttackImpact")]
	public class WeaponStats_GetAttackImpact
	{
		[HarmonyPostfix]
		public static void Postfix(WeaponStats __instance, int _attackID, ref float __result, Item ___m_item)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//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_005d: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			Weapon val = (Weapon)___m_item;
			WeaponType val2 = val.Type;
			object obj;
			if (val == null)
			{
				obj = null;
			}
			else
			{
				Character ownerCharacter = ((EffectSynchronizer)val).OwnerCharacter;
				obj = ((ownerCharacter != null) ? ownerCharacter.Animator : null);
			}
			Animator val3 = (Animator)obj;
			if (val3 != null && UnityEngineExtensions.HasParameter(val3, "WeaponType"))
			{
				val2 = (WeaponType)val3.GetInteger("WeaponType");
			}
			float num = 1f;
			if (WeaponStatData.WeaponBaseDataDict.Keys.Contains(val2))
			{
				float[] impactMult = WeaponStatData.WeaponBaseDataDict[val2].ImpactMult;
				if (_attackID < 0 || _attackID >= impactMult.Length)
				{
					_attackID = 0;
				}
				num = impactMult[_attackID];
			}
			__result = val.Impact * num;
		}
	}

	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public class Weapon_Damage
	{
		[HarmonyPostfix]
		public static void Postfix(Weapon __instance, ref DamageList __result)
		{
			DamageList original = __result.Clone();
			__result = __result.Clone();
			WeaponDamageModifiers(__instance, original, ref __result);
		}
	}

	[HarmonyPatch(typeof(WeaponStats), "GetAttackDamage")]
	public class WeaponStats_GetAttackDamage
	{
		[HarmonyPostfix]
		public static void Postfix(WeaponStats __instance, int _attackID, ref IList<float> __result, Item ___m_item)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//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_0069: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			Weapon val = (Weapon)___m_item;
			WeaponType val2 = val.Type;
			object obj;
			if (val == null)
			{
				obj = null;
			}
			else
			{
				Character ownerCharacter = ((EffectSynchronizer)val).OwnerCharacter;
				obj = ((ownerCharacter != null) ? ownerCharacter.Animator : null);
			}
			Animator val3 = (Animator)obj;
			if (val3 != null && UnityEngineExtensions.HasParameter(val3, "WeaponType"))
			{
				val2 = (WeaponType)val3.GetInteger("WeaponType");
			}
			float[] array = new float[5] { 1f, 1f, 1f, 1f, 1f };
			if (WeaponStatData.WeaponBaseDataDict.Keys.Contains(val2))
			{
				array = WeaponStatData.WeaponBaseDataDict[val2].DamageMult;
			}
			if (_attackID < 0 || _attackID >= array.Length)
			{
				_attackID = 0;
			}
			DamageList damage = val.Damage;
			for (int i = 0; i < damage.Count && i < __result.Count; i++)
			{
				__result[i] = damage[i].Damage * array[_attackID];
			}
		}
	}

	public const string GUID = "com.ehaugw.basedamagemodifiers";

	public const string VERSION = "1.0.0";

	public const string NAME = "BaseDamageModifiers";

	public static WeaponDamageModifier WeaponDamageModifiers = delegate
	{
	};

	public static WeaponImpactModifier WeaponImpactModifiers = delegate
	{
	};

	internal void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		Harmony val = new Harmony("com.ehaugw.basedamagemodifiers");
		val.PatchAll();
	}
}
public class WeaponStatData
{
	public static Dictionary<WeaponType, WeaponStatData> WeaponBaseDataDict = new Dictionary<WeaponType, WeaponStatData>
	{
		{
			(WeaponType)0,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.495f, 1.265f, 1.265f },
				ImpactMult = new float[5] { 1f, 1f, 1.3f, 1.1f, 1.1f },
				StamMult = new float[5] { 1f, 1f, 1.2f, 1.1f, 1.1f }
			}
		},
		{
			(WeaponType)51,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.5f, 1.265f, 1.265f },
				ImpactMult = new float[5] { 1f, 1f, 1.5f, 1.1f, 1.1f },
				StamMult = new float[5] { 1f, 1f, 1.3f, 1.1f, 1.1f }
			}
		},
		{
			(WeaponType)1,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f },
				ImpactMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f },
				StamMult = new float[5] { 1f, 1f, 1.2f, 1.2f, 1.2f }
			}
		},
		{
			(WeaponType)52,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f },
				ImpactMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f },
				StamMult = new float[5] { 1f, 1f, 1.375f, 1.375f, 1.35f }
			}
		},
		{
			(WeaponType)2,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f },
				ImpactMult = new float[5] { 1f, 1f, 2.5f, 1.3f, 1.3f },
				StamMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f }
			}
		},
		{
			(WeaponType)53,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 0.75f, 1.4f, 1.4f },
				ImpactMult = new float[5] { 1f, 1f, 2f, 1.4f, 1.4f },
				StamMult = new float[5] { 1f, 1f, 1.2f, 1.2f, 1.2f }
			}
		},
		{
			(WeaponType)50,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.7f },
				ImpactMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.7f },
				StamMult = new float[5] { 1f, 1f, 1.25f, 1.25f, 1.75f }
			}
		},
		{
			(WeaponType)54,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.4f, 1.3f, 1.2f },
				ImpactMult = new float[5] { 1f, 1f, 1.2f, 1.2f, 1.1f },
				StamMult = new float[5] { 1f, 1f, 1.25f, 1.25f, 1.25f }
			}
		},
		{
			(WeaponType)55,
			new WeaponStatData
			{
				DamageMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f },
				ImpactMult = new float[5] { 1f, 1f, 1.3f, 1.3f, 1.3f },
				StamMult = new float[5] { 1f, 1f, 1.3f, 1.2f, 1.2f }
			}
		}
	};

	public float[] DamageMult;

	public float[] ImpactMult;

	public float[] StamMult;
}

plugins/EffectSourceConditions.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using TinyHelper;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace EffectSourceConditions;

public class DynamicSkillStat : MonoBehaviour
{
	public delegate void ManaCostModifier(Skill skill, float original, ref float result);

	public float ManaCost = 0f;

	public float StaminaCost = 0f;

	public float HealthCost = 0f;

	public float Cooldown = 2f;

	public float DurabilityCost = 0f;

	public SpellCastType CastType = (SpellCastType)(-1);

	public SpellCastModifier CastModifier = (SpellCastModifier)(-1);

	public float MobileCastMovementMult = -1f;

	public int CastSheatheRequired = 0;

	public bool CastLocomotionEnabled = false;

	public static ManaCostModifier ManaCostModifiers = delegate
	{
	};

	public void SetSkillStats(Skill skill)
	{
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		float result = ManaCost;
		ManaCostModifiers(skill, ManaCost, ref result);
		skill.ManaCost = Mathf.Round(result);
		skill.StaminaCost = StaminaCost;
		skill.HealthCost = HealthCost;
		skill.DurabilityCost = DurabilityCost;
		((Item)skill).CastSheathRequired = CastSheatheRequired;
		((Item)skill).MobileCastMovementMult = MobileCastMovementMult;
		((Item)skill).CastModifier = CastModifier;
		((Item)skill).CastLocomotionEnabled = CastLocomotionEnabled;
		if (((Item)skill).ActivateEffectAnimType != CastType)
		{
			At.SetValue<SpellCastType>(CastType, typeof(Item), (object)skill, "m_activateEffectAnimType");
		}
		if (!skill.InCooldown())
		{
			skill.Cooldown = Cooldown;
		}
	}

	public static void UnsetSkillStats(Skill skill)
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Invalid comparison between Unknown and I4
		skill.ManaCost = 0f;
		skill.StaminaCost = 0f;
		skill.HealthCost = 0f;
		skill.DurabilityCost = 0f;
		((Item)skill).CastSheathRequired = 0;
		((Item)skill).MobileCastMovementMult = -1f;
		((Item)skill).CastModifier = (SpellCastModifier)0;
		((Item)skill).CastLocomotionEnabled = false;
		if ((int)((Item)skill).ActivateEffectAnimType != -1)
		{
			At.SetValue<SpellCastType>((SpellCastType)(-1), typeof(Item), (object)skill, "m_activateEffectAnimType");
		}
		if (!skill.InCooldown())
		{
			skill.Cooldown = 0f;
		}
	}

	public static void TryUpdateSkillStats(Skill skill)
	{
		DynamicSkillStat[] componentsInChildren = ((Component)skill).gameObject.GetComponentsInChildren<DynamicSkillStat>();
		if (componentsInChildren == null || componentsInChildren.Length == 0)
		{
			return;
		}
		bool flag = false;
		DynamicSkillStat[] array = componentsInChildren;
		foreach (DynamicSkillStat dynamicSkillStat in array)
		{
			Character ownerCharacter = ((EffectSynchronizer)skill).OwnerCharacter;
			if (ownerCharacter == null)
			{
				continue;
			}
			SourceCondition[] components = ((Component)dynamicSkillStat).gameObject.GetComponents<SourceCondition>();
			if (components == null)
			{
				continue;
			}
			bool flag2 = true;
			SourceCondition[] array2 = components;
			foreach (SourceCondition sourceCondition in array2)
			{
				if (!sourceCondition.CharacterHasRequirement(ownerCharacter))
				{
					flag2 = false;
				}
			}
			if (flag2 && components.Length != 0)
			{
				dynamicSkillStat.SetSkillStats(skill);
				flag = true;
			}
		}
		if (!flag)
		{
			UnsetSkillStats(skill);
		}
	}
}
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
public class Item_Description
{
	[HarmonyPrefix]
	public static void Prefix(Item __instance)
	{
		Skill val = (Skill)(object)((__instance is Skill) ? __instance : null);
		if (val != null)
		{
			DynamicSkillStat.TryUpdateSkillStats(val);
		}
	}
}
[HarmonyPatch(typeof(Skill), "HasBaseRequirements")]
public class Skill_HasBaseRequirements
{
	[HarmonyPrefix]
	public static void Prefix(Skill __instance)
	{
		DynamicSkillStat.TryUpdateSkillStats(__instance);
	}
}
[BepInPlugin("com.ehaugw.effectsourceconditions", "Effect Source Conditions", "2.8.0")]
public class EffectSourceConditions : BaseUnityPlugin
{
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public class WeaponDamage_BuildDamage
	{
		[HarmonyPrefix]
		public static bool Prefix(Effect __instance, Character _targetCharacter, ref DamageList _list, ref float _knockback)
		{
			return HasSourceConditions(__instance);
		}
	}

	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public class PunctualDamage_BuildDamage
	{
		[HarmonyPrefix]
		public static bool Prefix(Effect __instance, Character _targetCharacter, ref DamageList _list, ref float _knockback)
		{
			return HasSourceConditions(__instance);
		}
	}

	[HarmonyPatch(typeof(Effect), "TryTriggerConditions", new Type[]
	{
		typeof(Character),
		typeof(bool)
	})]
	public class Effect_TryTriggerConditions
	{
		[HarmonyPrefix]
		public static bool Prefix(Effect __instance, Character _affectedCharacter, bool _skipPriority)
		{
			return HasSourceConditions(__instance);
		}
	}

	public const string GUID = "com.ehaugw.effectsourceconditions";

	public const string VERSION = "2.8.0";

	public const string NAME = "Effect Source Conditions";

	public const string EFFECTS_CONTAINER_ACTIVATION = "ActivationEffects";

	public const string EFFECTS_CONTAINER = "Effects";

	public const string SOURCE_CONDITION_CONTAINER = "SourceConditions";

	public const string EFFECTS_MANUAL_CONTAINER = "ManualContainer";

	internal void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		Harmony val = new Harmony("com.ehaugw.effectsourceconditions");
		val.PatchAll();
	}

	public static bool HasSourceConditions(Effect __instance)
	{
		object obj;
		if (__instance == null)
		{
			obj = null;
		}
		else
		{
			Transform transform = ((Component)__instance).transform;
			if (transform == null)
			{
				obj = null;
			}
			else
			{
				Transform obj2 = transform.Find("SourceConditions");
				if (obj2 == null)
				{
					obj = null;
				}
				else
				{
					GameObject gameObject = ((Component)obj2).gameObject;
					obj = ((gameObject != null) ? gameObject.GetComponents<SourceCondition>() : null);
				}
			}
		}
		if (obj == null)
		{
			obj = new SourceCondition[0];
		}
		SourceCondition[] array = (SourceCondition[])obj;
		foreach (SourceCondition sourceCondition in array)
		{
			if (!sourceCondition.CharacterHasRequirement(__instance.SourceCharacter))
			{
				return false;
			}
		}
		return true;
	}
}
public class EffectSourceConditionChecker : EffectCondition
{
	protected override bool CheckIsValid(Character _affectedCharacter)
	{
		Transform transform = ((Component)this).transform;
		object obj;
		if (transform == null)
		{
			obj = null;
		}
		else
		{
			Transform parent = transform.parent;
			if (parent == null)
			{
				obj = null;
			}
			else
			{
				Transform parent2 = parent.parent;
				obj = ((parent2 != null) ? UnityEngineExtensions.FindAllInAllChildren(parent2, "ActivationEffects") : null);
			}
		}
		Transform[] array = (Transform[])obj;
		if (array != null)
		{
			Transform[] array2 = array;
			foreach (Transform val in array2)
			{
				bool flag = true;
				SourceCondition[] componentsInChildren = ((Component)val).GetComponentsInChildren<SourceCondition>();
				SourceCondition[] array3 = componentsInChildren;
				foreach (SourceCondition sourceCondition in array3)
				{
					if (!sourceCondition.CharacterHasRequirement(_affectedCharacter))
					{
						flag = false;
					}
				}
				if (flag && componentsInChildren.Count() > 0)
				{
					return !base.Invert;
				}
			}
		}
		return base.Invert;
	}

	public static ActivationCondition AddToSkill(Skill skill)
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Expected O, but got Unknown
		Transform orMake = TinyGameObjectManager.GetOrMake(((Component)skill).transform, "AdditionalActivationConditions", true, true);
		GameObject gameObject = ((Component)TinyGameObjectManager.GetOrMake(orMake, "EffectSourceConditionChecker", true, true)).gameObject;
		ActivationCondition val = new ActivationCondition();
		EffectSourceConditionChecker condition = gameObject.AddComponent<EffectSourceConditionChecker>();
		val.Condition = (EffectCondition)(object)condition;
		At.SetValue<string>("This would have no effect.", typeof(ActivationCondition), (object)val, "m_defaultMessage");
		List<ActivationCondition> list = (At.GetValue(typeof(Skill), (object)skill, "m_additionalConditions") as ActivationCondition[])?.ToList() ?? new List<ActivationCondition>();
		list.Add(val);
		At.SetValue<ActivationCondition[]>(list.ToArray(), typeof(Skill), (object)skill, "m_additionalConditions");
		return val;
	}
}
public abstract class SourceCondition : MonoBehaviour
{
	public abstract bool CharacterHasRequirement(Character character);
}
public class SourceConditionItemInInventory : SourceCondition
{
	public int RequiredItemID;

	public int Amount = 1;

	public bool Inverted = false;

	public override bool CharacterHasRequirement(Character character)
	{
		int result;
		if (RequiredItemID != 0)
		{
			int? obj;
			if (character == null)
			{
				obj = null;
			}
			else
			{
				CharacterInventory inventory = character.Inventory;
				obj = ((inventory != null) ? new int?(inventory.ItemCount(RequiredItemID)) : null);
			}
			int? num = obj;
			result = (((num.GetValueOrDefault() > 0) ^ Inverted) ? 1 : 0);
		}
		else
		{
			result = 1;
		}
		return (byte)result != 0;
	}
}
public class SourceConditionEquipment : SourceCondition
{
	public int RequiredItemID;

	public int RequiredEnchantID;

	public bool Inverted = false;

	public override bool CharacterHasRequirement(Character character)
	{
		object obj;
		if (character == null)
		{
			obj = null;
		}
		else
		{
			CharacterInventory inventory = character.Inventory;
			obj = ((inventory != null) ? inventory.Equipment : null);
		}
		CharacterEquipment val = (CharacterEquipment)obj;
		if (val != null)
		{
			foreach (EquipmentSlot item in val.EquipmentSlots.Where((EquipmentSlot s) => (Object)(object)s != (Object)null && (Object)(object)s.EquippedItem != (Object)null))
			{
				bool flag = RequiredItemID == 0 || ((Item)item.EquippedItem).ItemID == RequiredItemID;
				bool flag2 = RequiredEnchantID == 0 || item.EquippedItem.ActiveEnchantmentIDs.Contains(RequiredEnchantID);
				if (flag && flag2)
				{
					return !Inverted;
				}
			}
		}
		return Inverted;
	}
}
public class SourceConditionCorruption : SourceCondition
{
	public float Corruption = 0f;

	public bool Inverted = false;

	public override bool CharacterHasRequirement(Character character)
	{
		float? obj;
		if (character == null)
		{
			obj = null;
		}
		else
		{
			PlayerCharacterStats playerStats = character.PlayerStats;
			obj = ((playerStats != null) ? new float?(playerStats.Corruption) : null);
		}
		float? num = obj;
		return (num.GetValueOrDefault() >= Corruption) ^ Inverted;
	}
}
public class SourceConditionMana : SourceCondition
{
	public float ManaCost = 0f;

	public bool Inverted = false;

	public override bool CharacterHasRequirement(Character character)
	{
		return (ManaCost <= 0f || character.Mana >= character.Stats.GetFinalManaConsumption((Tag[])null, ManaCost)) ^ Inverted;
	}
}
public class SourceConditionQuestLocal : SourceCondition
{
	public int[] Quests;

	public bool Inverted = false;

	public LogicType Logic = (LogicType)0;

	public override bool CharacterHasRequirement(Character character)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		return QuestRequirements.HasQuestKnowledgeLocal(character, Quests, Logic, Inverted, false);
	}
}
public class SourceConditionQuest : SourceCondition
{
	public int[] Quests;

	public bool Inverted = false;

	public LogicType Logic = (LogicType)0;

	public override bool CharacterHasRequirement(Character character)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		return QuestRequirements.HasQuestKnowledge(character, Quests, Logic, Inverted, false);
	}
}
public class SourceConditionStatusEffect : SourceCondition
{
	public string statusEffectName;

	public bool Inverted = false;

	public StatusEffect RequiredStatusEffect
	{
		get
		{
			return ResourcesPrefabManager.Instance.GetStatusEffectPrefab(statusEffectName);
		}
		set
		{
			statusEffectName = value.IdentifierName;
		}
	}

	public override bool CharacterHasRequirement(Character character)
	{
		int num;
		if (statusEffectName != null)
		{
			bool? obj;
			if (character == null)
			{
				obj = null;
			}
			else
			{
				StatusEffectManager statusEffectMngr = character.StatusEffectMngr;
				obj = ((statusEffectMngr != null) ? new bool?(statusEffectMngr.HasStatusEffect(statusEffectName)) : null);
			}
			bool? flag = obj;
			num = (flag.GetValueOrDefault() ? 1 : 0);
		}
		else
		{
			num = 0;
		}
		return (byte)((uint)num ^ (Inverted ? 1u : 0u)) != 0;
	}
}
public class SourceConditionSkill : SourceCondition
{
	public int RequiredSkillID;

	public bool Inverted = false;

	public Item RequiredSkill
	{
		get
		{
			return ResourcesPrefabManager.Instance.GetItemPrefab(RequiredSkillID);
		}
		set
		{
			RequiredSkillID = value.ItemID;
		}
	}

	public override bool CharacterHasRequirement(Character character)
	{
		int result;
		if (RequiredSkillID != 0)
		{
			bool? obj;
			if (character == null)
			{
				obj = null;
			}
			else
			{
				CharacterInventory inventory = character.Inventory;
				if (inventory == null)
				{
					obj = null;
				}
				else
				{
					CharacterSkillKnowledge skillKnowledge = inventory.SkillKnowledge;
					obj = ((skillKnowledge != null) ? new bool?(((CharacterKnowledge)skillKnowledge).IsItemLearned(RequiredSkillID)) : null);
				}
			}
			bool? flag = obj;
			result = ((flag.GetValueOrDefault() ^ Inverted) ? 1 : 0);
		}
		else
		{
			result = 1;
		}
		return (byte)result != 0;
	}
}

plugins/RelicCondition.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using CharacterExtensions;
using EffectSourceConditions;
using TinyHelper;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace RelicCondition;

[BepInPlugin("com.ehaugw.reliccondition", "RelicCondition", "1.1.1")]
public class RelicCondition : BaseUnityPlugin
{
	public const string GUID = "com.ehaugw.reliccondition";

	public const string VERSION = "1.1.1";

	public const string NAME = "RelicCondition";

	public const string RelicLoreLevel1Name = "Relic Lore";

	public const string RelicLoreLevel2Name = "Mythic Lore";

	internal void Awake()
	{
	}

	public static Equipment HasRelicEquippedOrOnBackpack(Character character, int RequiredItemID = 0, int RequiredEnchantID = 0)
	{
		object obj;
		if (character == null)
		{
			obj = null;
		}
		else
		{
			CharacterInventory inventory = character.Inventory;
			obj = ((inventory != null) ? inventory.Equipment : null);
		}
		CharacterEquipment val = (CharacterEquipment)obj;
		if (val != null)
		{
			List<Equipment> second = (from s in val.EquipmentSlots
				where (Object)(object)s != (Object)null && (Object)(object)s.EquippedItem != (Object)null
				select s.EquippedItem).ToList();
			foreach (Item item in CharacterExtensions.EquippedOnBag(character).Union((IEnumerable<Item>)second))
			{
				bool flag = RequiredItemID == 0 || item.ItemID == RequiredItemID;
				int num;
				if (RequiredEnchantID != 0)
				{
					Equipment val2 = (Equipment)(object)((item is Equipment) ? item : null);
					num = ((val2 != null && val2.ActiveEnchantmentIDs.Contains(RequiredEnchantID)) ? 1 : 0);
				}
				else
				{
					num = 1;
				}
				bool flag2 = (byte)num != 0;
				if (flag && flag2)
				{
					return (Equipment)(object)((item is Equipment) ? item : null);
				}
			}
		}
		return null;
	}

	public static bool HasArcaneInfluence(Character character)
	{
		bool? obj;
		if (character == null)
		{
			obj = null;
		}
		else
		{
			CharacterInventory inventory = character.Inventory;
			if (inventory == null)
			{
				obj = null;
			}
			else
			{
				CharacterSkillKnowledge skillKnowledge = inventory.SkillKnowledge;
				obj = ((skillKnowledge != null) ? new bool?(((CharacterKnowledge)skillKnowledge).IsItemLearned(2502529)) : null);
			}
		}
		bool? flag = obj;
		return flag.GetValueOrDefault();
	}
}
public class RelicConditionBuilder
{
	public Transform EffectsContainer;

	public Transform ActivationEffectsContainer;

	public RelicConditionBuilder(Skill skill)
	{
		EffectsContainer = TinyGameObjectManager.MakeFreshObject("Effects", true, true, ((Component)skill).transform).transform;
		ActivationEffectsContainer = TinyGameObjectManager.MakeFreshObject("ActivationEffects", true, true, ((Component)skill).transform).transform;
	}

	public unsafe static RelicConditionBuilder Apply(Skill skill, int requiredItem, string description, float manaCost = 0f, float cooldown = 2f, float staminaCost = 0f, float healthCost = 0f, float durabilityCost = 0f, SpellCastType? castType = null, SpellCastModifier? castModifier = null, float? mobileCastMovementMult = null, int? castSheatheRequired = null, bool? castLocomotionEnabled = null, int requiredEnchant = 0, int relicLevel = 0)
	{
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Expected O, but got Unknown
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Expected O, but got Unknown
		//IL_0178: Unknown result type (might be due to invalid IL or missing references)
		//IL_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_017d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_027d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f0->IL01f0: Incompatible stack types: O vs I4
		//IL_01e9->IL01f0: Incompatible stack types: I4 vs O
		//IL_01e9->IL01f0: Incompatible stack types: O vs I4
		if (((Item)skill).ItemID != 2502525)
		{
			TinyHelper.OnDescriptionModified = (DescriptionModifier)Delegate.Combine((Delegate?)(object)TinyHelper.OnDescriptionModified, (Delegate?)(DescriptionModifier)delegate(Item item, ref string existingDescription)
			{
				if (SkillRequirements.SafeHasSkillKnowledge((item != null) ? ((EffectSynchronizer)item).OwnerCharacter : null, 2502532) && (requiredItem == 0 || requiredItem == item.ItemID))
				{
					if (requiredEnchant != 0)
					{
						Equipment val5 = (Equipment)(object)((item is Equipment) ? item : null);
						if (val5 == null || !val5.ActiveEnchantmentIDs.Contains(requiredEnchant))
						{
							return;
						}
					}
					if ((existingDescription ?? "") != "")
					{
						existingDescription += "\n\n";
					}
					string text = "";
					switch (relicLevel)
					{
					case 1:
						text = " (Relic Lore)";
						break;
					case 2:
						text = " (Mythic Lore)";
						break;
					}
					existingDescription = existingDescription + ((Item)skill).Name + text + ": " + description;
				}
			});
		}
		RelicConditionBuilder relicConditionBuilder = new RelicConditionBuilder(skill);
		Transform orMake = TinyGameObjectManager.GetOrMake(((Component)relicConditionBuilder.EffectsContainer).transform, "SourceConditions", true, true);
		SourceConditionEquipment val = ((Component)orMake).gameObject.AddComponent<SourceConditionEquipment>();
		val.RequiredItemID = requiredItem;
		val.RequiredEnchantID = requiredEnchant;
		SourceConditionRelicLevel sourceConditionRelicLevel = ((Component)orMake).gameObject.AddComponent<SourceConditionRelicLevel>();
		sourceConditionRelicLevel.relicLevel = relicLevel;
		orMake = TinyGameObjectManager.GetOrMake(((Component)relicConditionBuilder.ActivationEffectsContainer).transform, "SourceConditions", true, true);
		val = ((Component)orMake).gameObject.AddComponent<SourceConditionEquipment>();
		val.RequiredItemID = requiredItem;
		val.RequiredEnchantID = requiredEnchant;
		sourceConditionRelicLevel = ((Component)orMake).gameObject.AddComponent<SourceConditionRelicLevel>();
		sourceConditionRelicLevel.relicLevel = relicLevel;
		DynamicSkillStat val2 = ((Component)orMake).gameObject.AddComponent<DynamicSkillStat>();
		val2.ManaCost = manaCost;
		val2.HealthCost = healthCost;
		val2.StaminaCost = staminaCost;
		val2.Cooldown = cooldown;
		val2.DurabilityCost = durabilityCost;
		val2.CastType = (SpellCastType)(((??)castType) ?? ((Item)skill).ActivateEffectAnimType);
		val2.MobileCastMovementMult = mobileCastMovementMult ?? ((Item)skill).MobileCastMovementMult;
		object obj = val2;
		SpellCastModifier? val3 = castModifier;
		int num;
		if (val3.HasValue)
		{
			obj = val3.GetValueOrDefault();
			num = (int)obj;
		}
		else
		{
			num = ((mobileCastMovementMult > 0f) ? 1 : ((int)((Item)skill).CastModifier));
			obj = num;
			num = (int)obj;
		}
		System.Runtime.CompilerServices.Unsafe.Write(&((DynamicSkillStat)num).CastModifier, (SpellCastModifier)obj);
		val2.CastSheatheRequired = castSheatheRequired ?? ((Item)skill).CastSheathRequired;
		val2.CastLocomotionEnabled = castLocomotionEnabled ?? (mobileCastMovementMult > 0f || ((Item)skill).CastLocomotionEnabled);
		ReduceDurability val4 = ((Component)relicConditionBuilder.ActivationEffectsContainer).gameObject.AddComponent<ReduceDurability>();
		val4.EquipmentSlot = (EquipmentSlotIDs)6;
		val4.Durability = durabilityCost;
		return relicConditionBuilder;
	}
}
public class SourceConditionRelicLevel : SourceCondition
{
	public int relicLevel;

	public bool Inverted;

	public override bool CharacterHasRequirement(Character character)
	{
		int num = 0;
		if (SkillRequirements.SafeHasSkillKnowledge(character, 2502526))
		{
			num = 1;
		}
		if (SkillRequirements.SafeHasSkillKnowledge(character, 2502527))
		{
			num = 2;
		}
		return (num >= relicLevel) ^ Inverted;
	}
}

plugins/RelicKeeper.dll

Decompiled a day ago
using System;
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 BaseDamageModifiers;
using BepInEx;
using EffectSourceConditions;
using HarmonyLib;
using NodeCanvas.DialogueTrees;
using NodeCanvas.Framework;
using Photon;
using RelicCondition;
using SideLoader;
using SideLoader.Model;
using SynchronizedWorldObjects;
using TinyHelper;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace RelicKeeper;

internal class TameBeastEffect : Effect
{
	protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		Factions[] array = new Factions[3];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		if (((IEnumerable<Factions>)(object)array).Contains(_affectedCharacter.Faction))
		{
			_affectedCharacter.ChangeFaction((Factions)1, true);
		}
	}
}
public class GildedRelic
{
	public const string SubfolderName = "GildedRelic";

	public const string ItemName = "Gilded Relic";

	public static Item MakeItem()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Expected O, but got Unknown
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Expected O, but got Unknown
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		SL_Item val = new SL_Item();
		val.Name = "Gilded Relic";
		val.Target_ItemID = 5100500;
		val.New_ItemID = 2502533;
		val.EffectBehaviour = (EditBehaviours)2;
		val.Description = "";
		val.StatsHolder = new SL_ItemStats
		{
			MaxDurability = 100
		};
		val.BehaviorOnNoDurability = (BehaviorOnNoDurabilityType)1;
		val.RepairedInRest = false;
		val.Tags = TinyTagManager.GetOrMakeTags(new string[1] { "Item" });
		val.SLPackName = RelicKeeper.ModFolderName;
		val.SubfolderName = "GildedRelic";
		val.ItemVisuals = new SL_ItemVisual
		{
			Prefab_Name = "gilded_relic_Prefab",
			Prefab_AssetBundle = "gilded_relic",
			Prefab_SLPack = RelicKeeper.ModFolderName,
			Rotation = new Vector3(-90f, 0f, 0f),
			Position = new Vector3(0f, -0.093f, 0f)
		};
		SL_Item val2 = val;
		((ContentTemplate)val2).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(val2.New_ItemID);
		Equipment val3 = (Equipment)(object)((itemPrefab is Equipment) ? itemPrefab : null);
		((Item)val3).BagCategorySlot = (BagCategorySlotType)3;
		val3.IKType = (IKMode)1;
		return (Item)(object)val3;
	}

	public static Item MakeRecipe()
	{
		//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)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Expected O, but got Unknown
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		//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_0081: 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_009b: Expected O, but got Unknown
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Expected O, but got Unknown
		string text = "com.ehaugw.relickeeper." + "GildedRelic".ToLower() + "recipe";
		((ContentTemplate)new SL_Recipe
		{
			StationType = (CraftingType)2,
			Results = new List<ItemQty>
			{
				new ItemQty
				{
					Quantity = 1,
					ItemID = 2502533
				}
			},
			Ingredients = new List<Ingredient>
			{
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 2502522
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6300030
				}
			},
			UID = text
		}).ApplyTemplate();
		SL_RecipeItem val = new SL_RecipeItem
		{
			Name = "Crafting: Gilded Relic",
			Target_ItemID = 5700024,
			New_ItemID = 2502534,
			EffectBehaviour = (EditBehaviours)1,
			RecipeUID = text
		};
		((ContentTemplate)val).ApplyTemplate();
		return ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
	}
}
public static class TroglodyteStaffEffect
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Heals the user.", 14f, 30f, 0f, 0f, 30f, (SpellCastType?)(SpellCastType)2, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		Effect obj = ((SL_Effect)new SL_ShootProjectile
		{
			AutoTarget = true,
			BaseProjectile = (ProjectilePrefabs)178,
			IgnoreShooterCollision = true,
			TargetingMode = (TargetMode)3
		}).ApplyToTransform(val.EffectsContainer);
		ShootProjectile val2 = (ShootProjectile)(object)((obj is ShootProjectile) ? obj : null);
	}
}
public static class Cleanse
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Expected O, but got Unknown
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Requires 50% Corruption and a Mana Stone. Creates a Dark Stone, removes 30% Corruption, suffer Extreme Bleeding and 65 Decay Decay damage.", 10f, 0f, 0f, 0f, 0f, (SpellCastType?)(SpellCastType)63, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 2);
		Transform[] array = (Transform[])(object)new Transform[2] { val.ActivationEffectsContainer, val.EffectsContainer };
		foreach (Transform val2 in array)
		{
			Transform orMake = TinyGameObjectManager.GetOrMake(val2, "SourceConditions", true, true);
			SourceConditionItemInInventory val3 = ((Component)orMake).gameObject.AddComponent<SourceConditionItemInInventory>();
			val3.RequiredItemID = 6400130;
			val3.Amount = 1;
			SourceConditionCorruption val4 = ((Component)orMake).gameObject.AddComponent<SourceConditionCorruption>();
			val4.Corruption = 300f;
		}
		AddStatusEffect val5 = ((Component)val.EffectsContainer).gameObject.AddComponent<AddStatusEffect>();
		val5.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab("Bleeding +");
		AffectCorruption val6 = ((Component)val.EffectsContainer).gameObject.AddComponent<AffectCorruption>();
		val6.AffectQuantity = -300f;
		PunctualDamage val7 = ((Component)val.EffectsContainer).gameObject.AddComponent<PunctualDamage>();
		val7.Damages = (DamageType[])(object)new DamageType[1]
		{
			new DamageType((Types)2, 65f)
		};
		CreateItemEffect val8 = ((Component)val.EffectsContainer).gameObject.AddComponent<CreateItemEffect>();
		val8.ItemToCreate = ResourcesPrefabManager.Instance.GetItemPrefab(6500031);
		RemoveItemFromInventory val9 = ((Component)val.EffectsContainer).gameObject.AddComponent<RemoveItemFromInventory>();
		val9.ItemID = 6400130;
	}
}
public static class AddChaosImbueOffhand
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		SpellCastType? val = (SpellCastType)52;
		float? num = 0f;
		RelicConditionBuilder val2 = RelicConditionBuilder.Apply(skill, requiredItem, "Temporarly adds fire damage to your offhand weapon and inflicts Burning on enemies.", 5f, 30f, 0f, 0f, 10f, val, (SpellCastModifier?)(SpellCastModifier)0, num, (int?)null, (bool?)null, 0, 1);
		ImbueWeapon val3 = ((Component)val2.EffectsContainer).gameObject.AddComponent<ImbueWeapon>();
		ref ImbueEffectPreset imbuedEffect = ref ((ImbueObject)val3).ImbuedEffect;
		EffectPreset effectPreset = ResourcesPrefabManager.Instance.GetEffectPreset(272);
		imbuedEffect = (ImbueEffectPreset)(object)((effectPreset is ImbueEffectPreset) ? effectPreset : null);
		val3.AffectSlot = (WeaponSlot)1;
		((ImbueObject)val3).SetLifespanImbue(30f);
	}
}
public static class CurseOfVulnerabilityBlast
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Expected O, but got Unknown
		//IL_0060: 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_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: 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_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0113: Expected O, but got Unknown
		//IL_0129: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Expected O, but got Unknown
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Inflicts Curse of Vulnerability on nearby enemies.", 7f, 15f, 0f, 0f, 2f, (SpellCastType?)(SpellCastType)52, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		SL_ShootBlast val2 = new SL_ShootBlast();
		((SL_Shooter)val2).CastPosition = (CastPositionType)0;
		((SL_Shooter)val2).LocalPositionAdd = new Vector3(-0.4f, 0.65f, 0.6f);
		((SL_Shooter)val2).TargetType = (TargetTypes)0;
		val2.BaseBlast = (BlastPrefabs)26;
		val2.Radius = 1.2f;
		val2.BlastLifespan = 1f;
		val2.RefreshTime = -1f;
		val2.InstantiatedAmount = 5;
		val2.Interruptible = false;
		val2.HitOnShoot = true;
		val2.IgnoreShooter = true;
		val2.ParentToShootTransform = false;
		val2.ImpactSoundMaterial = (EquipmentSoundMaterials)12;
		val2.DontPlayHitSound = true;
		val2.EffectBehaviour = (EditBehaviours)2;
		((SL_Effect)val2).Delay = 0f;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val3 = new SL_EffectTransform();
		val3.TransformName = "Effects";
		val3.Effects = (SL_Effect[])(object)new SL_Effect[1] { (SL_Effect)new SL_AddStatusEffect
		{
			StatusEffect = "CurseOfVulnerability"
		} };
		array[0] = val3;
		val2.BlastEffects = (SL_EffectTransform[])(object)array;
		Effect obj = ((SL_Effect)val2).ApplyToTransform(val.EffectsContainer);
		ShootBlast val4 = (ShootBlast)(object)((obj is ShootBlast) ? obj : null);
	}
}
public static class RevealSoul
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Release a soul from the lantern.", 14f, 300f, 0f, 0f, 50f, (SpellCastType?)(SpellCastType)34, (SpellCastModifier?)(SpellCastModifier)0, (float?)0f, (int?)null, (bool?)null, 0, 1);
		Summon val2 = ((Component)val.EffectsContainer).gameObject.AddComponent<Summon>();
		val2.PositionType = (SummonPositionTypes)0;
		val2.InstantiationMode = (InstantiationManagement)1;
		val2.SummonedPrefab = ((Component)ResourcesPrefabManager.Instance.GetItemPrefab(8000000)).transform;
	}
}
public static class FireSigil
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Create a magic circle on the ground.", 14f, 60f, 0f, 0f, 50f, (SpellCastType?)(SpellCastType)15, (SpellCastModifier?)(SpellCastModifier)0, (float?)0f, (int?)null, (bool?)null, 0, 1);
		Summon val2 = ((Component)val.EffectsContainer).gameObject.AddComponent<Summon>();
		val2.PositionType = (SummonPositionTypes)0;
		val2.InstantiationMode = (InstantiationManagement)1;
		val2.SummonedPrefab = ((Component)ResourcesPrefabManager.Instance.GetItemPrefab(8000010)).transform;
	}
}
public class RelicPassives
{
	public const float RelicProtectionEfficiency = 0.2f;

	public static bool CanCastTormentWithDrawnWeapon(Character character)
	{
		return Object.op_Implicit((Object)(object)RelicCondition.HasRelicEquippedOrOnBackpack(character, 2502513, 0)) && RelicCondition.HasArcaneInfluence(character);
	}

	public static Equipment CanProtectDamageWithRelic(Character character)
	{
		if (RelicCondition.HasArcaneInfluence(character))
		{
			Equipment val = RelicCondition.HasRelicEquippedOrOnBackpack(character, 2502522, 0);
			if (Object.op_Implicit((Object)(object)val))
			{
				return val;
			}
			return RelicCondition.HasRelicEquippedOrOnBackpack(character, 2502533, 0);
		}
		return null;
	}
}
[HarmonyPatch(typeof(Item), "GetCastSheathRequired")]
public class Item_GetCastSheathRequired
{
	[HarmonyPostfix]
	public static void Postfix(Item __instance, ref int __result)
	{
		if (__instance.ItemID == 8201010 && RelicPassives.CanCastTormentWithDrawnWeapon((__instance != null) ? ((EffectSynchronizer)__instance).OwnerCharacter : null))
		{
			__result = 0;
		}
	}
}
[HarmonyPatch(typeof(Character), "ReceiveHit", new Type[]
{
	typeof(Object),
	typeof(DamageList),
	typeof(Vector3),
	typeof(Vector3),
	typeof(float),
	typeof(float),
	typeof(Character),
	typeof(float),
	typeof(bool)
})]
public class Character_ReceiveHit_RelicProtection
{
	[HarmonyPriority(500)]
	[HarmonyPrefix]
	public static void Prefix(Character __instance, ref DamageList __result, Object _damageSource, ref DamageList _damage, Vector3 _hitDir, Vector3 _hitPoint, float _angle, float _angleDir, Character _dealerChar, float _knockBack, bool _hitInventory)
	{
		if (!(_damageSource is StatusEffect))
		{
			Equipment val = RelicPassives.CanProtectDamageWithRelic(__instance);
			if (val != null && ((Item)val).CurrentDurability > 0f)
			{
				((Item)val).ReduceDurability(_damage.TotalDamage * 0.2f);
				_damage *= 0.8f;
			}
		}
	}
}
public class AlphaTuanosaurTrinket
{
	public const string SubfolderName = "AlphaTuanosaurTrinket";

	public const string ItemName = "Alpha Tuanosaur Trinket";

	public static Item MakeItem()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Expected O, but got Unknown
		//IL_00b7: 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_00c7: 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_00e2: Expected O, but got Unknown
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		SL_Item val = new SL_Item();
		val.Name = "Alpha Tuanosaur Trinket";
		val.Target_ItemID = 2502522;
		val.New_ItemID = 2502507;
		val.EffectBehaviour = (EditBehaviours)2;
		val.Description = "A trinket made from a tail bone of an apex predator. Causes the cooldown of Wrathful Smite to reset if used on a prone target.";
		val.StatsHolder = new SL_ItemStats
		{
			MaxDurability = 100,
			BaseValue = 300
		};
		val.BehaviorOnNoDurability = (BehaviorOnNoDurabilityType)2;
		val.RepairedInRest = false;
		val.Tags = TinyTagManager.GetOrMakeTags(new string[1] { "Item" });
		val.SLPackName = RelicKeeper.ModFolderName;
		val.SubfolderName = "AlphaTuanosaurTrinket";
		val.ItemVisuals = new SL_ItemVisual
		{
			Prefab_Name = "basic_relic_Prefab",
			Prefab_AssetBundle = "basic_relic",
			Prefab_SLPack = RelicKeeper.ModFolderName
		};
		SL_Item val2 = val;
		((ContentTemplate)val2).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(val2.New_ItemID);
		Equipment val3 = (Equipment)(object)((itemPrefab is Equipment) ? itemPrefab : null);
		val3.IKType = (IKMode)0;
		Item itemPrefab2 = ResourcesPrefabManager.Instance.GetItemPrefab(2502008);
		GameObject val4 = TinyGameObjectManager.MakeFreshObject("HitEffects", true, true, ((Component)itemPrefab2).transform);
		CooldownChangeEffect val5 = val4.AddComponent<CooldownChangeEffect>();
		val5.HitKnockbackCooldown = 0f;
		Transform orMake = TinyGameObjectManager.GetOrMake(val4.transform, "SourceConditions", true, true);
		SourceConditionEquipment val6 = ((Component)orMake).gameObject.AddComponent<SourceConditionEquipment>();
		val6.RequiredItemID = 2502507;
		return (Item)(object)val3;
	}

	public static Item MakeRecipe()
	{
		//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)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Expected O, but got Unknown
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		//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_0081: 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_009b: Expected O, but got Unknown
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Expected O, but got Unknown
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Expected O, but got Unknown
		string text = "com.ehaugw.relickeeper." + "AlphaTuanosaurTrinket".ToLower() + "recipe";
		((ContentTemplate)new SL_Recipe
		{
			StationType = (CraftingType)2,
			Results = new List<ItemQty>
			{
				new ItemQty
				{
					Quantity = 1,
					ItemID = 2502507
				}
			},
			Ingredients = new List<Ingredient>
			{
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6500090
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6400070
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6600190
				}
			},
			UID = text
		}).ApplyTemplate();
		SL_RecipeItem val = new SL_RecipeItem
		{
			Name = "Crafting: Alpha Tuanosaur Trinket",
			Target_ItemID = 5700024,
			New_ItemID = 2502509,
			EffectBehaviour = (EditBehaviours)1,
			RecipeUID = text
		};
		((ContentTemplate)val).ApplyTemplate();
		return ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
	}
}
public class BasicRelic
{
	public const string SubfolderName = "BasicRelic";

	public const string ItemName = "Basic Relic";

	public static Item MakeItem()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Expected O, but got Unknown
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Expected O, but got Unknown
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		SL_Item val = new SL_Item();
		val.Name = "Basic Relic";
		val.Target_ItemID = 5100500;
		val.New_ItemID = 2502522;
		val.EffectBehaviour = (EditBehaviours)2;
		val.Description = "";
		val.StatsHolder = new SL_ItemStats
		{
			MaxDurability = 80
		};
		val.BehaviorOnNoDurability = (BehaviorOnNoDurabilityType)2;
		val.RepairedInRest = false;
		val.Tags = TinyTagManager.GetOrMakeTags(new string[1] { "Item" });
		val.SLPackName = RelicKeeper.ModFolderName;
		val.SubfolderName = "BasicRelic";
		val.ItemVisuals = new SL_ItemVisual
		{
			Prefab_Name = "basic_relic_Prefab",
			Prefab_AssetBundle = "basic_relic",
			Prefab_SLPack = RelicKeeper.ModFolderName,
			Rotation = new Vector3(-90f, 0f, 0f),
			Position = new Vector3(0f, -0.093f, 0f)
		};
		SL_Item val2 = val;
		((ContentTemplate)val2).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(val2.New_ItemID);
		Equipment val3 = (Equipment)(object)((itemPrefab is Equipment) ? itemPrefab : null);
		((Item)val3).BagCategorySlot = (BagCategorySlotType)3;
		val3.IKType = (IKMode)1;
		return (Item)(object)val3;
	}

	public static Item MakeRecipe()
	{
		//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)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Expected O, but got Unknown
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		//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_0081: 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_009b: Expected O, but got Unknown
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Expected O, but got Unknown
		string text = "com.ehaugw.relickeeper." + "BasicRelic".ToLower() + "recipe";
		((ContentTemplate)new SL_Recipe
		{
			StationType = (CraftingType)2,
			Results = new List<ItemQty>
			{
				new ItemQty
				{
					Quantity = 1,
					ItemID = 2502522
				}
			},
			Ingredients = new List<Ingredient>
			{
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6400080
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6400080
				}
			},
			UID = text
		}).ApplyTemplate();
		SL_RecipeItem val = new SL_RecipeItem
		{
			Name = "Crafting: Basic Relic",
			Target_ItemID = 5700024,
			New_ItemID = 2502531,
			EffectBehaviour = (EditBehaviours)1,
			RecipeUID = text
		};
		((ContentTemplate)val).ApplyTemplate();
		return ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
	}
}
public class GoldLichTalisman
{
	public const string SubfolderName = "GoldLichTalisman";

	public const string ItemName = "Gold Lich Talisman";

	public static Item MakeItem()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: 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_0062: Expected O, but got Unknown
		//IL_00aa: 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_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Expected O, but got Unknown
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		SL_Equipment val = new SL_Equipment();
		((SL_Item)val).Name = "Gold Lich Talisman";
		((SL_Item)val).Target_ItemID = 2502522;
		((SL_Item)val).New_ItemID = 2502508;
		((SL_Item)val).EffectBehaviour = (EditBehaviours)2;
		((SL_Item)val).Description = "Crafted from a mechanism from the Light Mender's minions.";
		((SL_Item)val).StatsHolder = new SL_ItemStats
		{
			MaxDurability = 100,
			BaseValue = 800
		};
		((SL_Item)val).BehaviorOnNoDurability = (BehaviorOnNoDurabilityType)2;
		((SL_Item)val).RepairedInRest = false;
		((SL_Item)val).Tags = TinyTagManager.GetOrMakeTags(new string[1] { "Item" });
		((SL_Item)val).SLPackName = RelicKeeper.ModFolderName;
		((SL_Item)val).SubfolderName = "GoldLichTalisman";
		((SL_Item)val).ItemVisuals = new SL_ItemVisual
		{
			Prefab_Name = "basic_relic_Prefab",
			Prefab_AssetBundle = "basic_relic",
			Prefab_SLPack = RelicKeeper.ModFolderName
		};
		SL_Equipment val2 = val;
		((ContentTemplate)val2).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val2).New_ItemID);
		Equipment val3 = (Equipment)(object)((itemPrefab is Equipment) ? itemPrefab : null);
		val3.IKType = (IKMode)0;
		Item itemPrefab2 = ResourcesPrefabManager.Instance.GetItemPrefab(2502000);
		Skill val4 = (Skill)(object)((itemPrefab2 is Skill) ? itemPrefab2 : null);
		if (val4 != null)
		{
			GameObject val5 = TinyGameObjectManager.MakeFreshObject("Effects", true, true, ((Component)val4).transform);
			AffectBurntHealth val6 = val5.gameObject.AddComponent<AffectBurntHealth>();
			val6.AffectQuantity = 1f;
			val6.IsModifier = false;
			Transform orMake = TinyGameObjectManager.GetOrMake(val5.transform, "SourceConditions", true, true);
			SourceConditionEquipment val7 = ((Component)orMake).gameObject.AddComponent<SourceConditionEquipment>();
			val7.RequiredItemID = 2502508;
		}
		return (Item)(object)val3;
	}

	public static Item MakeRecipe()
	{
		//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)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Expected O, but got Unknown
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		//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_0081: 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_009b: Expected O, but got Unknown
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Expected O, but got Unknown
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Expected O, but got Unknown
		//IL_00e7: 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_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0121: Unknown result type (might be due to invalid IL or missing references)
		//IL_0129: Expected O, but got Unknown
		string text = "com.ehaugw.relickeeper." + "GoldLichTalisman".ToLower() + "recipe";
		((ContentTemplate)new SL_Recipe
		{
			StationType = (CraftingType)2,
			Results = new List<ItemQty>
			{
				new ItemQty
				{
					Quantity = 1,
					ItemID = 2502508
				}
			},
			Ingredients = new List<Ingredient>
			{
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6500090
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6300030
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6600210
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6000010
				}
			},
			UID = text
		}).ApplyTemplate();
		SL_RecipeItem val = new SL_RecipeItem
		{
			Name = "Crafting: Gold Lich Talisman",
			Target_ItemID = 5700024,
			New_ItemID = 2502510,
			EffectBehaviour = (EditBehaviours)1,
			RecipeUID = text
		};
		((ContentTemplate)val).ApplyTemplate();
		return ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
	}
}
public class ObsidianAmulet
{
	public const string SubfolderName = "ObsidianAmulet";

	public const string ItemName = "Obsidian Amulet";

	public static Item MakeItem()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: 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_0062: Expected O, but got Unknown
		//IL_00aa: 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_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Expected O, but got Unknown
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		SL_Item val = new SL_Item();
		val.Name = "Obsidian Amulet";
		val.Target_ItemID = 2502522;
		val.New_ItemID = 2502506;
		val.EffectBehaviour = (EditBehaviours)2;
		val.Description = "An ornament crafted from fire-infused glass. Causes spark to apply and spread Impending Doom.";
		val.StatsHolder = new SL_ItemStats
		{
			MaxDurability = 100,
			BaseValue = 200
		};
		val.BehaviorOnNoDurability = (BehaviorOnNoDurabilityType)2;
		val.RepairedInRest = false;
		val.Tags = TinyTagManager.GetOrMakeTags(new string[1] { "Item" });
		val.SLPackName = RelicKeeper.ModFolderName;
		val.SubfolderName = "ObsidianAmulet";
		val.ItemVisuals = new SL_ItemVisual
		{
			Prefab_Name = "basic_relic_Prefab",
			Prefab_AssetBundle = "basic_relic",
			Prefab_SLPack = RelicKeeper.ModFolderName
		};
		SL_Item val2 = val;
		((ContentTemplate)val2).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(val2.New_ItemID);
		Equipment val3 = (Equipment)(object)((itemPrefab is Equipment) ? itemPrefab : null);
		val3.IKType = (IKMode)0;
		return (Item)(object)val3;
	}

	public static Item MakeRecipe()
	{
		//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)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Expected O, but got Unknown
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		//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_0081: 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_009b: Expected O, but got Unknown
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Expected O, but got Unknown
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Expected O, but got Unknown
		string text = "com.ehaugw.relickeeper." + "ObsidianAmulet".ToLower() + "recipe";
		((ContentTemplate)new SL_Recipe
		{
			StationType = (CraftingType)2,
			Results = new List<ItemQty>
			{
				new ItemQty
				{
					Quantity = 1,
					ItemID = 2502506
				}
			},
			Ingredients = new List<Ingredient>
			{
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6500090
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6300030
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6600200
				}
			},
			UID = text
		}).ApplyTemplate();
		SL_RecipeItem val = new SL_RecipeItem
		{
			Name = "Crafting: Obsidian Amulet",
			Target_ItemID = 5700024,
			New_ItemID = 2502509,
			EffectBehaviour = (EditBehaviours)1,
			RecipeUID = text
		};
		((ContentTemplate)val).ApplyTemplate();
		return ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
	}
}
public class WoodooCharm
{
	public const string SubfolderName = "WoodooCharm";

	public const string ItemName = "Woodoo Charm";

	public static Item MakeItem()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Expected O, but got Unknown
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Expected O, but got Unknown
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		SL_Item val = new SL_Item();
		val.Name = "Woodoo Charm";
		val.Target_ItemID = 5100500;
		val.New_ItemID = 2502513;
		val.EffectBehaviour = (EditBehaviours)2;
		val.Description = "Woodoo Charm for Woodooing uncharming creatures.";
		val.StatsHolder = new SL_ItemStats
		{
			MaxDurability = 100
		};
		val.BehaviorOnNoDurability = (BehaviorOnNoDurabilityType)2;
		val.RepairedInRest = false;
		val.Tags = TinyTagManager.GetOrMakeTags(new string[1] { "Item" });
		val.SLPackName = RelicKeeper.ModFolderName;
		val.SubfolderName = "WoodooCharm";
		val.ItemVisuals = new SL_ItemVisual
		{
			Prefab_Name = "woodoo_charm_Prefab",
			Prefab_AssetBundle = "woodoo_charm",
			Prefab_SLPack = RelicKeeper.ModFolderName,
			Rotation = new Vector3(-90f, 0f, 90f),
			Position = new Vector3(0f, -0.093f, 0f)
		};
		SL_Item val2 = val;
		((ContentTemplate)val2).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(val2.New_ItemID);
		Equipment val3 = (Equipment)(object)((itemPrefab is Equipment) ? itemPrefab : null);
		((Item)val3).BagCategorySlot = (BagCategorySlotType)3;
		val3.IKType = (IKMode)1;
		return (Item)(object)val3;
	}

	public static Item MakeRecipe()
	{
		//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)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Expected O, but got Unknown
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		//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_0081: 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_009b: Expected O, but got Unknown
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Expected O, but got Unknown
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Expected O, but got Unknown
		string text = "com.ehaugw.relickeeper." + "WoodooCharm".ToLower() + "recipe";
		((ContentTemplate)new SL_Recipe
		{
			StationType = (CraftingType)2,
			Results = new List<ItemQty>
			{
				new ItemQty
				{
					Quantity = 1,
					ItemID = 2502513
				}
			},
			Ingredients = new List<Ingredient>
			{
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6500090
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6100010
				},
				new Ingredient
				{
					Type = (ActionTypes)1,
					Ingredient_ItemID = 6600110
				}
			},
			UID = text
		}).ApplyTemplate();
		SL_RecipeItem val = new SL_RecipeItem
		{
			Name = "Crafting: Woodoo Charm",
			Target_ItemID = 5700024,
			New_ItemID = 2502530,
			EffectBehaviour = (EditBehaviours)1,
			RecipeUID = text
		};
		((ContentTemplate)val).ApplyTemplate();
		return ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
	}
}
public static class RelicWard
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: 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)
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Envelops you in Mana and, for an instant, you become immune to Damage.", 7f, 20f, 0f, 0f, 8f, (SpellCastType?)(SpellCastType)52, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		AddStatusEffect val2 = ((Component)val.EffectsContainer).gameObject.AddComponent<AddStatusEffect>();
		val2.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab("Force Bubble");
		((SL_Effect)new SL_PlayTimedVFX
		{
			VFXPrefab = (VFXPrefabs)78
		}).ApplyToTransform(val.ActivationEffectsContainer);
	}
}
public static class RelicPush
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: 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_0075: 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_0081: 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_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: 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_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: 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_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "High Impact in a wide area in front of the caster.", 7f, 15f, 0f, 0f, 4f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		Effect obj = ((SL_Effect)new SL_ShootBlast
		{
			CastPosition = (CastPositionType)0,
			LocalPositionAdd = new Vector3(0f, 1.25f, 0.7f),
			TargetType = (TargetTypes)0,
			BaseBlast = (BlastPrefabs)98,
			Radius = 1.2f,
			BlastLifespan = 1f,
			RefreshTime = -1f,
			InstantiatedAmount = 5,
			Interruptible = false,
			HitOnShoot = true,
			IgnoreShooter = true,
			ParentToShootTransform = false,
			ImpactSoundMaterial = (EquipmentSoundMaterials)12,
			DontPlayHitSound = true,
			EffectBehaviour = (EditBehaviours)0,
			Delay = 0f
		}).ApplyToTransform(val.EffectsContainer);
		ShootBlast val2 = (ShootBlast)(object)((obj is ShootBlast) ? obj : null);
	}
}
public static class TameBeast
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Expected O, but got Unknown
		//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_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0110: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Expected O, but got Unknown
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Makes a beast friendly towards you", 7f, 2f, 0f, 0f, 1f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		SL_ShootBlast val2 = new SL_ShootBlast();
		((SL_Shooter)val2).CastPosition = (CastPositionType)0;
		((SL_Shooter)val2).LocalPositionAdd = new Vector3(0f, 1.25f, 0.7f);
		((SL_Shooter)val2).TargetType = (TargetTypes)0;
		val2.BaseBlast = (BlastPrefabs)98;
		val2.Radius = 1f;
		val2.BlastLifespan = 1f;
		val2.RefreshTime = -1f;
		val2.InstantiatedAmount = 5;
		val2.Interruptible = false;
		val2.HitOnShoot = true;
		val2.IgnoreShooter = true;
		val2.ParentToShootTransform = false;
		val2.ImpactSoundMaterial = (EquipmentSoundMaterials)12;
		val2.DontPlayHitSound = true;
		val2.EffectBehaviour = (EditBehaviours)2;
		((SL_Effect)val2).Delay = 0f;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val3 = new SL_EffectTransform();
		val3.TransformName = "Effects";
		val3.Effects = (SL_Effect[])(object)new SL_Effect[0];
		array[0] = val3;
		val2.BlastEffects = (SL_EffectTransform[])(object)array;
		Effect obj = ((SL_Effect)val2).ApplyToTransform(val.EffectsContainer);
		ShootBlast val4 = (ShootBlast)(object)((obj is ShootBlast) ? obj : null);
		Transform val5 = ((Component)val4.BaseBlast).transform.Find("Effects");
		((Component)val5).gameObject.SetActive(true);
		((Component)val5).gameObject.AddComponent<TameBeastEffect>();
	}
}
public static class TestEffect
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Expected O, but got Unknown
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: 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_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: 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_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Expected O, but got Unknown
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Used for testing. Should not be here. Please notify the mod author.", 14f, 2f, 0f, 0f, 1f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		SL_ShootBlast val2 = new SL_ShootBlast();
		((SL_Shooter)val2).CastPosition = (CastPositionType)0;
		((SL_Shooter)val2).LocalPositionAdd = new Vector3(0f, 0f, 0f);
		((SL_Shooter)val2).TargetType = (TargetTypes)2;
		val2.BaseBlast = (BlastPrefabs)76;
		val2.Radius = 7f;
		val2.BlastLifespan = 5f;
		val2.RefreshTime = 0.5f;
		val2.InstantiatedAmount = 5;
		val2.Interruptible = false;
		val2.HitOnShoot = true;
		val2.IgnoreShooter = true;
		val2.ParentToShootTransform = false;
		val2.ImpactSoundMaterial = (EquipmentSoundMaterials)12;
		val2.DontPlayHitSound = true;
		val2.EffectBehaviour = (EditBehaviours)2;
		((SL_Effect)val2).Delay = 0f;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val3 = new SL_EffectTransform();
		val3.TransformName = "Effects";
		val3.Effects = (SL_Effect[])(object)new SL_Effect[0];
		array[0] = val3;
		val2.BlastEffects = (SL_EffectTransform[])(object)array;
		Effect obj = ((SL_Effect)val2).ApplyToTransform(val.EffectsContainer);
		ShootBlast val4 = (ShootBlast)(object)((obj is ShootBlast) ? obj : null);
		Transform val5 = ((Component)val4.BaseBlast).transform.Find("Effects");
		((Component)val5).gameObject.SetActive(true);
		AddStatusEffectBuildUp val6 = ((Component)val5).gameObject.AddComponent<AddStatusEffectBuildUp>();
		val6.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab("Plague");
		val6.BuildUpValue = 20f;
	}
}
public static class PlagueBlast
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Expected O, but got Unknown
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_0119: Expected O, but got Unknown
		SpellCastModifier? val = (SpellCastModifier)0;
		float? num = 0f;
		RelicConditionBuilder val2 = RelicConditionBuilder.Apply(skill, requiredItem, "Creates a cloud of spores that inflicts Plague on all nearby creatures.", 14f, 100f, 0f, 0f, 85f, (SpellCastType?)(SpellCastType)34, val, num, (int?)null, (bool?)null, 0, 1);
		SL_ShootBlast val3 = new SL_ShootBlast();
		((SL_Shooter)val3).CastPosition = (CastPositionType)0;
		((SL_Shooter)val3).LocalPositionAdd = new Vector3(0f, 0f, 0f);
		((SL_Shooter)val3).TargetType = (TargetTypes)2;
		val3.BaseBlast = (BlastPrefabs)67;
		val3.Radius = 7f;
		val3.BlastLifespan = 5f;
		val3.RefreshTime = 0.5f;
		val3.InstantiatedAmount = 5;
		val3.Interruptible = false;
		val3.HitOnShoot = true;
		val3.IgnoreShooter = false;
		val3.ParentToShootTransform = false;
		val3.ImpactSoundMaterial = (EquipmentSoundMaterials)12;
		val3.DontPlayHitSound = true;
		val3.EffectBehaviour = (EditBehaviours)2;
		((SL_Effect)val3).Delay = 0f;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val4 = new SL_EffectTransform();
		val4.TransformName = "Effects";
		val4.Effects = (SL_Effect[])(object)new SL_Effect[0];
		array[0] = val4;
		val3.BlastEffects = (SL_EffectTransform[])(object)array;
		Effect obj = ((SL_Effect)val3).ApplyToTransform(val2.EffectsContainer);
		ShootBlast val5 = (ShootBlast)(object)((obj is ShootBlast) ? obj : null);
		Transform val6 = ((Component)val5.BaseBlast).transform.Find("Effects");
		((Component)val6).gameObject.SetActive(true);
		AddStatusEffectBuildUp val7 = ((Component)val6).gameObject.AddComponent<AddStatusEffectBuildUp>();
		val7.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab("Plague");
		val7.BuildUpValue = 20f;
	}
}
public static class RunicProtection
{
	public static void Apply(Skill skill, int requiredItem)
	{
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Grants Runic Protection", 16f, 2f, 0f, 0f, 1f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		AddStatusEffect val2 = ((Component)val.EffectsContainer).gameObject.AddComponent<AddStatusEffect>();
		val2.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab("Runic Protection");
	}
}
public static class AmplifiedRunicProtection
{
	public static void Apply(Skill skill, int requiredItem)
	{
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Applies Runic Protection to the user.", 30f, 2f, 0f, 0f, 10f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		AddStatusEffect val2 = ((Component)val.EffectsContainer).gameObject.AddComponent<AddStatusEffect>();
		val2.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab("Runic Protection Amplified");
	}
}
public static class DivineIntervention
{
	public static void Apply(Skill skill, int requiredItem)
	{
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Protects the user from lethal damage.", 50f, 2f, 0f, 0f, 50f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 2);
		AddStatusEffect val2 = ((Component)val.EffectsContainer).gameObject.AddComponent<AddStatusEffect>();
		val2.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab("DivineIntervention");
	}
}
[HarmonyPatch(typeof(Character), "ReceiveHit", new Type[]
{
	typeof(Object),
	typeof(DamageList),
	typeof(Vector3),
	typeof(Vector3),
	typeof(float),
	typeof(float),
	typeof(Character),
	typeof(float),
	typeof(bool)
})]
public class Character_ReceiveHit
{
	[HarmonyPrefix]
	public static void Prefix(Character __instance, ref DamageList __result, Object _damageSource, ref DamageList _damage, Vector3 _hitDir, Vector3 _hitPoint, float _angle, float _angleDir, Character _dealerChar, float _knockBack, bool _hitInventory)
	{
		StatusEffectManager statusEffectMngr = __instance.StatusEffectMngr;
		if (statusEffectMngr == null || !statusEffectMngr.HasStatusEffect("DivineIntervention"))
		{
			return;
		}
		DamageList val = _damage.Clone();
		StatusEffect val2 = (StatusEffect)(object)((_damageSource is StatusEffect) ? _damageSource : null);
		__instance.Stats.GetMitigatedDamage((Tag[])null, ref val, (Object)(object)val2 != (Object)null);
		if (val.TotalDamage >= __instance.Health)
		{
			_damage.Clear();
			StatusEffect statusEffectOfName = __instance.StatusEffectMngr.GetStatusEffectOfName("DivineIntervention");
			if (!__instance.StatusEffectMngr.HasStatusEffect("Force Bubble"))
			{
				StatusEffect val3 = __instance.StatusEffectMngr.AddStatusEffect("Force Bubble");
			}
			statusEffectOfName.IncreaseAge((int)statusEffectOfName.RemainingLifespan - 2);
			statusEffectOfName.IsHidden = true;
			statusEffectOfName.DisplayInHud = false;
		}
	}
}
public static class BasicHeal
{
	private const float HEAL_RATIO = 1f;

	private const float HEAL_AMOUNT = 20f;

	public static void Apply(Skill skill, int requiredItem)
	{
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Heals the user.", 20f, 2f, 0f, 0f, 2f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		AffectHealth val2 = ((Component)val.EffectsContainer).gameObject.AddComponent<AffectHealth>();
		val2.AffectQuantity = 20f;
	}
}
public class RPCManager : MonoBehaviour
{
	public static RPCManager Instance;

	internal void Start()
	{
		Instance = this;
		PhotonView val = ((Component)this).gameObject.AddComponent<PhotonView>();
		val.viewID = 952;
		Debug.Log((object)("Registered RelicKeeperRPC with ViewID " + ((MonoBehaviour)this).photonView.viewID));
	}

	[PunRPC]
	public void CharacterForceCancelRPC(string characterGUID, bool bool1, bool bool2)
	{
		Character character = CharacterManager.Instance.GetCharacter(characterGUID);
		character.ForceCancel(bool1, bool2);
	}
}
internal class EffectInitializer
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static WeaponDamageModifier <>9__1_0;

		internal void <MakeChaosImbue>b__1_0(Weapon weapon, DamageList original, ref DamageList result)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			if (weapon != null && weapon.HasImbuePreset(272))
			{
				object obj;
				if (weapon == null)
				{
					obj = null;
				}
				else
				{
					Character ownerCharacter = ((EffectSynchronizer)weapon).OwnerCharacter;
					obj = ((ownerCharacter != null) ? ownerCharacter.Stats : null);
				}
				object obj2 = ((obj is PlayerCharacterStats) ? obj : null);
				float num = ((obj2 != null) ? ((PlayerCharacterStats)obj2).Corruption : 0f);
				result.Add(new DamageList((Types)5, (1000f - num) / 100f));
			}
		}
	}

	public static StatusEffect MakeCurseOfVulnrability()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Expected O, but got Unknown
		//IL_0086: 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_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Expected O, but got Unknown
		SL_StatusEffect val = new SL_StatusEffect();
		val.Name = "Curse of Vulnerability";
		val.Description = "You are cursed: your status effect resistance is reduced.";
		val.StatusIdentifier = "CurseOfVulnerability";
		val.DisplayedInHUD = true;
		val.IsHidden = false;
		val.IsMalusEffect = true;
		val.Lifespan = 80f;
		val.TargetStatusIdentifier = "Mana Ratio Recovery 3";
		val.EffectBehaviour = (EditBehaviours)2;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val2 = new SL_EffectTransform();
		val2.Effects = (SL_Effect[])(object)new SL_Effect[1] { (SL_Effect)new SL_AffectStat
		{
			AffectQuantity = -15f,
			Stat_Tag = "StatusEffectBuildUpResistance",
			Duration = -1f
		} };
		array[0] = val2;
		val.Effects = (SL_EffectTransform[])(object)array;
		((ContentTemplate)val).ApplyTemplate();
		return ResourcesPrefabManager.Instance.GetStatusEffectPrefab("CurseOfVulnerability");
	}

	public static ImbueEffectPreset MakeChaosImbue()
	{
		//IL_011d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0122: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0158: Unknown result type (might be due to invalid IL or missing references)
		//IL_018c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0196: Expected O, but got Unknown
		//IL_017c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0181: Unknown result type (might be due to invalid IL or missing references)
		//IL_0187: Expected O, but got Unknown
		ImbueEffectPreset val = TinyEffectManager.MakeImbuePreset(272, "Chaos Imbue", "Weapon deals some fire damage, causes Burning buildup, and causes corrution buildup on the wearer on each hit.", (string)null, (int?)203, (List<Skill>)null, (string)null, (int?)null, (int?)null, (float?)null, (float?)null, (float?)null, (Types?)null);
		Transform transform = TinyGameObjectManager.MakeFreshObject("Effects", true, true, ((Component)val).transform).transform;
		TinyEffectManager.MakeWeaponDamage(transform, 0f, 0.25f, (Types)5, 0f);
		TinyEffectManager.MakeStatusEffectBuildup(transform, "Burning", 49f);
		transform = TinyGameObjectManager.MakeFreshObject("HitEffects", true, true, ((Component)val).transform).transform;
		AffectCorruption val2 = ((Component)transform).gameObject.AddComponent<AffectCorruption>();
		val2.AffectOwner = true;
		val2.AffectQuantity = 5f;
		val2.IsRaw = false;
		((Effect)val2).IsImbueEffect = true;
		Transform imbueFX = val.ImbueFX;
		imbueFX = Object.Instantiate<Transform>(imbueFX);
		((Component)imbueFX).gameObject.SetActive(false);
		Object.DontDestroyOnLoad((Object)(object)imbueFX);
		val.ImbueFX = imbueFX;
		MainModule main = ((Component)imbueFX.Find("FireParticlesLargeCore")).GetComponent<ParticleSystem>().main;
		((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(1f, 0.3f, 0.4f, 0.5f), new Color(0.5f, 0f, 0.1f, 0.5f));
		WeaponDamageModifier weaponDamageModifiers = BaseDamageModifiers.WeaponDamageModifiers;
		object obj = <>c.<>9__1_0;
		if (obj == null)
		{
			WeaponDamageModifier val3 = delegate(Weapon weapon, DamageList original, ref DamageList result)
			{
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_005f: Expected O, but got Unknown
				if (weapon != null && weapon.HasImbuePreset(272))
				{
					object obj2;
					if (weapon == null)
					{
						obj2 = null;
					}
					else
					{
						Character ownerCharacter = ((EffectSynchronizer)weapon).OwnerCharacter;
						obj2 = ((ownerCharacter != null) ? ownerCharacter.Stats : null);
					}
					object obj3 = ((obj2 is PlayerCharacterStats) ? obj2 : null);
					float num = ((obj3 != null) ? ((PlayerCharacterStats)obj3).Corruption : 0f);
					result.Add(new DamageList((Types)5, (1000f - num) / 100f));
				}
			};
			<>c.<>9__1_0 = val3;
			obj = (object)val3;
		}
		BaseDamageModifiers.WeaponDamageModifiers = (WeaponDamageModifier)Delegate.Combine((Delegate?)(object)weaponDamageModifiers, (Delegate?)obj);
		return val;
	}

	public static StatusEffect MakeDivineInterventionPrefab()
	{
		StatusEffect val = TinyEffectManager.MakeStatusEffectPrefab("DivineIntervention", "DivineIntervention", "You will be protected when receiving an otherwise lethal hit.", 1200f, -1f, (StackBehaviors)1, "Mana Ratio Recovery 3", false, (string)null, (UID?)null, "com.ehaugw.relickeeper", (string)null, "Divine Intervention", (string)null);
		val.IsHidden = false;
		val.DisplayInHud = true;
		return val;
	}
}
[BepInPlugin("com.ehaugw.relickeeper", "Relic Keeper", "1.1.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency("com.ehaugw.effectsourceconditions", "2.8.0")]
[BepInDependency("com.ehaugw.reliccondition", "1.1.1")]
[BepInDependency("com.ehaugw.tinyhelper", "4.8.2")]
[BepInDependency("com.ehaugw.synchronizedworldobjects", "1.0.3")]
public class RelicKeeper : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static ManaCostModifier <>9__6_0;

		internal void <Awake>b__6_0(Skill skill, float original, ref float result)
		{
			if (Extensions.Contains(new int[2] { 2502518, 2502525 }, ((Item)skill).ItemID) && SkillRequirements.SafeHasSkillKnowledge((skill != null) ? ((EffectSynchronizer)skill).OwnerCharacter : null, 2502521))
			{
				result -= original * 0.3f;
			}
		}
	}

	public static RelicKeeper Instance;

	public const string GUID = "com.ehaugw.relickeeper";

	public const string VERSION = "1.1.1";

	public const string NAME = "Relic Keeper";

	public static string ModFolderName = Directory.GetParent(typeof(RelicKeeper).Assembly.Location).Name.ToString();

	public static SkillSchool RelicKeeperSkillTreeInstance;

	internal void Awake()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Expected O, but got Unknown
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Expected O, but got Unknown
		Instance = this;
		Harmony val = new Harmony("com.ehaugw.relickeeper");
		val.PatchAll();
		HarmalanNPC.Init();
		SL.OnPacksLoaded += OnPacksLoaded;
		ManaCostModifier manaCostModifiers = DynamicSkillStat.ManaCostModifiers;
		object obj = <>c.<>9__6_0;
		if (obj == null)
		{
			ManaCostModifier val2 = delegate(Skill skill, float original, ref float result)
			{
				if (Extensions.Contains(new int[2] { 2502518, 2502525 }, ((Item)skill).ItemID) && SkillRequirements.SafeHasSkillKnowledge((skill != null) ? ((EffectSynchronizer)skill).OwnerCharacter : null, 2502521))
				{
					result -= original * 0.3f;
				}
			};
			<>c.<>9__6_0 = val2;
			obj = (object)val2;
		}
		DynamicSkillStat.ManaCostModifiers = (ManaCostModifier)Delegate.Combine((Delegate?)(object)manaCostModifiers, (Delegate?)obj);
	}

	private void OnPacksLoaded()
	{
		BasicRelic.MakeItem();
		ObsidianAmulet.MakeItem();
		WoodooCharm.MakeItem();
		GildedRelic.MakeItem();
		WoodooCharm.MakeRecipe();
		BasicRelic.MakeRecipe();
		GildedRelic.MakeRecipe();
		EffectInitializer.MakeDivineInterventionPrefab();
		EffectInitializer.MakeCurseOfVulnrability();
		EffectInitializer.MakeChaosImbue();
		UseRelic.Init(2502518);
		UseRelic.Init(2502525);
		Unleash.Init();
		ManaFlow.Init();
		RelicLore.Init();
		MythicLore.Init();
		RelicFundamentals.Init();
		ArcaneInfluence.Init();
		RelicKeeperSkillTree.SetupSkillTree(ref RelicKeeperSkillTreeInstance);
	}
}
public static class MeleeJinx
{
	public static void Apply(Skill skill, int requiredItem)
	{
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Expected O, but got Unknown
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: 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_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: 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_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Expected O, but got Unknown
		RelicConditionBuilder val = RelicConditionBuilder.Apply(skill, requiredItem, "Inflicts a random Hex debuff on the target.", 7f, 2f, 0f, 0f, 1f, (SpellCastType?)null, (SpellCastModifier?)null, (float?)null, (int?)null, (bool?)null, 0, 0);
		SL_ShootBlast val2 = new SL_ShootBlast();
		((SL_Shooter)val2).CastPosition = (CastPositionType)0;
		((SL_Shooter)val2).LocalPositionAdd = new Vector3(0f, 1.25f, 0.7f);
		((SL_Shooter)val2).TargetType = (TargetTypes)0;
		val2.BaseBlast = (BlastPrefabs)98;
		val2.Radius = 1.2f;
		val2.BlastLifespan = 1f;
		val2.RefreshTime = -1f;
		val2.InstantiatedAmount = 5;
		val2.Interruptible = false;
		val2.HitOnShoot = true;
		val2.IgnoreShooter = true;
		val2.ParentToShootTransform = false;
		val2.ImpactSoundMaterial = (EquipmentSoundMaterials)12;
		val2.DontPlayHitSound = true;
		val2.EffectBehaviour = (EditBehaviours)2;
		((SL_Effect)val2).Delay = 0f;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val3 = new SL_EffectTransform();
		val3.TransformName = "Effects";
		val3.Effects = (SL_Effect[])(object)new SL_Effect[0];
		array[0] = val3;
		val2.BlastEffects = (SL_EffectTransform[])(object)array;
		Effect obj = ((SL_Effect)val2).ApplyToTransform(val.EffectsContainer);
		ShootBlast val4 = (ShootBlast)(object)((obj is ShootBlast) ? obj : null);
		Transform val5 = ((Component)val4.BaseBlast).transform.Find("Effects");
		((Component)val5).gameObject.SetActive(true);
		PunctualDamage val6 = ((Component)val5).gameObject.AddComponent<PunctualDamage>();
		((Effect)val6).Delay = 0f;
		val6.Damages = (DamageType[])(object)new DamageType[0];
		val6.Knockback = 40f;
		((Effect)val6).UseOnce = true;
		AddStatusEffectRandom val7 = ((Component)val5).gameObject.AddComponent<AddStatusEffectRandom>();
		val7.Statuses = new string[5] { "Doom", "Haunted", "Curse", "Burn", "Chill" }.Select((string s) => ResourcesPrefabManager.Instance.GetStatusEffectPrefab(s)).ToArray();
		val7.ForceID = -1;
		GameObject projectilePrefab = SL_ShootProjectile.GetProjectilePrefab((ProjectilePrefabs)135);
		List<VFXSystem> list = new List<VFXSystem>();
		string[] array2 = new string[5] { "Doom", "Haunt", "Curse", "Scorch", "Chill" };
		foreach (string text in array2)
		{
			Transform val8 = Object.Instantiate<Transform>(projectilePrefab.transform.Find("VFX" + text));
			val8.parent = val5;
			((Component)val8).gameObject.SetActive(true);
			TinyGameObjectManager.RecursiveDontDestroyOnLoad(val8);
			list.Add(((Component)val8).GetComponent<VFXSystem>());
		}
		val7.VfxSystems = list.ToArray();
	}
}
public class RelicKeeperSkillTree
{
	public static SkillSchool RelicKeeperSkillSchool;

	public static void SetupSkillTree(ref SkillSchool skillTreeInstance)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: 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_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Expected O, but got Unknown
		//IL_0063: 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_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Expected O, but got Unknown
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: 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_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Expected O, but got Unknown
		//IL_00dc: Expected O, but got Unknown
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Expected O, but got Unknown
		//IL_00fc: 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_0108: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0114: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_0139: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: Expected O, but got Unknown
		//IL_0153: Expected O, but got Unknown
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_015a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_016d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0174: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Unknown result type (might be due to invalid IL or missing references)
		//IL_017f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_0185: Unknown result type (might be due to invalid IL or missing references)
		//IL_018c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bc: Expected O, but got Unknown
		//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f9: Expected O, but got Unknown
		//IL_01fe: Expected O, but got Unknown
		//IL_0209: Expected O, but got Unknown
		//IL_020b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0217: Unknown result type (might be due to invalid IL or missing references)
		//IL_021e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0223: Unknown result type (might be due to invalid IL or missing references)
		//IL_022a: Unknown result type (might be due to invalid IL or missing references)
		//IL_022b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0230: Unknown result type (might be due to invalid IL or missing references)
		//IL_0235: Unknown result type (might be due to invalid IL or missing references)
		//IL_0236: Unknown result type (might be due to invalid IL or missing references)
		//IL_023b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0242: Unknown result type (might be due to invalid IL or missing references)
		//IL_024d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0258: Unknown result type (might be due to invalid IL or missing references)
		//IL_0263: Unknown result type (might be due to invalid IL or missing references)
		//IL_0268: Unknown result type (might be due to invalid IL or missing references)
		//IL_0272: Expected O, but got Unknown
		//IL_0272: Unknown result type (might be due to invalid IL or missing references)
		//IL_0273: Unknown result type (might be due to invalid IL or missing references)
		//IL_0278: Unknown result type (might be due to invalid IL or missing references)
		//IL_027f: Unknown result type (might be due to invalid IL or missing references)
		//IL_028a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0295: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02af: Expected O, but got Unknown
		//IL_02b4: Expected O, but got Unknown
		//IL_02bf: Expected O, but got Unknown
		//IL_02c6: Expected O, but got Unknown
		SL_SkillTree val = new SL_SkillTree
		{
			Name = "Relic Keeper",
			SkillRows = new List<SL_SkillRow>
			{
				new SL_SkillRow
				{
					RowIndex = 1,
					Slots = new List<SL_BaseSkillSlot>
					{
						(SL_BaseSkillSlot)new SL_SkillSlot
						{
							ColumnIndex = 1,
							SilverCost = 50,
							SkillID = 2502518,
							Breakthrough = false,
							RequiredSkillSlot = Vector2.zero
						},
						(SL_BaseSkillSlot)new SL_SkillSlot
						{
							ColumnIndex = 2,
							SilverCost = 50,
							SkillID = 2502520,
							Breakthrough = false,
							RequiredSkillSlot = Vector2.zero
						},
						(SL_BaseSkillSlot)new SL_SkillSlot
						{
							ColumnIndex = 3,
							SilverCost = 50,
							SkillID = 2502532,
							Breakthrough = false,
							RequiredSkillSlot = Vector2.zero
						}
					}
				},
				new SL_SkillRow
				{
					RowIndex = 2,
					Slots = new List<SL_BaseSkillSlot>()
				},
				new SL_SkillRow
				{
					RowIndex = 3,
					Slots = new List<SL_BaseSkillSlot> { (SL_BaseSkillSlot)new SL_SkillSlot
					{
						ColumnIndex = 2,
						SilverCost = 500,
						SkillID = 2502526,
						Breakthrough = true,
						RequiredSkillSlot = Vector2.zero
					} }
				},
				new SL_SkillRow
				{
					RowIndex = 4,
					Slots = new List<SL_BaseSkillSlot> { (SL_BaseSkillSlot)new SL_SkillSlotFork
					{
						ColumnIndex = 2,
						RequiredSkillSlot = Vector2.zero,
						Choice1 = new SL_SkillSlot
						{
							ColumnIndex = 2,
							SilverCost = 600,
							SkillID = 2502529,
							RequiredSkillSlot = new Vector2(3f, 2f)
						},
						Choice2 = new SL_SkillSlot
						{
							ColumnIndex = 2,
							SilverCost = 600,
							SkillID = 2502521,
							RequiredSkillSlot = new Vector2(3f, 2f)
						}
					} }
				},
				new SL_SkillRow
				{
					RowIndex = 5,
					Slots = new List<SL_BaseSkillSlot> { (SL_BaseSkillSlot)new SL_SkillSlotFork
					{
						ColumnIndex = 2,
						RequiredSkillSlot = Vector2.zero,
						Choice1 = new SL_SkillSlot
						{
							ColumnIndex = 2,
							SilverCost = 600,
							SkillID = 2502527,
							RequiredSkillSlot = new Vector2(3f, 2f)
						},
						Choice2 = new SL_SkillSlot
						{
							ColumnIndex = 2,
							SilverCost = 600,
							SkillID = 2502525,
							RequiredSkillSlot = new Vector2(3f, 2f)
						}
					} }
				}
			}
		};
		skillTreeInstance = val.CreateBaseSchool();
		val.ApplyRows();
		RelicKeeperSkillSchool = skillTreeInstance;
	}
}
public class HarmalanNPC : SynchronizedNPC
{
	public const string NAME = "Harmalan";

	public static void Init()
	{
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Expected O, but got Unknown
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: Expected O, but got Unknown
		int[] defaultEquipment = new int[5] { 3000303, 3000340, 3000205, 2502522, 5300170 };
		VisualData visualData = new VisualData
		{
			Gender = (Gender)0,
			HeadVariationIndex = 2,
			HairStyleIndex = 0,
			HairColorIndex = 0
		};
		HarmalanNPC harmalanNPC = new HarmalanNPC("Harmalan", 21, defaultEquipment, null, null, null, visualData);
		((SynchronizedNPC)harmalanNPC).AddToScene(new SynchronizedNPCScene("Chersonese_Dungeon1", new Vector3(-43.9981f, 10.0289f, -4.8826f), new Vector3(0f, 119.5807f, 0f), (Factions?)null, true, (SpellCastType)(-1), (string)null, (int[])null, (int[])null, (Func<bool>)null));
	}

	public HarmalanNPC(string identifierName, int rpcListenerID, int[] defaultEquipment = null, int[] moddedEquipment = null, Vector3? scale = null, Factions? faction = null, VisualData visualData = null)
		: base(identifierName, rpcListenerID, defaultEquipment, moddedEquipment, scale, faction, visualData)
	{
	}

	public override object SetupClientSide(int rpcListenerID, string instanceUID, int sceneViewID, int recursionCount, string rpcMeta)
	{
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		object obj = ((SynchronizedNPC)this).SetupClientSide(rpcListenerID, instanceUID, sceneViewID, recursionCount, rpcMeta);
		Character val = (Character)((obj is Character) ? obj : null);
		if ((Object)(object)val == (Object)null)
		{
			return null;
		}
		GameObject gameObject = ((Component)val).gameObject;
		GameObject val2 = TinyDialogueManager.AssignTrainerTemplate(gameObject.transform);
		DialogueActor val3 = TinyDialogueManager.SetDialogueActorName(val2, ((SynchronizedWorldObject)this).IdentifierName);
		Trainer val4 = TinyDialogueManager.SetTrainerSkillTree(val2, RelicKeeper.RelicKeeperSkillTreeInstance.UID);
		Graph dialogueGraph = TinyDialogueManager.GetDialogueGraph(val2);
		TinyDialogueManager.SetActorReference(dialogueGraph, val3);
		dialogueGraph.allNodes.Clear();
		ActionNode val5 = TinyDialogueManager.MakeTrainDialogueAction(dialogueGraph, val4);
		StatementNodeExt val6 = TinyDialogueManager.MakeStatementNode(dialogueGraph, ((SynchronizedWorldObject)this).IdentifierName, "Hmmmmm...?");
		StatementNodeExt val7 = TinyDialogueManager.MakeStatementNode(dialogueGraph, ((SynchronizedWorldObject)this).IdentifierName, "I am Harmalan, a Relic Keeper");
		StatementNodeExt val8 = TinyDialogueManager.MakeStatementNode(dialogueGraph, ((SynchronizedWorldObject)this).IdentifierName, "I collect relics and channel their powers. It's a very versatile craft.");
		StatementNodeExt val9 = TinyDialogueManager.MakeStatementNode(dialogueGraph, ((SynchronizedWorldObject)this).IdentifierName, "No worries. Take care.");
		StatementNodeExt val10 = TinyDialogueManager.MakeStatementNode(dialogueGraph, ((SynchronizedWorldObject)this).IdentifierName, "Absolutely!");
		string text = "Can you teach me anything?";
		string text2 = "Who are you?";
		string text3 = "Sorry for bothering.";
		string text4 = "Relic Keeper, you say? What does that mean?";
		MultipleChoiceNodeExt val11 = TinyDialogueManager.MakeMultipleChoiceNode(dialogueGraph, new string[3] { text2, text, text3 });
		MultipleChoiceNodeExt val12 = TinyDialogueManager.MakeMultipleChoiceNode(dialogueGraph, new string[1] { text4 });
		dialogueGraph.primeNode = (Node)(object)val6;
		TinyDialogueManager.ChainNodes(dialogueGraph, (Node[])(object)new Node[2]
		{
			(Node)val6,
			(Node)val11
		});
		TinyDialogueManager.ConnectMultipleChoices(dialogueGraph, (Node)(object)val11, (Node[])(object)new Node[3]
		{
			(Node)val7,
			(Node)val10,
			(Node)val9
		});
		TinyDialogueManager.ChainNodes(dialogueGraph, (Node[])(object)new Node[2]
		{
			(Node)val10,
			(Node)val5
		});
		TinyDialogueManager.ChainNodes(dialogueGraph, (Node[])(object)new Node[2]
		{
			(Node)val7,
			(Node)val12
		});
		TinyDialogueManager.ConnectMultipleChoices(dialogueGraph, (Node)(object)val12, (Node[])(object)new Node[1] { (Node)val8 });
		TinyDialogueManager.ChainNodes(dialogueGraph, (Node[])(object)new Node[2]
		{
			(Node)val8,
			(Node)val11
		});
		GameObject gameObject2 = ((Component)gameObject.transform.parent).gameObject;
		gameObject2.SetActive(true);
		return val;
	}
}
public class ArcaneInfluence
{
	public static Skill Init()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: 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_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: 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_009f: 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_00c0: Expected O, but got Unknown
		SL_Skill val = new SL_Skill
		{
			Name = "Arcane Influence",
			EffectBehaviour = (EditBehaviours)2,
			Target_ItemID = 8205030,
			New_ItemID = 2502529,
			SLPackName = RelicKeeper.ModFolderName,
			SubfolderName = "ArcaneInfluence",
			Description = "You may benefit from passive relic effects.",
			IsUsable = false,
			CastType = (SpellCastType)(-1),
			CastModifier = (SpellCastModifier)0,
			CastLocomotionEnabled = false,
			MobileCastMovementMult = -1f,
			Cooldown = 0f,
			StaminaCost = 0f,
			ManaCost = 0f
		};
		((ContentTemplate)val).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
		return (Skill)(object)((itemPrefab is Skill) ? itemPrefab : null);
	}
}
public class RelicFundamentals
{
	public static Skill Init()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: 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_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: 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_009f: 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_00c0: Expected O, but got Unknown
		SL_Skill val = new SL_Skill
		{
			Name = "Relic Fundamentals",
			EffectBehaviour = (EditBehaviours)2,
			Target_ItemID = 8205030,
			New_ItemID = 2502532,
			SLPackName = RelicKeeper.ModFolderName,
			SubfolderName = "RelicFundamentals",
			Description = "Display relic information in their descriptions.",
			IsUsable = false,
			CastType = (SpellCastType)(-1),
			CastModifier = (SpellCastModifier)0,
			CastLocomotionEnabled = false,
			MobileCastMovementMult = -1f,
			Cooldown = 0f,
			StaminaCost = 0f,
			ManaCost = 0f
		};
		((ContentTemplate)val).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
		return (Skill)(object)((itemPrefab is Skill) ? itemPrefab : null);
	}
}
public class MythicLore
{
	public static Skill Init()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: 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_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: 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_009f: 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_00c0: Expected O, but got Unknown
		SL_Skill val = new SL_Skill
		{
			Name = "Mythic Lore",
			EffectBehaviour = (EditBehaviours)2,
			Target_ItemID = 8205030,
			New_ItemID = 2502527,
			SLPackName = RelicKeeper.ModFolderName,
			SubfolderName = "MythicLore",
			Description = "Enables you to Use and Unleash mythic relic effects.",
			IsUsable = false,
			CastType = (SpellCastType)(-1),
			CastModifier = (SpellCastModifier)0,
			CastLocomotionEnabled = false,
			MobileCastMovementMult = -1f,
			Cooldown = 0f,
			StaminaCost = 0f,
			ManaCost = 0f
		};
		((ContentTemplate)val).ApplyTemplate();
		Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(((SL_Item)val).New_ItemID);
		return (Skill)(object)((itemPrefab is Skill) ? itemPrefab : null);
	}
}
public class RelicLore
{
	public static Skill Init()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: 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_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: 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_009f: 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_00c0: Expected O, but got Unknown
		SL_Skill val = new SL_Skill
		{
			Name = "Relic Lore",
			EffectBehaviour = (EditBehaviours)2,
			Target_ItemID = 8205030,
			New_ItemID = 2502526,
			SLPackName = RelicKeeper.ModFolderName,
			SubfolderName = "RelicLore",
			Description = "Enables you to Use and Unleash stronger relic effects.",
			IsUsable = false,
			CastType = (SpellCastType)(-1),
			CastModifier = (SpellCastModifier)0,
			CastLocomotionEnabled = false,
			MobileCastMovementMult = -1f,
			Cooldown = 0f,
			StaminaCost =

plugins/SynchronizedWorldObjects.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;
using HarmonyLib;
using MapMagic;
using Photon;
using SideLoader;
using TinyHelper;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace SynchronizedWorldObjects;

[BepInPlugin("com.ehaugw.synchronizedworldobjects", "Synchronized World Objects", "1.0.3")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency("com.ehaugw.tinyhelper", "4.8.2")]
public class SynchronizedWorldObjects : BaseUnityPlugin
{
	public const string GUID = "com.ehaugw.synchronizedworldobjects";

	public const string VERSION = "1.0.3";

	public const string NAME = "Synchronized World Objects";

	internal void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Expected O, but got Unknown
		GameObject val = new GameObject("SynchronizedWorldObjectsRPC");
		Object.DontDestroyOnLoad((Object)(object)val);
		val.AddComponent<SynchronizedWorldObjectManager>();
		SynchronizedWorldObjectManager.SyncedWorldObjects = new List<SynchronizedWorldObject>();
		SL.OnPacksLoaded += OnPackLoaded;
		SL.OnSceneLoaded += OnSceneLoaded;
		Harmony val2 = new Harmony("com.ehaugw.synchronizedworldobjects");
		val2.PatchAll();
	}

	private void OnPackLoaded()
	{
	}

	private void OnSceneLoaded()
	{
		SynchronizedWorldObjectManager.OnSceneLoaded();
	}
}
public abstract class SynchronizedWorldObject
{
	public string IdentifierName;

	public string SceneIdentifierName;

	public int RPCListenerID;

	public string Uid;

	public SynchronizedWorldObject(string identifierName, int rpcListenerID)
	{
		IdentifierName = identifierName;
		RPCListenerID = rpcListenerID;
		SynchronizedWorldObjectManager.SyncedWorldObjects.Add(this);
	}

	public virtual bool ShouldBeSpawned()
	{
		return SceneManagerHelper.ActiveSceneName == SceneIdentifierName;
	}

	public abstract bool OnSceneLoaded();

	public abstract bool OnGuestJoined(string guestUID);

	public abstract object SetupClientSide(int rpcListenerID, string instanceUID, int sceneViewID, int recursionCount, string rpcMeta);
}
internal class SynchronizedWorldObjectManager : MonoBehaviour
{
	public static SynchronizedWorldObjectManager Instance;

	public static List<SynchronizedWorldObject> SyncedWorldObjects;

	public static void OnSceneLoaded()
	{
		foreach (SynchronizedWorldObject syncedWorldObject in SyncedWorldObjects)
		{
			syncedWorldObject.OnSceneLoaded();
		}
	}

	internal void Start()
	{
		Instance = this;
		PhotonView val = ((Component)this).gameObject.AddComponent<PhotonView>();
		val.viewID = 951;
		Debug.Log((object)("Registered SynchronizedWorldObjectManager with ViewID " + ((MonoBehaviour)this).photonView.viewID));
	}

	[PunRPC]
	public void SetupClientSide(int rpcListenerID, string instanceUID, int sceneViewID, int recursionCount, string rpcMeta)
	{
		foreach (SynchronizedWorldObject syncedWorldObject in SyncedWorldObjects)
		{
			syncedWorldObject.SetupClientSide(rpcListenerID, instanceUID, sceneViewID, recursionCount, rpcMeta);
		}
	}
}
public class SynchronizedDeployable : SynchronizedEquipment
{
	public SynchronizedDeployable(int itemID)
		: base(itemID)
	{
	}

	public override object SetupClientSide(int rpcListenerID, string instanceUID, int sceneViewID, int recursionCount, string rpcMeta)
	{
		return null;
	}

	public override Item SetupServerSide()
	{
		Item val = base.SetupServerSide();
		val.IsPickable = false;
		val.HasPhysicsWhenWorld = false;
		Deployable component = ((Component)val).GetComponent<Deployable>();
		component.StartDeployAnimation();
		Dropable component2 = ((Component)val).GetComponent<Dropable>();
		if (Object.op_Implicit((Object)(object)component2))
		{
			component2.GenerateContents();
		}
		FueledContainer component3 = ((Component)val).GetComponent<FueledContainer>();
		if (Object.op_Implicit((Object)(object)component3))
		{
			component3.TryKindle = true;
		}
		return val;
	}
}
public class SynchronizedEquipment : SynchronizedWorldObject
{
	public Vector3 Position;

	public Vector3 Rotation;

	public Vector3 Scale;

	public int ItemID;

	public bool IsPickable = false;

	public SynchronizedEquipment(int itemID)
		: base("-1", -1)
	{
		ItemID = itemID;
	}

	public void AddToScene(string scene, Vector3 position, Vector3 rotation, Vector3 scale)
	{
		//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_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		SceneIdentifierName = scene;
		Position = position;
		Rotation = rotation;
		Scale = scale;
	}

	public override bool OnGuestJoined(string guestUID)
	{
		return false;
	}

	public override bool OnSceneLoaded()
	{
		if (ShouldBeSpawned())
		{
			if (!PhotonNetwork.isNonMasterClientInRoom)
			{
				SetupServerSide();
			}
			return true;
		}
		return false;
	}

	public override object SetupClientSide(int rpcListenerID, string instanceUID, int sceneViewID, int recursionCount, string rpcMeta)
	{
		return null;
	}

	public virtual Item SetupServerSide()
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//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)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		Item val = ItemManager.Instance.GenerateItemNetwork(ItemID);
		val.ChangeParent((Transform)null, Position, Extensions.EulerToQuat(Rotation));
		val.SetForceSyncPos();
		val.SaveType = (SaveTypes)2;
		val.IsPickable = false;
		val.HasPhysicsWhenWorld = true;
		return val;
	}
}
public class SynchronizedNPCScene
{
	public string Scene;

	public Vector3 Position;

	public Vector3 Rotation;

	public Factions? Faction;

	public bool Sheathed;

	public SpellCastType Pose;

	public string RPCMeta;

	public int[] DefaultEquipment;

	public int[] ModdedEquipment;

	public Func<bool> ShouldSpawnInScene;

	public SynchronizedNPCScene(string scene, Vector3 position, Vector3 rotation, Factions? faction = null, bool sheathed = true, SpellCastType pose = -1, string rpcMeta = null, int[] defaultEquipment = null, int[] moddedEquipment = null, Func<bool> shouldSpawnInScene = null)
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: 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_0030: Unknown result type (might be due to invalid IL or missing references)
		Scene = scene;
		Position = position;
		Rotation = rotation;
		Faction = faction;
		Sheathed = sheathed;
		Pose = pose;
		RPCMeta = rpcMeta;
		DefaultEquipment = defaultEquipment;
		ModdedEquipment = moddedEquipment;
		ShouldSpawnInScene = shouldSpawnInScene ?? ((Func<bool>)(() => true));
	}
}
public class SynchronizedNPC : SynchronizedWorldObject
{
	public enum HairColors
	{
		BrownMedium,
		BrownBright,
		BrownDark,
		Black,
		Blonde,
		White,
		Red,
		Blue,
		Green,
		Orange,
		Purple
	}

	public enum HairStyles
	{
		Bald,
		Basic,
		PonyTail,
		Wild,
		CombedBack,
		PonyTailBraids,
		BraidsBack,
		Bun,
		MaleShort,
		MaleMedium,
		MaleLong,
		CornrowsMedium,
		CornrowsLong,
		CornrowsShort,
		Ball
	}

	public int[] DefaultEquipment = new int[0];

	public int[] ModdedEquipment = new int[0];

	public Vector3 Scale;

	public string RPCMeta;

	public Factions Faction;

	private Character localCharacter;

	private AIRoot aiRoot;

	public VisualData VisualData;

	public List<SynchronizedNPCScene> Scenes = new List<SynchronizedNPCScene>();

	public SynchronizedNPCScene ActiveScene;

	public SynchronizedNPC(string identifierName, int rpcListenerID, int[] defaultEquipment = null, int[] moddedEquipment = null, Vector3? scale = null, Factions? faction = null, VisualData visualData = null)
		: base(identifierName, rpcListenerID)
	{
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		DefaultEquipment = defaultEquipment ?? new int[0];
		ModdedEquipment = moddedEquipment ?? new int[0];
		Scale = (Vector3)(((??)scale) ?? Vector3.one);
		Faction = faction.GetValueOrDefault();
		VisualData = visualData;
	}

	public void AddToScene(SynchronizedNPCScene scene)
	{
		Scenes.Add(scene);
	}

	public void AssignAI(AIRoot aiRoot)
	{
		this.aiRoot = aiRoot;
	}

	public GameObject GetGameObject()
	{
		return GameObject.Find("UNPC_" + IdentifierName);
	}

	public object GetSynchronizedObject(string instanceUID)
	{
		return CharacterManager.Instance.GetCharacter(instanceUID);
	}

	public override bool ShouldBeSpawned()
	{
		foreach (SynchronizedNPCScene scene in Scenes)
		{
			if (scene.ShouldSpawnInScene() && scene.Scene == SceneManagerHelper.ActiveSceneName)
			{
				ActiveScene = scene;
				return true;
			}
		}
		return false;
	}

	public override bool OnSceneLoaded()
	{
		if (ShouldBeSpawned())
		{
			if (!PhotonNetwork.isNonMasterClientInRoom)
			{
				int num = PhotonNetwork.AllocateSceneViewID();
				GameObject gameObject = GetGameObject();
				if ((Object)(object)gameObject == (Object)null)
				{
					SetupServerSide();
					((MonoBehaviour)SynchronizedWorldObjectManager.Instance).photonView.RPC("SetupClientSide", (PhotonTargets)0, new object[5] { RPCListenerID, Uid, num, 0, ActiveScene.RPCMeta });
					return true;
				}
			}
		}
		else
		{
			GameObject gameObject2 = GetGameObject();
			if (gameObject2 != null)
			{
				Object.DestroyImmediate((Object)(object)gameObject2);
			}
		}
		return false;
	}

	public override bool OnGuestJoined(string guestUID)
	{
		if (ShouldBeSpawned())
		{
			if (!PhotonNetwork.isNonMasterClientInRoom)
			{
				int num = PhotonNetwork.AllocateSceneViewID();
				GameObject gameObject = GetGameObject();
				if ((Object)(object)gameObject == (Object)null)
				{
					((MonoBehaviour)SynchronizedWorldObjectManager.Instance).photonView.RPC("SetupClientSide", (PhotonTargets)0, new object[5] { RPCListenerID, Uid, num, 0, ActiveScene.RPCMeta });
					return true;
				}
			}
		}
		else
		{
			GameObject gameObject2 = GetGameObject();
			if (gameObject2 != null)
			{
				Object.DestroyImmediate((Object)(object)gameObject2);
			}
		}
		return false;
	}

	public override object SetupClientSide(int rpcListenerID, string instanceUID, int sceneViewID, int recursionCount, string rpcMeta)
	{
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Expected O, but got Unknown
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_01be: Unknown result type (might be due to invalid IL or missing references)
		if (RPCListenerID != rpcListenerID)
		{
			return null;
		}
		ActiveScene = Scenes.FirstOrDefault((SynchronizedNPCScene x) => x.RPCMeta == rpcMeta);
		int num = 200;
		object synchronizedObject = GetSynchronizedObject(instanceUID);
		Character val = (Character)((synchronizedObject is Character) ? synchronizedObject : null);
		if ((Object)(object)val == (Object)null)
		{
			if (recursionCount * num < 20000)
			{
				DelayedTask.GetTask(num).ContinueWith((Task _) => SetupClientSide(rpcListenerID, instanceUID, sceneViewID, recursionCount + 1, rpcMeta));
				Console.Read();
				return null;
			}
			Debug.Log((object)("SynchronizedNPC with UID " + instanceUID + " could not fetched from server"));
			return null;
		}
		GameObject val2 = new GameObject("UNPC_" + IdentifierName);
		val2.transform.position = ActiveScene.Position;
		val2.transform.rotation = Quaternion.Euler(ActiveScene.Rotation);
		GameObject gameObject = ((Component)val).gameObject;
		if (VisualData != null)
		{
			((MonoBehaviour)TinyHelper.Instance).StartCoroutine(SL_Character.SetVisuals(val, ((object)VisualData).ToString()));
		}
		gameObject.transform.parent = val2.transform;
		gameObject.transform.position = val2.transform.position;
		gameObject.transform.rotation = val2.transform.rotation;
		gameObject.transform.localScale = Scale;
		Object.DestroyImmediate((Object)(object)gameObject.GetComponent<StartingEquipment>());
		((Behaviour)val.Stats).enabled = false;
		Weapon currentWeapon = val.CurrentWeapon;
		if (currentWeapon != null && ((Equipment)currentWeapon).TwoHanded)
		{
			val.LeftHandEquipment = (Equipment)(object)val.CurrentWeapon;
			val.LeftHandChanged();
		}
		if ((Object)(object)val.CurrentWeapon != (Object)null)
		{
			val.Sheathed = ActiveScene.Sheathed;
		}
		localCharacter = val;
		return val;
	}

	public void AITick()
	{
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: Expected I4, but got Unknown
		DelayedTask.GetTask(1000).ContinueWith(delegate
		{
			AITick();
		});
		Console.Read();
		if ((Object)(object)localCharacter != (Object)null)
		{
			SpellCastType[] array = (SpellCastType[])(object)new SpellCastType[2]
			{
				(SpellCastType)55,
				(SpellCastType)41
			};
			if (UnityEngineExtensions.Contains<SpellCastType>(array, ActiveScene.Pose) && localCharacter.InLocomotion)
			{
				localCharacter.Animator.SetInteger("SpellType", (int)ActiveScene.Pose);
				localCharacter.Animator.SetTrigger("Spell");
			}
		}
	}

	public object SetupServerSide()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		UID val = UID.Generate();
		string text = ((object)(UID)(ref val)).ToString();
		GameObject gameObject = ((Component)TinyCharacterManager.SpawnCharacter(text, ActiveScene.Position, ActiveScene.Rotation)).gameObject;
		gameObject.transform.rotation = Quaternion.Euler(ActiveScene.Rotation);
		Character component = gameObject.GetComponent<Character>();
		At.SetField<Character>(component, "m_instantiationType", (object)(CharacterInstantiationTypes)2);
		int[] array = ActiveScene.DefaultEquipment ?? DefaultEquipment;
		foreach (int num in array)
		{
			? val2 = component.Inventory.Equipment;
			Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(num);
			((CharacterEquipment)val2).EquipInstantiate((Equipment)(object)((itemPrefab is Equipment) ? itemPrefab : null));
		}
		int[] array2 = ActiveScene.ModdedEquipment ?? ModdedEquipment;
		for (int j = 0; j < array2.Length; j++)
		{
			int num2 = array2[j];
			if (ResourcesPrefabManager.Instance.ContainsItemPrefab(num2.ToString()))
			{
				Item obj = ItemManager.Instance.GenerateItemNetwork(num2);
				Equipment val3 = (Equipment)(object)((obj is Equipment) ? obj : null);
				component.Inventory.TakeItem(((Item)val3).UID);
				At.Invoke<CharacterEquipment>(component.Inventory.Equipment, "EquipWithoutAssociating", new Type[2]
				{
					typeof(Equipment),
					typeof(bool)
				}, new object[2] { val3, false });
			}
		}
		Weapon currentWeapon = component.CurrentWeapon;
		if (currentWeapon != null && ((Equipment)currentWeapon).TwoHanded)
		{
			component.LeftHandEquipment = (Equipment)(object)component.CurrentWeapon;
			component.LeftHandChanged();
		}
		if ((Object)(object)component.CurrentWeapon != (Object)null)
		{
			component.Sheathed = ActiveScene.Sheathed;
		}
		component.ChangeFaction((Factions)(((??)ActiveScene.Faction) ?? Faction), true);
		gameObject.SetActive(true);
		DelayedTask.GetTask(1000).ContinueWith(delegate
		{
			AITick();
		});
		Console.Read();
		Uid = text;
		return text;
	}
}

plugins/TinyHelper.dll

Decompiled a day ago
#define DEBUG
using System;
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.Threading;
using System.Threading.Tasks;
using BepInEx;
using CharacterQuestKnowledgeExtensions;
using HarmonyLib;
using Localizer;
using NodeCanvas.DialogueTrees;
using NodeCanvas.Framework;
using NodeCanvas.Tasks.Actions;
using NodeCanvas.Tasks.Conditions;
using Photon;
using TinyHelper;
using TinyHelper.Effects;
using TinyHelper.Interfaces;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
public static class TinyHelpers
{
	public static void Shuffle<T>(this IList<T> list)
	{
		Random random = new Random();
		int count = list.Count;
		for (int num = list.Count - 1; num > 1; num--)
		{
			int index = random.Next(num + 1);
			T value = list[index];
			list[index] = list[num];
			list[num] = value;
		}
	}
}
namespace CharacterQuestKnowledgeExtensions
{
	public static class CharacterQuestKnowledgeExtensions
	{
		public static bool IsItemLearnedLocal(this CharacterQuestKnowledge questKnowledge, int _itemID)
		{
			return (from q in ((CharacterKnowledge)questKnowledge).GetLearnedItems()
				where q.ItemID == _itemID && Object.op_Implicit((Object)(object)((EffectSynchronizer)q).OwnerCharacter)
				select q).Count() > 0;
		}

		public static bool IsQuestCompletedLocal(this CharacterQuestKnowledge questKnowledge, int _itemID)
		{
			return ((CharacterKnowledge)questKnowledge).GetLearnedItems().Where(delegate(Item q)
			{
				int result;
				if (q.ItemID == _itemID && Object.op_Implicit((Object)(object)((EffectSynchronizer)q).OwnerCharacter))
				{
					Quest val = (Quest)(object)((q is Quest) ? q : null);
					if (val != null)
					{
						result = (val.IsCompleted ? 1 : 0);
						goto IL_002e;
					}
				}
				result = 0;
				goto IL_002e;
				IL_002e:
				return (byte)result != 0;
			}).Count() > 0;
		}
	}
}
namespace CharacterExtensions
{
	public static class CharacterExtensions
	{
		public static List<Item> EquippedOnBag(this Character character)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			object result;
			if (character == null)
			{
				result = null;
			}
			else
			{
				CharacterInventory inventory = character.Inventory;
				result = ((inventory == null) ? null : inventory.GetOwnedItems(TinyTagManager.GetOrMakeTag("Item"))?.Where((Item x) => x.DisplayedOnBag)?.ToList());
			}
			return (List<Item>)result;
		}
	}
}
namespace TinyHelper
{
	public static class At
	{
		public static BindingFlags flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

		public static object Call(object obj, string method, params object[] args)
		{
			MethodInfo method2 = obj.GetType().GetMethod(method, flags);
			if (method2 != null)
			{
				return method2.Invoke(obj, args);
			}
			return null;
		}

		public static void SetValue<T>(T value, Type type, object obj, string field)
		{
			FieldInfo field2 = type.GetField(field, flags);
			if (field2 != null)
			{
				field2.SetValue(obj, value);
			}
		}

		public static object GetValue(Type type, object obj, string value)
		{
			FieldInfo field = type.GetField(value, flags);
			if (field != null)
			{
				return field.GetValue(obj);
			}
			return null;
		}

		public static void InheritBaseValues(object _derived, object _base)
		{
			FieldInfo[] fields = _base.GetType().GetFields(flags);
			foreach (FieldInfo fieldInfo in fields)
			{
				try
				{
					_derived.GetType().GetField(fieldInfo.Name).SetValue(_derived, fieldInfo.GetValue(_base));
				}
				catch
				{
				}
			}
		}
	}
	public class QuestKnowledgeCondition : EffectCondition
	{
		public int[] Quests;

		public LogicType Logic = LogicType.Any;

		protected override bool CheckIsValid(Character _affectedCharacter)
		{
			return QuestRequirements.HasQuestKnowledge(_affectedCharacter, Quests, Logic);
		}
	}
	public class StatusEffectsCondition : EffectCondition
	{
		public enum LogicType
		{
			Any,
			All
		}

		public string[] StatusEffectNames;

		public LogicType Logic = LogicType.Any;

		protected override bool CheckIsValid(Character _affectedCharacter)
		{
			StatusEffectManager statusEffectManager = ((_affectedCharacter != null) ? _affectedCharacter.StatusEffectMngr : null);
			if (statusEffectManager != null)
			{
				IEnumerable<bool> source = StatusEffectNames.Select((string x) => (Object)(object)statusEffectManager.GetStatusEffectOfName(x) != (Object)null);
				return (Logic == LogicType.Any) ? source.Any((bool x) => x) : source.All((bool x) => x);
			}
			return false;
		}
	}
	public class AddNewStatusEffectRandom : AddStatusEffectRandom
	{
		protected override bool TryTriggerConditions()
		{
			List<StatusEffect> list = base.Statuses.ToList();
			list.Shuffle();
			base.ForceID = -1;
			for (int i = 0; i < list.Count; i++)
			{
				StatusEffect val = list[i];
				if (!((Object)(object)val == (Object)null) && !((Object)(object)((Effect)this).m_affectedCharacter == (Object)null) && !((Effect)this).m_affectedCharacter.StatusEffectMngr.HasStatusEffect(val.EffectFamily))
				{
					base.ForceID = UnityEngineExtensions.IndexOf<StatusEffect>(base.Statuses, val);
					break;
				}
			}
			return ((AddStatusEffectRandom)this).TryTriggerConditions();
		}
	}
	public class EnableHitDetection : Effect
	{
		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			Item parentItem = ((Effect)this).ParentItem;
			MeleeSkill val = (MeleeSkill)(object)((parentItem is MeleeSkill) ? parentItem : null);
			if (val != null && (Object)(object)val.MeleeHitDetector != (Object)null)
			{
				MeleeHitDetector val2 = ((_affectedCharacter != null) ? _affectedCharacter.SkillMeleeDetector : null);
				if (val2 != null)
				{
					val2.HitStarted(-1);
					return;
				}
			}
			Weapon obj = ((_affectedCharacter != null) ? _affectedCharacter.CurrentWeapon : null);
			MeleeWeapon val3 = (MeleeWeapon)(object)((obj is MeleeWeapon) ? obj : null);
			if (val3 != null)
			{
				((Weapon)val3).HitStarted(-1);
			}
		}
	}
	public class RemoveItemFromInventory : Effect
	{
		public int ItemID;

		public int Amount = 1;

		public bool AffectOwner = false;

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			if (AffectOwner)
			{
				_affectedCharacter = ((Effect)this).OwnerCharacter;
			}
			CharacterInventory inventory = _affectedCharacter.Inventory;
			if (inventory != null)
			{
				inventory.RemoveItem(ItemID, Amount);
			}
		}
	}
	public class CooldownChangeEffect : Effect
	{
		public float HitKnockbackCooldown = -1f;

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			Item parentItem = ((Effect)this).ParentItem;
			Skill val = (Skill)(object)((parentItem is Skill) ? parentItem : null);
			if (val != null && HitKnockbackCooldown != -1f && _affectedCharacter.IsInKnockback)
			{
				At.SetValue(HitKnockbackCooldown, typeof(Skill), val, "m_remainingCooldownTime");
			}
		}
	}
	public class EquipSkillDurabilityCondition : EquipDurabilityCondition
	{
		protected override bool CheckIsValid(Character _affectedCharacter)
		{
			Skill component = ((Component)((Component)this).transform.parent.parent).gameObject.GetComponent<Skill>();
			if (component != null)
			{
				base.DurabilityRequired = component.DurabilityCost;
			}
			return ((EquipDurabilityCondition)this).CheckIsValid(_affectedCharacter);
		}

		public static ActivationCondition AddToSkill(Skill skill, EquipmentSlotIDs slot)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0035: 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)
			Transform orMake = TinyGameObjectManager.GetOrMake(((Component)skill).transform, "AdditionalActivationConditions", setActive: true, dontDestroyOnLoad: true);
			GameObject gameObject = ((Component)TinyGameObjectManager.GetOrMake(orMake, "EquipSkillDurabilityCondition", setActive: true, dontDestroyOnLoad: true)).gameObject;
			ActivationCondition val = new ActivationCondition();
			EquipSkillDurabilityCondition equipSkillDurabilityCondition = gameObject.AddComponent<EquipSkillDurabilityCondition>();
			((EquipDurabilityCondition)equipSkillDurabilityCondition).EquipmentSlot = slot;
			val.Condition = (EffectCondition)(object)equipSkillDurabilityCondition;
			At.SetValue("A required piece of equipment is missing or too damaged to be used this way.", typeof(ActivationCondition), val, "m_defaultMessage");
			List<ActivationCondition> list = (At.GetValue(typeof(Skill), skill, "m_additionalConditions") as ActivationCondition[])?.ToList() ?? new List<ActivationCondition>();
			list.Add(val);
			At.SetValue(list.ToArray(), typeof(Skill), skill, "m_additionalConditions");
			return val;
		}

		public static ActivationCondition AddToSkillNotBroken(Skill skill, EquipmentSlotIDs slot)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0035: 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)
			Transform orMake = TinyGameObjectManager.GetOrMake(((Component)skill).transform, "AdditionalActivationConditions", setActive: true, dontDestroyOnLoad: true);
			GameObject gameObject = ((Component)TinyGameObjectManager.GetOrMake(orMake, "EquipDurabilityCondition", setActive: true, dontDestroyOnLoad: true)).gameObject;
			ActivationCondition val = new ActivationCondition();
			EquipDurabilityCondition val2 = gameObject.AddComponent<EquipDurabilityCondition>();
			val2.EquipmentSlot = slot;
			val2.DurabilityRequired = 0f;
			val.Condition = (EffectCondition)(object)val2;
			At.SetValue("A required piece of equipment is missing or broken.", typeof(ActivationCondition), val, "m_defaultMessage");
			List<ActivationCondition> list = (At.GetValue(typeof(Skill), skill, "m_additionalConditions") as ActivationCondition[])?.ToList() ?? new List<ActivationCondition>();
			list.Add(val);
			At.SetValue(list.ToArray(), typeof(Skill), skill, "m_additionalConditions");
			return val;
		}
	}
	public class AffectCorruption : Effect
	{
		public float AffectQuantity = 0f;

		public bool AffectOwner = false;

		public bool IsRaw = false;

		protected override KeyValuePair<string, Type>[] GenerateSignature()
		{
			return new KeyValuePair<string, Type>[1]
			{
				new KeyValuePair<string, Type>("Value", typeof(float))
			};
		}

		public override void SetValue(string[] _data)
		{
			if (_data == null || _data.Length >= 1)
			{
				float.TryParse(_data[0], out AffectQuantity);
			}
		}

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			if (AffectOwner)
			{
				_affectedCharacter = ((Effect)this).OwnerCharacter;
			}
			if ((Object)(object)_affectedCharacter != (Object)null && _affectedCharacter.Alive && Object.op_Implicit((Object)(object)_affectedCharacter.PlayerStats))
			{
				_affectedCharacter.PlayerStats.AffectCorruptionLevel(AffectQuantity, !IsRaw);
			}
		}
	}
	public class UseMana : Effect
	{
		public float UsedMana = 0f;

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			_affectedCharacter.Stats.UseMana((Tag[])null, UsedMana);
		}
	}
	public class SpecificImbueCondition : EffectCondition
	{
		public ImbueEffectPreset imbueEffectPreset;

		private bool inverse = false;

		protected override bool CheckIsValid(Character _affectedCharacter)
		{
			Weapon val = ((_affectedCharacter != null) ? _affectedCharacter.CurrentWeapon : null);
			return val != null && val.HasImbuePreset(imbueEffectPreset);
		}

		public static ActivationCondition AddToSkill(Skill skill, ImbueEffectPreset imbueEffectPreset, bool inverse = false)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			GameObject val = new GameObject("SpecificImbueCondition");
			ActivationCondition val2 = new ActivationCondition();
			SpecificImbueCondition specificImbueCondition = val.AddComponent<SpecificImbueCondition>();
			Object.DontDestroyOnLoad((Object)(object)specificImbueCondition);
			val.SetActive(false);
			val2.Condition = (EffectCondition)(object)specificImbueCondition;
			specificImbueCondition.inverse = inverse;
			specificImbueCondition.imbueEffectPreset = imbueEffectPreset;
			At.SetValue("You do not have the required imbue effect.", typeof(ActivationCondition), val2, "m_defaultMessage");
			List<ActivationCondition> list = (At.GetValue(typeof(Skill), skill, "m_additionalConditions") as ActivationCondition[])?.ToList() ?? new List<ActivationCondition>();
			list.Add(val2);
			At.SetValue(list.ToArray(), typeof(Skill), skill, "m_additionalConditions");
			return val2;
		}
	}
	public class ExtendedAddStatusEffect : AddStatusEffect
	{
		public bool ExtendDuration = false;

		protected override void ActivateLocally(Character _targetCharacter, object[] _infos)
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			StatusEffect status = base.Status;
			if (ExtendDuration)
			{
				bool? obj;
				if (_targetCharacter == null)
				{
					obj = null;
				}
				else
				{
					StatusEffectManager statusEffectMngr = _targetCharacter.StatusEffectMngr;
					obj = ((statusEffectMngr != null) ? new bool?(statusEffectMngr.HasStatusEffect(status.IdentifierName)) : null);
				}
				bool? flag = obj;
				if (flag.GetValueOrDefault())
				{
					StatusData statusData = status.StatusData;
					status.StatusData = new StatusData(statusData);
					StatusEffect statusEffectOfName = _targetCharacter.StatusEffectMngr.GetStatusEffectOfName(status.IdentifierName);
					float num = ((statusEffectOfName != null) ? statusEffectOfName.RemainingLifespan : 0f);
					float num2 = ((status.RemainingLifespan > 0f) ? status.RemainingLifespan : status.StartLifespan);
					status.StatusData.LifeSpan = num2 + num;
					((AddStatusEffect)this).ActivateLocally(_targetCharacter, _infos);
					status.StatusData = statusData;
					return;
				}
			}
			((AddStatusEffect)this).ActivateLocally(_targetCharacter, _infos);
		}
	}
	public static class AnimatorExtension
	{
		public static bool HasParameter(this Animator animator, string paramName)
		{
			AnimatorControllerParameter[] parameters = animator.parameters;
			foreach (AnimatorControllerParameter val in parameters)
			{
				if (val.name == paramName)
				{
					return true;
				}
			}
			return false;
		}
	}
	public class TinyCharacterManager
	{
		public static Character SpawnCharacter(string uid, Vector3 position, Vector3 rotation)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			Character character = CharacterManager.Instance.GetCharacter(uid);
			if ((Object)(object)character != (Object)null)
			{
				return character;
			}
			object[] array = new object[4]
			{
				4,
				"NewPlayerPrefab",
				uid,
				string.Empty
			};
			GameObject val = PhotonNetwork.InstantiateSceneObject("_characters/NewPlayerPrefab", position, Quaternion.Euler(rotation), (byte)0, array);
			val.SetActive(false);
			Character component = val.GetComponent<Character>();
			component.SetUID(UID.op_Implicit(uid));
			At.SetValue<Character>(component, typeof(int), 1, "m_isAI");
			return component;
		}
	}
	public class TinyDialogueManager
	{
		public static GameObject AssignMerchantTemplate(Transform parentTransform)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(Resources.Load<GameObject>("editor/templates/MerchantTemplate"));
			val.transform.parent = parentTransform;
			val.transform.position = parentTransform.position;
			val.transform.rotation = parentTransform.rotation;
			return val;
		}

		public static GameObject AssignTrainerTemplate(Transform parentTransform)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(Resources.Load<GameObject>("editor/templates/TrainerTemplate"));
			val.transform.parent = parentTransform;
			val.transform.position = parentTransform.position;
			val.transform.rotation = parentTransform.rotation;
			return val;
		}

		public static DialogueActor SetDialogueActorName(GameObject dialogueGameObject, string name)
		{
			DialogueActor componentInChildren = dialogueGameObject.GetComponentInChildren<DialogueActor>();
			componentInChildren.SetName(name);
			return componentInChildren;
		}

		public static Merchant SetMerchant(GameObject merchantTemplate, UID merchantUID)
		{
			return merchantTemplate.GetComponentInChildren<Merchant>();
		}

		public static Trainer SetTrainerSkillTree(GameObject trainerTemplate, UID skillTreeUID)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			Trainer componentInChildren = trainerTemplate.GetComponentInChildren<Trainer>();
			At.SetValue<UID>(skillTreeUID, typeof(Trainer), componentInChildren, "m_skillTreeUID");
			return componentInChildren;
		}

		public static Graph GetDialogueGraph(GameObject trainerTemplate)
		{
			DialogueTreeController componentInChildren = trainerTemplate.GetComponentInChildren<DialogueTreeController>();
			return ((GraphOwner)componentInChildren).graph;
		}

		public static void SetActorReference(Graph graph, DialogueActor actor)
		{
			List<ActorParameter> list = At.GetValue(typeof(DialogueTree), (graph is DialogueTree) ? graph : null, "_actorParameters") as List<ActorParameter>;
			list[0].actor = (IDialogueActor)(object)actor;
			list[0].name = actor.name;
		}

		public static ActionNode MakeMerchantDialogueAction(Graph graph, Merchant merchant)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: 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_0031: Expected O, but got Unknown
			ActionNode val = graph.AddNode<ActionNode>();
			ShopDialogueAction val2 = new ShopDialogueAction
			{
				Merchant = new BBParameter<Merchant>(merchant)
			};
			BBParameter<Character> obj = new BBParameter<Character>();
			((BBParameter)obj).name = "gInstigator";
			val2.PlayerCharacter = obj;
			ShopDialogueAction action = val2;
			val.action = (ActionTask)(object)action;
			return val;
		}

		public static ActionNode MakeTrainDialogueAction(Graph graph, Trainer trainer)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: 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_0031: Expected O, but got Unknown
			ActionNode val = graph.AddNode<ActionNode>();
			TrainDialogueAction val2 = new TrainDialogueAction
			{
				Trainer = new BBParameter<Trainer>(trainer)
			};
			BBParameter<Character> obj = new BBParameter<Character>();
			((BBParameter)obj).name = "gInstigator";
			val2.PlayerCharacter = obj;
			TrainDialogueAction action = val2;
			val.action = (ActionTask)(object)action;
			return val;
		}

		public static ActionNode MakeStartQuest(Graph graph, int questID)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			ActionNode val = graph.AddNode<ActionNode>();
			GiveQuest val3 = (GiveQuest)(object)(val.action = (ActionTask)new GiveQuest());
			ref BBParameter<Quest> quest = ref val3.quest;
			Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(questID);
			quest = new BBParameter<Quest>((Quest)(object)((itemPrefab is Quest) ? itemPrefab : null));
			return val;
		}

		public static ActionNode MakeQuestEvent(Graph graph, string EventUID)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			ActionNode val = graph.AddNode<ActionNode>();
			SendQuestEvent val3 = (SendQuestEvent)(object)(val.action = (ActionTask)new SendQuestEvent());
			val3.QuestEventRef = new QuestEventReference
			{
				EventUID = EventUID
			};
			return val;
		}

		public static ConditionNode MakeEventOccuredCondition(Graph graph, string EventUID, int MinStack)
		{
			//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_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			ConditionNode val = graph.AddNode<ConditionNode>();
			val.condition = (ConditionTask)new Condition_QuestEventOccured
			{
				QuestEventRef = new QuestEventReference
				{
					EventUID = EventUID
				},
				MinStack = MinStack
			};
			return val;
		}

		public static ConditionNode MakeHasItemCondition(Graph graph, int itemID, int MinStack)
		{
			//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_0025: Unknown result type (might be due to invalid IL or missing references)
			//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_0038: Expected O, but got Unknown
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			ConditionNode val = graph.AddNode<ConditionNode>();
			Condition_OwnsItem val2 = new Condition_OwnsItem();
			BBParameter<Character> obj = new BBParameter<Character>();
			((BBParameter)obj).name = "gInstigator";
			val2.character = obj;
			val2.item = new BBParameter<ItemReference>(new ItemReference
			{
				ItemID = itemID
			});
			val2.minAmount = new BBParameter<int>(MinStack);
			val2.itemMustBeEquiped = new BBParameter<bool>(false);
			val2.SaveMatchingContainerVariable = null;
			val.condition = (ConditionTask)val2;
			return val;
		}

		public static ConditionNode MakeHasItemConditionSimple(Graph graph, int itemID, int MinStack, int enchantment = 0)
		{
			//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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			ConditionNode val = graph.AddNode<ConditionNode>();
			Condition_SimpleOwnsItem val2 = new Condition_SimpleOwnsItem();
			BBParameter<Character> obj = new BBParameter<Character>();
			((BBParameter)obj).name = "gInstigator";
			val2.character = obj;
			val2.item = new BBParameter<Item>(ResourcesPrefabManager.Instance.GetItemPrefab(itemID));
			val2.minAmount = new BBParameter<int>(MinStack);
			val.condition = (ConditionTask)val2;
			return val;
		}

		public static ActionNode MakeGiveItemReward(Graph graph, int itemID, Receiver receiver, int quantity = 1)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			ActionNode val = graph.AddNode<ActionNode>();
			GiveReward val3 = (GiveReward)(object)(val.action = (ActionTask)new GiveReward());
			val3.RewardReceiver = receiver;
			ItemQuantity val4 = new ItemQuantity();
			ItemReference val5 = new ItemReference();
			val5.ItemID = itemID;
			val4.Item = new BBParameter<ItemReference>(val5);
			val4.Quantity = BBParameter<int>.op_Implicit(quantity);
			val3.ItemReward = new List<ItemQuantity> { val4 };
			return val;
		}

		public static ActionNode MakeResignItem(Graph graph, int itemID, Receiver provider, int quantity = 1, int enchantment = 0)
		{
			//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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			ActionNode val = graph.AddNode<ActionNode>();
			RemoveItem val2 = new RemoveItem();
			BBParameter<Character> obj = new BBParameter<Character>();
			((BBParameter)obj).name = "gInstigator";
			val2.fromCharacter = obj;
			val2.Items = new List<BBParameter<ItemReference>>
			{
				new BBParameter<ItemReference>(new ItemReference
				{
					ItemID = itemID
				})
			};
			val2.Amount = new List<BBParameter<int>>
			{
				new BBParameter<int>(quantity)
			};
			val.action = (ActionTask)val2;
			return val;
		}

		public static StatementNodeExt MakeStatementNode(Graph graph, string name, string statementText)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			StatementNodeExt val = graph.AddNode<StatementNodeExt>();
			val.statement = new Statement(statementText);
			val.SetActorName(name);
			return val;
		}

		public static MultipleChoiceNodeExt MakeMultipleChoiceNode(Graph graph, string[] statementTexts)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_0037: Expected O, but got Unknown
			MultipleChoiceNodeExt val = graph.AddNode<MultipleChoiceNodeExt>();
			foreach (string text in statementTexts)
			{
				val.availableChoices.Add(new Choice
				{
					statement = new Statement
					{
						text = text
					}
				});
			}
			return val;
		}

		public static void ChainNodes(Graph graph, Node[] nodes)
		{
			Node val = null;
			foreach (Node val2 in nodes)
			{
				if (val != null)
				{
					graph.ConnectNodes(val, val2, -1, -1);
				}
				val = val2;
			}
		}

		public static void ConnectMultipleChoices(Graph graph, Node baseNode, Node[] nodes)
		{
			for (int i = 0; i < nodes.Length; i++)
			{
				graph.ConnectNodes(baseNode, nodes[i], i, -1);
			}
		}
	}
	public class TinyGameObjectManager
	{
		public static Transform GetOrMake(Transform parent, string child, bool setActive, bool dontDestroyOnLoad)
		{
			return parent.Find(child) ?? MakeFreshObject(child, setActive, dontDestroyOnLoad, parent).transform;
		}

		public static GameObject InstantiateClone(GameObject sourceGameObject, bool setActive, bool dontDestroyOnLoad)
		{
			return InstantiateClone(sourceGameObject, ((Object)sourceGameObject).name + "(Clone)", setActive, dontDestroyOnLoad);
		}

		public static GameObject InstantiateClone(GameObject sourceGameObject, string newGameObjectName, bool setActive, bool dontDestroyOnLoad)
		{
			GameObject val = Object.Instantiate<GameObject>(sourceGameObject);
			val.SetActive(setActive);
			((Object)val).name = newGameObjectName;
			if (dontDestroyOnLoad)
			{
				Object.DontDestroyOnLoad((Object)(object)val);
			}
			return val;
		}

		public static Transform MakeFreshTransform(Transform parent, string child, bool setActive, bool dontDestroyOnLoad)
		{
			return MakeFreshObject(child, setActive, dontDestroyOnLoad, parent).transform;
		}

		public static GameObject MakeFreshObject(string newGameObjectName, bool setActive, bool dontDestroyOnLoad, Transform parent = null)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			GameObject val = new GameObject(newGameObjectName);
			val.SetActive(setActive);
			if ((Object)(object)parent != (Object)null)
			{
				val.transform.SetParent(parent);
			}
			if (dontDestroyOnLoad)
			{
				RecursiveDontDestroyOnLoad(val.transform);
			}
			return val;
		}

		public static void RecursiveDontDestroyOnLoad(Transform transform)
		{
			Transform val = transform;
			while ((Object)(object)val.parent != (Object)null)
			{
				val = val.parent;
			}
			Object.DontDestroyOnLoad((Object)(object)((Component)val).gameObject);
		}
	}
	public enum Behaviour
	{
		Add,
		Purge,
		Replace
	}
	public class TinyItemManager
	{
		private static Dictionary<int, ItemLocalization> m_ItemLocalizationDictionary;

		private static Dictionary<string, Item> m_ItemPrefabDictionary;

		private static Dictionary<int, ItemLocalization> ItemLocalizationDictionary
		{
			get
			{
				if (m_ItemLocalizationDictionary == null)
				{
					m_ItemLocalizationDictionary = At.GetValue(typeof(LocalizationManager), LocalizationManager.Instance, "m_itemLocalization") as Dictionary<int, ItemLocalization>;
				}
				return m_ItemLocalizationDictionary;
			}
		}

		private static Dictionary<string, Item> ItemPrefabDictionary
		{
			get
			{
				if (m_ItemPrefabDictionary == null)
				{
					m_ItemPrefabDictionary = At.GetValue(typeof(ResourcesPrefabManager), null, "ITEM_PREFABS") as Dictionary<string, Item>;
				}
				return m_ItemPrefabDictionary;
			}
		}

		public static bool SetLegacyResult(int itemID, int legacyOutcomeID)
		{
			Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(itemID);
			if ((Object)(object)itemPrefab != (Object)null)
			{
				itemPrefab.LegacyItemID = legacyOutcomeID;
				return true;
			}
			return false;
		}

		public static bool AddEnchantingOption(int itemID, int enchantingRecipeID)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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_008d: Unknown result type (might be due to invalid IL or missing references)
			Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(itemID);
			EnchantmentRecipe enchantmentRecipeForID = RecipeManager.Instance.GetEnchantmentRecipeForID(enchantingRecipeID);
			if ((Object)(object)enchantmentRecipeForID != (Object)null && (Object)(object)itemPrefab != (Object)null)
			{
				List<IngredientData> list = enchantmentRecipeForID.CompatibleEquipments.CompatibleEquipments.ToList();
				list.Add(new IngredientData
				{
					Type = (IngredientType)1,
					SpecificIngredient = itemPrefab
				});
				enchantmentRecipeForID.CompatibleEquipments = new EquipmentData
				{
					EquipmentTag = enchantmentRecipeForID.CompatibleEquipments.EquipmentTag,
					CompatibleEquipments = list.ToArray()
				};
				return true;
			}
			return false;
		}

		public static Item MakeItem(int newID, int targetID, string name = null, string description = null, string identifierName = null)
		{
			Item val = TryCloneTargetItem(newID, targetID, newID + "_" + identifierName);
			ApplyNameAndDescription(val, name, description);
			return val;
		}

		public static Skill MakeSkill(int newID, int targetID, string name = null, string description = null, string identifierName = null, int? manaCost = 0, int? staminaCost = 0, int? healthCost = 0, bool? ignoreLearnNotification = null, bool? hideInUI = null)
		{
			Item obj = MakeItem(newID, targetID, name, description, identifierName);
			Skill val = (Skill)(object)((obj is Skill) ? obj : null);
			if (manaCost.HasValue)
			{
				val.ManaCost = manaCost.GetValueOrDefault();
			}
			if (healthCost.HasValue)
			{
				val.HealthCost = healthCost.GetValueOrDefault();
			}
			if (staminaCost.HasValue)
			{
				val.StaminaCost = staminaCost.GetValueOrDefault();
			}
			val.IgnoreLearnNotification = ignoreLearnNotification.GetValueOrDefault();
			return val;
		}

		public static Item TryCloneTargetItem(int newID, int targetID, string identifierName = null)
		{
			Dictionary<string, Item> itemPrefabDictionary = ItemPrefabDictionary;
			Item item = GetItem(targetID.ToString());
			if ((Object)(object)item == (Object)null)
			{
				TinyHelper.TinyHelperPrint("Could not find target item with ID " + targetID + ".");
				return null;
			}
			if ((Object)(object)((Component)item).gameObject.GetComponent<Item>() == (Object)null)
			{
				TinyHelper.TinyHelperPrint(((Object)item).name + " is does not have an Item component.");
				return null;
			}
			GameObject val = Object.Instantiate<GameObject>(((Component)item).gameObject);
			val.SetActive(false);
			Object.DontDestroyOnLoad((Object)(object)val);
			Item component = val.GetComponent<Item>();
			component.ItemID = newID;
			((Object)component).name = identifierName ?? (newID + "_" + component.Name.Replace(" ", ""));
			ItemPrefabDictionary.Add(component.ItemID.ToString(), component);
			return component;
		}

		public static void ApplyNameAndDescription(Item item, string name, string description)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			ItemLocalization value = new ItemLocalization(name, description);
			At.SetValue(name, typeof(Item), item, "m_name");
			if (ItemLocalizationDictionary.ContainsKey(item.ItemID))
			{
				ItemLocalizationDictionary[item.ItemID] = value;
			}
			else
			{
				ItemLocalizationDictionary.Add(item.ItemID, value);
			}
		}

		private static Item GetItem(int itemID)
		{
			return GetItem(itemID.ToString());
		}

		private static Item GetItem(string itemID)
		{
			return ItemPrefabDictionary[itemID];
		}
	}
	public class TinyHelperRPCManager : MonoBehaviour
	{
		public static TinyHelperRPCManager Instance;

		internal void Start()
		{
			Instance = this;
			PhotonView val = ((Component)this).gameObject.AddComponent<PhotonView>();
			val.viewID = 954;
			Debug.Log((object)("Registered TinyHelpertRPC with ViewID " + ((MonoBehaviour)this).photonView.viewID));
		}

		[PunRPC]
		public void ApplyAddImbueEffectRPC(string weaponGUID, int infusionID, float duration)
		{
			Item item = ItemManager.Instance.GetItem(weaponGUID);
			Weapon val = (Weapon)(object)((item is Weapon) ? item : null);
			? val2 = val;
			EffectPreset effectPreset = ResourcesPrefabManager.Instance.GetEffectPreset(infusionID);
			((Weapon)val2).AddImbueEffect((ImbueEffectPreset)(object)((effectPreset is ImbueEffectPreset) ? effectPreset : null), duration, (ImbueStack)null);
		}

		[PunRPC]
		public void CharacterForceCancelRPC(string characterGUID, bool bool1, bool bool2)
		{
			Character character = CharacterManager.Instance.GetCharacter(characterGUID);
			character.ForceCancel(bool1, bool2);
		}
	}
	public class QuestRequirements
	{
		public static bool HasQuestEvent(string questEventUID)
		{
			return QuestEventManager.Instance.GetEventCurrentStack(questEventUID) > 0;
		}

		public static bool HasQuestKnowledge(Character character, int[] questIDs, LogicType logicType, bool inverted = false, bool requireCompleted = false)
		{
			bool flag = false;
			object obj;
			if (character == null)
			{
				obj = null;
			}
			else
			{
				CharacterInventory inventory = character.Inventory;
				obj = ((inventory != null) ? inventory.QuestKnowledge : null);
			}
			CharacterQuestKnowledge q = (CharacterQuestKnowledge)obj;
			if (q != null)
			{
				IEnumerable<bool> source = questIDs.Select((int x) => ((CharacterKnowledge)q).IsItemLearned(x) && (q.IsQuestCompleted(x) || !requireCompleted));
				flag = flag || ((logicType == LogicType.Any) ? source.Any((bool x) => x) : source.All((bool x) => x));
			}
			return flag ^ inverted;
		}

		public static bool HasQuestKnowledgeLocal(Character character, int[] questIDs, LogicType logicType, bool inverted = false, bool requireCompleted = false)
		{
			bool flag = false;
			object obj;
			if (character == null)
			{
				obj = null;
			}
			else
			{
				CharacterInventory inventory = character.Inventory;
				obj = ((inventory != null) ? inventory.QuestKnowledge : null);
			}
			CharacterQuestKnowledge q = (CharacterQuestKnowledge)obj;
			if (q != null)
			{
				IEnumerable<bool> source = questIDs.Select((int x) => q.IsItemLearnedLocal(x) && (q.IsQuestCompletedLocal(x) || !requireCompleted));
				flag = flag || ((logicType == LogicType.Any) ? source.Any((bool x) => x) : source.All((bool x) => x));
			}
			return flag ^ inverted;
		}
	}
	public enum LogicType
	{
		Any,
		All
	}
	public class SkillRequirements
	{
		public static bool SafeHasSkillKnowledge(Character character, int skillID)
		{
			bool? obj;
			if (character == null)
			{
				obj = null;
			}
			else
			{
				CharacterInventory inventory = character.Inventory;
				if (inventory == null)
				{
					obj = null;
				}
				else
				{
					CharacterSkillKnowledge skillKnowledge = inventory.SkillKnowledge;
					obj = ((skillKnowledge != null) ? new bool?(((CharacterKnowledge)skillKnowledge).IsItemLearned(skillID)) : null);
				}
			}
			bool? flag = obj;
			return flag.GetValueOrDefault();
		}
	}
	public class CustomTexture
	{
		public enum SpriteBorderTypes
		{
			None,
			Item,
			TrainerSkill
		}

		public enum IconName
		{
			m_itemIcon,
			SkillTreeIcon
		}

		private static Dictionary<string, byte[]> m_loadedTextures;

		private static Dictionary<string, byte[]> LoadedTextures
		{
			get
			{
				if (m_loadedTextures == null)
				{
					m_loadedTextures = new Dictionary<string, byte[]>();
				}
				return m_loadedTextures;
			}
		}

		public static Texture2D LoadTexture(string filePath, int mipCount, bool linear, FilterMode filterMode, float? mipMapBias = null, string rootPath = null)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			filePath = (rootPath ?? TinyHelper.PLUGIN_ROOT_PATH) + filePath;
			if (!LoadedTextures.ContainsKey(filePath))
			{
				LoadedTextures[filePath] = File.ReadAllBytes(filePath);
			}
			Texture2D val = new Texture2D(4, 4, (TextureFormat)12, mipCount > 0, linear);
			((Texture)val).filterMode = filterMode;
			((Texture)val).mipMapBias = mipMapBias ?? ((Texture)val).mipMapBias;
			ImageConversion.LoadImage(val, LoadedTextures[filePath]);
			((Texture)val).filterMode = (FilterMode)1;
			return val;
		}

		public static Sprite MakeSprite(Texture2D texture, SpriteBorderTypes spriteBorderType)
		{
			//IL_0079: 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)
			float num;
			float num2;
			float num3;
			float num4;
			switch (spriteBorderType)
			{
			case SpriteBorderTypes.Item:
				num = 1f;
				num2 = 2f;
				num3 = 2f;
				num4 = 3f;
				break;
			case SpriteBorderTypes.TrainerSkill:
				num = 1f;
				num2 = 1f;
				num3 = 1f;
				num4 = 2f;
				break;
			default:
				num = 0f;
				num2 = 0f;
				num3 = 0f;
				num4 = 0f;
				break;
			}
			return Sprite.Create(texture, new Rect(num, num3, (float)((Texture)texture).width - num2, (float)((Texture)texture).height - num4), new Vector2(0f, 0f), 100f, 0u);
		}
	}
	public class CooldownChangeWeaponDamageTargetHealth : WeaponDamageTargetHealth
	{
		public float ExecuteSetCooldown = -1f;

		public float HitKnockbackCooldown = -1f;

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			Item parentItem = ((Effect)this).ParentItem;
			Skill val = (Skill)(object)((parentItem is Skill) ? parentItem : null);
			if (val != null)
			{
				if (HitKnockbackCooldown != -1f && _affectedCharacter.IsInKnockback)
				{
					At.SetValue(HitKnockbackCooldown, typeof(Skill), val, "m_remainingCooldownTime");
				}
				bool isDead = _affectedCharacter.IsDead;
				((WeaponDamage)this).ActivateLocally(_affectedCharacter, _infos);
				if (!isDead && _affectedCharacter.IsDead && ExecuteSetCooldown != -1f)
				{
					At.SetValue(ExecuteSetCooldown, typeof(Skill), val, "m_remainingCooldownTime");
				}
			}
		}
	}
	public class ToggleEffect : Effect
	{
		public StatusEffect StatusEffectInstance;

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			if (_affectedCharacter.StatusEffectMngr.HasStatusEffect(StatusEffectInstance.IdentifierName))
			{
				_affectedCharacter.StatusEffectMngr.CleanseStatusEffect(((Object)StatusEffectInstance).name);
			}
			else
			{
				_affectedCharacter.StatusEffectMngr.AddStatusEffect(StatusEffectInstance, ((Effect)this).SourceCharacter);
			}
		}
	}
	public class AddThenSpreadStatus : AddStatusEffect
	{
		public float Range;

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			if (base.AffectController)
			{
				_affectedCharacter = ((Effect)this).OwnerCharacter;
			}
			if ((Object)(object)((_affectedCharacter != null) ? _affectedCharacter.StatusEffectMngr : null) == (Object)null || (Object)(object)base.Status == (Object)null)
			{
				return;
			}
			if (_affectedCharacter.StatusEffectMngr.HasStatusEffect(base.Status.IdentifierName))
			{
				List<Character> source = new List<Character>();
				CharacterManager.Instance.FindCharactersInRange(_affectedCharacter.CenterPosition, Range, ref source);
				foreach (Character item in source.Where((Character c) => !c.IsAlly(((Effect)this).SourceCharacter)))
				{
					((AddStatusEffect)this).ActivateLocally(item, _infos);
				}
			}
			((AddStatusEffect)this).ActivateLocally(_affectedCharacter, _infos);
		}
	}
	public class EmptyOffHandCondition : EffectCondition
	{
		public bool AllowDrawnTwoHandedInRight = false;

		public bool AllowSheathedTwoHandedInLeft = false;

		protected override bool CheckIsValid(Character _affectedCharacter)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_affectedCharacter == (Object)null)
			{
				goto IL_00dc;
			}
			bool? obj;
			if (_affectedCharacter == null)
			{
				obj = null;
			}
			else
			{
				Equipment leftHandEquipment = _affectedCharacter.LeftHandEquipment;
				obj = ((leftHandEquipment != null) ? new bool?(((Item)leftHandEquipment).HasTag(TinyTagManager.GetOrMakeTag("HandsFreeTag"))) : null);
			}
			if (obj ?? true)
			{
				bool? obj2;
				if (_affectedCharacter == null)
				{
					obj2 = null;
				}
				else
				{
					Weapon currentWeapon = _affectedCharacter.CurrentWeapon;
					obj2 = ((currentWeapon != null) ? new bool?(((Equipment)currentWeapon).TwoHanded) : null);
				}
				bool? flag = obj2;
				if (!flag.GetValueOrDefault())
				{
					goto IL_00dc;
				}
			}
			if (!_affectedCharacter.Sheathed && AllowDrawnTwoHandedInRight)
			{
				Weapon currentWeapon2 = _affectedCharacter.CurrentWeapon;
				if (currentWeapon2 == null || ((Equipment)currentWeapon2).TwoHandedRight)
				{
					goto IL_00dc;
				}
			}
			int result;
			if (_affectedCharacter.Sheathed && AllowSheathedTwoHandedInLeft)
			{
				Weapon currentWeapon3 = _affectedCharacter.CurrentWeapon;
				result = ((currentWeapon3 == null || ((Equipment)currentWeapon3).TwoHandedRight) ? 1 : 0);
			}
			else
			{
				result = 0;
			}
			goto IL_00dd;
			IL_00dc:
			result = 1;
			goto IL_00dd;
			IL_00dd:
			return (byte)result != 0;
		}

		public static ActivationCondition AddToSkill(Skill skill, bool allowDrawnTwoHandedInRight = false, bool allowSheathedTwoHandedInLeft = false)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			GameObject val = new GameObject("EmptyOffhandCondition");
			ActivationCondition val2 = new ActivationCondition();
			EmptyOffHandCondition emptyOffHandCondition = val.AddComponent<EmptyOffHandCondition>();
			Object.DontDestroyOnLoad((Object)(object)emptyOffHandCondition);
			val.SetActive(false);
			val2.Condition = (EffectCondition)(object)emptyOffHandCondition;
			emptyOffHandCondition.AllowDrawnTwoHandedInRight = allowDrawnTwoHandedInRight;
			emptyOffHandCondition.AllowSheathedTwoHandedInLeft = allowSheathedTwoHandedInLeft;
			At.SetValue("Requires an empty left hand.", typeof(ActivationCondition), val2, "m_defaultMessage");
			List<ActivationCondition> list = (At.GetValue(typeof(Skill), skill, "m_additionalConditions") as ActivationCondition[])?.ToList() ?? new List<ActivationCondition>();
			list.Add(val2);
			At.SetValue(list.ToArray(), typeof(Skill), skill, "m_additionalConditions");
			return val2;
		}
	}
	internal class InputEnablerEffect : Effect
	{
		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			StatusEffect parentStatusEffect = base.m_parentStatusEffect;
			if (parentStatusEffect != null && (double)((_affectedCharacter != null) ? _affectedCharacter.AnimMoveSqMagnitude : 0f) > 0.1 && (double)parentStatusEffect.Age > 0.5)
			{
				StatusEffectManager statusEffectMngr = _affectedCharacter.StatusEffectMngr;
				if (statusEffectMngr != null)
				{
					statusEffectMngr.CleanseStatusEffect(parentStatusEffect.IdentifierName);
				}
				_affectedCharacter.ForceCancel(true, true);
			}
		}
	}
	internal class TinyUnofficialPatches
	{
	}
	[HarmonyPatch(typeof(Skill), "HasEnoughMana")]
	public class Skill_HasEnoughMana
	{
		[HarmonyPostfix]
		public static void Postfix(Skill __instance, ref bool _tryingToActivate, ref bool __result)
		{
			if (__instance.ManaCost <= 0f)
			{
				__result = true;
			}
		}
	}
	[HarmonyPatch(typeof(Skill), "HasEnoughStamina")]
	public class Skill_HasEnoughStamina
	{
		[HarmonyPostfix]
		public static void Postfix(Skill __instance, ref bool _tryingToActivate, ref bool __result)
		{
			if (__instance.StaminaCost <= 0f)
			{
				__result = true;
			}
		}
	}
	[HarmonyPatch(typeof(Skill), "HasEnoughHealth")]
	public class Skill_HasEnoughHealth
	{
		[HarmonyPostfix]
		public static void Postfix(Skill __instance, ref bool _tryingToActivate, ref bool __result)
		{
			if (__instance.HealthCost <= 0f)
			{
				__result = true;
			}
		}
	}
	public class WeaponManager
	{
		public static Dictionary<WeaponType, float> Speeds = new Dictionary<WeaponType, float>
		{
			{
				(WeaponType)0,
				1.251f
			},
			{
				(WeaponType)1,
				1.399f
			},
			{
				(WeaponType)2,
				1.629f
			},
			{
				(WeaponType)51,
				1.71f
			},
			{
				(WeaponType)52,
				1.667f
			},
			{
				(WeaponType)53,
				2.036f
			},
			{
				(WeaponType)54,
				1.499f
			},
			{
				(WeaponType)50,
				1.612f
			}
		};

		public static Dictionary<WeaponType, float> HeavyImpactModifiers = new Dictionary<WeaponType, float>
		{
			{
				(WeaponType)0,
				1.3f
			},
			{
				(WeaponType)1,
				1.3f
			},
			{
				(WeaponType)2,
				2.5f
			},
			{
				(WeaponType)51,
				1.5f
			},
			{
				(WeaponType)52,
				1.3f
			},
			{
				(WeaponType)53,
				2f
			},
			{
				(WeaponType)54,
				1.2f
			},
			{
				(WeaponType)50,
				1.3f
			}
		};
	}
	public class TinyTagManager
	{
		public static Tag GetOrMakeTag(string name)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			Tag val = ((IEnumerable<Tag>)TagSourceManager.Instance.DbTags).FirstOrDefault((Func<Tag, bool>)((Tag x) => x.TagName == name));
			if (val == Tag.None)
			{
				((Tag)(ref val))..ctor(TagSourceManager.TagRoot, name);
				((Tag)(ref val)).SetTagType((TagTypes)0);
				TagSourceManager.Instance.DbTags.Add(val);
				TagSourceManager.Instance.RefreshTags(true);
				return val;
			}
			return val;
		}

		public static string[] GetOrMakeTags(string[] names)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			foreach (string name in names)
			{
				GetOrMakeTag(name);
			}
			return names;
		}

		public static string[] GetSafeTags(string[] tags)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			List<string> list = new List<string>();
			foreach (string tag in tags)
			{
				((IEnumerable<Tag>)TagSourceManager.Instance.DbTags).FirstOrDefault((Func<Tag, bool>)((Tag x) => x.TagName == tag || ((Tag)(ref x)).UID == UID.op_Implicit(tag)));
				if (true)
				{
					list.Add(tag);
				}
			}
			return list.ToArray();
		}
	}
	public class TinyUIDManager
	{
		public static UID MakeUID(string name, string modGUID, string category)
		{
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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_0076: Unknown result type (might be due to invalid IL or missing references)
			if (modGUID == null || name == null || category == null)
			{
				Debug.LogError((object)$"TinyUIDManager.MakeUID({name}, {modGUID}, {category} returned a random UID. This will cause trouble in multiplayer!");
				return default(UID);
			}
			return new UID((modGUID + "." + category + "." + name).Replace(" ", "").ToLower());
		}
	}
	[BepInPlugin("com.ehaugw.tinyhelper", "Tiny Helper", "4.8.2")]
	public class TinyHelper : BaseUnityPlugin
	{
		public delegate void DescriptionModifier(Item item, ref string description);

		[HarmonyPatch(typeof(ResourcesPrefabManager), "Load")]
		public class ResourcesPrefabManager_Load
		{
			[HarmonyPostfix]
			public static void Postfix()
			{
				ResourcesPrefabManager instance = ResourcesPrefabManager.Instance;
				if (instance != null && instance.Loaded)
				{
					TinyHelper.OnPrefabLoaded();
				}
			}
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		public class Item_Description
		{
			[HarmonyPostfix]
			public static void Postfix(Item __instance, ref string __result)
			{
				OnDescriptionModified(__instance, ref __result);
			}
		}

		public const string GUID = "com.ehaugw.tinyhelper";

		public const string VERSION = "4.8.2";

		public const string NAME = "Tiny Helper";

		public static DescriptionModifier OnDescriptionModified;

		public static TinyHelper Instance;

		private static int tinyHelperPrintedMessages;

		public static string PLUGIN_ROOT_PATH => typeof(TinyHelper).Assembly.Location + "\\..\\..\\";

		public static event Action OnPrefabLoaded;

		internal void Awake()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			Instance = this;
			GameObject val = new GameObject("TinyHelperRPC");
			Object.DontDestroyOnLoad((Object)(object)val);
			val.AddComponent<TinyHelperRPCManager>();
			Harmony val2 = new Harmony("com.ehaugw.tinyhelper");
			val2.PatchAll();
		}

		public static void TinyHelperPrint(string str)
		{
			Debug.Log((object)("TinyHelper #" + tinyHelperPrintedMessages++ + ": " + str));
		}

		static TinyHelper()
		{
			TinyHelper.OnPrefabLoaded = delegate
			{
			};
			OnDescriptionModified = delegate
			{
			};
			tinyHelperPrintedMessages = 0;
		}
	}
	public class DelayedTask
	{
		public static Task GetTask(int milliseconds)
		{
			TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
			new Timer(delegate
			{
				tcs.SetResult(null);
			}).Change(milliseconds, -1);
			return tcs.Task;
		}
	}
	public class TinyEffectManager
	{
		public static StatusEffect MakeStatusEffectPrefab(string effectName, string familyName, string description, float lifespan, float refreshRate, StackBehaviors stackBehavior, string targetStatusName, bool isMalusEffect, string tagID = null, UID? uid = null, string modGUID = null, string iconFileName = null, string displayName = null, string rootPath = null)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Expected O, but got Unknown
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Expected O, but got Unknown
			//IL_0194: Expected O, but got Unknown
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_021e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Expected O, but got Unknown
			Dictionary<string, StatusEffect> dictionary = At.GetValue(typeof(ResourcesPrefabManager), null, "STATUSEFFECT_PREFABS") as Dictionary<string, StatusEffect>;
			StatusEffectFamily val = MakeStatusEffectFamiliy(familyName, stackBehavior, -1, (LengthTypes)0);
			GameObject val2 = TinyGameObjectManager.InstantiateClone(((Component)dictionary[targetStatusName]).gameObject, effectName, setActive: false, dontDestroyOnLoad: true);
			StatusEffect obj = val2.GetComponent<StatusEffect>() ?? val2.AddComponent<StatusEffect>();
			StatusEffect val3 = obj;
			dictionary[effectName] = obj;
			StatusEffect val4 = val3;
			At.SetValue(effectName, typeof(StatusEffect), val4, "m_identifierName");
			At.SetValue<StatusEffectFamily>(val, typeof(StatusEffect), val4, "m_bindFamily");
			At.SetValue(displayName ?? effectName, typeof(StatusEffect), val4, "m_nameLocKey");
			At.SetValue(description, typeof(StatusEffect), val4, "m_descriptionLocKey");
			val4.RefreshRate = refreshRate;
			val4.IsMalusEffect = isMalusEffect;
			At.SetValue<EffectSignatureModes>((EffectSignatureModes)1, typeof(StatusEffect), val4, "m_effectSignatureMode");
			At.SetValue<FamilyModes>((FamilyModes)0, typeof(StatusEffect), val4, "m_familyMode");
			val4.RequiredStatus = null;
			val4.RemoveRequiredStatus = false;
			if (iconFileName != null)
			{
				val4.OverrideIcon = CustomTexture.MakeSprite(CustomTexture.LoadTexture(iconFileName, 0, linear: false, (FilterMode)0, null, rootPath), CustomTexture.SpriteBorderTypes.None);
			}
			TagSourceSelector value = ((tagID != null) ? new TagSourceSelector(TagSourceManager.Instance.GetTag(UID.op_Implicit(tagID))) : new TagSourceSelector());
			At.SetValue<TagSourceSelector>(value, typeof(StatusEffect), val4, "m_effectType");
			StatusData val5 = new StatusData(val4.StatusData);
			StatusData val6 = val5;
			val4.StatusData = val5;
			StatusData val7 = val6;
			val7.LifeSpan = lifespan;
			List<StatusData> list = At.GetValue(typeof(StatusEffect), val4, "m_statusStack") as List<StatusData>;
			list[0] = val7;
			Object.Destroy((Object)(object)((Component)val2.GetComponentInChildren<EffectSignature>()).gameObject);
			EffectSignature val8 = TinyGameObjectManager.MakeFreshObject("Signature", setActive: true, dontDestroyOnLoad: true).AddComponent<EffectSignature>();
			((Object)val8).name = "Signature";
			val8.SignatureUID = (UID)(((??)uid) ?? TinyUIDManager.MakeUID(effectName, modGUID, "Status Effect"));
			EffectSignature effectSignature = (val7.EffectSignature = val8);
			val.EffectSignature = effectSignature;
			StatusEffectFamilySelector val10 = new StatusEffectFamilySelector();
			((UidSelector<StatusEffectFamily>)(object)val10).Set(val);
			At.SetValue<StatusEffectFamilySelector>(val10, typeof(StatusEffect), val4, "m_stackingFamily");
			return val4;
		}

		public static StatusEffectFamily MakeStatusEffectFamiliy(string familyName, StackBehaviors stackBehavior, int maxStackCount, LengthTypes lengthType, UID? uid = null, string modGUID = null)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			StatusEffectFamily val = new StatusEffectFamily();
			uid = (UID)(((??)uid) ?? ((modGUID != null) ? TinyUIDManager.MakeUID(familyName, modGUID, "Status Effect Family") : UID.Generate()));
			At.SetValue<UID>(uid.Value, typeof(StatusEffectFamily), val, "m_uid");
			val.Name = familyName;
			val.StackBehavior = stackBehavior;
			val.MaxStackCount = maxStackCount;
			val.LengthType = lengthType;
			return val;
		}

		public static void SetNameAndDesc(EffectPreset imbueEffect, string name, string desc)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			ItemLocalization value = new ItemLocalization(name, desc);
			if (At.GetValue(typeof(LocalizationManager), LocalizationManager.Instance, "m_itemLocalization") is Dictionary<int, ItemLocalization> dictionary)
			{
				if (dictionary.ContainsKey(imbueEffect.PresetID))
				{
					dictionary[imbueEffect.PresetID] = value;
				}
				else
				{
					dictionary.Add(imbueEffect.PresetID, value);
				}
			}
		}

		public static AddStatusEffectBuildUp MakeStatusEffectBuildup(Transform effectTransform, string statusEffectName, float buildup)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			AddStatusEffectBuildUp val = ((Component)effectTransform).gameObject.AddComponent<AddStatusEffectBuildUp>();
			val.BuildUpValue = buildup;
			val.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab(statusEffectName);
			((Effect)val).OverrideEffectCategory = (EffectCategories)4;
			return val;
		}

		public static AddStatusEffect MakeStatusEffectChance(Transform effectTransform, string statusEffectName, int chance)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			AddStatusEffect val = ((Component)effectTransform).gameObject.AddComponent<AddStatusEffect>();
			val.SetChanceToContract(chance);
			val.Status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab(statusEffectName);
			((Effect)val).OverrideEffectCategory = (EffectCategories)4;
			return val;
		}

		public static WeaponDamage MakeWeaponDamage(Transform effectTransform, float baseDamage, float damageScaling, Types damageType, float knockback)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			WeaponDamage val = ((Component)effectTransform).gameObject.AddComponent<WeaponDamage>();
			val.WeaponDamageMult = 1f + damageScaling;
			val.OverrideDType = damageType;
			((PunctualDamage)val).Damages = (DamageType[])(object)new DamageType[1]
			{
				new DamageType(damageType, baseDamage)
			};
			((Effect)val).OverrideEffectCategory = (EffectCategories)4;
			((PunctualDamage)val).Knockback = knockback;
			return val;
		}

		public static WeaponDamage MakeDynamicWeaponDamage(Transform effectTransform, IDamageScaler damageScaler)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			DynamicWeaponDamage dynamicWeaponDamage = ((Component)effectTransform).gameObject.AddComponent<DynamicWeaponDamage>();
			((Effect)dynamicWeaponDamage).OverrideEffectCategory = (EffectCategories)4;
			dynamicWeaponDamage.DamageScaler = damageScaler;
			return (WeaponDamage)(object)dynamicWeaponDamage;
		}

		public static void MakeAbsorbHealth(Transform effectTransform, float absorbRatio)
		{
			AddAbsorbHealth obj = ((Component)effectTransform).gameObject.AddComponent<AddAbsorbHealth>();
			At.SetValue(absorbRatio, typeof(AddAbsorbHealth), obj, "m_healthRatio");
		}

		public static ImbueEffectPreset MakeImbuePreset(int imbueID, string name, string description, string iconFileName = null, int? visualEffectID = null, List<Skill> replaceOnSkills = null, string statusEffectName = null, int? chanceToContract = null, int? buildUp = null, float? scalingDamage = null, float? flatDamage = null, float? knockback = null, Types? damageType = null)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Expected O, but got I4
			//IL_023b->IL023b: Incompatible stack types: O vs I4
			//IL_0234->IL023b: Incompatible stack types: I4 vs O
			//IL_0234->IL023b: Incompatible stack types: O vs I4
			Dictionary<int, EffectPreset> dictionary = (Dictionary<int, EffectPreset>)At.GetValue(typeof(ResourcesPrefabManager), null, "EFFECTPRESET_PREFABS");
			if (!dictionary.ContainsKey(imbueID))
			{
				GameObject val = new GameObject(imbueID + "_" + name.Replace(" ", ""));
				val.SetActive(true);
				Object.DontDestroyOnLoad((Object)(object)val);
				ImbueEffectPreset val2 = val.AddComponent<ImbueEffectPreset>();
				((Object)val2).name = imbueID + "_" + name.Replace(" ", "");
				At.SetValue(imbueID, typeof(EffectPreset), val2, "m_StatusEffectID");
				At.SetValue(name, typeof(ImbueEffectPreset), val2, "m_imbueNameKey");
				At.SetValue(description, typeof(ImbueEffectPreset), val2, "m_imbueDescKey");
				if (visualEffectID.HasValue)
				{
					val2.ImbueStatusIcon = ((ImbueEffectPreset)dictionary[visualEffectID.Value]).ImbueStatusIcon;
					val2.ImbueFX = ((ImbueEffectPreset)dictionary[visualEffectID.Value]).ImbueFX;
				}
				if (iconFileName != null)
				{
					val2.ImbueStatusIcon = CustomTexture.MakeSprite(CustomTexture.LoadTexture(iconFileName, 0, linear: false, (FilterMode)0), CustomTexture.SpriteBorderTypes.None);
				}
				SetNameAndDesc((EffectPreset)(object)val2, name, description);
				dictionary.Add(imbueID, (EffectPreset)(object)val2);
				if (statusEffectName != null && chanceToContract.GetValueOrDefault() > 0)
				{
					MakeStatusEffectChance(TinyGameObjectManager.GetOrMake(((Component)val2).transform, "Effects", setActive: true, dontDestroyOnLoad: true), statusEffectName, chanceToContract.GetValueOrDefault());
				}
				if (statusEffectName != null && buildUp.GetValueOrDefault() > 0)
				{
					MakeStatusEffectBuildup(TinyGameObjectManager.GetOrMake(((Component)val2).transform, "Effects", setActive: true, dontDestroyOnLoad: true), statusEffectName, buildUp.GetValueOrDefault());
				}
				if (scalingDamage.GetValueOrDefault() > 0f || flatDamage.GetValueOrDefault() > 0f || knockback.GetValueOrDefault() > 0f)
				{
					object obj = TinyGameObjectManager.GetOrMake(((Component)val2).transform, "Effects", setActive: true, dontDestroyOnLoad: true);
					float valueOrDefault = flatDamage.GetValueOrDefault();
					valueOrDefault = scalingDamage.GetValueOrDefault();
					Types? val3 = damageType;
					int num;
					if (val3.HasValue)
					{
						obj = val3.GetValueOrDefault();
						num = (int)obj;
					}
					else
					{
						num = 9;
						obj = num;
						num = (int)obj;
					}
					MakeWeaponDamage((Transform)(object)num, valueOrDefault, valueOrDefault, (Types)obj, knockback.GetValueOrDefault());
				}
				foreach (Skill item in replaceOnSkills ?? new List<Skill>())
				{
					if ((Object)(object)item != (Object)null)
					{
						((ImbueObject)((Component)item).GetComponentInChildren<ImbueWeapon>()).ImbuedEffect = val2;
					}
				}
				return val2;
			}
			return null;
		}

		public static EffectPreset GetEffectPreset(int effectID)
		{
			Dictionary<int, EffectPreset> dictionary = (Dictionary<int, EffectPreset>)At.GetValue(typeof(ResourcesPrefabManager), null, "EFFECTPRESET_PREFABS");
			if (dictionary.ContainsKey(effectID))
			{
				EffectPreset val = dictionary[effectID];
				if (val != null)
				{
					return val;
				}
			}
			return null;
		}

		public static void AddStatusEffectForDuration(Character character, string _statusIdentifier, float duration, Character source = null, float chance = 1f)
		{
			StatusEffect statusEffectPrefab = ResourcesPrefabManager.Instance.GetStatusEffectPrefab(_statusIdentifier);
			AddStatusEffectForDuration(character, statusEffectPrefab, duration, source, chance);
		}

		public static void AddStatusEffectForDuration(Character character, StatusEffect statusEffect, float duration, Character source = null, float chance = 1f)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			StatusEffectManager statusEffectMngr = character.StatusEffectMngr;
			if (statusEffectMngr != null)
			{
				StatusData statusData = statusEffect.StatusData;
				statusEffect.StatusData = new StatusData(statusData);
				statusEffect.StatusData.LifeSpan = duration;
				statusEffectMngr.AddStatusEffect(statusEffect, source);
				statusEffect.StatusData = statusData;
			}
		}

		public static void ChangeEffectPresetDamageTypeData(EffectPreset effect, Types originalType, Types newType)
		{
			//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_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			PunctualDamage[] componentsInChildren = ((Component)effect).gameObject.GetComponentsInChildren<PunctualDamage>();
			foreach (PunctualDamage val in componentsInChildren)
			{
				WeaponDamage val2 = (WeaponDamage)(object)((val is WeaponDamage) ? val : null);
				if (val2 != null && val2.OverrideDType == originalType)
				{
					val2.OverrideDType = newType;
				}
				DamageType[] damages = val.Damages;
				foreach (DamageType val3 in damages)
				{
					if (val3.Type == originalType)
					{
						val3.Type = newType;
					}
				}
			}
		}
	}
	public class CasualStagger : Effect
	{
		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			Stagger(_affectedCharacter);
		}

		public static void Stagger(Character character)
		{
			At.SetValue<HurtType>((HurtType)1, typeof(Character), character, "m_hurtType");
			character.Animator.SetTrigger("Knockback");
			character.ForceCancel(false, true);
			((MonoBehaviour)character).Invoke("DelayedForceCancel", 0.3f);
			if (Object.op_Implicit((Object)(object)character.CharacterUI))
			{
				character.CharacterUI.OnPlayerKnocked();
			}
		}
	}
	public class CooldownChangeWeaponDamage : WeaponDamage
	{
		public float ExecutionSetCooldown = -1f;

		public float HitKnockbackCooldown = -1f;

		protected override void ActivateLocally(Character _affectedCharacter, object[] _infos)
		{
			Item parentItem = ((Effect)this).ParentItem;
			Skill val = (Skill)(object)((parentItem is Skill) ? parentItem : null);
			if (val != null)
			{
				if (HitKnockbackCooldown != -1f && _affectedCharacter.IsInKnockback)
				{
					At.SetValue(HitKnockbackCooldown, typeof(Skill), val, "m_remainingCooldownTime");
				}
				bool isDead = _affectedCharacter.IsDead;
				((WeaponDamage)this).ActivateLocally(_affectedCharacter, _infos);
				if (!isDead && _affectedCharacter.IsDead && ExecutionSetCooldown != -1f)
				{
					At.SetValue(ExecutionSetCooldown, typeof(Skill), val, "m_remainingCooldownTime");
				}
			}
		}
	}
}
namespace TinyHelper.Interfaces
{
	public interface IDamageScaler
	{
		float GetWeaponDamageMult(WeaponDamage weaponDamage);

		Types GetOverrideDType(WeaponDamage weaponDamage);

		DamageType[] GetDamages(WeaponDamage weaponDamage);

		float GetKnockback(WeaponDamage weaponDamage);
	}
}
namespace TinyHelper.Effects
{
	public class DynamicWeaponDamage : WeaponDamage
	{
		public IDamageScaler DamageScaler = null;

		private void Recalculate()
		{
			//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)
			Console.WriteLine("recalculated");
			Debug.WriteLine("recalculated");
			base.WeaponDamageMult = DamageScaler.GetWeaponDamageMult((WeaponDamage)(object)this);
			base.OverrideDType = DamageScaler.GetOverrideDType((WeaponDamage)(object)this);
			((PunctualDamage)this).Damages = DamageScaler.GetDamages((WeaponDamage)(object)this);
			((PunctualDamage)this).Knockback = DamageScaler.GetKnockback((WeaponDamage)(object)this);
		}

		protected override void StartInit()
		{
			Recalculate();
			((WeaponDamage)this).StartInit();
		}

		public override Weapon BuildDamage(Character _targetCharacter, ref DamageList _list, ref float _knockback)
		{
			Recalculate();
			return ((WeaponDamage)this).BuildDamage(_targetCharacter, ref _list, ref _knockback);
		}

		protected override void BuildDamage(Weapon _weapon, Character _targetCharacter, bool _isSkillOrShield, ref DamageList _list, ref float _knockback)
		{
			Recalculate();
			((WeaponDamage)this).BuildDamage(_weapon, _targetCharacter, _isSkillOrShield, ref _list, ref _knockback);
		}

		protected override void ActivateLocally(Character _targetCharacter, object[] _infos)
		{
			Recalculate();
			((WeaponDamage)this).ActivateLocally(_targetCharacter, _infos);
		}

		protected override DamageList DealHit(Character _targetCharacter)
		{
			Recalculate();
			return ((WeaponDamage)this).DealHit(_targetCharacter);
		}

		public override float DamageMult(Character _targetCharacter, bool _isSkill)
		{
			Recalculate();
			return ((WeaponDamage)this).DamageMult(_targetCharacter, _isSkill);
		}

		public override float KnockbackMult(Character _targetCharacter, bool _isSkill)
		{
			Recalculate();
			return ((WeaponDamage)this).KnockbackMult(_targetCharacter, _isSkill);
		}
	}
	public class ShootBlastFromEffect : ShootBlast
	{
		public override void Setup(TargetingSystem _targetSystem, Transform _parent)
		{
			Character sourceCharacter = ((Effect)this).SourceCharacter;
			((Shooter)this).Setup(((sourceCharacter != null) ? sourceCharacter.TargetingSystem : null) ?? _targetSystem, _parent);
		}
	}
}