Decompiled source of LethalCasinoNOATM v1.0.0

erm45.LethalCasinoNOATM.dll

Decompiled 4 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCasino.Config;
using LethalCasino.Custom;
using LethalCasino.Patches;
using LethalCasino.Types;
using LethalCasino.patches;
using Microsoft.CodeAnalysis;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.SceneManagement;
using mrgrm7.LethalCasino.NetcodePatcher;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: 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: AssemblyCompany("mrgrm7.LethalCasino")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("The Company is investing in a new vertical")]
[assembly: AssemblyFileVersion("1.1.2.0")]
[assembly: AssemblyInformationalVersion("1.1.2+dc48dae2810e2ae1a0bec0d4f68b9631bd4fc928")]
[assembly: AssemblyProduct("LethalCasino")]
[assembly: AssemblyTitle("mrgrm7.LethalCasino")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
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;
		}
	}
}
public struct NetworkStringIntDictionary : INetworkSerializable
{
	public Dictionary<string, int> Dictionary;

	public unsafe void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		if (Dictionary == null && !serializer.IsReader)
		{
			Dictionary = new Dictionary<string, int>();
		}
		int num = ((!serializer.IsReader) ? Dictionary.Count : 0);
		((BufferSerializer<int>*)(&serializer))->SerializeValue<int>(ref num, default(ForPrimitives));
		if (serializer.IsReader)
		{
			Dictionary = new Dictionary<string, int>(num);
		}
		for (int i = 0; i < num; i++)
		{
			string key = string.Empty;
			int value = 0;
			if (!serializer.IsReader)
			{
				key = Dictionary.Keys.ElementAt(i);
				value = Dictionary[key];
			}
			serializer.SerializeValue(ref key, false);
			((BufferSerializer<int>*)(&serializer))->SerializeValue<int>(ref value, default(ForPrimitives));
			if (serializer.IsReader)
			{
				Dictionary[key] = value;
			}
		}
	}
}
public struct NetworkStringBoolDictionary : INetworkSerializable
{
	public Dictionary<string, bool> Dictionary;

	public unsafe void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		if (Dictionary == null && !serializer.IsReader)
		{
			Dictionary = new Dictionary<string, bool>();
		}
		int num = ((!serializer.IsReader) ? Dictionary.Count : 0);
		((BufferSerializer<int>*)(&serializer))->SerializeValue<int>(ref num, default(ForPrimitives));
		if (serializer.IsReader)
		{
			Dictionary = new Dictionary<string, bool>(num);
		}
		for (int i = 0; i < num; i++)
		{
			string key = string.Empty;
			bool value = false;
			if (!serializer.IsReader)
			{
				key = Dictionary.Keys.ElementAt(i);
				value = Dictionary[key];
			}
			serializer.SerializeValue(ref key, false);
			((BufferSerializer<bool>*)(&serializer))->SerializeValue<bool>(ref value, default(ForPrimitives));
			if (serializer.IsReader)
			{
				Dictionary[key] = value;
			}
		}
	}
}
namespace LethalCasino
{
	[BepInPlugin("mrgrm7.LethalCasino", "LethalCasino", "1.1.2")]
	public class Plugin : BaseUnityPlugin
	{
		private static Harmony harmony;

		public static ManualLogSource logger;

		public static Dictionary<string, GameObject> Prefabs;

		public static Dictionary<string, AudioClip> Sounds;

		public static Dictionary<string, Material> Materials;

		public static int numSongs = 10;

		public static LethalCasinoConfig configFile;

		public static Plugin Instance { get; private set; }

		private void Awake()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			Instance = this;
			harmony = new Harmony("mrgrm7.LethalCasino");
			NetcodeWeaver();
			logger = Logger.CreateLogSource("mrgrm7.LethalCasino");
			configFile = new LethalCasinoConfig(((BaseUnityPlugin)this).Config);
			LoadAllAssets();
			Patch();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"mrgrm7.LethalCasino v1.1.2 has loaded!");
		}

		private void LoadAllAssets()
		{
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Expected O, but got Unknown
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Expected O, but got Unknown
			Prefabs = new Dictionary<string, GameObject>();
			Sounds = new Dictionary<string, AudioClip>();
			Materials = new Dictionary<string, Material>();
			string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(directoryName, "lethalcasinoassets"));
			if (!Object.op_Implicit((Object)(object)val))
			{
				logger.LogError((object)"Failed to load asset bundle");
				return;
			}
			logger.LogInfo((object)"Asset bundle loaded successfully");
			Prefabs.Add("CasinoBuilding", LoadAsset<GameObject>(val, "CasinoBuilding"));
			Prefabs["CasinoBuilding"].AddComponent<CasinoBuilding>();
			Prefabs.Add("SlotMachine", LoadAsset<GameObject>(val, "SlotMachine"));
			Prefabs["SlotMachine"].AddComponent<SlotMachine>();
			Prefabs["SlotMachine"].AddComponent<InteractableCasinoComponent>();
			Prefabs.Add("Roulette", LoadAsset<GameObject>(val, "Roulette"));
			Prefabs["Roulette"].AddComponent<Roulette>();
			((Component)Prefabs["Roulette"].transform.Find("Wheel")).gameObject.AddComponent<InteractableCasinoComponent>();
			foreach (Transform item in Prefabs["Roulette"].transform.Find("BetContainer"))
			{
				Transform val2 = item;
				((Component)val2).gameObject.AddComponent<InteractableCasinoComponent>();
			}
			Prefabs.Add("Coin1", LoadAsset<GameObject>(val, "Coin1"));
			Prefabs.Add("Coin10", LoadAsset<GameObject>(val, "Coin10"));
			Prefabs.Add("Coin50", LoadAsset<GameObject>(val, "Coin50"));
			Prefabs.Add("Coin100", LoadAsset<GameObject>(val, "Coin100"));
			Prefabs.Add("Blackjack", LoadAsset<GameObject>(val, "Blackjack"));
			Prefabs["Blackjack"].AddComponent<Blackjack>();
			Prefabs.Add("BlackjackBetControls", LoadAsset<GameObject>(val, "BlackjackBetControls"));
			foreach (Transform item2 in Prefabs["Blackjack"].transform)
			{
				Transform val3 = item2;
				if (((Object)((Component)val3).gameObject).name.StartsWith("Player") || ((Object)((Component)val3).gameObject).name.StartsWith("DealerHand"))
				{
					((Component)val3).gameObject.AddComponent<InteractableCasinoComponent>();
				}
			}
			Prefabs.Add("Card", LoadAsset<GameObject>(val, "Card"));
			string[] pLAYING_CARD_SUITS = Constants.PLAYING_CARD_SUITS;
			foreach (string text in pLAYING_CARD_SUITS)
			{
				string[] pLAYING_CARD_VALUES = Constants.PLAYING_CARD_VALUES;
				foreach (string text2 in pLAYING_CARD_VALUES)
				{
					string text3 = text2.ToLower() + "_" + text.ToLower();
					Materials.Add(text3, LoadAsset<Material>(val, text3));
				}
			}
			Sounds.Add("ShuffleDeck", LoadAsset<AudioClip>(val, "ShuffleDeck"));
			for (int k = 0; k < Constants.ASSETS_NUM_CARD_DEAL_SOUNDS; k++)
			{
				string text4 = $"CardDeal{k + 1}";
				Sounds.Add(text4, LoadAsset<AudioClip>(val, text4));
			}
			for (int l = 0; l < Constants.ASSETS_NUM_CARD_FLIP_SOUNDS; l++)
			{
				string text5 = $"CardFlip{l + 1}";
				Sounds.Add(text5, LoadAsset<AudioClip>(val, text5));
			}
			for (int m = 0; m < Constants.ASSETS_NUM_BLACKJACK_WIN_SOUNDS; m++)
			{
				string text6 = $"BlackjackWin{m + 1}";
				Sounds.Add(text6, LoadAsset<AudioClip>(val, text6));
			}
			Sounds.Add("BlackjackDealerWins", LoadAsset<AudioClip>(val, "BlackjackDealerWins"));
			Sounds.Add("BlackjackButtonHard", LoadAsset<AudioClip>(val, "BlackjackButtonHard"));
			Sounds.Add("BlackjackButtonSoft", LoadAsset<AudioClip>(val, "BlackjackButtonSoft"));
			Prefabs.Add("Jukebox", LoadAsset<GameObject>(val, "Jukebox"));
			Prefabs.Add("ATM", LoadAsset<GameObject>(val, "ATM"));
			Prefabs["ATM"].AddComponent<AtmMachine>();
			Prefabs["ATM"].AddComponent<InteractableCasinoComponent>();
			((Component)Prefabs["ATM"].transform.Find("Buy10")).gameObject.AddComponent<InteractableCasinoComponent>();
			((Component)Prefabs["ATM"].transform.Find("Buy50")).gameObject.AddComponent<InteractableCasinoComponent>();
			((Component)Prefabs["ATM"].transform.Find("Buy100")).gameObject.AddComponent<InteractableCasinoComponent>();
			Prefabs.Add("TheWheel", LoadAsset<GameObject>(val, "TheWheel"));
			Prefabs["TheWheel"].AddComponent<TheWheel>();
			((Component)Prefabs["TheWheel"].transform.Find("WheelPivot/Wheel")).gameObject.AddComponent<InteractableCasinoComponent>();
			Prefabs.Add("ChipBag", LoadAsset<GameObject>(val, "ChipBag"));
			Prefabs.Add("PoofParticle", LoadAsset<GameObject>(val, "PoofParticle"));
			Prefabs.Add("SmokingPipe", LoadAsset<GameObject>(val, "SmokingPipe"));
			Prefabs.Add("Beer", LoadAsset<GameObject>(val, "Beer"));
			string[] array = Constants.BEER_POUR_SOUNDS.Concat(Constants.BEER_DRINK_SOUNDS).Concat(Constants.BEER_GULP_SOUNDS).Concat(Constants.GLASS_CLINK_SOUNDS)
				.ToArray();
			string[] array2 = array;
			foreach (string text7 in array2)
			{
				Sounds.Add(text7, LoadAsset<AudioClip>(val, text7));
			}
			Sounds.Add("PullLever", LoadAsset<AudioClip>(val, "PullLever"));
			Sounds.Add("ReelClick", LoadAsset<AudioClip>(val, "ReelClick"));
			Sounds.Add("SlotsPlaying1", LoadAsset<AudioClip>(val, "SlotsPlaying1"));
			Sounds.Add("SlotsPlaying2", LoadAsset<AudioClip>(val, "SlotsPlaying2"));
			Sounds.Add("SlotsPlaying3", LoadAsset<AudioClip>(val, "SlotsPlaying3"));
			Sounds.Add("SlotsDing", LoadAsset<AudioClip>(val, "SlotsDing"));
			Sounds.Add("CoinDispense", LoadAsset<AudioClip>(val, "CoinDispense"));
			Sounds.Add("SlotsBigJackpot", LoadAsset<AudioClip>(val, "SlotsBigJackpot"));
			Sounds.Add("SlotsMediumJackpot", LoadAsset<AudioClip>(val, "SlotsMediumJackpot"));
			Sounds.Add("SlotsSmallJackpot", LoadAsset<AudioClip>(val, "SlotsSmallJackpot"));
			Sounds.Add("SlotsBuzzer1", LoadAsset<AudioClip>(val, "SlotsBuzzer1"));
			Sounds.Add("SlotsBuzzer2", LoadAsset<AudioClip>(val, "SlotsBuzzer2"));
			Sounds.Add("SlotsLose", LoadAsset<AudioClip>(val, "SlotsLose"));
			Sounds.Add("ButtonPush", LoadAsset<AudioClip>(val, "ButtonPush"));
			Sounds.Add("RouletteBallRoll", LoadAsset<AudioClip>(val, "RouletteBallRoll"));
			Sounds.Add("Chips1", LoadAsset<AudioClip>(val, "Chips1"));
			Sounds.Add("Chips2", LoadAsset<AudioClip>(val, "Chips2"));
			Sounds.Add("Chips3", LoadAsset<AudioClip>(val, "Chips3"));
			Sounds.Add("Chips4", LoadAsset<AudioClip>(val, "Chips4"));
			Sounds.Add("PlaceMultipleChips", LoadAsset<AudioClip>(val, "PlaceMultipleChips"));
			Sounds.Add("ChipBagDrop1", LoadAsset<AudioClip>(val, "ChipBagDrop1"));
			Sounds.Add("ChipBagDrop2", LoadAsset<AudioClip>(val, "ChipBagDrop2"));
			Sounds.Add("ATMClick", LoadAsset<AudioClip>(val, "ATMClick"));
			Sounds.Add("PopSound", LoadAsset<AudioClip>(val, "PopSound"));
			Sounds.Add("ChaChing", LoadAsset<AudioClip>(val, "ChaCHing"));
			Sounds.Add("WheelClick1", LoadAsset<AudioClip>(val, "WheelClick1"));
			Sounds.Add("WheelClick2", LoadAsset<AudioClip>(val, "WheelClick2"));
			Sounds.Add("WheelClick3", LoadAsset<AudioClip>(val, "WheelClick3"));
			Sounds.Add("WheelClick4", LoadAsset<AudioClip>(val, "WheelClick4"));
			Sounds.Add("WheelClick5", LoadAsset<AudioClip>(val, "WheelClick5"));
			Sounds.Add("WheelClick6", LoadAsset<AudioClip>(val, "WheelClick6"));
			Sounds.Add("WheelClick7", LoadAsset<AudioClip>(val, "WheelClick7"));
			Sounds.Add("WheelClick8", LoadAsset<AudioClip>(val, "WheelClick8"));
			Sounds.Add("WheelClick9", LoadAsset<AudioClip>(val, "WheelClick9"));
			Sounds.Add("WheelClick10", LoadAsset<AudioClip>(val, "WheelClick10"));
			Sounds.Add("WheelLoseBig", LoadAsset<AudioClip>(val, "WheelLoseBig"));
			Sounds.Add("WheelLoseSmall", LoadAsset<AudioClip>(val, "WheelLoseSmall"));
			Sounds.Add("WheelTokenDrop", LoadAsset<AudioClip>(val, "WheelTokenDrop"));
			Sounds.Add("WheelWinMedium", LoadAsset<AudioClip>(val, "WheelWinMedium"));
			Sounds.Add("WheelWinLarge", LoadAsset<AudioClip>(val, "WheelWinLarge"));
			Sounds.Add("PipeLighter", LoadAsset<AudioClip>(val, "PipeLighter"));
			Sounds.Add("PipeBurn1", LoadAsset<AudioClip>(val, "PipeBurn1"));
			Sounds.Add("PipeBurn2", LoadAsset<AudioClip>(val, "PipeBurn2"));
			Sounds.Add("PipeBurn3", LoadAsset<AudioClip>(val, "PipeBurn3"));
			string[] sONG_TYPES = Constants.SONG_TYPES;
			foreach (string text8 in sONG_TYPES)
			{
				for (int num2 = 1; num2 <= numSongs; num2++)
				{
					Sounds.Add($"{text8}Song{num2}", LoadAsset<AudioClip>(val, $"{text8}Song{num2}"));
				}
				Sounds.Add(text8 + "Song99", LoadAsset<AudioClip>(val, text8 + "Song99"));
			}
		}

		private T LoadAsset<T>(AssetBundle bundle, string asset) where T : Object
		{
			T val = bundle.LoadAsset<T>(asset);
			if (!Object.op_Implicit((Object)(object)val))
			{
				logger.LogError((object)(asset + " asset failed to load"));
			}
			return val;
		}

		private void Patch()
		{
			((BaseUnityPlugin)this).Logger.LogDebug((object)"Patching...");
			harmony.PatchAll();
			((BaseUnityPlugin)this).Logger.LogDebug((object)"Finished Patching!");
		}

		private void Unpatch()
		{
			((BaseUnityPlugin)this).Logger.LogDebug((object)"Unpatching...");
			harmony.UnpatchSelf();
			((BaseUnityPlugin)this).Logger.LogDebug((object)"Finished Unpatching!");
		}

		private static void NetcodeWeaver()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public T GetHostConfigValueServerRpc<T>(string configField)
		{
			logger.LogInfo((object)"GetHostConfigValueServerRpc");
			if (typeof(T) == typeof(string))
			{
				return (T)(object)configFile.configStrings[configField];
			}
			if (typeof(T) == typeof(float))
			{
				return (T)(object)configFile.configValues[configField];
			}
			if (typeof(T) == typeof(bool))
			{
				return (T)(object)configFile.configFlags[configField];
			}
			if (typeof(T) == typeof(int))
			{
				return (T)(object)configFile.configInts[configField];
			}
			return default(T);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "mrgrm7.LethalCasino";

		public const string PLUGIN_NAME = "LethalCasino";

		public const string PLUGIN_VERSION = "1.1.2";
	}
}
namespace LethalCasino.Types
{
	internal class RouletteResult
	{
		public List<GrabbableObject> winningScrap = new List<GrabbableObject>();

		public int lostValue;

		public int wonValue;
	}
}
namespace LethalCasino.patches
{
	[HarmonyPatch(typeof(RoundManager))]
	internal class RoundManagerPatch : NetworkBehaviour
	{
		public static CasinoManager CasinoManager;

		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		public static void AwakePatch(RoundManager __instance)
		{
			Plugin.logger.LogInfo((object)"RoundManagerPatch has awoken");
			CasinoManager = ((Component)__instance).gameObject.AddComponent<CasinoManager>();
		}

		[HarmonyPatch("LoadNewLevelWait")]
		[HarmonyPrefix]
		public static void LoadNewLevelWaitPatch(RoundManager __instance)
		{
			if (__instance.currentLevel.levelID == 3)
			{
				Plugin.logger.LogInfo((object)"Spawning casino objects");
				CasinoManager.SpawnCasinoServerRpc();
			}
		}

		[HarmonyPatch("DespawnPropsAtEndOfRound")]
		[HarmonyPostfix]
		public static void DespawnPropsAtEndOfRoundPatch(RoundManager __instance)
		{
			if (__instance.currentLevel.levelID == 3)
			{
				Plugin.logger.LogInfo((object)"Despawning casino objects");
				if (((NetworkBehaviour)CasinoManager).IsServer)
				{
					CasinoManager.DespawnCasinoServerRpc();
				}
			}
		}

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

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "RoundManagerPatch";
		}
	}
}
namespace LethalCasino.Patches
{
	[HarmonyPatch(typeof(GameNetworkManager))]
	internal class GameNetworkManagerPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void StartPatch(GameNetworkManager __instance)
		{
			Plugin.logger.LogInfo((object)"Adding slot machine to network prefab");
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["CasinoBuilding"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["SlotMachine"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["Roulette"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["Blackjack"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["TheWheel"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["Jukebox"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["ATM"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["ChipBag"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["SmokingPipe"]);
			NetworkManager.Singleton.AddNetworkPrefab(Plugin.Prefabs["Beer"]);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
		public static void StartDisconnectPatch()
		{
			Plugin.logger.LogInfo((object)"Player disconnected.");
			RoundManagerPatch.CasinoManager.Destroy();
		}
	}
	[HarmonyPatch(typeof(GrabbableObject))]
	internal class GrabbableObjectPatch : NetworkBehaviour
	{
		[HarmonyPatch("Start")]
		[HarmonyPrefix]
		public static void Start(GrabbableObject __instance)
		{
			CustomScrapController customScrapController = default(CustomScrapController);
			if (!((Component)__instance).gameObject.TryGetComponent<CustomScrapController>(ref customScrapController))
			{
				((Component)__instance).gameObject.AddComponent<CustomScrapController>();
			}
		}

		[HarmonyPatch("SetScrapValue")]
		[HarmonyPostfix]
		public static void SetScrapValue(GrabbableObject __instance)
		{
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			CustomScrapController customScrapController = default(CustomScrapController);
			if (((Component)__instance).gameObject.TryGetComponent<CustomScrapController>(ref customScrapController) && __instance.scrapValue <= 0 && customScrapController.destroyOnZeroValue && !customScrapController.tempDisablePoofOnZero)
			{
				if (__instance.isHeld || __instance.isPocketed)
				{
					Plugin.logger.LogInfo((object)"Object is held or pocketed");
					RoundManagerPatch.CasinoManager.DespawnCasinoItemServerRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)__instance), needsNetworkDespawn: false);
				}
				else
				{
					Plugin.logger.LogInfo((object)"Destroying object on ground");
					CreatePoofParticle(((Component)__instance).transform, default(Vector3), 0.7f);
					RoundManagerPatch.CasinoManager.DespawnCasinoItemServerRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)__instance), needsNetworkDespawn: true);
				}
			}
		}

		public static void CreatePoofParticle(Transform transform, Vector3 offset, float volume)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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)
			GameObject val = Object.Instantiate<GameObject>(Plugin.Prefabs["PoofParticle"], transform.position + offset, transform.rotation);
			val.AddComponent<PoofParticle>();
			val.GetComponent<AudioSource>().PlayOneShot(Plugin.Sounds["PopSound"], volume);
		}

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

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "GrabbableObjectPatch";
		}
	}
	[HarmonyPatch(typeof(MenuManager))]
	internal class MenuManagerPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void StartPatch(MenuManager __instance)
		{
			CheckModConflicts(__instance);
		}

		private static void CheckModConflicts(MenuManager menuManager)
		{
			foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos)
			{
				BepInPlugin metadata = pluginInfo.Value.Metadata;
				if (metadata.GUID.Equals("LC_API"))
				{
					menuManager.DisplayMenuNotification("LC_API IS BROKEN. UNINSTALL IT.", "Ignore");
				}
			}
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerControllerBPatch
	{
		internal static Dictionary<PlayerControllerB, CustomPlayerController> customPlayers = new Dictionary<PlayerControllerB, CustomPlayerController>();

		private const float minDrunknessToAffectVoice = 0.3f;

		private const float timeToLoseDrunkness = 300f;

		[HarmonyPatch("Awake")]
		[HarmonyPrefix]
		public static void Awake(PlayerControllerB __instance)
		{
			CustomPlayerController value = ((Component)__instance).gameObject.AddComponent<CustomPlayerController>();
			customPlayers.Add(__instance, value);
		}

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void AfterUpdate(PlayerControllerB __instance)
		{
			ProcessDrunkness(__instance);
		}

		private static void ProcessDrunkness(PlayerControllerB player)
		{
			CustomPlayerController customPlayerController = customPlayers[player];
			if (customPlayerController.beerDrunkness > 0.3f)
			{
				float num = 1f - (customPlayerController.beerDrunkness - 0.3f) * 0.4f;
				Plugin.logger.LogInfo((object)$"setting player pitchTarget from {SoundManager.Instance.playerVoicePitchTargets[player.playerClientId]} to {num}");
				SoundManager.Instance.playerVoicePitchTargets[player.playerClientId] = num;
			}
			if (customPlayerController.beerDrunkness > 0f)
			{
				player.drunkness = Mathf.Pow(customPlayerController.beerDrunkness, 2f);
				customPlayerController.beerDrunkness -= Time.deltaTime / 300f;
				if (customPlayerController.beerDrunkness < 0f)
				{
					customPlayerController.beerDrunkness = 0f;
				}
			}
		}

		[HarmonyPatch("SetHoverTipAndCurrentInteractTrigger")]
		[HarmonyPostfix]
		private static void ShowScrapValueHoverTip(PlayerControllerB __instance)
		{
			InteractableCasinoComponent interactableCasinoComponent = default(InteractableCasinoComponent);
			if (!Object.op_Implicit((Object)(object)__instance.hoveringOverTrigger) || !Object.op_Implicit((Object)(object)((Component)__instance.hoveringOverTrigger).gameObject) || !((Component)__instance.hoveringOverTrigger).gameObject.TryGetComponent<InteractableCasinoComponent>(ref interactableCasinoComponent))
			{
				return;
			}
			GrabbableObject val = __instance.ItemSlots[__instance.currentItemSlot];
			if (interactableCasinoComponent.hoverTipCurrentBlackjackHand)
			{
				string text = "Hand";
				if (interactableCasinoComponent.hoverTipIsBlackjackDealer)
				{
					text = "Dealer hand";
				}
				((TMP_Text)__instance.cursorTip).text = text + ": " + interactableCasinoComponent.currentBlackjackHand;
			}
			else if (Object.op_Implicit((Object)(object)val) && interactableCasinoComponent.hoverTipCurrentScrapValue && !((TMP_Text)__instance.cursorTip).text.Contains("Holding ■") && !interactableCasinoComponent.hoverTipIsBlackjackDealer)
			{
				TextMeshProUGUI cursorTip = __instance.cursorTip;
				((TMP_Text)cursorTip).text = ((TMP_Text)cursorTip).text + "\nHolding ■" + val.scrapValue;
			}
			else if (interactableCasinoComponent.requireScrap && !Object.op_Implicit((Object)(object)val) && !interactableCasinoComponent.gameInProgress)
			{
				((TMP_Text)__instance.cursorTip).text = interactableCasinoComponent.requireScrapMessage;
			}
		}
	}
}
namespace LethalCasino.Custom
{
	internal class BarMenu : NetworkBehaviour
	{
		public Material signWithoutPricesMat;

		private void OnEnable()
		{
			if (SomeBarPricesAreChanged())
			{
				MeshRenderer component = ((Component)((Component)this).transform.Find("Sign")).GetComponent<MeshRenderer>();
				((Renderer)component).material = signWithoutPricesMat;
			}
		}

		private bool SomeBarPricesAreChanged()
		{
			return Plugin.configFile.hostConfigInts[Constants.PRICE_LIGHT_BEER] != Constants.DEFAULT_PRICE_LIGHT_BEER || Plugin.configFile.hostConfigInts[Constants.PRICE_SPECIALTY_BEER] != Constants.DEFAULT_PRICE_SPECIALTY_BEER || Plugin.configFile.hostConfigInts[Constants.PRICE_LUCKY_PIPE] != Constants.DEFAULT_PRICE_LUCKY_PIPE;
		}

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

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "BarMenu";
		}
	}
	internal class BeerMugSpawner : NetworkBehaviour
	{
		private const int maxPreppedGlasses = 4;

		private const float spawnNewMugDelay = 60f;

		private const float preppedGlassFrontOffset = 0.2f;

		private const float preppedGlassSideOffset = 0.3f;

		private Vector3 beerMugSpawnRotation = new Vector3(0f, 0f, 0f);

		private float timeSinceMissingMugs = 0f;

		private List<CasinoBeer> preppedGlasses = new List<CasinoBeer>();

		private void Start()
		{
			SpawnPreppedGlasses(showPoofs: false);
		}

		private void LateUpdate()
		{
			if (((NetworkBehaviour)this).IsServer && GetNumPreppedGlasses() < 4 && ((NetworkBehaviour)this).IsServer)
			{
				timeSinceMissingMugs += Time.deltaTime;
				if (timeSinceMissingMugs > 60f)
				{
					SpawnPreppedGlasses(showPoofs: true);
					timeSinceMissingMugs = 0f;
				}
			}
		}

		public CasinoBeer GetNextCasinoBeer()
		{
			CasinoBeer result = preppedGlasses[preppedGlasses.Count - 1];
			preppedGlasses.RemoveAt(preppedGlasses.Count - 1);
			if (GetNumPreppedGlasses() == 1)
			{
				timeSinceMissingMugs = 59f;
			}
			else if (GetNumPreppedGlasses() == 0)
			{
				SpawnPreppedGlasses(showPoofs: true);
			}
			return result;
		}

		private int GetNumPreppedGlasses()
		{
			return preppedGlasses.Count;
		}

		private void SpawnPreppedGlasses(bool showPoofs)
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			Plugin.logger.LogDebug((object)"spawnning new beer glasses");
			if (!((NetworkBehaviour)this).IsServer)
			{
				return;
			}
			Vector3 val = default(Vector3);
			while (GetNumPreppedGlasses() < 4)
			{
				int num = 4 - GetNumPreppedGlasses() - 1;
				int num2 = num % 2;
				int num3 = num / 2;
				((Vector3)(ref val))..ctor(0.3f * (float)num3 - 0.3f, 0f, 0.2f * (float)num2 - 0.2f);
				GameObject val2 = CasinoManager.Spawn("Beer", ((Component)this).transform.position + val, Quaternion.Euler(beerMugSpawnRotation));
				preppedGlasses.Add(val2.GetComponent<CasinoBeer>());
				if (showPoofs)
				{
					CreatePoofParticleClientRpc(val2.transform.position, new Vector3(0f, 0.4f, 0f), 0.1f);
				}
			}
		}

		[ClientRpc]
		public void CreatePoofParticleClientRpc(Vector3 position, Vector3 offset, float volume)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: 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_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: 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(3909558591u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe(ref position);
					((FastBufferWriter)(ref val2)).WriteValueSafe(ref offset);
					((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref volume, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3909558591u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					GameObject val3 = Object.Instantiate<GameObject>(Plugin.Prefabs["PoofParticle"], position + offset, Quaternion.Euler(0f, 0f, 0f));
					val3.AddComponent<PoofParticle>();
					val3.GetComponent<AudioSource>().PlayOneShot(Plugin.Sounds["PopSound"], volume);
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_BeerMugSpawner()
		{
			//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(3909558591u, new RpcReceiveHandler(__rpc_handler_3909558591));
		}

		private static void __rpc_handler_3909558591(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0049: 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)
			//IL_0069: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				Vector3 position = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref position);
				Vector3 offset = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref offset);
				float volume = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref volume, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((BeerMugSpawner)(object)target).CreatePoofParticleClientRpc(position, offset, volume);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "BeerMugSpawner";
		}
	}
	internal class BeerTap : NetworkBehaviour
	{
		public int beerCost = 20;

		public bool isHeavyBeer = false;

		public string beerName;

		public Material beerLiquidMaterial;

		private const float moveToTargetTime = 1.3f;

		private const float delayBeforeMoveToTarget = 0.4f;

		private bool isBeingUsed = false;

		private CasinoBeer currentPouringBeer;

		private Vector3 currentBeerTarget;

		private bool movingToBeerTarget = false;

		private bool playedPickupSound = false;

		private bool beerIsAtTarget = false;

		private bool playerHasGrabbedBeer = false;

		private bool isDonePouring = false;

		private float timeMovingToBeerTarget = 0f;

		private Transform parentTapContainer;

		private AudioSource beerAudioSource;

		private BeerMugSpawner beerMugSpawner;

		private InteractTrigger interactTrigger;

		private void Start()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			parentTapContainer = ((Component)this).transform.parent.parent;
			beerMugSpawner = ((Component)parentTapContainer.Find("BeerMugSpawner")).GetComponent<BeerMugSpawner>();
			interactTrigger = ((Component)this).GetComponent<InteractTrigger>();
			InteractEvent val = new InteractEvent();
			((UnityEvent<PlayerControllerB>)(object)val).AddListener((UnityAction<PlayerControllerB>)BuyBeer);
			interactTrigger.onInteract = val;
			SyncHostConfigs();
		}

		private void SyncHostConfigs()
		{
			if (isHeavyBeer)
			{
				beerCost = Plugin.configFile.hostConfigInts[Constants.PRICE_SPECIALTY_BEER];
			}
			else
			{
				beerCost = Plugin.configFile.hostConfigInts[Constants.PRICE_LIGHT_BEER];
			}
			interactTrigger.hoverTip = $"Buy {beerName} (■{beerCost}) : [E]";
		}

		private void LateUpdate()
		{
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			if ((!movingToBeerTarget && !beerIsAtTarget) || playerHasGrabbedBeer)
			{
				return;
			}
			timeMovingToBeerTarget += Time.deltaTime;
			if (timeMovingToBeerTarget >= 0.4f)
			{
				if (!playedPickupSound)
				{
					beerAudioSource.PlayOneShot(Plugin.Sounds[Constants.GLASS_CLINK_SOUNDS[0]], 0.9f);
					playedPickupSound = true;
				}
				float num = timeMovingToBeerTarget - 0.4f;
				float num2 = Mathf.Clamp(num / 1.3f, 0f, 1f);
				((Component)currentPouringBeer).transform.position = Vector3.Lerp(((Component)currentPouringBeer).transform.position, currentBeerTarget, num2);
				if (num2 == 1f && !beerIsAtTarget)
				{
					beerAudioSource.PlayOneShot(Plugin.Sounds[Constants.GLASS_CLINK_SOUNDS[1]], 1f);
					TriggerTapFillAnimation();
					movingToBeerTarget = false;
					beerIsAtTarget = true;
				}
			}
		}

		[ClientRpc]
		public void ShowWarningMessageClientRpc(NetworkBehaviourReference playerRef, string header, string body, bool isWarning)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: 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(2696953337u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkBehaviourReference>(ref playerRef, default(ForNetworkSerializable));
				bool flag = header != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(header, false);
				}
				bool flag2 = body != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag2, default(ForPrimitives));
				if (flag2)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(body, false);
				}
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isWarning, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2696953337u, val, (RpcDelivery)0);
			}
			PlayerControllerB val3 = default(PlayerControllerB);
			if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && ((NetworkBehaviourReference)(ref playerRef)).TryGet<PlayerControllerB>(ref val3, (NetworkManager)null) && !((Object)(object)val3 != (Object)(object)GameNetworkManager.Instance.localPlayerController))
			{
				HUDManager.Instance.DisplayTip(header, body, isWarning, false, "LC_Tip1");
			}
		}

		private void BuyBeer(PlayerControllerB playerController)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			if (isBeingUsed)
			{
				if (isDonePouring)
				{
					ShowWarningMessageClientRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)playerController), "Cannot use tap", "Pick up the previous beer first", isWarning: false);
				}
				else
				{
					ShowWarningMessageClientRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)playerController), "Cannot use tap", "Another beer is already being poured", isWarning: false);
				}
				return;
			}
			GrabbableObject val = playerController.ItemSlots[playerController.currentItemSlot];
			if (!((Object)(object)val == (Object)null))
			{
				if (val.scrapValue < beerCost)
				{
					ShowWarningMessageClientRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)playerController), "Cannot afford", $"A pint of {beerName} costs ■{beerCost}. Your scrap is only worth ■{val.scrapValue}.", isWarning: true);
					return;
				}
				Plugin.logger.LogInfo((object)"triggered BuyBeer from this client");
				BuyBeerServerRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)playerController));
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void BuyBeerServerRpc(NetworkBehaviourReference playerControllerRef)
		{
			//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_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: 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 != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(960726601u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkBehaviourReference>(ref playerControllerRef, default(ForNetworkSerializable));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 960726601u, val, (RpcDelivery)0);
			}
			PlayerControllerB val3 = default(PlayerControllerB);
			if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost) || isBeingUsed || !((NetworkBehaviourReference)(ref playerControllerRef)).TryGet<PlayerControllerB>(ref val3, (NetworkManager)null))
			{
				return;
			}
			GrabbableObject val4 = val3.ItemSlots[val3.currentItemSlot];
			if (!((Object)(object)val4 == (Object)null))
			{
				if (((Component)val4).GetComponent<CustomScrapController>().lockFromGambling)
				{
					ShowWarningMessageClientRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)val3), "Cannot buy beer", "Scrap is being gambled", isWarning: true);
				}
				else if (val4.scrapValue >= beerCost)
				{
					isBeingUsed = true;
					CasinoBeer nextCasinoBeer = beerMugSpawner.GetNextCasinoBeer();
					BuyBeerClientRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)nextCasinoBeer), NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)val4));
				}
			}
		}

		[ClientRpc]
		private void BuyBeerClientRpc(NetworkBehaviourReference beerRef, NetworkBehaviourReference scrapRef)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: 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_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: 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(1862352400u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkBehaviourReference>(ref beerRef, default(ForNetworkSerializable));
					((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkBehaviourReference>(ref scrapRef, default(ForNetworkSerializable));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1862352400u, val, (RpcDelivery)0);
				}
				CasinoBeer casinoBeer = default(CasinoBeer);
				GrabbableObject val3 = default(GrabbableObject);
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && ((NetworkBehaviourReference)(ref beerRef)).TryGet<CasinoBeer>(ref casinoBeer, (NetworkManager)null) && ((NetworkBehaviourReference)(ref scrapRef)).TryGet<GrabbableObject>(ref val3, (NetworkManager)null))
				{
					isBeingUsed = true;
					currentPouringBeer = casinoBeer;
					movingToBeerTarget = true;
					beerIsAtTarget = false;
					playerHasGrabbedBeer = false;
					timeMovingToBeerTarget = 0f;
					playedPickupSound = false;
					isDonePouring = false;
					val3.SetScrapValue(val3.scrapValue - beerCost);
					CasinoBeer component = ((Component)casinoBeer).GetComponent<CasinoBeer>();
					beerAudioSource = ((Component)((Component)currentPouringBeer).transform.Find("BeerMug")).GetComponent<AudioSource>();
					component.SetBeerType(beerLiquidMaterial, isHeavyBeer);
					component.TriggerBeerFill(OnDoneFillingBeer, OnGrabBeerServerRpc);
					currentBeerTarget = ((Component)((Component)this).transform.Find("MugTarget")).transform.position;
				}
			}
		}

		private void setStreamEmission(bool setActive)
		{
			//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)
			ParticleSystem component = ((Component)((Component)this).transform.Find("Particles")).GetComponent<ParticleSystem>();
			EmissionModule emission = component.emission;
			((EmissionModule)(ref emission)).enabled = setActive;
		}

		private void TriggerTapFillAnimation()
		{
			currentPouringBeer.StartFill();
			setStreamEmission(setActive: true);
			Random random = new Random();
			string key = Constants.BEER_POUR_SOUNDS[random.Next(1, Constants.BEER_POUR_SOUNDS.Length)];
			beerAudioSource.PlayOneShot(Plugin.Sounds[key], 0.5f);
		}

		private void OnDoneFillingBeer()
		{
			isDonePouring = true;
			setStreamEmission(setActive: false);
		}

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

		[ClientRpc]
		private void OnGrabBeerClientRpc()
		{
			//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)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3946222049u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3946222049u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					beerIsAtTarget = false;
					isBeingUsed = false;
					playerHasGrabbedBeer = true;
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_BeerTap()
		{
			//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
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(2696953337u, new RpcReceiveHandler(__rpc_handler_2696953337));
			NetworkManager.__rpc_func_table.Add(960726601u, new RpcReceiveHandler(__rpc_handler_960726601));
			NetworkManager.__rpc_func_table.Add(1862352400u, new RpcReceiveHandler(__rpc_handler_1862352400));
			NetworkManager.__rpc_func_table.Add(274521252u, new RpcReceiveHandler(__rpc_handler_274521252));
			NetworkManager.__rpc_func_table.Add(3946222049u, new RpcReceiveHandler(__rpc_handler_3946222049));
		}

		private static void __rpc_handler_2696953337(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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				NetworkBehaviourReference playerRef = default(NetworkBehaviourReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkBehaviourReference>(ref playerRef, default(ForNetworkSerializable));
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string header = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref header, false);
				}
				bool flag2 = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag2, default(ForPrimitives));
				string body = null;
				if (flag2)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref body, false);
				}
				bool isWarning = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref isWarning, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((BeerTap)(object)target).ShowWarningMessageClientRpc(playerRef, header, body, isWarning);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_960726601(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)
			{
				NetworkBehaviourReference playerControllerRef = default(NetworkBehaviourReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkBehaviourReference>(ref playerControllerRef, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((BeerTap)(object)target).BuyBeerServerRpc(playerControllerRef);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1862352400(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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				NetworkBehaviourReference beerRef = default(NetworkBehaviourReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkBehaviourReference>(ref beerRef, default(ForNetworkSerializable));
				NetworkBehaviourReference scrapRef = default(NetworkBehaviourReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkBehaviourReference>(ref scrapRef, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((BeerTap)(object)target).BuyBeerClientRpc(beerRef, scrapRef);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_274521252(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;
				((BeerTap)(object)target).OnGrabBeerServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3946222049(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;
				((BeerTap)(object)target).OnGrabBeerClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "BeerTap";
		}
	}
	internal class CasinoBeer : PhysicsProp
	{
		private const float drinkSoundInterval = 0.2f;

		private const float gulpSoundInterval = 5f;

		private const float gulpChance = 0.2f;

		private Vector3 groundPosition;

		private Quaternion groundRotation;

		private Vector3 restingPositionOffset = new Vector3(-0.05f, 0.12f, 0.2f);

		private Vector3 restingRotationOffset = new Vector3(330f, 90f, 340f);

		private Quaternion restingRotation;

		private Vector3 activePositionOffset = new Vector3(0.06f, 0.18f, -0.18f);

		private Vector3 activeRotationOffset = new Vector3(310f, 220f, 340f);

		private Quaternion activeRotation;

		private Vector3 positionVelocity;

		private const float rotationSpeed = 20f;

		private const float smoothTime = 0.03f;

		private const float maxDrinkTime = 12f;

		private float originalLiquidHeight = 0f;

		private List<int> liquidVerticesTopIndexes;

		private float[] originalVerticesOffsetH;

		private float originalBeerLiquidTopVerticeHeight;

		private float originalBeerLiquidBottomVerticeHeight;

		private const float liquidRotationWhenActive = -45f;

		private const float liquidRotationWhenActiveForOtherPlayers = -20f;

		private const float fizzRate = 10f;

		private const float verticeMultiplier = 1f;

		private const float fillDelay = 1f;

		private const float fillTime = 5f;

		private bool startMethodComplete = false;

		private bool isActive;

		private bool isFlipping;

		private bool isFilling;

		private Action? doneFillCallback;

		private Action? grabItemCallback;

		private float fillDelayTimer;

		private float percentFilled = 0f;

		private float timeUntilDrinkSound = 0f;

		private float timeUntilGulpSound = 0f;

		private float percentUsed = 0f;

		private bool isEquiped;

		private PlayerControllerB lastPlayerHeldBy;

		private bool isFlatteningVerticesHorizontal;

		private bool hasSetBeerType = false;

		private Material beerLiquidMaterial;

		private bool isHeavyBeer = false;

		private float beerSipVolume;

		private Random randGen;

		private AudioSource audioSource;

		private GameObject beerMug;

		private GameObject beerLiquidContainer;

		private MeshFilter beerLiquidMeshFilter;

		private Mesh beerLiquidMesh;

		private ParticleSystem particleSystem;

		private Animator mugAnimator;

		public override void Start()
		{
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).Start();
			randGen = new Random();
			audioSource = ((Component)this).GetComponent<AudioSource>();
			beerMug = ((Component)((Component)this).transform.Find("BeerMug")).gameObject;
			beerLiquidContainer = ((Component)((Component)this).transform.Find("BeerMug/LiquidContainer")).gameObject;
			beerLiquidMeshFilter = ((Component)beerLiquidContainer.transform.Find("BeerLiquid")).GetComponent<MeshFilter>();
			beerLiquidMesh = beerLiquidMeshFilter.mesh;
			originalLiquidHeight = beerLiquidContainer.transform.localScale.y;
			particleSystem = ((Component)((Component)this).transform.Find("BeerMug/LiquidContainer/BeerParticles")).GetComponent<ParticleSystem>();
			mugAnimator = beerMug.GetComponent<Animator>();
			groundPosition = beerMug.transform.localPosition;
			groundRotation = beerMug.transform.localRotation;
			restingRotation = Quaternion.Euler(restingRotationOffset);
			activeRotation = Quaternion.Euler(activeRotationOffset);
			liquidVerticesTopIndexes = new List<int>();
			if ((Object)(object)beerLiquidMesh != (Object)null)
			{
				Vector3[] vertices = beerLiquidMesh.vertices;
				originalVerticesOffsetH = new float[vertices.Length];
				for (int i = 0; i < vertices.Length; i++)
				{
					originalVerticesOffsetH[i] = vertices[i].y;
					float z = vertices[i].z;
					Bounds bounds = beerLiquidMesh.bounds;
					if (Mathf.Approximately(z, ((Bounds)(ref bounds)).max.z))
					{
						originalBeerLiquidTopVerticeHeight = vertices[i].z;
						liquidVerticesTopIndexes.Add(i);
						continue;
					}
					float z2 = vertices[i].z;
					bounds = beerLiquidMesh.bounds;
					if (Mathf.Approximately(z2, ((Bounds)(ref bounds)).min.z))
					{
						originalBeerLiquidBottomVerticeHeight = vertices[i].z;
					}
				}
			}
			beerLiquidContainer.active = false;
			((GrabbableObject)this).grabbable = false;
			((GrabbableObject)this).customGrabTooltip = "(Disabled) Use tap handles";
			beerSipVolume = Plugin.configFile.configValues[Constants.MISC_BEER_SIPPING_VOLUME] / 100f;
			startMethodComplete = true;
		}

		public override void Update()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02de: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0315: Unknown result type (might be due to invalid IL or missing references)
			//IL_031b: Unknown result type (might be due to invalid IL or missing references)
			//IL_032b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0357: Unknown result type (might be due to invalid IL or missing references)
			//IL_035c: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_042f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0434: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: 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_0231: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0549: Unknown result type (might be due to invalid IL or missing references)
			//IL_054e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0552: Unknown result type (might be due to invalid IL or missing references)
			//IL_065f: Unknown result type (might be due to invalid IL or missing references)
			//IL_05f0: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).Update();
			if (((GrabbableObject)this).isPocketed)
			{
				return;
			}
			if (startMethodComplete && !hasSetBeerType)
			{
				UpdateBeerType();
				hasSetBeerType = true;
			}
			if (isActive)
			{
				activeRotation = Quaternion.Euler(activeRotationOffset);
				beerMug.transform.localPosition = Vector3.SmoothDamp(beerMug.transform.localPosition, activePositionOffset, ref positionVelocity, 0.03f);
				beerMug.transform.localRotation = Quaternion.Lerp(beerMug.transform.localRotation, activeRotation, 20f * Time.deltaTime);
				timeUntilDrinkSound -= Time.deltaTime;
				timeUntilGulpSound -= Time.deltaTime;
				if (timeUntilDrinkSound <= 0f && !audioSource.isPlaying)
				{
					if (timeUntilGulpSound <= 0f && randGen.NextDouble() <= 0.20000000298023224)
					{
						int num = randGen.Next(0, Constants.BEER_GULP_SOUNDS.Length);
						audioSource.PlayOneShot(Plugin.Sounds[Constants.BEER_GULP_SOUNDS[num]], beerSipVolume);
					}
					else
					{
						int num2 = randGen.Next(0, Constants.BEER_DRINK_SOUNDS.Length);
						audioSource.PlayOneShot(Plugin.Sounds[Constants.BEER_DRINK_SOUNDS[num2]], beerSipVolume);
					}
					timeUntilDrinkSound = 0.2f;
					timeUntilGulpSound = 5f;
				}
				percentUsed += Time.deltaTime / 12f;
				Vector3 localScale = beerLiquidContainer.transform.localScale;
				localScale.y = originalLiquidHeight * (1f - percentUsed);
				beerLiquidContainer.transform.localScale = localScale;
				EmissionModule emission = particleSystem.emission;
				((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(10f * (1f - percentUsed));
				if (isHeavyBeer)
				{
					IncreaseDrunknessHeavy();
				}
				else
				{
					IncreaseDrunkessLight();
				}
				if (((NetworkBehaviour)this).IsServer && percentUsed >= 1f)
				{
					FinishDrinkingClientRpc();
				}
			}
			else if (isEquiped)
			{
				restingRotation = Quaternion.Euler(restingRotationOffset);
				beerMug.transform.localPosition = Vector3.SmoothDamp(beerMug.transform.localPosition, restingPositionOffset, ref positionVelocity, 0.03f);
				beerMug.transform.localRotation = Quaternion.Lerp(beerMug.transform.localRotation, restingRotation, 20f * Time.deltaTime);
			}
			else if (isFilling)
			{
				Vector3 localScale2 = beerLiquidContainer.transform.localScale;
				localScale2.y = originalLiquidHeight * percentFilled;
				beerLiquidContainer.transform.localScale = localScale2;
				if (fillDelayTimer >= 1f)
				{
					if (!beerLiquidContainer.active)
					{
						beerLiquidContainer.active = true;
					}
					percentFilled += Time.deltaTime / 5f;
					if (percentFilled >= 1f)
					{
						DoneFilling();
					}
				}
				else
				{
					fillDelayTimer += Time.deltaTime;
				}
			}
			if (!((Object)(object)beerLiquidMesh != (Object)null))
			{
				return;
			}
			Vector3 forward = beerLiquidContainer.transform.forward;
			Vector3[] vertices = beerLiquidMesh.vertices;
			foreach (int liquidVerticesTopIndex in liquidVerticesTopIndexes)
			{
				float num3 = (float)Math.Pow((double)percentUsed * 1.2, 2.0) * 2.5f;
				if (isActive)
				{
					num3 *= 10f;
				}
				float num4 = Vector3.Dot(Vector3.down, forward) * (float)Math.Sin(vertices[liquidVerticesTopIndex].y * (1f + num3));
				float num5 = originalBeerLiquidTopVerticeHeight - num4;
				if (num5 < originalBeerLiquidBottomVerticeHeight)
				{
					num5 = originalBeerLiquidBottomVerticeHeight;
				}
				vertices[liquidVerticesTopIndex].z = num5;
			}
			if (isActive)
			{
				for (int i = 0; i < vertices.Length; i++)
				{
					float num6 = 0f - (1f - percentUsed);
					Bounds bounds = beerLiquidMesh.bounds;
					float num7 = num6 * ((Bounds)(ref bounds)).max.y;
					if (vertices[i].y < num7)
					{
						vertices[i].y = num7;
					}
				}
				if (!isFlatteningVerticesHorizontal)
				{
					float num8 = -45f;
					if ((Object)(object)lastPlayerHeldBy != (Object)(object)GameNetworkManager.Instance.localPlayerController)
					{
						num8 = -20f;
					}
					beerLiquidContainer.transform.localRotation = Quaternion.Euler(0f, num8, 0f);
				}
				isFlatteningVerticesHorizontal = true;
			}
			else if (isFlatteningVerticesHorizontal)
			{
				for (int j = 0; j < vertices.Length; j++)
				{
					vertices[j].y = originalVerticesOffsetH[j];
				}
				beerLiquidContainer.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
				isFlatteningVerticesHorizontal = false;
			}
			beerLiquidMesh.vertices = vertices;
			beerLiquidMesh.RecalculateNormals();
			beerLiquidMeshFilter.mesh = beerLiquidMesh;
		}

		private void IncreaseDrunknessHeavy()
		{
			lastPlayerHeldBy.drunknessInertia = Mathf.Clamp(lastPlayerHeldBy.drunknessInertia + Time.deltaTime / 40f * lastPlayerHeldBy.drunknessSpeed, 0.1f, 3f);
			lastPlayerHeldBy.increasingDrunknessThisFrame = true;
			CustomPlayerController component = ((Component)lastPlayerHeldBy).GetComponent<CustomPlayerController>();
			component.beerDrunkness = Mathf.Clamp(component.beerDrunkness + Time.deltaTime / 50f, 0f, 1f);
		}

		private void IncreaseDrunkessLight()
		{
			lastPlayerHeldBy.drunknessInertia = Mathf.Clamp(lastPlayerHeldBy.drunknessInertia + Time.deltaTime / 80f * lastPlayerHeldBy.drunknessSpeed, 0.1f, 1f);
			lastPlayerHeldBy.increasingDrunknessThisFrame = true;
			CustomPlayerController component = ((Component)lastPlayerHeldBy).GetComponent<CustomPlayerController>();
			component.beerDrunkness = Mathf.Clamp(component.beerDrunkness + Time.deltaTime / 120f, 0f, 1f);
		}

		public float GetPercentUsed()
		{
			return percentUsed;
		}

		public void SetBeerType(Material mat, bool isHeavy)
		{
			hasSetBeerType = false;
			beerLiquidMaterial = mat;
			isHeavyBeer = isHeavy;
		}

		private void UpdateBeerType()
		{
			MeshRenderer component = ((Component)beerLiquidContainer.transform.Find("BeerLiquid")).GetComponent<MeshRenderer>();
			((Renderer)component).material = beerLiquidMaterial;
		}

		public void TriggerBeerFill(Action onDoneFillCallback, Action onGrabItemCallback)
		{
			doneFillCallback = onDoneFillCallback;
			grabItemCallback = onGrabItemCallback;
			FlipBeer();
		}

		public void FlipBeer()
		{
			isFlipping = true;
			((GrabbableObject)this).customGrabTooltip = "Pouring...";
			beerMug.GetComponent<Animator>().SetTrigger("beerFlip");
		}

		public void StartFill()
		{
			isFlipping = false;
			isFilling = true;
			percentFilled = 0f;
			Object.Destroy((Object)(object)mugAnimator);
		}

		private void DoneFilling()
		{
			percentFilled = 1f;
			isFilling = false;
			((GrabbableObject)this).grabbable = true;
			doneFillCallback();
			doneFillCallback = null;
			((GrabbableObject)this).customGrabTooltip = null;
		}

		public override void PocketItem()
		{
			((GrabbableObject)this).PocketItem();
			if (isActive)
			{
				SetActiveStatus(active: false);
			}
			isEquiped = false;
			particleSystem.Stop();
			particleSystem.Clear();
		}

		public override void EquipItem()
		{
			((PhysicsProp)this).EquipItem();
			isEquiped = true;
			particleSystem.Play();
		}

		public override void GrabItem()
		{
			((GrabbableObject)this).GrabItem();
			if (grabItemCallback != null)
			{
				grabItemCallback();
				grabItemCallback = null;
			}
			GrabItemServerRpc();
		}

		[ServerRpc(RequireOwnership = false)]
		private void GrabItemServerRpc()
		{
			//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(1003776000u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1003776000u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					GrabItemClientRpc();
				}
			}
		}

		[ClientRpc]
		private void GrabItemClientRpc()
		{
			//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(1323330482u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1323330482u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					grabItemCallback = null;
					lastPlayerHeldBy = ((GrabbableObject)this).playerHeldBy;
				}
			}
		}

		public override void OnHitGround()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).OnHitGround();
			if (isActive)
			{
				SetActiveStatus(active: false);
			}
			isEquiped = false;
			particleSystem.Play();
			beerMug.transform.SetLocalPositionAndRotation(groundPosition, groundRotation);
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			SetActiveStatusServerRpc(buttonDown, NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)this));
		}

		[ServerRpc(RequireOwnership = false)]
		private void SetActiveStatusServerRpc(bool active, NetworkBehaviourReference pipeRef)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: 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_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: 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(1614102246u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref active, default(ForPrimitives));
					((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkBehaviourReference>(ref pipeRef, default(ForNetworkSerializable));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1614102246u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && ((NetworkBehaviour)this).IsServer)
				{
					SetActiveStatusClientRpc(active, pipeRef);
					SetPlayerVoiceMuffledClientRpc(active);
				}
			}
		}

		[ClientRpc]
		private void SetActiveStatusClientRpc(bool active, NetworkBehaviourReference pipeRef)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: 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_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			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(3865379800u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref active, default(ForPrimitives));
				((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkBehaviourReference>(ref pipeRef, default(ForNetworkSerializable));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3865379800u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				if (percentUsed >= 1f && active)
				{
					Plugin.logger.LogDebug((object)"player cannot drink beer, already used up");
				}
				else
				{
					SetActiveStatus(active);
				}
			}
		}

		private void SetActiveStatus(bool active)
		{
			isActive = active;
			lastPlayerHeldBy.playerBodyAnimator.SetBool("useTZPItem", isActive);
			if (isActive)
			{
				timeUntilDrinkSound = 0.2f;
			}
		}

		[ClientRpc]
		private void SetPlayerVoiceMuffledClientRpc(bool enableMuffle)
		{
			//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)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3341308629u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref enableMuffle, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3341308629u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return;
			}
			if (enableMuffle)
			{
				lastPlayerHeldBy.voiceMuffledByEnemy = true;
				if ((Object)(object)lastPlayerHeldBy.currentVoiceChatIngameSettings != (Object)null)
				{
					OccludeAudio component = ((Component)lastPlayerHeldBy.currentVoiceChatIngameSettings.voiceAudio).GetComponent<OccludeAudio>();
					component.overridingLowPass = true;
					component.lowPassOverride = 600f;
				}
			}
			else
			{
				lastPlayerHeldBy.voiceMuffledByEnemy = false;
				if ((Object)(object)lastPlayerHeldBy.currentVoiceChatIngameSettings != (Object)null)
				{
					OccludeAudio component2 = ((Component)lastPlayerHeldBy.currentVoiceChatIngameSettings.voiceAudio).GetComponent<OccludeAudio>();
					component2.overridingLowPass = false;
				}
			}
		}

		[ClientRpc]
		private void FinishDrinkingClientRpc()
		{
			//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(4282623143u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4282623143u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					SetActiveStatus(active: false);
					beerLiquidContainer.active = false;
				}
			}
		}

		private void OnCollisionEnter(Collision collision)
		{
			CasinoBeer casinoBeer = default(CasinoBeer);
			if (((Component)collision.transform).TryGetComponent<CasinoBeer>(ref casinoBeer) && isEquiped)
			{
				audioSource.PlayOneShot(Plugin.Sounds[Constants.GLASS_CLINK_SOUNDS[2]]);
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_CasinoBeer()
		{
			//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
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(1003776000u, new RpcReceiveHandler(__rpc_handler_1003776000));
			NetworkManager.__rpc_func_table.Add(1323330482u, new RpcReceiveHandler(__rpc_handler_1323330482));
			NetworkManager.__rpc_func_table.Add(1614102246u, new RpcReceiveHandler(__rpc_handler_1614102246));
			NetworkManager.__rpc_func_table.Add(3865379800u, new RpcReceiveHandler(__rpc_handler_3865379800));
			NetworkManager.__rpc_func_table.Add(3341308629u, new RpcReceiveHandler(__rpc_handler_3341308629));
			NetworkManager.__rpc_func_table.Add(4282623143u, new RpcReceiveHandler(__rpc_handler_4282623143));
		}

		private static void __rpc_handler_1003776000(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;
				((CasinoBeer)(object)target).GrabItemServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1323330482(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;
				((CasinoBeer)(object)target).GrabItemClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1614102246(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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool active = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref active, default(ForPrimitives));
				NetworkBehaviourReference pipeRef = default(NetworkBehaviourReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkBehaviourReference>(ref pipeRef, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((CasinoBeer)(object)target).SetActiveStatusServerRpc(active, pipeRef);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3865379800(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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool active = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref active, default(ForPrimitives));
				NetworkBehaviourReference pipeRef = default(NetworkBehaviourReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkBehaviourReference>(ref pipeRef, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((CasinoBeer)(object)target).SetActiveStatusClientRpc(active, pipeRef);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3341308629(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_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool playerVoiceMuffledClientRpc = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref playerVoiceMuffledClientRpc, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((CasinoBeer)(object)target).SetPlayerVoiceMuffledClientRpc(playerVoiceMuffledClientRpc);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_4282623143(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;
				((CasinoBeer)(object)target).FinishDrinkingClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "CasinoBeer";
		}
	}
	internal class CigarBox : NetworkBehaviour
	{
		private int pipeCost = 75;

		private const float lidOpenRotation = -80f;

		private const float lidRotationSmoothTime = 0.2f;

		private Vector3 pipeSpawnOffset = new Vector3(-0.7f, -0.05f, 0f);

		private Vector3 pipeSpawnArea = new Vector3(0.3f, 0f, 0.2f);

		private Vector3 pipeSpawnRotation = new Vector3(0f, 20f, 0f);

		private Quaternion lidClosedRotation;

		private Quaternion lidOpenRotationQuaternion;

		private InteractTrigger buyPipeInteractTrigger;

		private GameObject boxLid;

		private Camera localPlayerCamera;

		private int layerMask = 512;

		private void Awake()
		{
			//IL_004c: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Expected O, but got Unknown
			boxLid = ((Component)((Component)this).transform.Find("Top")).gameObject;
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if ((Object)(object)localPlayerController != (Object)null)
			{
				localPlayerCamera = localPlayerController.gameplayCamera;
			}
			lidClosedRotation = boxLid.transform.localRotation;
			lidOpenRotationQuaternion = Quaternion.Euler(-80f, 0f, 0f);
			buyPipeInteractTrigger = ((Component)this).GetComponent<InteractTrigger>();
			InteractEvent val = new InteractEvent();
			((UnityEvent<PlayerControllerB>)(object)val).AddListener((UnityAction<PlayerControllerB>)BuyPipe);
			buyPipeInteractTrigger.onInteract = val;
		}

		private void Start()
		{
			SyncHostConfigs();
		}

		private void SyncHostConfigs()
		{
			pipeCost = Plugin.configFile.hostConfigInts[Constants.PRICE_LUCKY_PIPE];
			buyPipeInteractTrigger.hoverTip = $"Buy Lucky Pipe (■{pipeCost}) : [E]";
		}

		private void Update()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: 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_0081: 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)
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(((Component)localPlayerCamera).transform.position, ((Component)localPlayerCamera).transform.forward, ref val, 3f, layerMask) && (Object)(object)((RaycastHit)(ref val)).collider != (Object)null && (Object)(object)((Component)((RaycastHit)(ref val)).collider).gameObject == (Object)(object)((Component)this).gameObject)
			{
				boxLid.transform.localRotation = Quaternion.Slerp(boxLid.transform.localRotation, lidOpenRota