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 HIFUVoidFiendTweaks v1.0.2
HIFUVoidFiendTweaks.dll
Decompiled 2 years 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 System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.VoidSurvivor; using EntityStates.VoidSurvivor.Weapon; using HIFUVoidFiendTweaks.Misc; using HIFUVoidFiendTweaks.Skills; using HIFUVoidFiendTweaks.VFX; using HarmonyLib; using IL.EntityStates.VoidSurvivor.Weapon; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates.VoidSurvivor; using On.EntityStates.VoidSurvivor.Weapon; using On.RoR2; using R2API; using RoR2; using RoR2.Projectile; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [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.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("HIFUVoidFiendTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HIFUVoidFiendTweaks")] [assembly: AssemblyTitle("HIFUVoidFiendTweaks")] [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 HIFUVoidFiendTweaks { public class ConfigManager { internal static bool ConfigChanged; internal static bool VersionChanged; public static T HandleConfig<T>(ConfigEntryBase entry, ConfigFile config, string name) { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown MethodInfo methodInfo = (from x in typeof(ConfigFile).GetMethods() where x.Name == "Bind" select x).First(); methodInfo = methodInfo.MakeGenericMethod(typeof(T)); object[] parameters = new object[3] { (object)new ConfigDefinition(Regex.Replace(config.ConfigFilePath, "\\W", "") + " : " + entry.Definition.Section, name), entry.DefaultValue, (object)new ConfigDescription(entry.Description.Description, (AcceptableValueBase)null, Array.Empty<object>()) }; ConfigEntryBase val = (ConfigEntryBase)methodInfo.Invoke(config, parameters); if (Main._preVersioning) { entry.BoxedValue = entry.DefaultValue; } if (!ConfigEqual(val.DefaultValue, val.BoxedValue) && VersionChanged) { entry.BoxedValue = entry.DefaultValue; val.BoxedValue = val.DefaultValue; } return default(T); } private static bool ConfigEqual(object a, object b) { if (a.Equals(b)) { return true; } if (float.TryParse(a.ToString(), out var result) && float.TryParse(b.ToString(), out var result2) && (double)Mathf.Abs(result - result2) < 0.0001) { return true; } return false; } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("HIFU.HIFUVoidFiendTweaks", "HIFUVoidFiendTweaks", "1.0.1")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.HIFUVoidFiendTweaks"; public const string PluginAuthor = "HIFU"; public const string PluginName = "HIFUVoidFiendTweaks"; public const string PluginVersion = "1.0.1"; public static ConfigFile HVFTConfig; public static ConfigFile HVFTBackupConfig; public static ManualLogSource HVFTLogger; public static bool _preVersioning; public static ConfigEntry<bool> enableAutoConfig { get; set; } public static ConfigEntry<string> latestVersion { get; set; } public void Awake() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014e: 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_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) HVFTLogger = ((BaseUnityPlugin)this).Logger; HVFTConfig = ((BaseUnityPlugin)this).Config; HVFTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFUVoidFiendTweaks.Backup.cfg", true); HVFTBackupConfig.Bind<string>(": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :"); enableAutoConfig = HVFTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFUVoidFiendTweaks from syncing config whenever a new version is found."); _preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HVFTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version"); latestVersion = HVFTConfig.Bind<string>("Config", "Latest Version", "1.0.1", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.0.1")) { latestVersion.Value = "1.0.1"; ConfigManager.VersionChanged = true; HVFTLogger.LogInfo((object)"Config Autosync Enabled."); } GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorBody.prefab").WaitForCompletion(); EntityStateMachine val2 = val.AddComponent<EntityStateMachine>(); val2.customName = "Flood"; val2.initialStateType = new SerializableEntityStateType(typeof(Idle)); val2.mainStateType = new SerializableEntityStateType(typeof(Idle)); SkillDef val3 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidSurvivor/ChargeMegaBlaster.asset").WaitForCompletion(); val3.activationStateMachineName = "Flood"; IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase)) select type; HVFTLogger.LogInfo((object)"==+----------------==TWEAKS==----------------+=="); foreach (Type item in enumerable) { TweakBase tweakBase = (TweakBase)Activator.CreateInstance(item); if (ValidateTweak(tweakBase)) { tweakBase.Init(); } } IEnumerable<Type> enumerable2 = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(MiscBase)) select type; HVFTLogger.LogInfo((object)"==+----------------==MISC==----------------+=="); foreach (Type item2 in enumerable2) { MiscBase miscBase = (MiscBase)Activator.CreateInstance(item2); if (ValidateMisc(miscBase)) { miscBase.Init(); } } BigTracer.Create(); CorruptedDescriptions.ChangeDescriptions(); } public bool ValidateTweak(TweakBase tb) { if (tb.isEnabled && ((BaseUnityPlugin)this).Config.Bind<bool>(tb.Name, "Enable?", true, "Vanilla is false").Value) { return true; } return false; } public bool ValidateMisc(MiscBase mb) { if (mb.isEnabled && ((BaseUnityPlugin)this).Config.Bind<bool>(mb.Name, "Enable?", true, "Vanilla is false").Value) { return true; } return false; } private void WITHINDESTRUCTIONMYFUCKINGBELOVED() { } } public abstract class MiscBase { public abstract string Name { get; } public virtual bool isEnabled { get; } = true; public T ConfigOption<T>(T value, string name, string description) { ConfigEntry<T> val = Main.HVFTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HVFTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); Main.HVFTLogger.LogInfo((object)("Added " + Name)); } } public abstract class MiscBase<T> : MiscBase where T : MiscBase<T> { public static T instance { get; set; } public MiscBase() { if (instance != null) { throw new InvalidOperationException("Singleton class " + typeof(T).Name + " was instantiated twice"); } instance = this as T; } } public abstract class TweakBase { public abstract string Name { get; } public abstract string SkillToken { get; } public abstract string DescText { get; } public abstract bool isVoid { get; } public virtual bool isEnabled { get; } = true; public T ConfigOption<T>(T value, string name, string description) { ConfigEntry<T> val = Main.HVFTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HVFTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); string text = ((!isVoid) ? ("VOIDSURVIVOR_" + SkillToken.ToUpper() + "_DESCRIPTION") : ("VOIDSURVIVOR_" + SkillToken.ToUpper() + "_TOOLTIP")); LanguageAPI.Add(text, DescText); Main.HVFTLogger.LogInfo((object)("Added " + Name)); } } public abstract class TweakBase<T> : TweakBase where T : TweakBase<T> { public static T instance { get; set; } public TweakBase() { if (instance != null) { throw new InvalidOperationException("Singleton class " + typeof(T).Name + " was instantiated twice"); } instance = this as T; } } } namespace HIFUVoidFiendTweaks.VFX { public static class BigTracer { public static GameObject tracer; public static void Create() { //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_006e: 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_00b6: 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_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) tracer = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorBeamTracer.prefab").WaitForCompletion(), "FourthBeamTracer", false); EffectComponent component = tracer.GetComponent<EffectComponent>(); component.applyScale = true; LineRenderer component2 = tracer.GetComponent<LineRenderer>(); component2.widthMultiplier = Drown.FourthRadius * 0.5f; Transform transform = tracer.transform; transform.localScale = new Vector3(Drown.FourthRadius, Drown.FourthRadius, Drown.FourthRadius); Transform child = transform.GetChild(0); child.localScale = new Vector3(Drown.FourthRadius, Drown.FourthRadius, Drown.FourthRadius); Transform child2 = transform.GetChild(1); child2.localScale = new Vector3(Drown.FourthRadius, Drown.FourthRadius, Drown.FourthRadius); ParticleSystem component3 = ((Component)child.GetChild(1)).GetComponent<ParticleSystem>(); ((Component)component3).gameObject.SetActive(true); MainModule main = component3.main; ((MainModule)(ref main)).startSize = MinMaxCurve.op_Implicit(0.15f * Drown.FourthRadius); Light component4 = ((Component)child2.GetChild(2)).GetComponent<Light>(); component4.range = 2f * Drown.FourthRadius; component4.intensity = 10f; ContentAddition.AddEffect(tracer); } } } namespace HIFUVoidFiendTweaks.Skills { public class CorruptedDrown : TweakBase { public static float Damage; public static float PPS; public override string Name => "Primary :: Corrupted Drown"; public override string SkillToken => "primary_uprade"; public override string DescText => "<style=cKeywordName>【Corruption Upgrade】</style><style=cSub>Transform into a " + d(Damage) + " damage short-range beam.</style>"; public override bool isVoid => true; public override void Init() { Damage = ConfigOption(12f, "Damage", "Decimal. Vanilla is 20"); PPS = ConfigOption(4f, "Proc Coefficient Per Second", "Vanilla is 5"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown FireCorruptHandBeam.OnEnter += new hook_OnEnter(FireCorruptHandBeam_OnEnter); } private void FireCorruptHandBeam_OnEnter(orig_OnEnter orig, FireCorruptHandBeam self) { self.damageCoefficientPerSecond = Damage; self.procCoefficientPerSecond = PPS; orig.Invoke(self); } } internal class CorruptedFlood : TweakBase { public static float Damage; public static float Knockback; public static float AoE; public static float ProjectileSpeed; public static float Lifetime; public static float Cooldown; public override string Name => "Secondary :: Corrupted Flood"; public override string SkillToken => "secondary_uprade"; public override string DescText => "<style=cKeywordName>【Corruption Upgrade】</style><style=cSub>Transform into a " + d(Damage) + " damage black hole that pulls enemies in an enormous radius.</style>"; public override bool isVoid => true; public override void Init() { Knockback = ConfigOption(-2500f, "Knockback", "Vanilla is 3000"); AoE = ConfigOption(25f, "Radius", "Vanilla is 10"); Damage = ConfigOption(4f, "Damage", "Decimal. Vanilla is 11"); ProjectileSpeed = ConfigOption(40f, "Projectile Speed", "Vanilla is 70"); Lifetime = ConfigOption(4f, "Projectile Duration", "Vanilla is 99"); Cooldown = ConfigOption(7.5f, "Cooldown", "Vanilla is 4"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown FireCorruptDisks.OnEnter += new hook_OnEnter(FireCorruptDisks_OnEnter); Changes(); } private void FireCorruptDisks_OnEnter(orig_OnEnter orig, FireCorruptDisks self) { self.damageCoefficient = Damage; orig.Invoke(self); } private void Changes() { //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_0038: 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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorMegaBlasterBigProjectileCorrupted.prefab").WaitForCompletion(); ProjectileSimple component = val.GetComponent<ProjectileSimple>(); component.desiredForwardSpeed = ProjectileSpeed; component.lifetime = Lifetime; component.lifetimeExpiredEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorMegaBlasterExplosionCorrupted.prefab").WaitForCompletion(); ProjectileImpactExplosion component2 = val.GetComponent<ProjectileImpactExplosion>(); ((ProjectileExplosion)component2).blastRadius = AoE; RadialForce val2 = val.AddComponent<RadialForce>(); val2.radius = AoE; val2.damping = 0.5f; val2.forceMagnitude = Knockback; val2.forceCoefficientAtEdge = 0.5f; GameObject ghostPrefab = val.GetComponent<ProjectileController>().ghostPrefab; ghostPrefab.GetComponent<ProjectileGhostController>().inheritScaleFromProjectile = true; SkillDef val3 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidSurvivor/FireCorruptDisk.asset").WaitForCompletion(); val3.baseRechargeInterval = Cooldown; } } public class CorruptedSuppress : TweakBase { public static float SelfDamage; public static float CorruptionGain; public static int MaxCharges; public static float duration; public static float endlag; public override string Name => "Special :: Corrupted Suppress"; public override string SkillToken => "special_uprade"; public override string DescText => "<style=cKeywordName>【Corruption Upgrade】</style><style=cSub>Transform to crush " + d(SelfDamage) + " health, gaining " + CorruptionGain + "% Corruption instead. Can hold up to " + MaxCharges + " orbs.</style>"; public override bool isVoid => true; public override void Init() { SelfDamage = ConfigOption(0.19f, "Self Damage", "Decimal. Vanilla is 0.25"); MaxCharges = ConfigOption(2, "Max Charges", "Vanilla is 2"); CorruptionGain = ConfigOption(25f, "Corruption Gain", "Vanilla is 25"); duration = ConfigOption(0.8f, "Animation Duration", "Vanilla is 1"); endlag = ConfigOption(0.3f, "Endlag", "Vanilla is 1"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown CrushBase.OnEnter += new hook_OnEnter(CrushBase_OnEnter); ChargeCrushBase.OnEnter += new hook_OnEnter(ChargeCrushBase_OnEnter); Changes(); } private void ChargeCrushBase_OnEnter(orig_OnEnter orig, ChargeCrushBase self) { if (self != null) { self.baseDuration = duration; } orig.Invoke(self); } private void CrushBase_OnEnter(orig_OnEnter orig, CrushBase self) { if (self is CrushHealth) { self.selfHealFraction = 0f - SelfDamage; self.corruptionChange = CorruptionGain; self.baseDuration = endlag; } orig.Invoke(self); } private void Changes() { //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) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidSurvivor/CrushHealth.asset").WaitForCompletion(); val.baseMaxStock = MaxCharges; } } public class Drown : TweakBase { public static float Damage; public static float Radius; public static int FalloffType; public static float FourthDamage; public static int FourthFalloff; public static float FourthRadius; public int faaa; public override string Name => "Primary : Drown"; public override string SkillToken => "primary"; public override string DescText => "Fire a <style=cIsUtility>slowing</style> long-range beam for <style=cIsDamage>" + d(Damage) + " damage</style>. Every fourth shot fires a medium beam for an additional <style=cIsDamage>" + d(FourthDamage) + " damage</style>."; public override bool isVoid => false; public override void Init() { Damage = ConfigOption(3f, "Damage", "Decimal. Vanilla is 3"); Radius = ConfigOption(1f, "Radius", "Vanilla is 2"); FalloffType = ConfigOption(1, "Falloff Type", "0 is None, 1 is Standard, 2 is Buckshot. Vanilla is 0"); FourthDamage = ConfigOption(1.75f, "Fourth Hit Damage", "Decimal. Default is 1.5"); FourthFalloff = ConfigOption(0, "Fourth Hit Falloff Type", "0 is None, 1 is Standard, 2 is Buckshot. Default is 0"); FourthRadius = ConfigOption(5f, "Fourth Hit Radius", "Default is 5"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown FireHandBeam.OnEnter += new hook_OnEnter(FireHandBeam_OnEnter); CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal; FireHandBeam.OnEnter += new Manipulator(FireHandBeam_OnEnter1); } private void CharacterBody_onBodyStartGlobal(CharacterBody body) { if (((Object)body).name == "VoidSurvivorBody(Clone)") { DrownFour component = ((Component)body).GetComponent<DrownFour>(); if (!Object.op_Implicit((Object)(object)component)) { ((Component)body).gameObject.AddComponent<DrownFour>(); } } } private void FireHandBeam_OnEnter1(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 0), (Instruction x) => ILPatternMatchingExt.MatchStfld(x, typeof(BulletAttack), "falloffModel") })) { val.Remove(); val.Emit(OpCodes.Ldc_I4, faaa); } else { Main.HVFTLogger.LogError((object)"Failed to apply Drown Falloff IL Hook"); } } private void FireHandBeam_OnEnter(orig_OnEnter orig, FireHandBeam self) { self.damageCoefficient = Damage; self.bulletRadius = Radius; DrownFour component = ((Component)((EntityState)self).characterBody).GetComponent<DrownFour>(); if ((Object)(object)component != (Object)null) { component.FireCount++; } orig.Invoke(self); } public Drown() { int falloffType = FalloffType; if (1 == 0) { } int num = falloffType switch { 1 => 1, 2 => 2, _ => 0, }; if (1 == 0) { } faaa = num; base..ctor(); } } public class DrownFour : MonoBehaviour { public int FireCount; public CharacterBody body => ((Component)this).GetComponent<CharacterBody>(); private GameObject hitEffectPrefab => Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorBeamImpact.prefab").WaitForCompletion(); public void FixedUpdate() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_007f: 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_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0186: 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_00e9: Unknown result type (might be due to invalid IL or missing references) if (FireCount >= 4 && Util.HasEffectiveAuthority(((Component)body).gameObject)) { Util.PlaySound("Play_voidman_m2_explode", ((Component)this).gameObject); BulletAttack val = new BulletAttack(); val.owner = ((Component)this).gameObject; val.weapon = ((Component)this).gameObject; val.origin = body.corePosition; Ray aimRay = body.inputBank.GetAimRay(); val.aimVector = ((Ray)(ref aimRay)).direction; val.muzzleName = "MuzzleHandBeam"; val.maxDistance = 1000f; val.minSpread = 0f; val.maxSpread = 0f; val.radius = Drown.FourthRadius; BulletAttack val2 = val; int fourthFalloff = Drown.FourthFalloff; if (1 == 0) { } FalloffModel falloffModel = (FalloffModel)(fourthFalloff switch { 1 => 1, 2 => 2, _ => 0, }); if (1 == 0) { } val2.falloffModel = falloffModel; val.smartCollision = true; val.damage = body.damage * Drown.FourthDamage; val.procCoefficient = 0f; val.force = 0f; val.isCrit = Util.CheckRoll(body.crit, body.master); val.hitEffectPrefab = hitEffectPrefab; val.stopperMask = ((LayerIndex)(ref LayerIndex.noCollision)).mask; val.bulletCount = 1u; val.tracerEffectPrefab = BigTracer.tracer; val.damageType = (DamageType)8; val.Fire(); FireCount = 0; } } } public class Suppress : TweakBase { public static float Healing; public static int MaxCharges; public static float CorruptionLoss; public override string Name => "Special : Suppress"; public override string SkillToken => "special"; public override string DescText => "Crush <style=cIsVoid>" + CorruptionLoss + "% Corruption</style> to heal yourself for <style=cIsHealing>" + d(Healing) + " maximum health</style>." + ((MaxCharges > 1) ? (" <style=cIsUtility>Can hold up to " + MaxCharges + " orbs</style>.") : ""); public override bool isVoid => false; public override void Init() { Healing = ConfigOption(0.175f, "Healing", "Decimal. Vanilla is 0.25"); MaxCharges = ConfigOption(2, "Max Charges", "Vanilla is 1"); CorruptionLoss = ConfigOption(15f, "Corruption Loss", "Vanilla is 25"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown CrushBase.OnEnter += new hook_OnEnter(CrushBase_OnEnter); Changes(); } private void CrushBase_OnEnter(orig_OnEnter orig, CrushBase self) { if (self is CrushCorruption) { self.selfHealFraction = Healing; self.corruptionChange = 0f - CorruptionLoss; } orig.Invoke(self); } private void Changes() { //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) VoidSurvivorSkillDef val = Addressables.LoadAssetAsync<VoidSurvivorSkillDef>((object)"RoR2/DLC1/VoidSurvivor/CrushCorruption.asset").WaitForCompletion(); if (MaxCharges > 1) { ((SkillDef)val).baseMaxStock = MaxCharges; ((SkillDef)val).rechargeStock = 0; val.minimumCorruption = CorruptionLoss; } } } internal class SwingMelee1 : SwingMeleeBase { public override void OnEnter() { //IL_0078: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00b7: 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_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_018e: 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_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) base.OnEnter(); ((BasicMeleeAttack)this).beginStateSoundString = "Play_bandit2_m2_slash"; ((BasicMeleeAttack)this).baseDuration = 0.5f; animationStateName = "SwingMelee1"; animationPlaybackRateParameter = "Melee.playbackRate"; animationLayerName = "LeftArm, Override"; ((BasicMeleeAttack)this).pushAwayForce = 0f; ((BasicMeleeAttack)this).procCoefficient = 1f; ((BasicMeleeAttack)this).mecanimHitboxActiveParameter = "Melee.hitBoxActive"; ((BasicMeleeAttack)this).ignoreAttackSpeed = false; ((BasicMeleeAttack)this).hitPauseDuration = 0.1f; ((BasicMeleeAttack)this).hitEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorBeamImpact.prefab").WaitForCompletion(); ((BasicMeleeAttack)this).hitBoxGroupName = "Melee"; AnimationCurve val = new AnimationCurve(); val.preWrapMode = (WrapMode)1; val.postWrapMode = (WrapMode)1; Keyframe[] array = new Keyframe[2]; Keyframe val2 = default(Keyframe); ((Keyframe)(ref val2)).time = 0f; ((Keyframe)(ref val2)).value = 0.3f; ((Keyframe)(ref val2)).inTangent = -1f; ((Keyframe)(ref val2)).outTangent = -1f; ((Keyframe)(ref val2)).inWeight = 0f; ((Keyframe)(ref val2)).outWeight = 0.06f; ((Keyframe)(ref val2)).weightedMode = (WeightedMode)0; array[0] = val2; val2 = default(Keyframe); ((Keyframe)(ref val2)).time = 1f; ((Keyframe)(ref val2)).value = 0f; ((Keyframe)(ref val2)).inTangent = -0.23f; ((Keyframe)(ref val2)).outTangent = -0.23f; ((Keyframe)(ref val2)).inWeight = 0.1f; ((Keyframe)(ref val2)).outWeight = 0f; ((Keyframe)(ref val2)).weightedMode = (WeightedMode)0; array[1] = val2; val.keys = (Keyframe[])(object)array; ((BasicMeleeAttack)this).forwardVelocityCurve = val; ((BasicMeleeAttack)this).forceVector = Vector3.zero; ((BasicMeleeAttack)this).forceForwardVelocity = false; ((BasicMeleeAttack)this).damageCoefficient = 3f; bloom = 0f; ((BasicMeleeAttack)this).swingEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorMeleeSlash1.prefab").WaitForCompletion(); ((BasicMeleeAttack)this).swingEffectMuzzleString = "MuzzleMelee"; ((BasicMeleeAttack)this).shorthopVelocityFromHit = 3f; ((BasicMeleeAttack)this).scaleHitPauseDurationAndVelocityWithAttackSpeed = true; recoilAmplitude = 1f; } public override void FixedUpdate() { ((BasicMeleeAttack)this).FixedUpdate(); } public override void OnExit() { base.OnExit(); } } internal class SwingMeleeBase : BasicMeleeAttack { [SerializeField] public float recoilAmplitude; [SerializeField] public float bloom; [SerializeField] public string animationLayerName; [SerializeField] public string animationStateName; [SerializeField] public string animationPlaybackRateParameter; public override bool allowExitFire => Object.op_Implicit((Object)(object)((EntityState)this).characterBody) && !((EntityState)this).characterBody.isSprinting; public override void OnEnter() { //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_0017: Unknown result type (might be due to invalid IL or missing references) ((BasicMeleeAttack)this).OnEnter(); CharacterDirection characterDirection = ((EntityState)this).characterDirection; Ray aimRay = ((BaseState)this).GetAimRay(); characterDirection.forward = ((Ray)(ref aimRay)).direction; } public override void OnExit() { ((BasicMeleeAttack)this).OnExit(); } public override void AuthorityModifyOverlapAttack(OverlapAttack overlapAttack) { ((BasicMeleeAttack)this).AuthorityModifyOverlapAttack(overlapAttack); } public override void PlayAnimation() { ((EntityState)this).PlayAnimation(animationLayerName, animationStateName, animationPlaybackRateParameter, base.duration); } public override void OnMeleeHitAuthority() { ((BasicMeleeAttack)this).OnMeleeHitAuthority(); ((EntityState)this).characterBody.AddSpreadBloom(bloom); } public override void BeginMeleeAttackEffect() { ((BaseState)this).AddRecoil(-0.1f * recoilAmplitude, 0.1f * recoilAmplitude, -1f * recoilAmplitude, 1f * recoilAmplitude); ((BasicMeleeAttack)this).BeginMeleeAttackEffect(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)1; } } } namespace HIFUVoidFiendTweaks.Skilldefs { public static class CorruptedPermeateSD { public static SteppedSkillDef sd; public static string nameToken = "HVFT_VOIDSURVIVOR_PRIMARY_MELEE_ALT_NAME"; public static void Create() { //IL_0020: 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) sd = ScriptableObject.CreateInstance<SteppedSkillDef>(); ((SkillDef)sd).activationStateMachineName = "Weapon"; ((SkillDef)sd).interruptPriority = (InterruptPriority)1; ((SkillDef)sd).baseRechargeInterval = 0f; ((SkillDef)sd).baseMaxStock = 1; ((SkillDef)sd).rechargeStock = 1; ((SkillDef)sd).requiredStock = 1; ((SkillDef)sd).stockToConsume = 1; ((SkillDef)sd).resetCooldownTimerOnUse = false; ((SkillDef)sd).fullRestockOnAssign = true; ((SkillDef)sd).dontAllowPastMaxStocks = false; ((SkillDef)sd).beginSkillCooldownOnSkillEnd = true; ((SkillDef)sd).cancelSprintingOnActivation = false; ((SkillDef)sd).forceSprintDuringState = true; ((SkillDef)sd).canceledFromSprinting = false; ((SkillDef)sd).isCombatSkill = true; ((SkillDef)sd).mustKeyPress = false; sd.stepCount = 3; sd.stepGraceDuration = 0.5f; ((SkillDef)sd).icon = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoSpit.asset").WaitForCompletion().icon; ((SkillDef)sd).skillNameToken = nameToken; ((SkillDef)sd).skillDescriptionToken = "HVFT_VOIDSURVIVOR_PRIMARY_MELEE_ALT_DESCRIPTION"; ((SkillDef)sd).keywordTokens = new string[1] { "KEYWORD_AGILE" }; LanguageAPI.Add("HVFT_VOIDSURVIVOR_PRIMARY_MELEE_ALT_NAME", "『P?ermea??te】"); LanguageAPI.Add("HVFT_VOIDSURVIVOR_PRIMARY_MELEE_ALT_DESCRIPTION", "<style=cIsUtility>Agile</style>."); ContentAddition.AddSkillDef((SkillDef)(object)sd); } } public static class PermeateSD { public static SteppedSkillDef sd; public static string nameToken = "HVFT_VOIDSURVIVOR_PRIMARY_MELEE_NAME"; public static void Create() { //IL_0020: 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) sd = ScriptableObject.CreateInstance<SteppedSkillDef>(); ((SkillDef)sd).activationStateMachineName = "Weapon"; ((SkillDef)sd).interruptPriority = (InterruptPriority)1; ((SkillDef)sd).baseRechargeInterval = 0f; ((SkillDef)sd).baseMaxStock = 1; ((SkillDef)sd).rechargeStock = 1; ((SkillDef)sd).requiredStock = 1; ((SkillDef)sd).stockToConsume = 1; ((SkillDef)sd).resetCooldownTimerOnUse = false; ((SkillDef)sd).fullRestockOnAssign = true; ((SkillDef)sd).dontAllowPastMaxStocks = false; ((SkillDef)sd).beginSkillCooldownOnSkillEnd = true; ((SkillDef)sd).cancelSprintingOnActivation = false; ((SkillDef)sd).forceSprintDuringState = true; ((SkillDef)sd).canceledFromSprinting = false; ((SkillDef)sd).isCombatSkill = true; ((SkillDef)sd).mustKeyPress = false; sd.stepCount = 2; sd.stepGraceDuration = 0.5f; ((SkillDef)sd).icon = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoSpit.asset").WaitForCompletion().icon; ((SkillDef)sd).skillNameToken = nameToken; ((SkillDef)sd).skillDescriptionToken = "HVFT_VOIDSURVIVOR_PRIMARY_MELEE_DESCRIPTION"; ((SkillDef)sd).keywordTokens = new string[1] { "KEYWORD_AGILE" }; LanguageAPI.Add("HVFT_VOIDSURVIVOR_PRIMARY_MELEE_NAME", "『P?ermea??te】"); LanguageAPI.Add("HVFT_VOIDSURVIVOR_PRIMARY_MELEE_DESCRIPTION", "<style=cIsUtility>Agile</style>."); ContentAddition.AddSkillDef((SkillDef)(object)sd); } } } namespace HIFUVoidFiendTweaks.Misc { public static class CorruptedDescriptions { public static string corruptedM1Description => "Fire a short-range beam for <style=cIsDamage>" + d(CorruptedDrown.Damage) + " damage</style>."; public static string corruptedM2Description => "Fire an arcing black hole for <style=cIsDamage>" + d(CorruptedFlood.Damage) + " damage</style>."; public static string corruptedSpecialDescription => "Crush <style=cIsHealing>" + d(CorruptedSuppress.SelfDamage) + " health</style> to gain <style=cIsVoid>" + CorruptedSuppress.CorruptionGain + "% Corruption</style>."; public static SkillDef corruptedM1SkillDef => Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidSurvivor/FireCorruptBeam.asset").WaitForCompletion(); public static SkillDef corruptedM2SkillDef => Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidSurvivor/FireCorruptDisk.asset").WaitForCompletion(); public static SkillDef corruptedSpecialSkillDef => Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidSurvivor/CrushHealth.asset").WaitForCompletion(); private static string d(float f) { return f * 100f + "%"; } public static void ChangeDescriptions() { LanguageAPI.Add("VOIDSURVIVOR_PRIMARY_ALT_DESCRIPTION", corruptedM1Description); LanguageAPI.Add("VOIDSURVIVOR_SECONDARY_ALT_DESCRIPTION", corruptedM2Description); LanguageAPI.Add("VOIDSURVIVOR_SPECIAL_ALT_DESCRIPTION", corruptedSpecialDescription); LanguageAPI.Add("VOIDSURVIVOR_SPECIAL_NAME", "【Supp??ress』"); } } internal class HRTTransitions : MiscBase { public static float Duration; public override string Name => "Misc :: Transitions"; public override void Init() { Duration = ConfigOption(0.6f, "Duration", "Vanilla is 1"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown CorruptionTransitionBase.OnEnter += new hook_OnEnter(CorruptionTransitionBase_OnEnter); } private void CorruptionTransitionBase_OnEnter(orig_OnEnter orig, CorruptionTransitionBase self) { if (self is EnterCorruptionTransition) { self.duration = Duration; } orig.Invoke(self); } } internal class Passive : MiscBase { public static float CPSinCombat; public static float CPSOutOfCombat; public static float CPerCrit; public static float ArmorBuff; public static float CFullHeal; public static float CFullDamage; public static float HealingMultiplier; public override string Name => "Misc : Corruption System"; public override void Init() { CPSinCombat = ConfigOption(5f, "Corruption Per Second In Combat", "Vanilla is 3"); CPSOutOfCombat = ConfigOption(3.5f, "Corruption Per Second Out Of Combat", "Vanilla is 3"); CPerCrit = ConfigOption(0f, "Corruption Per Crit", "Vanilla is 2"); ArmorBuff = ConfigOption(-40f, "Corruption Armor", "Vanilla is 100"); CFullHeal = ConfigOption(-115f, "Corruption For Full Heal", "Vanilla is -100. This is used to reduce corruption while healing, formula: Heal Amount / (Max HP + Max Shields) * Corruption For Full Heal"); CFullDamage = ConfigOption(40f, "Corruption For Full Damage", "Vanilla is 50. This is used to increase corruption while taking damage, formula: Damage Taken Amount / (Max HP + Max Shields) * Corruption For Full Damage"); HealingMultiplier = ConfigOption(0.6f, "Healing Multiplier", "Vanilla is 1"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown VoidSurvivorController.OnEnable += new hook_OnEnable(VoidSurvivorController_OnEnable); CharacterBody.RecalculateStats += new Manipulator(CharacterBody_RecalculateStats); HealthComponent.Heal += new hook_Heal(HealthComponent_Heal); Changes(); } private float HealthComponent_Heal(orig_Heal orig, HealthComponent self, float amount, ProcChainMask procChainMask, bool nonRegen) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active && amount > 0f && nonRegen && Object.op_Implicit((Object)(object)self.body.inventory) && self.body.inventory.GetItemCount(Items.VoidmanPassiveItem) > 0 && !((ProcChainMask)(ref procChainMask)).HasProc((ProcType)21)) { amount *= HealingMultiplier; } return orig.Invoke(self, amount, procChainMask, nonRegen); } private void CharacterBody_RecalculateStats(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown ILCursor val = new ILCursor(il); ILLabel val3 = default(ILLabel); float num = default(float); ILLabel val2 = default(ILLabel); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[6] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, "RoR2.DLC1Content/Buffs", "VoidSurvivorCorruptMode"), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CharacterBody>(x, "HasBuff"), (Instruction x) => ILPatternMatchingExt.MatchBrtrue(x, ref val3), (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, ref num), (Instruction x) => ILPatternMatchingExt.MatchBr(x, ref val2), (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 100f) })) { val.Index += 5; val.Next.Operand = ArmorBuff; } else { Main.HVFTLogger.LogError((object)"Failed to apply Corrupted Armor IL Hook"); } } private void VoidSurvivorController_OnEnable(orig_OnEnable orig, VoidSurvivorController self) { self.corruptionPerSecondInCombat = CPSinCombat; self.corruptionPerSecondOutOfCombat = CPSOutOfCombat; self.corruptionPerCrit = CPerCrit; self.corruptionForFullHeal = CFullHeal; self.corruptionForFullDamage = CFullDamage; orig.Invoke(self); } private void Changes() { LanguageAPI.Add("KEYWORD_VOIDCORRUPTION", "<style=cKeywordName>Corruption</style><style=cSub>Gain Corruption by receiving damage" + ((CPerCrit > 0f) ? ", dealing Critical Strikes," : "") + " or holding Void Items. Reduce Corruption by healing.</style>"); } } }