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