Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of HIFURailgunnerTweaks v1.0.9
HIFURailgunnerTweaks.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.Railgunner.Backpack; using EntityStates.Railgunner.Reload; using EntityStates.Railgunner.Scope; using EntityStates.Railgunner.Weapon; using HIFURailgunnerTweaks.Misc; using HarmonyLib; using Microsoft.CodeAnalysis; using On.EntityStates.Railgunner.Backpack; using On.EntityStates.Railgunner.Reload; using On.EntityStates.Railgunner.Scope; using On.EntityStates.Railgunner.Weapon; using On.RoR2; using R2API; using RoR2; using RoR2.Projectile; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("HIFURailgunnerTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HIFURailgunnerTweaks")] [assembly: AssemblyTitle("HIFURailgunnerTweaks")] [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 HIFURailgunnerTweaks { 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.HIFURailgunnerTweaks", "HIFURailgunnerTweaks", "1.0.8")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.HIFURailgunnerTweaks"; public const string PluginAuthor = "HIFU"; public const string PluginName = "HIFURailgunnerTweaks"; public const string PluginVersion = "1.0.8"; public static ConfigFile HRGTConfig; public static ConfigFile HRGTBackupConfig; public static ManualLogSource HRGTLogger; 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 HRGTLogger = ((BaseUnityPlugin)this).Logger; HRGTConfig = ((BaseUnityPlugin)this).Config; HRGTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFURailgunnerTweaks.Backup.cfg", true); HRGTBackupConfig.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 = HRGTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFURailgunnerTweaks from syncing config whenever a new version is found."); _preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HRGTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version"); latestVersion = HRGTConfig.Bind<string>("Config", "Latest Version", "1.0.8", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.0.8")) { latestVersion.Value = "1.0.8"; ConfigManager.VersionChanged = true; HRGTLogger.LogInfo((object)"Config Autosync Enabled."); } IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(MiscBase)) select type; HRGTLogger.LogInfo((object)"==+----------------==MISC==----------------+=="); foreach (Type item in enumerable) { MiscBase miscBase = (MiscBase)Activator.CreateInstance(item); if (ValidateMisc(miscBase)) { miscBase.Init(); } } IEnumerable<Type> enumerable2 = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase)) select type; HRGTLogger.LogInfo((object)"==+----------------==TWEAKS==----------------+=="); foreach (Type item2 in enumerable2) { TweakBase tweakBase = (TweakBase)Activator.CreateInstance(item2); if (ValidateTweak(tweakBase)) { tweakBase.Init(); } } } 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.HRGTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HRGTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); Main.HRGTLogger.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.HRGTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HRGTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); string text = "RAILGUNNER_" + SkillToken.ToUpper() + "_DESCRIPTION"; LanguageAPI.Add(text, DescText); Main.HRGTLogger.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 HIFURailgunnerTweaks.Skills { public class ConcussionDevice : TweakBase { public static float SelfKnockback; public static int Charges; public static float Cooldown; public override string Name => ": Utility : Concussion Device"; public override string SkillToken => "utility"; public override string DescText => "Throw out a device that <style=cIsUtility>pushes</style> you and all nearby enemies away. Can hold up to " + Charges + "."; public override void Init() { SelfKnockback = ConfigOption(3200f, "Self Force", "Vanilla is 4000. Higher value is more knockback"); Charges = ConfigOption(2, "Charges", "Vanilla is 2"); Cooldown = ConfigOption(6f, "Cooldown", "Vanilla is 6"); 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 BaseFireMine.OnEnter += new hook_OnEnter(BaseFireMine_OnEnter); Changes(); } private void BaseFireMine_OnEnter(orig_OnEnter orig, BaseFireMine self) { if (self is FireMineConcussive) { self.force = SelfKnockback; } 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/Railgunner/RailgunnerBodyFireMineConcussive.asset").WaitForCompletion(); val.baseMaxStock = Charges; val.baseRechargeInterval = Cooldown; } } public class Cryocharge : TweakBase { public static float Damage; public static float CritDamage; public static float PiercingDamage; public static float ProcCoefficient; public static float Radius; public override string Name => ": Special :: Cryocharge"; public override string SkillToken => "special_alt"; public override string DescText => "<style=cIsUtility>Freezing</style>. Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>" + d(Damage) + "-" + d((Damage + ScopeAndReload.Damage) * CritDamage * 2f) + " damage</style>."; public override void Init() { Damage = ConfigOption(20f, "Damage", "Decimal. Vanilla is 20"); CritDamage = ConfigOption(1f, "Crit Damage Multiplier", "Decimal. Vanilla is 1"); PiercingDamage = ConfigOption(1f, "Pierce Damage Falloff", "Decimal. Vanilla is 1. Higher values mean less piercing damage falloff, so more damage overall."); ProcCoefficient = ConfigOption(1.5f, "Proc Coefficient", "Vanilla is 1.5"); Radius = ConfigOption(2f, "Radius", "Vanilla is 2"); 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 BaseFireSnipe.OnEnter += new hook_OnEnter(BaseFireSnipe_OnEnter); LanguageAPI.Add("RAILGUNNER_SNIPE_CRYO_DESCRIPTION", "<style=cIsUtility>Freezing</style>. Launch a super-cooled projectile for <style=cIsDamage>" + d(Damage) + " damage</style>."); } private void BaseFireSnipe_OnEnter(orig_OnEnter orig, BaseFireSnipe self) { if (self is FireSnipeCryo) { ((GenericBulletBaseState)self).damageCoefficient = Damage; self.piercingDamageCoefficientPerTarget = PiercingDamage; self.critDamageMultiplier = CritDamage; ((GenericBulletBaseState)self).procCoefficient = ProcCoefficient; ((GenericBulletBaseState)self).bulletRadius = Radius; } orig.Invoke(self); } } public class HH44Marksman : TweakBase { public static float Damage; public static float PiercingDamage; public static float AttackRate; public static float ZoomFOV; public override string Name => ": Secondary :: HH44 Marksman"; public override string SkillToken => "secondary_alt"; public override string DescText => "Activate your <style=cIsUtility>short-range scope</style>, highlighting <style=cIsDamage>Weak Points</style> and transforming your weapon into a quick <style=cIsDamage>" + d(Damage) + "-" + d(Damage * 2f) + " damage</style> railgun."; public override void Init() { Damage = ConfigOption(4f, "Damage", "Decimal. Vanilla is 4"); PiercingDamage = ConfigOption(0.5f, "Pierce Damage Falloff", "Decimal. Vanilla is 0.5. Higher values mean less piercing damage falloff, so more damage overall."); AttackRate = ConfigOption(2f, "Attacks Per Second", "Vanilla is 2"); ZoomFOV = ConfigOption(30f, "Zoom FOV", "Vanilla is 30. Lower value is more zoomed in"); 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 BaseFireSnipe.OnEnter += new hook_OnEnter(BaseFireSnipe_OnEnter); LanguageAPI.Add("RAILGUNNER_SNIPE_LIGHT_DESCRIPTION", "Launch a light projectile for <style=cIsDamage>" + d(Damage) + " damage</style>."); Changes(); } private void BaseFireSnipe_OnEnter(orig_OnEnter orig, BaseFireSnipe self) { if (self is FireSnipeLight) { ((GenericBulletBaseState)self).damageCoefficient = Damage; self.piercingDamageCoefficientPerTarget = PiercingDamage; self.selfKnockbackForce = 0f; ((GenericBulletBaseState)self).baseDuration = 1f / AttackRate; ((GenericBulletBaseState)self).recoilAmplitudeY = 0.6f; } 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) CharacterCameraParams val = Addressables.LoadAssetAsync<CharacterCameraParams>((object)"RoR2/DLC1/Railgunner/ccpRailgunnerScopeLight.asset").WaitForCompletion(); val.data.fov.value = ZoomFOV; } } public class M99Sniper : TweakBase { public static float Damage; public static float PiercingDamage; public static float ZoomFOV; public override string Name => ": Secondary : M99 Sniper"; public override string SkillToken => "secondary"; public override string DescText => "Activate your <style=cIsUtility>long-range scope</style>, highlighting <style=cIsDamage>Weak Points</style> and transforming your weapon into a piercing <style=cIsDamage>" + d(Damage) + "-" + d((Damage + ScopeAndReload.Damage) * 2f) + " damage</style> railgun."; public override void Init() { Damage = ConfigOption(6f, "Damage", "Decimal. Vanilla is 10"); PiercingDamage = ConfigOption(0.5f, "Pierce Damage Falloff", "Decimal. Vanilla is 0.5. Higher values mean less piercing damage falloff, so more damage overall."); ZoomFOV = ConfigOption(18f, "Zoom FOV", "Vanilla is 18. Lower value is more zoomed in"); 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 BaseFireSnipe.OnEnter += new hook_OnEnter(BaseFireSnipe_OnEnter); LanguageAPI.Add("RAILGUNNER_SNIPE_HEAVY_DESCRIPTION", "Launch a heavy projectile for <style=cIsDamage>" + d(Damage) + " damage</style>."); Changes(); } private void BaseFireSnipe_OnEnter(orig_OnEnter orig, BaseFireSnipe self) { if (self is FireSnipeHeavy) { ((GenericBulletBaseState)self).damageCoefficient = Damage; self.piercingDamageCoefficientPerTarget = PiercingDamage; self.selfKnockbackForce = 0f; ((GenericBulletBaseState)self).recoilAmplitudeY = 4f; } 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) CharacterCameraParams val = Addressables.LoadAssetAsync<CharacterCameraParams>((object)"RoR2/DLC1/Railgunner/ccpRailgunnerScopeHeavy.asset").WaitForCompletion(); val.data.fov.value = ZoomFOV; } } public class PolarFieldDevice : TweakBase { public static float SpeedBuffVal; public static float SpeedBuffDur; public static int Charges; public static float Cooldown; public static float Radius; public static BuffDef SpeedBuff; public override string Name => ": Utility :: Polar Field Device"; public override string SkillToken => "utility_alt"; public override string DescText => "Throw out a device that <style=cIsUtility>slows down</style> all nearby <style=cIsUtility>enemies and projectiles</style>." + ((SpeedBuffDur > 0f && SpeedBuffVal > 0f) ? (" <style=cIsUtility>Speeds up</style> allies by <style=cIsUtility>" + d(SpeedBuffVal) + "</style> in its radius.") : "") + ((Charges > 1) ? (" Can hold up to " + Charges + ".") : ""); public override void Init() { SpeedBuffVal = ConfigOption(0.3f, "Speed Buff", "Decimal. Vanilla is 0"); SpeedBuffDur = ConfigOption(2.5f, "Speed Buff Duration", "Vanilla is 0"); Charges = ConfigOption(1, "Charges", "Vanilla is 1"); Cooldown = ConfigOption(12f, "Cooldown", "Vanilla is 12"); Radius = ConfigOption(16f, "Radius", "Vanilla is 10"); base.Init(); } public override void Hooks() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown MakeBuff(); RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); Changes(); } private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && sender.GetBuffCount(SpeedBuff) > 0) { args.moveSpeedMultAdd += SpeedBuffVal; } } private void MakeBuff() { //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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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_008e: Unknown result type (might be due to invalid IL or missing references) Texture2D val = Addressables.LoadAssetAsync<Texture2D>((object)"RoR2/Base/Common/texMovespeedBuffIcon.tif").WaitForCompletion(); SpeedBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)SpeedBuff).name = "Polar Field Device Speed"; SpeedBuff.buffColor = Color32.op_Implicit(new Color32((byte)144, (byte)228, byte.MaxValue, (byte)225)); SpeedBuff.canStack = false; SpeedBuff.iconSprite = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0f, 0f)); SpeedBuff.isDebuff = false; ContentAddition.AddBuffDef(SpeedBuff); } 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_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireMineBlinding.asset").WaitForCompletion(); val.baseMaxStock = Charges; val.baseRechargeInterval = Cooldown; GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerMineAltDetonated.prefab").WaitForCompletion(); BuffWard component = val2.GetComponent<BuffWard>(); component.radius = Radius; BuffWard val3 = val2.AddComponent<BuffWard>(); val3.buffDuration = SpeedBuffDur; val3.buffDef = SpeedBuff; val3.radius = Radius; val3.expires = true; val3.invertTeamFilter = false; val3.expireDuration = 10f; val3.shape = (BuffWardShape)0; } } public class Supercharge : TweakBase { public static float Damage; public static float CritDamage; public static float PiercingDamage; public static float ProcCoefficient; public static float HopooBalance; public static float Radius; public override string Name => ": Special : Supercharge"; public override string SkillToken => "special"; public override string DescText => "Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>" + d(Damage) + "-" + d((Damage + ScopeAndReload.Damage) * CritDamage * 2f) + " damage</style>. Afterwards, <style=cIsHealth>all your weapons are disabled</style> for <style=cIsHealth>" + HopooBalance + "</style> seconds."; public override void Init() { Damage = ConfigOption(20f, "Damage", "Decimal. Vanilla is 40"); CritDamage = ConfigOption(2f, "Crit Damage Multiplier", "Decimal. Vanilla is 1.5"); PiercingDamage = ConfigOption(1f, "Pierce Damage Falloff", "Decimal. Vanilla is 1. Higher values mean less piercing damage falloff, so more damage overall."); ProcCoefficient = ConfigOption(1.5f, "Proc Coefficient", "Vanilla is 3"); HopooBalance = ConfigOption(5f, "Disable Duration", "Vanilla is 5"); Radius = ConfigOption(2f, "Radius", "Vanilla is 2"); 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 BaseFireSnipe.OnEnter += new hook_OnEnter(BaseFireSnipe_OnEnter); Offline.OnEnter += new hook_OnEnter(Offline_OnEnter); LanguageAPI.Add("RAILGUNNER_SNIPE_SUPER_DESCRIPTION", "Launch a super-charged projectile for <style=cIsDamage>" + d(Damage) + " damage</style>. Critical Strike damage is multiplied by <style=cIsDamage>1.5</style>."); } private void Offline_OnEnter(orig_OnEnter orig, Offline self) { self.baseDuration = 1f + HopooBalance; orig.Invoke(self); } private void BaseFireSnipe_OnEnter(orig_OnEnter orig, BaseFireSnipe self) { if (self is FireSnipeSuper) { ((GenericBulletBaseState)self).damageCoefficient = Damage; self.piercingDamageCoefficientPerTarget = PiercingDamage; self.critDamageMultiplier = CritDamage; ((GenericBulletBaseState)self).procCoefficient = ProcCoefficient; ((GenericBulletBaseState)self).recoilAmplitudeY = 7f; ((GenericBulletBaseState)self).bulletRadius = Radius; } orig.Invoke(self); } } public class XQRSmartRoundSystem : TweakBase { public static float LookCone; public static float Lifetime; public static float SelfForce; public override string Name => ": Primary : XQR Smart Round System"; public override string SkillToken => "primary"; public override string DescText => "Fire aggressive tracking rounds for <style=cIsDamage>100% damage</style>."; public override void Init() { LookCone = ConfigOption(25f, "Max Tracking Angle", "Vanilla is 90"); Lifetime = ConfigOption(0.7f, "Lifetime", "Vanilla is 0.4"); SelfForce = ConfigOption(150f, "Self Force", "Vanilla is 300. Higher value is more knockback"); 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 FirePistol.OnEnter += new hook_OnEnter(FirePistol_OnEnter); Changes(); } private void FirePistol_OnEnter(orig_OnEnter orig, FirePistol self) { self.baseInaccuracyDegrees = 0.4f; self.selfKnockbackForce = SelfForce; 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) GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerPistolProjectile.prefab").WaitForCompletion(); val.GetComponent<ProjectileSimple>().lifetime = Lifetime; val.GetComponent<ProjectileSteerTowardTarget>().rotationSpeed = 9999f; ProjectileDirectionalTargetFinder component = val.GetComponent<ProjectileDirectionalTargetFinder>(); component.lookCone = LookCone; component.targetSearchInterval = 0.05f; } } } namespace HIFURailgunnerTweaks.Misc { public class Hitboxes : MiscBase { public static float Size; public override string Name => ":: Misc :: Weakpoints"; public override void Init() { base.Init(); Size = ConfigOption(0.75f, "Size Percent", "Decimal. Vanilla is 1"); } 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 HurtBox.OnEnable += new hook_OnEnable(HurtBox_OnEnable); } private void HurtBox_OnEnable(orig_OnEnable orig, HurtBox self) { orig.Invoke(self); HurtBox.sniperTargetRadius = Size; } } public class ScopeAndReload : MiscBase { public static float Damage; public static float ReloadBarPercent; public static float ScopeDurUp; public static float ScopeDurDown; public static bool ScaleWithAS; public override string Name => ":: Misc : Scope and Active Reload"; public override void Init() { base.Init(); Damage = ConfigOption(5f, "Damage Bonus", "Decimal. Vanilla is 5"); ReloadBarPercent = ConfigOption(0.13f, "Reload Bar Duration", "Vanilla is 0.25. Formula: (Reload Bar Duration / 1.5) * 100 for actual percent"); ScopeDurUp = ConfigOption(0f, "Scope Duration Wind Up", "Vanilla is 0.1"); ScopeDurDown = ConfigOption(0f, "Scope Duration Wind Down", "Vanilla is 0.2"); ScaleWithAS = ConfigOption(value: false, "Scale Reload Bar Duration with Attack Speed?", "Vanilla is true"); } 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 //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown BaseWindUp.OnEnter += new hook_OnEnter(BaseWindUp_OnEnter); BaseWindDown.OnEnter += new hook_OnEnter(BaseWindDown_OnEnter); Boosted.OnEnter += new hook_OnEnter(Boosted_OnEnter); Reloading.OnEnter += new hook_OnEnter(Reloading_OnEnter); LanguageAPI.Add("RAILGUNNER_ACTIVE_RELOAD_DESCRIPTION", "Perfectly time your reload to recover faster and to boost the damage of your next shot by <style=cIsDamage>+" + d(Damage) + "</style>."); } private void Reloading_OnEnter(orig_OnEnter orig, Reloading self) { self.boostWindowDuration = ReloadBarPercent; orig.Invoke(self); if (!ScaleWithAS) { self.duration = self.boostWindowDelay + self.boostWindowDuration + (self.baseDuration - (self.boostWindowDelay + self.boostWindowDuration)); self.adjustedBoostWindowDelay = Mathf.Min(self.boostWindowDelay / self.baseDuration * self.duration, self.boostWindowDelay); self.adjustedBoostWindowDuration = Mathf.Max((self.boostWindowDelay + self.boostWindowDuration) / self.baseDuration * self.duration, self.boostWindowDelay + self.boostWindowDuration) - self.adjustedBoostWindowDelay; } } private void Boosted_OnEnter(orig_OnEnter orig, Boosted self) { self.bonusDamageCoefficient = Damage; orig.Invoke(self); } private void BaseWindDown_OnEnter(orig_OnEnter orig, BaseWindDown self) { self.baseDuration = ScopeDurUp; if (self is WindDownScopeHeavy || self is WindDownScopeLight) { self.baseDuration = ScopeDurDown; } orig.Invoke(self); } private void BaseWindUp_OnEnter(orig_OnEnter orig, BaseWindUp self) { self.baseDuration = ScopeDurUp; if (self is WindUpScopeHeavy || self is WindUpScopeLight) { self.baseDuration = ScopeDurUp; } orig.Invoke(self); } } }