using 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)
{
}
}
}