Decompiled source of OuthardSkilledAtMeditation v0.0.2

SkilledAtMeditation.dll

Decompiled 3 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using SideLoader;
using SideLoader.Model;
using SideLoader.Model.Status;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("SkilledAtMeditation")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SkilledAtMeditation")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("f58ba851-9161-4c37-a53a-8b7160761b1f")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace SkilledAtMeditation;

public class SL_Meditation : SL_Effect, ICustomModel
{
	public Type SLTemplateModel => typeof(SL_Meditation);

	public Type GameModel => typeof(Meditation);

	public override void ApplyToComponent<T>(T component)
	{
	}

	public override void SerializeEffect<T>(T effect)
	{
	}
}
public class Meditation : Effect, ICustomModel
{
	public Type SLTemplateModel => typeof(SL_Meditation);

	public Type GameModel => typeof(Meditation);

	public override void ActivateLocally(Character _affectedCharacter, object[] _infos)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Invalid comparison between Unknown and I4
		try
		{
			if ((int)_affectedCharacter.CurrentSpellCast != 41)
			{
				_affectedCharacter.StatusEffectMngr.CleanseStatusEffect("Meditation");
				return;
			}
			CharacterStats stats = _affectedCharacter.Stats;
			if (SkilledAtMeditation.EnableBurntRegen.Value)
			{
				Update(ref stats.m_burntStamina, 0f - SkilledAtMeditation.BurntStaminaRegen.Value, stats.MaxStamina);
				Update(ref stats.m_burntHealth, 0f - SkilledAtMeditation.BurntHealthRegen.Value, stats.MaxHealth);
				Update(ref stats.m_burntMana, 0f - SkilledAtMeditation.BurntManaRegen.Value, stats.MaxMana);
			}
			if (SkilledAtMeditation.EnableActiveRegen.Value)
			{
				Update(ref stats.m_stamina, SkilledAtMeditation.ActiveStaminaRegen.Value, stats.ActiveMaxStamina);
				Update(ref stats.m_health, SkilledAtMeditation.ActiveHealthRegen.Value, stats.ActiveMaxHealth);
				Update(ref stats.m_mana, SkilledAtMeditation.ActiveManaRegen.Value, stats.ActiveMaxMana);
			}
		}
		catch (Exception arg)
		{
			SkilledAtMeditation.Log.LogMessage((object)$"Exception during Meditation.ActivateLocally: {arg}");
		}
		static void Update(ref float cur, float delta, float max)
		{
			cur = Mathf.Clamp(cur + delta, 0f, max);
		}
	}
}
[BepInPlugin("com.exp111.SkilledAtMeditation", "SkilledAtMeditation", "1.0")]
public class SkilledAtMeditation : BaseUnityPlugin
{
	public const string ID = "com.exp111.SkilledAtMeditation";

	public const string NAME = "SkilledAtMeditation";

	public const string VERSION = "1.0";

	public static ManualLogSource Log;

	public const int MeditationSkillID = -46000;

	public const int MeditationStatusID = -46001;

	public const string MeditationStatusIdentifier = "Meditation";

	public Skill MeditationSkill;

	public static ConfigEntry<bool> EnableBurntRegen;

	public static ConfigEntry<bool> EnableActiveRegen;

	public static ConfigEntry<float> BurntStaminaRegen;

	public static ConfigEntry<float> BurntHealthRegen;

	public static ConfigEntry<float> BurntManaRegen;

	public static ConfigEntry<float> ActiveStaminaRegen;

	public static ConfigEntry<float> ActiveHealthRegen;

	public static ConfigEntry<float> ActiveManaRegen;

	public void Awake()
	{
		try
		{
			Log = ((BaseUnityPlugin)this).Logger;
			Log.LogMessage((object)"Awake");
			CreateConfig();
			CreateSkill();
			CreateStatusEffect();
			if (SL.PacksLoaded)
			{
				OnPackLoaded();
			}
			SL.OnPacksLoaded += OnPackLoaded;
			SL.OnSceneLoaded += OnSceneLoaded;
		}
		catch (Exception arg)
		{
			Log.LogMessage((object)$"Exception during SkilledAtMeditation.Awake: {arg}");
		}
	}

	private void CreateConfig()
	{
		EnableBurntRegen = ((BaseUnityPlugin)this).Config.Bind<bool>("Burnt Stat Regen", "Enable Burnt Stat Regeneration", true, "Enable or disable the regeneration of burnt stats while meditating");
		EnableActiveRegen = ((BaseUnityPlugin)this).Config.Bind<bool>("Active Stat Regen", "Enable Active Stat Regeneration", true, "Enable or disable the regeneration of active (non-burnt) stats while meditating");
		BurntStaminaRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Burnt Stat Regen", "Burnt Stamina Regeneration Rate", 0.25f, "How quickly burnt stamina will regen while meditating.");
		BurntHealthRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Burnt Stat Regen", "Burnt Health Regeneration Rate", 0.25f, "How quickly burnt health will regen while meditating.");
		BurntManaRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Burnt Stat Regen", "Burnt Mana Regeneration Rate", 0.25f, "How quickly burnt Mana will regen while meditating.");
		ActiveStaminaRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Active Stat Regen", "Active Stamina Regeneration", 0.5f, "How quickly stamina will regen while meditating.");
		ActiveHealthRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Active Stat Regen", "Active Health Regeneration", 0.75f, "How quickly health will regen while meditating.");
		ActiveManaRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Active Stat Regen", "Active Mana Regeneration", 0.5f, "How quickly mana will regen while meditating.");
	}

	public void OnDestroy()
	{
	}

	private void OnSceneLoaded()
	{
		try
		{
			foreach (Character value in CharacterManager.Instance.Characters.Values)
			{
				if (!value.IsAI && (Object)(object)value.Inventory != (Object)null && !value.Inventory.LearnedSkill((Item)(object)MeditationSkill))
				{
					value.Inventory.ReceiveSkillReward(((Item)MeditationSkill).ItemID);
				}
			}
		}
		catch (Exception arg)
		{
			Log.LogMessage((object)$"Exception during SkilledAtMeditation.OnSceneLoaded: {arg}");
		}
	}

	private void OnPackLoaded()
	{
		try
		{
			ref Skill meditationSkill = ref MeditationSkill;
			Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(-46000);
			meditationSkill = (Skill)(object)((itemPrefab is Skill) ? itemPrefab : null);
			MeditationSkill.IgnoreLearnNotification = true;
		}
		catch (Exception arg)
		{
			Log.LogMessage((object)$"Exception during SkilledAtMeditation.OnPackLoaded: {arg}");
		}
	}

	private void CreateStatusEffect()
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Expected O, but got Unknown
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Expected O, but got Unknown
		SL_StatusEffect val = new SL_StatusEffect();
		val.TargetStatusIdentifier = "Burning";
		val.EffectBehaviour = (EditBehaviours)2;
		val.StatusIdentifier = "Meditation";
		val.NewStatusID = -46001;
		val.Name = "Resting";
		val.Description = "Slowly restore stats while you rest.";
		((SL_StatusBase)val).SLPackName = "com.exp111.SkilledAtMeditation";
		((SL_StatusBase)val).SubfolderName = "Meditation";
		val.Lifespan = -1f;
		val.RefreshRate = 1f;
		val.DisplayedInHUD = true;
		val.IsMalusEffect = false;
		val.Purgeable = false;
		val.VFXInstantiationType = (FXInstantiationTypes)0;
		val.VFXPrefab = null;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val2 = new SL_EffectTransform();
		val2.TransformName = "Effects";
		val2.Effects = (SL_Effect[])(object)new SL_Effect[1]
		{
			new SL_Meditation()
		};
		array[0] = val2;
		val.Effects = (SL_EffectTransform[])(object)array;
		((ContentTemplate)val).ApplyTemplate();
	}

	private void CreateSkill()
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Expected O, but got Unknown
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Expected O, but got Unknown
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: Expected O, but got Unknown
		SL_Skill val = new SL_Skill();
		((SL_Item)val).Name = "Resting";
		((SL_Item)val).EffectBehaviour = (EditBehaviours)2;
		((SL_Item)val).Target_ItemID = 8100120;
		((SL_Item)val).New_ItemID = -46000;
		((SL_Item)val).SLPackName = "com.exp111.SkilledAtMeditation";
		((SL_Item)val).SubfolderName = "Meditate";
		((SL_Item)val).Description = "Enter a Resting state, slowly regenerating your vigor and injuries. When near a lit fire, your rest is enhanced and your body begins to recover.";
		((SL_Item)val).CastType = (SpellCastType)41;
		((SL_Item)val).CastModifier = (SpellCastModifier)0;
		((SL_Item)val).CastLocomotionEnabled = true;
		((SL_Item)val).MobileCastMovementMult = -1f;
		SL_EffectTransform[] array = new SL_EffectTransform[1];
		SL_EffectTransform val2 = new SL_EffectTransform();
		val2.TransformName = "Effects";
		val2.Effects = (SL_Effect[])(object)new SL_Effect[1] { (SL_Effect)new SL_AddStatusEffect
		{
			StatusEffect = "Meditation",
			ChanceToContract = 100,
			Delay = 1f
		} };
		array[0] = val2;
		((SL_Item)val).EffectTransforms = (SL_EffectTransform[])(object)array;
		val.Cooldown = 1f;
		val.StaminaCost = 0f;
		val.HealthCost = 0f;
		val.ManaCost = 0f;
		((ContentTemplate)val).ApplyTemplate();
	}

	[Conditional("DEBUG")]
	public static void DebugLog(string message)
	{
		Log.LogMessage((object)message);
	}

	[Conditional("TRACE")]
	public static void DebugTrace(string message)
	{
		Log.LogMessage((object)message);
	}
}