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 MinionMeld v1.1.6
MinionMeld.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.Drone; using HG.Reflection; using HarmonyLib; using IL.RoR2; using KinematicCharacterController; using Microsoft.CodeAnalysis; using MinionMeld.Components; using MinionMeld.Modules; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates.Drone; using On.RoR2; using On.RoR2.Projectile; using R2API; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Navigation; using RoR2.Projectile; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("MinionMeld")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d808189e9c86db39e2909241d682fc507309536a")] [assembly: AssemblyProduct("MinionMeld")] [assembly: AssemblyTitle("MinionMeld")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: UnverifiableCode] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace MinionMeld { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(string data) { _logSource.LogDebug((object)data); } internal static void Error(string data) { _logSource.LogError((object)data); } internal static void Fatal(string data) { _logSource.LogFatal((object)data); } internal static void Info(string data) { _logSource.LogInfo((object)data); } internal static void Message(string data) { _logSource.LogMessage((object)data); } internal static void Warning(string data) { _logSource.LogWarning((object)data); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.score.MinionMeld", "MinionMeld", "1.1.6")] public class MinionMeldPlugin : BaseUnityPlugin { public const string PluginGUID = "com.score.MinionMeld"; public const string PluginAuthor = "score"; public const string PluginName = "MinionMeld"; public const string PluginVersion = "1.1.6"; public static ItemDef meldStackItem; internal Harmony harmonyPatcher; public static bool RooInstalled => Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"); public static MinionMeldPlugin Instance { get; private set; } public static ItemIndex meldStackIndex => meldStackItem.itemIndex; public void Awake() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) Instance = this; harmonyPatcher = new Harmony("com.score.MinionMeld"); Log.Init(((BaseUnityPlugin)this).Logger); PluginConfig.Init(((BaseUnityPlugin)this).Config); meldStackItem = ScriptableObject.CreateInstance<ItemDef>(); meldStackItem.deprecatedTier = (ItemTier)5; meldStackItem.canRemove = true; meldStackItem.hidden = true; meldStackItem.nameToken = "ITEM_MINIONMELD_STACK_NAME"; meldStackItem.loreToken = ""; meldStackItem.descriptionToken = ""; meldStackItem.pickupToken = ""; ((Object)meldStackItem).name = "MinionMeldInternalStackItem"; meldStackItem.tags = (ItemTag[])(object)new ItemTag[2] { (ItemTag)11, (ItemTag)12 }; ContentAddition.AddItemDef(meldStackItem); Hooks.Init(); TurretHooks.Init(); MultiEquipDrone.Init(); } } public static class PluginConfig { public static ConfigEntry<bool> perPlayer; public static ConfigEntry<bool> teleturret; public static ConfigEntry<bool> respawnSummon; public static ConfigEntry<int> maxDronesPerType; public static ConfigEntry<bool> enableTurretLeash; public static ConfigEntry<int> minionLeashRange; public static ConfigEntry<MeldingTime.DronemeldPriorityOrder> priorityOrder; public static ConfigEntry<bool> disableTeamCollision; public static ConfigEntry<bool> disableProjectileCollision; public static ConfigEntry<int> statMultHealth; public static ConfigEntry<int> statMultDamage; public static ConfigEntry<int> statMultAttackSpeed; public static ConfigEntry<int> statMultCDR; public static ConfigEntry<int> vfxResize; public static ConfigEntry<string> blacklistMasters; public static ConfigEntry<string> blacklistTurrets; public static ConfigEntry<bool> printMasterNames; public static ConfigEntry<bool> useWhitelist; public static ConfigEntry<string> whitelistMasters; public static ConfigEntry<string> whitelistTurrets; public static readonly HashSet<MasterIndex> MasterBlacklist = new HashSet<MasterIndex>(); public static readonly HashSet<MasterIndex> TurretBlacklist = new HashSet<MasterIndex>(); public static readonly HashSet<MasterIndex> MasterWhitelist = new HashSet<MasterIndex>(); public static readonly HashSet<MasterIndex> TurretWhitelist = new HashSet<MasterIndex>(); private static readonly Regex StringFilter = new Regex("\\s", RegexOptions.Compiled); [SystemInitializer(new Type[] { typeof(MasterCatalog) })] private static void Init() { string permaBlackList = "DevotedLemurianMaster,DevotedLemurianBruiserMaster,NemMercCloneMaster,"; RebuildBlacklist(MasterBlacklist, permaBlackList + blacklistMasters.Value); blacklistMasters.SettingChanged += delegate { RebuildBlacklist(MasterBlacklist, permaBlackList + blacklistMasters.Value); }; RebuildBlacklist(TurretBlacklist, blacklistTurrets.Value); blacklistTurrets.SettingChanged += delegate { RebuildBlacklist(TurretBlacklist, blacklistTurrets.Value); }; RebuildBlacklist(MasterWhitelist, whitelistMasters.Value); whitelistMasters.SettingChanged += delegate { RebuildBlacklist(MasterWhitelist, whitelistMasters.Value); }; RebuildBlacklist(TurretWhitelist, whitelistTurrets.Value); whitelistTurrets.SettingChanged += delegate { RebuildBlacklist(TurretWhitelist, whitelistTurrets.Value); }; static void RebuildBlacklist(HashSet<MasterIndex> list, string option) { //IL_0067: 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) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) list.Clear(); option = StringFilter.Replace(option, (Match match) => string.Empty); if (!string.IsNullOrEmpty(option)) { string[] array = option.Split(','); foreach (string text in array) { if (!string.IsNullOrEmpty(text)) { string text2 = text.Replace("(Clone)", string.Empty); MasterIndex val = MasterCatalog.FindMasterIndex(text2); if (val == MasterIndex.none) { val = MasterCatalog.FindMasterIndex(text2 + "Master"); } if (val != MasterIndex.none) { list.Add(val); } } } } } } public static void Init(ConfigFile cfg) { string section = "General"; string section2 = "Stats"; string section3 = "BlackList"; string section4 = "WhiteList"; perPlayer = cfg.BindOption(section, "Limit Drones Per Player", defaultValue: true, "If false, then the team's collective drones will be limited"); teleturret = cfg.BindOption(section, "Teleporting Turrets", defaultValue: true, "Turrets, Squids, etc (anything immobile) remember their previous spawn locations and follow when you start a scripted combat event (teleporter, mithrix etc)"); respawnSummon = cfg.BindOption(section, "Spawn In New Location", defaultValue: true, "Summoned allies will 'respawn' in the location that that they are summoned."); maxDronesPerType = cfg.BindOptionSlider(section, "Max Minions Per Type", 1, "Max Number of Minions you (or your team) can control of that type before melding is applied.", 1f); enableTurretLeash = cfg.BindOption(section, "Enable Turret Leash", defaultValue: true, "Allows turrets to teleport to their owner when too far."); minionLeashRange = cfg.BindOptionSlider(section, "Minion Leash Range", 200, "Max distance a minion should be from their owner before teleporting. Applies to turrets.", 50f, 1000f); priorityOrder = cfg.BindOption(section, "Selection Priority", MeldingTime.DronemeldPriorityOrder.RoundRobin, "Used for deciding which drone should be selected for melding."); disableTeamCollision = cfg.BindOption(section, "Disable Minion Collision", defaultValue: true, "Allows you to walk through any minions.", restartRequired: true); disableProjectileCollision = cfg.BindOption(section, "Disable Team Attack Collision", defaultValue: false, "Lightweight filter to allow all teammate bullets and projectiles to pass through allies. Should be disabled for certain characters to function correctly.", restartRequired: true); statMultHealth = cfg.BindOptionSlider(section2, "Health Multiplier", 20, "Stacks additively.", 0f, 200f); statMultDamage = cfg.BindOptionSlider(section2, "Damage Multiplier", 20, "Stacks additively.", 0f, 200f); statMultAttackSpeed = cfg.BindOptionSlider(section2, "Attack Speed Multiplier", 20, "Stacks additively.", 0f, 200f); statMultCDR = cfg.BindOptionSlider(section2, "Cooldown Reduction Multiplier", 20, "Stacks additively.", 0f, 200f); vfxResize = cfg.BindOptionSlider(section2, "Size Multiplier", 20, "Visual size increase per meld, in percent. Stacks additively.", 0f, 200f); blacklistMasters = cfg.BindOption(section3, "Blacklist", "EngiTurretMaster,EngiWalkerTurretMaster,GhoulMaster,TombstoneMaster", "Put the broken shit in here, or just things you want duplicates of. For Devotion Artifact, download LemurFusion.\r\nTo find these, download the DebugToolKit mod, open the console (Ctrl Alt ~), then type list_ai or enable the print option below."); blacklistTurrets = cfg.BindOption(section3, "Blacklist Teleporting Turret", "", "Makes teleporting turret component unable to be applied to these guys. Typically applied to characters without the ability to move on their own."); printMasterNames = cfg.BindOption(section3, "Print Master Names To Console", defaultValue: true, "Prints the name to the console (Ctrl Alt ~) when preforming a successful meld. Helpful for setting up the blacklist."); useWhitelist = cfg.BindOption(section4, "Use Whitelist", defaultValue: false, "Use a custom whitelist of allowed CharacterMaster names instead of the default blacklist."); whitelistMasters = cfg.BindOption(section4, "Whitelist", "", "CharacterMaster names that should be allowed to meld. Teleporting turrets will not be affected by this list."); whitelistTurrets = cfg.BindOption(section4, "Whitelist Teleporting Turret", "", "CharacterMaster names of the immobile turret-like allies that should teleport around with you during combat events."); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static ConfigEntry<T> BindOption<T>(this ConfigFile cfg, string section, string name, T defaultValue, string description = "", bool restartRequired = false) { if (string.IsNullOrEmpty(description)) { description = name; } if (restartRequired) { description += " (restart required)"; } ConfigEntry<T> val = cfg.Bind<T>(section, name, defaultValue, description); if (MinionMeldPlugin.RooInstalled) { TryRegisterOption<T>(val, restartRequired); } return val; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static ConfigEntry<T> BindOptionSlider<T>(this ConfigFile cfg, string section, string name, T defaultValue, string description = "", float min = 0f, float max = 20f, bool restartRequired = false) { if (string.IsNullOrEmpty(description)) { description = name; } string text = description; T val = defaultValue; description = text + " (Default: " + val?.ToString() + ")"; if (restartRequired) { description += " (restart required)"; } ConfigEntry<T> val2 = cfg.Bind<T>(section, name, defaultValue, description); if (MinionMeldPlugin.RooInstalled) { TryRegisterOptionSlider<T>(val2, min, max, restartRequired); } return val2; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void InitRoO() { ModSettingsManager.SetModDescription("Devotion Artifact but better."); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void TryRegisterOption<T>(ConfigEntry<T> entry, bool restartRequired) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown if (entry is ConfigEntry<string> val) { ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(val, restartRequired)); } else if (entry is ConfigEntry<float> val2) { ModSettingsManager.AddOption((BaseOption)new SliderOption(val2, new SliderConfig { min = 0f, max = 20f, FormatString = "{0:0.00}", restartRequired = restartRequired })); } else if (entry is ConfigEntry<int> val3) { ModSettingsManager.AddOption((BaseOption)new IntSliderOption(val3, restartRequired)); } else if (entry is ConfigEntry<bool> val4) { ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(val4, restartRequired)); } else if (entry is ConfigEntry<KeyboardShortcut> val5) { ModSettingsManager.AddOption((BaseOption)new KeyBindOption(val5, restartRequired)); } else if (typeof(T).IsEnum) { ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)entry, restartRequired)); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void TryRegisterOptionSlider<T>(ConfigEntry<T> entry, float min, float max, bool restartRequired) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_0048: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown if (entry is ConfigEntry<int> val) { ModSettingsManager.AddOption((BaseOption)new IntSliderOption(val, new IntSliderConfig { min = (int)min, max = (int)max, formatString = "{0:0.00}", restartRequired = restartRequired })); } else if (entry is ConfigEntry<float> val2) { ModSettingsManager.AddOption((BaseOption)new SliderOption(val2, new SliderConfig { min = min, max = max, FormatString = "{0:0.00}", restartRequired = restartRequired })); } } } } namespace MinionMeld.Modules { public class Hooks { [CompilerGenerated] private static class <>O { public static Action<CharacterBody> <0>__CharacterBody_ResizeBody; public static hook_Perform <1>__MasterSummon_Perform; public static hook_TrySpawnObject <2>__DirectorCore_TrySpawnObject; public static hook_DefaultFilterCallbackImplementation <3>__BulletAttack_DefaultFilterCallbackImplementation; public static hook_IgnoreCollisionsWithOwner <4>__ProjectileController_IgnoreCollisionsWithOwner; } private const string SPAWN_STRING = "{0} | Spawning Meldable Minion: {1}"; private const string MELD_STRING = "{0} | Performing Minion Meld: {1}"; public static Hooks Instance { get; private set; } public static void Init() { if (Instance == null) { Instance = new Hooks(); } } private Hooks() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected O, but got Unknown CharacterBody.GetDisplayName += new hook_GetDisplayName(CharacterBody_GetDisplayName); CharacterBody.onBodyStartGlobal += CharacterBody_ResizeBody; CharacterBody.onBodyInventoryChangedGlobal += CharacterBody_ResizeBody; RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); object obj = <>O.<1>__MasterSummon_Perform; if (obj == null) { hook_Perform val = MasterSummon_Perform; <>O.<1>__MasterSummon_Perform = val; obj = (object)val; } MasterSummon.Perform += (hook_Perform)obj; object obj2 = <>O.<2>__DirectorCore_TrySpawnObject; if (obj2 == null) { hook_TrySpawnObject val2 = DirectorCore_TrySpawnObject; <>O.<2>__DirectorCore_TrySpawnObject = val2; obj2 = (object)val2; } DirectorCore.TrySpawnObject += (hook_TrySpawnObject)obj2; if (PluginConfig.disableProjectileCollision.Value) { object obj3 = <>O.<3>__BulletAttack_DefaultFilterCallbackImplementation; if (obj3 == null) { hook_DefaultFilterCallbackImplementation val3 = BulletAttack_DefaultFilterCallbackImplementation; <>O.<3>__BulletAttack_DefaultFilterCallbackImplementation = val3; obj3 = (object)val3; } BulletAttack.DefaultFilterCallbackImplementation += (hook_DefaultFilterCallbackImplementation)obj3; object obj4 = <>O.<4>__ProjectileController_IgnoreCollisionsWithOwner; if (obj4 == null) { hook_IgnoreCollisionsWithOwner val4 = ProjectileController_IgnoreCollisionsWithOwner; <>O.<4>__ProjectileController_IgnoreCollisionsWithOwner = val4; obj4 = (object)val4; } ProjectileController.IgnoreCollisionsWithOwner += (hook_IgnoreCollisionsWithOwner)obj4; } } private static bool BulletAttack_DefaultFilterCallbackImplementation(orig_DefaultFilterCallbackImplementation orig, BulletAttack bulletAttack, ref BulletHit hitInfo) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Invalid comparison between Unknown and I4 //IL_005d: Unknown result type (might be due to invalid IL or missing references) if (orig.Invoke(bulletAttack, ref hitInfo)) { TeamComponent val = default(TeamComponent); if (Object.op_Implicit((Object)(object)hitInfo.hitHurtBox) && Object.op_Implicit((Object)(object)hitInfo.hitHurtBox.healthComponent) && Object.op_Implicit((Object)(object)bulletAttack.owner) && bulletAttack.owner.TryGetComponent<TeamComponent>(ref val) && (int)val.teamIndex == 1) { return FriendlyFireManager.ShouldDirectHitProceed(hitInfo.hitHurtBox.healthComponent, val.teamIndex); } return true; } return false; } private static void ProjectileController_IgnoreCollisionsWithOwner(orig_IgnoreCollisionsWithOwner orig, ProjectileController self, bool shouldIgnore) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Invalid comparison between Unknown and I4 orig.Invoke(self, shouldIgnore); if (!shouldIgnore || !PluginConfig.disableProjectileCollision.Value || (int)FriendlyFireManager.friendlyFireMode != 0 || (int)self.teamFilter.teamIndex != 1 || self.myColliders.Length == 0 || !Object.op_Implicit((Object)(object)self.owner)) { return; } foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers((TeamIndex)1)) { if (!((Object)(object)((Component)teamMember).gameObject != (Object)(object)self.owner) || !Object.op_Implicit((Object)(object)teamMember.body) || !Object.op_Implicit((Object)(object)teamMember.body.hurtBoxGroup)) { continue; } HurtBox[] hurtBoxes = teamMember.body.hurtBoxGroup.hurtBoxes; for (int i = 0; i < hurtBoxes.Length; i++) { for (int j = 0; j < self.myColliders.Length; j++) { Physics.IgnoreCollision(hurtBoxes[i].collider, self.myColliders[j], true); } } } } private static CharacterMaster MasterSummon_Perform(orig_Perform orig, MasterSummon self) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) CharacterBody val = default(CharacterBody); if (!Object.op_Implicit((Object)(object)self.masterPrefab) || !Object.op_Implicit((Object)(object)self.summonerBodyObject) || !self.summonerBodyObject.TryGetComponent<CharacterBody>(ref val) || !Object.op_Implicit((Object)(object)val.master)) { return orig.Invoke(self); } MasterIndex masterIdx = MasterCatalog.FindMasterIndex(self.masterPrefab); if (!MeldingTime.CanApply(masterIdx, val.teamComponent.teamIndex, self.teamIndexOverride)) { return orig.Invoke(self); } if (MeldingTime.PerformMeld(masterIdx, val.master, out var newSummon)) { TeleportingTurret teleportingTurret = default(TeleportingTurret); if (PluginConfig.teleturret.Value && newSummon.hasBody && newSummon.bodyInstanceObject.TryGetComponent<TeleportingTurret>(ref teleportingTurret)) { teleportingTurret.RegisterLocation(self.position); } else if (PluginConfig.respawnSummon.Value) { TeleportHelper.TeleportBody(newSummon.GetBody(), self.position, false); } MeldingTime.HandleInventory(self, newSummon, newSummon.inventory); if (PluginConfig.printMasterNames.Value) { Log.Info(string.Format("{0} | Performing Minion Meld: {1}", "MasterSummon", ((Object)newSummon).name)); } return newSummon; } newSummon = orig.Invoke(self); if (Object.op_Implicit((Object)(object)newSummon)) { MeldingTime.InitMinion(newSummon); if (PluginConfig.printMasterNames.Value) { Log.Info(string.Format("{0} | Spawning Meldable Minion: {1}", "MasterSummon", ((Object)newSummon).name)); } } return newSummon; } private static GameObject DirectorCore_TrySpawnObject(orig_TrySpawnObject orig, DirectorCore self, DirectorSpawnRequest spawnReq) { //IL_006a: 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_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) CharacterBody val = default(CharacterBody); if (!Object.op_Implicit((Object)(object)spawnReq?.spawnCard) || !Object.op_Implicit((Object)(object)spawnReq.spawnCard.prefab) || !Object.op_Implicit((Object)(object)spawnReq.summonerBodyObject) || spawnReq.placementRule == null || !spawnReq.summonerBodyObject.TryGetComponent<CharacterBody>(ref val) || !Object.op_Implicit((Object)(object)val.master)) { return orig.Invoke(self, spawnReq); } MasterIndex masterIdx = MasterCatalog.FindMasterIndex(spawnReq.spawnCard.prefab); if (!MeldingTime.CanApply(masterIdx, val.teamComponent.teamIndex, spawnReq.teamIndexOverride)) { return orig.Invoke(self, spawnReq); } if (MeldingTime.PerformMeld(masterIdx, val.master, out var newSummon)) { CharacterBody body = newSummon.GetBody(); if (Object.op_Implicit((Object)(object)body)) { Vector3? val2 = MeldingTime.FindSpawnDestination(body, spawnReq.placementRule, spawnReq.rng); if (val2.HasValue) { TeleportingTurret teleportingTurret = default(TeleportingTurret); if (PluginConfig.teleturret.Value && ((Component)body).TryGetComponent<TeleportingTurret>(ref teleportingTurret)) { teleportingTurret.RegisterLocation(val2.Value); } else if (PluginConfig.respawnSummon.Value) { TeleportHelper.TeleportBody(body, val2.Value, false); } } MeldingTime.HandleInventory(spawnReq, newSummon.inventory, new SpawnResult { spawnedInstance = ((Component)newSummon).gameObject, spawnRequest = spawnReq, position = body.footPosition, success = true, rotation = body.transform.rotation }); } if (PluginConfig.printMasterNames.Value) { Log.Info(string.Format("{0} | Performing Minion Meld: {1}", "DirectorCore", ((Object)newSummon).name)); } return ((Component)newSummon).gameObject; } GameObject val3 = orig.Invoke(self, spawnReq); newSummon = (Object.op_Implicit((Object)(object)val3) ? val3.GetComponent<CharacterMaster>() : null); if (Object.op_Implicit((Object)(object)newSummon)) { MeldingTime.InitMinion(newSummon); if (PluginConfig.printMasterNames.Value) { Log.Info(string.Format("{0} | Spawning Meldable Minion: {1}", "DirectorCore", ((Object)val3).name)); } } return val3; } private static void CharacterBody_ResizeBody(CharacterBody body) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_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_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) if (PluginConfig.vfxResize.Value <= 0 || !NetworkClient.active || !Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.inventory)) { return; } int itemCount = body.inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); if (itemCount > 0 && Object.op_Implicit((Object)(object)body.modelLocator) && Object.op_Implicit((Object)(object)body.modelLocator.modelTransform)) { GameObject bodyPrefab = BodyCatalog.GetBodyPrefab(body.bodyIndex); ModelLocator val = (Object.op_Implicit((Object)(object)bodyPrefab) ? bodyPrefab.GetComponent<ModelLocator>() : null); if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.modelTransform)) { Vector3 localScale = val.modelTransform.localScale; float num = (float)itemCount * ((float)PluginConfig.vfxResize.Value * 0.01f); body.modelLocator.modelTransform.localScale = localScale + localScale * num; } } } private string CharacterBody_GetDisplayName(orig_GetDisplayName orig, CharacterBody self) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) string text = orig.Invoke(self); if (Object.op_Implicit((Object)(object)self.inventory)) { int itemCount = self.inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); if (itemCount > 0) { return $"{text} <style=cStack>x{itemCount + 1}</style>"; } } return text; } private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.master) && Object.op_Implicit((Object)(object)sender.master.inventory)) { int itemCount = sender.master.inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); if (itemCount > 0) { args.baseHealthAdd += (sender.baseMaxHealth + sender.levelMaxHealth * sender.level) * (float)itemCount * (float)PluginConfig.statMultHealth.Value * 0.01f; args.baseDamageAdd += (sender.baseDamage + sender.levelDamage * sender.level) * (float)itemCount * (float)PluginConfig.statMultDamage.Value * 0.01f; args.baseAttackSpeedAdd += (sender.baseAttackSpeed + sender.levelAttackSpeed * sender.level) * (float)itemCount * (float)PluginConfig.statMultAttackSpeed.Value * 0.01f; args.cooldownMultAdd -= Util.ConvertAmplificationPercentageIntoReductionNormalized((float)(itemCount * PluginConfig.statMultCDR.Value) * 0.01f); } } } } public static class MeldingTime { public enum DronemeldPriorityOrder { RoundRobin, Random, FirstOnly } public static void HandleInventory(DirectorSpawnRequest spawnReq, Inventory inventory, SpawnResult result) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) int itemCount = inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); inventory.itemAcquisitionOrder.Clear(); inventory.itemStacks = ItemCatalog.RequestItemStackArray(); inventory.itemAcquisitionOrder.Add(MinionMeldPlugin.meldStackIndex); inventory.itemStacks[MinionMeldPlugin.meldStackIndex] = itemCount; spawnReq.onSpawnedServer?.Invoke(result); int itemCount2 = inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); inventory.GiveItem(MinionMeldPlugin.meldStackIndex, itemCount - itemCount2); } public static void HandleInventory(MasterSummon self, CharacterMaster newSummon, Inventory inventory) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_009b: Unknown result type (might be due to invalid IL or missing references) int itemCount = inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); if (Object.op_Implicit((Object)(object)self.inventoryToCopy)) { inventory.CopyItemsFrom(self.inventoryToCopy, self.inventoryItemCopyFilter ?? Inventory.defaultItemCopyFilterDelegate); } else { inventory.itemAcquisitionOrder.Clear(); inventory.itemStacks = ItemCatalog.RequestItemStackArray(); inventory.itemAcquisitionOrder.Add(MinionMeldPlugin.meldStackIndex); inventory.itemStacks[MinionMeldPlugin.meldStackIndex] = itemCount; } IInventorySetupCallback inventorySetupCallback = self.inventorySetupCallback; if (inventorySetupCallback != null) { inventorySetupCallback.SetupSummonedInventory(self, inventory); } self.preSpawnSetupCallback?.Invoke(newSummon); int itemCount2 = inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); inventory.GiveItem(MinionMeldPlugin.meldStackIndex, itemCount - itemCount2); } public static CharacterMaster ApplyPerPlayer(MasterIndex masterIdx, CharacterMaster summonerMaster) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) List<CharacterMaster> list = new List<CharacterMaster>(); DronemeldPriorityOrder value = PluginConfig.priorityOrder.Value; NetworkInstanceId netId = ((NetworkBehaviour)summonerMaster).netId; if (Object.op_Implicit((Object)(object)summonerMaster.minionOwnership.ownerMaster)) { netId = ((NetworkBehaviour)summonerMaster.minionOwnership.ownerMaster).netId; } MinionGroup val = MinionGroup.FindGroup(netId); if (val != null) { MinionOwnership[] members = val.members; foreach (MinionOwnership val2 in members) { if (!Object.op_Implicit((Object)(object)val2)) { continue; } CharacterMaster component = ((Component)val2).GetComponent<CharacterMaster>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.inventory) && component.masterIndex == masterIdx && !component.IsDeadAndOutOfLivesServer()) { if (value == DronemeldPriorityOrder.FirstOnly) { return component; } list.Add(component); } } } if (list.Any() && list.Count >= PluginConfig.maxDronesPerType.Value) { return (CharacterMaster)(value switch { DronemeldPriorityOrder.RoundRobin => list.OrderBy((CharacterMaster m) => m.inventory.GetItemCount(MinionMeldPlugin.meldStackIndex)).FirstOrDefault(), DronemeldPriorityOrder.Random => list.ElementAtOrDefault(Random.Range(0, list.Count)), _ => null, }); } return null; } public static CharacterMaster ApplyGlobal(MasterIndex masterIdx) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) List<CharacterMaster> list = new List<CharacterMaster>(); DronemeldPriorityOrder value = PluginConfig.priorityOrder.Value; foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers((TeamIndex)1)) { if (!Object.op_Implicit((Object)(object)teamMember) || !Object.op_Implicit((Object)(object)teamMember.body)) { continue; } CharacterMaster master = teamMember.body.master; if (Object.op_Implicit((Object)(object)master) && Object.op_Implicit((Object)(object)master.inventory) && master.masterIndex == masterIdx && !master.IsDeadAndOutOfLivesServer()) { if (value == DronemeldPriorityOrder.FirstOnly) { return master; } list.Add(master); } } if (list.Any() && list.Count >= PluginConfig.maxDronesPerType.Value) { return (CharacterMaster)(value switch { DronemeldPriorityOrder.RoundRobin => list.OrderBy((CharacterMaster m) => m.inventory.GetItemCount(MinionMeldPlugin.meldStackIndex)).FirstOrDefault(), DronemeldPriorityOrder.Random => list.ElementAtOrDefault(Random.Range(0, list.Count)), _ => null, }); } return null; } public static bool CanApply(MasterIndex masterIdx, TeamIndex summonerTeam, TeamIndex? teamIndexOverride) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (masterIdx != MasterIndex.none && (int)(teamIndexOverride.HasValue ? teamIndexOverride.Value : summonerTeam) == 1) { if (PluginConfig.useWhitelist.Value) { return PluginConfig.MasterWhitelist.Contains(masterIdx); } return !PluginConfig.MasterBlacklist.Contains(masterIdx); } return false; } public static bool CanApplyTurret(CharacterMaster master) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Invalid comparison between Unknown and I4 //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) if (PluginConfig.teleturret.Value && (int)master.teamIndex == 1 && master.masterIndex != MasterIndex.none) { if (PluginConfig.useWhitelist.Value) { return PluginConfig.TurretWhitelist.Contains(master.masterIndex); } if (!PluginConfig.MasterBlacklist.Contains(master.masterIndex)) { return !PluginConfig.TurretBlacklist.Contains(master.masterIndex); } return false; } return false; } public static bool PerformMeld(MasterIndex masterIdx, CharacterMaster summonerMaster, out CharacterMaster newSummon) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) newSummon = (PluginConfig.perPlayer.Value ? ApplyPerPlayer(masterIdx, summonerMaster) : ApplyGlobal(masterIdx)); if (Object.op_Implicit((Object)(object)newSummon)) { newSummon.inventory.GiveItem(MinionMeldPlugin.meldStackIndex, 1); MasterSuicideOnTimer val = default(MasterSuicideOnTimer); if (((Component)newSummon).TryGetComponent<MasterSuicideOnTimer>(ref val)) { ((Component)newSummon).gameObject.AddComponent<TimedMeldStack>().Activate(val.lifeTimer - val.timer); Object.Destroy((Object)(object)val); } int itemCount = newSummon.inventory.GetItemCount(Items.HealthDecay); if (itemCount > 0) { CharacterBody body = newSummon.GetBody(); if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)body.healthComponent)) { ((Component)newSummon).gameObject.AddComponent<TimedMeldStack>().Activate((float)itemCount * body.healthComponent.combinedHealthFraction); int num = 1 + newSummon.inventory.GetItemCount(MinionMeldPlugin.meldStackIndex); body.healthComponent.HealFraction(1f / (float)num, default(ProcChainMask)); } } } return (Object)(object)newSummon != (Object)null; } public static void InitMinion(CharacterMaster newSummon) { CharacterBody body = newSummon.GetBody(); if (!Object.op_Implicit((Object)(object)body)) { return; } if (PluginConfig.disableTeamCollision.Value) { ((Component)body).gameObject.layer = LayerIndex.fakeActor.intVal; if (Object.op_Implicit((Object)(object)body.characterMotor)) { ((BaseCharacterController)body.characterMotor).Motor.RebuildCollidableLayers(); } } if (CanApplyTurret(newSummon)) { TryAddTeleTurret(body); } } public static void TryAddTeleTurret(CharacterBody body) { if (PluginConfig.teleturret.Value && Object.op_Implicit((Object)(object)body) && !Object.op_Implicit((Object)(object)((Component)body).GetComponent<TeleportingTurret>()) && ((!Object.op_Implicit((Object)(object)body.characterMotor) && !Object.op_Implicit((Object)(object)((Component)body).GetComponent<KinematicCharacterMotor>()) && !Object.op_Implicit((Object)(object)((Component)body).GetComponent<RigidbodyMotor>())) || body.baseMoveSpeed <= 0f)) { ((Component)body).gameObject.AddComponent<TeleportingTurret>(); } } public static Vector3? FindSpawnDestination(CharacterBody characterBodyOrPrefabComponent, DirectorPlacementRule rule, Xoroshiro128Plus rng) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0039: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Invalid comparison between Unknown and I4 //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) Vector3? result = null; SpawnCard obj = ScriptableObject.CreateInstance<SpawnCard>(); obj.hullSize = characterBodyOrPrefabComponent.hullClassification; obj.nodeGraphType = (GraphType)0; obj.prefab = LegacyResourcesAPI.Load<GameObject>("SpawnCards/HelperPrefab"); DirectorSpawnRequest val = new DirectorSpawnRequest(obj, rule, rng); GameObject val2 = DirectorCore.instance.TrySpawnObject(val); if (!Object.op_Implicit((Object)(object)val2)) { if ((int)val.placementRule.placementMode < 2) { val.placementRule.placementMode = (PlacementMode)2; val2 = DirectorCore.instance.TrySpawnObject(val); } if (!Object.op_Implicit((Object)(object)val2)) { val.placementRule.placementMode = (PlacementMode)5; val2 = DirectorCore.instance.TrySpawnObject(val); } } if (Object.op_Implicit((Object)(object)val2)) { result = val2.transform.position; Object.Destroy((Object)(object)val2); } Object.Destroy((Object)(object)obj); return result; } } public static class TurretHooks { [CompilerGenerated] private static class <>O { public static hook_OnImpactServer <0>__DeathState_OnImpactServer; public static hook_Respawn <1>__CharacterMaster_Respawn; public static hook_TrackInteractions <2>__HalcyoniteShrineInteractable_TrackInteractions; public static hook_OnEnable <3>__HoldoutZoneController_OnEnable; public static hook_BeginEncounter <4>__ScriptedCombatEncounter_BeginEncounter; } private static bool _initialized; public static void Init() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //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_0049: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_007e: 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) //IL_0089: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Expected O, but got Unknown if (!_initialized) { _initialized = true; object obj = <>O.<0>__DeathState_OnImpactServer; if (obj == null) { hook_OnImpactServer val = DeathState_OnImpactServer; <>O.<0>__DeathState_OnImpactServer = val; obj = (object)val; } DeathState.OnImpactServer += (hook_OnImpactServer)obj; object obj2 = <>O.<1>__CharacterMaster_Respawn; if (obj2 == null) { hook_Respawn val2 = CharacterMaster_Respawn; <>O.<1>__CharacterMaster_Respawn = val2; obj2 = (object)val2; } CharacterMaster.Respawn += (hook_Respawn)obj2; object obj3 = <>O.<2>__HalcyoniteShrineInteractable_TrackInteractions; if (obj3 == null) { hook_TrackInteractions val3 = HalcyoniteShrineInteractable_TrackInteractions; <>O.<2>__HalcyoniteShrineInteractable_TrackInteractions = val3; obj3 = (object)val3; } HalcyoniteShrineInteractable.TrackInteractions += (hook_TrackInteractions)obj3; object obj4 = <>O.<3>__HoldoutZoneController_OnEnable; if (obj4 == null) { hook_OnEnable val4 = HoldoutZoneController_OnEnable; <>O.<3>__HoldoutZoneController_OnEnable = val4; obj4 = (object)val4; } HoldoutZoneController.OnEnable += (hook_OnEnable)obj4; object obj5 = <>O.<4>__ScriptedCombatEncounter_BeginEncounter; if (obj5 == null) { hook_BeginEncounter val5 = ScriptedCombatEncounter_BeginEncounter; <>O.<4>__ScriptedCombatEncounter_BeginEncounter = val5; obj5 = (object)val5; } ScriptedCombatEncounter.BeginEncounter += (hook_BeginEncounter)obj5; } } private static void HalcyoniteShrineInteractable_TrackInteractions(orig_TrackInteractions orig, HalcyoniteShrineInteractable self) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); UpdateTurretPositions(((Component)self).transform.position); } private static void HoldoutZoneController_OnEnable(orig_OnEnable orig, HoldoutZoneController self) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); UpdateTurretPositions(((Component)self).transform.position); } private static void ScriptedCombatEncounter_BeginEncounter(orig_BeginEncounter orig, ScriptedCombatEncounter self) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); UpdateTurretPositions(((Component)self).transform.position); } private static void UpdateTurretPositions(Vector3 newPosition) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return; } foreach (TeleportingTurret instances in TeleportingTurret.instancesList) { instances.CreateTeleportNode(newPosition); } } private static CharacterBody CharacterMaster_Respawn(orig_Respawn orig, CharacterMaster self, Vector3 footPosition, Quaternion rotation, bool wasRevivedMidStage) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) CharacterBody val = orig.Invoke(self, footPosition, rotation, wasRevivedMidStage); if (MeldingTime.CanApplyTurret(self)) { MeldingTime.TryAddTeleTurret(val); } return val; } private static void DeathState_OnImpactServer(orig_OnImpactServer orig, DeathState self, Vector3 contactPoint) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, contactPoint); Inventory val = (Object.op_Implicit((Object)(object)((EntityState)self).characterBody) ? ((EntityState)self).characterBody.inventory : null); if (Object.op_Implicit((Object)(object)val)) { int itemCount = val.GetItemCount(MinionMeldPlugin.meldStackIndex); for (int i = 1; i < itemCount; i++) { orig.Invoke(self, contactPoint); } } } } } namespace MinionMeld.Components { public class MultiEquipDrone { [CompilerGenerated] private static class <>O { public static Action<EquipmentSlot, EquipmentIndex> <0>__ActivateAllEquipment; public static hook_SetEquipment <1>__Inventory_SetEquipment; } public static MultiEquipDrone Instance { get; private set; } public static void Init() { if (Instance == null) { Instance = new MultiEquipDrone(); } } private MultiEquipDrone() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown EquipmentSlot.onServerEquipmentActivated += ActivateAllEquipment; CharacterBody.OnInventoryChanged += new Manipulator(CharacterBody_OnInventoryChanged); object obj = <>O.<1>__Inventory_SetEquipment; if (obj == null) { hook_SetEquipment val = Inventory_SetEquipment; <>O.<1>__Inventory_SetEquipment = val; obj = (object)val; } Inventory.SetEquipment += (hook_SetEquipment)obj; } private static void Inventory_SetEquipment(orig_SetEquipment orig, Inventory self, EquipmentState equipmentState, uint slot) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Invalid comparison between Unknown and I4 //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || self.GetItemCount(MinionMeldPlugin.meldStackIndex) <= 0 || (int)equipmentState.equipmentIndex == -1 || (int)self.GetEquipment(slot).equipmentIndex == -1) { orig.Invoke(self, equipmentState, slot); return; } for (uint num = 0u; num < self.equipmentStateSlots.Length; num++) { if (self.equipmentStateSlots[num].equipmentIndex == equipmentState.equipmentIndex) { orig.Invoke(self, equipmentState, num); return; } } for (uint num2 = (uint)self.equipmentStateSlots.Length; num2 > slot; num2--) { EquipmentState equipment = self.GetEquipment(num2 - 1); if (self.SetEquipmentInternal(equipment, num2)) { ((NetworkBehaviour)self).SetDirtyBit(16u); self.HandleInventoryChanged(); if (self.spawnedOverNetwork) { self.CallRpcClientEquipmentChanged(equipment.equipmentIndex, num2); } } } orig.Invoke(self, equipmentState, slot); if (self.activeEquipmentSlot == slot) { return; } EquipmentDef equipmentDef = self.GetEquipment(slot).equipmentDef; if (Object.op_Implicit((Object)(object)equipmentDef) && equipmentDef.cooldown > 0f) { EquipmentDef equipmentDef2 = self.currentEquipmentState.equipmentDef; if (!Object.op_Implicit((Object)(object)equipmentDef2) || equipmentDef2.cooldown <= 0f || equipmentDef.cooldown < equipmentDef2.cooldown) { self.SetActiveEquipmentSlot((byte)slot); } } } private static void ActivateAllEquipment(EquipmentSlot self, EquipmentIndex equipmentIndex) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return; } Inventory val = (Object.op_Implicit((Object)(object)self.characterBody) ? self.characterBody.inventory : null); if (!Object.op_Implicit((Object)(object)val) || val.GetItemCount(MinionMeldPlugin.meldStackIndex) <= 0) { return; } int equipmentSlotCount = val.GetEquipmentSlotCount(); if (equipmentSlotCount <= 1) { return; } for (uint num = 0u; num < equipmentSlotCount; num++) { if (num != val.activeEquipmentSlot) { EquipmentDef equipmentDef = EquipmentCatalog.GetEquipmentDef(val.GetEquipment(num).equipmentIndex); if (Object.op_Implicit((Object)(object)equipmentDef) && equipmentDef.cooldown > 0f) { self.PerformEquipmentAction(equipmentDef); } } } } private void CharacterBody_OnInventoryChanged(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[3] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0), (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 1), (Instruction x) => ILPatternMatchingExt.MatchStfld<CharacterBody>(x, "statsDirty") })) { val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Action<CharacterBody>>((Action<CharacterBody>)delegate(CharacterBody body) { //IL_0006: 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 (body.inventory.GetItemCount(MinionMeldPlugin.meldStackIndex) > 0) { for (uint num = 0u; num < body.inventory.GetEquipmentSlotCount(); num++) { BuffDef val2 = body.inventory.GetEquipment(num).equipmentDef?.passiveBuffDef; if (Object.op_Implicit((Object)(object)val2) && !body.HasBuff(val2)) { body.AddBuff(val2); } } } }); } else { Log.Error("MinionMeld.CharacterBody_OnInventoryChanged: ILHook failed."); } } } [RequireComponent(typeof(CharacterBody))] public class TeleportingTurret : MonoBehaviour { private readonly List<Vector3> storedNodes = new List<Vector3>(); private CharacterBody body; private CharacterBody ownerBody; private float teleportAttemptTimer; private Vector3 currentNode; public static List<TeleportingTurret> instancesList = new List<TeleportingTurret>(); private void OnEnable() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) instancesList.Add(this); body = ((Component)this).GetComponent<CharacterBody>(); storedNodes.Add(body.footPosition); currentNode = body.footPosition; } private void OnDisable() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) instancesList.Remove(this); currentNode = Vector3.zero; storedNodes.Clear(); } public void FixedUpdate() { if (!Object.op_Implicit((Object)(object)ownerBody)) { CharacterMaster master = body.master; CharacterMaster val = (Object.op_Implicit((Object)(object)master) ? master.minionOwnership.ownerMaster : null); ownerBody = (Object.op_Implicit((Object)(object)val) ? val.GetBody() : null); } teleportAttemptTimer -= Time.fixedDeltaTime; if (!(teleportAttemptTimer > 0f)) { teleportAttemptTimer = 2f; CheckNodesForTeleport(); } } public void RegisterLocation(Vector3 pos) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) foreach (Vector3 storedNode in storedNodes) { Vector3 val = storedNode - pos; if (((Vector3)(ref val)).sqrMagnitude < 400f) { return; } } storedNodes.Add(pos); teleportAttemptTimer = 0f; } private void CheckNodesForTeleport() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)ownerBody) || !Object.op_Implicit((Object)(object)body)) { return; } HealthComponent healthComponent = body.healthComponent; if (healthComponent == null || !healthComponent.alive) { return; } Vector3 val = currentNode; Vector3 position = ownerBody.transform.position; Vector3 val2 = val - position; float num = ((Vector3)(ref val2)).sqrMagnitude; if (PluginConfig.enableTurretLeash.Value && num > (float)(PluginConfig.minionLeashRange.Value * PluginConfig.minionLeashRange.Value)) { Vector3? val3 = MeldingTime.FindSpawnDestination(body, new DirectorPlacementRule { position = position, placementMode = (PlacementMode)1 }, RoR2Application.rng); if (val3.HasValue) { RegisterLocation(val3.Value); } } foreach (Vector3 storedNode in storedNodes) { val2 = storedNode - position; float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude; if (sqrMagnitude < num) { num = sqrMagnitude; val = storedNode; } } if (currentNode != val) { TeleportHelper.TeleportGameObject(((Component)this).gameObject, val); ((Component)this).transform.rotation = Quaternion.identity; currentNode = val; } } public void CreateTeleportNode(Vector3 destination) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0094: 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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)body)) { return; } HealthComponent healthComponent = body.healthComponent; if (healthComponent == null || !healthComponent.alive) { return; } Vector3 footPosition = currentNode; Vector3 val = footPosition - destination; float num = ((Vector3)(ref val)).sqrMagnitude; foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { if (Object.op_Implicit((Object)(object)instance.body)) { if ((Object)(object)instance.body == (Object)(object)ownerBody) { footPosition = ownerBody.footPosition; } val = instance.body.footPosition - destination; float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude; if (sqrMagnitude < num) { num = sqrMagnitude; footPosition = instance.body.footPosition; } } } Vector3? val2 = null; DirectorPlacementRule val3 = new DirectorPlacementRule { position = footPosition, placementMode = (PlacementMode)1 }; if (footPosition != currentNode) { val2 = MeldingTime.FindSpawnDestination(body, val3, RoR2Application.rng); } val3.position = destination; if (!val2.HasValue) { val2 = MeldingTime.FindSpawnDestination(body, val3, RoR2Application.rng); } if (val2.HasValue) { RegisterLocation(val2.Value); return; } Log.Message("Failed to create turret teleport node for " + ((Object)body).name); teleportAttemptTimer = 10f; } } [RequireComponent(typeof(CharacterMaster))] public class TimedMeldStack : MonoBehaviour { private float stopwatch; private bool started; public void Activate(float time) { if (!started) { stopwatch = time; started = true; } } private void FixedUpdate() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (!started) { return; } stopwatch -= Time.fixedDeltaTime; if (stopwatch <= 0f) { CharacterMaster component = ((Component)this).GetComponent<CharacterMaster>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.inventory)) { component.inventory.RemoveItem(MinionMeldPlugin.meldStackIndex, 1); } Deployable val = default(Deployable); if (((Component)this).TryGetComponent<Deployable>(ref val)) { val.OnDestroy(); Object.Destroy((Object)(object)val); } Object.Destroy((Object)(object)this); } } } }