Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of HIFUBanditTweaks v1.2.6
HIFUBanditTweaks.dll
Decompiled a year agousing System; using System.Collections; 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.Bandit2; using EntityStates.Bandit2.Weapon; using HIFUBanditTweaks.Skills; using HarmonyLib; using IL.EntityStates.Bandit2; using IL.EntityStates.Bandit2.Weapon; using IL.RoR2; using KinematicCharacterController; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using MonoMod.RuntimeDetour; using On.EntityStates.Bandit2; using On.EntityStates.Bandit2.Weapon; using On.RoR2; using On.RoR2.Achievements.Bandit2; using R2API; using R2API.Networking; using R2API.Networking.Interfaces; using RoR2; using RoR2.Achievements; using RoR2.Achievements.Bandit2; 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.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("HIFUBanditTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HIFUBanditTweaks")] [assembly: AssemblyTitle("HIFUBanditTweaks")] [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 HIFUBanditTweaks { 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.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("HIFU.HIFUBanditTweaks", "HIFUBanditTweaks", "1.2.6")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.HIFUBanditTweaks"; public const string PluginAuthor = "HIFU"; public const string PluginName = "HIFUBanditTweaks"; public const string PluginVersion = "1.2.6"; public static ConfigFile HBTConfig; public static ConfigFile HBTBackupConfig; public static ManualLogSource HBTLogger; public static bool _preVersioning; public static BodyIndex banditBodyIndex; 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_0153: Expected O, but got Unknown HBTLogger = ((BaseUnityPlugin)this).Logger; HBTConfig = ((BaseUnityPlugin)this).Config; HBTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFUBanditTweaks.Backup.cfg", true); HBTBackupConfig.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 = HBTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFUBanditTweaks from syncing config whenever a new version is found."); _preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HBTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version"); latestVersion = HBTConfig.Bind<string>("Config", "Latest Version", "1.2.6", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.2.6")) { latestVersion.Value = "1.2.6"; ConfigManager.VersionChanged = true; HBTLogger.LogInfo((object)"Config Autosync Enabled."); } BodyCatalog.Init += new hook_Init(BodyCatalog_Init1); Specials.Init(); IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase)) select type; HBTLogger.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; HBTLogger.LogInfo((object)"==+----------------==MISC==----------------+=="); foreach (Type item2 in enumerable2) { MiscBase miscBase = (MiscBase)Activator.CreateInstance(item2); if (ValidateMisc(miscBase)) { miscBase.Init(); } } NetworkingAPI.RegisterMessageType<SyncCooldownReduction>(); } private IEnumerator BodyCatalog_Init1(orig_Init orig) { yield return orig.Invoke(); banditBodyIndex = BodyCatalog.FindBodyIndex("Bandit2Body(Clone)"); } 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 PeripheryMyBeloved() { } } 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.HBTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HBTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); Main.HBTLogger.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 virtual bool isEnabled { get; } = true; public T ConfigOption<T>(T value, string name, string description) { ConfigEntry<T> val = Main.HBTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HBTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); string text = "BANDIT2_" + SkillToken.ToUpper() + "_DESCRIPTION"; LanguageAPI.Add(text, DescText); Main.HBTLogger.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 HIFUBanditTweaks.Skills { public class Blast : TweakBase<Blast> { public static float Damage; public static int AmmoCount; public static float AutofireDur; public static bool VanillaSpread; public override string Name => ": Primary :: Blast"; public override string SkillToken => "primary_alt"; public override string DescText => "Fire an automatic rifle blast for <style=cIsDamage>" + d(Damage) + " damage</style>. Can hold up to " + AmmoCount + " bullets."; public override void Init() { Damage = ConfigOption(2.2f, "Damage", "Decimal. Vanilla is 3.3"); AmmoCount = ConfigOption(6, "Charges", "Vanilla is 4"); AutofireDur = ConfigOption(0.12f, "Autofire Duration per Bullet", ""); VanillaSpread = ConfigOption(value: false, "Vanilla Spread", "Uses vanilla's spread and recoil settings, making the skill much more inaccurate"); 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 Bandit2FirePrimaryBase.OnEnter += new hook_OnEnter(Bandit2FirePrimaryBase_OnEnter); Bandit2FirePrimaryBase.GetMinimumInterruptPriority += new hook_GetMinimumInterruptPriority(Bandit2FirePrimaryBase_GetMinimumInterruptPriority); Changes(); } private InterruptPriority Bandit2FirePrimaryBase_GetMinimumInterruptPriority(orig_GetMinimumInterruptPriority orig, Bandit2FirePrimaryBase self) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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) if (((EntityState)self).fixedAge <= self.minimumDuration && ((EntityState)self).inputBank.skill1.wasDown) { return (InterruptPriority)2; } return (InterruptPriority)0; } private void Bandit2FirePrimaryBase_OnEnter(orig_OnEnter orig, Bandit2FirePrimaryBase self) { if (self is Bandit2FireRifle) { ((GenericBulletBaseState)self).damageCoefficient = Damage; if (!VanillaSpread) { ((GenericBulletBaseState)self).recoilAmplitudeX = 0.15f; ((GenericBulletBaseState)self).recoilAmplitudeY = 0.7f; ((GenericBulletBaseState)self).spreadYawScale = 0f; ((GenericBulletBaseState)self).spreadPitchScale = 0f; ((GenericBulletBaseState)self).bulletRadius = 0.4f; } self.minimumBaseDuration = AutofireDur; } 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_0028: Unknown result type (might be due to invalid IL or missing references) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Bandit2/Bandit2Blast.asset").WaitForCompletion(); val.baseMaxStock = AmmoCount; val.mustKeyPress = false; val.interruptPriority = (InterruptPriority)1; } private void HaveAblastPeriphery() { } } public class Burst : TweakBase<Burst> { public static int PelletCount; public static float Damage; public static float ProcCoefficient; public static int AmmoCount; public static float AutofireDur; public override string Name => ": Primary : Burst"; public override string SkillToken => "primary"; public override string DescText => "Fire an automatic shotgun burst for <style=cIsDamage>" + PelletCount + "x" + d(Damage) + " damage</style>. Can hold up to " + AmmoCount + " shells."; public override void Init() { PelletCount = ConfigOption(5, "Pellet Count", "Vanilla is 5"); Damage = ConfigOption(0.75f, "Damage", "Decimal. Vanilla is 1"); ProcCoefficient = ConfigOption(0.7f, "Proc Coefficient", "Vanilla is 0.5"); AmmoCount = ConfigOption(4, "Charges", "Vanilla is 4"); AutofireDur = ConfigOption(0.12f, "Autofire Duration per Bullet", ""); 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 Bandit2FirePrimaryBase.OnEnter += new hook_OnEnter(Bandit2FirePrimaryBase_OnEnter); Changes(); } private void Bandit2FirePrimaryBase_OnEnter(orig_OnEnter orig, Bandit2FirePrimaryBase self) { if (self is FireShotgun2) { ((GenericBulletBaseState)self).bulletCount = PelletCount; ((GenericBulletBaseState)self).damageCoefficient = Damage; ((GenericBulletBaseState)self).procCoefficient = ProcCoefficient; ((GenericBulletBaseState)self).bulletRadius = 0.3f; self.minimumBaseDuration = AutofireDur; } 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_0028: Unknown result type (might be due to invalid IL or missing references) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Bandit2/FireShotgun2.asset").WaitForCompletion(); val.baseMaxStock = AmmoCount; val.mustKeyPress = false; val.interruptPriority = (InterruptPriority)1; } } public class Desperado : TweakBase<Desperado> { public static float Damage; public static float StackDamage; public static float Cooldown; public override string Name => ": Special :: Desperado"; public override string SkillToken => "special_alt"; public override string DescText => "<style=cIsDamage>Slayer</style>. Fire a revolver shot for <style=cIsDamage>" + d(Damage) + " damage</style>. Kills grant <style=cIsDamage>stacking tokens</style> for <style=cIsDamage>" + d(StackDamage * Damage) + "</style> more Desperado skill damage."; public override void Init() { Cooldown = ConfigOption(6f, "Cooldown", "Vanilla is 4"); Damage = ConfigOption(8f, "Damage", "Decimal. Vanilla is 6"); StackDamage = ConfigOption(0.055f, "Damage Per Token", "Vanilla is 0.1. Additive Damage increase per token = Damage Per Token * Damage"); 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 BaseFireSidearmRevolverState.OnEnter += new hook_OnEnter(BaseFireSidearmRevolverState_OnEnter); FireSidearmSkullRevolver.ModifyBullet += new Manipulator(FireSidearmSkullRevolver_ModifyBullet); Changes(); } private void FireSidearmSkullRevolver_ModifyBullet(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); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.1f) })) { val.Next.Operand = StackDamage; } else { Main.HBTLogger.LogError((object)"Failed to apply Desperado Stacking Damage hook"); } } private void BaseFireSidearmRevolverState_OnEnter(orig_OnEnter orig, BaseFireSidearmRevolverState self) { if (self is FireSidearmSkullRevolver) { 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) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Bandit2/SkullRevolver.asset").WaitForCompletion(); val.baseRechargeInterval = Cooldown; val.canceledFromSprinting = false; } } public static class Specials { [CompilerGenerated] private static class <>O { public static hook_FixedUpdate <0>__BaseSidearmState_FixedUpdate; public static hook_FixedUpdate <1>__BasePrepSidearmRevolverState_FixedUpdate; } public static void Init() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown object obj = <>O.<0>__BaseSidearmState_FixedUpdate; if (obj == null) { hook_FixedUpdate val = BaseSidearmState_FixedUpdate; <>O.<0>__BaseSidearmState_FixedUpdate = val; obj = (object)val; } BaseSidearmState.FixedUpdate += (hook_FixedUpdate)obj; object obj2 = <>O.<1>__BasePrepSidearmRevolverState_FixedUpdate; if (obj2 == null) { hook_FixedUpdate val2 = BasePrepSidearmRevolverState_FixedUpdate; <>O.<1>__BasePrepSidearmRevolverState_FixedUpdate = val2; obj2 = (object)val2; } BasePrepSidearmRevolverState.FixedUpdate += (hook_FixedUpdate)obj2; } private static void BasePrepSidearmRevolverState_FixedUpdate(orig_FixedUpdate orig, BasePrepSidearmRevolverState self) { ((EntityState)self).fixedAge = ((EntityState)self).fixedAge + Time.fixedDeltaTime; if (((EntityState)self).fixedAge >= ((BaseSidearmState)self).duration && !((EntityState)self).inputBank.skill4.down) { ((EntityState)self).outer.SetNextState(self.GetNextState()); } } public static void BaseSidearmState_FixedUpdate(orig_FixedUpdate orig, BaseSidearmState self) { ((EntityState)self).fixedAge = ((EntityState)self).fixedAge + Time.fixedDeltaTime; } } public class LightsOut : TweakBase<LightsOut> { public static float Damage; public static float Cooldown; public static ModdedDamageType cooldownReset = DamageAPI.ReserveDamageType(); public static float CooldownReduction; public override string Name => ": Special : Lights Out"; public override string SkillToken => "special"; public override string DescText => "<style=cIsDamage>Slayer</style>. Fire a revolver shot for <style=cIsDamage>" + d(Damage) + " damage</style>. Kills <style=cIsUtility>reset Lights Out's cooldown</style> and <style=cIsUtility>reduce other cooldowns</style> by <style=cIsUtility>" + d(CooldownReduction) + "</style>."; public override void Init() { Cooldown = ConfigOption(6f, "Cooldown", "Vanilla is 4"); Damage = ConfigOption(8f, "Damage", "Decimal. Vanilla is 6"); CooldownReduction = ConfigOption(1f, "Non-Special Cooldown Reduction on Kill", "Decimal. 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 BaseFireSidearmRevolverState.OnEnter += new hook_OnEnter(BaseFireSidearmRevolverState_OnEnter); FireSidearmResetRevolver.ModifyBullet += new hook_ModifyBullet(FireSidearmResetRevolver_ModifyBullet); GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; Changes(); } private void GlobalEventManager_onCharacterDeathGlobal(DamageReport damageReport) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) DamageInfo damageInfo = damageReport.damageInfo; if (!DamageAPI.HasModdedDamageType(damageInfo, cooldownReset)) { return; } EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/Bandit2ResetEffect"), new EffectData { origin = damageInfo.position }, true); GameObject attacker = damageReport.attacker; if (!Object.op_Implicit((Object)(object)attacker)) { return; } NetMessageExtensions.Send((INetMessage)(object)new SyncCooldownReduction(attacker.GetComponent<NetworkIdentity>().netId, CooldownReduction), (NetworkDestination)1); SkillLocator component = attacker.GetComponent<SkillLocator>(); if (Object.op_Implicit((Object)(object)component)) { GenericSkill primary = component.primary; GenericSkill secondary = component.secondary; GenericSkill utility = component.utility; GenericSkill special = component.special; if (Object.op_Implicit((Object)(object)primary) && primary.stock < primary.maxStock) { primary.rechargeStopwatch += primary.finalRechargeInterval * CooldownReduction; } if (Object.op_Implicit((Object)(object)secondary) && secondary.stock < secondary.maxStock) { secondary.rechargeStopwatch += secondary.finalRechargeInterval * CooldownReduction; } if (Object.op_Implicit((Object)(object)utility) && utility.stock < utility.maxStock) { utility.rechargeStopwatch += utility.finalRechargeInterval * CooldownReduction; } if (Object.op_Implicit((Object)(object)special) && special.stock < special.maxStock) { special.rechargeStopwatch += special.finalRechargeInterval * 1f; } } } private void FireSidearmResetRevolver_ModifyBullet(orig_ModifyBullet orig, FireSidearmResetRevolver self, BulletAttack bulletAttack) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, bulletAttack); DamageAPI.AddModdedDamageType(bulletAttack, cooldownReset); bulletAttack.damageType &= DamageTypeCombo.op_Implicit((DamageType)(-5)); } private void BaseFireSidearmRevolverState_OnEnter(orig_OnEnter orig, BaseFireSidearmRevolverState self) { if (self is FireSidearmResetRevolver) { 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) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Bandit2/ResetRevolver.asset").WaitForCompletion(); val.baseRechargeInterval = Cooldown; val.canceledFromSprinting = false; } } public class SyncCooldownReduction : INetMessage, ISerializableObject { private NetworkInstanceId objID; private float cooldownReduction; public SyncCooldownReduction() { } public SyncCooldownReduction(NetworkInstanceId objID, float cooldownReduction) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) this.objID = objID; this.cooldownReduction = cooldownReduction; } public void Deserialize(NetworkReader reader) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) objID = reader.ReadNetworkId(); cooldownReduction = reader.ReadSingle(); } public void OnReceived() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { return; } GameObject val = Util.FindNetworkObject(objID); if (!Object.op_Implicit((Object)(object)val)) { return; } SkillLocator component = val.GetComponent<SkillLocator>(); if (Object.op_Implicit((Object)(object)component)) { GenericSkill primary = component.primary; GenericSkill secondary = component.secondary; GenericSkill utility = component.utility; GenericSkill special = component.special; if (Object.op_Implicit((Object)(object)primary) && primary.stock < primary.maxStock) { primary.rechargeStopwatch += primary.finalRechargeInterval * cooldownReduction; } if (Object.op_Implicit((Object)(object)secondary) && secondary.stock < secondary.maxStock) { secondary.rechargeStopwatch += secondary.finalRechargeInterval * cooldownReduction; } if (Object.op_Implicit((Object)(object)utility) && utility.stock < utility.maxStock) { utility.rechargeStopwatch += utility.finalRechargeInterval * cooldownReduction; } if (Object.op_Implicit((Object)(object)special) && special.stock < special.maxStock) { special.rechargeStopwatch += special.finalRechargeInterval * 1f; } } } public void Serialize(NetworkWriter writer) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) writer.Write(objID); writer.Write(cooldownReduction); } } public class SerratedDagger : TweakBase<SerratedDagger> { public static float Damage; public static float Cooldown; public static float ProcCoefficient; public static bool Lunge; public override string Name => ": Secondary : Serrated Dagger"; public override string SkillToken => "secondary"; public override string DescText => "<style=cIsUtility>Lunge</style> and slash for <style=cIsDamage>" + d(Damage) + " damage</style>. Critical Strikes also cause <style=cIsHealth>hemorrhaging</style>."; public override void Init() { Damage = ConfigOption(6f, "Damage", "Decimal. Vanilla is 3.6"); Cooldown = ConfigOption(7f, "Cooldown", "Vanilla is 4"); ProcCoefficient = ConfigOption(0f, "Proc Coefficient", "Vanilla is 1"); Lunge = ConfigOption(value: true, "Enable lunge?", "Vanilla is false"); 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 SlashBlade.OnEnter += new hook_OnEnter(SlashBlade_OnEnter); Changes(); } private void SlashBlade_OnEnter(orig_OnEnter orig, SlashBlade self) { //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_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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_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_0074: 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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) ((BasicMeleeAttack)self).damageCoefficient = Damage; ((BasicMeleeAttack)self).procCoefficient = ProcCoefficient; orig.Invoke(self); if (Lunge && ((EntityState)self).isAuthority) { Ray aimRay = ((BaseState)self).GetAimRay(); Vector3 direction = ((Ray)(ref aimRay)).direction; Vector3 val = ((Vector3)(ref direction)).normalized * 2.6f * ((BaseState)self).moveSpeedStat; Vector3 val2 = Vector3.up * 2f; Vector3 val3 = new Vector3(direction.x, 0f, direction.z); Vector3 val4 = ((Vector3)(ref val3)).normalized * 2.6f; ((BaseCharacterController)((EntityState)self).characterMotor).Motor.ForceUnground(0.1f); ((EntityState)self).characterMotor.velocity = val + val2 + val4; } } 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/Base/Bandit2/SlashBlade.asset").WaitForCompletion(); val.baseRechargeInterval = Cooldown; } } public class SerratedShiv : TweakBase<SerratedShiv> { public static float Damage; public static float Cooldown; public static int Charges; public static int ChargesToRecharge; public static bool Sidestep; public override string Name => ": Secondary :: Serrated Shiv"; public override string SkillToken => "secondary_alt"; public override string DescText => (Sidestep ? "<style=cIsUtility>Sidestep</style> and throw" : "Throw") + " a hidden blade for <style=cIsDamage>" + d(Damage) + " damage</style>. Critical Strikes also cause <style=cIsHealth>hemorrhaging</style>." + ((Charges > 1) ? (" <style=cIsUtility>Can hold up to " + Charges + " shivs</style>.") : ""); public override void Init() { Damage = ConfigOption(2f, "Damage", "Decimal. Vanilla is 3.6"); Cooldown = ConfigOption(10f, "Cooldown", "Vanilla is 4"); Charges = ConfigOption(2, "Charges", "Vanilla is 1"); ChargesToRecharge = ConfigOption(2, "Charges to Recharge", "Vanilla is 1"); Sidestep = ConfigOption(value: true, "Enable sidestep?", "Vanilla is false"); 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 Bandit2FireShiv.OnEnter += new hook_OnEnter(Bandit2FireShiv_OnEnter); Changes(); } private void Bandit2FireShiv_OnEnter(orig_OnEnter orig, Bandit2FireShiv self) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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) //IL_004b: 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_005a: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: 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_0092: Unknown result type (might be due to invalid IL or missing references) self.damageCoefficient = Damage; orig.Invoke(self); if (Sidestep && ((EntityState)self).isAuthority) { Vector3 val = ((((EntityState)self).inputBank.moveVector == Vector3.zero) ? Vector3.zero : ((Vector3)(ref ((EntityState)self).inputBank.moveVector)).normalized); Vector3 velocity = ((Vector3)(ref val)).normalized * 2.5f * ((BaseState)self).moveSpeedStat; ((BaseCharacterController)((EntityState)self).characterMotor).Motor.ForceUnground(0.1f); ((EntityState)self).characterMotor.velocity = velocity; } } 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/Base/Bandit2/Bandit2SerratedShivs.asset").WaitForCompletion(); val.baseRechargeInterval = Cooldown; val.baseMaxStock = Charges; val.rechargeStock = ChargesToRecharge; } } public class SmokeBomb : TweakBase<SmokeBomb> { public static float Cooldown; public static float CloakDur; public static float Damage; public static bool Ignite; public override string Name => ": Utility : Smoke Bomb"; public override string SkillToken => "utility"; public override string DescText => "<style=cIsDamage>Stunning</style>." + (Ignite ? " <style=cIsDamage>Ignite</style>." : "") + " Deal <style=cIsDamage>" + d(Damage) + " damage</style>, become <style=cIsUtility>invisible</style> for <style=cIsUtility>" + CloakDur + "</style> seconds, then deal <style=cIsDamage>" + d(Damage) + " damage</style> again."; public override void Init() { Cooldown = ConfigOption(8f, "Cooldown", "Vanilla is 6"); CloakDur = ConfigOption(3f, "Cloak Duration", "Vanilla is 3"); Damage = ConfigOption(2f, "Damage", "Decimal. Vanilla is 2"); Ignite = ConfigOption(value: true, "Ignite?", "Vanilla is false"); 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown StealthMode.OnEnter += new hook_OnEnter(StealthMode_OnEnter); if (Ignite) { StealthMode.FireSmokebomb += new Manipulator(StealthMode_FireSmokebomb); } Changes(); } private void StealthMode_FireSmokebomb(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); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 32) })) { int index = val.Index; val.Index = index + 1; val.EmitDelegate<Func<int, int>>((Func<int, int>)((int useless) => 160)); } else { Main.HBTLogger.LogError((object)"Failed to apply Smoke Bomb Ignite hook"); } } private void StealthMode_OnEnter(orig_OnEnter orig, StealthMode self) { StealthMode.duration = CloakDur; StealthMode.blastAttackDamageCoefficient = 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) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Bandit2/ThrowSmokebomb.asset").WaitForCompletion(); val.baseRechargeInterval = Cooldown; if (Ignite) { val.keywordTokens = new string[2] { "KEYWORD_STUNNING", "KEYWORD_IGNITE" }; } } } } namespace HIFUBanditTweaks.Misc { public class Achievements : MiscBase<Achievements> { public static Hook hook; public static int hemoRequirement; public override string Name => ": Misc : Achievements"; public override void Init() { hemoRequirement = ConfigOption(4, "Hemorrhage Required", "Vanilla is 20"); 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown Bandit2StackSuperBleedAchievement.LookUpRequiredBodyIndex += new hook_LookUpRequiredBodyIndex(Bandit2StackSuperBleedAchievement_LookUpRequiredBodyIndex); Bandit2RevolverFinaleServerAchievement.DoesDamageQualify += new hook_DoesDamageQualify(Bandit2RevolverFinaleServerAchievement_DoesDamageQualify); hook = new Hook((MethodBase)typeof(Bandit2ConsecutiveResetServerAchievement).GetMethod("OnCharacterDeathGlobal", BindingFlags.Instance | BindingFlags.NonPublic), typeof(Achievements).GetMethod("OnKillDamageTypeHook", BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic)); Changes(); } private static void OnKillDamageTypeHook(Bandit2ConsecutiveResetServerAchievement orig, DamageReport damageReport) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Invalid comparison between Unknown and I4 if (((Object)(object)damageReport.attackerBody == (Object)(object)orig.trackedBody && Object.op_Implicit((Object)(object)damageReport.attackerBody) && (int)DamageTypeCombo.op_Implicit(damageReport.damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)4)) == 4) || DamageAPI.HasModdedDamageType(damageReport.damageInfo, LightsOut.cooldownReset)) { orig.waitingForKill = false; orig.progress++; if (orig.progress >= Bandit2ConsecutiveResetAchievement.requirement) { ((BaseServerAchievement)orig).Grant(); } } } private bool Bandit2RevolverFinaleServerAchievement_DoesDamageQualify(orig_DoesDamageQualify orig, BaseServerAchievement self, DamageReport damageReport) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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) //IL_001d: Invalid comparison between Unknown and I4 //IL_0025: Unknown result type (might be due to invalid IL or missing references) return (int)DamageTypeCombo.op_Implicit(damageReport.damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)4)) == 4 || DamageAPI.HasModdedDamageType(damageReport.damageInfo, LightsOut.cooldownReset); } private BodyIndex Bandit2StackSuperBleedAchievement_LookUpRequiredBodyIndex(orig_LookUpRequiredBodyIndex orig, Bandit2StackSuperBleedAchievement self) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) Bandit2StackSuperBleedAchievement.requirement = hemoRequirement; return orig.Invoke(self); } private void Changes() { LanguageAPI.Add("ACHIEVEMENT_BANDIT2STACKSUPERBLEED_DESCRIPTION", "As Bandit, kill a monster with " + hemoRequirement + " stacks of Hemorrhage."); } } public class Hemorrhage : MiscBase<Hemorrhage> { public static float Interval; public static float DamagePerTick; public static float TotalDuration; public override string Name => ": Secondary ::: Hemorrhage"; public override void Init() { Interval = ConfigOption(0.25f, "Tick Interval", "Decimal. Vanilla is 0.25"); DamagePerTick = ConfigOption(1f, "Tick Damage", "Vanilla is 0.333"); TotalDuration = ConfigOption(4f, "Total Duration", "Vanilla is 15"); 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 DotController.InitDotCatalog += new hook_InitDotCatalog(DotController_InitDotCatalog1); GlobalEventManager.ProcessHitEnemy += new Manipulator(GlobalEventManager_ProcessHitEnemy); GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt; Changes(); } private void GlobalEventManager_ProcessHitEnemy(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); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 6), (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 15f) })) { val.Index += 1; val.Next.Operand = TotalDuration; } else { Main.HBTLogger.LogError((object)"Failed to apply Hemorrhage Total Duration hook"); } } private void GlobalEventManager_onServerDamageDealt(DamageReport dr) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Invalid comparison between Unknown and I4 DamageInfo damageInfo = dr.damageInfo; if (damageInfo == null) { return; } GameObject attacker = damageInfo.attacker; if (!((Object)(object)attacker == (Object)null)) { CharacterBody component = attacker.GetComponent<CharacterBody>(); if ((Object)(object)component != (Object)null && damageInfo.crit && damageInfo.procCoefficient == 0f && (int)DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)134217728)) > 0) { DotController.InflictDot(((Component)dr.victim).gameObject, damageInfo.attacker, (DotIndex)6, TotalDuration, 1f, (uint?)uint.MaxValue); } } } private void DotController_InitDotCatalog1(orig_InitDotCatalog orig) { orig.Invoke(); DotController.dotDefs[6].interval = Interval; DotController.dotDefs[6].damageCoefficient = DamagePerTick; } private void Changes() { LanguageAPI.Add("KEYWORD_SUPERBLEED", "<style=cKeywordName>Hemorrhage</style><style=cSub>Deal <style=cIsDamage>" + d(DamagePerTick / Interval * TotalDuration + TotalDuration * DamagePerTick) + "</style> base damage over " + TotalDuration + "s. <i>Hemorrhage can stack.</i></style>"); } } public class Reload : MiscBase<Reload> { public static float ReloadDur; public override string Name => ": Primary ::: Reload"; public override void Init() { ReloadDur = ConfigOption(0.3f, "Reload Duration", "Vanilla is 0.3"); 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 EnterReload.OnEnter += new hook_OnEnter(EnterReload_OnEnter); Reload.OnEnter += new hook_OnEnter(Reload_OnEnter); } private void Reload_OnEnter(orig_OnEnter orig, Reload self) { Reload.baseDuration = ReloadDur; orig.Invoke(self); } private void EnterReload_OnEnter(orig_OnEnter orig, EnterReload self) { EnterReload.baseDuration = ReloadDur; orig.Invoke(self); } } }