Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of FalseSonSurvivorTweaks v1.0.2
FalseSonSurvivorTweaks.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.FalseSon; using HG.GeneralSerializer; using Microsoft.CodeAnalysis; using On.EntityStates.FalseSon; using R2API; using RoR2; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("FalseSonSurvivorTweaks")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("FalseSonSurvivorTweaks")] [assembly: AssemblyTitle("FalseSonSurvivorTweaks")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace FalseSonSurvivorTweaks { [BepInPlugin("Jeffdev.FalseSonSurvivorTweaks", "FalseSonSurvivorTweaks", "1.0.2")] public class FalseSonSurvivorTweaks : BaseUnityPlugin { public const string PluginGUID = "Jeffdev.FalseSonSurvivorTweaks"; public const string PluginAuthor = "Jeffdev"; public const string PluginName = "FalseSonSurvivorTweaks"; public const string PluginVersion = "1.0.2"; public static ConfigEntry<int> laserBurstCooldown; public static ConfigEntry<float> laserBurstRefill; public static ConfigEntry<float> higherLaserProc; public static ConfigEntry<bool> agileStakes; public void Awake() { //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown //IL_00cc: 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_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) Log.Init(((BaseUnityPlugin)this).Logger); laserBurstCooldown = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Laser Burst Cooldown", 10, "Change the cooldown of the Laser Burst skill in seconds (8 is vanilla default)"); laserBurstRefill = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Laser Burst Spike Refill %", 0.3f, "Sets the % amount of lunar spikes/stakes refilled from Laser Burst. (0.5, aka 50%, is vanilla default, keep between 0 and 1)"); higherLaserProc = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Laser of the Father Proc Coefficient", 0.75f, "Sets the proc coefficient of the Laser of the Father skill (default is 0.45)"); agileStakes = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Agile Lunar Stakes", false, "Lets Lunar Stakes be used while sprinting (false is vanilla default)"); Run.onRunStartGlobal += Run_onRunStartGlobal; LaserFatherCharged.OnEnter += new hook_OnEnter(LaserFatherCharged_OnEnter1); LaserFatherBurstPrep.OnEnter += new hook_OnEnter(LaserFatherBurstPrep_OnEnter); if (!Addressables.LoadAssetAsync<EntityStateConfiguration>((object)"RoR2/DLC2/FalseSon/EntityStates.FalseSon.LaserFatherCharged.asset").WaitForCompletion().TryModifyFieldValue("procCoefficientPerTick", higherLaserProc.Value)) { Log.Error("Could not patch LaserFatherCharged.procCoefficientPerTick"); } SteppedSkillDef obj = Addressables.LoadAssetAsync<SteppedSkillDef>((object)"RoR2/DLC2/FalseSon/FalseSonBodyLaserBurst.asset").WaitForCompletion(); int num = Mathf.RoundToInt(laserBurstRefill.Value * 100f); Log.Info(num); string text = "Fire a piercing laser for <style=cIsDamage>1250%</style> damage, " + $"refilling <style=cIsUtility>{num}%</style> Lunar Spikes. " + "Increases in stock by <style=cIsHealing>Growth</style>."; LanguageAPI.Add(((SkillDef)obj).skillDescriptionToken, text); SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC2/FalseSon/FalseSonLunarStake.asset").WaitForCompletion(); if (agileStakes.Value) { List<string> list = val.keywordTokens.ToList(); list.Add("KEYWORD_AGILE"); val.cancelSprintingOnActivation = !agileStakes.Value; val.keywordTokens = list.ToArray(); string text2 = "<style=cIsUtility>Lunar Ruin</style>. <style=cIsUtility>Agile</style>. Fire a <style=cIsDamage>piercing</style>, <style=cIsDamage>lightning</style> infused Lunar Stake for <style=cIsDamage>300% damage</style>. Gain more Lunar Stakes through <style=cIsHealing>Growth</style>. Counts as <style=cIsUtility>2</style> Lunar Spikes."; LanguageAPI.Add(val.skillDescriptionToken, text2); } } private void LaserFatherCharged_OnEnter1(orig_OnEnter orig, LaserFatherCharged self) { orig.Invoke(self); float num = ((EntityState)self).characterBody.attackSpeed - ((EntityState)self).characterBody.baseAttackSpeed; self.fireFrequency = LaserFatherCharged.baseFireFrequency + num * LaserFatherCharged.baseFireFrequency; } private void Run_onRunStartGlobal(Run obj) { SkillDef skillDef = SkillCatalog.GetSkillDef(SkillCatalog.FindSkillIndexByName("LaserBurst")); if ((Object)(object)skillDef == (Object)null) { Log.Error($"One or more SkillDefs could not be found! Check skill names. {skillDef}"); } else { skillDef.baseRechargeInterval = laserBurstCooldown.Value; } } private void LaserFatherBurstPrep_OnEnter(orig_OnEnter orig, LaserFatherBurstPrep self) { self.secondaryRefillPercentage = laserBurstRefill.Value; orig.Invoke(self); } } public static class EntityStateConfigurationExtensions { public static bool TryModifyFieldValue<T>(this EntityStateConfiguration entityStateConfiguration, string fieldName, T value) { ref SerializedField orCreateField = ref ((SerializedFieldCollection)(ref entityStateConfiguration.serializedFieldsCollection)).GetOrCreateField(fieldName); if (Object.op_Implicit(orCreateField.fieldValue.objectValue) && typeof(Object).IsAssignableFrom(typeof(T))) { ref Object objectValue = ref orCreateField.fieldValue.objectValue; object obj = value; objectValue = (Object)((obj is Object) ? obj : null); return true; } if (orCreateField.fieldValue.stringValue != null && StringSerializer.CanSerializeType(typeof(T))) { orCreateField.fieldValue.stringValue = StringSerializer.Serialize(typeof(T), (object)value); return true; } Debug.LogError((object)("Failed to modify field " + fieldName)); return false; } public static bool TryGetFieldValue<T>(this EntityStateConfiguration entityStateConfiguration, string fieldName, out T value) where T : Object { ref SerializedField orCreateField = ref ((SerializedFieldCollection)(ref entityStateConfiguration.serializedFieldsCollection)).GetOrCreateField(fieldName); if (Object.op_Implicit(orCreateField.fieldValue.objectValue) && typeof(Object).IsAssignableFrom(typeof(T))) { value = (T)(object)orCreateField.fieldValue.objectValue; return true; } if (!string.IsNullOrEmpty(orCreateField.fieldValue.stringValue)) { Debug.LogError((object)("Failed to return " + fieldName + " as an Object, try getting the string value instead.")); } else { Debug.LogError((object)("Field is null " + fieldName)); } value = default(T); return false; } public static bool TryGetFieldValueString<T>(this EntityStateConfiguration entityStateConfiguration, string fieldName, out T value) where T : IEquatable<T> { ref SerializedField orCreateField = ref ((SerializedFieldCollection)(ref entityStateConfiguration.serializedFieldsCollection)).GetOrCreateField(fieldName); if (orCreateField.fieldValue.stringValue != null && StringSerializer.CanSerializeType(typeof(T))) { value = (T)StringSerializer.Deserialize(typeof(T), orCreateField.fieldValue.stringValue); return true; } if (Object.op_Implicit(orCreateField.fieldValue.objectValue)) { Debug.LogError((object)("Failed to return " + fieldName + " as a string, try getting the Object value instead.")); } else { Debug.LogError((object)("Field is null " + fieldName)); } value = default(T); return false; } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } }