Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of CloseAirSupport v1.15.0
CloseAirSupport.dll
Decompiled 2 weeks agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using HG; using Microsoft.CodeAnalysis; using On.RoR2; using R2API; using R2API.Utils; using RiskOfOptions; using RiskOfOptions.Options; using RoR2; using RoR2.Projectile; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: NetworkCompatibility(/*Could not decode attribute arguments.*/)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("CloseAirSupport")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+1a3f752dbf2b8aeb408a97e9c168d317a502eceb")] [assembly: AssemblyProduct("CloseAirSupport")] [assembly: AssemblyTitle("CloseAirSupport")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ExamplePlugin { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } } namespace CloseAirSupport { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.MyName.CloseAirSupport", "Close Air Support", "1.15.0")] public class CloseAirSupport : BaseUnityPlugin { public static class MyEntityStates { public class Engi_DroneATGMSalvo : BaseSkillState { public static int missilesPerDrone = 10; public static float missileDamageCoef = 3f; private bool fired; public override void OnEnter() { ((BaseState)this).OnEnter(); CharacterBody characterBody = ((EntityState)this).characterBody; if (characterBody != null) { characterBody.SetAimTimer(2f); } ((EntityState)this).PlayCrossfade("Gesture, Additive", "FireGrenade", "FireGrenade.playbackRate", 0.25f, 0.05f); } public override void FixedUpdate() { //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); if (!fired) { fired = true; if (NetworkServer.active) { EnsurePrefabs(); if (Object.op_Implicit((Object)(object)MissileProjectilePrefab)) { CharacterBody characterBody = ((EntityState)this).characterBody; if (Object.op_Implicit((Object)(object)((characterBody != null) ? characterBody.master : null))) { List<CharacterMaster> ownedMasters = OwnerUtils.GetOwnedMasters(((EntityState)this).characterBody.master); foreach (CharacterMaster item in ownedMasters) { if (!Object.op_Implicit((Object)(object)item) || !Object.op_Implicit((Object)(object)((Component)item).GetComponent<PermDroneMarkerHeli>())) { continue; } CharacterBody body = item.GetBody(); if (!Object.op_Implicit((Object)(object)body)) { continue; } TryGetMuzzle(body, out var muzzle); Vector3 val = (Object.op_Implicit((Object)(object)body.inputBank) ? body.inputBank.aimDirection : body.transform.forward); if (val == Vector3.zero) { val = body.transform.forward; } Vector3 val2 = (Object.op_Implicit((Object)(object)muzzle) ? muzzle.position : (body.corePosition + Vector3.up * 0.5f)); Quaternion val3 = Util.QuaternionSafeLookRotation(val); Xoroshiro128Plus val4 = (Xoroshiro128Plus)(Object.op_Implicit((Object)(object)Run.instance) ? ((object)Run.instance.runRNG) : ((object)new Xoroshiro128Plus((ulong)DateTime.Now.Ticks))); for (int i = 0; i < missilesPerDrone; i++) { float num = val4.RangeFloat(-2f, 2f); float num2 = val4.RangeFloat(-1.5f, 1.5f); Quaternion val5 = Quaternion.AngleAxis(num, Vector3.up) * Quaternion.AngleAxis(num2, Vector3.right); if (Object.op_Implicit((Object)(object)muzzle)) { SpawnMuzzleFlash(muzzle, val3 * val5); } ProjectileManager.instance.FireProjectile(MissileProjectilePrefab, val2, val3 * val5, ((Component)body).gameObject, body.damage * missileDamageCoef, 0f, body.RollCrit(), (DamageColorIndex)0, (GameObject)null, -1f, (DamageTypeCombo?)null); } } GenericSkill val6 = ((EntityState)this).skillLocator?.secondary; if (Object.op_Implicit((Object)(object)val6)) { val6.rechargeStopwatch = 0f; } } } } } if (((EntityState)this).fixedAge >= 0.3f) { ((EntityState)this).outer.SetNextStateToMain(); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } public class Engi_CallEmergencyDrones : BaseSkillState { public static float lifeSeconds = 45f; public static float healFractionPerSecond = 0.1f; public static float spawnUp = 2f; public static float spawnRadius = 3.5f; private bool spawned; public override void OnEnter() { ((BaseState)this).OnEnter(); CharacterBody characterBody = ((EntityState)this).characterBody; if (characterBody != null) { characterBody.SetAimTimer(2f); } ((EntityState)this).PlayCrossfade("Gesture, Additive", "FireGrenade", "FireGrenade.playbackRate", 0.25f, 0.05f); } public override void FixedUpdate() { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Expected O, but got Unknown //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); if (!spawned) { spawned = true; if (NetworkServer.active) { EnsurePrefabs(); GameObject droneEmergencyMasterPrefab = DroneEmergencyMasterPrefab; if (Object.op_Implicit((Object)(object)droneEmergencyMasterPrefab)) { foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { if (!Object.op_Implicit((Object)(object)instance) || !Object.op_Implicit((Object)(object)instance.master)) { continue; } CharacterMaster master = instance.master; CharacterBody body = master.GetBody(); if (!Object.op_Implicit((Object)(object)body)) { continue; } Vector3 val = body.corePosition + Vector3.up * spawnUp; float num = Random.Range(0f, 360f); Quaternion val2 = Quaternion.AngleAxis(num, Vector3.up); Vector3 val3 = val + val2 * (Vector3.forward * spawnRadius); MasterSummon val4 = new MasterSummon { masterPrefab = droneEmergencyMasterPrefab, position = val3, rotation = val2, summonerBodyObject = ((Component)body).gameObject, useAmbientLevel = true, teamIndexOverride = (TeamIndex)1, ignoreTeamMemberLimit = true }; CharacterMaster val5 = val4.Perform(); if (Object.op_Implicit((Object)(object)val5)) { CharacterBody body2 = val5.GetBody(); if (Object.op_Implicit((Object)(object)((body2 != null) ? body2.healthComponent : null))) { body2.healthComponent.HealFraction(1f, default(ProcChainMask)); } EnsureNetworkSfx(); PlaySfxAll(sfxDroneRepair, val3); GameObject val6 = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/DroneRepairEffect"); if (Object.op_Implicit((Object)(object)val6)) { EffectManager.SimpleEffect(val6, val3, Quaternion.identity, true); } TimedKill timedKill = ((Component)val5).gameObject.AddComponent<TimedKill>(); timedKill.life = lifeSeconds; HealOwnerOverTime healOwnerOverTime = ((Component)val5).gameObject.AddComponent<HealOwnerOverTime>(); healOwnerOverTime.owner = body; healOwnerOverTime.fractionPerSecond = healFractionPerSecond; } } GenericSkill val7 = ((EntityState)this).skillLocator?.utility; if (Object.op_Implicit((Object)(object)val7)) { val7.rechargeStopwatch = 0f; } } } } if (((EntityState)this).fixedAge >= 0.35f) { ((EntityState)this).outer.SetNextStateToMain(); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } public class Engi_SummonPermanentDrone : BaseSkillState { public static int maxOwned = 1; public static float spawnUp = 3f; public static float spawnForward = 3f; private bool spawned; public override void OnEnter() { ((BaseState)this).OnEnter(); CharacterBody characterBody = ((EntityState)this).characterBody; if (characterBody != null) { characterBody.SetAimTimer(2f); } ((EntityState)this).PlayCrossfade("Gesture, Additive", "FireGrenade", "FireGrenade.playbackRate", 0.25f, 0.05f); } public override void FixedUpdate() { //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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_00f0: 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) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); if (!spawned) { spawned = true; if (NetworkServer.active) { GameObject strikeDroneMasterPrefab = StrikeDroneMasterPrefab; if (Object.op_Implicit((Object)(object)strikeDroneMasterPrefab)) { CharacterBody characterBody = ((EntityState)this).characterBody; if (Object.op_Implicit((Object)(object)((characterBody != null) ? characterBody.master : null))) { int num = PermDroneManager.CountOwnedHeliDrones(((EntityState)this).characterBody.master); if (num >= maxOwned) { PermDroneManager.KillOldestHeliDrone(((EntityState)this).characterBody.master); } num = PermDroneManager.CountOwnedHeliDrones(((EntityState)this).characterBody.master); if (num < maxOwned) { Vector3 val = ((EntityState)this).characterBody.corePosition + Vector3.up * spawnUp; Ray aimRay = ((BaseState)this).GetAimRay(); Quaternion val2 = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction); Vector3 val3 = val + val2 * Vector3.forward * spawnForward; CharacterMaster val4 = new MasterSummon { masterPrefab = strikeDroneMasterPrefab, position = val3, rotation = val2, summonerBodyObject = ((EntityState)this).gameObject, inventoryToCopy = ((EntityState)this).characterBody.master.inventory, useAmbientLevel = true, teamIndexOverride = (TeamIndex)1, ignoreTeamMemberLimit = true }.Perform(); if (Object.op_Implicit((Object)(object)val4)) { PermDroneMarkerHeli permDroneMarkerHeli = ((Component)val4).gameObject.AddComponent<PermDroneMarkerHeli>(); permDroneMarkerHeli.spawnedAt = (Object.op_Implicit((Object)(object)Run.instance) ? ((double)Run.instance.fixedTime) : Time.fixedTimeAsDouble); CharacterBody body = val4.GetBody(); if (Object.op_Implicit((Object)(object)body)) { body.baseNameToken = "CYA_MK1_NAME"; EnsureNetworkSfx(); PlaySfxAll(sfxDroneRepair, val3); GameObject val5 = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/DroneRepairEffect"); if (Object.op_Implicit((Object)(object)val5)) { EffectManager.SimpleEffect(val5, val3, Quaternion.identity, true); } } DroneSyncWithOwner droneSyncWithOwner = ((Component)val4).gameObject.AddComponent<DroneSyncWithOwner>(); droneSyncWithOwner.owner = ((EntityState)this).characterBody; droneSyncWithOwner.drone = val4.GetBody(); droneSyncWithOwner.scale = Mathf.Max(0f, cfgDroneDamageScale.Value); droneSyncWithOwner.updateRate = 1f; } GenericSkill val6 = ((EntityState)this).skillLocator?.special; if (Object.op_Implicit((Object)(object)val6)) { val6.rechargeStopwatch = 0f; } } } } } } if (((EntityState)this).fixedAge >= 0.3f) { ((EntityState)this).outer.SetNextStateToMain(); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } } internal static class OwnerUtils { public static List<CharacterMaster> GetOwnedMasters(CharacterMaster owner) { List<CharacterMaster> list = new List<CharacterMaster>(); if (!Object.op_Implicit((Object)(object)owner)) { return list; } foreach (CharacterMaster readOnlyInstances in CharacterMaster.readOnlyInstancesList) { if (Object.op_Implicit((Object)(object)readOnlyInstances)) { MinionOwnership component = ((Component)readOnlyInstances).GetComponent<MinionOwnership>(); if (Object.op_Implicit((Object)(object)component) && (Object)(object)component.ownerMaster == (Object)(object)owner) { list.Add(readOnlyInstances); } } } return list; } public static int CountOwnedDrones(CharacterMaster owner) { if (!Object.op_Implicit((Object)(object)owner)) { return 0; } int num = 0; foreach (CharacterMaster readOnlyInstances in CharacterMaster.readOnlyInstancesList) { if (!Object.op_Implicit((Object)(object)readOnlyInstances)) { continue; } MinionOwnership component = ((Component)readOnlyInstances).GetComponent<MinionOwnership>(); if (!Object.op_Implicit((Object)(object)component) || (Object)(object)component.ownerMaster != (Object)(object)owner) { continue; } if ((Object)(object)((Component)readOnlyInstances).GetComponent<PermDroneMarkerHeli>() != (Object)null) { num++; continue; } CharacterBody body = readOnlyInstances.GetBody(); string text = ((Object)readOnlyInstances).name ?? string.Empty; string text2 = (Object.op_Implicit((Object)(object)body) ? (body.baseNameToken ?? string.Empty) : string.Empty); if (text.IndexOf("Drone", StringComparison.OrdinalIgnoreCase) >= 0 || text2.IndexOf("DRONE", StringComparison.OrdinalIgnoreCase) >= 0) { num++; } } return num; } } public class PermDroneMarkerHeli : MonoBehaviour { public double spawnedAt; } public class PlayerDroneBarrierPassive : MonoBehaviour { public CharacterBody body; private CharacterMaster master; private float timer; private void Awake() { body = body ?? ((Component)this).GetComponent<CharacterBody>(); master = (Object.op_Implicit((Object)(object)body) ? body.master : null); } private void FixedUpdate() { if (!NetworkServer.active) { return; } if (!cfgPassive_Enable.Value || !Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.healthComponent)) { Object.Destroy((Object)(object)this); return; } timer += Time.fixedDeltaTime; if (timer < 0.2f) { return; } timer = 0f; if (!Object.op_Implicit((Object)(object)master)) { master = body.master; } if (Object.op_Implicit((Object)(object)master)) { int num = OwnerUtils.CountOwnedDrones(master); float num2 = body.maxHealth * Mathf.Max(0f, cfgPassive_BarrierPerDroneFraction.Value) * (float)num; float barrier = body.healthComponent.barrier; if (barrier + 1f < num2) { body.healthComponent.AddBarrier(num2 - barrier); } } } } public class PlayerAerialOverwatchPassive : MonoBehaviour { public CharacterBody body; private CharacterMaster master; private float tick; private float cooldown; private EquipmentDef scannerDef; private MethodInfo miFireScanner; private MethodInfo miPerformAction; private void Awake() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) body = body ?? ((Component)this).GetComponent<CharacterBody>(); master = (Object.op_Implicit((Object)(object)body) ? body.master : null); try { scannerDef = Addressables.LoadAssetAsync<EquipmentDef>((object)"RoR2/Base/Scanner/Scanner.asset").WaitForCompletion() ?? Equipment.Scanner; } catch { scannerDef = Equipment.Scanner; } try { miFireScanner = typeof(EquipmentSlot).GetMethod("FireScanner", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } catch { } try { miPerformAction = typeof(EquipmentSlot).GetMethod("PerformEquipmentAction", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[1] { typeof(EquipmentDef) }, null); } catch { } } private void FixedUpdate() { if (!NetworkServer.active) { return; } if (!cfgPassive_Enable.Value || !Object.op_Implicit((Object)(object)body)) { Object.Destroy((Object)(object)this); return; } tick += Time.fixedDeltaTime; cooldown -= Time.fixedDeltaTime; if (!(tick < 0.2f)) { tick = 0f; if (!Object.op_Implicit((Object)(object)master)) { master = body.master; } if (Object.op_Implicit((Object)(object)master) && OwnerUtils.CountOwnedDrones(master) >= 1 && !(cooldown > 0f) && TryFireScanner(body)) { cooldown = Mathf.Max(5f, cfgPassive_AerialOverwatchPeriod.Value); } } } private bool TryFireScanner(CharacterBody cb) { try { EquipmentSlot val = (Object.op_Implicit((Object)(object)cb) ? ((Component)cb).GetComponent<EquipmentSlot>() : null); if (!Object.op_Implicit((Object)(object)val) || (Object)(object)scannerDef == (Object)null) { return false; } if (miFireScanner != null) { miFireScanner.Invoke(val, null); return true; } if (miPerformAction != null && (bool)miPerformAction.Invoke(val, new object[1] { scannerDef })) { return true; } return false; } catch (Exception ex) { Debug.LogWarning((object)("[CAS] Aerial Overwatch scanner trigger failed: " + ex.Message)); return false; } } } public class HealOwnerOverTime : MonoBehaviour { public CharacterBody owner; public float fractionPerSecond = 0.1f; private void FixedUpdate() { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { if (!Object.op_Implicit((Object)(object)owner) || !Object.op_Implicit((Object)(object)owner.healthComponent)) { Object.Destroy((Object)(object)this); return; } float num = owner.maxHealth * Mathf.Max(0f, fractionPerSecond) * Time.fixedDeltaTime; owner.healthComponent.Heal(num, default(ProcChainMask), true); } } } public class DroneSyncWithOwner : MonoBehaviour { public CharacterBody owner; public CharacterBody drone; public float scale = 2.5f; public float updateRate = 1f; private float timer; private void FixedUpdate() { //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Invalid comparison between Unknown and I4 //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return; } timer += Time.fixedDeltaTime; if (timer < updateRate) { return; } timer = 0f; if (!Object.op_Implicit((Object)(object)owner) || !Object.op_Implicit((Object)(object)drone)) { Object.Destroy((Object)(object)this); return; } drone.baseDamage = owner.damage * Mathf.Max(0f, cfgDroneDamageScale.Value); drone.RecalculateStats(); Inventory inventory = owner.inventory; Inventory inventory2 = drone.inventory; if (!((Object)(object)inventory != (Object)null) || !((Object)(object)inventory2 != (Object)null)) { return; } for (ItemIndex val = (ItemIndex)0; (int)val < ItemCatalog.itemCount; val = (ItemIndex)(val + 1)) { int itemCount = inventory.GetItemCount(val); int itemCount2 = inventory2.GetItemCount(val); if (itemCount != itemCount2) { if (itemCount2 > 0) { inventory2.RemoveItem(val, itemCount2); } if (itemCount > 0) { inventory2.GiveItem(val, itemCount); } } } } } public class TimedKill : MonoBehaviour { public float life = 45f; private float t; private CharacterMaster cm; private void Awake() { cm = ((Component)this).GetComponent<CharacterMaster>(); } private void FixedUpdate() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return; } t += Time.fixedDeltaTime; if (t < life) { return; } Vector3 pos = ((Component)this).transform.position; CharacterBody val = (Object.op_Implicit((Object)(object)cm) ? cm.GetBody() : null); if (Object.op_Implicit((Object)(object)val)) { pos = val.corePosition; } EnsureNetworkSfx(); PlaySfxAll(sfxDroneDeath, pos); if (Object.op_Implicit((Object)(object)cm)) { CharacterBody body = cm.GetBody(); if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)((Component)body).gameObject)) { ((Behaviour)body).enabled = false; Object.Destroy((Object)(object)((Component)body).gameObject); } cm.TrueKill(); if (Object.op_Implicit((Object)(object)((Component)cm).gameObject)) { NetworkServer.Destroy(((Component)cm).gameObject); } } Object.Destroy((Object)(object)this); } } internal static class PermDroneManager { public static int CountOwnedHeliDrones(CharacterMaster owner) { int num = 0; foreach (CharacterMaster readOnlyInstances in CharacterMaster.readOnlyInstancesList) { if (Object.op_Implicit((Object)(object)readOnlyInstances)) { MinionOwnership component = ((Component)readOnlyInstances).GetComponent<MinionOwnership>(); if (Object.op_Implicit((Object)(object)component) && !((Object)(object)component.ownerMaster != (Object)(object)owner) && Object.op_Implicit((Object)(object)((Component)readOnlyInstances).GetComponent<PermDroneMarkerHeli>())) { num++; } } } return num; } public static bool KillOldestHeliDrone(CharacterMaster owner) { //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || !Object.op_Implicit((Object)(object)owner)) { return false; } CharacterMaster val = null; double num = double.MaxValue; foreach (CharacterMaster readOnlyInstances in CharacterMaster.readOnlyInstancesList) { if (!Object.op_Implicit((Object)(object)readOnlyInstances)) { continue; } MinionOwnership component = ((Component)readOnlyInstances).GetComponent<MinionOwnership>(); if (Object.op_Implicit((Object)(object)component) && !((Object)(object)component.ownerMaster != (Object)(object)owner)) { PermDroneMarkerHeli component2 = ((Component)readOnlyInstances).GetComponent<PermDroneMarkerHeli>(); if (Object.op_Implicit((Object)(object)component2) && component2.spawnedAt < num) { num = component2.spawnedAt; val = readOnlyInstances; } } } if (!Object.op_Implicit((Object)(object)val)) { return false; } Vector3 pos = ((Component)val).transform.position; CharacterBody body = val.GetBody(); if (Object.op_Implicit((Object)(object)body)) { pos = body.corePosition; } EnsureNetworkSfx(); PlaySfxAll(sfxDroneDeath, pos); CharacterBody body2 = val.GetBody(); if (Object.op_Implicit((Object)(object)body2) && Object.op_Implicit((Object)(object)((Component)body2).gameObject)) { ((Behaviour)body2).enabled = false; Object.Destroy((Object)(object)((Component)body2).gameObject); } val.TrueKill(); if (Object.op_Implicit((Object)(object)((Component)val).gameObject)) { NetworkServer.Destroy(((Component)val).gameObject); } return true; } } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_Start <>9__25_0; public static Func<GenericSkill, bool> <>9__26_0; public static Func<GenericSkill, bool> <>9__27_0; public static EventHandler <>9__28_0; public static EventHandler <>9__28_1; public static EventHandler <>9__28_2; public static EventHandler <>9__28_3; public static EventHandler <>9__28_4; public static EventHandler <>9__28_5; public static EventHandler <>9__28_6; public static EventHandler <>9__28_7; public static EventHandler <>9__28_8; public static EventHandler <>9__28_9; internal void <Awake>b__25_0(orig_Start orig, CharacterBody self) { orig.Invoke(self); if (!Object.op_Implicit((Object)(object)self)) { return; } if (NetworkServer.active && cfgMicrobots_Enable.Value && self.baseNameToken == "ENGI_BODY_NAME" && Object.op_Implicit((Object)(object)self.skillLocator) && Object.op_Implicit((Object)(object)self.skillLocator.special) && (Object)(object)self.skillLocator.special.skillDef == (Object)(object)Special_Perm_Def) { Inventory inventory = self.inventory; if ((Object)(object)inventory != (Object)null && inventory.GetItemCount(Items.CaptainDefenseMatrix) < 1) { inventory.GiveItem(Items.CaptainDefenseMatrix, 1); self.RecalculateStats(); } } if (!NetworkServer.active || !self.isPlayerControlled) { return; } SkillDef selectedPassiveDef = GetSelectedPassiveDef(self); bool flag = cfgPassive_Enable.Value && (Object)(object)selectedPassiveDef == (Object)(object)Passive_DroneTinkering_Def; bool flag2 = cfgPassive_Enable.Value && (Object)(object)selectedPassiveDef == (Object)(object)Passive_AerialOverwatch_Def; PlayerDroneBarrierPassive component = ((Component)self).GetComponent<PlayerDroneBarrierPassive>(); if (flag) { if (!Object.op_Implicit((Object)(object)component)) { component = ((Component)self).gameObject.AddComponent<PlayerDroneBarrierPassive>(); component.body = self; } } else if (Object.op_Implicit((Object)(object)component)) { Object.Destroy((Object)(object)component); } PlayerAerialOverwatchPassive component2 = ((Component)self).GetComponent<PlayerAerialOverwatchPassive>(); if (flag2) { if (!Object.op_Implicit((Object)(object)component2)) { component2 = ((Component)self).gameObject.AddComponent<PlayerAerialOverwatchPassive>(); component2.body = self; } } else if (Object.op_Implicit((Object)(object)component2)) { Object.Destroy((Object)(object)component2); } } internal bool <EnsureCustomPassiveSlotOnEngi>b__26_0(GenericSkill s) { return Object.op_Implicit((Object)(object)s) && (Object)(object)s.skillFamily == (Object)(object)PassiveSkillFamily; } internal bool <GetSelectedPassiveDef>b__27_0(GenericSkill s) { return Object.op_Implicit((Object)(object)s) && (Object)(object)s.skillFamily == (Object)(object)PassiveSkillFamily; } internal void <BindConfig>b__28_0(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_1(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_2(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_3(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_4(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_5(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_6(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_7(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_8(object _, EventArgs __) { ApplyConfigToRuntime(); } internal void <BindConfig>b__28_9(object _, EventArgs __) { ApplyConfigToRuntime(); } } internal static GameObject MissileProjectilePrefab; internal static GameObject DroneEmergencyMasterPrefab; internal static GameObject StrikeDroneMasterPrefab; private string _pluginDir; private static bool _initialized; internal static SkillDef Secondary_ATGM_Def; internal static SkillDef Utility_Call_Def; internal static SkillDef Special_Perm_Def; internal static SkillDef Passive_DroneTinkering_Def; internal static SkillDef Passive_AerialOverwatch_Def; private static SkillFamily PassiveSkillFamily; private const string PassiveSlotComponentName = "CAS_PassiveSlot"; private static ConfigEntry<float> cfgSecondaryCooldown; private static ConfigEntry<float> cfgUtilityCooldown; private static ConfigEntry<int> cfgATGMCount; internal static ConfigEntry<float> cfgDroneDamageScale; private static ConfigEntry<int> cfgMaxDrones; internal static ConfigEntry<float> cfgUtilityHealFractionPerSecond; private static ConfigEntry<bool> cfgPassive_Enable; private static ConfigEntry<float> cfgPassive_BarrierPerDroneFraction; private static ConfigEntry<float> cfgPassive_AerialOverwatchPeriod; private static ConfigEntry<bool> cfgMicrobots_Enable; public static NetworkSoundEventDef sfxDroneRepair; public static NetworkSoundEventDef sfxDroneDeath; private static GameObject s_muzzleVfx; public void Awake() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004e: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Unknown result type (might be due to invalid IL or missing references) //IL_03a4: Unknown result type (might be due to invalid IL or missing references) //IL_0408: Unknown result type (might be due to invalid IL or missing references) //IL_0552: Unknown result type (might be due to invalid IL or missing references) //IL_0557: Unknown result type (might be due to invalid IL or missing references) //IL_055d: Expected O, but got Unknown if (_initialized) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[CAS] Awake already ran."); return; } _initialized = true; _pluginDir = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); BindConfig(); bool flag = default(bool); ContentAddition.AddEntityState<MyEntityStates.Engi_DroneATGMSalvo>(ref flag); ContentAddition.AddEntityState<MyEntityStates.Engi_CallEmergencyDrones>(ref flag); ContentAddition.AddEntityState<MyEntityStates.Engi_SummonPermanentDrone>(ref flag); EnsurePrefabs(); EnsureNetworkSfx(); GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiBody.prefab").WaitForCompletion(); if (!Object.op_Implicit((Object)(object)val)) { ((BaseUnityPlugin)this).Logger.LogError((object)"[CAS] Failed to load EngiBody."); return; } LanguageAPI.Add("ENGI_SECONDARY_ATGM_NAME", "Portable Missile Silos"); LanguageAPI.Add("ENGI_SECONDARY_ATGM_DESCRIPTION", $"Order your <style=cIsUtility>permanent drones</style> to fire <style=cIsDamage>{cfgATGMCount.Value}</style> ATGM missiles each. <style=cIsUtility>Cooldown: {cfgSecondaryCooldown.Value:0}s</style>."); LanguageAPI.Add("ENGI_UTILITY_CALL_NAME", "Call Reinforcements"); LanguageAPI.Add("ENGI_UTILITY_CALL_DESCRIPTION", $"Call an <style=cIsUtility>Emergency Drone</style> for <style=cIsUtility>each player</style> for <style=cIsUtility>45s</style>. Heals owner for <style=cIsHealing>{(int)(cfgUtilityHealFractionPerSecond.Value * 100f)}% max health/s</style>. <style=cIsUtility>Cooldown: {cfgUtilityCooldown.Value:0}s</style>."); LanguageAPI.Add("ENGI_SPECIAL_PERMDRONE_NAME", "Close Air Support"); LanguageAPI.Add("ENGI_SPECIAL_PERMDRONE_DESCRIPTION", $"Deploy a <style=cIsUtility>permanent C.Y.A. Mk 1 Drone</style> (max <style=cIsUtility>{cfgMaxDrones.Value}</style>). Drones inherit your items and deal <style=cIsDamage>{(int)(cfgDroneDamageScale.Value * 100f)}% base damage</style>."); LanguageAPI.Add("CYA_MK1_NAME", "(C.Y.A. Mk 1)"); LanguageAPI.Add("CAS_PASSIVE_DRONETINKER_NAME", "Drone Tinkering"); LanguageAPI.Add("CAS_PASSIVE_DRONETINKER_DESC", "Gain barrier equal to <style=cIsHealing>5% of your max health</style> per drone you control."); LanguageAPI.Add("CAS_PASSIVE_AERIALWATCH_NAME", "Aerial Overwatch"); LanguageAPI.Add("CAS_PASSIVE_AERIALWATCH_DESC", "While you control at least one drone, automatically trigger <style=cIsUtility>Radar Scanner</style> every 90s."); Secondary_ATGM_Def = ScriptableObject.CreateInstance<SkillDef>(); Secondary_ATGM_Def.skillNameToken = "ENGI_SECONDARY_ATGM_NAME"; Secondary_ATGM_Def.skillDescriptionToken = "ENGI_SECONDARY_ATGM_DESCRIPTION"; Secondary_ATGM_Def.icon = LoadSprite("icon_secondary.png"); Secondary_ATGM_Def.activationState = new SerializableEntityStateType(typeof(MyEntityStates.Engi_DroneATGMSalvo)); Secondary_ATGM_Def.activationStateMachineName = "Weapon"; Secondary_ATGM_Def.baseMaxStock = 1; Secondary_ATGM_Def.baseRechargeInterval = Mathf.Max(0.1f, cfgSecondaryCooldown.Value); Secondary_ATGM_Def.beginSkillCooldownOnSkillEnd = true; Secondary_ATGM_Def.isCombatSkill = true; Secondary_ATGM_Def.mustKeyPress = true; Secondary_ATGM_Def.interruptPriority = (InterruptPriority)1; ContentAddition.AddSkillDef(Secondary_ATGM_Def); Utility_Call_Def = ScriptableObject.CreateInstance<SkillDef>(); Utility_Call_Def.skillNameToken = "ENGI_UTILITY_CALL_NAME"; Utility_Call_Def.skillDescriptionToken = "ENGI_UTILITY_CALL_DESCRIPTION"; Utility_Call_Def.icon = LoadSprite("icon_utility.png"); Utility_Call_Def.activationState = new SerializableEntityStateType(typeof(MyEntityStates.Engi_CallEmergencyDrones)); Utility_Call_Def.activationStateMachineName = "Weapon"; Utility_Call_Def.baseMaxStock = 1; Utility_Call_Def.baseRechargeInterval = Mathf.Max(0.1f, cfgUtilityCooldown.Value); Utility_Call_Def.beginSkillCooldownOnSkillEnd = true; Utility_Call_Def.isCombatSkill = true; Utility_Call_Def.mustKeyPress = true; Utility_Call_Def.interruptPriority = (InterruptPriority)1; ContentAddition.AddSkillDef(Utility_Call_Def); Special_Perm_Def = ScriptableObject.CreateInstance<SkillDef>(); Special_Perm_Def.skillNameToken = "ENGI_SPECIAL_PERMDRONE_NAME"; Special_Perm_Def.skillDescriptionToken = "ENGI_SPECIAL_PERMDRONE_DESCRIPTION"; Special_Perm_Def.icon = LoadSprite("icon_special.png"); Special_Perm_Def.activationState = new SerializableEntityStateType(typeof(MyEntityStates.Engi_SummonPermanentDrone)); Special_Perm_Def.activationStateMachineName = "Weapon"; Special_Perm_Def.baseMaxStock = Mathf.Max(1, cfgMaxDrones.Value); Special_Perm_Def.baseRechargeInterval = 30f; Special_Perm_Def.beginSkillCooldownOnSkillEnd = true; Special_Perm_Def.isCombatSkill = true; Special_Perm_Def.mustKeyPress = true; Special_Perm_Def.interruptPriority = (InterruptPriority)1; ContentAddition.AddSkillDef(Special_Perm_Def); SkillLocator component = val.GetComponent<SkillLocator>(); AppendVariantUnique(component.secondary.skillFamily, Secondary_ATGM_Def); AppendVariantUnique(component.utility.skillFamily, Utility_Call_Def); AppendVariantUnique(component.special.skillFamily, Special_Perm_Def); if (!Object.op_Implicit((Object)(object)Passive_DroneTinkering_Def)) { Passive_DroneTinkering_Def = ScriptableObject.CreateInstance<SkillDef>(); Passive_DroneTinkering_Def.skillNameToken = "CAS_PASSIVE_DRONETINKER_NAME"; Passive_DroneTinkering_Def.skillDescriptionToken = "CAS_PASSIVE_DRONETINKER_DESC"; Passive_DroneTinkering_Def.icon = LoadSprite("icon_passive_dronetinker.png"); Passive_DroneTinkering_Def.isCombatSkill = false; ContentAddition.AddSkillDef(Passive_DroneTinkering_Def); } if (!Object.op_Implicit((Object)(object)Passive_AerialOverwatch_Def)) { Passive_AerialOverwatch_Def = ScriptableObject.CreateInstance<SkillDef>(); Passive_AerialOverwatch_Def.skillNameToken = "CAS_PASSIVE_AERIALWATCH_NAME"; Passive_AerialOverwatch_Def.skillDescriptionToken = "CAS_PASSIVE_AERIALWATCH_DESC"; Passive_AerialOverwatch_Def.icon = LoadSprite("icon_passive_aerialoverwatch.png"); Passive_AerialOverwatch_Def.isCombatSkill = false; ContentAddition.AddSkillDef(Passive_AerialOverwatch_Def); } EnsureCustomPassiveSlotOnEngi(val); ApplyConfigToRuntime(); object obj = <>c.<>9__25_0; if (obj == null) { hook_Start val2 = delegate(orig_Start orig, CharacterBody self) { orig.Invoke(self); if (Object.op_Implicit((Object)(object)self)) { if (NetworkServer.active && cfgMicrobots_Enable.Value && self.baseNameToken == "ENGI_BODY_NAME" && Object.op_Implicit((Object)(object)self.skillLocator) && Object.op_Implicit((Object)(object)self.skillLocator.special) && (Object)(object)self.skillLocator.special.skillDef == (Object)(object)Special_Perm_Def) { Inventory inventory = self.inventory; if ((Object)(object)inventory != (Object)null && inventory.GetItemCount(Items.CaptainDefenseMatrix) < 1) { inventory.GiveItem(Items.CaptainDefenseMatrix, 1); self.RecalculateStats(); } } if (NetworkServer.active && self.isPlayerControlled) { SkillDef selectedPassiveDef = GetSelectedPassiveDef(self); bool flag2 = cfgPassive_Enable.Value && (Object)(object)selectedPassiveDef == (Object)(object)Passive_DroneTinkering_Def; bool flag3 = cfgPassive_Enable.Value && (Object)(object)selectedPassiveDef == (Object)(object)Passive_AerialOverwatch_Def; PlayerDroneBarrierPassive component2 = ((Component)self).GetComponent<PlayerDroneBarrierPassive>(); if (flag2) { if (!Object.op_Implicit((Object)(object)component2)) { component2 = ((Component)self).gameObject.AddComponent<PlayerDroneBarrierPassive>(); component2.body = self; } } else if (Object.op_Implicit((Object)(object)component2)) { Object.Destroy((Object)(object)component2); } PlayerAerialOverwatchPassive component3 = ((Component)self).GetComponent<PlayerAerialOverwatchPassive>(); if (flag3) { if (!Object.op_Implicit((Object)(object)component3)) { component3 = ((Component)self).gameObject.AddComponent<PlayerAerialOverwatchPassive>(); component3.body = self; } } else if (Object.op_Implicit((Object)(object)component3)) { Object.Destroy((Object)(object)component3); } } } }; <>c.<>9__25_0 = val2; obj = (object)val2; } CharacterBody.Start += (hook_Start)obj; TryRegisterRiskOfOptions(); } private static void EnsureCustomPassiveSlotOnEngi(GameObject engiBodyPrefab) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown if (Object.op_Implicit((Object)(object)engiBodyPrefab)) { if (!Object.op_Implicit((Object)(object)PassiveSkillFamily)) { PassiveSkillFamily = ScriptableObject.CreateInstance<SkillFamily>(); PassiveSkillFamily.variants = Array.Empty<Variant>(); ContentAddition.AddSkillFamily(PassiveSkillFamily); ref Variant[] variants = ref PassiveSkillFamily.variants; Variant val = new Variant { skillDef = Passive_DroneTinkering_Def, unlockableDef = null }; ((Variant)(ref val)).viewableNode = new Node(Passive_DroneTinkering_Def.skillNameToken, false, (Node)null); ArrayUtils.ArrayAppend<Variant>(ref variants, ref val); ref Variant[] variants2 = ref PassiveSkillFamily.variants; val = new Variant { skillDef = Passive_AerialOverwatch_Def, unlockableDef = null }; ((Variant)(ref val)).viewableNode = new Node(Passive_AerialOverwatch_Def.skillNameToken, false, (Node)null); ArrayUtils.ArrayAppend<Variant>(ref variants2, ref val); } GenericSkill[] components = engiBodyPrefab.GetComponents<GenericSkill>(); if (!components.Any((GenericSkill s) => Object.op_Implicit((Object)(object)s) && (Object)(object)s.skillFamily == (Object)(object)PassiveSkillFamily)) { GenericSkill val2 = engiBodyPrefab.AddComponent<GenericSkill>(); val2._skillFamily = PassiveSkillFamily; val2.skillName = "CAS_PassiveSlot"; } } } private static SkillDef GetSelectedPassiveDef(CharacterBody body) { if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)PassiveSkillFamily)) { return null; } GenericSkill val = ((Component)body).GetComponents<GenericSkill>()?.FirstOrDefault((Func<GenericSkill, bool>)((GenericSkill s) => Object.op_Implicit((Object)(object)s) && (Object)(object)s.skillFamily == (Object)(object)PassiveSkillFamily)); return Object.op_Implicit((Object)(object)val) ? val.skillDef : null; } private void BindConfig() { cfgSecondaryCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Skills", "SecondaryCooldownSeconds", 10f, "Cooldown (s) for Portable Missile Silos."); cfgUtilityCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Skills", "UtilityCooldownSeconds", 60f, "Cooldown (s) for Call Reinforcements."); cfgATGMCount = ((BaseUnityPlugin)this).Config.Bind<int>("Secondary", "MissilesPerDrone", 20, "ATGMs each permanent drone fires."); cfgDroneDamageScale = ((BaseUnityPlugin)this).Config.Bind<float>("PermanentDrones", "DroneDamagePlayerScaling", 2.5f, "Drone base damage as fraction of owner’s."); cfgMaxDrones = ((BaseUnityPlugin)this).Config.Bind<int>("PermanentDrones", "MaxPermanentDrones", 3, "Max permanent drones."); cfgUtilityHealFractionPerSecond = ((BaseUnityPlugin)this).Config.Bind<float>("Utility", "HealFractionPerSecond", 0.1f, "Emergency Drone healing per second (fraction of max HP)."); cfgPassive_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Passive", "Enable", true, "Enable selectable passives for Engineer (CAS passive row)."); cfgPassive_BarrierPerDroneFraction = ((BaseUnityPlugin)this).Config.Bind<float>("Passive", "BarrierPerDroneFraction", 0.05f, "Barrier = fraction * max HP per owned drone."); cfgPassive_AerialOverwatchPeriod = ((BaseUnityPlugin)this).Config.Bind<float>("Passive", "AerialOverwatchPeriodSeconds", 90f, "Seconds between auto Radar Scanner activations (needs ≥1 owned drone)."); cfgMicrobots_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Gameplay", "EnableDefensiveMicrobots", true, "If true, Engineer gains one stack of Defensive Microbots while Close Air Support special is equipped."); cfgSecondaryCooldown.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgUtilityCooldown.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgATGMCount.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgDroneDamageScale.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgMaxDrones.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgUtilityHealFractionPerSecond.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgPassive_Enable.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgPassive_BarrierPerDroneFraction.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgPassive_AerialOverwatchPeriod.SettingChanged += delegate { ApplyConfigToRuntime(); }; cfgMicrobots_Enable.SettingChanged += delegate { ApplyConfigToRuntime(); }; ApplyConfigToRuntime(); } private static void ApplyConfigToRuntime() { MyEntityStates.Engi_DroneATGMSalvo.missilesPerDrone = Mathf.Max(0, cfgATGMCount.Value); MyEntityStates.Engi_SummonPermanentDrone.maxOwned = Mathf.Max(1, cfgMaxDrones.Value); MyEntityStates.Engi_CallEmergencyDrones.healFractionPerSecond = Mathf.Max(0f, cfgUtilityHealFractionPerSecond.Value); if (Object.op_Implicit((Object)(object)Secondary_ATGM_Def)) { Secondary_ATGM_Def.baseRechargeInterval = Mathf.Max(0.1f, cfgSecondaryCooldown.Value); } if (Object.op_Implicit((Object)(object)Utility_Call_Def)) { Utility_Call_Def.baseRechargeInterval = Mathf.Max(0.1f, cfgUtilityCooldown.Value); } if (Object.op_Implicit((Object)(object)Special_Perm_Def)) { Special_Perm_Def.baseMaxStock = Mathf.Max(1, cfgMaxDrones.Value); } } private void TryRegisterRiskOfOptions() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Expected O, but got Unknown //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown try { ModSettingsManager.SetModDescription("Close Air Support — drone skills only (no cosmetics)."); Sprite val = LoadSprite("icon_special.png"); if (Object.op_Implicit((Object)(object)val)) { ModSettingsManager.SetModIcon(val); } ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(cfgSecondaryCooldown)); ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(cfgUtilityCooldown)); ModSettingsManager.AddOption((BaseOption)new IntFieldOption(cfgATGMCount)); ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(cfgDroneDamageScale)); ModSettingsManager.AddOption((BaseOption)new IntFieldOption(cfgMaxDrones)); ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(cfgUtilityHealFractionPerSecond)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(cfgPassive_Enable)); ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(cfgPassive_BarrierPerDroneFraction)); ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(cfgPassive_AerialOverwatchPeriod)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(cfgMicrobots_Enable)); ((BaseUnityPlugin)this).Logger.LogMessage((object)"[CAS] Risk of Options (gameplay options) registered."); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[CAS] Risk of Options not available or failed to register: " + ex.Message)); } } internal static void EnsureMuzzleVfx() { //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) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)s_muzzleVfx)) { s_muzzleVfx = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/Muzzleflash1.prefab").WaitForCompletion() ?? Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/MuzzleflashSMG.prefab").WaitForCompletion() ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Muzzleflash1") ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/MuzzleflashSMG"); } } internal static void SpawnMuzzleFlash(Transform muzzle, Quaternion dir) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown if (Object.op_Implicit((Object)(object)muzzle)) { EnsureMuzzleVfx(); if (Object.op_Implicit((Object)(object)s_muzzleVfx)) { EffectManager.SpawnEffect(s_muzzleVfx, new EffectData { origin = muzzle.position, rotation = dir }, true); } } } public static void EnsureNetworkSfx() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)sfxDroneRepair)) { sfxDroneRepair = Addressables.LoadAssetAsync<NetworkSoundEventDef>((object)"RoR2/Base/Common/NetworkSoundEventDefs/Play_item_proc_drone_repair.asset").WaitForCompletion() ?? LegacyResourcesAPI.Load<NetworkSoundEventDef>("NetworkSoundEventDefs/Play_item_proc_drone_repair"); } if (!Object.op_Implicit((Object)(object)sfxDroneDeath)) { sfxDroneDeath = Addressables.LoadAssetAsync<NetworkSoundEventDef>((object)"RoR2/Base/Drone/NetworkSoundEventDefs/Play_drone_deathpt1.asset").WaitForCompletion() ?? LegacyResourcesAPI.Load<NetworkSoundEventDef>("NetworkSoundEventDefs/Play_drone_deathpt1"); } } public static void PlaySfxAll(NetworkSoundEventDef def, Vector3 pos) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)def != (Object)null) { EffectManager.SimpleSoundEffect(def.index, pos, true); } } private static void AppendVariantUnique(SkillFamily fam, SkillDef def) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_007f: 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) Variant[] variants = fam.variants; foreach (Variant val in variants) { if ((Object)(object)val.skillDef == (Object)(object)def) { return; } } Array.Resize(ref fam.variants, fam.variants.Length + 1); Variant[] variants2 = fam.variants; int num = variants2.Length - 1; Variant val2 = new Variant { skillDef = def, unlockableDef = null }; ((Variant)(ref val2)).viewableNode = new Node(def.skillNameToken, false, (Node)null); variants2[num] = val2; } internal static void EnsurePrefabs() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)MissileProjectilePrefab)) { MissileProjectilePrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Missile/MissileProjectile.prefab").WaitForCompletion() ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/Projectiles/MissileProjectile"); } if (!Object.op_Implicit((Object)(object)DroneEmergencyMasterPrefab)) { DroneEmergencyMasterPrefab = MasterCatalog.FindMasterPrefab("EmergencyDroneMaster") ?? MasterCatalog.FindMasterPrefab("DroneEmergencyMaster") ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/EmergencyDroneMaster") ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/DroneEmergencyMaster") ?? MasterCatalog.FindMasterPrefab("Drone2Master") ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/Drone2Master"); } if (!Object.op_Implicit((Object)(object)StrikeDroneMasterPrefab)) { StrikeDroneMasterPrefab = MasterCatalog.FindMasterPrefab("DroneStrikeMaster") ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/DroneStrikeMaster") ?? MasterCatalog.FindMasterPrefab("DroneBackupMaster") ?? LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/DroneBackupMaster"); } } private Sprite LoadSprite(string fileName) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0062: 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) string path = Path.Combine(_pluginDir, fileName); if (!File.Exists(path)) { return null; } byte[] array = File.ReadAllBytes(path); Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false); ImageConversion.LoadImage(val, array); ((Texture)val).wrapMode = (TextureWrapMode)1; ((Texture)val).filterMode = (FilterMode)1; return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f); } internal static bool TryGetMuzzle(CharacterBody body, out Transform muzzle) { muzzle = null; if (!Object.op_Implicit((Object)(object)body)) { return false; } Transform val = (Object.op_Implicit((Object)(object)body.modelLocator) ? body.modelLocator.modelTransform : null); ChildLocator val2 = (Object.op_Implicit((Object)(object)val) ? ((Component)val).GetComponent<ChildLocator>() : null); if (Object.op_Implicit((Object)(object)val2)) { muzzle = val2.FindChild("Muzzle") ?? val2.FindChild("GunMuzzle") ?? val2.FindChild("MuzzleLeft") ?? val2.FindChild("MuzzleRight"); } return Object.op_Implicit((Object)(object)muzzle); } } }