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