Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of 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); } } }