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);
}
}