using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; 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 ArtifactsOfTheVoid.Artifacts; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.DeepVoidPortalBattery; using EntityStates.DroneScrapper; using EntityStates.Duplicator; using EntityStates.Geode; using EntityStates.Missions.Arena.NullWard; using EntityStates.Missions.Moon; using EntityStates.Missions.RepurposedCrater; using EntityStates.NullifierMonster; using EntityStates.Scrapper; using EntityStates.VoidJailer; using EntityStates.VoidMegaCrab; using EntityStates.VoidRaidCrab; using HG; using HarmonyLib; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using R2API; using RoR2; using RoR2.Audio; using RoR2.ExpansionManagement; 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("ArtifactsOfTheVoid")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+5e3c555319dd87d2f546c9dd24af1b56852aa99f")] [assembly: AssemblyProduct("ArtifactsOfTheVoid")] [assembly: AssemblyTitle("ArtifactsOfTheVoid")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ArtifactsOfTheVoid { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("SomeBunny.ArtifactsOfTheVoid", "ArtifactsOfTheVoid", "1.1.1")] public class ArtifactsVoidPlugin : BaseUnityPlugin { public const string PluginGUID = "SomeBunny.ArtifactsOfTheVoid"; public const string PluginAuthor = "SomeBunny"; public const string PluginName = "ArtifactsOfTheVoid"; public const string PluginVersion = "1.1.1"; public static ArtifactsVoidPlugin Inst; public static ConfigFile configurationFile; public void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) new Harmony("SomeBunny.ArtifactsOfTheVoid").PatchAll(); configurationFile = ((BaseUnityPlugin)this).Config; Inst = this; Log.Init(((BaseUnityPlugin)this).Logger); ArtifactOfInfestation artifactOfInfestation = new ArtifactOfInfestation(); artifactOfInfestation.Init(); ArtifactOfNullification artifactOfNullification = new ArtifactOfNullification(); artifactOfNullification.Init(); ArtifactOfInvasion artifactOfInvasion = new ArtifactOfInvasion(); artifactOfInvasion.Init(); } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } private static string Format(object data, string file, int line) { string fileName = Path.GetFileName(file); return $"[{fileName}:{line}] {data}"; } internal static void Debug(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogDebug((object)Format(data, file, line)); } internal static void Error(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogError((object)Format(data, file, line)); } internal static void Fatal(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogFatal((object)Format(data, file, line)); } internal static void Info(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogInfo((object)Format(data, file, line)); } internal static void Message(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogMessage((object)Format(data, file, line)); } internal static void Warning(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogWarning((object)Format(data, file, line)); } } public static class Tools { public static byte[] ExtractEmbeddedResource(string filePath) { filePath = filePath.Replace("/", "."); filePath = filePath.Replace("\\", "."); Assembly callingAssembly = Assembly.GetCallingAssembly(); using Stream stream = callingAssembly.GetManifestResourceStream(filePath); if (stream == null) { return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); return array; } public static Texture2D GetTextureFromResource(string resourceName) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown byte[] array = ExtractEmbeddedResource(resourceName); if (array == null) { return null; } Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false); ImageConversion.LoadImage(val, array); ((Texture)val).filterMode = (FilterMode)0; string text = resourceName.Substring(0, resourceName.LastIndexOf('.')); if (text.LastIndexOf('.') >= 0) { text = text.Substring(text.LastIndexOf('.') + 1); } ((Object)val).name = text; return val; } public static void Shuffle(this IList list) { int num = list.Count; while (num > 1) { num--; Random random = new Random(); int index = random.Next(num + 1); T value = list[index]; list[index] = list[num]; list[num] = value; } } } public class WeightedTypeCollection { public WeightedType[] elements; public T SelectByWeight(Random generatorRandom) { List list = new List(); int num = 0; for (int i = 0; i < elements.Length; i++) { WeightedType weightedType = elements[i]; if ((float)weightedType.Weight > 0f) { list.Add(i); num += weightedType.Weight; } } list.Shuffle(); int num2 = 100; int? num3 = null; while (!num3.HasValue) { num2--; if (num2 < 0) { break; } int num4 = Random.Range(0, num + 1); for (int j = 0; j < list.Count; j++) { int num5 = list[j]; if (num4 >= 0 && num4 <= elements[num5].Weight) { num3 = num5; break; } } if (num3.HasValue) { break; } } return elements[num3.GetValueOrDefault()].value; } public T SelectByWeight() { return SelectByWeight(null); } } public class WeightedType { public T value; public int Weight; } } namespace ArtifactsOfTheVoid.Artifacts { public class ArtifactOfInfestation { public class VoidInfestorContainer { public Type daType = typeof(TeleporterInteraction); public int Amount = 6; public Vector3 Offset = new Vector3(0f, 0f); public float chance = 1f; public float InitialDelay = 0.1f; public float DelayAfterEachInfestor = 0.25f; public Func additionalConditional; public Func modifyDelay; public VoidInfestorContainer(Type type, float _Chance = 1f, int _Amount = 6, float _InitialDelay = 0.1f, float _DelayAfterEachInfestor = 0.25f) { //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) daType = type; Amount = _Amount; chance = _Chance; InitialDelay = _InitialDelay; DelayAfterEachInfestor = _DelayAfterEachInfestor; } public VoidInfestorContainer(Type type, int _Amount = 6, float _InitialDelay = 0.1f, float _DelayAfterEachInfestor = 0.25f) { //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) daType = type; Amount = _Amount; InitialDelay = _InitialDelay; DelayAfterEachInfestor = _DelayAfterEachInfestor; chance = 1f; } } [HarmonyPatch(typeof(Charging), "OnEnter")] public class Charging_OnEnter_Patch { [HarmonyPostfix] public static void Postfix(Charging __instance) { if (Inst.ArtifactEnabled && Object.op_Implicit((Object)(object)VoidStageMissionController.instance)) { ((MonoBehaviour)VoidStageMissionController.instance).StartCoroutine(Inst.Delay(null, null, ((EntityState)__instance).gameObject, (MonoBehaviour)(object)VoidStageMissionController.instance, 8, 3f, 5f)); } } } [HarmonyPatch(typeof(WardOnAndReady), "OnEnter")] public class WardOnAndReady_OnEnter_Patch { [HarmonyPostfix] public static void Postfix(WardOnAndReady __instance) { if (Inst.ArtifactEnabled) { ((MonoBehaviour)((NullWardBaseState)__instance).purchaseInteraction).StartCoroutine(Inst.Delay(null, null, ((Component)((NullWardBaseState)__instance).purchaseInteraction).gameObject, (MonoBehaviour)(object)VoidStageMissionController.instance, 8, 3f, 5f)); } } } [HarmonyPatch(typeof(MoonBatteryActive), "OnEnter")] public class MoonBatteryActive_OnEnter_Patch { [HarmonyPostfix] public static void Postfix(MoonBatteryActive __instance) { if (Inst.ArtifactEnabled) { ((MonoBehaviour)__instance.chargeIndicatorController).StartCoroutine(Inst.Delay(null, null, ((EntityState)__instance).gameObject, (MonoBehaviour)(object)__instance.chargeIndicatorController, 5, 5f, 6f)); } } } [HarmonyPatch(typeof(RouletteChestController), "EjectPickupServer")] public class RouletteChestController_EjectPickupServer_Patch { [HarmonyPrefix] public static void Postfix(RouletteChestController __instance, UniquePickup pickup) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { VoidInfestorContainer voidInfestorContainer = CanTriggerInfestorSpawn(((Component)__instance).gameObject); if (voidInfestorContainer != null) { int amountFromPickupIndex = GetAmountFromPickupIndex(pickup); ((MonoBehaviour)__instance).StartCoroutine(Inst.Delay(voidInfestorContainer, (IInteractable)(object)((__instance is IInteractable) ? __instance : null), ((Component)__instance).gameObject, (MonoBehaviour)(object)__instance, amountFromPickupIndex)); } } } } [HarmonyPatch(typeof(ScrapperController), "PopRewardPickupQueue")] public class ScrapperController_PopRewardPickupQueue_Patch { [HarmonyPostfix] public static void Postfix(ScrapperController __instance, ref UniquePickup __result) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { VoidInfestorContainer voidInfestorContainer = CanTriggerInfestorSpawn(((Component)__instance).gameObject); if (voidInfestorContainer != null) { int amountFromPickupIndex = GetAmountFromPickupIndex(__result); ((MonoBehaviour)__instance).StartCoroutine(Inst.Delay(voidInfestorContainer, (IInteractable)(object)((__instance is IInteractable) ? __instance : null), ((Component)__instance).gameObject, (MonoBehaviour)(object)__instance, amountFromPickupIndex)); } } } } [HarmonyPatch] private static class ChestBehaviorBaseItemDrop { [HarmonyPatch(typeof(ChestBehavior), "BaseItemDrop")] [HarmonyILManipulator] private static void Bomk(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0041: 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_005b: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchCall(instr, "CreatePickupDroplet") })) { val.Emit(OpCodes.Ldarg, 0); val.Emit(OpCodes.Ldloc, 4); val.Emit(OpCodes.Call, (MethodBase)typeof(ChestBehaviorBaseItemDrop).GetMethod("Pop", BindingFlags.Static | BindingFlags.NonPublic)); } } private static void Pop(ChestBehavior chestBehavior, CreatePickupInfo pop) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { int amountFromPickupIndex = GetAmountFromPickupIndex(((CreatePickupInfo)(ref pop)).pickup); ((MonoBehaviour)chestBehavior).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((chestBehavior is IInteractable) ? chestBehavior : null), ((Component)chestBehavior).gameObject, (MonoBehaviour)(object)chestBehavior, amountFromPickupIndex, 0.25f)); } } } [HarmonyPatch(typeof(HalcyoniteShrineInteractable), "DrainConditionMet")] public class HalcyoniteShrineInteractable_DrainConditionMet_Patch { [HarmonyPostfix] public static void Postfix(HalcyoniteShrineInteractable __instance) { if (Inst.ArtifactEnabled) { VoidInfestorContainer voidInfestorContainer = CanTriggerInfestorSpawn(((Component)__instance).gameObject); if (voidInfestorContainer != null) { ((MonoBehaviour)ArtifactsVoidPlugin.Inst).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((__instance is IInteractable) ? __instance : null), ((Component)__instance).gameObject, (MonoBehaviour)(object)__instance, __instance.rewardOptionCount, 0.25f)); } } } } [HarmonyPatch(typeof(ShopTerminalBehavior), "DropPickup", new Type[] { typeof(bool) })] public class ShopTerminalBehavior_DropPickup_Patch { [HarmonyPrefix] public static void Postfix(ShopTerminalBehavior __instance) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { int amountFromPickupIndex = GetAmountFromPickupIndex(__instance.pickup); ((MonoBehaviour)__instance).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((__instance is IInteractable) ? __instance : null), ((Component)__instance).gameObject, (MonoBehaviour)(object)__instance, amountFromPickupIndex, 0.25f)); } } } [HarmonyPatch(typeof(DroneVendorTerminalBehavior), "DispatchDrone")] public class DroneVendorTerminalBehavior_DispatchDrone_Patch { [HarmonyPrefix] public static void Postfix(DroneVendorTerminalBehavior __instance) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { PickupDef pickupDef = PickupCatalog.GetPickupDef(__instance._cachedPickup.pickupIndex); DroneDef droneDef = DroneCatalog.GetDroneDef(pickupDef.droneIndex); int amountFromPickupIndex = GetAmountFromPickupIndex(droneDef.tier); ((MonoBehaviour)__instance).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((__instance is IInteractable) ? __instance : null), ((Component)__instance).gameObject, (MonoBehaviour)(object)__instance, amountFromPickupIndex, 0.25f)); } } } [HarmonyPatch] private static class ShrineChanceBehaviorAddShrineStack { [HarmonyPatch(typeof(ShrineChanceBehavior), "AddShrineStack")] [HarmonyILManipulator] private static void iojueafdijonefdijnlfda(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0079: 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_0093: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchLdstr(instr, "SHRINE_CHANCE_SUCCESS_MESSAGE") }) && val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchLdcR4(instr, 20f) })) { val.Emit(OpCodes.Ldarg, 0); val.Emit(OpCodes.Ldloc, 0); val.Emit(OpCodes.Call, (MethodBase)typeof(ShrineChanceBehaviorAddShrineStack).GetMethod("HEEELP", BindingFlags.Static | BindingFlags.NonPublic)); } } private static void HEEELP(ShrineChanceBehavior chestBehavior, UniquePickup pop) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { int amountFromPickupIndex = GetAmountFromPickupIndex(pop); ((MonoBehaviour)chestBehavior).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((chestBehavior is IInteractable) ? chestBehavior : null), ((Component)chestBehavior).gameObject, (MonoBehaviour)(object)chestBehavior, amountFromPickupIndex, 0.25f)); } } } [HarmonyPatch] private static class ScrapperScrappingToIdleOnEnter { [HarmonyPatch(typeof(ScrappingToIdle), "OnEnter")] [HarmonyILManipulator] private static void fuck(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchLdstr(instr, "Base") }) && val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchCall(instr, "get_active") }) && val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchCall(instr, "CreatePickupDroplet") })) { val.Emit(OpCodes.Ldarg, 0); val.Emit(OpCodes.Ldloc, 0); val.Emit(OpCodes.Call, (MethodBase)typeof(ScrapperScrappingToIdleOnEnter).GetMethod("HEEELP", BindingFlags.Static | BindingFlags.NonPublic)); } } private static void HEEELP(ScrappingToIdle chestBehavior, UniquePickup pop) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { int amountFromPickupIndex = GetAmountFromPickupIndex(pop); ? val = ((ScrapperBaseState)chestBehavior).scrapperController; ArtifactOfInfestation inst = Inst; ScrapperController scrapperController = ((ScrapperBaseState)chestBehavior).scrapperController; ((MonoBehaviour)val).StartCoroutine(inst.Delay(null, (IInteractable)(object)((scrapperController is IInteractable) ? scrapperController : null), ((EntityState)chestBehavior).gameObject, (MonoBehaviour)(object)((ScrapperBaseState)chestBehavior).scrapperController, amountFromPickupIndex, 0.25f)); } } } [HarmonyPatch(typeof(DroneScrappingToIdle), "DropPickup")] public class DroneScrappingToIdle_DropPickup { [HarmonyPostfix] public static void Postfix(DroneScrappingToIdle __instance) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { int amountFromPickupIndex = GetAmountFromPickupIndex(((DroneScrapperBaseState)__instance).scrapperController.lastScrappedTier); ? val = ((DroneScrapperBaseState)__instance).scrapperController; ArtifactOfInfestation inst = Inst; DroneScrapperController scrapperController = ((DroneScrapperBaseState)__instance).scrapperController; ((MonoBehaviour)val).StartCoroutine(inst.Delay(null, (IInteractable)(object)((scrapperController is IInteractable) ? scrapperController : null), ((Component)((DroneScrapperBaseState)__instance).scrapperController).gameObject, (MonoBehaviour)(object)((DroneScrapperBaseState)__instance).scrapperController, amountFromPickupIndex, 0.125f)); } } } [HarmonyPatch(typeof(GeodeShatter), "OnEnter")] public class EntityStatesGeode_GeodeShatter_OnEnter { [HarmonyPostfix] public static void Postfix(GeodeShatter __instance) { if (Inst.ArtifactEnabled) { int num = 1; if (((GeodeEntityStates)__instance).geodeController.ShouldDropReward) { num += 3; } if (((GeodeEntityStates)__instance).geodeController.ShouldRegenerate) { num /= 3; } num = Mathf.Max(1, num); ((MonoBehaviour)((GeodeEntityStates)__instance).geodeController).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((GeodeEntityStates)__instance).geodeController, ((Component)((GeodeEntityStates)__instance).geodeController).gameObject, (MonoBehaviour)(object)((GeodeEntityStates)__instance).geodeController, num, 0.125f)); } } } [HarmonyPatch(typeof(Duplicating), "DropDroplet")] public class EntityStatesDuplicatorDuplicating_DropDroplet { [HarmonyPostfix] public static void Postfix(Duplicating __instance) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { ShopTerminalBehavior component = ((EntityState)__instance).GetComponent(); int amountFromPickupIndex = GetAmountFromPickupIndex(component.pickup); ((MonoBehaviour)component).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((component is IInteractable) ? component : null), ((EntityState)__instance).gameObject, (MonoBehaviour)(object)component, amountFromPickupIndex * Mathf.Max(1, component.debt * component.dropAmount), 0.25f)); } } } [HarmonyPatch] private static class PickupDistributorBehaviorDrop { [HarmonyPatch(typeof(PickupDistributorBehavior), "Drop")] [HarmonyILManipulator] private static void fuck(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchConvI4(instr) }) && val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchLdnull(instr) }) && val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchLdfld(instr, "itemsDropped") }) && val.TryGotoNext((MoveType)2, new Func[1] { (Instruction instr) => ILPatternMatchingExt.MatchCall(instr, "CreatePickupDroplet") })) { val.Emit(OpCodes.Ldarg, 0); val.Emit(OpCodes.Ldloc, 4); val.Emit(OpCodes.Call, (MethodBase)typeof(PickupDistributorBehaviorDrop).GetMethod("HEEELP", BindingFlags.Static | BindingFlags.NonPublic)); } } private static void HEEELP(PickupDistributorBehavior chestBehavior, CreatePickupInfo pop) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { int amountFromPickupIndex = GetAmountFromPickupIndex(((CreatePickupInfo)(ref pop)).pickup); ((MonoBehaviour)chestBehavior).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((chestBehavior is IInteractable) ? chestBehavior : null), ((Component)chestBehavior).gameObject, (MonoBehaviour)(object)chestBehavior, amountFromPickupIndex, 0.25f)); } } } [HarmonyPatch(typeof(PowerOrbPedestalManager), "DoInteractResult")] public class PowerOrbPedestalManager_DoInteractResult { [HarmonyPostfix] public static void Postfix(PowerOrbPedestalManager __instance) { if (Inst.ArtifactEnabled) { ((MonoBehaviour)__instance).StartCoroutine(Inst.Delay(null, (IInteractable)(object)((__instance is IInteractable) ? __instance : null), ((Component)__instance).gameObject, (MonoBehaviour)(object)__instance, 5, 1f, 0.5f)); } } } private static ArtifactDef InfestationArtifactDefinition; public static ArtifactOfInfestation Inst; private CharacterSpawnCard voidRaidCrabPhase2 = Addressables.LoadAssetAsync((object)"RoR2/DLC1/VoidRaidCrab/cscMiniVoidRaidCrabPhase2.asset").WaitForCompletion(); public CharacterSpawnCard InfestorPrefab = Addressables.LoadAssetAsync((object)"RoR2/DLC1/EliteVoid/cscVoidInfestor.asset").WaitForCompletion(); public static ConfigEntry FunkyMode; public static ConfigEntry CrabSurprise; public static Dictionary itemCount = new Dictionary { { (ItemTier)4, 4 }, { (ItemTier)3, 4 }, { (ItemTier)5, 0 }, { (ItemTier)0, 1 }, { (ItemTier)1, 3 }, { (ItemTier)2, 8 }, { (ItemTier)9, 6 }, { (ItemTier)6, 2 }, { (ItemTier)7, 4 }, { (ItemTier)8, 10 }, { (ItemTier)10, 6 } }; public static List containers = new List { new VoidInfestorContainer(typeof(ShrineRestackBehavior), 4, 1f, 0.5f), new VoidInfestorContainer(typeof(ShrineBossBehavior), 3, 1f, 3f), new VoidInfestorContainer(typeof(ShrinePlaceTotem), 0), new VoidInfestorContainer(typeof(ShrineCleanseBehavior), 3, 0.1f, 0.2f), new VoidInfestorContainer(typeof(ShrineCombatBehavior), 3, 0.25f), new VoidInfestorContainer(typeof(TimedChestController), 12, 1.25f, 0.1f), new VoidInfestorContainer(typeof(BarrelInteraction), 0.25f, 1), new VoidInfestorContainer(typeof(PortalStatueBehavior), 3, 0.25f), new VoidInfestorContainer(typeof(RouletteChestController), 0), new VoidInfestorContainer(typeof(ScrapperController), 0, 3.25f, 0.3f), new VoidInfestorContainer(typeof(ShrineCombatBehavior), 3, 0.5f, 0.5f), new VoidInfestorContainer(typeof(ShrineHealingBehavior), 1, 0.125f, 0f), new VoidInfestorContainer(typeof(ShrineRebirthController), 16, 0.5f, 0.025f), new VoidInfestorContainer(typeof(ShrineBloodBehavior), 1) { additionalConditional = (IInteractable _) => ((ShrineBloodBehavior)(((_ is ShrineBloodBehavior) ? _ : null)?)).purchaseCount ?? 0 }, new VoidInfestorContainer(typeof(VendingMachineBehavior), 1, 1f, 0.1f) { additionalConditional = delegate(IInteractable _) { VendingMachineBehavior val6 = (VendingMachineBehavior)(object)((_ is VendingMachineBehavior) ? _ : null); return (val6 != null && Random.value < (float)Mathf.Max(val6.purchaseCount - 4, 0) * 0.0833f) ? 1 : 0; } }, new VoidInfestorContainer(typeof(ShrineHealingBehavior), 0, 0.25f, 0.5f) { additionalConditional = delegate(IInteractable _) { ShrineHealingBehavior val5 = (ShrineHealingBehavior)(object)((_ is ShrineHealingBehavior) ? _ : null); return (val5 != null) ? val5.purchaseCount : 0; } }, new VoidInfestorContainer(typeof(TeleporterInteraction), 8, 5f, 2.5f) { additionalConditional = delegate(IInteractable _) { TeleporterInteraction val4 = (TeleporterInteraction)(object)((_ is TeleporterInteraction) ? _ : null); return (val4 != null) ? (val4.shrineBonusStacks * 4) : 0; } }, new VoidInfestorContainer(typeof(ShopTerminalBehavior), 0, 0.1f, 0.1f) { modifyDelay = delegate(IInteractable _) { ShopTerminalBehavior val3 = (ShopTerminalBehavior)(object)((_ is ShopTerminalBehavior) ? _ : null); return (val3 != null && ((Object)((Component)val3).gameObject).name.Contains("Duplicator")) ? 2.66f : 0f; }, additionalConditional = delegate(IInteractable _) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) ShopTerminalBehavior val2 = (ShopTerminalBehavior)(object)((_ is ShopTerminalBehavior) ? _ : null); return (val2 != null) ? GetAmountFromPickupIndex(val2.pickupDisplay.pickupState) : 0; } }, new VoidInfestorContainer(typeof(ChestBehavior), 0, 0.5f, 0.1f) { additionalConditional = delegate(IInteractable _) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) ChestBehavior val = (ChestBehavior)(object)((_ is ChestBehavior) ? _ : null); return (val != null) ? GetAmountFromPickupIndex(val.currentPickup) : 0; } }, new VoidInfestorContainer(typeof(OptionChestBehavior), 0, 0.1f, 0.33f) { additionalConditional = (IInteractable _) => 0 } }; private static string ArtifactLangTokenName => "ARTIFACT_OF_INFEST"; private static string ArtifactName => "Artifact of Infestation"; private static string ArtifactDescription => "When enabled, causes most interactables to spawn Void Infestors when used."; public bool ArtifactEnabled => RunArtifactManager.instance.IsArtifactEnabled(InfestationArtifactDefinition); public void Init() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) Inst = this; LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_NAME", ArtifactName); LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION", ArtifactDescription); InfestationArtifactDefinition = ScriptableObject.CreateInstance(); Texture2D textureFromResource = Tools.GetTextureFromResource("ArtifactsOfTheVoid/Textures/infestorEnabled.png"); Sprite smallIconSelectedSprite = Sprite.Create(textureFromResource, new Rect(0f, 0f, (float)((Texture)textureFromResource).width, (float)((Texture)textureFromResource).height), new Vector2(0.5f, 0.5f)); Texture2D textureFromResource2 = Tools.GetTextureFromResource("ArtifactsOfTheVoid/Textures/infestorDisabled.png"); Sprite smallIconDeselectedSprite = Sprite.Create(textureFromResource2, new Rect(0f, 0f, (float)((Texture)textureFromResource2).width, (float)((Texture)textureFromResource2).height), new Vector2(0.5f, 0.5f)); InfestationArtifactDefinition.smallIconSelectedSprite = smallIconSelectedSprite; InfestationArtifactDefinition.smallIconDeselectedSprite = smallIconDeselectedSprite; InfestationArtifactDefinition.requiredExpansion = Addressables.LoadAssetAsync((object)"RoR2/DLC1/Common/DLC1.asset").WaitForCompletion(); InfestationArtifactDefinition.cachedName = "ARTIFACT_" + ArtifactLangTokenName; InfestationArtifactDefinition.nameToken = "ARTIFACT_" + ArtifactLangTokenName + "_NAME"; InfestationArtifactDefinition.descriptionToken = "ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION"; GlobalEventManager.OnInteractionsGlobal += GlobalEventManager_OnInteractionsGlobal; ContentAddition.AddArtifactDef(InfestationArtifactDefinition); FunkyMode = ArtifactsVoidPlugin.configurationFile.Bind("Artifact: " + ArtifactName, "Funky Mode", false, "get funky oh yeahhh"); CrabSurprise = ArtifactsVoidPlugin.configurationFile.Bind("Artifact: " + ArtifactName, "Crab Surprise", 0f, "The chance of a Giant Enemy Crab appearing is low... but never zero. Unless it's been set to zero. Value should range from 0-1. Preferably use low values like 0.005."); } public static VoidInfestorContainer CanTriggerInfestorSpawn(GameObject gameObject) { foreach (VoidInfestorContainer container in containers) { if ((Object)(object)gameObject.GetComponent(container.daType) != (Object)null && Random.value < container.chance) { return container; } } return null; } public static VoidInfestorContainer CanTriggerInfestorSpawn(T interactable) where T : Type { IEnumerable enumerable = containers.Where((VoidInfestorContainer aie) => aie.daType == interactable); if (enumerable != null && enumerable.Count() > 0) { VoidInfestorContainer voidInfestorContainer = enumerable.First(); if (voidInfestorContainer != null) { if (FunkyMode.Value && (double)Random.value < 0.3) { if (Random.value < Random.value) { return voidInfestorContainer; } } else if (Random.value < voidInfestorContainer.chance) { return voidInfestorContainer; } } } return null; } private void GlobalEventManager_OnInteractionsGlobal(Interactor arg1, IInteractable arg2, GameObject arg3) { if (ArtifactEnabled) { VoidInfestorContainer voidInfestorContainer = CanTriggerInfestorSpawn(arg3); if (voidInfestorContainer != null) { ((MonoBehaviour)arg1).StartCoroutine(Delay(voidInfestorContainer, arg2, arg3, (MonoBehaviour)(object)arg1)); } } } public IEnumerator Delay(VoidInfestorContainer container, IInteractable interactable, GameObject arg3, MonoBehaviour interactor, int? OverrideAmount = null, float overrideInitialDelay = -1f, float overrideDelatAfterEachInfestor = -1f, float offsetX = 0f, float offsetY = 0f, float offsetZ = 0f, Transform overrtansTrans = null) { if ((Object)(object)arg3 == (Object)null) { yield break; } float e = 0f; float d = ((overrideInitialDelay > -1f) ? overrideInitialDelay : (container?.InitialDelay ?? 1f)); if (container != null && container.modifyDelay != null) { d += container.modifyDelay(interactable); } if (FunkyMode.Value) { d = (((double)Random.value < 0.05) ? ((float)Random.Range(12, 30)) : ((!((double)Random.value < 0.5)) ? (d * Random.Range(0.25f, 2f)) : Random.Range(0.1f, 4f))); } while (e < d) { e += Time.deltaTime; if ((Object)(object)arg3 == (Object)null) { yield break; } yield return null; } ModelLocator component2 = arg3.GetComponent(); Transform transform2; if ((Object)(object)component2 == (Object)null) { transform2 = null; } else { Transform modelTransform = component2.modelTransform; if ((Object)(object)modelTransform == (Object)null) { transform2 = null; } else { ChildLocator component3 = ((Component)modelTransform).GetComponent(); transform2 = (((Object)(object)component3 != (Object)null) ? component3.FindChild("FireworkOrigin") : null); } } int amount = OverrideAmount ?? container.Amount; float daei = ((overrideDelatAfterEachInfestor > -1f) ? overrideDelatAfterEachInfestor : (container?.DelayAfterEachInfestor ?? 0.25f)); if (container != null && OverrideAmount.GetValueOrDefault() == -1 && container.additionalConditional != null && interactable != null) { amount += container.additionalConditional(interactable); } if (Object.op_Implicit((Object)(object)overrtansTrans)) { transform2 = overrtansTrans; } interactor.StartCoroutine(SpawnInfestorAmount(arg3.transform, amount, container?.Offset.x ?? offsetX, container?.Offset.y ?? offsetY, container?.Offset.z ?? offsetZ, transform2, daei)); } public IEnumerator SpawnInfestorAmount(Transform transformPosition, int Amount = 1, float x = 0f, float y = 0f, float z = 0f, Transform Th = null, float delay = 0.1f) { if (!ArtifactEnabled) { yield break; } if (FunkyMode.Value) { Amount = ((!((double)Random.value < 0.1)) ? Random.Range(Mathf.Max(Amount, 1), Mathf.Max(Amount + 4, 5)) : Random.Range(Mathf.Max(Amount, 8), Mathf.Max(Amount + 4, 16))); delay = (((double)Random.value < 0.2) ? (delay * 0.01f) : ((!((double)Random.value < 0.5)) ? Random.Range(delay * 0.33f, delay * 3f) : Random.Range(delay * 0.1f, delay * 10f))); } if ((Object)(object)((Component)transformPosition).gameObject == (Object)null) { yield break; } DirectorPlacementRule placementRule = new DirectorPlacementRule { placementMode = (PlacementMode)0, minDistance = 1f, maxDistance = 3f, spawnOnTarget = (Th ?? ((Component)transformPosition).transform), position = (((Object)(object)Th != (Object)null) ? (Th.position + new Vector3(x, y, z)) : (transformPosition.position + new Vector3(x, y, z))) }; ulong seed = Run.instance.seed ^ (ulong)Run.instance.stageClearCount; Xoroshiro128Plus rng = new Xoroshiro128Plus(seed); DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)(object)((CrabSurprise.Value > Random.value) ? voidRaidCrabPhase2 : InfestorPrefab), placementRule, rng); directorSpawnRequest.ignoreTeamMemberLimit = true; directorSpawnRequest.teamIndexOverride = (TeamIndex)4; directorSpawnRequest.onSpawnedServer = (Action)Delegate.Combine(directorSpawnRequest.onSpawnedServer, new Action(OnSp)); for (int i = 0; i < Amount; i++) { float e = 0f; float d = delay; while (e < d) { e += Time.deltaTime; if ((Object)(object)((Component)transformPosition).gameObject == (Object)null) { yield break; } yield return null; } DirectorCore.instance.TrySpawnObject(directorSpawnRequest); } } public void OnSp(SpawnResult b) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)b.spawnedInstance)) { CharacterBody component = b.spawnedInstance.GetComponent(); if (Object.op_Implicit((Object)(object)component)) { component.AddTimedBuff(Buffs.ArmorBoost, 3.5f); } } } public static int GetAmountFromPickupIndex(UniquePickup uniquePickup) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) return GetAmountFromPickupIndex(uniquePickup.pickupIndex); } public static int GetAmountFromPickupIndex(PickupIndex pickupIndex) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Invalid comparison between Unknown and I4 //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_003c: 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_0054: 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_0026: Invalid comparison between Unknown and I4 int value = 0; PickupDef pickupDef = PickupCatalog.GetPickupDef(pickupIndex); if (pickupDef != null && ((int)pickupDef.itemIndex != -1 || (int)pickupDef.equipmentIndex != -1 || (int)pickupDef.itemTier != 5)) { itemCount.TryGetValue(pickupDef.itemTier, out value); if (((IEnumerable)(object)EquipmentCatalog.allEquipment).Contains(pickupDef.equipmentIndex)) { value += 3; } } return value; } public static int GetAmountFromPickupIndex(ItemTier tier) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) int value = 0; itemCount.TryGetValue(tier, out value); return value; } } public class ArtifactOfInvasion { [HarmonyPatch(typeof(DirectorCardCategorySelection), "GenerateDirectorCardWeightedSelection")] public class GenerateDirectorCardWeightedSelection_Patch { [HarmonyPrefix] public static bool Postfix(DirectorCardCategorySelection __instance, ref WeightedSelection __result) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (Inst.ArtifactEnabled) { WeightedSelection val = new WeightedSelection(8); for (int i = 0; i < __instance.categories.Length; i++) { ref Category reference = ref __instance.categories[i]; float num = __instance.SumAllWeightsInCategory(reference); float num2 = reference.selectionWeight / num; if (!(num > 0f)) { continue; } DirectorCard[] cards = reference.cards; foreach (DirectorCard val2 in cards) { if ((Object)(object)val2.spawnCard != (Object)null && (Object)(object)val2.spawnCard.prefab == (Object)(object)((SpawnCard)Inst.VoidCampSpawnCard).prefab) { if (!Stage1Free.Value) { val2.minimumStageCompletions = -1; } Inst.VoidCampSpawnCard.maxSpawnsPerStage = MaximumSeedAmount.Value; val2.spawnCard = (SpawnCard)(object)Inst.VoidCampSpawnCard; ((SpawnCard)Inst.VoidCampSpawnCard).directorCreditCost = Mathf.RoundToInt(Mult / DirectorCreditMult.Value); val2.selectionWeight = SeedSelectionWeight.Value; } if (val2.IsAvailable()) { float num3 = (float)val2.selectionWeight * num2; val.AddChoice(val2, num3); } } } __result = val; return false; } return true; } } private static ArtifactDef InvasionArtifactDefinition; public InteractableSpawnCard VoidCampSpawnCard; public DirectorCard VoidDirectorCard = null; private static float Mult; private static ArtifactOfInvasion Inst; public static ConfigEntry MaximumSeedAmount; public static ConfigEntry SeedSelectionWeight; public static ConfigEntry DirectorCreditMult; public static ConfigEntry Stage1Free; private static string ArtifactLangTokenName => "ARTIFACT_OF_INVASION"; private static string ArtifactName => "Artifact of Invasion"; private static string ArtifactDescription => "Drastically increases Void Seed spawn rate and spawn amount."; public bool ArtifactEnabled => RunArtifactManager.instance.IsArtifactEnabled(InvasionArtifactDefinition); public void Init() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: 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_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Expected O, but got Unknown Inst = this; LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_NAME", ArtifactName); LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION", ArtifactDescription); InvasionArtifactDefinition = ScriptableObject.CreateInstance(); Texture2D textureFromResource = Tools.GetTextureFromResource("ArtifactsOfTheVoid/Textures/invasionEnabled.png"); Sprite smallIconSelectedSprite = Sprite.Create(textureFromResource, new Rect(0f, 0f, (float)((Texture)textureFromResource).width, (float)((Texture)textureFromResource).height), new Vector2(0.5f, 0.5f)); Texture2D textureFromResource2 = Tools.GetTextureFromResource("ArtifactsOfTheVoid/Textures/invasionDisabled.png"); Sprite smallIconDeselectedSprite = Sprite.Create(textureFromResource2, new Rect(0f, 0f, (float)((Texture)textureFromResource2).width, (float)((Texture)textureFromResource2).height), new Vector2(0.5f, 0.5f)); InvasionArtifactDefinition.smallIconSelectedSprite = smallIconSelectedSprite; InvasionArtifactDefinition.smallIconDeselectedSprite = smallIconDeselectedSprite; InvasionArtifactDefinition.cachedName = "ARTIFACT_" + ArtifactLangTokenName; InvasionArtifactDefinition.nameToken = "ARTIFACT_" + ArtifactLangTokenName + "_NAME"; InvasionArtifactDefinition.descriptionToken = "ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION"; InvasionArtifactDefinition.requiredExpansion = Addressables.LoadAssetAsync((object)"RoR2/DLC1/Common/DLC1.asset").WaitForCompletion(); ContentAddition.AddArtifactDef(InvasionArtifactDefinition); VoidCampSpawnCard = Addressables.LoadAssetAsync((object)"RoR2/DLC1/VoidCamp/iscVoidCamp.asset").WaitForCompletion(); VoidCampSpawnCard.maxSpawnsPerStage = 5; Mult = ((SpawnCard)VoidCampSpawnCard).directorCreditCost; VoidDirectorCard = new DirectorCard(); MaximumSeedAmount = ArtifactsVoidPlugin.configurationFile.Bind("Artifact: " + ArtifactName, "Max Void Seed Amount", 5, "The maximum amount of Void Seeds that can be generated."); SeedSelectionWeight = ArtifactsVoidPlugin.configurationFile.Bind("Artifact: " + ArtifactName, "Void Seed Selection Weight", 1000, "The probability this gets selected to generate compared to other interactables."); DirectorCreditMult = ArtifactsVoidPlugin.configurationFile.Bind("Artifact: " + ArtifactName, "Void Seed Director Credit Mult", 0.5f, "The multiplier for director credits Void Seeds use."); Stage1Free = ArtifactsVoidPlugin.configurationFile.Bind("Artifact: " + ArtifactName, "Stage 1 Free", false, "Prevent first stage from having seeds?"); } } public class ArtifactOfNullification { private static ArtifactDef NullificationArtifactDefinition; public WeightedTypeCollection collection = new WeightedTypeCollection(); public WeightedTypeCollection collectionTwo = new WeightedTypeCollection(); public static GameObject DummyObject; public static ConfigEntry VoidReaverBombCardAmount; public static ConfigEntry VoidJailerBombCardAmount; public static ConfigEntry VoidDevastatorBombCardAmount; public static ConfigEntry VoidlingBombCardAmount; public static ConfigEntry VoidReaverBombCardAmountChampion; public static ConfigEntry VoidJailerBombCardAmountChampion; public static ConfigEntry VoidDevastatorBombCardAmountChampion; public static ConfigEntry VoidlingBombCardAmountChampion; public static ConfigEntry NonEnemyDeathSpawnBlackHoles; public static ConfigEntry DeadPlayersSpawnImplosions; public static ConfigEntry DeadPlayerFinalBreath; public static ConfigEntry StormTime; private static string ArtifactLangTokenName => "ARTIFACT_OF_NULLIFY"; private static string ArtifactName => "Artifact of Nullification"; private static string ArtifactDescription => "When enabled, causes every non-Void enemy to spawn a random Void-related implosion on death."; public bool ArtifactEnabled => RunArtifactManager.instance.IsArtifactEnabled(NullificationArtifactDefinition); public void Init() { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: 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_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Expected O, but got Unknown LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_NAME", ArtifactName); LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION", ArtifactDescription); NullificationArtifactDefinition = ScriptableObject.CreateInstance(); Texture2D textureFromResource = Tools.GetTextureFromResource("ArtifactsOfTheVoid/Textures/nullifyEnabled.png"); Sprite smallIconSelectedSprite = Sprite.Create(textureFromResource, new Rect(0f, 0f, (float)((Texture)textureFromResource).width, (float)((Texture)textureFromResource).height), new Vector2(0.5f, 0.5f)); Texture2D textureFromResource2 = Tools.GetTextureFromResource("ArtifactsOfTheVoid/Textures/nullifyDisabled.png"); Sprite smallIconDeselectedSprite = Sprite.Create(textureFromResource2, new Rect(0f, 0f, (float)((Texture)textureFromResource2).width, (float)((Texture)textureFromResource2).height), new Vector2(0.5f, 0.5f)); NullificationArtifactDefinition.smallIconSelectedSprite = smallIconSelectedSprite; NullificationArtifactDefinition.smallIconDeselectedSprite = smallIconDeselectedSprite; NullificationArtifactDefinition.cachedName = "ARTIFACT_" + ArtifactLangTokenName; NullificationArtifactDefinition.nameToken = "ARTIFACT_" + ArtifactLangTokenName + "_NAME"; NullificationArtifactDefinition.descriptionToken = "ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION"; NullificationArtifactDefinition.requiredExpansion = Addressables.LoadAssetAsync((object)"RoR2/DLC1/Common/DLC1.asset").WaitForCompletion(); GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeathGlobal; ContentAddition.AddArtifactDef(NullificationArtifactDefinition); CreateConfig(ArtifactsVoidPlugin.configurationFile); collection.elements = new WeightedType[4] { CreateWeightedType(1, VoidReaverBombCardAmount.Value), CreateWeightedType(2, VoidDevastatorBombCardAmount.Value), CreateWeightedType(3, VoidJailerBombCardAmount.Value), CreateWeightedType(4, VoidlingBombCardAmount.Value) }; collectionTwo.elements = new WeightedType[4] { CreateWeightedType(1, VoidReaverBombCardAmountChampion.Value), CreateWeightedType(2, VoidJailerBombCardAmountChampion.Value), CreateWeightedType(3, VoidDevastatorBombCardAmountChampion.Value), CreateWeightedType(4, VoidlingBombCardAmountChampion.Value) }; DummyObject = PrefabAPI.InstantiateClone(new GameObject("DummyObject_Voidling"), "VOIDLING_STORM_DUMMY_COPY", true); DummyObject.AddComponent(); DummyObject.AddComponent(); PrefabAPI.RegisterNetworkPrefab(DummyObject); PrefabAPI.RegisterNetworkPrefab(DummyObject); } public WeightedType CreateWeightedType(int value, int weight) { WeightedType weightedType = new WeightedType(); weightedType.value = value; weightedType.Weight = weight; return weightedType; } private void CreateConfig(ConfigFile config) { VoidReaverBombCardAmount = config.Bind("Artifact: " + ArtifactName, "Void Reaver Bomb Weight", 90, "The amount of weight that a Void Reaver Implosion has for when a death-roll is initiated."); VoidDevastatorBombCardAmount = config.Bind("Artifact: " + ArtifactName, "Void Devastator Bomb Weight", 19, "The amount of weight that a Void Jailer Implosion has for when a death-roll is initiated."); VoidJailerBombCardAmount = config.Bind("Artifact: " + ArtifactName, "Void Jailer Bomb Weight", 39, "The amount of weight that a Void Devastator Implosion has for when a death-roll is initiated."); VoidlingBombCardAmount = config.Bind("Artifact: " + ArtifactName, "Voidling Storm Bomb Weight", 1, "The amount of weight that a Voidling Storm has for when a death-roll is initiated."); VoidReaverBombCardAmountChampion = config.Bind("Artifact: " + ArtifactName, "Void Reaver Bomb Weight (Champion Enemies)", 40, "The amount of weight that a Void Reaver Implosion has for when a death-roll is initiated on a Champion enemy."); VoidJailerBombCardAmountChampion = config.Bind("Artifact: " + ArtifactName, "Void Devastator Bomb Weight (Champion Enemies)", 10, "The amount of weight that a Void Jailer Implosion has for when a death-roll is initiated on a Champion enemy."); VoidDevastatorBombCardAmountChampion = config.Bind("Artifact: " + ArtifactName, "Void Jailer Bomb Weight (Champion Enemies)", 20, "The amount of weight that a Void Devastator Implosion has for when a death-roll is initiated on a Champion enemy."); VoidlingBombCardAmountChampion = config.Bind("Artifact: " + ArtifactName, "Voidling Storm Bomb Weight (Champion Enemies)", 5, "The amount of weight that a Voidling Storm has for when a death-roll is initiated on a Champion enemy."); StormTime = config.Bind("Artifact: " + ArtifactName, "Voidling Black Hole Lifetime", 15f, "How long does the Black Hole last? Note, the longer the lifetime the larger it will become. Default is 15 seconds."); NonEnemyDeathSpawnBlackHoles = config.Bind("Artifact: " + ArtifactName, "Non-Enemies Spawn Void Implosions", false, "Do non-enemy entities spawn Void Implosions?"); DeadPlayersSpawnImplosions = config.Bind("Artifact: " + ArtifactName, "Killed Players Spawn Void Implosions", true, "Do players spawn implosions on death?"); DeadPlayerFinalBreath = config.Bind("Artifact: " + ArtifactName, "Players Retaliate Heavily", false, "Does player death now have higher consequences for everything around you?"); } private void OnCharacterDeathGlobal(DamageReport damageReport) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Invalid comparison between Unknown and I4 //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_0031: Invalid comparison between Unknown and I4 //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Invalid comparison between Unknown and I4 if (!ArtifactEnabled || (int)damageReport.victimBody.teamComponent.teamIndex == 4 || (int)DamageTypeCombo.op_Implicit(damageReport.damageInfo.damageType) == 65536 || !Run.instance.IsExpansionEnabled(Items.BearVoid.requiredExpansion)) { return; } bool flag = true; if ((int)damageReport.victimBody.teamComponent.teamIndex == 0) { flag = NonEnemyDeathSpawnBlackHoles.Value; } if (damageReport.victimBody.isPlayerControlled) { flag = DeadPlayersSpawnImplosions.Value; } if (!flag) { return; } if (damageReport.victimBody.isPlayerControlled && DeadPlayerFinalBreath.Value) { SpawnTheStorm(damageReport); } else if (damageReport.victimBody.isChampion) { switch (collectionTwo.SelectByWeight()) { case 1: SpawnVoidBomb(DeathState.deathBombProjectile, damageReport); break; case 2: SpawnVoidBomb(DeathState.deathBombProjectile, damageReport); break; case 3: SpawnVoidBomb(DeathState.deathBombProjectile, damageReport); break; case 4: SpawnTheStorm(damageReport); break; } } else { switch (collection.SelectByWeight()) { case 1: SpawnVoidBomb(DeathState.deathBombProjectile, damageReport); break; case 2: SpawnVoidBomb(DeathState.deathBombProjectile, damageReport); break; case 3: SpawnVoidBomb(DeathState.deathBombProjectile, damageReport); break; case 4: SpawnTheStorm(damageReport); break; } } } public void SpawnVoidBomb(GameObject projectilePrefab, DamageReport killedEntity) { //IL_0003: 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_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_0067: Unknown result type (might be due to invalid IL or missing references) FireProjectileInfo val = default(FireProjectileInfo); val.projectilePrefab = projectilePrefab; val.position = ((Component)killedEntity.victimBody).gameObject.transform.position; val.rotation = Util.QuaternionSafeLookRotation(Vector3.up); val.owner = ((Component)killedEntity.victimBody).gameObject; val.crit = killedEntity.victimBody.RollCrit(); ProjectileManager.instance.FireProjectile(val); } public static void SpawnTheStorm(DamageReport killedEntity) { //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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate(DummyObject, ((Component)killedEntity.victimBody).gameObject.transform.position, Quaternion.identity); VacuumAttack val2 = new VacuumAttack(); val.transform.position = ((Component)killedEntity.victimBody).gameObject.transform.position; StormSelfController component = val.GetComponent(); component.killRadius = 1f; component.killRadiusCurve = VacuumAttack.killRadiusCurve; component.loopSound = VacuumAttack.loopSound; component.losObstructionFactor = VacuumAttack.losObstructionFactor; component.pullMagnitudeCurve = VacuumAttack.pullMagnitudeCurve; if (NetworkServer.active) { NetworkServer.Spawn(val); } } } public class StormSelfController : NetworkBehaviour { private bool active = true; private float timeSpent; public AnimationCurve killRadiusCurve; public AnimationCurve pullMagnitudeCurve; public float losObstructionFactor = 0.5f; public GameObject killSphereVfxPrefab; public GameObject environmentVfxPrefab; public LoopSoundDef loopSound; public CharacterLosTracker losTracker; public VFXHelper killSphereVfxHelper; public VFXHelper environmentVfxHelper; public SphereSearch killSearch; public float killRadius = 1f; public Vector3 pos; public SoundLoopPtr loopPtr; private bool ServerActive => NetworkServer.active; public void Start() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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_00e8: Expected O, but got Unknown losTracker = new CharacterLosTracker(); losTracker.enabled = true; killSphereVfxHelper = VFXHelper.Rent(); killSphereVfxHelper.vfxPrefabReference = VacuumAttack.killSphereVfxPrefab; pos = ((Component)this).transform.position; killSphereVfxHelper.followedTransform = ((Component)this).transform; killSphereVfxHelper.useFollowedTransformScale = false; killSphereVfxHelper.enabled = true; UpdateKillSphereVfx(); environmentVfxHelper = VFXHelper.Rent(); environmentVfxHelper.vfxPrefabReference = VacuumAttack.environmentVfxPrefab; environmentVfxHelper.followedTransform = ((Component)this).transform; environmentVfxHelper.useFollowedTransformScale = false; environmentVfxHelper.enabled = true; loopPtr = LoopSoundManager.PlaySoundLoopLocal(((Component)this).gameObject, VacuumAttack.loopSound); if (NetworkServer.active) { killSearch = new SphereSearch(); } } public void DestroyBomb() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) active = false; killSphereVfxHelper = VFXHelper.Return(killSphereVfxHelper); environmentVfxHelper = VFXHelper.Return(environmentVfxHelper); losTracker.enabled = false; losTracker.Dispose(); losTracker = null; LoopSoundManager.StopSoundLoopLocal(loopPtr); Object.Destroy((Object)(object)((Component)this).gameObject); } public float TimeInSecondsPassed() { return timeSpent; } public void Update() { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: 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_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)this == (Object)null || !active) { return; } if (!PauseManager.isPaused) { timeSpent += Time.fixedDeltaTime; } if (timeSpent > ArtifactOfNullification.StormTime.Value) { DestroyBomb(); return; } killRadius = TimeInSecondsPassed() * 2f; UpdateKillSphereVfx(); Vector3 val = pos; losTracker.origin = val; losTracker.Step(); float num = TimeInSecondsPassed() * 0.8f; ReadOnlyCollection readOnlyInstancesList = CharacterBody.readOnlyInstancesList; for (int i = 0; i < readOnlyInstancesList.Count; i++) { CharacterBody val2 = readOnlyInstancesList[i]; bool flag = losTracker.CheckBodyHasLos(val2); if (val2.hasEffectiveAuthority) { IDisplacementReceiver component = ((Component)val2).GetComponent(); if (component != null) { float num2 = (flag ? 1f : losObstructionFactor); Vector3 val3 = val - val2.coreTransform.position; component.AddDisplacement(((Vector3)(ref val3)).normalized * (num * num2 * Time.fixedDeltaTime)); } } } if (!ServerActive) { return; } List list = CollectionPool>.RentCollection(); List list2 = CollectionPool>.RentCollection(); try { killSearch.radius = killRadius; killSearch.origin = val; killSearch.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask; killSearch.RefreshCandidates(); killSearch.OrderCandidatesByDistance(); killSearch.FilterCandidatesByDistinctHurtBoxEntities(); killSearch.GetHurtBoxes(list); for (int j = 0; j < list.Count; j++) { HurtBox val4 = list[j]; if (Object.op_Implicit((Object)(object)val4.healthComponent)) { list2.Add(val4.healthComponent); } } for (int k = 0; k < list2.Count; k++) { HealthComponent val5 = list2[k]; val5.Suicide((GameObject)null, (GameObject)null, DamageTypeCombo.op_Implicit((DamageType)65536)); } } finally { list2 = CollectionPool>.ReturnCollection(list2); list = CollectionPool>.ReturnCollection(list); } } private void UpdateKillSphereVfx() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)killSphereVfxHelper.vfxInstanceTransform)) { killSphereVfxHelper.vfxInstanceTransform.localScale = Vector3.one * killRadius; } } } }