Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of TempDrones v1.0.0
plugins/TempDrones.dll
Decompiled 4 months agousing System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Globalization; 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 Microsoft.CodeAnalysis; using On.RoR2; using On.RoR2.UI; using RiskOfOptions; using RiskOfOptions.Options; using RoR2; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TempDrones")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+eda26cb08b1550479e299b32e2f4bc095e582d9c")] [assembly: AssemblyProduct("TempDrones")] [assembly: AssemblyTitle("TempDrones")] [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 AdjustedDrones { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("AdoptedFatty.TempDrones", "TempDrones", "1.0.0")] public class AdjustedDrones : BaseUnityPlugin { private sealed class UnityColorTypeConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { return destinationType == typeof(string) || base.CanConvertTo(context, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) if (value is string text) { string text2 = text.Trim(); if (text2.Length == 0) { return Color.white; } string text3 = (text2.StartsWith("#", StringComparison.Ordinal) ? text2 : ("#" + text2)); Color val = default(Color); if (ColorUtility.TryParseHtmlString(text3, ref val)) { return val; } string[] array = text2.Split(','); int num = array.Length; bool flag = (uint)(num - 3) <= 1u; if (flag && float.TryParse(array[0], out var result) && float.TryParse(array[1], out var result2) && float.TryParse(array[2], out var result3)) { float result4 = 1f; if (array.Length == 4) { float.TryParse(array[3], out result4); } return (object)new Color(result, result2, result3, result4); } } return base.ConvertFrom(context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { //IL_001d: 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_0034: Unknown result type (might be due to invalid IL or missing references) if (destinationType == typeof(string) && value is Color val) { return "#" + ColorUtility.ToHtmlStringRGBA(val); } return base.ConvertTo(context, culture, value, destinationType); } } [CompilerGenerated] private sealed class <ApplyRunGatedSystems>d__32 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AdjustedDrones <>4__this; private float <startTime>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ApplyRunGatedSystems>d__32(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; CaptureOriginalDroneCostsIfNeeded(); SetGlobalDroneCosts(active: false); if (DisableWhenOperator == null || !DisableWhenOperator.Value) { goto IL_008f; } <startTime>5__1 = Time.unscaledTime; } if (Time.unscaledTime - <startTime>5__1 < 5f && !IsOperatorPlayerPresent()) { <>2__current = null; <>1__state = 1; return true; } goto IL_008f; IL_008f: if (IsModActiveNow()) { SetGlobalDroneCosts(active: true); } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <InitializePerDroneConfigsWhenReady>d__24 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AdjustedDrones <>4__this; private float <startTime>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <InitializePerDroneConfigsWhenReady>d__24(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startTime>5__1 = Time.unscaledTime; break; case 1: <>1__state = -1; break; } if (DroneCatalog.droneCount <= 0 && Time.unscaledTime - <startTime>5__1 < 10f) { <>2__current = null; <>1__state = 1; return true; } <>4__this.InitializePerDroneConfigs(); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string PluginAuthor = "AdoptedFatty"; public const string PluginName = "TempDrones"; public const string PluginGUID = "AdoptedFatty.TempDrones"; public const string PluginVersion = "1.0.0"; internal static ConfigEntry<bool> ModEnabled; internal static ConfigEntry<bool> DisableWhenOperator; internal static ConfigEntry<string> TimerExemptDrones; internal static ConfigEntry<bool> DisableDroneAggro; internal static ConfigEntry<Color> TimerColor; internal static ConfigEntry<float> DifficultyExponent; internal static ConfigEntry<float> DifficultyCoefficientMultiplier; internal static ConfigEntry<float> RepairCostMultiplier; internal static ConfigEntry<float> DroneBaseCostMultiplier; internal static readonly Dictionary<(DroneUptimeRarityTier tier, DroneUptimeTierClass tierClass), ConfigEntry<float>> DurationSeconds = new Dictionary<(DroneUptimeRarityTier, DroneUptimeTierClass), ConfigEntry<float>>(); internal static readonly Dictionary<DroneIndex, ConfigEntry<float>> PerDroneDurationSeconds = new Dictionary<DroneIndex, ConfigEntry<float>>(); private static readonly HashSet<ConfigEntryBase> riskOfOptionsRegisteredEntries = new HashSet<ConfigEntryBase>(); private static readonly Dictionary<PurchaseInteraction, int> originalDroneCosts = new Dictionary<PurchaseInteraction, int>(); private static string cachedTimerExemptValue; private static HashSet<string> cachedTimerExemptTokens; internal static AdjustedDrones Instance { get; private set; } private void Awake() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown Instance = this; Log.Init(((BaseUnityPlugin)this).Logger); TryRegisterColorTomlConverter(); BindConfig(); RegisterRiskOfOptionsOptions(); if (!ModEnabled.Value) { Log.Info("AdjustedDrones is disabled via config (General.Enabled=false). Restart required to apply."); return; } CaptureOriginalDroneCostsIfNeeded(); ((MonoBehaviour)this).StartCoroutine(InitializePerDroneConfigsWhenReady()); CharacterBody.onBodyStartGlobal += OnBodyStartGlobal; BullseyeSearch.GetResults += new hook_GetResults(BullseyeSearch_GetResults); AllyCardController.Awake += new hook_Awake(AllyCardController_Awake); Run.onRunStartGlobal += Run_onRunStartGlobal; } [IteratorStateMachine(typeof(<InitializePerDroneConfigsWhenReady>d__24))] private IEnumerator InitializePerDroneConfigsWhenReady() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <InitializePerDroneConfigsWhenReady>d__24(0) { <>4__this = this }; } private void Run_onRunStartGlobal(Run run) { InitializePerDroneConfigs(); ((MonoBehaviour)this).StartCoroutine(ApplyRunGatedSystems()); } private void OnDestroy() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown CharacterBody.onBodyStartGlobal -= OnBodyStartGlobal; BullseyeSearch.GetResults -= new hook_GetResults(BullseyeSearch_GetResults); AllyCardController.Awake -= new hook_Awake(AllyCardController_Awake); Run.onRunStartGlobal -= Run_onRunStartGlobal; } private void BindConfig() { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable/disable the AdjustedDrones mod. Requires restart."); DisableWhenOperator = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "DisableWhenOperator", false, "If true, this mod is disabled when at least one player is Operator/DroneTech (body name contains 'Operator' or 'DroneTech')."); TimerExemptDrones = ((BaseUnityPlugin)this).Config.Bind<string>("General", "TimerExemptDrones", string.Join("\n", "Drone_11_DroneBomberBodySeconds", "Drone_14_DTGunnerDroneBodySeconds", "Drone_15_DTHaulerDroneBodySeconds", "Drone_16_DTHealingDroneBodySeconds", "Drone_9_DroneCommanderBodySecons"), "List of drone body names (or per-drone config keys like 'Drone_11_DroneBomberBodySeconds') that should NEVER auto-break from the timer. One entry per line."); TimerColor = ((BaseUnityPlugin)this).Config.Bind<Color>("General", "TimerColor", new Color(0.3f, 0.6f, 1f, 1f), "Drone timer UI color."); DisableDroneAggro = ((BaseUnityPlugin)this).Config.Bind<bool>("Aggro", "DisableDroneAggro", true, "If true, enemies will not target player-owned drones/turrets (they won't draw aggro)."); DifficultyExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Scaling", "DifficultyCoefficientExponent", 1f, "Effective duration = baseDuration / ((difficultyCoefficient * multiplier) ^ exponent). Uses Run.difficultyCoefficient only. Updates dynamically as the run difficulty ramps. Set to 0 to disable scaling."); DifficultyCoefficientMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Scaling", "DifficultyCoefficientMultiplier", 1f, "Multiplier applied to Run.difficultyCoefficient before exponentiation. 1 = unchanged."); RepairCostMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Repair", "RepairCostMultiplier", 0.5f, "Multiplier applied to the base repair cost of broken drone interactables 0.5 = half price."); DroneBaseCostMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Repair", "DroneBaseCostMultiplier", 0.5f, "Multiplier applied to the base purchase cost of drone purchase interactables (non-broken). 0.5 = half price."); BindDuration(DroneUptimeRarityTier.White, DroneUptimeTierClass.Utility, 240f); BindDuration(DroneUptimeRarityTier.White, DroneUptimeTierClass.Combat, 180f); BindDuration(DroneUptimeRarityTier.Green, DroneUptimeTierClass.Utility, 180f); BindDuration(DroneUptimeRarityTier.Green, DroneUptimeTierClass.Combat, 135f); BindDuration(DroneUptimeRarityTier.Red, DroneUptimeTierClass.Utility, 120f); BindDuration(DroneUptimeRarityTier.Red, DroneUptimeTierClass.Combat, 90f); } private void InitializePerDroneConfigs() { for (int i = 0; i < DroneCatalog.droneCount; i++) { DroneDef droneDef = DroneCatalog.GetDroneDef((DroneIndex)i); if ((Object)(object)droneDef != (Object)null) { EnsurePerDroneEntry(droneDef); } } } private void ApplyGlobalDroneCostMultipliers() { SetGlobalDroneCosts(active: true); } internal static bool IsModActiveNow() { if (ModEnabled == null || !ModEnabled.Value) { return false; } if (DisableWhenOperator != null && DisableWhenOperator.Value && IsOperatorPlayerPresent()) { return false; } return true; } private static bool IsOperatorPlayerPresent() { //IL_0077: Unknown result type (might be due to invalid IL or missing references) try { ReadOnlyCollection<PlayerCharacterMasterController> instances = PlayerCharacterMasterController.instances; if (instances == null) { return false; } foreach (PlayerCharacterMasterController item in instances) { if (!Object.op_Implicit((Object)(object)item)) { continue; } CharacterMaster master = item.master; CharacterBody val = (Object.op_Implicit((Object)(object)master) ? master.GetBody() : null); if (Object.op_Implicit((Object)(object)val)) { string text = BodyCatalog.GetBodyName(val.bodyIndex); if (string.IsNullOrWhiteSpace(text)) { text = ((Object)val).name; } if (!string.IsNullOrWhiteSpace(text) && (text.IndexOf("Operator", StringComparison.OrdinalIgnoreCase) >= 0 || text.IndexOf("DroneTech", StringComparison.OrdinalIgnoreCase) >= 0)) { return true; } } } } catch { } return false; } [IteratorStateMachine(typeof(<ApplyRunGatedSystems>d__32))] private IEnumerator ApplyRunGatedSystems() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ApplyRunGatedSystems>d__32(0) { <>4__this = this }; } private static void CaptureOriginalDroneCostsIfNeeded() { try { InteractableSpawnCard[] array = Resources.LoadAll<InteractableSpawnCard>("SpawnCards/InteractableSpawnCard"); if (array == null || array.Length == 0) { return; } InteractableSpawnCard[] array2 = array; foreach (InteractableSpawnCard val in array2) { if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)((SpawnCard)val).prefab)) { PurchaseInteraction component = ((SpawnCard)val).prefab.GetComponent<PurchaseInteraction>(); if (Object.op_Implicit((Object)(object)component) && component.isDrone && !originalDroneCosts.ContainsKey(component)) { originalDroneCosts[component] = component.cost; } } } } catch { } } private static void SetGlobalDroneCosts(bool active) { try { InteractableSpawnCard[] array = Resources.LoadAll<InteractableSpawnCard>("SpawnCards/InteractableSpawnCard"); if (array == null || array.Length == 0) { return; } float num = (active ? Mathf.Max(0f, DroneBaseCostMultiplier.Value) : 1f); float num2 = (active ? Mathf.Max(0f, RepairCostMultiplier.Value) : 1f); InteractableSpawnCard[] array2 = array; foreach (InteractableSpawnCard val in array2) { if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)((SpawnCard)val).prefab)) { continue; } PurchaseInteraction component = ((SpawnCard)val).prefab.GetComponent<PurchaseInteraction>(); if (Object.op_Implicit((Object)(object)component) && component.isDrone) { if (!originalDroneCosts.TryGetValue(component, out var value)) { value = component.cost; originalDroneCosts[component] = value; } float num3 = ((!string.IsNullOrEmpty(((Object)val).name) && ((Object)val).name.StartsWith("iscBroken", StringComparison.OrdinalIgnoreCase)) ? num2 : num); component.cost = Mathf.Max(0, Mathf.RoundToInt((float)value * num3)); } } } catch (Exception data) { Log.Error(data); } } private void BindDuration(DroneUptimeRarityTier tier, DroneUptimeTierClass tierClass, float defaultSeconds) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown ConfigEntry<float> val = ((BaseUnityPlugin)this).Config.Bind<float>($"Duration.{tier}", $"{tierClass}Seconds", defaultSeconds, new ConfigDescription("Base active duration in seconds before the drone/turret breaks and requires repair. Set to 0 for infinite duration (no timer UI).", (AcceptableValueBase)null, Array.Empty<object>())); DurationSeconds[(tier, tierClass)] = val; RegisterRiskOfOptionsUnlimitedFloat(val); } internal ConfigEntry<float> EnsurePerDroneEntry(DroneDef droneDef) { //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) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_002b: 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) //IL_0088: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) DroneIndex val = (DroneIndex)((!Object.op_Implicit((Object)(object)droneDef)) ? (-1) : ((int)droneDef.droneIndex)); if ((int)val == -1) { return null; } if (PerDroneDurationSeconds.TryGetValue(val, out var value)) { return value; } string safeDroneConfigKeyName = GetSafeDroneConfigKeyName(droneDef); string droneDisplayNameForConfig = GetDroneDisplayNameForConfig(droneDef); ConfigEntry<float> val2 = ((BaseUnityPlugin)this).Config.Bind<float>("Overrides.PerDrone", safeDroneConfigKeyName + "Seconds", -1f, new ConfigDescription("Per-drone duration override for '" + droneDisplayNameForConfig + "' in seconds. Set to -1 to use the tier/class duration. Set to 0 for infinite duration (no timer UI).", (AcceptableValueBase)null, Array.Empty<object>())); PerDroneDurationSeconds[val] = val2; RegisterRiskOfOptionsUnlimitedFloat(val2); return val2; } private void RegisterRiskOfOptionsOptions() { try { RegisterRiskOfOptionsCheckbox(ModEnabled); RegisterRiskOfOptionsCheckbox(DisableWhenOperator); RegisterRiskOfOptionsStringInput(TimerExemptDrones); RegisterRiskOfOptionsColorPicker(TimerColor); RegisterRiskOfOptionsCheckbox(DisableDroneAggro); RegisterRiskOfOptionsUnlimitedFloat(DifficultyExponent); RegisterRiskOfOptionsUnlimitedFloat(DifficultyCoefficientMultiplier); RegisterRiskOfOptionsUnlimitedFloat(RepairCostMultiplier); RegisterRiskOfOptionsUnlimitedFloat(DroneBaseCostMultiplier); ModSettingsManager.SetModDescription("Adjust drone uptime/duration scaling and drone costs. Includes per-drone overrides."); } catch (Exception data) { Log.Error(data); } } private static void RegisterRiskOfOptionsUnlimitedFloat(ConfigEntry<float> entry) { if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry)) { if (!TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.FloatFieldOption", entry) && !TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.FloatInputFieldOption", entry) && !TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.InputFieldOption", entry)) { Log.Warning("RiskOfOptions float field option not found; skipping menu option for '" + ((ConfigEntryBase)entry).Definition.Section + "." + ((ConfigEntryBase)entry).Definition.Key + "' to avoid imposing an upper limit."); } else { riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry); } } } private static bool TryAddRiskOfOptionsOptionByTypeName(string fullTypeName, object ctorArg) { try { Assembly assembly = typeof(ModSettingsManager).Assembly; Type type = assembly.GetType(fullTypeName, throwOnError: false); if (type == null) { return false; } object obj = Activator.CreateInstance(type, ctorArg); if (obj == null) { return false; } MethodInfo methodInfo = typeof(ModSettingsManager).GetMethods(BindingFlags.Static | BindingFlags.Public).FirstOrDefault((MethodInfo m) => m.Name == "AddOption" && m.GetParameters().Length == 1); if (methodInfo == null) { return false; } methodInfo.Invoke(null, new object[1] { obj }); return true; } catch { return false; } } private static void RegisterRiskOfOptionsCheckbox(ConfigEntry<bool> entry) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry)) { ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(entry)); riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry); } } private static void RegisterRiskOfOptionsStringInput(ConfigEntry<string> entry) { if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry) && (TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.StringInputFieldOption", entry) || TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.InputFieldOption", entry))) { riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry); } } internal static bool IsDroneExemptFromTimer(DroneDef droneDef) { if (!Object.op_Implicit((Object)(object)droneDef)) { return false; } string text = TimerExemptDrones?.Value ?? string.Empty; if (!string.Equals(text, cachedTimerExemptValue, StringComparison.Ordinal)) { cachedTimerExemptValue = text; cachedTimerExemptTokens = ParseTimerExemptTokens(text); } if (cachedTimerExemptTokens == null || cachedTimerExemptTokens.Count == 0) { return false; } string s = (Object.op_Implicit((Object)(object)droneDef.bodyPrefab) ? ((Object)droneDef.bodyPrefab).name : string.Empty); string safeDroneConfigKeyName = GetSafeDroneConfigKeyName(droneDef); return cachedTimerExemptTokens.Contains(NormalizeToken(s)) || cachedTimerExemptTokens.Contains(NormalizeToken(safeDroneConfigKeyName)) || cachedTimerExemptTokens.Contains(NormalizeToken(safeDroneConfigKeyName + "Seconds")); } private static HashSet<string> ParseTimerExemptTokens(string raw) { HashSet<string> hashSet = new HashSet<string>(StringComparer.Ordinal); if (string.IsNullOrWhiteSpace(raw)) { return hashSet; } string[] array = raw.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); string[] array2 = array; foreach (string s in array2) { string text = NormalizeToken(s); if (text.Length == 0) { continue; } text = StripSuffix(text, "seconds"); text = StripSuffix(text, "secons"); hashSet.Add(text); if (!text.StartsWith("drone_", StringComparison.Ordinal)) { continue; } int num = text.IndexOf('_', "drone_".Length); if (num >= 0 && num + 1 < text.Length) { string text2 = text.Substring(num + 1); if (text2.Length > 0) { hashSet.Add(text2); } } } return hashSet; } private static string NormalizeToken(string s) { if (string.IsNullOrWhiteSpace(s)) { return string.Empty; } return s.Trim().ToLowerInvariant(); } private static string StripSuffix(string s, string suffix) { if (s != null && suffix != null && s.EndsWith(suffix, StringComparison.Ordinal)) { return s.Substring(0, s.Length - suffix.Length); } return s; } private static void RegisterRiskOfOptionsColorPicker(ConfigEntry<Color> entry) { if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry) && (TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.ColorOption", entry) || TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.ColorPickerOption", entry) || TryAddRiskOfOptionsOptionByHeuristic(entry))) { riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry); } } private static bool TryAddRiskOfOptionsOptionByHeuristic(object entry) { try { Assembly assembly = typeof(ModSettingsManager).Assembly; Type entryType = entry.GetType(); Type[] array = (from t in assembly.GetTypes() where t != null && string.Equals(t.Namespace, "RiskOfOptions.Options", StringComparison.Ordinal) && t.Name.IndexOf("Color", StringComparison.OrdinalIgnoreCase) >= 0 select t).ToArray(); Type[] array2 = array; foreach (Type type in array2) { ConstructorInfo constructorInfo = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public).FirstOrDefault(delegate(ConstructorInfo c) { ParameterInfo[] parameters = c.GetParameters(); return parameters.Length == 1 && parameters[0].ParameterType.IsAssignableFrom(entryType); }); if (constructorInfo == null) { continue; } object obj = constructorInfo.Invoke(new object[1] { entry }); if (obj != null) { MethodInfo methodInfo = typeof(ModSettingsManager).GetMethods(BindingFlags.Static | BindingFlags.Public).FirstOrDefault((MethodInfo m) => m.Name == "AddOption" && m.GetParameters().Length == 1); if (methodInfo == null) { return false; } methodInfo.Invoke(null, new object[1] { obj }); return true; } } } catch { } return false; } private static void TryRegisterColorTomlConverter() { try { Type typeFromHandle = typeof(TomlTypeConverter); MethodInfo methodInfo = typeFromHandle.GetMethods(BindingFlags.Static | BindingFlags.Public).FirstOrDefault((MethodInfo m) => m.Name == "AddConverter" && m.GetParameters().Length == 2); if (!(methodInfo == null)) { methodInfo.Invoke(null, new object[2] { typeof(Color), new UnityColorTypeConverter() }); } } catch { } } private static string GetDroneDisplayNameForConfig(DroneDef droneDef) { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected I4, but got Unknown if (!Object.op_Implicit((Object)(object)droneDef)) { return "Unknown Drone"; } if (!string.IsNullOrWhiteSpace(droneDef.nameToken)) { string @string = Language.GetString(droneDef.nameToken); if (!string.IsNullOrWhiteSpace(@string)) { return @string; } return droneDef.nameToken; } if (Object.op_Implicit((Object)(object)droneDef.bodyPrefab)) { return ((Object)droneDef.bodyPrefab).name; } return $"Drone {(int)droneDef.droneIndex}"; } private static string GetSafeDroneConfigKeyName(DroneDef droneDef) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected I4, but got Unknown string arg = "UnknownBody"; if (Object.op_Implicit((Object)(object)droneDef) && Object.op_Implicit((Object)(object)droneDef.bodyPrefab)) { arg = ((Object)droneDef.bodyPrefab).name; } return $"Drone_{(int)droneDef.droneIndex}_{arg}"; } private void OnBodyStartGlobal(CharacterBody body) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Invalid comparison between Unknown and I4 //IL_00af: Unknown result type (might be due to invalid IL or missing references) //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) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Invalid comparison between Unknown and I4 //IL_00eb: Unknown result type (might be due to invalid IL or missing references) try { if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.teamComponent) || (int)body.teamComponent.teamIndex != 1 || !Object.op_Implicit((Object)(object)body.master) || !Object.op_Implicit((Object)(object)body.master.minionOwnership) || !Object.op_Implicit((Object)(object)body.master.minionOwnership.ownerMaster) || !Object.op_Implicit((Object)(object)body.master.minionOwnership.ownerMaster.playerCharacterMasterController)) { return; } DroneIndex droneIndexFromBodyIndex = DroneCatalog.GetDroneIndexFromBodyIndex(body.bodyIndex); if ((int)droneIndexFromBodyIndex != -1) { DroneUptimeTimer droneUptimeTimer = ((Component)body).GetComponent<DroneUptimeTimer>(); if (!Object.op_Implicit((Object)(object)droneUptimeTimer)) { droneUptimeTimer = ((Component)body).gameObject.AddComponent<DroneUptimeTimer>(); } DroneDef droneDef = DroneCatalog.GetDroneDef(droneIndexFromBodyIndex); EnsurePerDroneEntry(droneDef); droneUptimeTimer.Configure(droneDef); } } catch (Exception data) { Log.Error(data); } } private IEnumerable<HurtBox> BullseyeSearch_GetResults(orig_GetResults orig, BullseyeSearch self) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Invalid comparison between Unknown and I4 IEnumerable<HurtBox> enumerable = orig.Invoke(self); if (!IsModActiveNow() || !DisableDroneAggro.Value) { return enumerable; } if (self == null || (Object)(object)self.viewer == (Object)null || (Object)(object)self.viewer.teamComponent == (Object)null) { return enumerable; } if ((int)self.viewer.teamComponent.teamIndex == 1) { return enumerable; } if (!(enumerable is HurtBox[] array) || array.Length == 0) { return enumerable; } return array.Where((HurtBox hb) => !ShouldIgnoreAsTarget(hb)).ToArray(); } private static bool ShouldIgnoreAsTarget(HurtBox hb) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Invalid comparison between Unknown and I4 if (!Object.op_Implicit((Object)(object)hb) || (int)hb.teamIndex != 1) { return false; } HealthComponent healthComponent = hb.healthComponent; if (!Object.op_Implicit((Object)(object)healthComponent) || !Object.op_Implicit((Object)(object)healthComponent.body)) { return false; } CharacterBody body = healthComponent.body; if ((int)DroneCatalog.GetDroneIndexFromBodyIndex(body.bodyIndex) == -1) { return false; } CharacterMaster master = body.master; if (!Object.op_Implicit((Object)(object)master) || Object.op_Implicit((Object)(object)master.playerCharacterMasterController)) { return false; } if (!Object.op_Implicit((Object)(object)master.minionOwnership) || !Object.op_Implicit((Object)(object)master.minionOwnership.ownerMaster)) { return false; } return Object.op_Implicit((Object)(object)master.minionOwnership.ownerMaster.playerCharacterMasterController); } private void AllyCardController_Awake(orig_Awake orig, AllyCardController self) { orig.Invoke(self); if (Object.op_Implicit((Object)(object)self) && IsModActiveNow() && !Object.op_Implicit((Object)(object)((Component)self).GetComponent<DroneUptimeAllyCardOverlay>())) { ((Component)self).gameObject.AddComponent<DroneUptimeAllyCardOverlay>(); } } } internal enum DroneUptimeTierClass { Utility, Combat } internal enum DroneUptimeRarityTier { White, Green, Red } internal static class DroneUptimeDuration { public static float ComputeBaseDurationSeconds(DroneDef droneDef) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_0048: Expected I4, but got Unknown //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Invalid comparison between Unknown and I4 if (AdjustedDrones.IsDroneExemptFromTimer(droneDef)) { return 0f; } DroneUptimeRarityTier item = DroneUptimeRarityTier.Green; if (Object.op_Implicit((Object)(object)droneDef)) { ItemTier tier = droneDef.tier; if (1 == 0) { } DroneUptimeRarityTier droneUptimeRarityTier = (int)tier switch { 0 => DroneUptimeRarityTier.White, 1 => DroneUptimeRarityTier.Green, 2 => DroneUptimeRarityTier.Red, _ => DroneUptimeRarityTier.Green, }; if (1 == 0) { } item = droneUptimeRarityTier; } if (!AdjustedDrones.IsModActiveNow()) { return 0f; } DroneUptimeTierClass item2 = DroneUptimeTierClass.Utility; if (Object.op_Implicit((Object)(object)droneDef) && (int)droneDef.droneType == 1) { item2 = DroneUptimeTierClass.Combat; } if (Object.op_Implicit((Object)(object)droneDef)) { AdjustedDrones instance = AdjustedDrones.Instance; ConfigEntry<float> val = (Object.op_Implicit((Object)(object)instance) ? instance.EnsurePerDroneEntry(droneDef) : null); if (val != null && val.Value >= 0f) { return Mathf.Max(0f, val.Value); } } float result = 180f; if (AdjustedDrones.DurationSeconds.TryGetValue((item, item2), out var value)) { result = Mathf.Max(0f, value.Value); } return result; } public static float GetScaledDurationSeconds(float baseSeconds) { float num = 1f; if (Object.op_Implicit((Object)(object)Run.instance)) { num = Mathf.Max(1f, Run.instance.difficultyCoefficient); } float num2 = Mathf.Max(0f, AdjustedDrones.DifficultyCoefficientMultiplier.Value); num = Mathf.Max(1f, num * num2); float num3 = Mathf.Max(0f, AdjustedDrones.DifficultyExponent.Value); float num4 = ((num3 <= 0f) ? 1f : Mathf.Pow(num, num3)); return (num4 <= 0f) ? baseSeconds : (baseSeconds / num4); } } internal sealed class DroneUptimeTimer : MonoBehaviour { private float baseDuration; private HealthComponent health; private bool configured; private bool broke; public float duration => DroneUptimeDuration.GetScaledDurationSeconds(baseDuration); public float age { get; private set; } public DroneDef droneDef { get; private set; } public float remaining => Mathf.Max(0f, duration - age); public float remainingFraction => (duration > 0f) ? Mathf.Clamp01(remaining / duration) : 0f; public void Configure(DroneDef def) { droneDef = def; baseDuration = DroneUptimeDuration.ComputeBaseDurationSeconds(def); age = 0f; configured = true; broke = false; } private void Start() { ((Component)this).TryGetComponent<HealthComponent>(ref health); } private void Update() { if (!AdjustedDrones.IsModActiveNow() || !configured) { return; } float num = duration; if (num <= 0f) { return; } age += Time.deltaTime; if (!broke && age >= num) { broke = true; if (NetworkServer.active) { BreakToRepair(); } } } [Server] private void BreakToRepair() { if (Object.op_Implicit((Object)(object)health) && Object.op_Implicit((Object)(object)health.body)) { CharacterBody body = health.body; DroneDef val = droneDef; if (IsMegaDrone(body, val)) { DroneUptimeRepairSpawner.SpawnBrokenAndRemove(body, val); } else if (Object.op_Implicit((Object)(object)body.master)) { body.master.TrueKill(); } } } private static bool IsMegaDrone(CharacterBody body, DroneDef droneDef) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)body)) { return false; } string bodyName = BodyCatalog.GetBodyName(body.bodyIndex); if (!string.IsNullOrEmpty(bodyName) && bodyName.Contains("MegaDrone")) { return true; } if (((Object)body).name.Contains("MegaDrone")) { return true; } return false; } } internal sealed class DroneUptimeAllyCardOverlay : MonoBehaviour { private AllyCardController allyCard; private RectTransform portraitRect; private GameObject timerRoot; private GameObject tempItemIndicatorInstance; private Image timerImage; private TextMeshProUGUI fallbackText; private static bool triedLoadTempItemIndicator; private static GameObject cachedTempItemIndicatorPrefab; private void Awake() { allyCard = ((Component)this).GetComponent<AllyCardController>(); TryBuildUi(); } private void TryBuildUi() { //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown //IL_0133: 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_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Expected O, but got Unknown //IL_02f3: Unknown result type (might be due to invalid IL or missing references) //IL_02fa: Expected O, but got Unknown //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_031d: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_0341: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Invalid comparison between Unknown and I4 if (!Object.op_Implicit((Object)(object)allyCard) || !Object.op_Implicit((Object)(object)allyCard.portraitIconImage)) { return; } portraitRect = ((Component)allyCard.portraitIconImage).GetComponent<RectTransform>(); if (!Object.op_Implicit((Object)(object)portraitRect)) { return; } if (!triedLoadTempItemIndicator) { triedLoadTempItemIndicator = true; try { GameObject hiddenPickupDisplayPrefab = PickupCatalog.GetHiddenPickupDisplayPrefab(); PickupDisplay val = (Object.op_Implicit((Object)(object)hiddenPickupDisplayPrefab) ? hiddenPickupDisplayPrefab.GetComponentInChildren<PickupDisplay>(true) : null); cachedTempItemIndicatorPrefab = (Object.op_Implicit((Object)(object)val) ? val.temporaryItemIndicator : null); } catch { cachedTempItemIndicatorPrefab = null; } } if (!Object.op_Implicit((Object)(object)timerRoot)) { timerRoot = new GameObject("DroneUptimeTimer", new Type[1] { typeof(RectTransform) }); timerRoot.transform.SetParent((Transform)(object)portraitRect, false); timerRoot.transform.SetAsLastSibling(); RectTransform val2 = (RectTransform)timerRoot.transform; val2.anchorMin = new Vector2(0f, 0f); val2.anchorMax = new Vector2(0f, 0f); val2.pivot = new Vector2(0f, 0f); val2.anchoredPosition = new Vector2(0f, 0f); val2.sizeDelta = new Vector2(18f, 18f); } if (!Object.op_Implicit((Object)(object)tempItemIndicatorInstance) && Object.op_Implicit((Object)(object)cachedTempItemIndicatorPrefab)) { tempItemIndicatorInstance = Object.Instantiate<GameObject>(cachedTempItemIndicatorPrefab, timerRoot.transform, false); ((Object)tempItemIndicatorInstance).name = "TempItemIndicator"; tempItemIndicatorInstance.transform.localPosition = Vector3.zero; tempItemIndicatorInstance.transform.localRotation = Quaternion.identity; tempItemIndicatorInstance.transform.localScale = Vector3.one; Image[] componentsInChildren = tempItemIndicatorInstance.GetComponentsInChildren<Image>(true); Image[] array = componentsInChildren; foreach (Image val3 in array) { if (Object.op_Implicit((Object)(object)val3) && (int)val3.type == 3) { timerImage = val3; break; } } ApplyTimerColorIfConfigured(); } if (!Object.op_Implicit((Object)(object)timerImage) && !Object.op_Implicit((Object)(object)fallbackText)) { GameObject val4 = new GameObject("FallbackTimerText", new Type[1] { typeof(RectTransform) }); val4.transform.SetParent(timerRoot.transform, false); RectTransform val5 = (RectTransform)val4.transform; val5.anchorMin = new Vector2(0f, 0f); val5.anchorMax = new Vector2(1f, 1f); val5.pivot = new Vector2(0.5f, 0.5f); val5.anchoredPosition = Vector2.zero; val5.sizeDelta = Vector2.zero; fallbackText = val4.AddComponent<TextMeshProUGUI>(); ((TMP_Text)fallbackText).fontSize = 12f; ((Graphic)fallbackText).color = new Color(0.3f, 0.6f, 1f, 1f); ((TMP_Text)fallbackText).alignment = (TextAlignmentOptions)514; ((TMP_Text)fallbackText).enableWordWrapping = false; ((Graphic)fallbackText).raycastTarget = false; ApplyTimerColorIfConfigured(); } } private void ApplyTimerColorIfConfigured() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) ConfigEntry<Color> timerColor = AdjustedDrones.TimerColor; if (timerColor != null) { Color value = timerColor.Value; if (Object.op_Implicit((Object)(object)timerImage)) { ((Graphic)timerImage).color = value; } if (Object.op_Implicit((Object)(object)fallbackText)) { ((Graphic)fallbackText).color = value; } } } private void LateUpdate() { //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Invalid comparison between Unknown and I4 if (!Object.op_Implicit((Object)(object)timerImage) && !Object.op_Implicit((Object)(object)fallbackText)) { TryBuildUi(); } ApplyTimerColorIfConfigured(); if (!Object.op_Implicit((Object)(object)allyCard)) { return; } CharacterMaster sourceMaster = allyCard.sourceMaster; CharacterBody val = (Object.op_Implicit((Object)(object)sourceMaster) ? sourceMaster.GetBody() : null); if (!Object.op_Implicit((Object)(object)val)) { if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance)) { tempItemIndicatorInstance.SetActive(false); } if (Object.op_Implicit((Object)(object)fallbackText)) { ((Behaviour)fallbackText).enabled = false; } return; } DroneUptimeTimer component = ((Component)val).GetComponent<DroneUptimeTimer>(); if (!Object.op_Implicit((Object)(object)component)) { if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance)) { tempItemIndicatorInstance.SetActive(false); } if (Object.op_Implicit((Object)(object)fallbackText)) { ((Behaviour)fallbackText).enabled = false; } } else if (component.duration <= 0f) { if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance)) { tempItemIndicatorInstance.SetActive(false); } if (Object.op_Implicit((Object)(object)fallbackText)) { ((Behaviour)fallbackText).enabled = false; } } else if ((int)DroneCatalog.GetDroneIndexFromBodyIndex(val.bodyIndex) == -1) { if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance)) { tempItemIndicatorInstance.SetActive(false); } if (Object.op_Implicit((Object)(object)fallbackText)) { ((Behaviour)fallbackText).enabled = false; } } else if (Object.op_Implicit((Object)(object)timerImage)) { if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance)) { tempItemIndicatorInstance.SetActive(true); } timerImage.fillAmount = component.remainingFraction; if (Object.op_Implicit((Object)(object)fallbackText)) { ((Behaviour)fallbackText).enabled = false; } } else if (Object.op_Implicit((Object)(object)fallbackText)) { ((Behaviour)fallbackText).enabled = true; float remaining = component.remaining; int num = Mathf.FloorToInt(remaining / 60f); int num2 = Mathf.FloorToInt(remaining % 60f); ((TMP_Text)fallbackText).text = $"{num}:{num2:00}"; } } } internal static class DroneUptimeRepairSpawner { [Server] public static void SpawnBrokenAndRemove(CharacterBody droneBody, DroneDef droneDef) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_0082: 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) //IL_008b: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Invalid comparison between Unknown and I4 if (!NetworkServer.active || !Object.op_Implicit((Object)(object)droneBody)) { return; } SpawnCard brokenDroneSpawnCard = GetBrokenDroneSpawnCard(droneBody, droneDef); if ((Object)(object)brokenDroneSpawnCard != (Object)null && Object.op_Implicit((Object)(object)DirectorCore.instance)) { Vector3 position = FindGround(droneBody.corePosition, droneBody.radius) + Vector3.up * 0.25f; DirectorPlacementRule val = new DirectorPlacementRule { placementMode = (PlacementMode)0, position = position }; Xoroshiro128Plus val2 = (((Object)(object)Run.instance != (Object)null) ? new Xoroshiro128Plus(Run.instance.seed + (ulong)Run.instance.fixedTime) : new Xoroshiro128Plus(0uL)); GameObject val3 = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(brokenDroneSpawnCard, val, val2)); if (Object.op_Implicit((Object)(object)val3)) { PurchaseInteraction component = val3.GetComponent<PurchaseInteraction>(); if (Object.op_Implicit((Object)(object)component) && (int)component.costType == 1 && Object.op_Implicit((Object)(object)Run.instance)) { component.Networkcost = Mathf.RoundToInt((float)Run.instance.GetDifficultyScaledCost(component.cost)); } } } CharacterMaster master = droneBody.master; if (Object.op_Implicit((Object)(object)master)) { master.TrueKill(); } else { NetworkServer.Destroy(((Component)droneBody).gameObject); } } private static SpawnCard GetBrokenDroneSpawnCard(CharacterBody droneBody, DroneDef droneDef) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)droneDef) && Object.op_Implicit((Object)(object)droneDef.droneBrokenSpawnCard)) { return droneDef.droneBrokenSpawnCard; } string text = BodyCatalog.GetBodyName(droneBody.bodyIndex); if (string.IsNullOrWhiteSpace(text)) { text = ((Object)droneBody).name; } text = text.Replace("Body", ""); string text2 = "iscBroken" + text; return LegacyResourcesAPI.Load<SpawnCard>("SpawnCards/InteractableSpawnCard/" + text2); } private static Vector3 FindGround(Vector3 origin, float radius) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_008f: Unknown result type (might be due to invalid IL or missing references) Vector3 val = origin + Vector3.up * 200f; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, Vector3.down, ref val2, 1200f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask), (QueryTriggerInteraction)1)) { return ((RaycastHit)(ref val2)).point; } float num = Mathf.Max(0.25f, radius); if (Physics.SphereCast(val, num, Vector3.down, ref val2, 1200f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask), (QueryTriggerInteraction)1)) { return ((RaycastHit)(ref val2)).point; } return origin; } } 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); } } }