Decompiled source of Bozoros v2.3.3

BepInEx/plugins/Bozoros.dll

Decompiled 3 days ago
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.NetcodePatcher;
using Bozoros.Patches;
using Bozoros.Skins;
using DunGen;
using GameNetcodeStuff;
using HarmonyLib;
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("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.3.0")]
[assembly: AssemblyInformationalVersion("2.3.3")]
[assembly: AssemblyProduct("Bozoros")]
[assembly: AssemblyTitle("Bozoros")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.3.3.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 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<bool> MODIFY_SHIP_NODE { get; private set; }

		public ConfigEntry<bool> ADD_DROPSHIP_NODE { 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>()));
			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.");
			CIRCUS_FACILITY_MIMICS = cfg.Bind<bool>("Compatibility", "CircusFacilityMimics", true, "Allow x753's Mimics to spawn in Circus Facility.");
			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.*/)]
	[BepInPlugin("LethalMatt.Bozoros", "BozorosPlugin", "2.3.3")]
	public class Plugin : BaseUnityPlugin
	{
		internal const string GUID = "LethalMatt.Bozoros";

		internal const string PLUGIN_NAME = "BozorosPlugin";

		internal const string VERSION = "2.3.3";

		internal static ManualLogSource? StaticLogger { get; private set; }

		internal static Harmony? Harmony { get; private set; }

		public static Config? Settings { get; private set; }

		public static Texture2D? BozorosIcon { 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));
				if (WeatherRegistryCompatibility.Enabled)
				{
					Harmony.PatchAll(typeof(WeatherRegistryCompatibility));
				}
				ManualLogSource? staticLogger = StaticLogger;
				if (staticLogger != null)
				{
					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
				{
					ManualLogSource? staticLogger = StaticLogger;
					if (staticLogger != null)
					{
						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
				{
					ManualLogSource? staticLogger2 = StaticLogger;
					if (staticLogger2 != null)
					{
						staticLogger2.LogError((object)"Could not load CircusFacility... ExtendedDungeonFlow not found!");
					}
				}
			}, "LethalMatt", "Bozoros");
			AssetBundleLoader.AddOnLethalBundleLoadedListener((Action<AssetBundle>)delegate(AssetBundle assetBundle)
			{
				BozorosIcon = assetBundle.LoadAsset<Texture2D>("BozorosIcon.png");
				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)
				{
					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.RegisterSkins();
			}
			if (MimicsCompatibility.Enabled)
			{
				MimicsCompatibility.RegisterCircusMimic();
			}
		}

		private static void NetcodePatcher()
		{
			Type[] array;
			try
			{
				array = Assembly.GetExecutingAssembly().GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				List<Type> list = new List<Type>();
				foreach (Type item in ex.Types.Where((Type type) => type != null))
				{
					list.Add(item);
				}
				array = list.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) == true)
				{
					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 => Plugin.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) == true)
					{
						((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 => Plugin.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 => Plugin.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) == true)
					{
						((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]
	internal class LoadPatch
	{
		public static bool FirstLoad { get; private set; } = true;


		public static event Action? OnFinishGeneratingLevelPost;

		[HarmonyPatch(typeof(RoundManager), "FinishGeneratingLevel")]
		[HarmonyPostfix]
		private static void FinishGeneratingLevelPost()
		{
			LoadPatch.OnFinishGeneratingLevelPost?.Invoke();
		}

		[HarmonyPatch(typeof(MenuManager), "Start")]
		[HarmonyPrefix]
		private static void MenuManagerStartPre()
		{
			if (FirstLoad)
			{
				FirstLoad = false;
				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_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			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) == true)
				{
					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
{
	internal class EnemySkinRegistryCompatibility
	{
		private static bool? _enabled;

		public static bool Enabled
		{
			get
			{
				bool valueOrDefault = _enabled.GetValueOrDefault();
				if (!_enabled.HasValue)
				{
					valueOrDefault = Chainloader.PluginInfos.ContainsKey("antlershed.lethalcompany.enemyskinregistry");
					_enabled = valueOrDefault;
				}
				return _enabled.Value;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		internal static void RegisterSkins()
		{
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			AssetBundleLoader.AddOnLethalBundleLoadedListener((Action<AssetBundle>)delegate(AssetBundle assetBundle)
			{
				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");
			Config? settings = Plugin.Settings;
			if (settings != null && settings.GOOFY_PUFFER_NAMES.Value.Length > 0)
			{
				List<string> list = new List<string>();
				string[] array = Plugin.Settings.GOOFY_PUFFER_NAMES.Value.Split(',');
				foreach (string item in array)
				{
					list.Add(item);
				}
				GoofyPuffer.GoofyPufferNames = list;
				LoadPatch.OnFinishGeneratingLevelPost += delegate
				{
					GoofyPuffer.Random = new Random(StartOfRound.Instance.randomMapSeed + 1);
				};
			}
			Config? settings2 = Plugin.Settings;
			if (settings2 != null && settings2.CLOWN_GIANT_NAMES.Value.Length > 0)
			{
				List<string> list2 = new List<string>();
				string[] array2 = Plugin.Settings.CLOWN_GIANT_NAMES.Value.Split(',');
				foreach (string item in array2)
				{
					list2.Add(item);
				}
				ClownGiant.ClownGiantNames = list2;
				LoadPatch.OnFinishGeneratingLevelPost += delegate
				{
					ClownGiant.Random = new Random(StartOfRound.Instance.randomMapSeed + 2);
				};
			}
			Config? settings3 = Plugin.Settings;
			if (settings3 != null && settings3.SANTA_BUTLER_NAMES.Value.Length > 0)
			{
				List<string> list3 = new List<string>();
				string[] array3 = Plugin.Settings.SANTA_BUTLER_NAMES.Value.Split(',');
				foreach (string item in array3)
				{
					list3.Add(item);
				}
				SantaButler.SantaButlerNames = list3;
				LoadPatch.OnFinishGeneratingLevelPost += delegate
				{
					SantaButler.Random = new Random(StartOfRound.Instance.randomMapSeed + 3);
				};
			}
			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;
				}
			});
		}
	}
	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");
			Config? settings = Plugin.Settings;
			if (settings != null && 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.Behaviours
{
	public class ActivateApparatus : NetworkBehaviour
	{
		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;
				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;
	}
	[Serializable]
	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; }

		public Keyframe[]? BananaKeysInside { get; internal set; }

		private void Awake()
		{
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Expected O, but got Unknown
			if (Plugin.Settings == null)
			{
				return;
			}
			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 || Plugin.Settings == null)
			{
				return;
			}
			if (!Plugin.Settings.FERRIS_WHEEL_EXIT.Value)
			{
				DisableFerrisFireExitClientRpc();
			}
			float value = Plugin.Settings.BANANA_MULTIPLIER_OUTSIDE.Value;
			float value2 = Plugin.Settings.BANANA_MULTIPLIER_INSIDE.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;
			}
			if (value2 != 1f && Plugin.BananaPeelInside != null)
			{
				BananaKeysInside = Plugin.BananaPeelInside.numberToSpawn.keys;
				Keyframe[] keys2 = Plugin.BananaPeelInside.numberToSpawn.keys;
				for (int j = 0; j < keys2.Length; j++)
				{
					ref Keyframe reference2 = ref keys2[j];
					((Keyframe)(ref reference2)).value = ((Keyframe)(ref reference2)).value * value2;
				}
				Plugin.BananaPeelInside.numberToSpawn.keys = keys2;
			}
		}

		private void OnDisable()
		{
			if (BananaKeysOutside != null && Plugin.BananaPeelOutside != null)
			{
				Plugin.BananaPeelOutside.randomAmount.keys = BananaKeysOutside;
			}
			if (BananaKeysInside != null && Plugin.BananaPeelInside != null)
			{
				Plugin.BananaPeelInside.numberToSpawn.keys = BananaKeysInside;
			}
			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";
		}
	}
	[Serializable]
	public class GiftSpawner : NetworkBehaviour
	{
		private static GameObject? _vanillaGiftbox;

		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 == (Object)null)
				{
					VanillaGiftbox = OriginalContent.Items.Find((Item item) => item.itemId == 152767)?.spawnPrefab;
				}
				return _vanillaGiftbox;
			}
			private set
			{
				_vanillaGiftbox = 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));
				}
			}
		}

		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)
			float startTime = Time.realtimeSinceStartup;
			NetworkObject giftNetworkObject = default(NetworkObject);
			while (!((NetworkObjectReference)(ref giftReference)).TryGet(ref giftNetworkObject, (NetworkManager)null) && Time.realtimeSinceStartup - startTime < 8f)
			{
				yield return (object)new WaitForSeconds(0.03f);
			}
			yield return (object)new WaitForEndOfFrame();
			GiftBoxItem gift = default(GiftBoxItem);
			if (!((Component)giftNetworkObject).TryGetComponent<GiftBoxItem>(ref gift))
			{
				yield break;
			}
			MeshRenderer giftRenderer = default(MeshRenderer);
			if (((Component)gift).TryGetComponent<MeshRenderer>(ref giftRenderer) && variant > -1)
			{
				((Renderer)giftRenderer).sharedMaterial = giftMaterials[variant];
			}
			ScanNodeProperties scanNode = default(ScanNodeProperties);
			if (((Component)((Component)gift).transform.GetChild(0)).TryGetComponent<ScanNodeProperties>(ref scanNode))
			{
				scanNode.nodeType = 0;
				scanNode.headerText = "Gift from Santa";
				scanNode.subText = "Value: ???";
				scanNode.minRange = 0;
				scanNode.maxRange = 40;
				scanNode.requiresLineOfSight = false;
			}
			if (!((NetworkBehaviour)this).IsHost || Random == null)
			{
				yield break;
			}
			if ((Object)(object)coalItem != (Object)null && (float)Random.Next(0, 100) < chanceForCoal * 100f)
			{
				gift.objectInPresentItem = coalItem;
				gift.objectInPresent = coalItem.spawnPrefab;
				gift.objectInPresentValue = 1;
				yield break;
			}
			int randomScrap = RoundManager.Instance.GetRandomWeightedIndexList(ScrapWeights, Random);
			SpawnableItemWithRarity item = RoundManager.Instance.currentLevel.spawnableScrap[randomScrap];
			if ((Object)(object)item?.spawnableItem != (Object)null)
			{
				gift.objectInPresentItem = item.spawnableItem;
			}
			else
			{
				ManualLogSource? staticLogger = Plugin.StaticLogger;
				if (staticLogger != null)
				{
					staticLogger.LogWarning((object)$"Item at index {randomScrap} has no spawn prefab. Spawning default gift item instead.");
				}
			}
			gift.objectInPresent = gift.objectInPresentItem.spawnPrefab;
			gift.objectInPresentValue = Math.Clamp((int)((float)Random.Next(gift.objectInPresentItem.minValue, gift.objectInPresentItem.maxValue) * RoundManager.Instance.scrapValueMultiplier), 0, 65);
		}

		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 int keyToHold = -1;

		[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);


		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) => (allowTwoHanded || !player.twoHanded) && (keyToHold < 0 || ((ButtonControl)Keyboard.current[(Key)keyToHold]).isPressed);
			base.DetachCondition = (PlayerControllerB player) => (keyToHold > 0 && !((ButtonControl)Keyboard.current[(Key)keyToHold]).isPressed) || player.isPlayerDead || Object.op_Implicit((Object)(object)player.inAnimationWithEnemy) || player.inSpecialInteractAnimation;
		}

		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
	{
		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);
			}
		}
	}
	[Serializable]
	public struct Notification
	{
		[Tooltip("")]
		public string headerText;

		[Tooltip("")]
		public string bodyText;

		[Tooltip("")]
		public bool showOnce;

		[Tooltip("")]
		[HideInInspector]
		public bool alreadySeen;

		public Notification()
		{
			headerText = "";
			bodyText = "";
			showOnce = false;
			alreadySeen = false;
		}

		public void SetNotificationSeen()
		{
			alreadySeen = true;
		}
	}
	[Serializable]
	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 Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(363214469u, new RpcReceiveHandler(__rpc_handler_363214469));
			NetworkManager.__rpc_func_table.Add(2299495428u, new RpcReceiveHandler(__rpc_handler_2299495428));
		}

		private static void __rpc_handler_363214469(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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				NetworkObjectReference playerReference = default(NetworkObjectReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref playerReference, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((InteractPurchasable)(object)target).RequestPurchaseServerRpc(playerReference);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2299495428(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_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				NetworkObjectReference playerReference = default(NetworkObjectReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref playerReference, default(ForNetworkSerializable));
				int num = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref num);
				bool success = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref success, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((InteractPurchasable)(object)target).SendNotificationClientRpc(playerReference, num, success);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string? __getTypeName()
		{
			return "InteractPurchasable";
		}
	}
	[Serializable]
	public class InteractSeatable : InteractTrigger
	{
		public AudioSource? seatableSource;

		public UnityEvent? onPlayerSit;

		public UnityEvent? onPlayerStand;

		public PlayerControllerB? SittingPlayer { get; private set; }

		public bool LocalPlayerSeated { get; private set; } = false;


		public Vector3 PlayerExitPoint { get; private set; } = Vector3.zero;


		private void Reset()
		{
			base.hoverTip = "Sit down : [LMB]";
			base.oneHandedItemAllowed = true;
			base.holdInteraction = true;
			base.timeToHold = 0.2f;
			base.cooldownTime = 0.3f;
			base.specialCharacterAnimation = true;
			base.stopAnimationManually = true;
			base.stopAnimationString = "SA_stopAnimation";
			base.hidePlayerItem = true;
			base.animationWaitTime = 2f;
			base.animationString = "SA_Truck";
			base.lockPlayerPosition = true;
			base.clampLooking = true;
			base.setVehicleAnimation = true;
			base.minVerticalClamp = 50f;
			base.maxVerticalClamp = -70f;
			base.horizontalClamp = 120f;
		}

		private void Awake()
		{
			((UnityEvent<PlayerControllerB>)(object)base.onInteractEarlyOtherClients).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))
				{
					SetPlayerOnSeatServerRpc(NetworkObjectReference.op_Implicit(val));
				}
			});
		}

		private void Update()
		{
			((InteractTrigger)this).Update();
			if (!((Object)(object)SittingPlayer == (Object)null) && LocalPlayerSeated && ((ButtonControl)Keyboard.current[(Key)1]).isPressed)
			{
				ExitChairLocal(teleport: true);
				ExitChairServerRpc();
			}
		}

		public void SetPlayerOnSeatLocal(PlayerControllerB playerSitting)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (GameNetworkManager.Instance.localPlayerController.actualClientId == playerSitting.actualClientId)
			{
				PlayerExitPoint = ((Component)playerSitting.visorCamera).transform.position;
				LocalPlayerSeated = true;
			}
			SittingPlayer = playerSitting;
			base.interactable = false;
			UnityEvent? obj = onPlayerSit;
			if (obj != null)
			{
				obj.Invoke();
			}
		}

		public void ExitChairLocal(bool teleport = false)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)SittingPlayer == (Object)null))
			{
				if (teleport)
				{
					SittingPlayer.TeleportPlayer(PlayerExitPoint, false, 0f, false, true);
				}
				UnityEvent? obj = onPlayerStand;
				if (obj != null)
				{
					obj.Invoke();
				}
				PlayerExitPoint = Vector3.zero;
				LocalPlayerSeated = false;
				SittingPlayer = null;
				base.interactable = true;
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SetPlayerOnSeatServerRpc(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_00f6: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(897226711u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref playerReference, default(ForNetworkSerializable));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 897226711u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && !LocalPlayerSeated && !((Object)(object)SittingPlayer != (Object)null))
				{
					SetPlayerOnSeatClientRpc(playerReference);
				}
			}
		}

		[ClientRpc]
		public void SetPlayerOnSeatClientRpc(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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1293416788u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref playerReference, default(ForNetworkSerializable));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1293416788u, val, (RpcDelivery)0);
				}
				NetworkObject val3 = default(NetworkObject);
				PlayerControllerB playerOnSeatLocal = 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 playerOnSeatLocal))
				{
					SetPlayerOnSeatLocal(playerOnSeatLocal);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void ExitChairServerRpc()
		{
			//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)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1809112095u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1809112095u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ExitChairClientRpc();
				}
			}
		}

		[ClientRpc]
		public void ExitChairClientRpc()
		{
			//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)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(716728377u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 716728377u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					ExitChairLocal();
				}
			}
		}

		protected override void __initializeVariables()
		{
			((InteractTrigger)this).__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_InteractSeatable()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(897226711u, new RpcReceiveHandler(__rpc_handler_897226711));
			NetworkManager.__rpc_func_table.Add(1293416788u, new RpcReceiveHandler(__rpc_handler_1293416788));
			NetworkManager.__rpc_func_table.Add(1809112095u, new RpcReceiveHandler(__rpc_handler_1809112095));
			NetworkManager.__rpc_func_table.Add(716728377u, new RpcReceiveHandler(__rpc_handler_716728377));
		}

		private static void __rpc_handler_897226711(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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				NetworkObjectReference playerOnSeatServerRpc = default(NetworkObjectReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref playerOnSeatServerRpc, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((InteractSeatable)(object)target).SetPlayerOnSeatServerRpc(playerOnSeatServerRpc);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1293416788(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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				NetworkObjectReference playerOnSeatClientRpc = default(NetworkObjectReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref playerOnSeatClientRpc, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((InteractSeatable)(object)target).SetPlayerOnSeatClientRpc(playerOnSeatClientRpc);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1809112095(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)1;
				((InteractSeatable)(object)target).ExitChairServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_716728377(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;
				((InteractSeatable)(object)target).ExitChairClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string? __getTypeName()
		{
			return "InteractSeatable";
		}
	}
	[Serializable]
	public class LightsOut : MonoBehaviour
	{
		public Material? dimLightMaterial;

		public Material? ferrisWindowMaterial;

		public List<GameObject> lights = new List<GameObject>();

		private void Awake()
		{
			if ((Object)(object)dimLightMaterial == (Object)null || (Object)(object)ferrisWindowMaterial == (Object)null)
			{
				return;
			}
			foreach (GameObject light in lights)
			{
				MeshRenderer[] componentsInChildren = light.GetComponentsInChildren<MeshRenderer>();
				foreach (MeshRenderer val in componentsInChildren)
				{
					Material[] sharedMaterials = ((Renderer)val).sharedMaterials;
					for (int j = 0; j < sharedMaterials.Length; j++)
					{
						if (((Object)sharedMaterials[j]).name.Contains("Lights"))
						{
							sharedMaterials[j] = dimLightMaterial;
						}
						else if (((Object)sharedMaterials[j]).name.Contains("Ferris"))
						{
							sharedMaterials[j] = ferrisWindowMaterial;
						}
					}
					((Renderer)val).sharedMaterials = sharedMaterials;
				}
			}
		}
	}
	public abstract class PlayerAttachable : NetworkBehaviour
	{
		[Header("Attach")]
		[Tooltip("")]
		public UnityEvent<PlayerControllerB>? onAttach;

		[Tooltip("Allow players to attach multiple times (though not at the same time).")]
		public bool triggerOnce = false;

		[Header("Detach")]
		[Tooltip("")]
		public UnityEvent<PlayerControllerB>? onDetach;

		[Tooltip("Delay in seconds until the player is forcibly detached. Can be left at '0' to attach to the player for an indefinite amount of time.")]
		public float detachTimer = 0f;

		[Header("Despawn")]
		[Tooltip("")]
		public NetworkObject? parentNetworkObject;

		[Tooltip("")]
		public UnityEvent? onDespawn;

		[Tooltip("Destroy and despawn after the player detaches.")]
		public bool despawnOnDetach = false;

		[Tooltip("Delay in seconds until despawning after detaching the player, to allow effects to play.")]
		public float despawnTimer = 0f;

		public PlayerControllerB? AttachedPlayer { get; protected set; }

		public Transform AttachedPlayerTransform { get; protected set; } = null;


		public bool LocalPlayerAttached { get; protected set; } = false;


		public bool HasTriggered { get; protected set; } = false;


		public Predicate<PlayerControllerB> AttachCondition { get; protected set; } = (PlayerControllerB _) => true;


		public Predicate<PlayerControllerB> DetachCondition { get; protected set; } = (PlayerControllerB _) => false;


		public virtual void OnTriggerEnter(Collider collider)
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB val = default(PlayerControllerB);
			if ((!triggerOnce || !HasTriggered) && !((Object)(object)AttachedPlayer != (Object)null) && ((Component)collider).TryGetComponent<PlayerControllerB>(ref val) && val.actualClientId == GameNetworkManager.Instance.localPlayerController.actualClientId && A