using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using EntityStates; using EntityStates.FalseSon; using EntityStates.Huntress; using EntityStates.Mage.Weapon; using KinematicCharacterController; using Microsoft.CodeAnalysis; using On.EntityStates.FalseSon; using On.EntityStates.Huntress; using On.EntityStates.Mage.Weapon; using On.RoR2; using R2API; using RoR2; using RoR2.Projectile; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ForgottenSkillsTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+cc7dea8867df77fc6fba998680924e55cfee06ba")] [assembly: AssemblyProduct("ForgottenSkillsTweaks")] [assembly: AssemblyTitle("ForgottenSkillsTweaks")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ForgottenSkillsTweaks { public static class ArrowRainTweak { public static void init() { //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_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_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown float newRadius = 13f; SkillDef val = Addressables.LoadAssetAsync((object)"RoR2/Base/Huntress/HuntressBodyArrowRain.asset").WaitForCompletion(); SkillDef val2 = Addressables.LoadAssetAsync((object)"RoR2/Base/Huntress/HuntressBodyBlink.asset").WaitForCompletion(); val2.baseRechargeInterval = 4.5f; val.baseRechargeInterval = 11f; LanguageAPI.Add("HuntressArrowRainDescription", "Teleport into the sky. Target an area to rain arrows, slowing all enemies and dealing 660% damage per second."); val.skillDescriptionToken = "HuntressArrowRainDescription"; ArrowRain.OnEnter += (hook_OnEnter)delegate(orig_OnEnter orig, ArrowRain self) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); self.areaIndicatorInstance.transform.localScale = new Vector3(newRadius, 150f, newRadius); ArrowRain.projectilePrefab.GetComponent().lifetime = 7f; float num = (((EntityState)self).characterBody.attackSpeed - ((EntityState)self).characterBody.baseAttackSpeed) * 0.3f; ArrowRain.projectilePrefab.GetComponent().resetFrequency = 4f * (1f + num); ((Component)ArrowRain.projectilePrefab.GetComponent()).transform.localScale = new Vector3(newRadius, 150f, newRadius) * 2f; ArrowRain.projectilePrefab.GetComponent().overlapProcCoefficient = 0.7f; ArrowRain.projectilePrefab.GetComponent().damageCoefficient = 0.75f; }; } } public static class FlameThrowerTweak { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnEnter <>9__5_0; public static hook_FixedUpdate <>9__5_1; internal void b__5_0(orig_OnEnter orig, Flamethrower self) { orig.Invoke(self); self.entryDuration = 0.3f; self.tickDamageCoefficient *= 2.5f; Flamethrower.ignitePercentChance = 100f; self.maxDistance = newRange; float scaleRatio = newRange / 16f; if ((Object)(object)((EntityState)self).characterMotor != (Object)null) { ((BaseCharacterController)((EntityState)self).characterMotor).Motor.ForceUnground(jumpDuration); ((EntityState)self).characterMotor.velocity.y = 0f; } ScaleFlamethrowerVisual(self.leftFlamethrowerEffectInstance, scaleRatio); ScaleFlamethrowerVisual(self.rightFlamethrowerEffectInstance, scaleRatio); } internal void b__5_1(orig_FixedUpdate orig, Flamethrower self) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_0082: 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) orig.Invoke(self); if (((EntityState)self).fixedAge <= jumpDuration && (Object)(object)((EntityState)self).characterMotor != (Object)null && (Object)(object)((EntityState)self).characterBody != (Object)null) { float num = ((EntityState)self).fixedAge / jumpDuration; float num2 = speedCurve.Evaluate(num); float num3 = ((EntityState)self).characterBody.moveSpeed * baseSpeedMultiplier * num2; CharacterMotor characterMotor = ((EntityState)self).characterMotor; characterMotor.rootMotion += Vector3.up * (num3 * Time.fixedDeltaTime); ((EntityState)self).characterMotor.velocity.y = 0f; } else if (((EntityState)self).fixedAge <= gravityDelay + jumpDuration) { ((EntityState)self).characterMotor.velocity.y = Mathf.Max(((EntityState)self).characterMotor.velocity.y, 0f); } } } private static float newRange = 45f; private static float jumpDuration = 0.5f; private static float baseSpeedMultiplier = 3.5f; private static float gravityDelay = 0.5f; private static readonly AnimationCurve speedCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[3] { new Keyframe(0f, 1f), new Keyframe(0.7f, 0.5f), new Keyframe(1f, 0f) }); public static void init() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: 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_0062: Expected O, but got Unknown //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_0087: Expected O, but got Unknown SkillDef val = Addressables.LoadAssetAsync((object)"RoR2/Base/Mage/MageBodyFlamethrower.asset").WaitForCompletion(); LanguageAPI.Add("MageFlamethrowerNewDesc", "Ignite. Burn all enemies in front of you for 5000% damage."); val.skillDescriptionToken = "MageFlamethrowerNewDesc"; val.keywordTokens = new string[1] { "KEYWORD_IGNITE" }; object obj = <>c.<>9__5_0; if (obj == null) { hook_OnEnter val2 = delegate(orig_OnEnter orig, Flamethrower self) { orig.Invoke(self); self.entryDuration = 0.3f; self.tickDamageCoefficient *= 2.5f; Flamethrower.ignitePercentChance = 100f; self.maxDistance = newRange; float scaleRatio = newRange / 16f; if ((Object)(object)((EntityState)self).characterMotor != (Object)null) { ((BaseCharacterController)((EntityState)self).characterMotor).Motor.ForceUnground(jumpDuration); ((EntityState)self).characterMotor.velocity.y = 0f; } ScaleFlamethrowerVisual(self.leftFlamethrowerEffectInstance, scaleRatio); ScaleFlamethrowerVisual(self.rightFlamethrowerEffectInstance, scaleRatio); }; <>c.<>9__5_0 = val2; obj = (object)val2; } Flamethrower.OnEnter += (hook_OnEnter)obj; object obj2 = <>c.<>9__5_1; if (obj2 == null) { hook_FixedUpdate val3 = delegate(orig_FixedUpdate orig, Flamethrower self) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_0082: 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) orig.Invoke(self); if (((EntityState)self).fixedAge <= jumpDuration && (Object)(object)((EntityState)self).characterMotor != (Object)null && (Object)(object)((EntityState)self).characterBody != (Object)null) { float num = ((EntityState)self).fixedAge / jumpDuration; float num2 = speedCurve.Evaluate(num); float num3 = ((EntityState)self).characterBody.moveSpeed * baseSpeedMultiplier * num2; CharacterMotor characterMotor = ((EntityState)self).characterMotor; characterMotor.rootMotion += Vector3.up * (num3 * Time.fixedDeltaTime); ((EntityState)self).characterMotor.velocity.y = 0f; } else if (((EntityState)self).fixedAge <= gravityDelay + jumpDuration) { ((EntityState)self).characterMotor.velocity.y = Mathf.Max(((EntityState)self).characterMotor.velocity.y, 0f); } }; <>c.<>9__5_1 = val3; obj2 = (object)val3; } Flamethrower.FixedUpdate += (hook_FixedUpdate)obj2; } private static void ScaleFlamethrowerVisual(GameObject effectInstance, float scaleRatio) { //IL_004d: 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) if ((Object)(object)effectInstance == (Object)null) { return; } ParticleSystem[] componentsInChildren = effectInstance.GetComponentsInChildren(); ParticleSystem[] array = componentsInChildren; foreach (ParticleSystem val in array) { string name = ((Object)((Component)val).gameObject).name; if (!(name == "IcoCharge")) { MainModule main = val.main; ((MainModule)(ref main)).startSpeedMultiplier = ((MainModule)(ref main)).startSpeedMultiplier * scaleRatio; if (name == "FireForward" || name == "Billboard") { ((MainModule)(ref main)).startSizeMultiplier = ((MainModule)(ref main)).startSizeMultiplier * 1.5f; } } } } } [BepInPlugin("com.MiIsaarks.ForgottenSkillsTweaks", "ForgottenSkillsTweaks", "0.1.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class MainPlugin : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_FireBullet <>9__4_0; public static hook_OnEnter <>9__4_2; public static hook_GetGrowthLaserBonusDuration <>9__4_3; public static hook_Fire <>9__4_4; public static hook_OnEnter <>9__4_5; internal void b__4_0(orig_FireBullet orig, LaserFatherCharged self, Transform a, Ray b, string c, float d) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) light = true; orig.Invoke(self, a, b, c, d); light = false; } internal void b__4_2(orig_OnEnter orig, LaserFather self) { self.baseChargeDuration = 0.5f; orig.Invoke(self); } internal float b__4_3(orig_GetGrowthLaserBonusDuration orig, FalseSonController self) { return 0f; } internal void b__4_4(orig_Fire orig, BulletAttack self) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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) if ((Object)(object)self.owner != (Object)null) { CharacterBody component = self.owner.GetComponent(); if ((Object)(object)component != (Object)null && component.bodyIndex == BodyCatalog.FindBodyIndex("FalseSonBody")) { EntityStateMachine val = EntityStateMachine.FindByCustomName(self.owner, "Weapon"); if ((Object)(object)val != (Object)null && val.state is LaserFatherCharged) { self.falloffModel = (FalloffModel)0; } } } orig.Invoke(self); } internal void b__4_5(orig_OnEnter orig, LaserFatherCharged self) { orig.Invoke(self); float num = (((EntityState)self).characterBody.attackSpeed - ((EntityState)self).characterBody.baseAttackSpeed) * 0.3f; self.fireFrequency = LaserFatherCharged.baseFireFrequency * (1f + num); hitcount = 1; LaserFatherCharged.procCoefficientPerTick = 0.7f; SkillLocator skillLocator = ((EntityState)self).characterBody.skillLocator; self.spikeRefillAmountPerSecond = 0f; if ((Object)(object)skillLocator != (Object)null) { float num2 = skillLocator.GetSkill((SkillSlot)1).maxStock; float num3 = skillLocator.GetSkill((SkillSlot)1).stock; int num4 = (int)(num2 * 0.5f); ((EntityState)self).skillLocator.GetSkill((SkillSlot)1).stock = (int)Mathf.Clamp(num3 + (float)num4, num3, num2); } if (!originalDamage.HasValue) { originalDamage = LaserFatherCharged.damageCoefficient * 1.35f; } FalseSonController component = ((Component)((EntityState)self).characterBody).GetComponent(); if ((Object)(object)component != (Object)null) { int growthLevel = component.growthLevel; float num5 = 1f + (float)growthLevel * 0.05f; LaserFatherCharged.damageCoefficient = originalDamage.Value * num5; } } } private static int hitsToLightning = 10; private static int hitcount = 0; private static float? originalDamage = null; private static bool light = false; public void Awake() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_003f: 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_004a: Expected O, but got Unknown //IL_008c: 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_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_0081: Expected O, but got Unknown //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Expected O, but got Unknown //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Expected O, but got Unknown //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Expected O, but got Unknown FlameThrowerTweak.init(); ArrowRainTweak.init(); GameObject Lightning = Addressables.LoadAssetAsync((object)"RoR2/DLC2/FalseSon/LunarStakeLightningStrikeImpactEffect.prefab").WaitForCompletion(); object obj = <>c.<>9__4_0; if (obj == null) { hook_FireBullet val = delegate(orig_FireBullet orig, LaserFatherCharged self, Transform a, Ray b, string c, float d) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) light = true; orig.Invoke(self, a, b, c, d); light = false; }; <>c.<>9__4_0 = val; obj = (object)val; } LaserFatherCharged.FireBullet += (hook_FireBullet)obj; BulletAttack.DefaultHitCallbackImplementation += (hook_DefaultHitCallbackImplementation)delegate(orig_DefaultHitCallbackImplementation orig, BulletAttack self, ref BulletHit bullethit) { //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_008b: 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_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: 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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: 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_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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_00dc: 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_00e7: 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_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Expected O, but got Unknown bool result = orig.Invoke(self, ref bullethit); if (!light) { return result; } if ((Object)(object)bullethit.entityObject.GetComponent() != (Object)null) { hitcount++; if (hitcount % hitsToLightning == 0) { GameObject inflictor = Object.Instantiate(Lightning, bullethit.entityObject.transform.position, Quaternion.identity); bullethit.entityObject.GetComponent().TakeDamage(new DamageInfo { damage = self.damage * 3f, position = bullethit.point, force = Vector3.zero, attacker = self.owner, inflictor = inflictor, crit = self.isCrit, damageColorIndex = (DamageColorIndex)0, damageType = DamageTypeCombo.op_Implicit((DamageTypeExtended)8192), procCoefficient = 1f }); } } return result; }; object obj2 = <>c.<>9__4_2; if (obj2 == null) { hook_OnEnter val2 = delegate(orig_OnEnter orig, LaserFather self) { self.baseChargeDuration = 0.5f; orig.Invoke(self); }; <>c.<>9__4_2 = val2; obj2 = (object)val2; } LaserFather.OnEnter += (hook_OnEnter)obj2; SkillDef val3 = Addressables.LoadAssetAsync((object)"RoR2/DLC2/FalseSon/FalseSonBodyLaser.asset").WaitForCompletion(); LanguageAPI.Add("FalseSonLaserDescriptionNew", "Charge a rapidly hitting laser dealing 320%-1890% damage for 4s and refill Lunar Spikes. Increases in damage through Growth. Summons Lightning on repeated hits."); val3.skillDescriptionToken = "FalseSonLaserDescriptionNew"; LanguageAPI.Add("KEYWORD_LASER_LIGHTNING", "Brother's Lightning\nEvery 10 hits with the laser, call down a lightning strike dealing 300% of the laser's damage."); val3.keywordTokens = new string[2] { "KEYWORD_GROWTH", "KEYWORD_LASER_LIGHTNING" }; val3.baseRechargeInterval = 10f; object obj3 = <>c.<>9__4_3; if (obj3 == null) { hook_GetGrowthLaserBonusDuration val4 = (orig_GetGrowthLaserBonusDuration orig, FalseSonController self) => 0f; <>c.<>9__4_3 = val4; obj3 = (object)val4; } FalseSonController.GetGrowthLaserBonusDuration += (hook_GetGrowthLaserBonusDuration)obj3; object obj4 = <>c.<>9__4_4; if (obj4 == null) { hook_Fire val5 = delegate(orig_Fire orig, BulletAttack self) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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) if ((Object)(object)self.owner != (Object)null) { CharacterBody component = self.owner.GetComponent(); if ((Object)(object)component != (Object)null && component.bodyIndex == BodyCatalog.FindBodyIndex("FalseSonBody")) { EntityStateMachine val7 = EntityStateMachine.FindByCustomName(self.owner, "Weapon"); if ((Object)(object)val7 != (Object)null && val7.state is LaserFatherCharged) { self.falloffModel = (FalloffModel)0; } } } orig.Invoke(self); }; <>c.<>9__4_4 = val5; obj4 = (object)val5; } BulletAttack.Fire += (hook_Fire)obj4; object obj5 = <>c.<>9__4_5; if (obj5 == null) { hook_OnEnter val6 = delegate(orig_OnEnter orig, LaserFatherCharged self) { orig.Invoke(self); float num = (((EntityState)self).characterBody.attackSpeed - ((EntityState)self).characterBody.baseAttackSpeed) * 0.3f; self.fireFrequency = LaserFatherCharged.baseFireFrequency * (1f + num); hitcount = 1; LaserFatherCharged.procCoefficientPerTick = 0.7f; SkillLocator skillLocator = ((EntityState)self).characterBody.skillLocator; self.spikeRefillAmountPerSecond = 0f; if ((Object)(object)skillLocator != (Object)null) { float num2 = skillLocator.GetSkill((SkillSlot)1).maxStock; float num3 = skillLocator.GetSkill((SkillSlot)1).stock; int num4 = (int)(num2 * 0.5f); ((EntityState)self).skillLocator.GetSkill((SkillSlot)1).stock = (int)Mathf.Clamp(num3 + (float)num4, num3, num2); } if (!originalDamage.HasValue) { originalDamage = LaserFatherCharged.damageCoefficient * 1.35f; } FalseSonController component = ((Component)((EntityState)self).characterBody).GetComponent(); if ((Object)(object)component != (Object)null) { int growthLevel = component.growthLevel; float num5 = 1f + (float)growthLevel * 0.05f; LaserFatherCharged.damageCoefficient = originalDamage.Value * num5; } }; <>c.<>9__4_5 = val6; obj5 = (object)val6; } LaserFatherCharged.OnEnter += (hook_OnEnter)obj5; } } }