Decompiled source of Bozoros v2.3.5
BepInEx/plugins/Bozoros.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; 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 AntlerShed.SkinRegistry; using AntlerShed.SkinRegistry.Events; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Bozoros.Behaviours; using Bozoros.Compatibility; using Bozoros.Compatibility.Moons; using Bozoros.NetcodePatcher; using Bozoros.Patches; using Bozoros.Skins; using DunGen; using GameNetcodeStuff; using HarmonyLib; using LethalCompanyTestMod; using LethalLevelLoader; using Microsoft.CodeAnalysis; using Mimics; using Mimics.API; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.VFX; using VoxxWeatherPlugin.Behaviours; using WeatherRegistry; using WeatherRegistry.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("CrowdControl")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("voxx.LethalElementsPlugin")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Bozoros")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Plugin for LethalMatt's Bozoros, adds configuration and some additional stuff.")] [assembly: AssemblyFileVersion("2.3.5.0")] [assembly: AssemblyInformationalVersion("2.3.5+a5e36fed4a10962759bace676c570dde90235667")] [assembly: AssemblyProduct("Bozoros")] [assembly: AssemblyTitle("Bozoros")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.3.5.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<float>(); NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<float>(); } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 Bozoros { public enum BananaPeelDropLevel { AllItems = -1, HeldItem, NoItems } public class Config { public ConfigEntry<bool> STREAMER_FRIENDLY { get; private set; } public ConfigEntry<float> FIREWORK_PARTICLES { get; private set; } public ConfigEntry<float> CONFETTI_PARTICLES { get; private set; } public ConfigEntry<float> BALLOON_PARTICLES { get; private set; } public ConfigEntry<float> FIREWORK_MUSIC_VOLUME { get; private set; } public ConfigEntry<float> FIREWORK_EXPLOSION_VOLUME { get; private set; } public ConfigEntry<float> ANNOUNCER_VOLUME { get; private set; } public ConfigEntry<float> TENT_MUSIC_VOLUME { get; private set; } public ConfigEntry<float> DROPSHIP_VOLUME { get; private set; } public ConfigEntry<string> GOOFY_PUFFER_NAMES { get; private set; } public ConfigEntry<string> CLOWN_GIANT_NAMES { get; private set; } public ConfigEntry<string> SANTA_BUTLER_NAMES { get; private set; } public ConfigEntry<bool> BALLOON_INSTRUCTIONS { get; private set; } public ConfigEntry<int> BALLOON_PRICE { get; private set; } public ConfigEntry<bool> FERRIS_WHEEL_EXIT { get; private set; } public ConfigEntry<float> BANANA_MULTIPLIER_INSIDE { get; private set; } public ConfigEntry<float> BANANA_MULTIPLIER_OUTSIDE { get; private set; } public ConfigEntry<BananaPeelDropLevel> BANANA_DROPS_ITEMS { get; private set; } public ConfigEntry<bool> MODIFY_SHIP_NODE { get; private set; } public ConfigEntry<bool> ADD_DROPSHIP_NODE { get; private set; } public ConfigEntry<bool> REDUCE_MOTION_SICKNESS { get; private set; } public ConfigEntry<bool> CIRCUS_FACILITY_MIMICS { get; private set; } public Config(ConfigFile cfg) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Expected O, but got Unknown //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Expected O, but got Unknown //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Expected O, but got Unknown //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Expected O, but got Unknown //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Expected O, but got Unknown //IL_0331: Unknown result type (might be due to invalid IL or missing references) //IL_033b: Expected O, but got Unknown cfg.SaveOnConfigSet = false; STREAMER_FRIENDLY = cfg.Bind<bool>("General", "StreamerFriendly", true, "Whether the music is streamer-friendly or not."); FIREWORK_PARTICLES = cfg.Bind<float>("Particles", "FireworkParticles", 1f, new ConfigDescription("Intensity of firework particles at the end of a clear day.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); CONFETTI_PARTICLES = cfg.Bind<float>("Particles", "ConfettiParticles", 1f, new ConfigDescription("Intensity of confetti particles during eclipsed weather.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); BALLOON_PARTICLES = cfg.Bind<float>("Particles", "BalloonParticles", 1f, new ConfigDescription("Intensity of balloon particles during stormy weather.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); FIREWORK_MUSIC_VOLUME = cfg.Bind<float>("Audio", "FireworkMusicVolume", 1f, new ConfigDescription("Volume level for the firework music at the end of a clear day.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>())); FIREWORK_EXPLOSION_VOLUME = cfg.Bind<float>("Audio", "FireworkExplosionVolume", 1f, new ConfigDescription("Volume level for the firework explosion sound effects at the end of a clear day.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>())); ANNOUNCER_VOLUME = cfg.Bind<float>("Audio", "AnnouncerVolume", 2f, new ConfigDescription("Volume level for the announcer voice at the end of each day.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>())); TENT_MUSIC_VOLUME = cfg.Bind<float>("Audio", "TentMusicVolume", 1f, new ConfigDescription("Volume level for the circus tent music near every entrance.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>())); DROPSHIP_VOLUME = cfg.Bind<float>("Audio", "DropshipVolume", 1f, new ConfigDescription("Volume level for the dropship's music when delivering items.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>())); GOOFY_PUFFER_NAMES = cfg.Bind<string>("Enemies", "GoofyPufferNames", "Steve,Krusty,Ronald,Arthur,Toodles,Jingles,Dusty,Dumbo,Bingo,Whistle,Mittens,Pancake,Freckles,Chester,Oddball,Snuggles,Charlie,Bashful,Flower,Jumbo,Jimbo,Snickers,Pogo,Giggles,Loofy,Blinky,Ruffles,Dinky,Beebo,Chuckles", "A comma-separated list of names for Spore Lizard enemy variants to show in their scan node. Requires restart."); CLOWN_GIANT_NAMES = cfg.Bind<string>("Enemies", "ClownGiantNames", "Penn,Teller,Houdini,Dante,Copperfield,Blaine,Angel,Borden,Angier,Merlin,Kaito,Oz,Zatara,Mysterio,Riddler,Eisenheim,Gallico,Splendini", "A comma-separated list of names for Forest Giant enemy variants to show in their scan node. Requires restart."); SANTA_BUTLER_NAMES = cfg.Bind<string>("Enemies", "SantaButlerNames", "Santa Claus,St. Nicholas,Joulupukki,Sinterklaas,Ded Moroz,Julenisse,Mikulás,Shengdan Laoren,Père Noël,Krampus,Knecht Ruprecht,Kriss Kringle", "A comma-separated list of names for Santa Butler enemy variants to show in their scan node. Requires restart."); BALLOON_INSTRUCTIONS = cfg.Bind<bool>("Mechanics", "BalloonInstructions", true, "Show a one-time notification with instructions on how to operate balloons. Shows once per session, until the game is reopened."); BALLOON_PRICE = cfg.Bind<int>("Mechanics", "BalloonPrice", 15, new ConfigDescription("Credits required to purchase a one-time balloon shortcut from one of the balloon stands around the map. Can be set to -1 to disable (if you HATE fun).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1, 200), Array.Empty<object>())); FERRIS_WHEEL_EXIT = cfg.Bind<bool>("Mechanics", "FerrisWheelExit", true, "Whether the Fire Exit inside the Ferris Wheel should spawn or not — wormholes may not be immersive!"); BANANA_MULTIPLIER_INSIDE = cfg.Bind<float>("Mechanics", "BananaMultiplierInside", 1f, new ConfigDescription("Multiply inside banana peel hazard spawning curve across the board (minimum and maximum) by this value. Set to 0 to disable banana peels inside.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 3f), Array.Empty<object>())); BANANA_MULTIPLIER_OUTSIDE = cfg.Bind<float>("Mechanics", "BananaMultiplierOutside", 1f, new ConfigDescription("Multiply outside banana peel hazard spawning curve across the board (minimum and maximum) by this value. Set to 0 to disable banana peels outside.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 3f), Array.Empty<object>())); BANANA_DROPS_ITEMS = cfg.Bind<BananaPeelDropLevel>("Mechanics", "BananaDropsItems", BananaPeelDropLevel.HeldItem, "Whether slipping on a banana peel causes players to drop items."); MODIFY_SHIP_NODE = cfg.Bind<bool>("Other", "ModifyShipNode", false, "Increase (subjective) accuracy of the ship's scan node."); ADD_DROPSHIP_NODE = cfg.Bind<bool>("Other", "AddDropshipNode", true, "Add a scan node to the dropship and allow it to be scanned."); REDUCE_MOTION_SICKNESS = cfg.Bind<bool>("Other", "ReduceMotionSickness", false, "Attempts to reduce motion sickness a bit. Currently only stops the camera turning when going through the twisted hallway. "); CIRCUS_FACILITY_MIMICS = cfg.Bind<bool>("Compatibility", "CircusFacilityMimics", true, "Allow x753's Mimics to spawn in Circus Facility."); BANANA_DROPS_ITEMS.SettingChanged += delegate(object setting, EventArgs _) { if (setting is ConfigEntry<BananaPeelDropLevel> val) { SpawnableMapObject? bananaPeelInside = Plugin.BananaPeelInside; if (bananaPeelInside != null) { Transform obj = bananaPeelInside.prefabToSpawn.transform.Find("BananaLauncher"); PlayerLauncher playerLauncher = default(PlayerLauncher); if (((obj != null) ? new bool?(((Component)obj).TryGetComponent<PlayerLauncher>(ref playerLauncher)) : null).GetValueOrDefault()) { playerLauncher.dropHeldItemAtStart = val.Value < BananaPeelDropLevel.NoItems; playerLauncher.dropPlayerItemsAtEnd = val.Value < BananaPeelDropLevel.HeldItem; } } } }; ClearOrphanedEntries(cfg); cfg.SaveOnConfigSet = true; cfg.Save(); } private void ClearOrphanedEntries(ConfigFile config) { PropertyInfo propertyInfo = AccessTools.Property(typeof(ConfigFile), "OrphanedEntries"); ((Dictionary<ConfigDefinition, string>)propertyInfo.GetValue(config))?.Clear(); } } [BepInDependency("imabatby.lethallevelloader", "1.4.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("LethalMatt.Bozoros", "BozorosPlugin", "2.3.5")] public class Plugin : BaseUnityPlugin { internal const string GUID = "LethalMatt.Bozoros"; internal const string PLUGIN_NAME = "BozorosPlugin"; internal const string VERSION = "2.3.5"; internal static ManualLogSource StaticLogger { get; private set; } internal static Harmony Harmony { get; private set; } public static Config Settings { get; private set; } public static AssetBundle? BozorosBundle { get; private set; } public static ExtendedLevel? BozorosExtendedLevel { get; private set; } public static ExtendedDungeonFlow? CircusFacilityExtendedDungeon { get; private set; } public static GameObject? GrabbableBalloon { get; private set; } public static SpawnableMapObject? BananaPeelInside { get; private set; } public static SpawnableOutsideObjectWithRarity? BananaPeelOutside { get; private set; } private void Awake() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown StaticLogger = ((BaseUnityPlugin)this).Logger; try { Settings = new Config(((BaseUnityPlugin)this).Config); Harmony = new Harmony("LethalMatt.Bozoros"); NetcodePatcher(); LoadAssets(); Harmony.PatchAll(typeof(LoadPatch)); Harmony.PatchAll(typeof(PopcornNestPatch)); Harmony.PatchAll(typeof(BananaPeelInsidePatch)); if (WeatherRegistryCompatibility.Enabled) { Harmony.PatchAll(typeof(WeatherRegistryCompatibility)); } StaticLogger.LogInfo((object)"'BozorosPlugin' loaded!"); } catch (Exception arg) { StaticLogger.LogError((object)string.Format("Error while initializing '{0}': {1}", "BozorosPlugin", arg)); } } private void LoadAssets() { AssetBundleLoader.AddOnExtendedModLoadedListener((Action<ExtendedMod>)delegate(ExtendedMod bozorosExtended) { if (bozorosExtended.ExtendedLevels.Count > 0 && (Object)(object)bozorosExtended.ExtendedLevels[0] != (Object)null) { BozorosExtendedLevel = bozorosExtended.ExtendedLevels[0]; BananaPeelOutside = ((IEnumerable<SpawnableOutsideObjectWithRarity>)BozorosExtendedLevel.SelectableLevel.spawnableOutsideObjects).FirstOrDefault((Func<SpawnableOutsideObjectWithRarity, bool>)delegate(SpawnableOutsideObjectWithRarity outsideObject) { SpawnableOutsideObject spawnableObject = outsideObject.spawnableObject; object strA; if (spawnableObject == null) { strA = null; } else { GameObject prefabToSpawn2 = spawnableObject.prefabToSpawn; strA = ((prefabToSpawn2 != null) ? ((Object)prefabToSpawn2).name : null); } return string.CompareOrdinal((string?)strA, "BananaPeelSpawn") == 0; }); } else { StaticLogger.LogError((object)"Could not load Bozoros... ExtendedLevel not found!"); } if (bozorosExtended.ExtendedDungeonFlows.Count > 0 && (Object)(object)bozorosExtended.ExtendedDungeonFlows[0] != (Object)null) { CircusFacilityExtendedDungeon = bozorosExtended.ExtendedDungeonFlows[0]; BananaPeelInside = ((IEnumerable<SpawnableMapObject>)CircusFacilityExtendedDungeon.SpawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)delegate(SpawnableMapObject hazard) { GameObject prefabToSpawn = hazard.prefabToSpawn; return string.CompareOrdinal((prefabToSpawn != null) ? ((Object)prefabToSpawn).name : null, "BananaPeel") == 0; }); } else { StaticLogger.LogError((object)"Could not load CircusFacility... ExtendedDungeonFlow not found!"); } }, "LethalMatt", "Bozoros"); AssetBundleLoader.AddOnLethalBundleLoadedListener((Action<AssetBundle>)delegate(AssetBundle assetBundle) { BozorosBundle = assetBundle; GrabbableBalloon = assetBundle.LoadAsset<GameObject>("GrabbableBalloon.prefab"); if ((Object)(object)GrabbableBalloon != (Object)null) { LethalLevelLoaderNetworkManager.RegisterNetworkPrefab(GrabbableBalloon); } GameObject val = assetBundle.LoadAsset<GameObject>("BananaPeel.prefab"); if ((Object)(object)val != (Object)null) { Transform obj = val.transform.Find("BananaLauncher"); PlayerLauncher playerLauncher = default(PlayerLauncher); if (obj != null && ((Component)obj).TryGetComponent<PlayerLauncher>(ref playerLauncher)) { playerLauncher.dropHeldItemAtStart = Settings.BANANA_DROPS_ITEMS.Value < BananaPeelDropLevel.NoItems; playerLauncher.dropPlayerItemsAtEnd = Settings.BANANA_DROPS_ITEMS.Value < BananaPeelDropLevel.HeldItem; } LethalLevelLoaderNetworkManager.RegisterNetworkPrefab(val); } SnozorosEnabler.IcyLakePrefab = assetBundle.LoadAsset<GameObject>("Ice_Pond.prefab"); if ((Object)(object)SnozorosEnabler.IcyLakePrefab != (Object)null) { LethalLevelLoaderNetworkManager.RegisterNetworkPrefab(SnozorosEnabler.IcyLakePrefab); } }, "bozoros.lethalbundle"); if (EnemySkinRegistryCompatibility.Enabled) { EnemySkinRegistryCompatibility.LoadSkins(); EnemySkinRegistryCompatibility.RegisterSkins(); } if (MimicsCompatibility.Enabled) { MimicsCompatibility.RegisterCircusMimic(); } PandoramusCompatibility.RegisterCompat(); StarlancerZeroCompatibility.RegisterCompat(); } private static void NetcodePatcher() { Type[] array; try { array = Assembly.GetExecutingAssembly().GetTypes(); } catch (ReflectionTypeLoadException ex) { array = ex.Types.Where((Type type) => type != null).ToArray(); } Type[] array2 = array; foreach (Type type2 in array2) { MethodInfo[] methods = type2.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0) { methodInfo.Invoke(null, null); } } } } } } namespace Bozoros.Skins { internal class CircusMimic : MimicEventHandler { public static GameObject? CircusMimicPrefab { get; internal set; } public override string ModGUID => "LethalMatt.Bozoros"; public override bool IsMyInteriorLoaded { get { ExtendedDungeonFlow? circusFacilityExtendedDungeon = Plugin.CircusFacilityExtendedDungeon; return circusFacilityExtendedDungeon != null && circusFacilityExtendedDungeon.IsCurrentDungeon; } } public override int Priority => 100; public override bool OverrideDefaultImperfectionCreation(MimicDoor mimicDoor, Doorway doorway) { return false; } public override void OnMimicCreated(MimicDoor mimicDoor, Doorway doorway) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: 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) ((MimicEventHandler)this).OnMimicCreated(mimicDoor, doorway); if (!((Object)(object)CircusMimicPrefab == (Object)null)) { Object.Instantiate<GameObject>(CircusMimicPrefab, ((Component)mimicDoor).transform); Transform obj = ((Component)mimicDoor).transform.Find("Armature/Frame"); GameObject val = ((obj != null) ? ((Component)obj).gameObject : null); if (val != null) { val.transform.SetLocalPositionAndRotation(new Vector3(0f, -0.65f, 0f), Quaternion.Euler(new Vector3(90f, 0f, 0f))); } ((Component)mimicDoor).transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); Transform obj2 = ((Component)mimicDoor).transform.Find("Armature/Door"); if (obj2 != null) { ((Component)obj2).gameObject.SetActive(false); } Transform obj3 = ((Component)mimicDoor).transform.Find("Light"); if (obj3 != null) { ((Component)obj3).gameObject.SetActive(false); } } } public override void OnMimicCreateImperfections(MimicDoor mimicDoor) { ((MimicEventHandler)this).OnMimicCreateImperfections(mimicDoor); } public override void OnMimicAttackStart(MimicDoor mimicDoor, PlayerControllerB playerToAttack) { ((MimicEventHandler)this).OnMimicAttackStart(mimicDoor, playerToAttack); Transform obj = ((Component)mimicDoor).transform.Find("CircusWallDoorMimic(Clone)"); if (obj != null) { Transform child = obj.GetChild(0); Animator val = default(Animator); if (((child != null) ? new bool?(((Component)child.GetChild(1)).TryGetComponent<Animator>(ref val)) : null).GetValueOrDefault()) { val.SetTrigger("Attack"); } } } public override void OnMimicAttackEnd(MimicDoor mimicDoor) { ((MimicEventHandler)this).OnMimicAttackEnd(mimicDoor); } } internal class ClownGiant : Skin, Skinner { public string Label => "Clown Giant"; public string Id => "LethalMatt.Bozoros.ClownGiant"; public string EnemyId => "LethalCompany.ForestKeeper"; public Texture2D Icon => EnemySkinRegistryCompatibility.BozorosIcon ?? Texture2D.blackTexture; public static Material? ClownGiantMaterial { get; internal set; } public static GameObject? ClownHair { get; internal set; } public static GameObject? ClownNose { get; internal set; } public static List<string> ClownGiantNames { get; internal set; } = new List<string>(); public static Random? Random { get; internal set; } public Skinner CreateSkinner() { return (Skinner)(object)new ClownGiant(); } public void Apply(GameObject enemy) { if (Random != null && ClownGiantNames.Count > 0) { Transform child = enemy.transform.GetChild(1); ScanNodeProperties val = default(ScanNodeProperties); if (child != null && ((Component)child).TryGetComponent<ScanNodeProperties>(ref val)) { val.headerText = ClownGiantNames[Random.Next(0, ClownGiantNames.Count)] ?? ""; val.subText = "Clown Giant"; } } Transform val2 = enemy.transform.Find("FGiantModelContainer"); SkinnedMeshRenderer val3 = default(SkinnedMeshRenderer); for (int i = 0; i < 3; i++) { if (val2 != null) { Transform child2 = val2.GetChild(i); if (((child2 != null) ? new bool?(((Component)child2).TryGetComponent<SkinnedMeshRenderer>(ref val3)) : null).GetValueOrDefault()) { ((Renderer)val3).sharedMaterial = ClownGiantMaterial; } } } Transform val4 = ((val2 != null) ? val2.Find("AnimContainer/metarig/spine/spine.003") : null); Object.Instantiate<GameObject>(ClownHair, val4); Object.Instantiate<GameObject>(ClownNose, val4); } public void Remove(GameObject enemy) { } } internal class GoofyPuffer : Skin, Skinner { public string Label => "Goofy Puffer"; public string Id => "LethalMatt.Bozoros.GoofyPuffer"; public string EnemyId => "LethalCompany.SporeLizard"; public Texture2D Icon => EnemySkinRegistryCompatibility.BozorosIcon ?? Texture2D.blackTexture; public static Material? GoofyPufferMaterial { get; internal set; } public static List<string> GoofyPufferNames { get; internal set; } = new List<string>(); public static Random? Random { get; internal set; } public Skinner CreateSkinner() { return (Skinner)(object)new GoofyPuffer(); } public void Apply(GameObject enemy) { if (Random != null && GoofyPufferNames.Count > 0) { Transform child = enemy.transform.GetChild(1); ScanNodeProperties val = default(ScanNodeProperties); if (child != null && ((Component)child).TryGetComponent<ScanNodeProperties>(ref val)) { val.headerText = GoofyPufferNames[Random.Next(0, GoofyPufferNames.Count)] ?? ""; val.subText = "Goofy Puffer"; } } Transform obj = enemy.transform.Find("PufferModel/BezierCurve"); SkinnedMeshRenderer val2 = default(SkinnedMeshRenderer); if (obj != null && ((Component)obj).TryGetComponent<SkinnedMeshRenderer>(ref val2)) { ((Renderer)val2).sharedMaterial = GoofyPufferMaterial; } } public void Remove(GameObject enemy) { } } internal class SantaButler : Skin, Skinner, ButlerEventHandler, EnemyEventHandler { public string Label => "Santa Butler"; public string Id => "LethalMatt.Bozoros.SantaButler"; public string EnemyId => "LethalCompany.Butler"; public Texture2D Icon => EnemySkinRegistryCompatibility.BozorosIcon ?? Texture2D.blackTexture; public static Mesh? CandyCaneMesh { get; internal set; } public static Material? CandyCaneMaterial { get; internal set; } public static GameObject? CandyCaneKnife { get; internal set; } public static Material? SantaMaterial { get; internal set; } public static GameObject? SantaHat { get; internal set; } public static Texture2D? GrinchHornetsTexture { get; internal set; } public static List<string> SantaButlerNames { get; internal set; } = new List<string>(); public static Random? Random { get; internal set; } public Skinner CreateSkinner() { return (Skinner)(object)new SantaButler(); } public void Apply(GameObject enemy) { ButlerEnemyAI val = default(ButlerEnemyAI); if (!enemy.TryGetComponent<ButlerEnemyAI>(ref val) || string.CompareOrdinal(((Object)val).name.Substring(0, 4), "Ross") == 0) { return; } ScanNodeProperties val2 = default(ScanNodeProperties); if (Random != null && SantaButlerNames.Count > 0 && ((Component)((Component)val).transform.Find("ScanNode")).TryGetComponent<ScanNodeProperties>(ref val2)) { val2.headerText = SantaButlerNames[Random.Next(0, SantaButlerNames.Count)] ?? ""; val2.subText = "Santa Butler"; } Transform val3 = ((Component)val).transform.Find("MeshContainer"); SkinnedMeshRenderer val4 = default(SkinnedMeshRenderer); for (int i = 0; i < 3; i++) { if (val3 != null) { Transform child = val3.GetChild(i); if (((child != null) ? new bool?(((Component)child).TryGetComponent<SkinnedMeshRenderer>(ref val4)) : null).GetValueOrDefault()) { ((Renderer)val4).sharedMaterial = SantaMaterial; } } } Transform val5 = ((val3 != null) ? val3.Find("Rig 1/Arms/RightArm/upperRightArmContainer/upper_arm.R_target/Knife") : null); MeshFilter val6 = default(MeshFilter); MeshRenderer val7 = default(MeshRenderer); if (val5 != null && ((Component)val5).TryGetComponent<MeshFilter>(ref val6) && ((Component)val5).TryGetComponent<MeshRenderer>(ref val7)) { val6.sharedMesh = CandyCaneMesh; ((Renderer)val7).sharedMaterial = CandyCaneMaterial; } if ((Object)(object)CandyCaneKnife != (Object)null) { Transform obj = ((Component)val).transform.Find("BloodStabParticle"); Object.Destroy((Object)(object)((obj != null) ? ((Component)obj).gameObject : null)); GameObject val8 = Object.Instantiate<GameObject>(((Component)CandyCaneKnife.transform.GetChild(2)).gameObject, ((Component)val).transform, false); val.stabBloodParticle = val8.GetComponent<ParticleSystem>(); val.knifePrefab = CandyCaneKnife; } Transform val9 = ((val3 != null) ? val3.Find("metarig/spine/spine.001/NeckContainer/spine.004/face") : null); if ((Object)(object)val9 != (Object)null) { Object.Instantiate<GameObject>(SantaHat, val9); } EnemySkinRegistry.RegisterEnemyEventHandler((EnemyAI)(object)val, (EnemyEventHandler)(object)this); } public void OnSpawnHornets(ButlerEnemyAI instance, ButlerBeesEnemyAI hornets) { if (string.CompareOrdinal(((Object)instance).name.Substring(0, 4), "Ross") != 0) { Transform child = ((Component)hornets).transform.GetChild(0); ScanNodeProperties val = default(ScanNodeProperties); if (child != null && ((Component)child).TryGetComponent<ScanNodeProperties>(ref val)) { val.headerText = "Grinch Particles"; } VisualEffect val2 = default(VisualEffect); if ((Object)(object)GrinchHornetsTexture != (Object)null && ((Component)((Component)hornets).transform.Find("BugSwarmParticle")).TryGetComponent<VisualEffect>(ref val2)) { val2.SetTexture("BugTexture", (Texture)(object)GrinchHornetsTexture); } } } public void Remove(GameObject enemy) { } } } namespace Bozoros.Patches { [HarmonyPatch(typeof(RoundManager), "SpawnMapObjects")] [HarmonyPriority(100)] internal class BananaPeelInsidePatch { [HarmonyPrefix] private static void SpawnMapObjectsPre(RoundManager __instance, out Keyframe[] __state) { __state = Array.Empty<Keyframe>(); float value = Plugin.Settings.BANANA_MULTIPLIER_INSIDE.Value; if (!((NetworkBehaviour)__instance).IsHost || Plugin.BananaPeelInside == null || value == 1f) { return; } __state = Plugin.BananaPeelInside.numberToSpawn.keys; ExtendedDungeonFlow? circusFacilityExtendedDungeon = Plugin.CircusFacilityExtendedDungeon; if (circusFacilityExtendedDungeon != null && circusFacilityExtendedDungeon.IsCurrentDungeon) { Keyframe[] keys = Plugin.BananaPeelInside.numberToSpawn.keys; for (int i = 0; i < keys.Length; i++) { ref Keyframe reference = ref keys[i]; ((Keyframe)(ref reference)).value = ((Keyframe)(ref reference)).value * value; } Plugin.BananaPeelInside.numberToSpawn.keys = keys; return; } ExtendedLevel? bozorosExtendedLevel = Plugin.BozorosExtendedLevel; if (bozorosExtendedLevel == null || !bozorosExtendedLevel.IsCurrentLevel) { return; } List<SpawnableMapObject> list = __instance.currentLevel.spawnableMapObjects.ToList(); if (list.Contains(Plugin.BananaPeelInside)) { return; } SelectableLevel currentLevel = __instance.currentLevel; List<SpawnableMapObject> list2 = list; int num = 0; SpawnableMapObject[] array = (SpawnableMapObject[])(object)new SpawnableMapObject[1 + list2.Count]; foreach (SpawnableMapObject item in list2) { array[num] = item; num++; } array[num] = Plugin.BananaPeelInside; currentLevel.spawnableMapObjects = array; if ((Object)(object)__instance.dungeonGenerator?.Root != (Object)null) { RandomMapObject[] componentsInChildren = __instance.dungeonGenerator.Root.GetComponentsInChildren<RandomMapObject>(); RandomMapObject[] array2 = componentsInChildren; foreach (RandomMapObject val in array2) { val.spawnablePrefabs.Add(Plugin.BananaPeelInside.prefabToSpawn); } } } [HarmonyPostfix] private static void SpawnMapObjectsPost(RoundManager __instance, Keyframe[] __state) { if (!((NetworkBehaviour)__instance).IsHost || Plugin.BananaPeelInside == null || Plugin.Settings.BANANA_MULTIPLIER_INSIDE.Value == 1f) { return; } ExtendedDungeonFlow? circusFacilityExtendedDungeon = Plugin.CircusFacilityExtendedDungeon; if (circusFacilityExtendedDungeon != null && circusFacilityExtendedDungeon.IsCurrentDungeon) { Plugin.BananaPeelInside.numberToSpawn.keys = __state; return; } ExtendedLevel? bozorosExtendedLevel = Plugin.BozorosExtendedLevel; if (bozorosExtendedLevel != null && bozorosExtendedLevel.IsCurrentLevel) { List<SpawnableMapObject> list = __instance.currentLevel.spawnableMapObjects.ToList(); if (list.Remove(Plugin.BananaPeelInside)) { __instance.currentLevel.spawnableMapObjects = list.ToArray(); } } } } [HarmonyPatch] internal class LoadPatch { public static bool FirstLoad { get; private set; } = true; public static event Action? OnFinishGeneratingLevelPost; public static event Action? OnFinishGeneratingNewLevelClientRpcPost; [HarmonyPatch(typeof(RoundManager), "FinishGeneratingLevel")] [HarmonyPostfix] private static void FinishGeneratingLevelPost() { LoadPatch.OnFinishGeneratingLevelPost?.Invoke(); } [HarmonyPatch(typeof(RoundManager), "FinishGeneratingNewLevelClientRpc")] [HarmonyPriority(200)] [HarmonyPostfix] private static void FinishGeneratingNewLevelClientRpcPost() { LoadPatch.OnFinishGeneratingNewLevelClientRpcPost?.Invoke(); } [HarmonyPatch(typeof(MenuManager), "Start")] [HarmonyPrefix] private static void MenuManagerStartPre() { if (FirstLoad) { FirstLoad = false; if (CrowdControlCompatibility.Enabled) { Plugin.Harmony.PatchAll(typeof(CrowdControlCompatibility)); } if (LethalElementsCompatibility.Enabled) { LethalElementsCompatibility.RegisterSnozoros(); } } } } [HarmonyPatch] internal class PopcornNestPatch { public static List<Nest> AvailableNestLocations { get; internal set; } = new List<Nest>(); public static PopcornNests? PopcornNestsInstance { get; internal set; } = null; [HarmonyPatch(typeof(RedLocustBees), "Start")] [HarmonyPostfix] private static void RelocateNest(RedLocustBees __instance, GrabbableObject ___hive) { //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) ExtendedLevel? bozorosExtendedLevel = Plugin.BozorosExtendedLevel; if (bozorosExtendedLevel == null || !bozorosExtendedLevel.IsCurrentLevel) { return; } Transform child = ((Component)__instance).transform.GetChild(0); ScanNodeProperties val = default(ScanNodeProperties); if (child != null && ((Component)child).TryGetComponent<ScanNodeProperties>(ref val)) { val.headerText = "Kernel Guardians"; } if (___hive != null) { Transform child2 = ((Component)___hive).transform.GetChild(0); ScanNodeProperties val2 = default(ScanNodeProperties); if (((child2 != null) ? new bool?(((Component)child2).TryGetComponent<ScanNodeProperties>(ref val2)) : null).GetValueOrDefault()) { val2.headerText = "...Popcorn?"; } } NetworkObject val3 = default(NetworkObject); NetworkObject val4 = default(NetworkObject); if (((NetworkBehaviour)__instance).IsHost && !((Object)(object)___hive == (Object)null) && ((Component)___hive).TryGetComponent<NetworkObject>(ref val3) && ((Component)__instance).TryGetComponent<NetworkObject>(ref val4)) { PopcornNestsInstance?.RelocateNestServerRpc(NetworkObjectReference.op_Implicit(val3), NetworkObjectReference.op_Implicit(val4)); } } } } namespace Bozoros.Compatibility { [HarmonyPatch] internal class CrowdControlCompatibility { private static bool? _enabled; public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("WarpWorld.CrowdControl"); _enabled = valueOrDefault; } return _enabled.Value; } } public static LevelWeatherType CurrentWeather { get; internal set; } public static event Action<string, string>? OnCCWeatherChanged; [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] [HarmonyPatch(typeof(TestMod), "CrowdControlCommands")] [HarmonyPostfix] internal static void CCWeatherCheck() { //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_002f: 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_0067: Unknown result type (might be due to invalid IL or missing references) if (TimeOfDay.Instance.currentLevel.currentWeather != CurrentWeather) { CrowdControlCompatibility.OnCCWeatherChanged?.Invoke($"{CurrentWeather}", $"{TimeOfDay.Instance.currentLevel.currentWeather}"); CurrentWeather = TimeOfDay.Instance.currentLevelWeather; } } } internal class EnemySkinRegistryCompatibility { private static bool? _enabled; public static Texture2D? BozorosIcon { get; private set; } public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("antlershed.lethalcompany.enemyskinregistry"); _enabled = valueOrDefault; } return _enabled.Value; } } internal static void LoadSkins() { AssetBundleLoader.AddOnLethalBundleLoadedListener((Action<AssetBundle>)delegate(AssetBundle assetBundle) { BozorosIcon = assetBundle.LoadAsset<Texture2D>("BozorosIcon.png"); GoofyPuffer.GoofyPufferMaterial = assetBundle.LoadAsset<Material>("GoofyPufferMat.mat"); ClownGiant.ClownGiantMaterial = assetBundle.LoadAsset<Material>("ClownGiantMat.mat"); ClownGiant.ClownHair = assetBundle.LoadAsset<GameObject>("ClownHair.prefab"); ClownGiant.ClownNose = assetBundle.LoadAsset<GameObject>("ClownNose.prefab"); SantaButler.CandyCaneMesh = assetBundle.LoadAsset<Mesh>("Xmas_CandyCane_Knife.fbx"); SantaButler.CandyCaneMaterial = assetBundle.LoadAsset<Material>("CandyCaneMat.mat"); SantaButler.CandyCaneKnife = assetBundle.LoadAsset<GameObject>("CandyCaneKnife.prefab"); SantaButler.SantaMaterial = assetBundle.LoadAsset<Material>("Xmas_SantaMat.mat"); SantaButler.SantaHat = assetBundle.LoadAsset<GameObject>("Xmas_SantaHat.prefab"); SantaButler.GrinchHornetsTexture = assetBundle.LoadAsset<Texture2D>("Xmas_GrinchHornets.png"); }, "bozoros.lethalbundle"); if (Plugin.Settings.GOOFY_PUFFER_NAMES.Value.Length > 0) { GoofyPuffer.GoofyPufferNames = Plugin.Settings.GOOFY_PUFFER_NAMES.Value.Split(',').ToList(); LoadPatch.OnFinishGeneratingLevelPost += delegate { GoofyPuffer.Random = new Random(StartOfRound.Instance.randomMapSeed + 1); }; } if (Plugin.Settings.CLOWN_GIANT_NAMES.Value.Length > 0) { ClownGiant.ClownGiantNames = Plugin.Settings.CLOWN_GIANT_NAMES.Value.Split(',').ToList(); LoadPatch.OnFinishGeneratingLevelPost += delegate { ClownGiant.Random = new Random(StartOfRound.Instance.randomMapSeed + 2); }; } if (Plugin.Settings.SANTA_BUTLER_NAMES.Value.Length > 0) { SantaButler.SantaButlerNames = Plugin.Settings.SANTA_BUTLER_NAMES.Value.Split(',').ToList(); LoadPatch.OnFinishGeneratingLevelPost += delegate { SantaButler.Random = new Random(StartOfRound.Instance.randomMapSeed + 3); }; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void RegisterSkins() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: 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) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007f: 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_0093: 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_00bf: 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) EnemySkinRegistry.RegisterSkin((Skin)(object)new GoofyPuffer(), (DefaultSkinConfigData?)new DefaultSkinConfigData((DefaultSkinConfigEntry[])(object)new DefaultSkinConfigEntry[2] { new DefaultSkinConfigEntry("circus", 1f), new DefaultSkinConfigEntry("fun", 1f) }, 0f, 0f)); EnemySkinRegistry.RegisterSkin((Skin)(object)new ClownGiant(), (DefaultSkinConfigData?)new DefaultSkinConfigData((DefaultSkinConfigEntry[])(object)new DefaultSkinConfigEntry[2] { new DefaultSkinConfigEntry("circus", 1f), new DefaultSkinConfigEntry("fun", 1f) }, 0f, 0f)); EnemySkinRegistry.RegisterSkin((Skin)(object)new SantaButler(), (DefaultSkinConfigData?)new DefaultSkinConfigData((DefaultSkinConfigEntry[])(object)new DefaultSkinConfigEntry[1] { new DefaultSkinConfigEntry("jolly", 1f) }, 0f, 0f)); } } internal class LethalElementsCompatibility { private static bool? _enabled; public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("voxx.LethalElementsPlugin"); _enabled = valueOrDefault; } return _enabled.Value; } } internal static void RegisterSnozoros() { ExtendedLevel? bozorosExtendedLevel = Plugin.BozorosExtendedLevel; if (bozorosExtendedLevel == null) { return; } bozorosExtendedLevel.LevelEvents.onLevelLoaded.AddListener((Action)delegate { //IL_0012: Unknown result type (might be due to invalid IL or missing references) SelectableLevel selectableLevel = Plugin.BozorosExtendedLevel.SelectableLevel; string text = $"{selectableLevel.currentWeather}"; if (text.Contains("Snowfall") || text.Contains("Blizzard")) { SpawnableOutsideObjectWithRarity[] spawnableOutsideObjects = selectableLevel.spawnableOutsideObjects; foreach (SpawnableOutsideObjectWithRarity val in spawnableOutsideObjects) { SpawnableOutsideObject spawnableObject = val.spawnableObject; if (spawnableObject != null && ((Object)spawnableObject).name.Contains("Snowman")) { val.randomAmount = AnimationCurve.Linear(0f, 1f, 1f, 5f); } } selectableLevel.levelIncludesSnowFootprints = true; } }); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void PoisonLake(QuicksandTrigger waterTrigger) { ((Component)waterTrigger).gameObject.AddComponent<ToxicFumes>(); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void SubscribeToSnow(Action<bool> snowAction, bool unsubscribe = false) { if ((Object)(object)LevelManipulator.Instance != (Object)null) { if (!unsubscribe) { LevelManipulator.Instance.OnSnowReady += snowAction; } else { LevelManipulator.Instance.OnSnowReady -= snowAction; } } } } internal class MimicsCompatibility { private static bool? _enabled; public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("x753.Mimics"); _enabled = valueOrDefault; } return _enabled.Value; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void RegisterCircusMimic() { AssetBundleLoader.AddOnLethalBundleLoadedListener((Action<AssetBundle>)delegate(AssetBundle assetBundle) { CircusMimic.CircusMimicPrefab = assetBundle.LoadAsset<GameObject>("CircusWallDoorMimic.prefab"); }, "bozoros.lethalbundle"); if (Plugin.Settings.CIRCUS_FACILITY_MIMICS.Value && !Mimics.InteriorWhitelist.Contains("circusfacilityflow")) { Mimics.InteriorWhitelist.Add("circusfacilityflow"); } MimicsAPI.GetAPI().RegisterMimicEventHandler((MimicEventHandler)(object)new CircusMimic()); } } [HarmonyPatch] internal class WeatherRegistryCompatibility { private static bool? _enabled; public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("mrov.WeatherRegistry"); _enabled = valueOrDefault; } return _enabled.Value; } } public static event Action<LevelWeatherType[]>? OnWeatherEffectsApply; [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] [HarmonyPatch(typeof(WeatherEffectData), "ApplyWeatherEffects")] [HarmonyPostfix] internal static void ApplyWeatherEffectsPost(LevelWeatherType[] weatherType) { WeatherRegistryCompatibility.OnWeatherEffectsApply?.Invoke(weatherType); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static bool ApplyWeatherOverrides(Action<LevelWeatherType[]> weatherAction) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 if ((int)WeatherManager.GetCurrentLevelWeather().Type == 0) { return false; } OnWeatherEffectsApply += weatherAction; return true; } } } namespace Bozoros.Compatibility.Moons { public class PandoramusCompatibility { public static bool Registered { get; private set; } public static ExtendedLevel? PandoramusLevel { get; internal set; } public static Material? PortalCircusFacility { get; internal set; } internal static void RegisterCompat() { AssetBundleLoader.AddOnExtendedModLoadedListener((Action<ExtendedMod>)delegate(ExtendedMod pandoramusExtended) { if (!Registered) { AssetBundle? bozorosBundle = Plugin.BozorosBundle; PortalCircusFacility = ((bozorosBundle != null) ? bozorosBundle.LoadAsset<Material>("Portal_CircusFacilityMat.mat") : null); if (pandoramusExtended.ExtendedLevels.Count > 1 && (Object)(object)pandoramusExtended.ExtendedLevels[1] != (Object)null) { PandoramusLevel = pandoramusExtended.ExtendedLevels[1]; LoadPatch.OnFinishGeneratingNewLevelClientRpcPost += PortalSwitch; Registered = true; } } }, "DemonMae_PAN", "Pandoramus"); } private static void PortalSwitch() { ExtendedLevel? pandoramusLevel = PandoramusLevel; if (pandoramusLevel == null || !pandoramusLevel.IsCurrentLevel) { return; } ExtendedDungeonFlow? circusFacilityExtendedDungeon = Plugin.CircusFacilityExtendedDungeon; if (circusFacilityExtendedDungeon == null || !circusFacilityExtendedDungeon.IsCurrentDungeon || !((Object)(object)PortalCircusFacility != (Object)null)) { return; } GameObject mapPropsContainer = RoundManager.Instance.mapPropsContainer; if (mapPropsContainer != null) { Transform parent = mapPropsContainer.transform.GetParent(); bool? obj; MeshRenderer val = default(MeshRenderer); if (parent == null) { obj = null; } else { Transform obj2 = parent.Find("PortalRing/PortalTexture"); obj = ((obj2 != null) ? new bool?(((Component)obj2).TryGetComponent<MeshRenderer>(ref val)) : null); } bool? flag = obj; if (flag.GetValueOrDefault()) { MaterialScroller materialScroller = ((Component)val).gameObject.AddComponent<MaterialScroller>(); materialScroller.ScrollingMat = PortalCircusFacility; ((Renderer)val).sharedMaterial = PortalCircusFacility; } } } } public class StarlancerZeroCompatibility { public static bool Registered { get; private set; } public static ExtendedLevel? StarlancerZeroLevel { get; internal set; } public static GameObject? CircusDoors { get; internal set; } internal static void RegisterCompat() { AssetBundleLoader.AddOnExtendedModLoadedListener((Action<ExtendedMod>)delegate(ExtendedMod starlancerExtended) { if (!Registered) { AssetBundle? bozorosBundle = Plugin.BozorosBundle; CircusDoors = ((bozorosBundle != null) ? bozorosBundle.LoadAsset<GameObject>("MainEntranceOnlyDoor.prefab") : null); if (starlancerExtended.ExtendedLevels.Count > 2 && (Object)(object)starlancerExtended.ExtendedLevels[2] != (Object)null) { StarlancerZeroLevel = starlancerExtended.ExtendedLevels[2]; LoadPatch.OnFinishGeneratingLevelPost += DoorSwitch; Registered = true; } } }, "AudioKnight", "StarlancerMoons"); } private static void DoorSwitch() { //IL_009f: 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_00d8: Unknown result type (might be due to invalid IL or missing references) ExtendedLevel? starlancerZeroLevel = StarlancerZeroLevel; if (starlancerZeroLevel == null || !starlancerZeroLevel.IsCurrentLevel) { return; } ExtendedDungeonFlow? circusFacilityExtendedDungeon = Plugin.CircusFacilityExtendedDungeon; if (circusFacilityExtendedDungeon == null || !circusFacilityExtendedDungeon.IsCurrentDungeon || !((Object)(object)CircusDoors != (Object)null)) { return; } GameObject mapPropsContainer = RoundManager.Instance.mapPropsContainer; object obj; if (mapPropsContainer == null) { obj = null; } else { Transform parent = mapPropsContainer.transform.GetParent(); if (parent == null) { obj = null; } else { Transform obj2 = parent.Find("Pyramid/Pyramid_Thin_Base/Desert_Pyramid_Medium/DoubleDoors"); obj = ((obj2 != null) ? ((Component)obj2).gameObject : null); } } GameObject val = (GameObject)obj; if ((Object)(object)val != (Object)null) { GameObject val2 = Object.Instantiate<GameObject>(CircusDoors, val.transform.GetParent()); Transform transform = val2.transform; transform.localPosition += new Vector3(0f, 3f, -0.1f); val2.transform.localScale = new Vector3(0.1323f, 2.9661f, 3.0816f); val.SetActive(false); } } } } namespace Bozoros.Behaviours { public class ActivateApparatus : NetworkBehaviour { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private static EnemyType? <OldBirdEnemyType>k__BackingField; public static EnemyType? OldBirdEnemyType { get { if ((Object)(object)<OldBirdEnemyType>k__BackingField == (Object)null) { OldBirdEnemyType = OriginalContent.Enemies.Find((EnemyType enemy) => string.CompareOrdinal(enemy.enemyName, "RadMech") == 0); } return <OldBirdEnemyType>k__BackingField; } [CompilerGenerated] private set { <OldBirdEnemyType>k__BackingField = value; } } private void Start() { if (((NetworkBehaviour)this).IsHost) { Activate(); } } public override void OnNetworkSpawn() { if (!((NetworkBehaviour)this).IsHost) { Activate(); } ((NetworkBehaviour)this).OnNetworkSpawn(); } public void Activate() { LungProp val = default(LungProp); AudioSource val2 = default(AudioSource); if (((Component)this).TryGetComponent<LungProp>(ref val) && !((GrabbableObject)val).isInShipRoom && ((Component)this).TryGetComponent<AudioSource>(ref val2)) { val.isLungDocked = true; val.isLungPowered = true; val.radMechEnemyType = OldBirdEnemyType; val2.loop = true; val2.Play(); } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string? __getTypeName() { return "ActivateApparatus"; } } [Serializable] public struct BalloonStand { public InteractPurchasable? purchaseScript; public int variant; } public class ChangeSettings : NetworkBehaviour { public List<AudioSource> fireworkMusicVolume = new List<AudioSource>(); public List<AudioSource> fireworkExplosionVolume = new List<AudioSource>(); public List<AudioSource> announcerVolume = new List<AudioSource>(); public List<AudioSource> tentMusicVolume = new List<AudioSource>(); public List<AudioSource> dropshipVolume = new List<AudioSource>(); public List<ParticleSystem> fireworkParticles = new List<ParticleSystem>(); public List<ParticleSystem> confettiParticles = new List<ParticleSystem>(); public List<ParticleSystem> balloonParticles = new List<ParticleSystem>(); public AudioClip? fireworkMusicCopyrighted; public List<BalloonStand> balloonStands = new List<BalloonStand>(); public EntranceTeleport? ferrisWheelExit; public ScanNodeProperties? shipScanNode; public ItemDropship? dropship; public ScanNodeProperties? dropshipScanNode; public static bool SeenBalloonInstructions { get; private set; } public Keyframe[]? BananaKeysOutside { get; internal set; } private void Awake() { //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Expected O, but got Unknown if (fireworkMusicVolume.Count > 0 && (Object)(object)fireworkMusicVolume[0] != (Object)null && !Plugin.Settings.STREAMER_FRIENDLY.Value) { fireworkMusicVolume[0].clip = fireworkMusicCopyrighted; fireworkMusicVolume[0].volume = 0.15f; } ApplyVolume(Plugin.Settings.FIREWORK_MUSIC_VOLUME.Value, fireworkMusicVolume); ApplyVolume(Plugin.Settings.FIREWORK_EXPLOSION_VOLUME.Value, fireworkExplosionVolume); ApplyVolume(Plugin.Settings.ANNOUNCER_VOLUME.Value, announcerVolume); ApplyVolume(Plugin.Settings.TENT_MUSIC_VOLUME.Value, tentMusicVolume); ApplyVolume(Plugin.Settings.DROPSHIP_VOLUME.Value, dropshipVolume); ApplyParticleIntensity(Plugin.Settings.FIREWORK_PARTICLES.Value, fireworkParticles, firework: true); ApplyParticleIntensity(Plugin.Settings.CONFETTI_PARTICLES.Value, confettiParticles); ApplyParticleIntensity(Plugin.Settings.BALLOON_PARTICLES.Value, balloonParticles); for (int i = 0; i < balloonStands.Count; i++) { InteractPurchasable stand = balloonStands[i].purchaseScript; int variant = balloonStands[i].variant; if ((Object)(object)stand == (Object)null) { continue; } stand.spawnPrefab = Plugin.GrabbableBalloon; UnityEvent? onPurchase = stand.onPurchase; if (onPurchase != null) { onPurchase.AddListener((UnityAction)delegate { GameObject? spawnPrefab = stand.spawnPrefab; GrabbablePlatform grabbablePlatform = default(GrabbablePlatform); if (spawnPrefab != null && spawnPrefab.TryGetComponent<GrabbablePlatform>(ref grabbablePlatform)) { grabbablePlatform.SwitchVariant(variant); } }); } stand.price = Plugin.Settings.BALLOON_PRICE.Value; ((InteractTrigger)stand).hoverTip = ((InteractTrigger)stand).hoverTip.Replace("PRICE", $"{stand.price}"); stand.purchaseNotification.AlreadySeen = SeenBalloonInstructions || !Plugin.Settings.BALLOON_INSTRUCTIONS.Value; } if ((Object)(object)shipScanNode != (Object)null) { shipScanNode.headerText = (Plugin.Settings.MODIFY_SHIP_NODE.Value ? "Clown Car" : "Ship"); } if ((Object)(object)dropship != (Object)null && (Object)(object)dropshipScanNode != (Object)null) { ((Component)dropshipScanNode).transform.SetParent(((Component)dropship).transform, false); ((Component)dropshipScanNode).gameObject.SetActive(true); } } public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); if (!((NetworkBehaviour)this).IsHost) { return; } if (!Plugin.Settings.FERRIS_WHEEL_EXIT.Value) { DisableFerrisFireExitClientRpc(); } float value = Plugin.Settings.BANANA_MULTIPLIER_OUTSIDE.Value; if (value != 1f && Plugin.BananaPeelOutside != null) { BananaKeysOutside = Plugin.BananaPeelOutside.randomAmount.keys; Keyframe[] keys = Plugin.BananaPeelOutside.randomAmount.keys; for (int i = 0; i < keys.Length; i++) { ref Keyframe reference = ref keys[i]; ((Keyframe)(ref reference)).value = ((Keyframe)(ref reference)).value * value; } Plugin.BananaPeelOutside.randomAmount.keys = keys; } } private void OnDisable() { if (BananaKeysOutside != null && Plugin.BananaPeelOutside != null) { Plugin.BananaPeelOutside.randomAmount.keys = BananaKeysOutside; } SoundManager.Instance.currentLevelAmbience = null; } [ClientRpc] private void DisableFerrisFireExitClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2846474551u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2846474551u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { EntranceTeleport? obj = ferrisWheelExit; if (obj != null) { ((Component)((Component)obj).transform.GetParent()).gameObject.SetActive(false); } } } private void ApplyVolume(float value, List<AudioSource> audioSources) { foreach (AudioSource audioSource in audioSources) { audioSource.volume *= value; } } private void ApplyParticleIntensity(float multiplier, List<ParticleSystem> particleSystems, bool firework = false) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0080: 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_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) foreach (ParticleSystem particleSystem in particleSystems) { EmissionModule emission = particleSystem.emission; ((EmissionModule)(ref emission)).rateOverTimeMultiplier = ((EmissionModule)(ref emission)).rateOverTimeMultiplier * multiplier; particleSystem.Emit(0); if (!firework) { break; } ParticleSystem[] componentsInChildren = ((Component)((Component)particleSystem).transform).GetComponentsInChildren<ParticleSystem>(); foreach (ParticleSystem val in componentsInChildren) { MainModule main = val.main; ((MainModule)(ref main)).maxParticles = (int)((float)((MainModule)(ref main)).maxParticles * multiplier); EmissionModule emission2 = val.emission; ((EmissionModule)(ref emission2)).rateOverTimeMultiplier = ((EmissionModule)(ref emission2)).rateOverTimeMultiplier * multiplier; for (int j = 0; j < ((EmissionModule)(ref emission2)).burstCount; j++) { Burst burst = ((EmissionModule)(ref emission2)).GetBurst(j); ((Burst)(ref burst)).minCount = (short)((float)((Burst)(ref burst)).minCount * multiplier); ((Burst)(ref burst)).maxCount = (short)((float)((Burst)(ref burst)).maxCount * multiplier); } val.Emit(0); } } } public void ToggleBalloonInstructions() { if (SeenBalloonInstructions) { return; } SeenBalloonInstructions = true; foreach (BalloonStand balloonStand in balloonStands) { balloonStand.purchaseScript?.purchaseNotification.SetNotificationSeen(); } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_ChangeSettings() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(2846474551u, new RpcReceiveHandler(__rpc_handler_2846474551)); } private static void __rpc_handler_2846474551(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((ChangeSettings)(object)target).DisableFerrisFireExitClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "ChangeSettings"; } } public class GiftSpawner : NetworkBehaviour { [CompilerGenerated] private sealed class <ReplaceGiftOnSpawn>d__19 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public NetworkObjectReference giftReference; public int variant; public GiftSpawner <>4__this; private NetworkObject <giftNetworkObject>5__1; private float <startTime>5__2; private GiftBoxItem <gift>5__3; private MeshRenderer <giftRenderer>5__4; private ScanNodeProperties <scanNode>5__5; private int <randomScrap>5__6; private SpawnableItemWithRarity <item>5__7; object? IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object? IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ReplaceGiftOnSpawn>d__19(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <giftNetworkObject>5__1 = null; <gift>5__3 = null; <giftRenderer>5__4 = null; <scanNode>5__5 = null; <item>5__7 = null; <>1__state = -2; } private bool MoveNext() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startTime>5__2 = Time.realtimeSinceStartup; goto IL_005a; case 1: <>1__state = -1; goto IL_005a; case 2: { <>1__state = -1; if (((Component)<giftNetworkObject>5__1).TryGetComponent<GiftBoxItem>(ref <gift>5__3)) { if (((Component)<gift>5__3).TryGetComponent<MeshRenderer>(ref <giftRenderer>5__4) && variant > -1) { ((Renderer)<giftRenderer>5__4).sharedMaterial = <>4__this.giftMaterials[variant]; } if (((Component)((Component)<gift>5__3).transform.GetChild(0)).TryGetComponent<ScanNodeProperties>(ref <scanNode>5__5)) { <scanNode>5__5.nodeType = 0; <scanNode>5__5.headerText = "Gift from Santa"; <scanNode>5__5.subText = "Value: ???"; <scanNode>5__5.minRange = 0; <scanNode>5__5.maxRange = 40; <scanNode>5__5.requiresLineOfSight = false; } if (!((NetworkBehaviour)<>4__this).IsHost || Random == null) { return false; } if ((Object)(object)<>4__this.coalItem != (Object)null && (float)Random.Next(0, 100) < <>4__this.chanceForCoal * 100f) { <gift>5__3.objectInPresentItem = <>4__this.coalItem; <gift>5__3.objectInPresent = <>4__this.coalItem.spawnPrefab; <gift>5__3.objectInPresentValue = 1; } else { <randomScrap>5__6 = RoundManager.Instance.GetRandomWeightedIndexList(ScrapWeights, Random); <item>5__7 = RoundManager.Instance.currentLevel.spawnableScrap[<randomScrap>5__6]; if ((Object)(object)<item>5__7?.spawnableItem != (Object)null) { <gift>5__3.objectInPresentItem = <item>5__7.spawnableItem; } else { Plugin.StaticLogger.LogWarning((object)$"Item at index {<randomScrap>5__6} has no spawn prefab. Spawning default gift item instead."); } <gift>5__3.objectInPresent = <gift>5__3.objectInPresentItem.spawnPrefab; <gift>5__3.objectInPresentValue = Math.Clamp((int)((float)Random.Next(<gift>5__3.objectInPresentItem.minValue, <gift>5__3.objectInPresentItem.maxValue) * RoundManager.Instance.scrapValueMultiplier), 0, 65); <item>5__7 = null; } <giftRenderer>5__4 = null; <scanNode>5__5 = null; } return false; } IL_005a: if (!((NetworkObjectReference)(ref giftReference)).TryGet(ref <giftNetworkObject>5__1, (NetworkManager)null) && Time.realtimeSinceStartup - <startTime>5__2 < 8f) { <>2__current = (object)new WaitForSeconds(0.03f); <>1__state = 1; return true; } <>2__current = (object)new WaitForEndOfFrame(); <>1__state = 2; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private static GameObject? <VanillaGiftbox>k__BackingField; public List<Transform> spawnLocations = new List<Transform>(); public List<Material> giftMaterials = new List<Material>(); public Item? coalItem; [Range(0f, 1f)] public float chanceForCoal = 0f; public static Random? Random { get; private set; } public static List<int> ScrapWeights { get; private set; } = new List<int>(); public static GameObject? VanillaGiftbox { get { if ((Object)(object)<VanillaGiftbox>k__BackingField == (Object)null) { VanillaGiftbox = OriginalContent.Items.Find((Item item) => item.itemId == 152767)?.spawnPrefab; } return <VanillaGiftbox>k__BackingField; } [CompilerGenerated] private set { <VanillaGiftbox>k__BackingField = value; } } private void Awake() { Random = new Random(StartOfRound.Instance.randomMapSeed + 28); ScrapWeights = RoundManager.Instance.currentLevel.spawnableScrap.Select((SpawnableItemWithRarity item) => item.rarity).ToList(); } public void SpawnGifts() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)this).IsHost || (Object)(object)VanillaGiftbox == (Object)null) { return; } GiftBoxItem val2 = default(GiftBoxItem); NetworkObject val3 = default(NetworkObject); foreach (Transform spawnLocation in spawnLocations) { GameObject val = Object.Instantiate<GameObject>(VanillaGiftbox, spawnLocation.position, spawnLocation.rotation, RoundManager.Instance.spawnedScrapContainer); if (val.TryGetComponent<GiftBoxItem>(ref val2) && ((Component)val2).TryGetComponent<NetworkObject>(ref val3)) { val3.Spawn(false); ReplaceGiftClientRpc(NetworkObjectReference.op_Implicit(val3), Random?.Next(0, giftMaterials.Count) ?? (-1)); } } } [ClientRpc] public void ReplaceGiftClientRpc(NetworkObjectReference giftReference, int variant) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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: 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_00a4: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1353726552u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref giftReference, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val2, variant); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1353726552u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { ((MonoBehaviour)this).StartCoroutine(ReplaceGiftOnSpawn(giftReference, variant)); } } } [IteratorStateMachine(typeof(<ReplaceGiftOnSpawn>d__19))] private IEnumerator ReplaceGiftOnSpawn(NetworkObjectReference giftReference, int variant) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ReplaceGiftOnSpawn>d__19(0) { <>4__this = this, giftReference = giftReference, variant = variant }; } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_GiftSpawner() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(1353726552u, new RpcReceiveHandler(__rpc_handler_1353726552)); } private static void __rpc_handler_1353726552(NetworkBehaviour? target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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_005c: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference giftReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref giftReference, default(ForNetworkSerializable)); int variant = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref variant); target.__rpc_exec_stage = (__RpcExecStage)2; ((GiftSpawner)(object)target).ReplaceGiftClientRpc(giftReference, variant); target.__rpc_exec_stage = (__RpcExecStage)0; } } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string? __getTypeName() { return "GiftSpawner"; } } public class GrabbablePlatform : PlayerAttachable { [Space(10f)] [Header("Grabbable Platform")] [Tooltip("Animator instance of the platform, used to play an animation once a player grabs the platform. Optional if already playing an animation, or the platform is stationary.")] public Animator? platformAnimator; [Tooltip("Name of the animation state to play once a player grabs the platform. Make sure to leave out any numbers at the end if using animation variants. Optional if already playing an animation, or the platform is stationary.")] public string stateName = ""; [Tooltip("Value for the animation variant to play when the player attaches, which is appended to 'stateName'. Should only be updated in the editor, or in-game before spawning the platform. Leaving it at '-1' disables animation variants.")] public int stateVariant = -1; [Tooltip("An offset to apply to the player's position while grabbing on to the platform.")] public Vector3 playerOffset = Vector3.zero; [Header("Controls")] [Tooltip("Key required to be held for the player to hang on to the platform. See 'UnityEngine.InputSystem.Key' for number values. Leaving it at '-1' allows players to remain attached without holding anything, until being detached through other means (e.g. 'detachTimer').")] public string actionToHold = ""; [Tooltip("Allow players to carry two-handed items while grabbing on to the platform.")] public bool allowTwoHanded = false; [Header("Detach")] [Tooltip("Detach the player if an enemy collides with the platform.")] public bool detachOnEnemyCollision = false; [Tooltip("Detach the player if the platform collides with a wall.")] public bool detachOnWallCollision = false; [Header("Audio")] [Tooltip("AudioSource instance of the platform, used to play sound effects at various points. Optional.")] public AudioSource? platformSource; [Tooltip("Sound effect to play when the platform spawns. Optional if not playing a spawning sound effect.")] public AudioClip? spawnSFX; [Tooltip("Sound effect to play when a player grabs on to the platform. Optional if not playing an attaching sound effect.")] public AudioClip? attachSFX; [Tooltip("Sound effect to play when the platform despawns and is destroyed. Optional if not playing a despawn sound effect.")] public AudioClip? destroySFX; [Tooltip("Lowest pitch that platform sound effects can have. Both can be set to the same value to disable pitch variation.")] [Range(-3f, 3f)] public float minPitch = 1f; [Tooltip("Highest pitch that platform sound effects can have. Both can be set to the same value to disable pitch variation.")] [Range(-3f, 3f)] public float maxPitch = 1f; public static Random Random { get; private set; } = new Random(); public Transform PlatformTransform { get; private set; } = null; public NetworkVariable<int> SyncedStateVariant { get; private set; } = new NetworkVariable<int>(-1, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<float> SyncedPitch { get; private set; } = new NetworkVariable<float>(1f, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public InputAction? ActionToHold { get; private set; } private void Awake() { if ((Object)(object)platformAnimator != (Object)null) { ((Behaviour)platformAnimator).enabled = true; platformAnimator.updateMode = (AnimatorUpdateMode)1; } PlatformTransform = ((Component)this).transform; base.AttachCondition = (PlayerControllerB player) => !player.isPlayerDead && (allowTwoHanded || !player.twoHanded) && (ActionToHold == null || ActionToHold.IsPressed()); base.DetachCondition = (PlayerControllerB player) => player.isPlayerDead || Object.op_Implicit((Object)(object)player.inAnimationWithEnemy) || player.inSpecialInteractAnimation || (ActionToHold != null && !ActionToHold.IsPressed()); if (actionToHold.Length > 0) { ActionToHold = GameNetworkManager.Instance.localPlayerController.playerActions.FindAction(actionToHold, false); } } public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); if ((Object)(object)platformSource != (Object)null && ((Behaviour)platformSource).enabled) { platformSource.pitch = SyncedPitch.Value; NetworkVariable<float> syncedPitch = SyncedPitch; syncedPitch.OnValueChanged = (OnValueChangedDelegate<float>)(object)Delegate.Combine((Delegate?)(object)syncedPitch.OnValueChanged, (Delegate?)(object)(OnValueChangedDelegate<float>)delegate(float _, float current) { platformSource.pitch = current; }); } if (((NetworkBehaviour)this).IsHost) { if (minPitch < maxPitch) { SyncedPitch.Value = (float)Random.NextDouble() * (maxPitch - minPitch) + minPitch; } if (stateVariant >= 0) { SyncedStateVariant.Value = stateVariant; } } if ((Object)(object)spawnSFX != (Object)null) { AudioSource? obj = platformSource; if (obj != null) { obj.PlayOneShot(spawnSFX, 1f); } } } public override void OnTriggerEnter(Collider collider) { EnemyAI val = default(EnemyAI); if (detachOnEnemyCollision && base.LocalPlayerAttached && ((Component)collider).TryGetComponent<EnemyAI>(ref val)) { DetachPlayerLocal(); DetachPlayerServerRpc(); } else if (detachOnWallCollision && base.LocalPlayerAttached && (((Component)collider).gameObject.layer == LayerMask.NameToLayer("Room") || ((Component)collider).gameObject.layer == LayerMask.NameToLayer("MiscLevelGeometry"))) { DetachPlayerLocal(); DetachPlayerServerRpc(); } else { base.OnTriggerEnter(collider); } } public override void Update() { //IL_001e: 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_0029: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)base.AttachedPlayer != (Object)null) { base.AttachedPlayerTransform.position = PlatformTransform.position + playerOffset; base.AttachedPlayer.ResetFallGravity(); } base.Update(); } public override void AttachPlayerLocal(PlayerControllerB player) { if ((Object)(object)attachSFX != (Object)null && (Object)(object)platformSource != (Object)null) { platformSource.PlayOneShot(attachSFX, 1f); } if (stateName.Length > 0 && (Object)(object)platformAnimator != (Object)null) { platformAnimator.Play(string.Format("{0}{1}", stateName, (SyncedStateVariant.Value >= 0) ? ((object)SyncedStateVariant.Value) : "")); } base.AttachPlayerLocal(player); } public override void DetachPlayerLocal() { if ((Object)(object)destroySFX != (Object)null && (Object)(object)platformSource != (Object)null) { platformSource.Stop(); platformSource.PlayOneShot(destroySFX, 1f); } base.DetachPlayerLocal(); } public void SwitchVariant(int variant) { stateVariant = variant; } protected override void __initializeVariables() { if (SyncedStateVariant == null) { throw new Exception("GrabbablePlatform.<SyncedStateVariant>k__BackingField cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)SyncedStateVariant).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SyncedStateVariant, "SyncedStateVariant"); ((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)SyncedStateVariant); if (SyncedPitch == null) { throw new Exception("GrabbablePlatform.<SyncedPitch>k__BackingField cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)SyncedPitch).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SyncedPitch, "SyncedPitch"); ((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)SyncedPitch); base.__initializeVariables(); } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "GrabbablePlatform"; } } public class GravityPlatform : PlayerPhysicsRegion { [Header("Gravity Platform")] [Tooltip("")] public bool applyReducedMotion = false; private void Awake() { if (applyReducedMotion && Plugin.Settings.REDUCE_MOTION_SICKNESS.Value) { base.disablePhysicsRegion = true; } } private void OnTriggerEnter(Collider other) { } private void OnTriggerExit(Collider other) { } public bool IsPhysicsRegionActive() { return !base.disablePhysicsRegion; } public void CancelPlayerMomentum(PlayerControllerB player) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) NetworkObject val = default(NetworkObject); if (((NetworkBehaviour)player).IsOwner && ((Component)player).TryGetComponent<NetworkObject>(ref val)) { ((Component)player).transform.SetParent((Transform)null); CancelPlayerMomentumServerRpc(NetworkObjectReference.op_Implicit(val)); } } [ServerRpc(RequireOwnership = false)] public void CancelPlayerMomentumServerRpc(NetworkObjectReference playerReference) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) CancelPlayerMomentumClientRpc(playerReference); } [ClientRpc] public void CancelPlayerMomentumClientRpc(NetworkObjectReference playerReference) { NetworkObject val = default(NetworkObject); PlayerControllerB val2 = default(PlayerControllerB); if (((NetworkObjectReference)(ref playerReference)).TryGet(ref val, (NetworkManager)null) && ((Component)val).TryGetComponent<PlayerControllerB>(ref val2) && val2.actualClientId != GameNetworkManager.Instance.localPlayerController.actualClientId) { ((Component)val).transform.SetParent((Transform)null); } } } public class InteractClimbable : InteractTrigger { [Header("Ladder")] [Tooltip("The climbing speed to set when using this specific ladder.")] public float climbSpeed = 15f; [HideInInspector] private float normalClimbSpeed = 3f; private void Reset() { base.hoverTip = "Climb : [LMB]"; base.animationWaitTime = 0.5f; base.animationString = "SA_PullLever"; base.lockPlayerPosition = true; base.isLadder = true; } private void Awake() { normalClimbSpeed = GameNetworkManager.Instance.localPlayerController.climbSpeed; ((UnityEvent<PlayerControllerB>)(object)base.onInteractEarly).AddListener((UnityAction<PlayerControllerB>)delegate { GameNetworkManager.Instance.localPlayerController.climbSpeed = climbSpeed; }); ((UnityEvent<PlayerControllerB>)(object)base.onInteract).AddListener((UnityAction<PlayerControllerB>)resetClimbSpeed); ((UnityEvent<PlayerControllerB>)(object)base.onCancelAnimation).AddListener((UnityAction<PlayerControllerB>)resetClimbSpeed); void resetClimbSpeed(PlayerControllerB _) { GameNetworkManager.Instance.localPlayerController.climbSpeed = normalClimbSpeed; } } protected override void __initializeVariables() { ((InteractTrigger)this).__initializeVariables(); } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "InteractClimbable"; } } public class InteractLockable : DoorLock { [Header("Interact Lockable")] [Tooltip("")] public string doorHoverMessage = "Use door : [LMB]"; [Tooltip("")] public string doorUnlockMessage = ""; [Tooltip("")] public string doorLockedMessage = "Locked"; [Tooltip("")] public string doorLockedKeyMessage = "Use key: [ LMB ]"; [Tooltip("")] public string doorLockedKeyControllerMessage = "Use key: [R-trigger]"; [Tooltip("")] public string lockPickHoverMessage = "Locked (pickable)"; [Tooltip("")] public string lockPickUnlockMessage = "Picking lock"; [Tooltip("")] public string lockPickUnlockTimerMessage = "Picking lock: {0} sec."; public bool WasUnlockedLastFrame { get; private set; } = false; public bool StartedLocked { get; private set; } = false; public void Awake() { ((DoorLock)this).Awake(); if (base.isLocked) { StartedLocked = true; } } public void LockDoor(float timeToLockPick = 30f) { base.doorTrigger.interactable = false; base.doorTrigger.timeToHold = timeToLockPick; base.doorTrigger.timeToHoldSpeedMultiplier = 1f; base.doorTrigger.hoverTip = lockPickHoverMessage; base.doorTrigger.holdTip = lockPickUnlockMessage; base.isPickingLock = false; base.isLocked = true; base.navMeshObstacle.carving = true; base.navMeshObstacle.carveOnlyStationary = true; if ((Object)(object)base.twinDoor != (Object)null) { base.twinDoor.doorTrigger.interactable = false; base.twinDoor.doorTrigger.timeToHold = timeToLockPick; base.twinDoor.doorTrigger.timeToHoldSpeedMultiplier = 1f; base.twinDoor.doorTrigger.hoverTip = lockPickHoverMessage; base.twinDoor.doorTrigger.holdTip = lockPickUnlockMessage; base.twinDoor.isPickingLock = false; base.twinDoor.isLocked = true; } } public void UnlockDoor() { base.doorLockSFX.Stop(); base.doorLockSFX.PlayOneShot(base.unlockSFX); base.navMeshObstacle.carving = false; base.navMeshObstacle.carveOnlyStationary = false; if (base.isLocked) { base.doorTrigger.interactable = true; base.doorTrigger.timeToHold = base.defaultTimeToHold; base.doorTrigger.timeToHoldSpeedMultiplier = 1f; base.doorTrigger.hoverTip = doorHoverMessage; base.doorTrigger.holdTip = doorUnlockMessage; base.isPickingLock = false; base.isLocked = false; } } public void Update() { if (base.isLocked) { InteractTrigger doorTrigger = base.doorTrigger; GrabbableObject currentlyHeldObjectServer = GameNetworkManager.Instance.localPlayerController.currentlyHeldObjectServer; doorTrigger.disabledHoverTip = ((currentlyHeldObjectServer == null || currentlyHeldObjectServer.itemProperties.itemId != 14) ? doorLockedMessage : (StartOfRound.Instance.localPlayerUsingController ? doorLockedKeyControllerMessage : doorLockedKeyMessage)); if (base.playersPickingDoor > 0) { base.playerPickingLockProgress = Mathf.Clamp(base.playerPickingLockProgress + (float)base.playersPickingDoor * 0.85f * Time.deltaTime, 1f, 5.5f); } base.doorTrigger.timeToHoldSpeedMultiplier = Mathf.Clamp((float)base.playersPickingDoor * 0.85f, 1f, 3.5f); if (base.isPickingLock) { base.lockPickTimeLeft -= Time.deltaTime; base.doorTrigger.disabledHoverTip = string.Format(lockPickUnlockTimerMessage, (int)base.lockPickTimeLeft); if (((NetworkBehaviour)this).IsServer && base.lockPickTimeLeft < 0f) { UnlockDoor(); ((DoorLock)this).UnlockDoorServerRpc(); } } } else { base.navMeshObstacle.carving = false; if (base.hauntedDoor) { ((DoorLock)this).TryDoorHaunt(); } if (StartedLocked && !WasUnlockedLastFrame && !base.isLocked) { base.doorTrigger.hoverTip = doorHoverMessage; base.doorTrigger.holdTip = doorUnlockMessage; WasUnlockedLastFrame = true; } } } protected override void __initializeVariables() { ((DoorLock)this).__initializeVariables(); } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "InteractLockable"; } } [Serializable] public struct Notification { [Tooltip("")] public string headerText; [Tooltip("")] public string bodyText; [Tooltip("")] public bool showOnce; [Tooltip("")] public bool AlreadySeen { get; internal set; } public Notification() { headerText = ""; bodyText = ""; showOnce = false; AlreadySeen = false; } public void SetNotificationSeen() { AlreadySeen = true; } } public class InteractPurchasable : InteractTrigger { [Header("Purchasable Object")] [Tooltip("Prefab to spawn upon a successful transaction.")] public GameObject? spawnPrefab; [Tooltip("Position and rotation of the purchasable object when spawned.")] public Transform? spawnTransform; [Tooltip("Credits required to spawn the purchasable object.")] [Range(-1f, 10000f)] public int price = -1; [Tooltip("Callback invoked when a transaction is complete but the object has not yet been spawned. NOTE: Actions won't run using the instantiated object, but they can be used to modify the prefab on the host before spawning it, which can then be synchronized with clients using NetworkVariables... Not ideal.")] public UnityEvent? onPurchase; [Tooltip("")] public UnityEvent? onPurchaseNotify; [Tooltip("")] public Notification purchaseNotification; public static Terminal? Terminal { get; private set; } private void Awake() { if ((Object)(object)Terminal == (Object)null) { Terminal = Object.FindObjectOfType<Terminal>(); } ((UnityEvent<PlayerControllerB>)(object)base.onInteract).AddListener((UnityAction<PlayerControllerB>)delegate(PlayerControllerB player) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) NetworkObject val = default(NetworkObject); if (player?.actualClientId == GameNetworkManager.Instance.localPlayerController.actualClientId && ((Component)player).TryGetComponent<NetworkObject>(ref val)) { RequestPurchaseServerRpc(NetworkObjectReference.op_Implicit(val)); } }); } [ServerRpc(RequireOwnership = false)] public void RequestPurchaseServerRpc(NetworkObjectReference playerReference) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(363214469u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref playerReference, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 363214469u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost) || (Object)(object)spawnPrefab == (Object)null || (Object)(object)spawnTransform == (Object)null || (Object)(object)Terminal == (Object)null) { return; } if (price < 0 || Terminal.groupCredits < price) { SendNotificationClientRpc(playerReference, price); return; } Terminal.SyncGroupCreditsServerRpc(Terminal.groupCredits - price, -1); UnityEvent? obj = onPurchase; if (obj != null) { obj.Invoke(); } GameObject? obj2 = spawnPrefab; Vector3 position = spawnTransform.position; Quaternion rotation = spawnTransform.rotation; RoundManager instance = RoundManager.Instance; object obj3; if (instance == null) { obj3 = null; } else { GameObject mapPropsContainer = instance.mapPropsContainer; obj3 = ((mapPropsContainer != null) ? mapPropsContainer.transform : null); } GameObject val3 = Object.Instantiate<GameObject>(obj2, position, rotation, (Transform)obj3); NetworkObject val4 = default(NetworkObject); if (val3.TryGetComponent<NetworkObject>(ref val4)) { val4.Spawn(true); } SendNotificationClientRpc(playerReference, -1, success: true); } [ClientRpc] public void SendNotificationClientRpc(NetworkObjectReference playerReference, int price = -1, bool success = false) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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: 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_00a5: 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_00bf: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2299495428u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref playerReference, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val2, price); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref success, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2299495428u, val, (RpcDelivery)0); } NetworkObject val3 = default(NetworkObject); PlayerControllerB val4 = default(PlayerControllerB); if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost) || !((NetworkObjectReference)(ref playerReference)).TryGet(ref val3, (NetworkManager)null) || !((Component)val3).TryGetComponent<PlayerControllerB>(ref val4) || val4.actualClientId != GameNetworkManager.Instance.localPlayerController.actualClientId) { return; } if (success) { if (purchaseNotification.AlreadySeen) { return; } HUDManager.Instance.DisplayTip(purchaseNotification.headerText, purchaseNotification.bodyText, false, false, "LC_Tip1"); if (purchaseNotification.showOnce) { UnityEvent? obj = onPurchaseNotify; if (obj != null) { obj.Invoke(); } } } else if (price >= 0) { HUDManager.Instance.DisplayTip("Cannot afford purchase!", $"A minimum of {price} credits is required.", false, false, "LC_Tip1"); } else { HUDManager.Instance.DisplayTip("Cannot purchase!", "This purchasable has been disabled by the host.", false, false, "LC_Tip1"); } } protected override void __initializeVariables() { ((InteractTrigger)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_InteractPurchasable() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got