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 RailgunnerRebloated v1.0.2
RailgunnerRebloated.dll
Decompiled 4 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using AncientScepter; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using EntityStates; using EntityStates.Railgunner.Backpack; using EntityStates.Railgunner.Reload; using EntityStates.Railgunner.Weapon; using IL.EntityStates.Railgunner.Backpack; using IL.EntityStates.Railgunner.Weapon; using IL.RoR2.Skills; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates.Railgunner.Backpack; using On.EntityStates.Railgunner.Reload; using On.EntityStates.Railgunner.Weapon; using On.RoR2; using On.RoR2.Skills; using R2API; using R2API.Utils; using RailgunnerRebloated.Components; using RoR2; using RoR2.HudOverlay; using RoR2.Projectile; using RoR2.Skills; using RoR2.UI; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.UI; [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RailgunnerRebloated")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyProduct("RailgunnerRebloated")] [assembly: AssemblyTitle("RailgunnerRebloated")] [assembly: AssemblyInformationalVersion("1.0.0+123283f404a746ea4a4b9d1e3d657a173f6d1eea")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [Microsoft.CodeAnalysis.Embedded] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [CompilerGenerated] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace RailgunnerRebloated { internal static class LanguageTokens { public const string ChargeKeywordToken = "KEYWORD_RAILGUNNERREBLOATED_CHARGE"; public const string PrimaryDescToken = "RAILGUNNER_PRIMARY_DESCRIPTION_RAILGUNNERREBLOATED"; public const string ScopeHeavyDescToken = "RAILGUNNER_SECONDARY_DESCRIPTION_RAILGUNNERREBLOATED"; public const string ScopeLightDescToken = "RAILGUNNER_SECONDARY_ALT_DESCRIPTION_RAILGUNNERREBLOATED"; public const string SnipeHeavyDescToken = "RAILGUNNER_SNIPE_HEAVY_DESCRIPTION_RAILGUNNERREBLOATED"; public const string SnipeLightDescToken = "RAILGUNNER_SNIPE_LIGHT_DESCRIPTION_RAILGUNNERREBLOATED"; public const string SpecialDescToken = "RAILGUNNER_SPECIAL_ALT_DESCRIPTION_RAILGUNNERREBLOATED"; public const string SuperchargeDescToken = "RAILGUNNER_SNIPE_CRYO_DESCRIPTION_RAILGUNNERREBLOATED"; public const string SpecialAltDescToken = "RAILGUNNER_SPECIAL_DESCRIPTION_RAILGUNNERREBLOATED"; public const string CryochargeDescToken = "RAILGUNNER_SNIPE_SUPER_DESCRIPTION_RAILGUNNERREBLOATED"; public const string SpecialScepterDescToken = "RAILGUNNER_SPECIAL_SCEPTER_DESCRIPTION_RAILGUNNERREBLOATED"; public const string SpecialAltScepterDescToken = "RAILGUNNER_SPECIAL_SCEPTER_ALT_DESCRIPTION_RAILGUNNERREBLOATED"; internal static void Init() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Language.GetLocalizedStringByToken += new hook_GetLocalizedStringByToken(Language_GetLocalizedStringByToken); LanguageAPI.Add("KEYWORD_RAILGUNNERREBLOATED_CHARGE", "<style=cKeywordName>X% Charge</style><style=cSub>The skill draws from a shared Charge pool. Once Charge is depleted, <style=cIsHealth>all your weapons are disabled</style> for <style=cIsHealth>5</style> seconds."); LanguageAPI.Add("RAILGUNNER_PRIMARY_DESCRIPTION_RAILGUNNERREBLOATED", "Fire aggressive tracking rounds that deal <style=cIsDamage>100% damage</style> and restore <style=cIsUtility>Charge</style> on hit."); LanguageAPI.Add("RAILGUNNER_SECONDARY_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>18% Charge</style>. Activate your <style=cIsUtility>long-range scope</style>, highlighting <style=cIsDamage>Weak Points</style> and transforming your weapon into a piercing <style=cIsDamage>900% damage</style> railgun."); LanguageAPI.Add("RAILGUNNER_SNIPE_HEAVY_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>18% Charge</style>. Launch a heavy projectile for <style=cIsDamage>900% damage</style>."); LanguageAPI.Add("RAILGUNNER_SECONDARY_ALT_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>9% Charge</style>. Activate your <style=cIsUtility>short-range scope</style>, highlighting <style=cIsDamage>Weak Points</style> and transforming your weapon into a quick <style=cIsDamage>500% damage</style> railgun."); LanguageAPI.Add("RAILGUNNER_SNIPE_LIGHT_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>9% Charge</style>. Launch a light projectile for <style=cIsDamage>500% damage</style>."); LanguageAPI.Add("RAILGUNNER_SPECIAL_ALT_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>100% Charge</style>. Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>2000%-6000% damage</style> based on <style=cIsUtility>Charge</style> consumed. Afterwards, <style=cIsHealth>all your weapons are disabled</style> for <style=cIsHealth>5</style> seconds."); LanguageAPI.Add("RAILGUNNER_SNIPE_CRYO_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>100% Charge</style>. Launch a super-charged projectile for <style=cIsDamage>2000%-6000% damage</style> based on <style=cIsUtility>Charge</style> consumed."); LanguageAPI.Add("RAILGUNNER_SPECIAL_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>40% Charge</style>. <style=cIsUtility>Freezing</style>. Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>3000% damage</style>."); LanguageAPI.Add("RAILGUNNER_SNIPE_SUPER_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>40% Charge</style>. <style=cIsUtility>Freezing</style>. Launch a super-cooled projectile for <style=cIsDamage>3000% damage</style>."); LanguageAPI.Add("RAILGUNNER_SPECIAL_SCEPTER_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>100% Charge</style>. Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>4000%-12000% damage</style> based on <style=cIsUtility>Charge</style> consumed. Afterwards, <style=cIsHealth>all your weapons are disabled</style> for <style=cIsHealth>5</style> seconds."); LanguageAPI.Add("RAILGUNNER_SPECIAL_SCEPTER_ALT_DESCRIPTION_RAILGUNNERREBLOATED", "<style=cIsHealth>40% Charge</style>. <style=cIsUtility>Freezing</style>. Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>6000% damage</style>."); } private static string Language_GetLocalizedStringByToken(orig_GetLocalizedStringByToken orig, Language self, string token) { string text = orig.Invoke(self, token); if (text != token) { switch (token) { case "RAILGUNNER_SECONDARY_ALT_DESCRIPTION": case "RAILGUNNER_SNIPE_LIGHT_DESCRIPTION": text = text.Replace("400", "600"); break; case "KEYWORD_ACTIVERELOAD": text = text.Replace("500", "300"); break; } } return text; } } internal class PluginUtils { internal static bool scepterLoaded; internal static ItemIndex ScepterIndex = (ItemIndex)(-1); internal static void SetAddressableEntityStateField(string fullEntityStatePath, string fieldName, string value) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) string fieldName2 = fieldName; string value2 = value; AsyncOperationHandle<EntityStateConfiguration> val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)fullEntityStatePath); val.Completed += delegate(AsyncOperationHandle<EntityStateConfiguration> handle) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) SetAddressableEntityStateField_String_Completed(handle, fieldName2, value2); }; } private static void SetAddressableEntityStateField_String_Completed(AsyncOperationHandle<EntityStateConfiguration> handle, string fieldName, string value) { EntityStateConfiguration result = handle.Result; for (int i = 0; i < result.serializedFieldsCollection.serializedFields.Length; i++) { if (result.serializedFieldsCollection.serializedFields[i].fieldName == fieldName) { result.serializedFieldsCollection.serializedFields[i].fieldValue.stringValue = value; return; } } Debug.LogError((object)("RailgunnerRebloated: " + ((object)result)?.ToString() + " does not have field " + fieldName)); } internal static void SetAddressableEntityStateField(string fullEntityStatePath, string fieldName, Object newObject) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) string fieldName2 = fieldName; Object newObject2 = newObject; AsyncOperationHandle<EntityStateConfiguration> val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)fullEntityStatePath); val.Completed += delegate(AsyncOperationHandle<EntityStateConfiguration> handle) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) SetAddressableEntityStateField_Object_Completed(handle, fieldName2, newObject2); }; } private static void SetAddressableEntityStateField_Object_Completed(AsyncOperationHandle<EntityStateConfiguration> handle, string fieldName, Object newObject) { EntityStateConfiguration result = handle.Result; for (int i = 0; i < result.serializedFieldsCollection.serializedFields.Length; i++) { if (result.serializedFieldsCollection.serializedFields[i].fieldName == fieldName) { result.serializedFieldsCollection.serializedFields[i].fieldValue.objectValue = newObject; return; } } Debug.LogError((object)("RailgunnerRebloated: " + ((object)result)?.ToString() + " does not have field " + fieldName)); } internal static void AddChargeKeywordToStart(SkillDef skillDef) { List<string> list = new List<string> { "KEYWORD_RAILGUNNERREBLOATED_CHARGE" }; if (skillDef.keywordTokens != null) { list.AddRange(skillDef.keywordTokens); } skillDef.keywordTokens = list.ToArray(); } internal static void RegisterScepterSkill(SkillDef skill, SkillDef orig) { if (scepterLoaded) { RegisterScepterSkillInternal(skill, orig); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void RegisterScepterSkillInternal(SkillDef skill, SkillDef orig) { if (skill.skillNameToken == "ANCIENTSCEPTER_RAILGUNNER_SNIPESUPERNAME") { skill.icon = SpriteAssets.RailgunnerSupercharge2; } else if (skill.skillNameToken == "ANCIENTSCEPTER_RAILGUNNER_SNIPECRYONAME") { skill.icon = SpriteAssets.RailgunnerCryocharge2; } ItemBase<AncientScepterItem>.instance.RegisterScepterSkill(skill, "RailgunnerBody", orig); } } [BepInPlugin("com.Moffein.RailgunnerRebloated", "RailgunnerRebloated", "1.0.2")] [NetworkCompatibility(/*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.*/)] public class RailgunnerRebloatedPlugin : BaseUnityPlugin { public static ConfigEntry<bool> scaleOfflineAttackSpeed; public static ModdedDamageType RestoreChargeOnHit; private void ReadConfig() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_002c: Expected O, but got Unknown scaleOfflineAttackSpeed = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Charge Mechanics", "Offline Attack Speed Scaling"), false, new ConfigDescription("When out of Charge, the skill-disable state ends faster with more attack speed. If false, scales with Cooldown instead.", (AcceptableValueBase)null, Array.Empty<object>())); } internal void Awake() { PluginUtils.scepterLoaded = Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter"); ReadConfig(); LanguageTokens.Init(); AddPassiveComponent(); ModifyPrimary(); ModifySnipeHeavy(); ModifySnipeLight(); ModifySupercharge(); ModifyCryocharge(); if (PluginUtils.scepterLoaded) { SetupSuperchargeScepter(); SetupCryochargeScepter(); } RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(OnLoadActions)); } private void OnLoadActions() { //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) PluginUtils.ScepterIndex = ItemCatalog.FindItemIndex("ITEM_ANCIENT_SCEPTER"); } private void AddPassiveComponent() { //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_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Expected O, but got Unknown //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Expected O, but got Unknown //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerBody.prefab").WaitForCompletion(); RailgunnerBatteryController railgunnerBatteryController = val.AddComponent<RailgunnerBatteryController>(); railgunnerBatteryController.overlayPrefab = BuildOverlay(); PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Backpack.OnlineCryo.asset", "cooldownParamName", ""); PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Backpack.OnlineSuper.asset", "cooldownParamName", ""); Offline.OnEnter += new hook_OnEnter(Offline_OnEnter); Offline.OnExit += new hook_OnExit(Offline_OnExit); if (!scaleOfflineAttackSpeed.Value) { Offline.OnEnter += new Manipulator(Offline_RemoveAttackSpeedScaling); } RailgunSkillDef.OnFixedUpdate += new Manipulator(RailgunSkillDef_DisableVanillaOfflineCooldown); RailgunSkillDef.OnFixedUpdate += new hook_OnFixedUpdate(RailgunSkillDef_OnFixedUpdate); Reloading.FixedUpdate += new hook_FixedUpdate(Reloading_FixedUpdate); BaseCharged.FixedUpdate += new hook_FixedUpdate(BaseCharged_FixedUpdate); SkillLocator.DeductCooldownFromAllSkillsAuthority += new hook_DeductCooldownFromAllSkillsAuthority(SkillLocator_DeductCooldownFromAllSkillsAuthority); SkillLocator.ApplyAmmoPack += new hook_ApplyAmmoPack(SkillLocator_ApplyAmmoPack); BaseCharging.OnEnter += new hook_OnEnter(BaseCharging_OnEnter); BaseCharging.OnExit += new hook_OnExit(BaseCharging_OnExit); BaseCharged.OnEnter += new hook_OnEnter(BaseCharged_OnEnter); BaseCharged.OnExit += new hook_OnExit(BaseCharged_OnExit); } private GameObject BuildOverlay() { //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 = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerOverchargeUI.prefab").WaitForCompletion(), "RailgunnerRebloatedUI", false); Transform val2 = val.transform.Find("BarContainer/SoftGlow/Text, Normal"); ((Component)val2).gameObject.SetActive(false); Transform val3 = val.transform.Find("BarContainer/Inner/SpinnySquare"); ((Component)val3).gameObject.SetActive(false); return val; } private void ModifyPrimary() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerCrosshair.prefab").WaitForCompletion(); CrosshairController component = val.GetComponent<CrosshairController>(); for (int i = 0; i < component.skillStockSpriteDisplays.Length; i++) { component.skillStockSpriteDisplays[i].target.transform.localScale = Vector3.zero; component.skillStockSpriteDisplays[i].target.SetActive(false); } component.skillStockSpriteDisplays = (SkillStockSpriteDisplay[])(object)new SkillStockSpriteDisplay[0]; RestoreChargeOnHit = DamageAPI.ReserveDamageType(); GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt; FirePistol.FireBullet += new Manipulator(FirePistol_FireBullet); RailgunSkillDef val2 = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFirePistol.asset").WaitForCompletion(); ((SkillDef)val2).skillDescriptionToken = "RAILGUNNER_PRIMARY_DESCRIPTION_RAILGUNNERREBLOATED"; PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val2); } private void GlobalEventManager_onServerDamageDealt(DamageReport damageReport) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)damageReport.attackerBody) && damageReport.attackerBodyIndex == BodyPrefabs.RailgunnerBody.bodyIndex && DamageAPI.HasModdedDamageType(damageReport.damageInfo, RestoreChargeOnHit)) { RailgunnerBatteryController component = ((Component)damageReport.attackerBody).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.AddChargeServer(0.0115f); } } } private void ModifySnipeHeavy() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_0084: Unknown result type (might be due to invalid IL or missing references) PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeHeavy.asset", "bulletRadius", "1"); PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeHeavy.asset", "damageCoefficient", "9"); PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeHeavy.asset", "piercingDamageCoefficientPerTarget", "1"); PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Reload.Boosted.asset", "bonusDamageCoefficient", "3"); FireSnipeHeavy.ModifyBullet += new hook_ModifyBullet(FireSnipeHeavy_ModifyBullet); RailgunSkillDef val = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyScopeHeavy.asset").WaitForCompletion(); RailgunSkillDef val2 = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireSnipeHeavy.asset").WaitForCompletion(); ((SkillDef)val2).skillDescriptionToken = "RAILGUNNER_SNIPE_HEAVY_DESCRIPTION_RAILGUNNERREBLOATED"; ((SkillDef)val).skillDescriptionToken = "RAILGUNNER_SECONDARY_DESCRIPTION_RAILGUNNERREBLOATED"; PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val); PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val2); } private void ModifySnipeLight() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeLight.asset", "damageCoefficient", "5"); FireSnipeLight.ModifyBullet += new hook_ModifyBullet(FireSnipeLight_ModifyBullet); RailgunSkillDef val = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyScopeLight.asset").WaitForCompletion(); RailgunSkillDef val2 = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireSnipeLight.asset").WaitForCompletion(); ((SkillDef)val).skillDescriptionToken = "RAILGUNNER_SECONDARY_ALT_DESCRIPTION_RAILGUNNERREBLOATED"; ((SkillDef)val2).skillDescriptionToken = "RAILGUNNER_SNIPE_LIGHT_DESCRIPTION_RAILGUNNERREBLOATED"; PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val); PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val2); } private void ModifySupercharge() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) FireSnipeSuper.ModifyBullet += new hook_ModifyBullet(FireSnipeSuper_ModifyBullet); PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeSuper.asset", "critDamageMultiplier", "1"); PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeSuper.asset", "procCoefficient", "1.5"); BaseCharging.FixedUpdate += new Manipulator(BaseCharging_FixedUpdate); BaseCharged.OnOverlayInstanceAdded += new hook_OnOverlayInstanceAdded(BaseCharged_OnOverlayInstanceAdded); RailgunSkillDef val = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyChargeSnipeSuper.asset").WaitForCompletion(); RailgunSkillDef val2 = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireSnipeSuper.asset").WaitForCompletion(); ((SkillDef)val).skillDescriptionToken = "RAILGUNNER_SPECIAL_ALT_DESCRIPTION_RAILGUNNERREBLOATED"; ((SkillDef)val).beginSkillCooldownOnSkillEnd = true; ((SkillDef)val2).skillDescriptionToken = "RAILGUNNER_SNIPE_CRYO_DESCRIPTION_RAILGUNNERREBLOATED"; PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val); PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val2); } private void ModifyCryocharge() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) PluginUtils.SetAddressableEntityStateField("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeCryo.asset", "damageCoefficient", "30"); FireSnipeCryo.ModifyBullet += new hook_ModifyBullet(FireSnipeCryo_ModifyBullet); RailgunSkillDef val = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyChargeSnipeCryo.asset").WaitForCompletion(); RailgunSkillDef val2 = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireSnipeCryo.asset").WaitForCompletion(); ((SkillDef)val).skillDescriptionToken = "RAILGUNNER_SPECIAL_DESCRIPTION_RAILGUNNERREBLOATED"; ((SkillDef)val).beginSkillCooldownOnSkillEnd = true; ((SkillDef)val2).skillDescriptionToken = "RAILGUNNER_SNIPE_SUPER_DESCRIPTION_RAILGUNNERREBLOATED"; PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val); PluginUtils.AddChargeKeywordToStart((SkillDef)(object)val2); } private void SetupSuperchargeScepter() { //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_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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) RailgunSkillDef val = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyChargeSnipeSuper.asset").WaitForCompletion(); RailgunSkillDef val2 = ScriptableObject.CreateInstance<RailgunSkillDef>(); ((SkillDef)val2).skillNameToken = "ANCIENTSCEPTER_RAILGUNNER_SNIPESUPERNAME"; ((SkillDef)val2).skillDescriptionToken = "RAILGUNNER_SPECIAL_SCEPTER_DESCRIPTION_RAILGUNNERREBLOATED"; ((SkillDef)val2).icon = null; ((SkillDef)val2).baseRechargeInterval = ((SkillDef)val).baseRechargeInterval; ((SkillDef)val2).beginSkillCooldownOnSkillEnd = ((SkillDef)val).beginSkillCooldownOnSkillEnd; ((SkillDef)val2).baseMaxStock = ((SkillDef)val).baseMaxStock; ((SkillDef)val2).activationState = ((SkillDef)val).activationState; ((SkillDef)val2).activationStateMachineName = ((SkillDef)val).activationStateMachineName; ((SkillDef)val2).attackSpeedBuffsRestockSpeed = ((SkillDef)val).attackSpeedBuffsRestockSpeed; ((SkillDef)val2).attackSpeedBuffsRestockSpeed_Multiplier = ((SkillDef)val).attackSpeedBuffsRestockSpeed_Multiplier; ((SkillDef)val2).autoHandleLuminousShot = ((SkillDef)val).autoHandleLuminousShot; ((SkillDef)val2).cancelSprintingOnActivation = ((SkillDef)val).cancelSprintingOnActivation; ((SkillDef)val2).canceledFromSprinting = ((SkillDef)val).canceledFromSprinting; ((SkillDef)val2).dontAllowPastMaxStocks = ((SkillDef)val).dontAllowPastMaxStocks; ((SkillDef)val2).forceSprintDuringState = ((SkillDef)val).forceSprintDuringState; ((SkillDef)val2).fullRestockOnAssign = ((SkillDef)val).forceSprintDuringState; ((SkillDef)val2).hideCooldown = ((SkillDef)val).hideCooldown; ((SkillDef)val2).hideStockCount = ((SkillDef)val).hideStockCount; ((SkillDef)val2).interruptPriority = ((SkillDef)val).interruptPriority; ((SkillDef)val2).isCombatSkill = ((SkillDef)val).isCombatSkill; ((SkillDef)val2).isCooldownBlockedUntilManuallyReset = ((SkillDef)val).isCooldownBlockedUntilManuallyReset; ((SkillDef)val2).keywordTokens = ((SkillDef)val).keywordTokens; ((SkillDef)val2).mustKeyPress = ((SkillDef)val).mustKeyPress; ((SkillDef)val2).rechargeStock = ((SkillDef)val).rechargeStock; ((SkillDef)val2).requiredStock = ((SkillDef)val).requiredStock; ((SkillDef)val2).resetCooldownTimerOnUse = ((SkillDef)val).resetCooldownTimerOnUse; ((SkillDef)val2).skillName = ((SkillDef)val).skillName + "RebloatedScepter"; ((SkillDef)val2).stockToConsume = ((SkillDef)val).stockToConsume; ((SkillDef)val2).suppressSkillActivation = ((SkillDef)val).suppressSkillActivation; ((SkillDef)val2).triggeredByPressRelease = ((SkillDef)val).triggeredByPressRelease; val2.restockOnReload = val.restockOnReload; val2.offlineIcon = val.offlineIcon; PluginUtils.RegisterScepterSkill((SkillDef)(object)val2, (SkillDef)(object)val); } private void SetupCryochargeScepter() { //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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) RailgunSkillDef val = Addressables.LoadAssetAsync<RailgunSkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyChargeSnipeCryo.asset").WaitForCompletion(); RailgunSkillDef val2 = ScriptableObject.CreateInstance<RailgunSkillDef>(); ((SkillDef)val2).skillNameToken = "ANCIENTSCEPTER_RAILGUNNER_SNIPECRYONAME"; ((SkillDef)val2).skillDescriptionToken = "RAILGUNNER_SPECIAL_SCEPTER_ALT_DESCRIPTION_RAILGUNNERREBLOATED"; ((SkillDef)val2).icon = null; ((SkillDef)val2).baseRechargeInterval = ((SkillDef)val).baseRechargeInterval; ((SkillDef)val2).beginSkillCooldownOnSkillEnd = ((SkillDef)val).beginSkillCooldownOnSkillEnd; ((SkillDef)val2).baseMaxStock = ((SkillDef)val).baseMaxStock; ((SkillDef)val2).activationState = ((SkillDef)val).activationState; ((SkillDef)val2).activationStateMachineName = ((SkillDef)val).activationStateMachineName; ((SkillDef)val2).attackSpeedBuffsRestockSpeed = ((SkillDef)val).attackSpeedBuffsRestockSpeed; ((SkillDef)val2).attackSpeedBuffsRestockSpeed_Multiplier = ((SkillDef)val).attackSpeedBuffsRestockSpeed_Multiplier; ((SkillDef)val2).autoHandleLuminousShot = ((SkillDef)val).autoHandleLuminousShot; ((SkillDef)val2).cancelSprintingOnActivation = ((SkillDef)val).cancelSprintingOnActivation; ((SkillDef)val2).canceledFromSprinting = ((SkillDef)val).canceledFromSprinting; ((SkillDef)val2).dontAllowPastMaxStocks = ((SkillDef)val).dontAllowPastMaxStocks; ((SkillDef)val2).forceSprintDuringState = ((SkillDef)val).forceSprintDuringState; ((SkillDef)val2).fullRestockOnAssign = ((SkillDef)val).forceSprintDuringState; ((SkillDef)val2).hideCooldown = ((SkillDef)val).hideCooldown; ((SkillDef)val2).hideStockCount = ((SkillDef)val).hideStockCount; ((SkillDef)val2).interruptPriority = ((SkillDef)val).interruptPriority; ((SkillDef)val2).isCombatSkill = ((SkillDef)val).isCombatSkill; ((SkillDef)val2).isCooldownBlockedUntilManuallyReset = ((SkillDef)val).isCooldownBlockedUntilManuallyReset; ((SkillDef)val2).keywordTokens = ((SkillDef)val).keywordTokens; ((SkillDef)val2).mustKeyPress = ((SkillDef)val).mustKeyPress; ((SkillDef)val2).rechargeStock = ((SkillDef)val).rechargeStock; ((SkillDef)val2).requiredStock = ((SkillDef)val).requiredStock; ((SkillDef)val2).resetCooldownTimerOnUse = ((SkillDef)val).resetCooldownTimerOnUse; ((SkillDef)val2).skillName = ((SkillDef)val).skillName + "RebloatedScepter"; ((SkillDef)val2).stockToConsume = ((SkillDef)val).stockToConsume; ((SkillDef)val2).suppressSkillActivation = ((SkillDef)val).suppressSkillActivation; ((SkillDef)val2).triggeredByPressRelease = ((SkillDef)val).triggeredByPressRelease; val2.restockOnReload = val.restockOnReload; val2.offlineIcon = val.offlineIcon; PluginUtils.RegisterScepterSkill((SkillDef)(object)val2, (SkillDef)(object)val); } private void FirePistol_FireBullet(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(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<ProjectileManager>(x, "FireProjectile") })) { val.EmitDelegate<Func<FireProjectileInfo, FireProjectileInfo>>((Func<FireProjectileInfo, FireProjectileInfo>)delegate(FireProjectileInfo info) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (info.damageTypeOverride.HasValue) { DamageTypeCombo value = info.damageTypeOverride.Value; DamageAPI.AddModdedDamageType(ref value, RestoreChargeOnHit); info.damageTypeOverride = value; } return info; }); } else { Debug.LogError((object)"RailgunnerRebloated: FirePistol IL hook failed."); } } private void BaseCharging_FixedUpdate(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<ImageFillController>(x, "SetTValue") })) { val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Func<float, BaseCharging, float>>((Func<float, BaseCharging, float>)delegate(float tVal, BaseCharging self) { RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.SetRechargeDelay(); float storedCharge = component.GetStoredCharge(); float num = Mathf.Max(0f, storedCharge - component.GetStoredChargeToConsume()); float num2 = Mathf.Min(1f, ((EntityState)self).fixedAge / self.duration); return Mathf.Lerp(storedCharge, num, num2); } return tVal; }); } else { Debug.LogError((object)"RailgunnerRebloated: BaseCharging SetTValue IL hook failed."); } } private void SkillLocator_ApplyAmmoPack(orig_ApplyAmmoPack orig, SkillLocator self) { orig.Invoke(self); RailgunnerBatteryController component = ((Component)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.AddCharge(1f); } } private void BaseCharged_OnOverlayInstanceAdded(orig_OnOverlayInstanceAdded orig, BaseCharged self, OverlayController controller, GameObject instance) { orig.Invoke(self, controller, instance); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (!Object.op_Implicit((Object)(object)component)) { return; } float fillAmount = component.GetStoredChargeToConsume(); if (!Object.op_Implicit((Object)(object)instance)) { return; } Transform val = instance.transform.Find("BarContainer/Inner/FillBarDimensions/FillBar"); if (Object.op_Implicit((Object)(object)val)) { Image component2 = ((Component)val).GetComponent<Image>(); if (Object.op_Implicit((Object)(object)component2)) { if (Object.op_Implicit((Object)(object)((EntityState)self).skillLocator) && Object.op_Implicit((Object)(object)((EntityState)self).skillLocator.special) && Object.op_Implicit((Object)(object)((EntityState)self).skillLocator.special.baseSkill) && RailgunnerBatteryController.RailgunnerSpecialChargeDisplayOverrides.TryGetValue(((EntityState)self).skillLocator.special.baseSkill, out var value)) { fillAmount = value; } component2.fillAmount = fillAmount; } } else { Debug.LogError((object)"RailgunnerRebloated: BaseCharged_OnOverlayInstanceAdded could not find target FillBar."); } } private void FireSnipeSuper_ModifyBullet(orig_ModifyBullet orig, FireSnipeSuper self, BulletAttack bulletAttack) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Invalid comparison between Unknown and I4 //IL_0077: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, bulletAttack); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { float storedCharge = component.GetStoredCharge(); float num = Mathf.Lerp(20f, 60f, storedCharge); bulletAttack.damage = ((BaseState)self).damageStat * num; if ((int)PluginUtils.ScepterIndex != -1 && Object.op_Implicit((Object)(object)((EntityState)self).characterBody) && Object.op_Implicit((Object)(object)((EntityState)self).characterBody.inventory) && ((EntityState)self).characterBody.inventory.GetItemCountEffective(PluginUtils.ScepterIndex) > 0) { bulletAttack.damage *= 2f; bulletAttack.procCoefficient *= 2f; bulletAttack.radius *= 1.5f; } } } private void BaseCharging_OnEnter(orig_OnEnter orig, BaseCharging self) { orig.Invoke(self); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { float chargeToConsume = 1f; if (Object.op_Implicit((Object)(object)((EntityState)self).skillLocator) && Object.op_Implicit((Object)(object)((EntityState)self).skillLocator.special) && Object.op_Implicit((Object)(object)((EntityState)self).skillLocator.special.baseSkill) && RailgunnerBatteryController.RailgunnerSpecialChargeCosts.TryGetValue(((EntityState)self).skillLocator.special.baseSkill, out var value)) { chargeToConsume = value; } component.StoreCharge(chargeToConsume); component.SetChargeUiEnabled(enabled: false); } } private void SkillLocator_DeductCooldownFromAllSkillsAuthority(orig_DeductCooldownFromAllSkillsAuthority orig, SkillLocator self, float deduction) { orig.Invoke(self, deduction); RailgunnerBatteryController component = ((Component)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.AddCharge(deduction / component.GetScaledRechargeTime()); } } private void FireSnipeLight_ModifyBullet(orig_ModifyBullet orig, FireSnipeLight self, BulletAttack bulletAttack) { orig.Invoke(self, bulletAttack); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { int num = 12; int num2 = num; if (Object.op_Implicit((Object)(object)((EntityState)self).skillLocator) && Object.op_Implicit((Object)(object)((EntityState)self).skillLocator.secondary)) { num2 += 2 * ((EntityState)self).skillLocator.secondary.bonusStockFromBody; } component.SubtractCharge(0.09f * (float)num / (float)num2, canDisableSkills: true); component.SetRechargeDelay(); } } private void FireSnipeHeavy_ModifyBullet(orig_ModifyBullet orig, FireSnipeHeavy self, BulletAttack bulletAttack) { orig.Invoke(self, bulletAttack); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { int num = 6; int num2 = num; if (Object.op_Implicit((Object)(object)((EntityState)self).skillLocator) && Object.op_Implicit((Object)(object)((EntityState)self).skillLocator.secondary)) { num2 += ((EntityState)self).skillLocator.secondary.bonusStockFromBody; } component.SubtractCharge(0.18f * (float)num / (float)num2, canDisableSkills: true); component.SetRechargeDelay(); } } private void FireSnipeCryo_ModifyBullet(orig_ModifyBullet orig, FireSnipeCryo self, BulletAttack bulletAttack) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Invalid comparison between Unknown and I4 //IL_0056: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, bulletAttack); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.ConsumeStoredCharge(); } if ((int)PluginUtils.ScepterIndex != -1 && Object.op_Implicit((Object)(object)((EntityState)self).characterBody) && Object.op_Implicit((Object)(object)((EntityState)self).characterBody.inventory) && ((EntityState)self).characterBody.inventory.GetItemCountEffective(PluginUtils.ScepterIndex) > 0) { bulletAttack.damage *= 2f; bulletAttack.procCoefficient *= 2f; bulletAttack.radius *= 1.5f; } } private void Offline_RemoveAttackSpeedScaling(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdfld<BaseState>(x, "attackSpeedStat") })) { val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Func<float, Offline, float>>((Func<float, Offline, float>)delegate(float atkSpd, Offline self) { RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); return Object.op_Implicit((Object)(object)component) ? (component.baseRechargeTime / Mathf.Max(0.01f, component.GetScaledRechargeTime())) : 1f; }); } else { Debug.LogError((object)"RailgunnerRebloated: Offline_RemoveAttackSpeedScaling IL hook failed."); } } private void RailgunSkillDef_DisableVanillaOfflineCooldown(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)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCall<RailgunSkillDef>(x, "IsBackpackOffline") })) { val.EmitDelegate<Func<bool, bool>>((Func<bool, bool>)((bool isOffline) => false)); } else { Debug.LogError((object)"RailgunnerRebloated: RailgunSkillDef_OnFixedUpdate IL Hook failed."); } } private void RailgunSkillDef_OnFixedUpdate(orig_OnFixedUpdate orig, RailgunSkillDef self, GenericSkill skillSlot, float deltaTime) { if (self.IsBackpackOffline(skillSlot)) { deltaTime = 0f; } orig.Invoke(self, skillSlot, deltaTime); } private void BaseCharged_OnExit(orig_OnExit orig, BaseCharged self) { orig.Invoke(self); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.SetChargeUiEnabled(enabled: true); } } private void BaseCharged_OnEnter(orig_OnEnter orig, BaseCharged self) { orig.Invoke(self); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.SetChargeUiEnabled(enabled: false); } } private void BaseCharging_OnExit(orig_OnExit orig, BaseCharging self) { orig.Invoke(self); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.SetChargeUiEnabled(enabled: true); } } private void Reloading_FixedUpdate(orig_FixedUpdate orig, Reloading self) { orig.Invoke(self); SetRechargeDelay((EntityState)(object)self); } private void BaseCharged_FixedUpdate(orig_FixedUpdate orig, BaseCharged self) { orig.Invoke(self); SetRechargeDelay((EntityState)(object)self); } private void Offline_OnEnter(orig_OnEnter orig, Offline self) { orig.Invoke(self); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { ((Behaviour)component).enabled = false; } } private void Offline_OnExit(orig_OnExit orig, Offline self) { orig.Invoke(self); RailgunnerBatteryController component = ((EntityState)self).GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { ((Behaviour)component).enabled = true; } } private static void SetRechargeDelay(EntityState state) { RailgunnerBatteryController component = state.GetComponent<RailgunnerBatteryController>(); if (Object.op_Implicit((Object)(object)component)) { component.SetRechargeDelay(); } } } } namespace RailgunnerRebloated.Components { public class RailgunnerBatteryController : NetworkBehaviour { public static Dictionary<SkillDef, float> RailgunnerSpecialChargeCosts; public static Dictionary<SkillDef, float> RailgunnerSpecialChargeDisplayOverrides; public static bool allowZeroCooldown; public float baseRechargeTime = 20f; public float rechargeDelay = 1.2f; public GameObject overlayPrefab; private bool chargeUiEnabled = false; private SkillLocator skillLocator; private CharacterBody body; private EntityStateMachine backpackMachine; private float chargePercent = 1f; private float rechargeDelayTimer = 0f; private Animator animator; private OverlayController overlayController; private List<ImageFillController> fillUiList = new List<ImageFillController>(); private float storedCharge = 0f; private float storedChargeToConsume = 0f; private static int kRpcRpcAddCharge; public void AddChargeServer(float charge) { if (NetworkServer.active) { CallRpcAddCharge(charge); } } [ClientRpc] private void RpcAddCharge(float charge) { AddCharge(charge); } public void StoreCharge(float chargeToConsume) { storedCharge = chargePercent; storedChargeToConsume = Mathf.Min(chargeToConsume, chargePercent); } public float GetStoredCharge() { return storedCharge; } public float GetStoredChargeToConsume() { return storedChargeToConsume; } public void ConsumeStoredCharge() { chargePercent = storedCharge; SubtractCharge(storedChargeToConsume, canDisableSkills: true); } private void OnEnable() { if (!Object.op_Implicit((Object)(object)body)) { body = ((Component)this).GetComponent<CharacterBody>(); } if (!Object.op_Implicit((Object)(object)backpackMachine)) { backpackMachine = EntityStateMachine.FindByCustomName(((Component)this).gameObject, "Backpack"); } if (!Object.op_Implicit((Object)(object)skillLocator)) { skillLocator = ((Component)this).GetComponent<SkillLocator>(); } if (!Object.op_Implicit((Object)(object)animator)) { ModelLocator component = ((Component)this).GetComponent<ModelLocator>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.modelTransform)) { animator = ((Component)component.modelTransform).GetComponent<Animator>(); } } chargePercent = 1f; rechargeDelayTimer = 0f; storedCharge = 0f; storedChargeToConsume = 0f; SetChargeUiEnabled(enabled: true); } private void OnDisable() { SetChargeUiEnabled(enabled: false); } public void SetChargeUiEnabled(bool enabled) { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) if (enabled != chargeUiEnabled) { chargeUiEnabled = enabled; if (overlayController != null) { overlayController.onInstanceAdded -= OnOverlayInstanceAdded; overlayController.onInstanceRemove -= OnOverlayInstanceRemoved; fillUiList.Clear(); HudOverlayManager.RemoveOverlay(overlayController); overlayController = null; } if (enabled) { OverlayCreationParams val = default(OverlayCreationParams); val.prefab = overlayPrefab; val.childLocatorEntry = "CrosshairExtras"; OverlayCreationParams val2 = val; overlayController = HudOverlayManager.AddOverlay(((Component)this).gameObject, val2); overlayController.onInstanceAdded += OnOverlayInstanceAdded; overlayController.onInstanceRemove += OnOverlayInstanceRemoved; } } } private void OnOverlayInstanceAdded(OverlayController controller, GameObject instance) { fillUiList.Add(instance.GetComponent<ImageFillController>()); } private void OnOverlayInstanceRemoved(OverlayController controller, GameObject instance) { fillUiList.Remove(instance.GetComponent<ImageFillController>()); } private void FixedUpdate() { if (rechargeDelayTimer > 0f) { rechargeDelayTimer -= Time.fixedDeltaTime; } else if (chargePercent < 1f) { AddCharge(Time.fixedDeltaTime / GetScaledRechargeTime()); } SetBackpackChargeVisual(chargePercent); foreach (ImageFillController fillUi in fillUiList) { fillUi.SetTValue(chargePercent); } } public float GetScaledRechargeTime() { float num = baseRechargeTime; if (Object.op_Implicit((Object)(object)skillLocator) && Object.op_Implicit((Object)(object)skillLocator.secondary)) { num *= skillLocator.secondary.cooldownScale; num -= skillLocator.secondary.flatCooldownReduction; num = Mathf.Max(allowZeroCooldown ? 0f : 0.5f, num); num += skillLocator.secondary.temporaryCooldownPenalty; } return num; } public void SetRechargeDelay() { rechargeDelayTimer = rechargeDelay; } public float GetChargePercent() { return chargePercent; } public void SetCharge(float charge) { chargePercent = charge; } public void AddCharge(float charge) { chargePercent = Mathf.Min(1f, chargePercent + charge); if (Object.op_Implicit((Object)(object)body) && body.HasBuff(Buffs.NoCooldowns)) { chargePercent = 1f; } } public void SubtractCharge(float charge) { SubtractCharge(charge, canDisableSkills: false); } public void SubtractCharge(float charge, bool canDisableSkills) { if (Object.op_Implicit((Object)(object)body) && body.HasBuff(Buffs.NoCooldowns)) { charge = 0f; } chargePercent = Mathf.Max(0f, chargePercent - charge); if (canDisableSkills && chargePercent <= 0f) { DisableSkillsAuthority(); } } public void DisableSkillsAuthority() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if (Object.op_Implicit((Object)(object)body) && body.hasEffectiveAuthority) { EntityState val = (EntityState)new Offline(); if (Object.op_Implicit((Object)(object)backpackMachine) && val != null) { backpackMachine.SetNextState(val); } } } public void SetBackpackChargeVisual(float charge) { if (Object.op_Implicit((Object)(object)animator)) { animator.SetFloat("SpecialCooldown", 1f - charge); } } static RailgunnerBatteryController() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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) //IL_002e: 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_0056: 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: Expected O, but got Unknown RailgunnerSpecialChargeCosts = new Dictionary<SkillDef, float> { { Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyChargeSnipeSuper.asset").WaitForCompletion(), 1f }, { Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyChargeSnipeCryo.asset").WaitForCompletion(), 0.4f } }; RailgunnerSpecialChargeDisplayOverrides = new Dictionary<SkillDef, float> { { Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyChargeSnipeCryo.asset").WaitForCompletion(), 1f } }; kRpcRpcAddCharge = 627875651; NetworkBehaviour.RegisterRpcDelegate(typeof(RailgunnerBatteryController), kRpcRpcAddCharge, new CmdDelegate(InvokeRpcRpcAddCharge)); NetworkCRC.RegisterBehaviour("RailgunnerBatteryController", 0); } private void UNetVersion() { } protected static void InvokeRpcRpcAddCharge(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcAddCharge called on server."); } else { ((RailgunnerBatteryController)(object)obj).RpcAddCharge(reader.ReadSingle()); } } public void CallRpcAddCharge(float charge) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcAddCharge called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcAddCharge); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(charge); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcAddCharge"); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { bool result = default(bool); return result; } public override void OnDeserialize(NetworkReader reader, bool initialState) { } } }