Decompiled source of Progression Rebalance v0.2.0

ProgressionRebalance.dll

Decompiled 11 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using DbsContentApi;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
using UnityEngine.SceneManagement;
using Zorro.Core;
using Zorro.Core.Serizalization;
using pworld.Scripts.Extensions;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ProgressionRebalance")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.0.0")]
[assembly: AssemblyInformationalVersion("0.1.0+44a1e7060eb750aa5464efff7424010fea241365")]
[assembly: AssemblyProduct("Progression Rebalance")]
[assembly: AssemblyTitle("ProgressionRebalance")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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]
	[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]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ProgressionRebalance
{
	public class ItemSellDropBox : MonoBehaviourPunCallbacks
	{
		public const int PhotonViewId = 997;

		private const float RefundFraction = 0.3f;

		private const float DelayBeforeEvaluate = 0.3f;

		private const float MaxWaitAfterClosed = 1.5f;

		private const float ProcessingDuration = 3f;

		public ItemSellDropBoxItemDetector Detector;

		public ItemSellDropBoxLid Lid;

		public GameObject Particles;

		private PhotonView m_photonView;

		private ParticleSystem[] m_particleSystems = Array.Empty<ParticleSystem>();

		private bool m_checkingContents;

		private bool m_ejecting;

		private bool m_processing;

		private float m_elapsedSinceFullyClosed;

		private float m_processingElapsed;

		private int? m_pendingRefund;

		private float m_ignoreNewInteractionsUntilRealtime;

		private void Awake()
		{
			m_photonView = ((Component)this).GetComponent<PhotonView>();
			if ((Object)(object)m_photonView == (Object)null)
			{
				Logger.LogError("ItemSellDropBox: PhotonView not found on Awake.");
			}
			Transform val = ((Component)this).transform.Find("Particles/Left");
			Transform val2 = ((Component)this).transform.Find("Particles/Right");
			ParticleSystem val3 = (((Object)(object)val != (Object)null) ? ((Component)val).GetComponent<ParticleSystem>() : null);
			ParticleSystem val4 = (((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponent<ParticleSystem>() : null);
			if ((Object)(object)val3 == (Object)null)
			{
				Logger.LogError("ItemSellDropBox: ParticleSystem not found on Particles/Left");
			}
			if ((Object)(object)val4 == (Object)null)
			{
				Logger.LogError("ItemSellDropBox: ParticleSystem not found on Particles/Right");
			}
			m_particleSystems = (ParticleSystem[])((!((Object)(object)val3 != (Object)null) || !((Object)(object)val4 != (Object)null)) ? ((!((Object)(object)val3 != (Object)null)) ? ((!((Object)(object)val4 != (Object)null)) ? ((Array)Array.Empty<ParticleSystem>()) : ((Array)new ParticleSystem[1] { val4 })) : new ParticleSystem[1] { val3 }) : new ParticleSystem[2] { val3, val4 });
		}

		private void FixedUpdate()
		{
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: 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)
			if (!PhotonNetwork.IsMasterClient || !m_ejecting)
			{
				return;
			}
			if (!Lid.m_opened)
			{
				Lid.Open();
			}
			List<(Item, Pickup)> list = Detector.CheckForItems();
			if (list.Count == 0)
			{
				m_ejecting = false;
			}
			else
			{
				if (!Lid.IsHalfwayOpenForEject())
				{
					return;
				}
				Transform transform = ((Component)this).transform;
				foreach (var item2 in list)
				{
					Pickup item = item2.Item2;
					if (!((Object)(object)item == (Object)null) && !((Object)(object)item.Rigidbody == (Object)null))
					{
						Rigidbody rigidbody = item.Rigidbody;
						if (!(rigidbody.linearVelocity.y > 0.1f))
						{
							rigidbody.AddTorque(Vector3.right * 3f, (ForceMode)1);
							rigidbody.AddForce(Vector3.up * 25f + -transform.forward * 6f, (ForceMode)1);
						}
					}
				}
			}
		}

		private void Update()
		{
			if (PhotonNetwork.IsMasterClient)
			{
				UpdateLogic();
			}
		}

		private static bool TryGetSellRefund(Item item, out int refund)
		{
			refund = 0;
			if ((Object)(object)item == (Object)null || item.price <= 0)
			{
				return false;
			}
			refund = Mathf.RoundToInt((float)item.price * 0.3f);
			return refund > 0;
		}

		private void UpdateLogic()
		{
			if (m_processing)
			{
				m_processingElapsed += Time.deltaTime;
				if (m_processingElapsed >= 3f)
				{
					EndProcessing();
				}
				return;
			}
			List<(Item, Pickup)> list = Detector.CheckForItems();
			bool flag = list.Count > 0;
			float realtimeSinceStartup = Time.realtimeSinceStartup;
			if (realtimeSinceStartup < m_ignoreNewInteractionsUntilRealtime)
			{
				if (!flag)
				{
					m_ignoreNewInteractionsUntilRealtime = 0f;
				}
				return;
			}
			if (!m_checkingContents && !m_ejecting)
			{
				if (!flag && !Lid.m_opened)
				{
					Lid.Open();
				}
				else if (flag && Lid.m_opened)
				{
					Lid.Close();
				}
			}
			if (!m_checkingContents && !m_ejecting && flag && !Lid.m_opened && Lid.IsFullyClosed())
			{
				m_checkingContents = true;
				m_elapsedSinceFullyClosed = 0f;
			}
			if (!m_checkingContents)
			{
				return;
			}
			list = Detector.CheckForItems();
			if (list.Count == 0)
			{
				m_checkingContents = false;
				m_elapsedSinceFullyClosed = 0f;
				if (!Lid.m_opened)
				{
					Lid.Open();
				}
				return;
			}
			m_elapsedSinceFullyClosed += Time.deltaTime;
			if (m_elapsedSinceFullyClosed < 0.3f)
			{
				return;
			}
			if (m_elapsedSinceFullyClosed <= 1.5f)
			{
				if (!TryConsumeSingleSellableItem(list))
				{
					BeginEject();
				}
			}
			else
			{
				BeginEject();
			}
		}

		private bool TryConsumeSingleSellableItem(List<(Item item, Pickup pickup)> items)
		{
			if (items.Count != 1 || (Object)(object)items[0].pickup == (Object)null)
			{
				return false;
			}
			Item item = items[0].item;
			Pickup item2 = items[0].pickup;
			if (!TryGetSellRefund(item, out var refund))
			{
				return false;
			}
			item2.m_photonView.RPC("RPC_Remove", (RpcTarget)2, Array.Empty<object>());
			m_checkingContents = false;
			m_elapsedSinceFullyClosed = 0f;
			BeginProcessing(refund);
			return true;
		}

		private void BeginProcessing(int refund)
		{
			if (PhotonNetwork.InRoom && (Object)(object)m_photonView != (Object)null)
			{
				m_photonView.RPC("RPC_BeginProcessing", (RpcTarget)0, new object[2] { refund, true });
			}
			else
			{
				StartProcessingState(refund, 0f);
				PlayProcessingVisuals(playSfx: true);
			}
		}

		private void StartProcessingState(int refund, float elapsed)
		{
			m_processing = true;
			m_processingElapsed = elapsed;
			m_pendingRefund = refund;
		}

		private void PlayProcessingVisuals(bool playSfx)
		{
			if ((Object)(object)Particles != (Object)null)
			{
				if (!Particles.activeSelf)
				{
					Particles.SetActive(true);
				}
				ParticleSystem[] particleSystems = m_particleSystems;
				foreach (ParticleSystem val in particleSystems)
				{
					val.Clear();
					val.Play();
				}
			}
			else
			{
				Logger.LogError("ItemSellDropBox: Particles reference is null");
			}
			if (!playSfx)
			{
				return;
			}
			Transform val2 = ((Component)this).transform.Find("SFX/Construction");
			if ((Object)(object)val2 != (Object)null)
			{
				SFX_PlayOneShot component = ((Component)val2).GetComponent<SFX_PlayOneShot>();
				if ((Object)(object)component != (Object)null)
				{
					component.Play();
				}
				else
				{
					Logger.LogError("ItemSellDropBox: SFX_PlayOneShot not found on SFX/Construction");
				}
			}
			else
			{
				Logger.LogError("ItemSellDropBox: child SFX/Construction not found");
			}
		}

		public void PlayHatchSfx(bool opened)
		{
			Transform val = ((Component)this).transform.Find(opened ? "SFX/HatchOpen" : "SFX/HatchClose");
			if ((Object)(object)val != (Object)null)
			{
				SFX_PlayOneShot component = ((Component)val).GetComponent<SFX_PlayOneShot>();
				if ((Object)(object)component != (Object)null)
				{
					component.Play();
				}
				else
				{
					Logger.LogError("ItemSellDropBox: SFX_PlayOneShot not found on " + ((Object)val).name);
				}
			}
			else
			{
				Logger.LogError("ItemSellDropBox: hatch SFX child not found for opened=" + opened);
			}
		}

		private void StopProcessingVisuals(ParticleSystemStopBehavior stopBehavior)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			ParticleSystem[] particleSystems = m_particleSystems;
			foreach (ParticleSystem val in particleSystems)
			{
				val.Stop(true, stopBehavior);
			}
		}

		private void EndProcessing()
		{
			m_processing = false;
			m_processingElapsed = 0f;
			int num = -1;
			if (m_pendingRefund.HasValue)
			{
				int value = m_pendingRefund.Value;
				RoomStatsHolder roomStats = SurfaceNetworkHandler.RoomStats;
				if (roomStats != null)
				{
					roomStats.AddMoney(value);
				}
				else
				{
					Logger.LogError("ItemSellDropBox: RoomStats is null; refund skipped.");
				}
				num = value;
				m_pendingRefund = null;
			}
			else
			{
				Logger.LogError("ItemSellDropBox: EndProcessing called but m_pendingRefund is null.");
			}
			if (PhotonNetwork.InRoom && (Object)(object)m_photonView != (Object)null)
			{
				m_photonView.RPC("RPC_EndProcessingVisuals", (RpcTarget)0, new object[1] { num });
			}
			else
			{
				StopProcessingVisuals((ParticleSystemStopBehavior)1);
				if (num > 0)
				{
					ShowRefundNotification(num);
				}
			}
			m_ignoreNewInteractionsUntilRealtime = Time.realtimeSinceStartup + 0.65f;
			Lid.Open();
		}

		private void BeginEject()
		{
			m_checkingContents = false;
			m_elapsedSinceFullyClosed = 0f;
			m_ejecting = true;
			if (!Lid.m_opened)
			{
				Lid.Open();
			}
		}

		public void SyncHatchState()
		{
			if (PhotonNetwork.InRoom && PhotonNetwork.IsMasterClient && (Object)(object)m_photonView != (Object)null)
			{
				m_photonView.RPC("RPC_SyncLid", (RpcTarget)1, new object[1] { Lid.m_opened });
			}
		}

		[PunRPC]
		public void RPC_SyncLid(bool state)
		{
			Lid.SetOpenState(state, playSfx: true, syncIfMaster: false);
		}

		[PunRPC]
		private void RPC_BeginProcessing(int refund, bool playSfx)
		{
			StartProcessingState(refund, 0f);
			PlayProcessingVisuals(playSfx);
		}

		[PunRPC]
		private void RPC_EndProcessingVisuals(int refund)
		{
			m_processing = false;
			m_processingElapsed = 0f;
			m_pendingRefund = null;
			StopProcessingVisuals((ParticleSystemStopBehavior)1);
			if (refund > 0)
			{
				ShowRefundNotification(refund);
			}
		}

		private static void ShowRefundNotification(int refund)
		{
			UserInterface.ShowMoneyNotification("Item Sold", $"${refund}", (MoneyCellType)1);
		}

		public override void OnPlayerEnteredRoom(Player newPlayer)
		{
			((MonoBehaviourPunCallbacks)this).OnPlayerEnteredRoom(newPlayer);
			if (PhotonNetwork.IsMasterClient && !((Object)(object)m_photonView == (Object)null))
			{
				int num = m_pendingRefund ?? (-1);
				m_photonView.RPC("RPC_SyncState", newPlayer, new object[4] { Lid.m_opened, m_processing, num, m_processingElapsed });
			}
		}

		[PunRPC]
		private void RPC_SyncState(bool lidOpened, bool processing, int pendingRefund, float processingElapsed)
		{
			Lid.SetOpenState(lidOpened, playSfx: false, syncIfMaster: false);
			if (processing)
			{
				if (pendingRefund >= 0)
				{
					StartProcessingState(pendingRefund, processingElapsed);
				}
				PlayProcessingVisuals(playSfx: false);
			}
			else
			{
				m_processing = false;
				m_processingElapsed = 0f;
				m_pendingRefund = null;
				StopProcessingVisuals((ParticleSystemStopBehavior)0);
			}
		}
	}
	public static class ItemSellDropBoxContent
	{
		public static GameObject? SellDropboxPrefab { get; private set; }

		public static void Init(AssetBundle bundle)
		{
			SellDropboxPrefab = ContentLoader.LoadPrefabFromBundle(bundle, "SellItemDropbox.prefab");
			if ((Object)(object)SellDropboxPrefab == (Object)null)
			{
				Logger.LogError("ItemSellDropBox: SellItemDropbox.prefab missing from progressionrebalance bundle.");
			}
		}
	}
	public class ItemSellDropBoxItemDetector : MonoBehaviour
	{
		private Collider[] results = (Collider[])(object)new Collider[10];

		public List<(Item item, Pickup pickup)> CheckForItems()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			HashSet<Pickup> hashSet = new HashSet<Pickup>();
			List<(Item, Pickup)> list = new List<(Item, Pickup)>();
			int num = Physics.OverlapBoxNonAlloc(((Component)this).transform.position, ((Component)this).transform.lossyScale * 0.5f, results, ((Component)this).transform.rotation);
			for (int i = 0; i < num; i++)
			{
				Collider val = results[i];
				Pickup componentInParent = ((Component)val).GetComponentInParent<Pickup>();
				if (Object.op_Implicit((Object)(object)componentInParent) && (Object)(object)componentInParent.itemInstance != (Object)null && (Object)(object)componentInParent.itemInstance.item != (Object)null)
				{
					Item item = componentInParent.itemInstance.item;
					if (hashSet.Add(componentInParent))
					{
						list.Add((item, componentInParent));
					}
				}
			}
			return list;
		}

		private void OnDrawGizmos()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			Matrix4x4 matrix = Gizmos.matrix;
			Gizmos.matrix = ((Component)this).transform.localToWorldMatrix;
			Gizmos.color = new Color(0f, 1f, 0f, 0.5f);
			Gizmos.DrawCube(Vector3.zero, Vector3.one);
			Gizmos.matrix = matrix;
		}
	}
	public class ItemSellDropBoxLid : MonoBehaviour
	{
		public ItemSellDropBox Machine;

		public bool m_opened = true;

		public float Spring = 70f;

		public float Drag = 0.15f;

		public float m_openedRotation;

		public float m_closedRotation = 90f;

		private OneDPhysicsSpring m_spring;

		private void Awake()
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			OneDPhysicsSpring spring = default(OneDPhysicsSpring);
			((OneDPhysicsSpring)(ref spring)).Spring = Spring;
			((OneDPhysicsSpring)(ref spring)).Drag = Drag;
			m_spring = spring;
		}

		private void Update()
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			((OneDPhysicsSpring)(ref m_spring)).Drag = Drag;
			((OneDPhysicsSpring)(ref m_spring)).Spring = Spring;
			((OneDPhysicsSpring)(ref m_spring)).Update();
			((Component)this).transform.localRotation = Quaternion.Euler(new Vector3(0f, 0f, ((OneDPhysicsSpring)(ref m_spring)).Current));
		}

		private void FixedUpdate()
		{
			//IL_002e: 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)
			((OneDPhysicsSpring)(ref m_spring)).Target = (m_opened ? m_openedRotation : m_closedRotation);
			((OneDPhysicsSpring)(ref m_spring)).FixedUpdate();
			m_spring = SpringClamp.BounceClamp<OneDPhysicsSpring>(m_spring, Mathf.Min(m_openedRotation, m_closedRotation) - 5f, Mathf.Max(m_openedRotation, m_closedRotation) + 5f, 0.6f);
		}

		public bool IsFullyClosed()
		{
			if (m_opened)
			{
				return false;
			}
			if (Mathf.Abs(((OneDPhysicsSpring)(ref m_spring)).Current - m_closedRotation) < 3f)
			{
				return Mathf.Abs(((OneDPhysicsSpring)(ref m_spring)).Velocity) < 0.25f;
			}
			return false;
		}

		public bool IsHalfwayOpenForEject()
		{
			if (!m_opened)
			{
				return false;
			}
			float num = (m_closedRotation + m_openedRotation) * 0.5f;
			return ((OneDPhysicsSpring)(ref m_spring)).Current <= num + 5f;
		}

		public void Close()
		{
			SetOpenState(opened: false, playSfx: true, syncIfMaster: true);
		}

		public void Open()
		{
			SetOpenState(opened: true, playSfx: true, syncIfMaster: true);
		}

		public void SetOpenState(bool opened, bool playSfx, bool syncIfMaster)
		{
			if (m_opened != opened)
			{
				m_opened = opened;
				if (syncIfMaster && PhotonNetwork.IsMasterClient)
				{
					Machine.SyncHatchState();
				}
				if (playSfx)
				{
					Machine.PlayHatchSfx(opened);
				}
			}
		}
	}
	public static class Logger
	{
		private const string Prefix = "[ProgressionRebalance]";

		public static void Log(string message)
		{
			Debug.Log((object)("[ProgressionRebalance] " + message));
		}

		public static void LogWarning(string message)
		{
			Debug.LogWarning((object)("[ProgressionRebalance] " + message));
		}

		public static void LogError(string message)
		{
			Debug.LogError((object)("[ProgressionRebalance] " + message));
		}
	}
	internal class BigNumberTweaks
	{
		public static void ApplyTweaks()
		{
			Logger.Log("Applying BigNumber tweaks...");
			AssetBundle bundle = ProgressionRebalance.Bundle;
			BigNumbers instance = SingletonAsset<BigNumbers>.Instance;
			BigNumbers obj = bundle.LoadAsset<BigNumbers>("AdjustedBigNumbers");
			FieldInfo[] fields = typeof(BigNumbers).GetFields();
			foreach (FieldInfo fieldInfo in fields)
			{
				fieldInfo.SetValue(instance, fieldInfo.GetValue(obj));
			}
			Logger.Log("BigNumber tweaks applied!");
		}
	}
	public static class CustomItems
	{
		private static AssetBundle? _bundle;

		public static void Setup(AssetBundle bundle)
		{
			_bundle = bundle;
			Items.DeferRegistration((Action)delegate
			{
				RegisterSnailEgg();
			});
		}

		private static void RegisterSnailEgg()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = ContentLoader.LoadPrefabFromBundle(_bundle, "SnailEgg.prefab");
			val.AddComponent<SnailEggArtifactBehaviour>();
			GameMaterials.ApplyMaterial(val, (GameMaterial)26, true);
			ArtifactConfig val2 = new ArtifactConfig();
			((ItemConfig)val2).displayName = "Snail Egg";
			((ItemConfig)val2).persistentId = "progressionrebalance.snail_egg";
			((ItemConfig)val2).icon = GetSprite("snail_egg_icon");
			((ItemConfig)val2).impactSoundTypes = (ImpactSoundType[])(object)new ImpactSoundType[1] { (ImpactSoundType)7 };
			((ItemConfig)val2).holdPos = new Vector3(0.3f, -0.3f, 0.4f);
			((ItemConfig)val2).budgetCost = 3;
			((ItemConfig)val2).rarity = 1f;
			val2.contentValue = 75f;
			val2.comments = new string[2] { "is that an egg?", "please don't hatch that thing" };
			Items.RegisterArtifact(val, val2);
		}

		public static Sprite GetSprite(string iconName)
		{
			return _bundle.LoadAsset<Sprite>(iconName);
		}
	}
	internal static class HospitalBillTweaks
	{
		public const int BaseCostPerDeadPlayer = 50;

		public const int CostIncreasePerQuota = 25;

		public static int GetPerDeadPlayerCost(RoomStatsHolder roomStats)
		{
			return 50 + 25 * roomStats.CurrentRun;
		}

		public static int GetTotalBill(int perDeadPlayer, int deadCount)
		{
			return perDeadPlayer * deadCount;
		}
	}
	internal class ItemTweaks
	{
		public static void ApplyTweaks()
		{
			Item itemByPrefabComponent = Items.GetItemByPrefabComponent<Defib>();
			if ((Object)(object)itemByPrefabComponent != (Object)null)
			{
				itemByPrefabComponent.price = 500;
			}
			Item itemByPrefabComponent2 = Items.GetItemByPrefabComponent<ItemHugger>();
			if ((Object)(object)itemByPrefabComponent2 != (Object)null)
			{
				itemByPrefabComponent2.price = 300;
			}
			Item itemByCondition = getItemByCondition((Item item) => (Object)(object)item.itemObject.GetComponent<Flashlight>() != (Object)null && item.price == 600);
			if ((Object)(object)itemByCondition != (Object)null)
			{
				itemByCondition.price = 300;
			}
			Item itemByCondition2 = getItemByCondition((Item item) => item.displayName == "Apple");
			if ((Object)(object)itemByCondition2 != (Object)null)
			{
				itemByCondition2.price = 3;
			}
		}

		public static Item? getItemByCondition(Func<Item, bool> condition)
		{
			ItemDatabase instance = SingletonAsset<ItemDatabase>.Instance;
			FieldInfo objectsField = Items.GetObjectsField(instance);
			List<Item> itemsFromField = Items.GetItemsFromField(objectsField, instance);
			foreach (Item item in itemsFromField)
			{
				if (condition(item))
				{
					return item;
				}
			}
			return null;
		}
	}
	public class SnailEggArtifactBehaviour : ItemInstanceBehaviour, IArtifactContent
	{
		private const string ZombiePrefabName = "Zombe";

		private const int ZombiesToSpawn = 2;

		private const float HoldDuration = 3f;

		private IntRangeEntry chargesEntry;

		private StashAbleEntry stashAbleEntry;

		private float timeInHand;

		public bool IsHeld => base.isHeld;

		public bool IsActive => chargesEntry.selectedValue <= 0;

		private void Update()
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Expected O, but got Unknown
			//IL_0075: 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_007c: 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_0094: Unknown result type (might be due to invalid IL or missing references)
			if (!base.isHeldByMe || !base.isSimulatedByMe || !base.isHeld)
			{
				return;
			}
			timeInHand += Time.deltaTime;
			if (!(timeInHand <= 3f))
			{
				timeInHand = 0f;
				if (chargesEntry.selectedValue > 0)
				{
					chargesEntry.selectedValue = 0;
					((ItemDataEntry)chargesEntry).SetDirty();
					BinarySerializer val = new BinarySerializer();
					Vector3 val2 = Player.localPlayer.Center();
					val.WriteFloat(val2.x);
					val.WriteFloat(val2.y);
					val.WriteFloat(val2.z);
					base.itemInstance.CallRPC((ItemRPC)0, val);
				}
			}
		}

		public override void ConfigItem(ItemInstanceData data, PhotonView playerView)
		{
			//IL_0030: 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_0041: Expected O, but got Unknown
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			if (data.TryGetEntry<StashAbleEntry>(ref stashAbleEntry))
			{
				Logger.Log($"stashAbleEntry entry found, isStashAble: {stashAbleEntry.isStashAble}");
			}
			else
			{
				stashAbleEntry = new StashAbleEntry
				{
					isStashAble = false
				};
				data.AddDataEntry((ItemDataEntry)(object)stashAbleEntry);
				Logger.Log("stashAbleEntry entry not found, adding new entry with false.");
			}
			if (data.TryGetEntry<IntRangeEntry>(ref chargesEntry))
			{
				Logger.Log($"chargesEntry entry found, charges: {chargesEntry.selectedValue}");
			}
			else
			{
				chargesEntry = new IntRangeEntry
				{
					selectedValue = 1,
					maxValue = 1
				};
				data.AddDataEntry((ItemDataEntry)(object)chargesEntry);
				Logger.Log("chargesEntry entry not found, adding new entry with 1.");
			}
			base.itemInstance.RegisterRPC((ItemRPC)0, (Action<BinaryDeserializer>)RPCA_SpawnSnails);
		}

		private void RPCA_SpawnSnails(BinaryDeserializer deserializer)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: 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_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			if (!PhotonNetwork.IsMasterClient)
			{
				return;
			}
			float num = deserializer.ReadFloat();
			float num2 = deserializer.ReadFloat();
			float num3 = deserializer.ReadFloat();
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(num, num2, num3);
			Logger.Log($"RPCA_SpawnSnails: Received target position {val}");
			List<PatrolPoint> pointsOutsideMinDistanceSortedOnClosest = Level.currentLevel.GetPointsOutsideMinDistanceSortedOnClosest(ExtCollections.PToList<PatrolGroup>((PatrolGroup)4), val, 40f, 10f, false);
			Logger.Log($"RPCA_SpawnSnails: Found {pointsOutsideMinDistanceSortedOnClosest.Count} potential spawn points.");
			int num4 = 0;
			Player val2 = default(Player);
			foreach (PatrolPoint item in pointsOutsideMinDistanceSortedOnClosest)
			{
				if (num4 >= 2)
				{
					break;
				}
				if (PlayerHandler.instance.CanAnAlivePlayerSeePoint(((Component)item).transform.position, ref val2, (Player)null))
				{
					continue;
				}
				Logger.Log(string.Format("RPCA_SpawnSnails: Spawning {0} at {1}", "Zombe", ((Component)item).transform.position));
				GameObject val3 = MonsterSpawner.SpawnMonster("Zombe", ((Component)item).transform.position);
				if ((Object)(object)val3 != (Object)null)
				{
					Bot componentInChildren = val3.GetComponentInChildren<Bot>();
					if ((Object)(object)componentInChildren != (Object)null)
					{
						Logger.Log($"RPCA_SpawnSnails: Bot component found. Setting busy=true and targetPos={val}");
						componentInChildren.busy = true;
						componentInChildren.navTargetPos_Set = val;
						((MonoBehaviour)componentInChildren).StartCoroutine(MoveToTarget(componentInChildren, val));
					}
					else
					{
						Logger.LogWarning("RPCA_SpawnSnails: Spawned Zombe but no Bot component found in children!");
					}
				}
				else
				{
					Logger.LogError("RPCA_SpawnSnails: Failed to spawn Zombe!");
				}
				num4++;
			}
		}

		private IEnumerator MoveToTarget(Bot bot, Vector3 target)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			Logger.Log($"MoveToTarget: Started for bot {((Object)bot).name} towards {target}");
			while ((Object)(object)bot != (Object)null && bot.busy)
			{
				float num = Vector3.Distance(bot.Center(), target);
				if (num < 1.5f)
				{
					Logger.Log($"MoveToTarget: Bot {((Object)bot).name} reached target (distance: {num}). Exiting busy mode.");
					bot.busy = false;
					bot.StandStill();
					yield break;
				}
				bot.Look(bot.navDirection_Read, 3f);
				bot.Walk();
				yield return null;
			}
			if ((Object)(object)bot == (Object)null)
			{
				Logger.LogWarning("MoveToTarget: Bot became null during movement.");
			}
			else if (!bot.busy)
			{
				Logger.Log("MoveToTarget: Bot " + ((Object)bot).name + " busy flag was cleared externally.");
			}
		}
	}
	public class MyPluginInfo
	{
		public const string PLUGIN_GUID = "db.progressionrebalance";

		public const string PLUGIN_NAME = "Progression Rebalance";

		public const string PLUGIN_VERSION = "0.1.0";

		public const bool VANILLA_COMPATIBLE = false;
	}
	[ContentWarningPlugin("db.progressionrebalance", "0.1.0", false)]
	[BepInPlugin("db.progressionrebalance", "Progression Rebalance", "0.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ProgressionRebalance : BaseUnityPlugin
	{
		private bool _isPatched;

		public static bool DEBUG_MODE;

		private string assetBundleName = "progressionrebalance";

		public static AssetBundle? Bundle { get; private set; }

		private Harmony? Harmony { get; set; }

		public static ProgressionRebalance Instance { get; private set; }

		private void Awake()
		{
			Instance = this;
			InitializeMod();
			BigNumberTweaks.ApplyTweaks();
			ItemTweaks.ApplyTweaks();
			PatchAll();
			Logger.Log("Plugin db.progressionrebalance is loaded!");
		}

		private void InitializeMod()
		{
			Logger.Log("Loading asset bundle...");
			Bundle = ContentLoader.LoadAssetBundle(Assembly.GetExecutingAssembly(), assetBundleName);
			if ((Object)(object)Bundle != (Object)null)
			{
				CustomItems.Setup(Bundle);
				ItemSellDropBoxContent.Init(Bundle);
			}
			else
			{
				Logger.LogError("Failed to load asset bundle");
			}
		}

		private void PatchAll()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_0037: Expected O, but got Unknown
			if (_isPatched)
			{
				Logger.LogError("Already patched!");
				return;
			}
			Logger.Log("Patching...");
			if (Harmony == null)
			{
				Harmony val = new Harmony("db.progressionrebalance");
				Harmony val2 = val;
				Harmony = val;
			}
			try
			{
				Harmony.PatchAll();
				_isPatched = true;
				Logger.Log("Patched!");
			}
			catch (Exception arg)
			{
				Logger.LogError($"Failed to patch: {arg}");
			}
		}

		public void UnpatchAll()
		{
			if (!_isPatched)
			{
				Logger.LogError("Already unpatched!");
				return;
			}
			Logger.Log("Unpatching...");
			try
			{
				Harmony? harmony = Harmony;
				if (harmony != null)
				{
					harmony.UnpatchSelf();
				}
				_isPatched = false;
				Logger.Log("Unpatched!");
			}
			catch (Exception arg)
			{
				Logger.LogError($"Failed to unpatch: {arg}");
			}
		}
	}
}
namespace ProgressionRebalance.Patches
{
	[HarmonyPatch(typeof(SurfaceNetworkHandler), "CheckForHospitalBill")]
	internal static class HospitalBillPatch
	{
		[HarmonyPrefix]
		public static bool Prefix(SurfaceNetworkHandler __instance)
		{
			List<Player> list = PhotonNetwork.CurrentRoom.Players.Values.ToList();
			List<(int, int)> hospitalBill = new List<(int, int)>();
			ICollection<Player> value = Traverse.Create(typeof(SurfaceNetworkHandler)).Field<ICollection<Player>>("PlayersAliveFromUnderWorld").Value;
			if (value != null)
			{
				foreach (Player alivePlayer in value)
				{
					Player val = list.Find((Player p) => p.ActorNumber == alivePlayer.refs.view.OwnerActorNr);
					if (val != null)
					{
						list.Remove(val);
					}
				}
			}
			int count = list.Count;
			if (count == 0)
			{
				Logger.Log("Hospital bill: no dead players, skipping.");
				return false;
			}
			RoomStatsHolder roomStats = SurfaceNetworkHandler.RoomStats;
			int perDeadPlayerCost = HospitalBillTweaks.GetPerDeadPlayerCost(roomStats);
			int totalBill = HospitalBillTweaks.GetTotalBill(perDeadPlayerCost, count);
			string text = "Checking Hospital Bill, Dead Players Are: ";
			foreach (Player item in list)
			{
				text = text + item.NickName + " ID: " + item.ActorNumber + " \n";
				hospitalBill.Add((item.ActorNumber, perDeadPlayerCost));
			}
			MonoFunctions.instance.DelayCall((Action)delegate
			{
				Traverse.Create((object)__instance).Method("SendHospitalBill", new object[1] { hospitalBill }).GetValue();
			}, 3f);
			text = text + " Per-dead fee: $" + perDeadPlayerCost + " Total Bill is: $" + totalBill + " (quota run " + roomStats.CurrentRun + ")";
			Debug.Log((object)text);
			Logger.Log(text);
			return false;
		}
	}
	[HarmonyPatch(typeof(DivingBell), "Awake")]
	internal static class SpawnItemSellDropBoxPatch
	{
		[HarmonyPostfix]
		public static void Postfix(DivingBell __instance)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			if (!(((Scene)(ref activeScene)).name != "SurfaceScene"))
			{
				SetupItemSellDropbox();
			}
		}

		private static void SetupItemSellDropbox()
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			GameObject sellDropboxPrefab = ItemSellDropBoxContent.SellDropboxPrefab;
			if ((Object)(object)sellDropboxPrefab == (Object)null)
			{
				Logger.LogError("ProgressionRebalance: SellItemDropbox prefab is null; sell hatch not spawned.");
				return;
			}
			GameObject val = Object.Instantiate<GameObject>(sellDropboxPrefab);
			((Object)val).name = "SellItemDropbox";
			val.transform.localPosition = new Vector3(0.34f, 0.772f, 8.66f);
			val.transform.localEulerAngles = new Vector3(0f, 24.91f, 0f);
			val.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);
			Transform obj = val.transform.Find("Dropbox");
			GameObject val2 = ((obj != null) ? ((Component)obj).gameObject : null);
			Transform obj2 = val.transform.Find("DropboxFrontText");
			GameObject val3 = ((obj2 != null) ? ((Component)obj2).gameObject : null);
			Transform obj3 = val.transform.Find("Vents");
			GameObject val4 = ((obj3 != null) ? ((Component)obj3).gameObject : null);
			Transform obj4 = val.transform.Find("Wheels");
			GameObject val5 = ((obj4 != null) ? ((Component)obj4).gameObject : null);
			Transform obj5 = val.transform.Find("LidPivot");
			GameObject val6 = ((obj5 != null) ? ((Component)obj5).gameObject : null);
			object obj6;
			if (val6 == null)
			{
				obj6 = null;
			}
			else
			{
				Transform obj7 = val6.transform.Find("Lid");
				obj6 = ((obj7 != null) ? ((Component)obj7).gameObject : null);
			}
			GameObject val7 = (GameObject)obj6;
			Transform obj8 = val.transform.Find("UpgradeDetectionZone");
			GameObject val8 = ((obj8 != null) ? ((Component)obj8).gameObject : null);
			if ((Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null || (Object)(object)val4 == (Object)null || (Object)(object)val5 == (Object)null || (Object)(object)val6 == (Object)null || (Object)(object)val7 == (Object)null || (Object)(object)val8 == (Object)null)
			{
				Logger.LogError("ProgressionRebalance: SellItemDropbox prefab hierarchy is incomplete; sell hatch not wired.");
				Object.Destroy((Object)(object)val);
				return;
			}
			PhotonView val9 = val.AddComponent<PhotonView>();
			val9.ViewID = 997;
			ItemSellDropBox itemSellDropBox = val.AddComponent<ItemSellDropBox>();
			itemSellDropBox.Particles = ((Component)val.transform.Find("Particles")).gameObject;
			ItemSellDropBoxItemDetector detector = val8.AddComponent<ItemSellDropBoxItemDetector>();
			ItemSellDropBoxLid itemSellDropBoxLid = val6.AddComponent<ItemSellDropBoxLid>();
			itemSellDropBox.Detector = detector;
			itemSellDropBox.Lid = itemSellDropBoxLid;
			itemSellDropBoxLid.Machine = itemSellDropBox;
			ApplyDropboxMaterials(val2, val3, val4, val5, val7);
			ObjectHelper.FixShadersForCurrentScene(val);
			Logger.Log("ProgressionRebalance: Item sell hatch spawned on SurfaceScene.");
		}

		private static void ApplyDropboxMaterials(GameObject dropboxChild, GameObject dropboxFrontTextChild, GameObject dropboxVents, GameObject dropboxWheels, GameObject dropboxLid)
		{
			GameMaterials.ApplyMaterial(dropboxChild, (GameMaterial)301, true);
			GameMaterials.ApplyMaterial(dropboxFrontTextChild, (GameMaterial)301, true);
			MeshRenderer component = dropboxVents.GetComponent<MeshRenderer>();
			((Renderer)component).materials = (Material[])(object)new Material[2]
			{
				GameMaterials.GetMaterial((GameMaterial)302),
				GameMaterials.GetMaterial((GameMaterial)302)
			};
			GameMaterials.ApplyMaterial(dropboxWheels, (GameMaterial)34, true);
			MeshRenderer component2 = dropboxLid.GetComponent<MeshRenderer>();
			((Renderer)component2).materials = (Material[])(object)new Material[2]
			{
				GameMaterials.GetMaterial((GameMaterial)302),
				GameMaterials.GetMaterial((GameMaterial)304)
			};
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}