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 EngiTurretEquipment v1.0.1
plugins/EngiTurretEquipment/EngiTurretEquipment.dll
Decompiled 5 months agousing System; using System.Collections; 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 EngiTurretEquipment.Components; using EngiTurretEquipment.Equipment; using EngiTurretEquipment.Modules; using IL.RoR2.Projectile; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API; using R2API.Utils; using RoR2; using RoR2.CharacterAI; using RoR2.ContentManagement; using RoR2.ExpansionManagement; using RoR2.Navigation; using RoR2.Projectile; 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: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("EngiTurretEquipment")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("EngiTurretEquipment")] [assembly: AssemblyTitle("EngiTurretEquipment")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace EngiTurretEquipment { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.Moffein.EngiTurretEquipment", "EngiTurretEquipment", "1.0.0")] public class EngiTurretEquipmentPlugin : BaseUnityPlugin { public static PluginInfo PInfo; public static List<EquipmentBase> Equipments = new List<EquipmentBase>(); public static Action onFinishScanning; internal void Awake() { PInfo = ((BaseUnityPlugin)this).Info; new PluginContentPack().Initialize(); Assets.LoadAssetBundle(); LanguageOverrides.Initialize(); AddToAssembly(); } private void AddToAssembly() { IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(EquipmentBase)) select type; List<string> list = new List<string>(); List<EquipmentBase> list2 = new List<EquipmentBase>(); foreach (Type item in enumerable) { EquipmentBase equipmentBase = (EquipmentBase)Activator.CreateInstance(item); if (equipmentBase.ParentEquipmentName != null) { list2.Add(equipmentBase); } else if (ValidateEquipment(equipmentBase, Equipments)) { equipmentBase.Init(((BaseUnityPlugin)this).Config); list.Add(equipmentBase.EquipmentName); } } foreach (EquipmentBase item2 in list2) { if (list.Contains(item2.ParentEquipmentName)) { item2.Init(((BaseUnityPlugin)this).Config); } } onFinishScanning?.Invoke(); } public bool ValidateEquipment(EquipmentBase equipment, List<EquipmentBase> equipmentList) { string text = "Should this equipment appear in runs?"; if (equipment.Unfinished) { text = "UNFINISHED! " + text; } if (((BaseUnityPlugin)this).Config.Bind<bool>(equipment.ConfigCategory, "Enable Equipment?", true, text).Value) { equipmentList.Add(equipment); return true; } return false; } } internal static class PluginUtils { internal static bool SetAddressableEntityStateField(string fullEntityStatePath, string fieldName, string value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)fullEntityStatePath).WaitForCompletion(); for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++) { if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName) { val.serializedFieldsCollection.serializedFields[i].fieldValue.stringValue = value; return true; } } return false; } } } namespace EngiTurretEquipment.Modules { public static class Assets { public static AssetBundle mainAssetBundle; internal static void LoadAssetBundle() { if ((Object)(object)mainAssetBundle == (Object)null) { using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EngiTurretEquipment.engiturretequipmentbundle")) { mainAssetBundle = AssetBundle.LoadFromStream(stream); } } } } internal class LanguageOverrides { public struct ReplacementToken { public string assignedToken; public string formatToken; public object[] args; } public const string LanguageTokenPrefix = "ENGITURRETEQUIPMENT_"; public const string LanguageTokenPrefixArtifact = "ENGITURRETEQUIPMENT_ARTIFACT_"; public const string LanguageTokenPrefixItem = "ENGITURRETEQUIPMENT_ITEM_"; public const string LanguageTokenPrefixEquipment = "ENGITURRETEQUIPMENT_EQUIPMENT_"; public const string LanguageTokenPrefixEliteEquipment = "ENGITURRETEQUIPMENT_ELITE_EQUIPMENT_"; public const string LanguageTokenPrefixElite = "ENGITURRETEQUIPMENT_ELITE_"; public const string LanguageTokenPrefixBuffs = "ENGITURRETEQUIPMENT_BUFF_"; public static List<ReplacementToken> replacementTokens = new List<ReplacementToken>(); public static List<ReplacementToken> postReplacementTokens = new List<ReplacementToken>(); public static List<Type> configEntries = new List<Type>(); public static Dictionary<string, string> logbookTokenOverrideDict = new Dictionary<string, string>(); public static void DeferToken(string token, params object[] args) { replacementTokens.Add(new ReplacementToken { assignedToken = token, formatToken = token, args = args }); } public static void DeferLateTokens(string token, params object[] args) { postReplacementTokens.Add(new ReplacementToken { assignedToken = token, formatToken = token, args = args }); } public static void DeferUniqueToken(string assignedToken, string formatToken, params object[] args) { replacementTokens.Add(new ReplacementToken { assignedToken = assignedToken, formatToken = formatToken, args = args }); } public static void DeferLateUniqueTokens(string assignedToken, string formatToken, params object[] args) { postReplacementTokens.Add(new ReplacementToken { assignedToken = assignedToken, formatToken = formatToken, args = args }); } public static void Initialize() { Language.collectLanguageRootFolders += CollectLanguageRootFolders; Language.onCurrentLanguageChanged += Language_onCurrentLanguageChanged; } private static void Language_onCurrentLanguageChanged() { Language currentLanguage = Language.currentLanguage; foreach (ReplacementToken replacementToken in replacementTokens) { string localizedFormattedStringByToken = currentLanguage.GetLocalizedFormattedStringByToken(replacementToken.formatToken, replacementToken.args); currentLanguage.SetStringByToken(replacementToken.assignedToken, localizedFormattedStringByToken); } foreach (ReplacementToken postReplacementToken in postReplacementTokens) { List<string> list = new List<string>(); object[] args = postReplacementToken.args; foreach (object obj in args) { list.Add(currentLanguage.GetLocalizedStringByToken(obj.ToString())); string text = postReplacementToken.formatToken; if (postReplacementToken.assignedToken == null || postReplacementToken.assignedToken != postReplacementToken.formatToken) { text = postReplacementToken.assignedToken; } string formatToken = postReplacementToken.formatToken; object[] array = list.ToArray(); string localizedFormattedStringByToken2 = currentLanguage.GetLocalizedFormattedStringByToken(formatToken, array); currentLanguage.SetStringByToken(text, localizedFormattedStringByToken2); } } } private static void CollectLanguageRootFolders(List<string> folders) { folders.Add(Path.Combine(Path.GetDirectoryName(EngiTurretEquipmentPlugin.PInfo.Location), "Language")); } } public class PluginContentPack : IContentPackProvider { [CompilerGenerated] private sealed class <FinalizeAsync>d__10 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public FinalizeAsyncArgs args; public PluginContentPack <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <FinalizeAsync>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; args.ReportProgress(1f); 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 <GenerateContentPackAsync>d__11 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public GetContentPackAsyncArgs args; public PluginContentPack <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GenerateContentPackAsync>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; ContentPack.Copy(content, args.output); 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 <LoadStaticContentAsync>d__12 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public LoadStaticContentAsyncArgs args; public PluginContentPack <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadStaticContentAsync>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; content.networkedObjectPrefabs.Add(networkedObjectPrefabs.ToArray()); content.bodyPrefabs.Add(bodyPrefabs.ToArray()); content.masterPrefabs.Add(masterPrefabs.ToArray()); content.equipmentDefs.Add(equipmentDefs.ToArray()); content.projectilePrefabs.Add(projectilePrefabs.ToArray()); 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 static ContentPack content = new ContentPack(); public static List<GameObject> networkedObjectPrefabs = new List<GameObject>(); public static List<GameObject> bodyPrefabs = new List<GameObject>(); public static List<GameObject> masterPrefabs = new List<GameObject>(); public static List<GameObject> projectilePrefabs = new List<GameObject>(); public static List<EquipmentDef> equipmentDefs = new List<EquipmentDef>(); public string identifier => "EngiTurretEquipment.content"; internal void Initialize() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(ContentManager_collectContentPackProviders); } private void ContentManager_collectContentPackProviders(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)this); } [IteratorStateMachine(typeof(<FinalizeAsync>d__10))] public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <FinalizeAsync>d__10(0) { <>4__this = this, args = args }; } [IteratorStateMachine(typeof(<GenerateContentPackAsync>d__11))] public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GenerateContentPackAsync>d__11(0) { <>4__this = this, args = args }; } [IteratorStateMachine(typeof(<LoadStaticContentAsync>d__12))] public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadStaticContentAsync>d__12(0) { <>4__this = this, args = args }; } } } namespace EngiTurretEquipment.Equipment { public abstract class EquipmentBase<T> : EquipmentBase where T : EquipmentBase<T> { public static T Instance { get; private set; } public EquipmentBase() { if (Instance != null) { throw new InvalidOperationException("Singleton class \"" + typeof(T).Name + "\" inheriting EquipmentBoilerplate/Equipment was instantiated twice"); } Instance = this as T; } } public abstract class EquipmentBase { public EquipmentDef EquipmentDef; public GameObject ItemBodyModelPrefab; public abstract string EquipmentName { get; } public abstract string EquipmentLangTokenName { get; } public virtual string EquipmentPickupToken => "ENGITURRETEQUIPMENT_EQUIPMENT_" + EquipmentLangTokenName + "_PICKUP"; public virtual object[] EquipmentPickupDescParams { get; } public virtual string EquipmentDescriptionToken => "ENGITURRETEQUIPMENT_EQUIPMENT_" + EquipmentLangTokenName + "_DESCRIPTION"; public virtual object[] EquipmentFullDescriptionParams { get; } public virtual string EquipmentUniquePickupToken { get; } public virtual string EquipmentUniqueDescriptionToken { get; } public abstract GameObject EquipmentModel { get; } public abstract Sprite EquipmentIcon { get; } public virtual bool AppearsInSinglePlayer { get; } = true; public virtual bool AppearsInMultiPlayer { get; } = true; public virtual bool CanDrop { get; } = true; public virtual float Cooldown { get; } = 60f; public virtual bool EnigmaCompatible { get; } = true; public virtual bool IsBoss { get; } = false; public virtual bool IsLunar { get; } = false; public virtual bool CanBeRandomlyTriggered { get; } = true; public virtual EquipmentBase DependentEquipment { get; } = null; public virtual string ParentEquipmentName { get; } = null; public virtual ExpansionDef ExpansionDef { get; } public virtual bool Unfinished { get; } = false; public string ConfigCategory => "Equipment: " + EquipmentName; public abstract ItemDisplayRuleDict CreateItemDisplayRules(); public virtual void Init(ConfigFile config) { CreateConfig(config); CreateAssets(config); CreateLang(); CreateEquipment(); Hooks(); } public virtual void CreateAssets(ConfigFile config) { } protected virtual void CreateConfig(ConfigFile config) { } protected virtual void CreateCraftableDef() { } protected virtual void CreateLang() { object[] equipmentPickupDescParams = EquipmentPickupDescParams; bool flag = equipmentPickupDescParams != null && equipmentPickupDescParams.Length != 0; object[] equipmentFullDescriptionParams = EquipmentFullDescriptionParams; bool flag2 = equipmentFullDescriptionParams != null && equipmentFullDescriptionParams.Length != 0; if (flag2 && flag) { return; } if (flag) { if (Utility.IsNullOrWhiteSpace(EquipmentUniquePickupToken)) { LanguageOverrides.DeferToken(EquipmentPickupToken, EquipmentPickupDescParams); } else { LanguageOverrides.DeferUniqueToken(EquipmentUniquePickupToken, EquipmentPickupToken, EquipmentPickupDescParams); } } if (flag2) { if (Utility.IsNullOrWhiteSpace(EquipmentUniqueDescriptionToken)) { LanguageOverrides.DeferToken(EquipmentDescriptionToken, EquipmentFullDescriptionParams); } else { LanguageOverrides.DeferUniqueToken(EquipmentUniqueDescriptionToken, EquipmentDescriptionToken, EquipmentFullDescriptionParams); } } } protected void CreateEquipment() { //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Expected O, but got Unknown //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) string text = "ENGITURRETEQUIPMENT_EQUIPMENT_"; EquipmentDef = ScriptableObject.CreateInstance<EquipmentDef>(); ((Object)EquipmentDef).name = text + EquipmentLangTokenName; EquipmentDef.nameToken = text + EquipmentLangTokenName + "_NAME"; EquipmentDef.pickupToken = EquipmentPickupToken; EquipmentDef.descriptionToken = EquipmentDescriptionToken; EquipmentDef.loreToken = text + EquipmentLangTokenName + "_LORE"; EquipmentDef.pickupModelPrefab = EquipmentModel; EquipmentDef.pickupIconSprite = EquipmentIcon; EquipmentDef.appearsInSinglePlayer = AppearsInSinglePlayer; EquipmentDef.appearsInMultiPlayer = AppearsInMultiPlayer; EquipmentDef.canDrop = CanDrop; EquipmentDef.cooldown = Cooldown; EquipmentDef.enigmaCompatible = EnigmaCompatible; EquipmentDef.isBoss = IsBoss; EquipmentDef.isLunar = IsLunar; EquipmentDef.canBeRandomlyTriggered = CanBeRandomlyTriggered; if (Object.op_Implicit((Object)(object)ExpansionDef)) { EquipmentDef.requiredExpansion = ExpansionDef; } if (IsLunar) { EquipmentDef.colorIndex = (ColorIndex)4; } ItemAPI.Add(new CustomEquipment(EquipmentDef, CreateItemDisplayRules())); EquipmentSlot.PerformEquipmentAction += new hook_PerformEquipmentAction(PerformEquipmentAction); } private bool PerformEquipmentAction(orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) { if ((Object)(object)equipmentDef == (Object)(object)EquipmentDef) { return ActivateEquipment(self); } return orig.Invoke(self, equipmentDef); } protected abstract bool ActivateEquipment(EquipmentSlot slot); public virtual void Hooks() { } } public class StationaryTurret : EquipmentBase<StationaryTurret> { private static GameObject _equipmentModel; public static GameObject bodyPrefab; public static GameObject masterPrefab; public static GameObject projectilePrefab; public static CharacterSpawnCard spawnCard; public static float _cooldown; public static float baseHealth; public static float baseDamage; public static float baseRegen; public static int maxActive; public override string EquipmentName => "Stationary Turret"; public override string EquipmentLangTokenName => "STATIONARY"; public override GameObject EquipmentModel => GetEquipmentModel(); public override Sprite EquipmentIcon => Assets.mainAssetBundle.LoadAsset<Sprite>("texEngiTurretEquipmentIcon.png"); public override float Cooldown => _cooldown; public override ItemDisplayRuleDict CreateItemDisplayRules() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0037: 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_006f: 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_008a: 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) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) ItemDisplayRuleDict val = new ItemDisplayRuleDict(Array.Empty<ItemDisplayRule>()); GameObject equipmentModel = EquipmentModel; if (!Object.op_Implicit((Object)(object)equipmentModel)) { return val; } val.Add("EquipmentDroneBody", (ItemDisplayRule[])(object)new ItemDisplayRule[1] { new ItemDisplayRule { followerPrefab = EquipmentModel, ruleType = (ItemDisplayRuleType)0, childName = "GunBarrelBase", localPos = new Vector3(0f, 0f, 2.3f), localAngles = new Vector3(270f, 0f, 0f), localScale = new Vector3(0.5f, 0.5f, 0.5f) } }); return val; } protected override bool ActivateEquipment(EquipmentSlot slot) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0053: 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_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: 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_00b5: 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: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) CharacterBody characterBody = slot.characterBody; CharacterMaster val = (((Object)(object)characterBody != (Object)null) ? characterBody.master : null); if (!Object.op_Implicit((Object)(object)val) || val.IsDeployableLimited((DeployableSlot)14)) { return false; } Ray aimRay = slot.GetAimRay(); Quaternion rotation = Quaternion.LookRotation(((Ray)(ref aimRay)).direction); FireProjectileInfo val2 = default(FireProjectileInfo); val2.projectilePrefab = projectilePrefab; val2.crit = slot.characterBody.RollCrit(); val2.damage = 0f; val2.damageColorIndex = (DamageColorIndex)3; val2.force = 0f; val2.owner = ((Component)slot).gameObject; val2.position = ((Ray)(ref aimRay)).origin; val2.rotation = rotation; FireProjectileInfo val3 = val2; ProjectileManager.instance.FireProjectile(val3); return true; } protected override void CreateConfig(ConfigFile config) { base.CreateConfig(config); baseHealth = config.Bind<float>("Stationary Turret", "Base Health", 65f, (ConfigDescription)null).Value; baseDamage = config.Bind<float>("Stationary Turret", "Base Damage", 8f, (ConfigDescription)null).Value; baseRegen = config.Bind<float>("Stationary Turret", "Base Regen", 1f, (ConfigDescription)null).Value; _cooldown = config.Bind<float>("Stationary Turret", "Cooldown", 90f, (ConfigDescription)null).Value; maxActive = config.Bind<int>("Stationary Turret", "Max Active with Extra Equip Slots", -1, (ConfigDescription)null).Value; } public override void CreateAssets(ConfigFile config) { base.CreateAssets(config); CreateBodyPrefab(); CreateMasterPrefab(); CreateSpawnCard(); CreateEquipmentModel(); CreateProjectilePrefab(); } private void CreateSpawnCard() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)masterPrefab)) { CreateMasterPrefab(); } if (!Object.op_Implicit((Object)(object)spawnCard)) { spawnCard = ScriptableObject.CreateInstance<CharacterSpawnCard>(); ((SpawnCard)spawnCard).directorCreditCost = 35; ((SpawnCard)spawnCard).hullSize = (HullClassification)0; ((SpawnCard)spawnCard).nodeGraphType = (GraphType)0; ((SpawnCard)spawnCard).prefab = masterPrefab; ((SpawnCard)spawnCard).sendOverNetwork = true; ((SpawnCard)spawnCard).occupyPosition = false; ((SpawnCard)spawnCard).forbiddenFlags = (NodeFlags)4; spawnCard.inventoryItemCopyFilter = Inventory.DefaultItemCopyFilter; ((Object)spawnCard).name = "cscMoffeinETEStationaryTurret"; } } private void CreateProjectilePrefab() { //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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)spawnCard)) { CreateSpawnCard(); } if (!Object.op_Implicit((Object)(object)projectilePrefab)) { GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MinorConstructOnKill/MinorConstructOnKillProjectile.prefab").WaitForCompletion(), "MoffeinETE_StationaryTurretProjectile", true); val.GetComponent<ProjectileController>().ghostPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC3/Drifter/DrifterToolbotCrateGhost.prefab").WaitForCompletion(); ProjectileSpawnMaster component = val.GetComponent<ProjectileSpawnMaster>(); component.spawnCard = spawnCard; component.deployableSlot = (DeployableSlot)35; PluginContentPack.projectilePrefabs.Add(val); projectilePrefab = val; ProjectileSpawnMaster.SpawnMaster += new Manipulator(ProjectileSpawnMaster_SpawnMaster); } } private void ProjectileSpawnMaster_SpawnMaster(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<DirectorCore>(x, "TrySpawnObject") })) { val.EmitDelegate<Func<DirectorSpawnRequest, DirectorSpawnRequest>>((Func<DirectorSpawnRequest, DirectorSpawnRequest>)delegate(DirectorSpawnRequest req) { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //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_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)req.spawnCard == (Object)(object)spawnCard && (Object)(object)req.summonerBodyObject != (Object)null) { CharacterBody component = req.summonerBodyObject.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.inventory)) { SpawnCard obj = req.spawnCard; CharacterSpawnCard val2 = (CharacterSpawnCard)(object)((obj is CharacterSpawnCard) ? obj : null); CharacterSpawnCard val3 = ScriptableObject.CreateInstance<CharacterSpawnCard>(); ((SpawnCard)val3).prefab = ((SpawnCard)spawnCard).prefab; ((SpawnCard)val3).occupyPosition = ((SpawnCard)spawnCard).occupyPosition; ((SpawnCard)val3).sendOverNetwork = ((SpawnCard)spawnCard).sendOverNetwork; ((SpawnCard)val3).hullSize = ((SpawnCard)spawnCard).hullSize; ((SpawnCard)val3).nodeGraphType = ((SpawnCard)spawnCard).nodeGraphType; ((SpawnCard)val3).forbiddenFlags = ((SpawnCard)spawnCard).forbiddenFlags; val3.inventoryItemCopyFilter = spawnCard.inventoryItemCopyFilter; val3.inventoryToCopy = component.inventory; req.spawnCard = (SpawnCard)(object)val3; } req.ignoreTeamMemberLimit = true; } return req; }); } else { Debug.LogError((object)"EngiTurretEquipment: Stationary Turret ProjectileSpawnMaster_SpawnMaster IL hook failed."); } } private void CreateBodyPrefab() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)bodyPrefab)) { GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiTurretBody.prefab").WaitForCompletion(), "MoffeinETE_StationaryTurretBody", true); CharacterBody component = val.GetComponent<CharacterBody>(); component.baseMaxHealth = baseHealth; component.levelMaxHealth = baseHealth * 0.3f; component.baseDamage = baseDamage; component.levelDamage = baseDamage * 0.2f; component.baseRegen = baseRegen; component.levelRegen = baseRegen * 0.2f; ModelLocator component2 = val.GetComponent<ModelLocator>(); component2.normalizeToFloor = true; val.AddComponent<RegisterStationaryTurret>(); PluginContentPack.bodyPrefabs.Add(val); bodyPrefab = val; } } private void CreateMasterPrefab() { //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) if (!Object.op_Implicit((Object)(object)masterPrefab)) { if (!Object.op_Implicit((Object)(object)bodyPrefab)) { CreateBodyPrefab(); } GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiTurretMaster.prefab").WaitForCompletion(), "MoffeinETE_StationaryTurretMaster", true); CharacterMaster component = val.GetComponent<CharacterMaster>(); component.bodyPrefab = bodyPrefab; PluginContentPack.masterPrefabs.Add(val); masterPrefab = val; } } private static void CreateEquipmentModel() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: 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) if (Object.op_Implicit((Object)(object)_equipmentModel)) { return; } GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("mdlEngiTurretStationary"); Renderer componentInChildren = val.GetComponentInChildren<Renderer>(); componentInChildren.material = Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Engi/matEngiTurret.mat").WaitForCompletion(); ItemDisplay val2 = val.AddComponent<ItemDisplay>(); List<Renderer> list = new List<Renderer> { componentInChildren }; List<RendererInfo> list2 = new List<RendererInfo>(); foreach (Renderer item2 in list) { RendererInfo item = default(RendererInfo); item.renderer = item2; item.defaultMaterial = item2.material; item.defaultShadowCastingMode = item2.shadowCastingMode; item.ignoreOverlays = false; item.hideOnDeath = false; list2.Add(item); } val2.rendererInfos = list2.ToArray(); _equipmentModel = val; } private static GameObject GetEquipmentModel() { if (!Object.op_Implicit((Object)(object)_equipmentModel)) { CreateEquipmentModel(); } return _equipmentModel; } } public class WalkerTurret : EquipmentBase<WalkerTurret> { private static GameObject _equipmentModel; public static GameObject bodyPrefab; public static GameObject masterPrefab; public static GameObject projectilePrefab; public static CharacterSpawnCard spawnCard; public static float moveSpeed; public static float _cooldown; public static float baseHealth; public static float baseDamage; public static float baseRegen; public static bool increaseRange; public static bool alwaysSprint; public static int maxActive; public override string EquipmentName => "Mobile Turret"; public override string EquipmentLangTokenName => "WALKER"; public override GameObject EquipmentModel => GetEquipmentModel(); public override Sprite EquipmentIcon => Assets.mainAssetBundle.LoadAsset<Sprite>("texEngiWalkerTurretEquipmentIcon.png"); public override float Cooldown => _cooldown; public override ItemDisplayRuleDict CreateItemDisplayRules() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0037: 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_006f: 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_008a: 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) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) ItemDisplayRuleDict val = new ItemDisplayRuleDict(Array.Empty<ItemDisplayRule>()); GameObject equipmentModel = EquipmentModel; if (!Object.op_Implicit((Object)(object)equipmentModel)) { return val; } val.Add("EquipmentDroneBody", (ItemDisplayRule[])(object)new ItemDisplayRule[1] { new ItemDisplayRule { followerPrefab = EquipmentModel, ruleType = (ItemDisplayRuleType)0, childName = "GunBarrelBase", localPos = new Vector3(0f, 0f, 2.6f), localAngles = new Vector3(270f, 0f, 0f), localScale = new Vector3(0.5f, 0.5f, 0.5f) } }); return val; } protected override bool ActivateEquipment(EquipmentSlot slot) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0053: 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_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: 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_00b5: 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: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) CharacterBody characterBody = slot.characterBody; CharacterMaster val = (((Object)(object)characterBody != (Object)null) ? characterBody.master : null); if (!Object.op_Implicit((Object)(object)val) || val.IsDeployableLimited((DeployableSlot)14)) { return false; } Ray aimRay = slot.GetAimRay(); Quaternion rotation = Quaternion.LookRotation(((Ray)(ref aimRay)).direction); FireProjectileInfo val2 = default(FireProjectileInfo); val2.projectilePrefab = projectilePrefab; val2.crit = slot.characterBody.RollCrit(); val2.damage = 0f; val2.damageColorIndex = (DamageColorIndex)3; val2.force = 0f; val2.owner = ((Component)slot).gameObject; val2.position = ((Ray)(ref aimRay)).origin; val2.rotation = rotation; FireProjectileInfo val3 = val2; ProjectileManager.instance.FireProjectile(val3); return true; } protected override void CreateConfig(ConfigFile config) { base.CreateConfig(config); baseHealth = config.Bind<float>("Mobile Turret", "Base Health", 65f, (ConfigDescription)null).Value; baseDamage = config.Bind<float>("Mobile Turret", "Base Damage", 8f, (ConfigDescription)null).Value; baseRegen = config.Bind<float>("Mobile Turret", "Base Regen", 1f, (ConfigDescription)null).Value; _cooldown = config.Bind<float>("Mobile Turret", "Cooldown", 90f, (ConfigDescription)null).Value; moveSpeed = config.Bind<float>("Mobile Turret", "Move Speed", 7f, (ConfigDescription)null).Value; increaseRange = config.Bind<bool>("Mobile Turret", "Increase Range", true, (ConfigDescription)null).Value; alwaysSprint = config.Bind<bool>("Mobile Turret", "Always Sprint", true, (ConfigDescription)null).Value; maxActive = config.Bind<int>("Mobile Turret", "Max Active with Extra Equip Slots", -1, (ConfigDescription)null).Value; } public override void CreateAssets(ConfigFile config) { base.CreateAssets(config); CreateBodyPrefab(); CreateMasterPrefab(); CreateSpawnCard(); CreateEquipmentModel(); CreateProjectilePrefab(); } private void CreateSpawnCard() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)masterPrefab)) { CreateMasterPrefab(); } if (!Object.op_Implicit((Object)(object)spawnCard)) { spawnCard = ScriptableObject.CreateInstance<CharacterSpawnCard>(); ((SpawnCard)spawnCard).directorCreditCost = 35; ((SpawnCard)spawnCard).hullSize = (HullClassification)0; ((SpawnCard)spawnCard).nodeGraphType = (GraphType)0; ((SpawnCard)spawnCard).prefab = masterPrefab; ((SpawnCard)spawnCard).sendOverNetwork = true; ((SpawnCard)spawnCard).occupyPosition = false; ((SpawnCard)spawnCard).forbiddenFlags = (NodeFlags)4; spawnCard.inventoryItemCopyFilter = Inventory.DefaultItemCopyFilter; ((Object)spawnCard).name = "cscMoffeinETEWalkerTurret"; } } private void CreateProjectilePrefab() { //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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)spawnCard)) { CreateSpawnCard(); } if (!Object.op_Implicit((Object)(object)projectilePrefab)) { GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MinorConstructOnKill/MinorConstructOnKillProjectile.prefab").WaitForCompletion(), "MoffeinETE_WalkerTurretProjectile", true); val.GetComponent<ProjectileController>().ghostPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC3/Drifter/DrifterToolbotCrateGhost.prefab").WaitForCompletion(); ProjectileSpawnMaster component = val.GetComponent<ProjectileSpawnMaster>(); component.spawnCard = spawnCard; component.deployableSlot = (DeployableSlot)35; PluginContentPack.projectilePrefabs.Add(val); projectilePrefab = val; ProjectileSpawnMaster.SpawnMaster += new Manipulator(ProjectileSpawnMaster_SpawnMaster); } } private void ProjectileSpawnMaster_SpawnMaster(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<DirectorCore>(x, "TrySpawnObject") })) { val.EmitDelegate<Func<DirectorSpawnRequest, DirectorSpawnRequest>>((Func<DirectorSpawnRequest, DirectorSpawnRequest>)delegate(DirectorSpawnRequest req) { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //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_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)req.spawnCard == (Object)(object)spawnCard && (Object)(object)req.summonerBodyObject != (Object)null) { CharacterBody component = req.summonerBodyObject.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.inventory)) { SpawnCard obj = req.spawnCard; CharacterSpawnCard val2 = (CharacterSpawnCard)(object)((obj is CharacterSpawnCard) ? obj : null); CharacterSpawnCard val3 = ScriptableObject.CreateInstance<CharacterSpawnCard>(); ((SpawnCard)val3).prefab = ((SpawnCard)spawnCard).prefab; ((SpawnCard)val3).occupyPosition = ((SpawnCard)spawnCard).occupyPosition; ((SpawnCard)val3).sendOverNetwork = ((SpawnCard)spawnCard).sendOverNetwork; ((SpawnCard)val3).hullSize = ((SpawnCard)spawnCard).hullSize; ((SpawnCard)val3).nodeGraphType = ((SpawnCard)spawnCard).nodeGraphType; ((SpawnCard)val3).forbiddenFlags = ((SpawnCard)spawnCard).forbiddenFlags; val3.inventoryItemCopyFilter = spawnCard.inventoryItemCopyFilter; val3.inventoryToCopy = component.inventory; req.spawnCard = (SpawnCard)(object)val3; } req.ignoreTeamMemberLimit = true; } return req; }); } else { Debug.LogError((object)"EngiTurretEquipment: Walker Turret ProjectileSpawnMaster_SpawnMaster IL hook failed."); } } private void CreateBodyPrefab() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)bodyPrefab)) { GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretBody.prefab").WaitForCompletion(), "MoffeinETE_WalkerTurretBody", true); CharacterBody component = val.GetComponent<CharacterBody>(); component.baseMaxHealth = baseHealth; component.levelMaxHealth = baseHealth * 0.3f; component.baseDamage = baseDamage; component.levelDamage = baseDamage * 0.2f; component.baseRegen = baseRegen; component.levelRegen = baseRegen * 0.2f; component.portraitIcon = (Texture)(object)Assets.mainAssetBundle.LoadAsset<Texture2D>("texEngiWalkerTurretBodyIcon.png"); val.AddComponent<RegisterWalkerTurret>(); PluginContentPack.bodyPrefabs.Add(val); bodyPrefab = val; } } private void CreateMasterPrefab() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)masterPrefab)) { return; } if (!Object.op_Implicit((Object)(object)bodyPrefab)) { CreateBodyPrefab(); } GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretMaster.prefab").WaitForCompletion(), "MoffeinETE_WalkerTurretMaster", true); CharacterMaster component = val.GetComponent<CharacterMaster>(); component.bodyPrefab = bodyPrefab; PluginContentPack.masterPrefabs.Add(val); masterPrefab = val; AISkillDriver[] components = val.GetComponents<AISkillDriver>(); AISkillDriver[] array = components; foreach (AISkillDriver val2 in array) { if (alwaysSprint && val2.customName != "Rest") { val2.shouldSprint = true; } if (increaseRange && val2.customName == "ChaseAndFireAtEnemy") { val2.maxDistance = 45f; } } if (increaseRange) { PluginUtils.SetAddressableEntityStateField("RoR2/Base/Engi/EntityStates.EngiTurret.EngiTurretWeapon.FireBeam.asset", "maxDistance", "45"); } } private static void CreateEquipmentModel() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: 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) if (Object.op_Implicit((Object)(object)_equipmentModel)) { return; } GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("mdlEngiTurretWalker"); Renderer componentInChildren = val.GetComponentInChildren<Renderer>(); componentInChildren.material = Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Engi/matEngiTurret.mat").WaitForCompletion(); ItemDisplay val2 = val.AddComponent<ItemDisplay>(); List<Renderer> list = new List<Renderer> { componentInChildren }; List<RendererInfo> list2 = new List<RendererInfo>(); foreach (Renderer item2 in list) { RendererInfo item = default(RendererInfo); item.renderer = item2; item.defaultMaterial = item2.material; item.defaultShadowCastingMode = item2.shadowCastingMode; item.ignoreOverlays = false; item.hideOnDeath = false; list2.Add(item); } val2.rendererInfos = list2.ToArray(); _equipmentModel = val; } private static GameObject GetEquipmentModel() { if (!Object.op_Implicit((Object)(object)_equipmentModel)) { CreateEquipmentModel(); } return _equipmentModel; } } } namespace EngiTurretEquipment.Components { public class MasterStationaryTurretCounter : MonoBehaviour { private Inventory inventory; public Queue<CharacterMaster> activeTurrets = new Queue<CharacterMaster>(); private void Start() { if (!Object.op_Implicit((Object)(object)inventory)) { inventory = ((Component)this).GetComponent<Inventory>(); } } private void UpdateActiveTurrets() { Queue<CharacterMaster> queue = new Queue<CharacterMaster>(); foreach (CharacterMaster activeTurret in activeTurrets) { if (Object.op_Implicit((Object)(object)activeTurret) && !queue.Contains(activeTurret)) { CharacterBody body = activeTurret.GetBody(); if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)body.healthComponent) && body.healthComponent.alive) { queue.Enqueue(activeTurret); } } } activeTurrets.Clear(); activeTurrets = queue; } public bool CanSpawnTurret() { UpdateActiveTurrets(); int maxTurrets = GetMaxTurrets(); return activeTurrets.Count < maxTurrets; } protected EquipmentDef GetEquipmentDef() { return (EquipmentBase<StationaryTurret>.Instance != null) ? EquipmentBase<StationaryTurret>.Instance.EquipmentDef : null; } public int GetMaxTurrets() { //IL_0064: 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_006c: Unknown result type (might be due to invalid IL or missing references) int maxActive = StationaryTurret.maxActive; EquipmentDef equipmentDef = GetEquipmentDef(); if (Object.op_Implicit((Object)(object)inventory) && Object.op_Implicit((Object)(object)equipmentDef)) { int num = 0; EquipmentState[][] equipmentStateSlots = inventory._equipmentStateSlots; foreach (EquipmentState[] array in equipmentStateSlots) { if (array == null) { continue; } EquipmentState[] array2 = array; foreach (EquipmentState val in array2) { if ((Object)(object)val.equipmentDef == (Object)(object)equipmentDef) { num++; } } } int num2 = Mathf.Max(1, num); if (maxActive > 0) { num2 = Mathf.Min(num2, maxActive); } return num2; } return 1; } public void AddTurretServer(CharacterMaster newTurret) { if (!NetworkServer.active) { return; } UpdateActiveTurrets(); int maxTurrets = GetMaxTurrets(); int num = activeTurrets.Count + 1 - maxTurrets; if (num > 0) { for (int i = 0; i < num; i++) { if (activeTurrets.TryDequeue(out CharacterMaster result)) { result.TrueKill(); } } } activeTurrets.Enqueue(newTurret); } } public class MasterWalkerTurretCounter : MonoBehaviour { private Inventory inventory; public Queue<CharacterMaster> activeTurrets = new Queue<CharacterMaster>(); private void Start() { if (!Object.op_Implicit((Object)(object)inventory)) { inventory = ((Component)this).GetComponent<Inventory>(); } } private void UpdateActiveTurrets() { Queue<CharacterMaster> queue = new Queue<CharacterMaster>(); foreach (CharacterMaster activeTurret in activeTurrets) { if (Object.op_Implicit((Object)(object)activeTurret) && !queue.Contains(activeTurret)) { CharacterBody body = activeTurret.GetBody(); if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)body.healthComponent) && body.healthComponent.alive) { queue.Enqueue(activeTurret); } } } activeTurrets.Clear(); activeTurrets = queue; } public bool CanSpawnTurret() { UpdateActiveTurrets(); int maxTurrets = GetMaxTurrets(); return activeTurrets.Count < maxTurrets; } protected EquipmentDef GetEquipmentDef() { return (EquipmentBase<WalkerTurret>.Instance != null) ? EquipmentBase<WalkerTurret>.Instance.EquipmentDef : null; } public int GetMaxTurrets() { //IL_0064: 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_006c: Unknown result type (might be due to invalid IL or missing references) int maxActive = WalkerTurret.maxActive; EquipmentDef equipmentDef = GetEquipmentDef(); if (Object.op_Implicit((Object)(object)inventory) && Object.op_Implicit((Object)(object)equipmentDef)) { int num = 0; EquipmentState[][] equipmentStateSlots = inventory._equipmentStateSlots; foreach (EquipmentState[] array in equipmentStateSlots) { if (array == null) { continue; } EquipmentState[] array2 = array; foreach (EquipmentState val in array2) { if ((Object)(object)val.equipmentDef == (Object)(object)equipmentDef) { num++; } } } int num2 = Mathf.Max(1, num); if (maxActive > 0) { num2 = Mathf.Min(num2, maxActive); } return num2; } return 1; } public void AddTurretServer(CharacterMaster newTurret) { if (!NetworkServer.active) { return; } UpdateActiveTurrets(); int maxTurrets = GetMaxTurrets(); int num = activeTurrets.Count + 1 - maxTurrets; if (num > 0) { for (int i = 0; i < num; i++) { if (activeTurrets.TryDequeue(out CharacterMaster result)) { result.TrueKill(); } } } activeTurrets.Enqueue(newTurret); } } public class RegisterStationaryTurret : MonoBehaviour { private void Start() { if (NetworkServer.active) { CharacterBody component = ((Component)this).GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component.master) && Object.op_Implicit((Object)(object)component.master.minionOwnership) && Object.op_Implicit((Object)(object)component.master.minionOwnership.ownerMaster)) { MasterStationaryTurretCounter masterStationaryTurretCounter = ((Component)component.master.minionOwnership.ownerMaster).gameObject.GetComponent<MasterStationaryTurretCounter>(); if (!Object.op_Implicit((Object)(object)masterStationaryTurretCounter)) { masterStationaryTurretCounter = ((Component)component.master.minionOwnership.ownerMaster).gameObject.AddComponent<MasterStationaryTurretCounter>(); } masterStationaryTurretCounter.AddTurretServer(component.master); } } Object.Destroy((Object)(object)this); } } public class RegisterWalkerTurret : MonoBehaviour { private void Start() { if (NetworkServer.active) { CharacterBody component = ((Component)this).GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component.master) && Object.op_Implicit((Object)(object)component.master.minionOwnership) && Object.op_Implicit((Object)(object)component.master.minionOwnership.ownerMaster)) { MasterWalkerTurretCounter masterWalkerTurretCounter = ((Component)component.master.minionOwnership.ownerMaster).gameObject.GetComponent<MasterWalkerTurretCounter>(); if (!Object.op_Implicit((Object)(object)masterWalkerTurretCounter)) { masterWalkerTurretCounter = ((Component)component.master.minionOwnership.ownerMaster).gameObject.AddComponent<MasterWalkerTurretCounter>(); } masterWalkerTurretCounter.AddTurretServer(component.master); } } Object.Destroy((Object)(object)this); } } }