Decompiled source of REPO lucky block v1.0.0

REPO_lucky_block.dll

Decompiled 18 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using REPOLib.Modules;
using UnityEngine;
using UnityEngine.SceneManagement;

[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.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("REPO_lucky_block")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+17f886403ddca51826ca4456ebf9048ef499731f")]
[assembly: AssemblyProduct("REPO_lucky_block")]
[assembly: AssemblyTitle("REPO_lucky_block")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[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;
		}
	}
}
public class DebugMenu : MonoBehaviour
{
	private enum Page
	{
		Main,
		ForceEvent,
		BlocksOnMap
	}

	private bool _open = false;

	private int _selectedIndex = 0;

	private Page _page = Page.Main;

	private Vector2 _scroll = Vector2.zero;

	private List<LuckyBlock> _blockCache = new List<LuckyBlock>();

	private string _lastEventMsg = "";

	private const float WIN_W = 360f;

	private const float WIN_H = 420f;

	private const float ROW_H = 26f;

	private const float BTN_H = 22f;

	private const float PAD = 8f;

	private const float HOLD_DELAY = 0.28f;

	private const float REPEAT_RATE = 0.07f;

	private float _upTimer = -1f;

	private float _downTimer = -1f;

	private float _enterTimer = -1f;

	private static readonly Color COL_SELECTED = new Color(1f, 0.85f, 0f);

	private static readonly Color COL_NORMAL = Color.white;

	private static readonly Color COL_GOLD = new Color(1f, 0.8f, 0.1f);

	private static readonly Color COL_DIM = new Color(1f, 1f, 1f, 0.35f);

	private static readonly Color COL_GREEN = new Color(0.4f, 1f, 0.4f);

	private static readonly Color COL_RED = new Color(1f, 0.35f, 0.35f);

	private static readonly string[] EVENT_LABELS = new string[11]
	{
		"Valuable          (random, near you)", "Item              (random, near you)", "Monster           (random, near you)", "Potion            (drops + breaks on floor)", "Lucky Cluster ×3  (3 new lucky blocks)", "Cluster ×3        (3 bombs around player)", "Cluster ×5        (5 bombs around block)", "Explosive at Feet (1 bomb drops at feet)", "HP Loss           (−10% max HP)", "Tumble            (knock you over)",
		"Full Roll         (random spin, all effects)"
	};

	private const int EVENT_COUNT = 11;

	private const int MAIN_ITEMS = 5;

	public static DebugMenu Instance { get; private set; }

	private void Awake()
	{
		if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
		else
		{
			Instance = this;
		}
	}

	private void Update()
	{
		//IL_003a: 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)
		if (Input.GetKeyDown((KeyCode)287))
		{
			_open = !_open;
			if (_open)
			{
				RefreshBlockCache();
			}
			_selectedIndex = 0;
			_scroll = Vector2.zero;
			_page = Page.Main;
			_lastEventMsg = "";
			ResetTimers();
		}
		if (_open)
		{
			float deltaTime = Time.deltaTime;
			HandleHeld((KeyCode)273, ref _upTimer, deltaTime, NavigateUp);
			HandleHeld((KeyCode)274, ref _downTimer, deltaTime, NavigateDown);
			HandleHeld((KeyCode)13, ref _enterTimer, deltaTime, ActivateSelected);
			if (Input.GetKeyDown((KeyCode)271) || Input.GetKey((KeyCode)271))
			{
				HandleHeld((KeyCode)271, ref _enterTimer, deltaTime, ActivateSelected);
			}
		}
	}

	private void HandleHeld(KeyCode key, ref float timer, float dt, Action action)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		if (Input.GetKeyDown(key))
		{
			action();
			timer = -0.28f;
		}
		else if (Input.GetKey(key))
		{
			timer += dt;
			while (timer >= 0f)
			{
				action();
				timer -= 0.07f;
			}
		}
		else
		{
			timer = -0.28f;
		}
	}

	private void ResetTimers()
	{
		_upTimer = (_downTimer = (_enterTimer = -0.28f));
	}

	private int PageItemCount()
	{
		return _page switch
		{
			Page.Main => 5, 
			Page.ForceEvent => 12, 
			Page.BlocksOnMap => 1 + _blockCache.Count, 
			_ => 0, 
		};
	}

	private void NavigateUp()
	{
		int num = PageItemCount();
		if (num != 0)
		{
			_selectedIndex = (_selectedIndex - 1 + num) % num;
			SyncScroll();
		}
	}

	private void NavigateDown()
	{
		int num = PageItemCount();
		if (num != 0)
		{
			_selectedIndex = (_selectedIndex + 1) % num;
			SyncScroll();
		}
	}

	private void GoTo(Page p)
	{
		//IL_001f: 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)
		if (p == Page.BlocksOnMap)
		{
			RefreshBlockCache();
		}
		_page = p;
		_selectedIndex = 0;
		_scroll = Vector2.zero;
		ResetTimers();
	}

	private void SyncScroll()
	{
		if (_page == Page.Main)
		{
			return;
		}
		float num = 68f;
		float num2 = 420f - num - 8f - 24f;
		float num3 = (float)_selectedIndex * 26f;
		float num4 = num3 + 26f;
		int num5 = PageItemCount() - 1;
		if (_selectedIndex == 0)
		{
			_scroll.y = 0f;
			return;
		}
		if (_selectedIndex == num5)
		{
			_scroll.y = Mathf.Max(0f, (float)(num5 + 1) * 26f - num2);
			return;
		}
		if (num3 < _scroll.y)
		{
			_scroll.y = num3;
		}
		if (num4 > _scroll.y + num2)
		{
			_scroll.y = num4 - num2;
		}
	}

	private void ActivateSelected()
	{
		switch (_page)
		{
		case Page.Main:
			ActivateMain();
			break;
		case Page.ForceEvent:
			ActivateForceEvent();
			break;
		case Page.BlocksOnMap:
			ActivateBlocksOnMap();
			break;
		}
	}

	private void ActivateMain()
	{
		switch (_selectedIndex)
		{
		case 0:
			DoSpawnInFront();
			break;
		case 1:
			DoForceRandomNearest();
			break;
		case 2:
			GoTo(Page.ForceEvent);
			break;
		case 3:
			GoTo(Page.BlocksOnMap);
			break;
		case 4:
			DoForceSpawnLevel();
			break;
		}
	}

	private void ActivateForceEvent()
	{
		if (_selectedIndex == 0)
		{
			GoTo(Page.Main);
			return;
		}
		int eventIdx = _selectedIndex - 1;
		DoForceEvent(eventIdx);
	}

	private void ActivateBlocksOnMap()
	{
		if (_selectedIndex == 0)
		{
			GoTo(Page.Main);
			return;
		}
		int num = _selectedIndex - 1;
		if (num < _blockCache.Count && (Object)(object)_blockCache[num] != (Object)null)
		{
			ForceOpenBlock(_blockCache[num]);
		}
	}

	private void DoSpawnInFront()
	{
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)PlayerAvatar.instance == (Object)null))
		{
			Vector3 spawnPositionInFront = SpawnUtils.GetSpawnPositionInFront(PlayerAvatar.instance, 2.5f);
			LuckyBlockSpawner.SpawnOne(spawnPositionInFront);
		}
	}

	private void DoForceRandomNearest()
	{
		LuckyBlock luckyBlock = FindNearestBlock();
		if ((Object)(object)luckyBlock != (Object)null)
		{
			ForceOpenBlock(luckyBlock);
		}
		else
		{
			Debug.Log((object)"[LuckyBlock] Debug: no blocks in scene.");
		}
	}

	private void DoForceSpawnLevel()
	{
		if (!SemiFunc.RunIsLevel())
		{
			Debug.Log((object)"[LuckyBlock] Debug: not in a level scene.");
			return;
		}
		LuckyBlockSpawner.ResetSpawnFlag();
		LuckyBlockSpawner.SpawnForCurrentLevel("ForceSpawnLevel (debug)");
	}

	private void DoForceEvent(int eventIdx)
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0206: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: 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_00c4: 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_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0190: Unknown result type (might be due to invalid IL or missing references)
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return;
		}
		Vector3 spawnPositionInFront = SpawnUtils.GetSpawnPositionInFront(instance, 2.5f);
		bool flag = SemiFunc.IsMasterClientOrSingleplayer();
		switch (eventIdx)
		{
		case 0:
			if (flag)
			{
				SpawnUtils.SpawnRandomValuable(spawnPositionInFront);
				_lastEventMsg = "Valuable: " + SpawnUtils.LastSpawnedName;
			}
			break;
		case 1:
			if (flag)
			{
				SpawnUtils.SpawnRandomItem(spawnPositionInFront);
				_lastEventMsg = "Item: " + SpawnUtils.LastSpawnedName;
			}
			break;
		case 2:
			if (flag)
			{
				SpawnUtils.SpawnRandomMonster(spawnPositionInFront, (MonoBehaviour)(object)this);
				_lastEventMsg = "Monster: " + SpawnUtils.LastSpawnedName;
			}
			break;
		case 3:
			if (flag)
			{
				SpawnUtils.SpawnPotion(spawnPositionInFront);
				_lastEventMsg = "Potion: " + SpawnUtils.LastSpawnedName;
			}
			break;
		case 4:
			if (flag)
			{
				LuckyBlockManager.Instance?.SpawnBlocks(SpawnUtils.GetFloorRing(spawnPositionInFront, 3, 2f));
				_lastEventMsg = "Lucky Cluster ×3 spawned";
			}
			break;
		case 5:
			if (flag)
			{
				SpawnUtils.SpawnExplosiveCluster(instance);
				_lastEventMsg = "Small Cluster ×3 around player";
			}
			break;
		case 6:
			if (flag)
			{
				SpawnUtils.SpawnLargeExplosiveCluster(spawnPositionInFront);
				_lastEventMsg = "Large Cluster ×5 around block";
			}
			break;
		case 7:
			if (flag)
			{
				SpawnUtils.SpawnRandomExplosive(SpawnUtils.GetSpawnPositionOnPlayer(instance));
				_lastEventMsg = "Explosive at feet: " + SpawnUtils.LastSpawnedName;
			}
			break;
		case 8:
			if ((Object)(object)instance.playerHealth != (Object)null)
			{
				RandomEventRoller.ForceHPLoss(instance.playerHealth, "[Debug]");
				_lastEventMsg = "HP Loss –10% fired";
			}
			break;
		case 9:
			RandomEventRoller.ForceTumble(instance, "[Debug]", ignoreAlreadyTumbling: true);
			_lastEventMsg = "Tumble fired";
			break;
		case 10:
			LuckyBlockEvents.Roll(instance, ((Component)instance).transform.position);
			_lastEventMsg = "Full Roll fired";
			break;
		}
	}

	private void ForceOpenBlock(LuckyBlock b)
	{
		typeof(LuckyBlock).GetMethod("Open", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(b, null);
	}

	private LuckyBlock FindNearestBlock()
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: 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_0064: Unknown result type (might be due to invalid IL or missing references)
		LuckyBlock[] array = Object.FindObjectsOfType<LuckyBlock>();
		if (array.Length == 0)
		{
			return null;
		}
		if ((Object)(object)PlayerAvatar.instance == (Object)null)
		{
			return array[0];
		}
		LuckyBlock result = null;
		float num = float.MaxValue;
		Vector3 position = ((Component)PlayerAvatar.instance).transform.position;
		LuckyBlock[] array2 = array;
		foreach (LuckyBlock luckyBlock in array2)
		{
			float num2 = Vector3.Distance(((Component)luckyBlock).transform.position, position);
			if (num2 < num)
			{
				num = num2;
				result = luckyBlock;
			}
		}
		return result;
	}

	private void RefreshBlockCache()
	{
		_blockCache.Clear();
		_blockCache.AddRange(Object.FindObjectsOfType<LuckyBlock>());
	}

	private void OnGUI()
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
		if (_open)
		{
			float num = 10f;
			float num2 = (float)Screen.height - 420f - 10f;
			GUI.Box(new Rect(num, num2, 360f, 420f), "");
			float num3 = num + 8f;
			float cy = num2 + 8f;
			float num4 = 344f;
			switch (_page)
			{
			case Page.Main:
				DrawMain(num3, cy, num4);
				break;
			case Page.ForceEvent:
				DrawForceEvent(num3, cy, num4);
				break;
			case Page.BlocksOnMap:
				DrawBlocksOnMap(num3, cy, num4);
				break;
			}
			float num5 = num2 + 420f - 8f - 18f;
			GUI.color = COL_DIM;
			GUI.Label(new Rect(num3, num5, num4, 18f), "↑↓ navigate (wrap+hold)   ENTER select (hold)   F6 close");
			GUI.color = Color.white;
		}
	}

	private void DrawMain(float cx, float cy, float cw)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		GUI.color = COL_GOLD;
		GUI.Label(new Rect(cx, cy, cw, 22f), "<b>[ LUCKY BLOCK DEBUG ]</b>");
		GUI.color = Color.white;
		cy += 30f;
		int num = Object.FindObjectsOfType<LuckyBlock>().Length;
		int num2 = (((Object)(object)RunManager.instance != (Object)null) ? (SemiFunc.RunGetLevelsCompleted() + 1) : 0);
		GUI.color = COL_DIM;
		GUI.Label(new Rect(cx, cy, cw, 22f), $"  Lvl {num2}   Blocks: {num}   " + "Master: " + (SemiFunc.IsMasterClientOrSingleplayer() ? "✓" : "✗"));
		cy += 24f;
		string text = (ModeManager.IsPrivate ? "Private  (custom item, press E)" : "Public   (valuable, grab it)");
		GUI.Label(new Rect(cx, cy, cw, 22f), "  Edition: " + text + "  (config + restart)");
		GUI.color = Color.white;
		cy += 28f;
		DrawItem(cx, cy, cw, "Spawn Lucky Block in Front", 0);
		cy += 26f;
		DrawItem(cx, cy, cw, "Force Random Event on Nearest", 1);
		cy += 26f;
		DrawItem(cx, cy, cw, "→ Force Specific Event", 2);
		cy += 26f;
		DrawItem(cx, cy, cw, $"→ Blocks on Map  ({num})", 3);
		cy += 26f;
		DrawItem(cx, cy, cw, "Force-Spawn Level Blocks", 4);
	}

	private void DrawForceEvent(float cx, float cy, float cw)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: 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_004b: 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_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_014f: Unknown result type (might be due to invalid IL or missing references)
		//IL_014b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_0162: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_0188: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0108: Unknown result type (might be due to invalid IL or missing references)
		GUI.color = COL_GOLD;
		GUI.Label(new Rect(cx, cy, cw, 22f), "<b>[ Force Specific Event ]</b>");
		GUI.color = Color.white;
		cy += 28f;
		if (_lastEventMsg.Length > 0)
		{
			GUI.color = COL_GREEN;
			GUI.Label(new Rect(cx, cy, cw, 22f), "  ✓  " + _lastEventMsg);
			GUI.color = Color.white;
		}
		else
		{
			GUI.color = COL_DIM;
			GUI.Label(new Rect(cx, cy, cw, 22f), "  Spawns block in front + fires chosen event");
			GUI.color = Color.white;
		}
		cy += 30f;
		DrawItem(cx, cy, cw, "← Back", 0);
		cy += 28f;
		for (int i = 0; i < 11; i++)
		{
			int num = i + 1;
			bool flag = _selectedIndex == num;
			Color val = (Color)((i <= 1) ? COL_GREEN : ((i == 2) ? COL_RED : ((i == 3) ? COL_GREEN : ((i == 4) ? COL_GOLD : ((i <= 7) ? new Color(1f, 0.55f, 0f) : ((i <= 9) ? COL_RED : COL_GOLD))))));
			GUI.color = (flag ? COL_SELECTED : val);
			GUI.Label(new Rect(cx, cy, cw, 22f), (flag ? "► " : "  ") + EVENT_LABELS[i]);
			GUI.color = Color.white;
			cy += 26f;
		}
	}

	private void DrawBlocksOnMap(float cx, float cy, float cw)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: 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_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_012a: Unknown result type (might be due to invalid IL or missing references)
		//IL_012f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_0218: Unknown result type (might be due to invalid IL or missing references)
		//IL_0239: Unknown result type (might be due to invalid IL or missing references)
		//IL_0249: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_016a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b5: 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)
		GUI.color = COL_GOLD;
		GUI.Label(new Rect(cx, cy, cw, 22f), "<b>[ Blocks on Map ]</b>");
		GUI.color = Color.white;
		cy += 28f;
		DrawItem(cx, cy, cw, "← Back", 0);
		cy += 30f;
		RefreshBlockCache();
		float num = 420f - (cy - ((float)Screen.height - 420f - 10f)) - 8f - 24f;
		float num2 = Mathf.Max((float)_blockCache.Count * 26f, num);
		_scroll = GUI.BeginScrollView(new Rect(cx, cy, cw, num), _scroll, new Rect(0f, 0f, cw - 16f, num2));
		Vector3 val = (((Object)(object)PlayerAvatar.instance != (Object)null) ? ((Component)PlayerAvatar.instance).transform.position : Vector3.zero);
		for (int i = 0; i < _blockCache.Count; i++)
		{
			LuckyBlock luckyBlock = _blockCache[i];
			if (!((Object)(object)luckyBlock == (Object)null))
			{
				bool flag = _selectedIndex == i + 1;
				Vector3 position = ((Component)luckyBlock).transform.position;
				float num3 = Vector3.Distance(position, val);
				GUI.color = (flag ? COL_SELECTED : COL_GOLD);
				GUI.Label(new Rect(0f, (float)i * 26f, cw - 16f, 22f), (flag ? "► " : "  ") + $"Block {i + 1}:  ({position.x:F1}, {position.y:F1}, {position.z:F1})  | {num3:F1}m  [ENTER=open]");
				GUI.color = Color.white;
			}
		}
		if (_blockCache.Count == 0)
		{
			GUI.color = COL_DIM;
			GUI.Label(new Rect(0f, 0f, cw - 16f, 22f), "  No lucky blocks in scene.");
			GUI.color = Color.white;
		}
		GUI.EndScrollView();
	}

	private void DrawItem(float cx, float cy, float cw, string label, int idx)
	{
		//IL_0016: 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)
		//IL_0029: 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)
		bool flag = _selectedIndex == idx;
		GUI.color = (flag ? COL_SELECTED : COL_NORMAL);
		GUI.Label(new Rect(cx, cy, cw, 22f), (flag ? "► " : "  ") + label);
		GUI.color = Color.white;
	}
}
public class LuckyBlock : MonoBehaviour
{
	private PhysGrabObject _grab;

	private PhysGrabObjectImpactDetector _impact;

	private bool _triggered;

	private void Awake()
	{
		RandomEventRoller.Init();
		_grab = ((Component)this).GetComponent<PhysGrabObject>();
		_impact = ((Component)this).GetComponent<PhysGrabObjectImpactDetector>();
	}

	private void Update()
	{
		if (!_triggered && SemiFunc.IsMasterClientOrSingleplayer() && (Object)(object)_grab != (Object)null && _grab.grabbed)
		{
			Trigger(ResolveGrabber());
		}
	}

	private void Open()
	{
		Trigger(ResolveGrabber());
	}

	private void Trigger(PlayerAvatar grabber)
	{
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		if (!_triggered)
		{
			_triggered = true;
			if ((Object)(object)grabber == (Object)null)
			{
				grabber = PlayerAvatar.instance;
			}
			Vector3 position = ((Component)this).transform.position;
			LuckyBlockEvents.Roll(grabber, position);
			if ((Object)(object)_impact != (Object)null)
			{
				_impact.DestroyObject(true);
			}
			else
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}
	}

	private PlayerAvatar ResolveGrabber()
	{
		//IL_007b: 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_0089: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)_grab != (Object)null && _grab.playerGrabbing != null && _grab.playerGrabbing.Count > 0)
		{
			PhysGrabber val = _grab.playerGrabbing[0];
			if ((Object)(object)val != (Object)null && (Object)(object)val.playerAvatar != (Object)null)
			{
				return val.playerAvatar;
			}
		}
		List<PlayerAvatar> list = SemiFunc.PlayerGetAllPlayerAvatarWithinRange(8f, ((Component)this).transform.position, false, default(LayerMask));
		if (list != null && list.Count > 0 && (Object)(object)list[0] != (Object)null)
		{
			return list[0];
		}
		return PlayerAvatar.instance;
	}
}
public static class LuckyBlockEvents
{
	public const float SPAWN_VALUABLE = 26f;

	public const float SPAWN_ITEM = 26f;

	public const float SPAWN_MONSTER = 9f;

	public const float SPAWN_POTION = 8f;

	public const float SPAWN_LUCKY_CLUSTER = 10f;

	public const float SPAWN_CLUSTER_SMALL = 8f;

	public const float SPAWN_CLUSTER_LARGE = 5f;

	public const float SPAWN_SINGLE_EXPLOSIVE = 8f;

	public static void TriggerSpecific(int eventIdx, PlayerAvatar player, Vector3 blockPos)
	{
		//IL_0034: 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_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: 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_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Unknown result type (might be due to invalid IL or missing references)
		//IL_018c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0135: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
		if (!SemiFunc.IsMasterClientOrSingleplayer())
		{
			return;
		}
		if ((Object)(object)player == (Object)null)
		{
			player = PlayerAvatar.instance;
		}
		if (!((Object)(object)player == (Object)null))
		{
			if (blockPos == Vector3.zero)
			{
				blockPos = ((Component)player).transform.position;
			}
			Vector3 spawnPositionInFront = SpawnUtils.GetSpawnPositionInFront(player, 2.5f);
			switch (eventIdx)
			{
			case 0:
				SpawnUtils.SpawnRandomValuable(spawnPositionInFront);
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Valuable: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
				break;
			case 1:
				SpawnUtils.SpawnRandomItem(spawnPositionInFront);
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Item: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
				break;
			case 2:
				SpawnUtils.SpawnRandomMonster(spawnPositionInFront, null);
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Monster: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
				break;
			case 3:
				SpawnUtils.SpawnPotion(spawnPositionInFront);
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Potion: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
				break;
			case 4:
				LuckyBlockManager.Instance?.SpawnBlocks(SpawnUtils.GetFloorRing(blockPos, 3, 2f));
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Lucky Cluster ×3", "[LuckyBlock]");
				break;
			case 5:
				SpawnUtils.SpawnExplosiveCluster(player);
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Small Cluster ×3", "[LuckyBlock]");
				break;
			case 6:
				SpawnUtils.SpawnLargeExplosiveCluster(blockPos);
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Large Cluster ×5", "[LuckyBlock]");
				break;
			case 7:
				SpawnUtils.SpawnRandomExplosive(SpawnUtils.GetSpawnPositionOnPlayer(player));
				RandomEventRoller.LogEvent("LuckyBlock [Voice] → Explosive: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
				break;
			default:
				Roll(player, blockPos);
				break;
			}
		}
	}

	public static void Roll(PlayerAvatar opener, Vector3 blockPos)
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_0108: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_017d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0215: Unknown result type (might be due to invalid IL or missing references)
		//IL_0217: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)opener == (Object)null)
		{
			opener = PlayerAvatar.instance;
		}
		if (!SemiFunc.IsMasterClientOrSingleplayer())
		{
			return;
		}
		PlayerAvatar val = opener ?? PlayerAvatar.instance;
		if (!((Object)(object)val == (Object)null))
		{
			if (blockPos == Vector3.zero)
			{
				blockPos = ((Component)val).transform.position;
			}
			Vector3 spawnPositionInFront = SpawnUtils.GetSpawnPositionInFront(val, 2.5f);
			float num = Random.value * 100f;
			float num2 = 0f;
			if (num < (num2 += 26f))
			{
				SpawnUtils.SpawnRandomValuable(spawnPositionInFront);
				RandomEventRoller.LogEvent("LuckyBlock → Valuable: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
			}
			else if (num < (num2 += 26f))
			{
				SpawnUtils.SpawnRandomItem(spawnPositionInFront);
				RandomEventRoller.LogEvent("LuckyBlock → Item: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
			}
			else if (num < (num2 += 9f))
			{
				SpawnUtils.SpawnRandomMonster(spawnPositionInFront, null);
				RandomEventRoller.LogEvent("LuckyBlock → Monster: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
			}
			else if (num < (num2 += 8f))
			{
				SpawnUtils.SpawnPotion(spawnPositionInFront);
				RandomEventRoller.LogEvent("LuckyBlock → Potion (breaks on floor): " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
			}
			else if (num < (num2 += 10f))
			{
				List<Vector3> floorRing = SpawnUtils.GetFloorRing(blockPos, 3, 2f);
				LuckyBlockManager.Instance?.SpawnBlocks(floorRing);
				RandomEventRoller.LogEvent("LuckyBlock → Lucky Cluster ×3 (3 new lucky blocks)", "[LuckyBlock]");
			}
			else if (num < (num2 += 8f))
			{
				SpawnUtils.SpawnExplosiveCluster(val);
				RandomEventRoller.LogEvent("LuckyBlock → Small Cluster ×3 (around player)", "[LuckyBlock]");
			}
			else if (num < (num2 += 5f))
			{
				SpawnUtils.SpawnLargeExplosiveCluster(blockPos);
				RandomEventRoller.LogEvent("LuckyBlock → Large Cluster ×5 (around block)", "[LuckyBlock]");
			}
			else
			{
				Vector3 spawnPositionOnPlayer = SpawnUtils.GetSpawnPositionOnPlayer(val);
				SpawnUtils.SpawnRandomExplosive(spawnPositionOnPlayer);
				RandomEventRoller.LogEvent("LuckyBlock → Explosive at feet: " + SpawnUtils.LastSpawnedName, "[LuckyBlock]");
			}
		}
	}
}
public class LuckyBlockItem : MonoBehaviour
{
	private bool _isLucky;

	internal bool _consumed;

	private bool _activatedLocal;

	private PhysGrabObject _grab;

	private PhotonView _view;

	internal bool IsLucky => _isLucky;

	private void Awake()
	{
		RandomEventRoller.Init();
		_grab = ((Component)this).GetComponent<PhysGrabObject>() ?? ((Component)this).GetComponentInParent<PhysGrabObject>();
		_view = ((Component)this).GetComponent<PhotonView>() ?? ((Component)this).GetComponentInParent<PhotonView>();
	}

	private void Update()
	{
		if (_isLucky && !_activatedLocal && !((Object)(object)_grab == (Object)null) && ModeManager.IsPrivate && _grab.grabbedLocal && SemiFunc.InputDown((InputKey)2))
		{
			Activate();
		}
	}

	internal void SetLucky()
	{
		MakeLucky();
		if (SemiFunc.IsMultiplayer() && (Object)(object)_view != (Object)null && _view.ViewID != 0)
		{
			_view.RPC("SetLuckyRPC", (RpcTarget)4, Array.Empty<object>());
		}
	}

	[PunRPC]
	private void SetLuckyRPC()
	{
		MakeLucky();
	}

	private void MakeLucky()
	{
		_isLucky = true;
		LuckyBlockSkin.Apply(((Component)this).gameObject, 1f / 6f);
	}

	private void Open()
	{
		Activate();
	}

	private void Activate()
	{
		if (!_activatedLocal)
		{
			_activatedLocal = true;
			int num = SemiFunc.PhotonViewIDPlayerAvatarLocal();
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				ActivateOnHost(((Component)this).gameObject, num);
			}
			else if ((Object)(object)_view != (Object)null && _view.ViewID != 0)
			{
				_view.RPC("ActivateRPC", (RpcTarget)2, new object[1] { num });
			}
		}
	}

	[PunRPC]
	private void ActivateRPC(int playerViewID)
	{
		ActivateOnHost(((Component)this).gameObject, playerViewID);
	}

	internal static void ActivateOnHost(GameObject item, int playerViewID)
	{
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)item == (Object)null || !SemiFunc.IsMasterClientOrSingleplayer())
		{
			return;
		}
		LuckyBlockItem component = item.GetComponent<LuckyBlockItem>();
		if ((Object)(object)component != (Object)null)
		{
			if (component._consumed)
			{
				return;
			}
			component._consumed = true;
		}
		PlayerAvatar opener = ResolvePlayer(playerViewID);
		Vector3 position = item.transform.position;
		LuckyBlockEvents.Roll(opener, position);
		if (SemiFunc.IsMultiplayer())
		{
			PhotonNetwork.Destroy(item);
		}
		else
		{
			Object.Destroy((Object)(object)item);
		}
	}

	private static PlayerAvatar ResolvePlayer(int viewID)
	{
		if (viewID > 0)
		{
			PhotonView val = PhotonView.Find(viewID);
			PlayerAvatar val2 = (((Object)(object)val != (Object)null) ? ((Component)val).GetComponent<PlayerAvatar>() : null);
			if ((Object)(object)val2 != (Object)null)
			{
				return val2;
			}
		}
		return PlayerAvatar.instance;
	}
}
[HarmonyPatch(typeof(ItemAttributes), "Awake")]
internal static class LuckyBlockItem_AttachPatch
{
	private static void Postfix(ItemAttributes __instance)
	{
		if (!((Object)(object)__instance == (Object)null))
		{
			string text = (((Object)(object)__instance.item != (Object)null) ? __instance.item.itemName : null);
			string value = "Drone Battery";
			if (((text != null && text.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0) || ((Object)((Component)__instance).gameObject).name.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0) && (Object)(object)((Component)__instance).GetComponent<LuckyBlockItem>() == (Object)null)
			{
				((Component)__instance).gameObject.AddComponent<LuckyBlockItem>();
			}
		}
	}
}
[HarmonyPatch(typeof(ItemAttributes), "GetItemNameLocalized")]
internal static class LuckyBlockItem_NamePatch
{
	private static void Postfix(ItemAttributes __instance, ref string __result)
	{
		LuckyBlockItem luckyBlockItem = (((Object)(object)__instance != (Object)null) ? ((Component)__instance).GetComponent<LuckyBlockItem>() : null);
		if ((Object)(object)luckyBlockItem != (Object)null && luckyBlockItem.IsLucky)
		{
			__result = "Lucky Block";
		}
	}
}
public class LuckyBlockManager : MonoBehaviour
{
	public static LuckyBlockManager Instance { get; private set; }

	private void Awake()
	{
		if ((Object)(object)Instance == (Object)null)
		{
			Instance = this;
		}
	}

	internal List<GameObject> SpawnBlocks(List<Vector3> positions)
	{
		List<GameObject> list = new List<GameObject>();
		if (positions == null || positions.Count == 0)
		{
			return list;
		}
		if (SemiFunc.IsMultiplayer() && !SemiFunc.IsMasterClientOrSingleplayer())
		{
			Debug.LogWarning((object)"[LuckyBlock] Only the host can spawn lucky blocks.");
			return list;
		}
		return ModeManager.IsPrivate ? SpawnPrivate(positions, list) : SpawnPublic(positions, list);
	}

	private List<GameObject> SpawnPrivate(List<Vector3> positions, List<GameObject> spawned)
	{
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: 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)
		if ((Object)(object)SpawnUtils.GetLuckyItem() == (Object)null)
		{
			Debug.LogError((object)"[LuckyBlock] PRIVATE mode: base item 'Drone Battery' not found. Switch back to Public mode (F6 menu).");
			return spawned;
		}
		foreach (Vector3 position in positions)
		{
			GameObject val = SpawnUtils.SpawnLuckyItem(position);
			if (!((Object)(object)val == (Object)null))
			{
				LuckyBlockItem componentInChildren = val.GetComponentInChildren<LuckyBlockItem>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					componentInChildren.SetLucky();
				}
				else
				{
					Debug.LogError((object)"[LuckyBlock] spawned item has no LuckyBlockItem component.");
				}
				spawned.Add(val);
				Debug.Log((object)$"[LuckyBlock] Lucky ITEM spawned at {position:F1} (private edition).");
			}
		}
		return spawned;
	}

	private List<GameObject> SpawnPublic(List<Vector3> positions, List<GameObject> spawned)
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: 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_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		foreach (Vector3 position in positions)
		{
			GameObject val = SpawnUtils.SpawnLuckyValuable(position);
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogError((object)$"[LuckyBlock] Failed to spawn lucky valuable at {position:F1}.");
				continue;
			}
			if ((Object)(object)val.GetComponent<LuckyBlock>() == (Object)null)
			{
				val.AddComponent<LuckyBlock>();
			}
			LuckyBlockSkin.Apply(val);
			if (SemiFunc.IsMultiplayer())
			{
				PhotonView component = val.GetComponent<PhotonView>();
				if ((Object)(object)component != (Object)null && component.ViewID != 0 && LuckyBlockPlugin.SkinEvent != null)
				{
					LuckyBlockPlugin.SkinEvent.RaiseEvent((object)component.ViewID, NetworkingEvents.RaiseOthers, SendOptions.SendReliable);
				}
			}
			spawned.Add(val);
			Debug.Log((object)$"[LuckyBlock] Lucky six-pack spawned at {position:F1}.");
		}
		return spawned;
	}

	internal void ClearBlocks()
	{
	}
}
public enum LuckyBlockMode
{
	PublicServer,
	PrivateServer
}
public static class ModeManager
{
	internal static ConfigEntry<LuckyBlockMode> EditionConfig;

	public static LuckyBlockMode CurrentEdition => (EditionConfig != null) ? EditionConfig.Value : LuckyBlockMode.PublicServer;

	public static bool IsPrivate => CurrentEdition == LuckyBlockMode.PrivateServer;

	public static void SetEdition(LuckyBlockMode mode)
	{
		if (EditionConfig != null)
		{
			EditionConfig.Value = mode;
		}
	}
}
[BepInPlugin("com.tonnom.luckyblock", "REPO_lucky_block", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class LuckyBlockPlugin : BaseUnityPlugin
{
	private static MonoBehaviour _coroutineHost;

	private Harmony _harmony;

	public static LuckyBlockPlugin Instance { get; private set; }

	internal static NetworkedEvent SkinEvent { get; private set; }

	private void Awake()
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Expected O, but got Unknown
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Expected O, but got Unknown
		Instance = this;
		_coroutineHost = (MonoBehaviour)(object)this;
		((Component)this).gameObject.AddComponent<LuckyBlockManager>();
		_harmony = new Harmony("com.tonnom.luckyblock");
		_harmony.PatchAll();
		SkinEvent = new NetworkedEvent("LuckyBlock Skin", (Action<EventData>)OnSkinEvent);
		ModeManager.EditionConfig = ((BaseUnityPlugin)this).Config.Bind<LuckyBlockMode>("General", "Edition", LuckyBlockMode.PublicServer, "PublicServer = host-only, no client install needed (lucky block is a valuable, grab it). PrivateServer = everyone must install the mod (lucky block is a custom item, press E).");
		SceneManager.sceneLoaded += OnSceneLoaded;
		((BaseUnityPlugin)this).Logger.LogInfo((object)$"[LuckyBlock] Plugin loaded — Manager alive: {(Object)(object)LuckyBlockManager.Instance != (Object)null}. F6 for debug menu.");
	}

	private static void OnSkinEvent(EventData e)
	{
		if (((e != null) ? e.CustomData : null) is int viewID)
		{
			StartManagedCoroutine(SkinWhenReady(viewID));
		}
	}

	private static IEnumerator SkinWhenReady(int viewID)
	{
		for (int i = 0; i < 120; i++)
		{
			PhotonView pv = PhotonView.Find(viewID);
			if ((Object)(object)pv != (Object)null)
			{
				LuckyBlockSkin.Apply(((Component)pv).gameObject);
				break;
			}
			yield return null;
		}
	}

	internal static void StartManagedCoroutine(IEnumerator routine)
	{
		if ((Object)(object)_coroutineHost != (Object)null)
		{
			_coroutineHost.StartCoroutine(routine);
		}
		else
		{
			Debug.LogWarning((object)"[LuckyBlock] CoroutineHost missing — coroutine dropped.");
		}
	}

	private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Expected O, but got Unknown
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Expected O, but got Unknown
		LuckyBlockManager.Instance?.ClearBlocks();
		if ((Object)(object)Object.FindObjectOfType<LuckyBlockStatusPanel>() == (Object)null)
		{
			GameObject val = new GameObject("LuckyBlock_StatusPanel");
			val.AddComponent<LuckyBlockStatusPanel>();
			Object.DontDestroyOnLoad((Object)(object)val);
		}
		if ((Object)(object)Object.FindObjectOfType<DebugMenu>() == (Object)null)
		{
			GameObject val2 = new GameObject("LuckyBlock_DebugMenu");
			val2.AddComponent<DebugMenu>();
			Object.DontDestroyOnLoad((Object)(object)val2);
		}
		LuckyBlockSpawner.ResetSpawnFlag();
		StartManagedCoroutine(BackupSpawnCoroutine());
	}

	private static IEnumerator BackupSpawnCoroutine()
	{
		yield return (object)new WaitForSeconds(1f);
		if ((Object)(object)RunManager.instance == (Object)null || !SemiFunc.RunIsLevel() || !SemiFunc.IsMasterClientOrSingleplayer())
		{
			yield break;
		}
		for (float waited = 0f; waited < 15f; waited += 0.5f)
		{
			if ((Object)(object)LevelGenerator.Instance != (Object)null && LevelGenerator.Instance.Generated)
			{
				break;
			}
			yield return (object)new WaitForSeconds(0.5f);
		}
		if (!((Object)(object)LevelGenerator.Instance == (Object)null) && LevelGenerator.Instance.Generated && SemiFunc.RunIsLevel())
		{
			LuckyBlockSpawner.SpawnForCurrentLevel("BackupCoroutine");
		}
	}
}
public class CoroutineHost : MonoBehaviour
{
}
internal static class LuckyBlockSkin
{
	private const string SKIN_NAME = "LuckyBlockSkin";

	private static Texture2D _tex;

	private static Material _mat;

	private static Mesh _cubeMesh;

	internal static void Apply(GameObject valuable, float scale = 1f)
	{
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Expected O, but got Unknown
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: 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_011f: 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)
		//IL_0141: Unknown result type (might be due to invalid IL or missing references)
		//IL_0154: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)valuable == (Object)null || (Object)(object)valuable.transform.Find("LuckyBlockSkin") != (Object)null)
		{
			return;
		}
		Material material = GetMaterial();
		Mesh cubeMesh = GetCubeMesh();
		if (!((Object)(object)material == (Object)null) && !((Object)(object)cubeMesh == (Object)null))
		{
			Bounds val = ComputeBounds(valuable);
			float num = Mathf.Max(new float[3]
			{
				((Bounds)(ref val)).size.x,
				((Bounds)(ref val)).size.y,
				((Bounds)(ref val)).size.z
			}) * 1.05f;
			if (num <= 0.001f)
			{
				num = 0.5f;
			}
			num = Mathf.Clamp(num, 0.2f, 1f) * scale;
			GameObject val2 = new GameObject("LuckyBlockSkin");
			val2.transform.SetParent(valuable.transform, false);
			val2.transform.localRotation = Quaternion.identity;
			val2.transform.position = ((Bounds)(ref val)).center;
			Vector3 lossyScale = valuable.transform.lossyScale;
			val2.transform.localScale = new Vector3(num / Mathf.Max(0.0001f, lossyScale.x), num / Mathf.Max(0.0001f, lossyScale.y), num / Mathf.Max(0.0001f, lossyScale.z));
			MeshFilter val3 = val2.AddComponent<MeshFilter>();
			val3.sharedMesh = cubeMesh;
			MeshRenderer val4 = val2.AddComponent<MeshRenderer>();
			((Renderer)val4).sharedMaterial = material;
		}
	}

	private static Bounds ComputeBounds(GameObject go)
	{
		//IL_0003: 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_00ca: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: 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)
		Bounds result = default(Bounds);
		bool flag = false;
		Renderer[] componentsInChildren = go.GetComponentsInChildren<Renderer>();
		foreach (Renderer val in componentsInChildren)
		{
			if (!((Object)(object)val == (Object)null) && !(((Object)((Component)val).gameObject).name == "LuckyBlockSkin") && (val is MeshRenderer || val is SkinnedMeshRenderer))
			{
				if (!flag)
				{
					result = val.bounds;
					flag = true;
				}
				else
				{
					((Bounds)(ref result)).Encapsulate(val.bounds);
				}
			}
		}
		if (!flag)
		{
			((Bounds)(ref result))..ctor(go.transform.position, Vector3.one * 0.5f);
		}
		return result;
	}

	private static Mesh GetCubeMesh()
	{
		if ((Object)(object)_cubeMesh != (Object)null)
		{
			return _cubeMesh;
		}
		GameObject val = GameObject.CreatePrimitive((PrimitiveType)3);
		_cubeMesh = val.GetComponent<MeshFilter>().sharedMesh;
		Object.Destroy((Object)(object)val);
		return _cubeMesh;
	}

	private static Material GetMaterial()
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Expected O, but got Unknown
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)_mat != (Object)null)
		{
			return _mat;
		}
		Texture2D texture = GetTexture();
		Shader val = Shader.Find("Standard");
		if ((Object)(object)val == (Object)null)
		{
			return null;
		}
		_mat = new Material(val)
		{
			name = "LuckyBlockMat",
			mainTexture = (Texture)(object)texture
		};
		_mat.SetFloat("_Glossiness", 0.1f);
		_mat.SetFloat("_Metallic", 0f);
		_mat.EnableKeyword("_EMISSION");
		_mat.SetColor("_EmissionColor", new Color(0.3f, 0.24f, 0f));
		if ((Object)(object)texture != (Object)null)
		{
			_mat.SetTexture("_EmissionMap", (Texture)(object)texture);
		}
		return _mat;
	}

	private static Texture2D GetTexture()
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Expected O, but got Unknown
		if ((Object)(object)_tex != (Object)null)
		{
			return _tex;
		}
		_tex = new Texture2D(2, 2, (TextureFormat)4, false);
		string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)LuckyBlockPlugin.Instance).Info.Location);
		string text = Path.Combine(directoryName, "lucky_block.png");
		if (File.Exists(text))
		{
			ImageConversion.LoadImage(_tex, File.ReadAllBytes(text));
			((Texture)_tex).filterMode = (FilterMode)0;
			((Texture)_tex).wrapMode = (TextureWrapMode)1;
			_tex.Apply();
		}
		else
		{
			Debug.LogError((object)("[LuckyBlock] Skin texture not found at '" + text + "'. Block will be untextured."));
		}
		return _tex;
	}
}
[HarmonyPatch(typeof(SemiFunc), "OnLevelGenDone")]
internal static class OnLevelGenDone_Patch
{
	private static void Postfix()
	{
		try
		{
			if (!((Object)(object)RunManager.instance == (Object)null) && SemiFunc.RunIsLevel() && SemiFunc.IsMasterClientOrSingleplayer())
			{
				LuckyBlockSpawner.SpawnForCurrentLevel("OnLevelGenDone");
			}
		}
		catch (Exception arg)
		{
			Debug.LogError((object)$"[LuckyBlock] Spawn postfix failed (ignored): {arg}");
		}
	}
}
internal static class LuckyBlockSpawner
{
	private const float MIN_BLOCK_SPACING = 4f;

	private static bool _spawnedThisLoad;

	internal static void ResetSpawnFlag()
	{
		_spawnedThisLoad = false;
	}

	internal static void SpawnForCurrentLevel(string caller = "?")
	{
		//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: 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_01dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fc: 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_023f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0249: 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_02c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_032f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0339: Unknown result type (might be due to invalid IL or missing references)
		if (_spawnedThisLoad)
		{
			Debug.Log((object)("[LuckyBlock] SpawnForCurrentLevel(" + caller + "): already spawned — skip."));
			return;
		}
		if ((Object)(object)LuckyBlockManager.Instance == (Object)null)
		{
			Debug.LogError((object)"[LuckyBlock] LuckyBlockManager.Instance is null — cannot spawn.");
			return;
		}
		_spawnedThisLoad = true;
		int currentLevel = GetCurrentLevel();
		int blockCount = GetBlockCount(currentLevel);
		Debug.Log((object)$"[LuckyBlock] Spawning {blockCount} block(s) for level {currentLevel} (caller: {caller}).");
		List<LevelPoint> list = new List<LevelPoint>();
		if ((Object)(object)LevelGenerator.Instance != (Object)null)
		{
			foreach (LevelPoint levelPathPoint in LevelGenerator.Instance.LevelPathPoints)
			{
				if ((Object)(object)levelPathPoint != (Object)null && !levelPathPoint.Truck && (Object)(object)((Component)levelPathPoint).GetComponentInParent<StartRoom>() == (Object)null)
				{
					list.Add(levelPathPoint);
				}
			}
		}
		Debug.Log((object)$"[LuckyBlock] Found {list.Count} interior LevelPathPoint(s).");
		if (list.Count == 0)
		{
			FallbackSpawn(blockCount);
			return;
		}
		for (int num = list.Count - 1; num > 0; num--)
		{
			int index = Random.Range(0, num + 1);
			LevelPoint value = list[num];
			list[num] = list[index];
			list[index] = value;
		}
		List<Vector3> list2 = new List<Vector3>();
		List<Vector3> list3 = new List<Vector3>();
		foreach (LevelPoint item in list)
		{
			if (list2.Count >= blockCount)
			{
				break;
			}
			Vector3 val = ((Component)item).transform.position + Vector3.up * 0.5f;
			bool flag = false;
			foreach (Vector3 item2 in list3)
			{
				if (Vector3.Distance(val, item2) < 4f)
				{
					flag = true;
					break;
				}
			}
			if (!flag)
			{
				list2.Add(val);
				list3.Add(val);
			}
		}
		if (list2.Count < blockCount)
		{
			foreach (LevelPoint item3 in list)
			{
				if (list2.Count >= blockCount)
				{
					break;
				}
				Vector3 val2 = ((Component)item3).transform.position + Vector3.up * 0.5f;
				bool flag2 = false;
				foreach (Vector3 item4 in list3)
				{
					if (Vector3.Distance(val2, item4) < 0.5f)
					{
						flag2 = true;
						break;
					}
				}
				if (!flag2)
				{
					list2.Add(val2);
					list3.Add(val2);
				}
			}
		}
		LuckyBlockManager.Instance.SpawnBlocks(list2);
		Debug.Log((object)$"[LuckyBlock] Sent {list2.Count}/{blockCount} block position(s) to manager.");
	}

	internal static GameObject SpawnOne(Vector3 pos)
	{
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)LuckyBlockManager.Instance == (Object)null)
		{
			Debug.LogError((object)"[LuckyBlock] SpawnOne: LuckyBlockManager.Instance is null.");
			return null;
		}
		List<GameObject> list = LuckyBlockManager.Instance.SpawnBlocks(new List<Vector3> { pos });
		return (list.Count > 0) ? list[0] : null;
	}

	internal static int GetCurrentLevel()
	{
		return Mathf.Clamp(SemiFunc.RunGetLevelsCompleted() + 1, 1, 20);
	}

	private static int GetBlockCount(int level)
	{
		int[] array = new int[4] { 2, 5, 7, 9 };
		int num = ((level <= array.Length) ? array[level - 1] : (array[^1] + (level - array.Length) * 2));
		return Mathf.Max(1, num + Random.Range(-1, 2));
	}

	private static void FallbackSpawn(int count)
	{
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: 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_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		Debug.LogWarning((object)"[LuckyBlock] No interior LevelPathPoints — using fallback ring.");
		PlayerAvatar instance = PlayerAvatar.instance;
		if (!((Object)(object)instance == (Object)null) && !((Object)(object)LuckyBlockManager.Instance == (Object)null))
		{
			List<Vector3> list = new List<Vector3>(count);
			Vector3 val = default(Vector3);
			RaycastHit val3 = default(RaycastHit);
			for (int i = 0; i < count; i++)
			{
				float num = (float)i * (360f / (float)count) * ((float)Math.PI / 180f);
				float num2 = 6f + (float)i * 1.5f;
				((Vector3)(ref val))..ctor(Mathf.Cos(num) * num2, 0f, Mathf.Sin(num) * num2);
				Vector3 val2 = ((Component)instance).transform.position + val + Vector3.up * 5f;
				Vector3 item = (Physics.Raycast(val2, Vector3.down, ref val3, 12f) ? (((RaycastHit)(ref val3)).point + Vector3.up * 0.4f) : (((Component)instance).transform.position + val + Vector3.up * 0.4f));
				list.Add(item);
			}
			LuckyBlockManager.Instance.SpawnBlocks(list);
		}
	}
}
public class LuckyBlockStatusPanel : MonoBehaviour
{
	private const float PANEL_W = 340f;

	private const float LINE_H = 18f;

	private const float PAD = 6f;

	private const float UPDATE_INTERVAL = 0.25f;

	private readonly List<Transform> _blocks = new List<Transform>();

	private float _nextUpdate = 0f;

	public static LuckyBlockStatusPanel Instance { get; private set; }

	private void Awake()
	{
		if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
		else
		{
			Instance = this;
		}
	}

	private void Update()
	{
		if (Time.time < _nextUpdate)
		{
			return;
		}
		_nextUpdate = Time.time + 0.25f;
		_blocks.Clear();
		LuckyBlock[] array = Object.FindObjectsOfType<LuckyBlock>();
		foreach (LuckyBlock luckyBlock in array)
		{
			if ((Object)(object)luckyBlock != (Object)null)
			{
				_blocks.Add(((Component)luckyBlock).transform);
			}
		}
		LuckyBlockItem[] array2 = Object.FindObjectsOfType<LuckyBlockItem>();
		foreach (LuckyBlockItem luckyBlockItem in array2)
		{
			if ((Object)(object)luckyBlockItem != (Object)null && luckyBlockItem.IsLucky)
			{
				_blocks.Add(((Component)luckyBlockItem).transform);
			}
		}
	}

	private void OnGUI()
	{
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: 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_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0135: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_016d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
		float num = 1 + ((_blocks.Count <= 0) ? 1 : _blocks.Count);
		float num2 = 12f + num * 18f;
		float num3 = (float)Screen.width - 340f - 10f;
		float num4 = 10f;
		GUI.Box(new Rect(num3, num4, 340f, num2), "");
		float num5 = num3 + 6f;
		float num6 = num4 + 6f;
		float num7 = 328f;
		GUI.Label(new Rect(num5, num6, num7, 18f), $"<color=yellow><b>[ LUCKY BLOCKS ON MAP: {_blocks.Count} ]</b></color>");
		num6 += 18f;
		if (_blocks.Count == 0)
		{
			GUI.color = new Color(1f, 1f, 1f, 0.4f);
			GUI.Label(new Rect(num5, num6, num7, 18f), "  No blocks in scene.");
			GUI.color = Color.white;
			return;
		}
		Vector3 val = (((Object)(object)PlayerAvatar.instance != (Object)null) ? ((Component)PlayerAvatar.instance).transform.position : Vector3.zero);
		for (int i = 0; i < _blocks.Count; i++)
		{
			Transform val2 = _blocks[i];
			if (!((Object)(object)val2 == (Object)null))
			{
				Vector3 position = val2.position;
				float num8 = Vector3.Distance(position, val);
				string arg = ((num8 < 10f) ? "lime" : ((num8 < 25f) ? "yellow" : "red"));
				GUI.Label(new Rect(num5, num6, num7, 18f), $"  <color=white>#{i + 1}</color>  " + $"<color=cyan>({position.x:F1}, {position.y:F1}, {position.z:F1})</color>  " + $"<color={arg}>{num8:F1} m</color>");
				num6 += 18f;
			}
		}
	}
}
public static class RandomEventRoller
{
	public struct EventLogEntry
	{
		public string Label;

		public string PlayerName;

		public string Timestamp;
	}

	public const float HP_CHANCE = 31f;

	public const float BOOMBOX_CHANCE = 10f;

	public const float BOOMBOX_DURATION = 20f;

	public const float SPAWN_GATE = 85f;

	public const float MONSTER_CHANCE = 12f;

	public const float ITEM_CHANCE = 24f;

	public const float EXPLOSIVE_CHANCE = 19f;

	public const float EXPLOSIVE_CLUSTER_CHANCE = 6f;

	public const float VALUABLE_CHANCE = 29f;

	public const float SPAWN_COOLDOWN = 3f;

	public const float GLOBAL_SPIKE_COOLDOWN = 2f;

	public const float SUSTAINED_THRESHOLD = 4f;

	public const float SUSTAINED_COOLDOWN = 2f;

	private static bool _initialized;

	private static FieldInfo _fieldMaxHealth;

	private static FieldInfo _fieldGodMode;

	private static MethodInfo _methodHurtOther;

	private static FieldInfo _fieldTumble;

	private static FieldInfo _fieldIsTumbling;

	public static bool AntiSpamEnabled = false;

	public static readonly List<EventLogEntry> EventLog = new List<EventLogEntry>();

	private static AudioClip _boomboxClip;

	public static void LogEvent(string label, string playerName)
	{
		EventLog.Insert(0, new EventLogEntry
		{
			Label = label,
			PlayerName = playerName,
			Timestamp = DateTime.Now.ToString("HH:mm:ss")
		});
		if (EventLog.Count > 3)
		{
			EventLog.RemoveAt(3);
		}
	}

	public static void Init()
	{
		if (!_initialized)
		{
			Type typeFromHandle = typeof(PlayerHealth);
			_fieldMaxHealth = typeFromHandle.GetField("maxHealth", BindingFlags.Instance | BindingFlags.NonPublic);
			_fieldGodMode = typeFromHandle.GetField("godMode", BindingFlags.Instance | BindingFlags.NonPublic);
			_methodHurtOther = typeFromHandle.GetMethod("HurtOther", BindingFlags.Instance | BindingFlags.Public);
			Type typeFromHandle2 = typeof(PlayerAvatar);
			_fieldTumble = typeFromHandle2.GetField("tumble", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			_fieldIsTumbling = typeFromHandle2.GetField("isTumbling", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			_initialized = true;
		}
	}

	public static void RollOnSpikeStart(PlayerAvatar avatar, PlayerHealth pHealth, float currentDb, float threshold, ref float spawnCooldown, MonoBehaviour context, bool isMasterClient, string playerName = "[?]")
	{
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: 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_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0134: Unknown result type (might be due to invalid IL or missing references)
		//IL_018d: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)avatar == (Object)null || (Object)(object)pHealth == (Object)null)
		{
			return;
		}
		if ((!(_fieldGodMode != null) || !(bool)_fieldGodMode.GetValue(pHealth)) && Random.value * 100f <= 31f)
		{
			ApplyDamage(pHealth, currentDb, threshold, playerName);
		}
		if (isMasterClient && spawnCooldown <= 0f && Random.value * 100f <= 85f)
		{
			Vector3 spawnPositionInFront = SpawnUtils.GetSpawnPositionInFront(avatar);
			Vector3 spawnPositionOnPlayer = SpawnUtils.GetSpawnPositionOnPlayer(avatar);
			float num = Random.value * 100f;
			if (num < 12f)
			{
				SpawnUtils.SpawnRandomMonster(spawnPositionInFront, context);
				LogEvent("Monster: " + SpawnUtils.LastSpawnedName, playerName);
			}
			else if (num < 36f)
			{
				SpawnUtils.SpawnRandomItem(spawnPositionInFront);
				LogEvent("Item: " + SpawnUtils.LastSpawnedName, playerName);
			}
			else if (num < 55f)
			{
				SpawnUtils.SpawnRandomExplosive(spawnPositionOnPlayer);
				LogEvent("Explosive: " + SpawnUtils.LastSpawnedName, playerName);
			}
			else if (num < 61f)
			{
				SpawnUtils.SpawnExplosiveCluster(avatar);
				LogEvent("Cluster ×3", playerName);
			}
			else if (num < 90f)
			{
				SpawnUtils.SpawnRandomValuable(spawnPositionInFront);
				LogEvent("Valuable: " + SpawnUtils.LastSpawnedName, playerName);
			}
			spawnCooldown = 3f;
		}
	}

	public static void ApplySustainedPenalty(PlayerHealth pHealth, string playerName)
	{
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)pHealth == (Object)null) && !(_methodHurtOther == null) && (!(_fieldGodMode != null) || !(bool)_fieldGodMode.GetValue(pHealth)))
		{
			int num = 100;
			if (_fieldMaxHealth != null)
			{
				num = (int)_fieldMaxHealth.GetValue(pHealth);
			}
			int num2 = Mathf.Max(1, Mathf.RoundToInt((float)num * 0.5f));
			_methodHurtOther.Invoke(pHealth, new object[5]
			{
				num2,
				Vector3.zero,
				false,
				-1,
				false
			});
			LogEvent($"SUSTAINED -{num2} HP (50%)", playerName);
			Debug.Log((object)$"[DontScream] Sustained penalty: {num2} HP (50% of {num})");
		}
	}

	public static void ForceTumble(PlayerAvatar avatar, string playerName = "[DEV]", bool ignoreAlreadyTumbling = false)
	{
		if (!((Object)(object)avatar == (Object)null) && !(_fieldTumble == null))
		{
			object? value = _fieldTumble.GetValue(avatar);
			PlayerTumble val = (PlayerTumble)((value is PlayerTumble) ? value : null);
			if (!((Object)(object)val == (Object)null) && (ignoreAlreadyTumbling || !(_fieldIsTumbling != null) || !(bool)_fieldIsTumbling.GetValue(avatar)))
			{
				val.TumbleSet(true, false);
				LogEvent("Tumble", playerName);
			}
		}
	}

	private static AudioClip FindBoomboxClip()
	{
		if ((Object)(object)_boomboxClip != (Object)null)
		{
			return _boomboxClip;
		}
		ValuableBoombox val = Object.FindObjectOfType<ValuableBoombox>();
		if (val != null && val.soundBoomboxMusic?.Sounds?.Length > 0)
		{
			return _boomboxClip = val.soundBoomboxMusic.Sounds[0];
		}
		foreach (PrefabRef allValuable in Valuables.AllValuables)
		{
			if (((PrefabRef<GameObject>)(object)allValuable).PrefabName.IndexOf("Boombox", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				GameObject prefab = ((PrefabRef<GameObject>)(object)allValuable).Prefab;
				ValuableBoombox val2 = ((prefab != null) ? prefab.GetComponent<ValuableBoombox>() : null);
				if (val2 != null && val2.soundBoomboxMusic?.Sounds?.Length > 0)
				{
					return _boomboxClip = val2.soundBoomboxMusic.Sounds[0];
				}
			}
		}
		return null;
	}

	public static void ForceBoomboxDance(PlayerAvatar avatar, float duration, MonoBehaviour context, string playerName)
	{
		if (!((Object)(object)avatar == (Object)null) && !((Object)(object)avatar.playerExpression == (Object)null))
		{
			context.StartCoroutine(BoomboxDanceCoroutine(avatar, duration));
			LogEvent("Boombox Dance", playerName);
		}
	}

	private static IEnumerator BoomboxDanceCoroutine(PlayerAvatar avatar, float duration)
	{
		if ((Object)(object)avatar == (Object)null)
		{
			yield break;
		}
		AudioClip clip = FindBoomboxClip();
		AudioSource musicSrc = null;
		if ((Object)(object)clip != (Object)null)
		{
			GameObject musicObj = new GameObject("BoomboxDanceMusic");
			musicObj.transform.SetParent(((Component)avatar).transform);
			musicObj.transform.localPosition = Vector3.up * 1.5f;
			musicSrc = musicObj.AddComponent<AudioSource>();
			musicSrc.clip = clip;
			musicSrc.loop = true;
			musicSrc.spatialBlend = 1f;
			musicSrc.minDistance = 2f;
			musicSrc.maxDistance = 20f;
			musicSrc.volume = 1.2f;
			musicSrc.Play();
		}
		float elapsed = 0f;
		while (elapsed < duration && !((Object)(object)avatar == (Object)null) && !((Object)(object)avatar.playerExpression == (Object)null))
		{
			float sine = Mathf.Sin(Time.time * 15f);
			float headTilt = sine * 25f;
			avatar.playerExpression.OverrideExpressionSet(4, 100f);
			if ((Object)(object)avatar.playerAvatarVisuals != (Object)null)
			{
				avatar.playerAvatarVisuals.HeadTiltOverride(headTilt * 0.5f);
			}
			if ((Object)(object)avatar == (Object)(object)PlayerAvatar.instance)
			{
				if ((Object)(object)CameraAim.Instance != (Object)null)
				{
					CameraAim.Instance.AdditiveAimY(sine * 0.5f);
				}
				if ((Object)(object)PlayerExpressionsUI.instance?.playerExpression != (Object)null)
				{
					PlayerExpressionsUI.instance.playerExpression.OverrideExpressionSet(4, 100f);
				}
				if ((Object)(object)PlayerExpressionsUI.instance?.playerAvatarVisuals != (Object)null)
				{
					PlayerExpressionsUI.instance.playerAvatarVisuals.HeadTiltOverride(headTilt * 0.5f);
				}
			}
			elapsed += Time.deltaTime;
			yield return null;
		}
		if ((Object)(object)musicSrc != (Object)null)
		{
			Object.Destroy((Object)(object)((Component)musicSrc).gameObject);
		}
	}

	public static void ForceHPLoss(PlayerHealth pHealth, string playerName = "[DEV]")
	{
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)pHealth == (Object)null) && !(_methodHurtOther == null))
		{
			int num = 100;
			if (_fieldMaxHealth != null)
			{
				num = (int)_fieldMaxHealth.GetValue(pHealth);
			}
			int num2 = Mathf.Max(1, Mathf.RoundToInt((float)num * 0.1f));
			_methodHurtOther.Invoke(pHealth, new object[5]
			{
				num2,
				Vector3.zero,
				false,
				-1,
				false
			});
			LogEvent($"[DEV] HP -{num2}", playerName);
		}
	}

	public static void ForceTumbleLock(PlayerAvatar avatar, float duration = 3f, string playerName = "[LuckyBlock]")
	{
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)avatar == (Object)null || _fieldTumble == null)
		{
			return;
		}
		object? value = _fieldTumble.GetValue(avatar);
		PlayerTumble val = (PlayerTumble)((value is PlayerTumble) ? value : null);
		if (!((Object)(object)val == (Object)null))
		{
			if ((Object)(object)avatar.playerHealth != (Object)null && _methodHurtOther != null)
			{
				_methodHurtOther.Invoke(avatar.playerHealth, new object[5]
				{
					1,
					Vector3.zero,
					false,
					-1,
					false
				});
			}
			val.TumbleRequest(true, false);
			val.TumbleOverrideTime(duration);
			LogEvent($"Tumble lock {duration:F0}s", playerName);
		}
	}

	private static void ApplyDamage(PlayerHealth pHealth, float currentDb, float threshold, string playerName)
	{
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)pHealth == (Object)null) && !(_methodHurtOther == null))
		{
			float num = Mathf.Clamp((Mathf.Ceil(currentDb) - threshold) * 11f, 0f, 100f) / 100f;
			int num2 = 100;
			if (_fieldMaxHealth != null)
			{
				num2 = (int)_fieldMaxHealth.GetValue(pHealth);
			}
			int num3 = Mathf.Max(1, Mathf.RoundToInt((float)num2 * num));
			_methodHurtOther.Invoke(pHealth, new object[5]
			{
				num3,
				Vector3.zero,
				false,
				-1,
				false
			});
			LogEvent($"HP -{num3} ({num * 100f:F0}%) | {currentDb:F1} dB", playerName);
			Debug.Log((object)$"[DontScream] Spike HP: {num3} HP ({num * 100f:F0}%) | db={currentDb:F1} threshold={threshold:F1}");
		}
	}

	public static void KillPlayer(PlayerHealth pHealth, string playerName)
	{
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)pHealth == (Object)null) && !(_methodHurtOther == null) && (!(_fieldGodMode != null) || !(bool)_fieldGodMode.GetValue(pHealth)))
		{
			_methodHurtOther.Invoke(pHealth, new object[5]
			{
				99999,
				Vector3.zero,
				false,
				-1,
				false
			});
			LogEvent("ANTI-SPAM: KILLED", playerName);
			Debug.Log((object)"[DontScream] Anti-spam kill applied.");
		}
	}
}
internal static class SpawnUtils
{
	internal static bool _spawning = false;

	internal static string LastStatus = "idle";

	internal static string LastSpawnedName = "";

	private static readonly string[] LuckyValuableTerms = new string[4] { "Arctic Sample Six Pack", "Sample Six Pack", "Six Pack", "SixPack" };

	private static PrefabRef _luckyValuable;

	private static readonly string[] ValuableSearchTerms = new string[3] { "Boombox", "Museum Boombox", "Museum" };

	private static readonly string[] ItemSearchTerms = new string[3] { "Gun Laser", "Laser Gun", "Photon Blaster" };

	private static readonly string[] EnemySearchTerms = new string[1] { "Robe" };

	private static List<PrefabRef> _potions;

	internal const string PrivateBaseItem = "Drone Battery";

	private static Item _luckyItem;

	internal static PrefabRef GetLuckyValuable()
	{
		if (_luckyValuable != null)
		{
			return _luckyValuable;
		}
		string[] luckyValuableTerms = LuckyValuableTerms;
		foreach (string term in luckyValuableTerms)
		{
			PrefabRef val = SearchPrefabList(Valuables.AllValuables, term);
			if (val != null)
			{
				_luckyValuable = val;
				Debug.Log((object)("[LuckyBlock] Using valuable '" + ((PrefabRef<GameObject>)(object)val).PrefabName + "' for lucky blocks."));
				return val;
			}
		}
		Debug.LogWarning((object)"[LuckyBlock] Lucky valuable not found. Candidates with 'Sample'/'Six':");
		foreach (PrefabRef allValuable in Valuables.AllValuables)
		{
			string prefabName = ((PrefabRef<GameObject>)(object)allValuable).PrefabName;
			if (prefabName.IndexOf("Sample", StringComparison.OrdinalIgnoreCase) >= 0 || prefabName.IndexOf("Six", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				Debug.LogWarning((object)("[LuckyBlock]   candidate: " + prefabName));
			}
		}
		return null;
	}

	internal static GameObject SpawnLuckyValuable(Vector3 pos)
	{
		//IL_0033: 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_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		PrefabRef luckyValuable = GetLuckyValuable();
		if (luckyValuable == null)
		{
			return null;
		}
		GameObject result = ((!SemiFunc.IsMultiplayer()) ? Object.Instantiate<GameObject>(((PrefabRef<GameObject>)(object)luckyValuable).Prefab, pos, Quaternion.identity) : Valuables.SpawnValuable(luckyValuable, pos, Quaternion.identity));
		LastSpawnedName = ((PrefabRef<GameObject>)(object)luckyValuable).PrefabName;
		return result;
	}

	internal static Vector3 GetSpawnPositionOnPlayer(PlayerAvatar avatar)
	{
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: 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_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//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_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)avatar == (Object)null)
		{
			return Vector3.zero;
		}
		Vector3 val = ((Component)avatar).transform.position + Vector3.up * 2f;
		RaycastHit val2 = default(RaycastHit);
		if (Physics.Raycast(val, Vector3.down, ref val2, 5f))
		{
			return ((RaycastHit)(ref val2)).point + Vector3.up * 0.15f;
		}
		return ((Component)avatar).transform.position + Vector3.up * 0.5f;
	}

	internal static Vector3 GetSpawnPositionInFront(PlayerAvatar avatar, float dist = 3f)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: 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_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: 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_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: 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_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0108: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: 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)
		//IL_00cf: 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_00e3: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)avatar == (Object)null)
		{
			return Vector3.zero;
		}
		Vector3 val = (((Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.forward : ((Component)avatar).transform.forward);
		Vector3 forward = default(Vector3);
		((Vector3)(ref forward))..ctor(val.x, 0f, val.z);
		if (((Vector3)(ref forward)).sqrMagnitude < 0.001f)
		{
			forward = ((Component)avatar).transform.forward;
		}
		((Vector3)(ref forward)).Normalize();
		Vector3 val2 = ((Component)avatar).transform.position + forward * dist + Vector3.up * 2f;
		RaycastHit val3 = default(RaycastHit);
		if (Physics.Raycast(val2, Vector3.down, ref val3, 5f))
		{
			return ((RaycastHit)(ref val3)).point + Vector3.up * 0.15f;
		}
		return ((Component)avatar).transform.position + forward * dist + Vector3.up * 0.5f;
	}

	internal static void SpawnRandomMonster(Vector3 pos, MonoBehaviour context)
	{
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		List<EnemySetup> list = new List<EnemySetup>();
		foreach (EnemySetup allEnemy in Enemies.AllEnemies)
		{
			if (!((Object)allEnemy).name.StartsWith("Enemy Group"))
			{
				list.Add(allEnemy);
			}
		}
		if (list.Count == 0)
		{
			LastStatus = "SpawnRandomMonster: no enemies available";
			return;
		}
		EnemySetup val = list[Random.Range(0, list.Count)];
		LastSpawnedName = ((Object)val).name.Replace("Enemy - ", "").Trim();
		LastStatus = $"Random monster: {((Object)val).name} at {pos:F0}";
		Debug.Log((object)("[SpawnUtils] " + LastStatus));
		SpawnSpecificEnemy(val, pos, context);
	}

	internal static void SpawnRandomItem(Vector3 pos)
	{
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
		List<Item> list = new List<Item>();
		foreach (Item allItem in Items.AllItems)
		{
			string text = ((Object)allItem).name.ToLowerInvariant();
			if (!text.Contains("grenade") && !text.Contains("mine"))
			{
				list.Add(allItem);
			}
		}
		if (list.Count == 0)
		{
			LastStatus = "SpawnRandomItem: no items available";
			return;
		}
		Item val = list[Random.Range(0, list.Count)];
		LastSpawnedName = ((Object)val).name.Replace("Item ", "").Trim();
		LastStatus = $"Random item: {((Object)val).name} at {pos:F0}";
		Debug.Log((object)("[SpawnUtils] " + LastStatus));
		SpawnSpecificItem(val, pos);
	}

	internal static void SpawnRandomExplosive(Vector3 pos)
	{
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		List<Item> list = new List<Item>();
		foreach (Item allItem in Items.AllItems)
		{
			string text = ((Object)allItem).name.ToLowerInvariant();
			if ((text.Contains("grenade") || text.Contains("bomb")) && !text.Contains("mine"))
			{
				list.Add(allItem);
			}
		}
		if (list.Count == 0)
		{
			LastStatus = "SpawnRandomExplosive: no grenade/bomb in item list";
			Debug.LogWarning((object)("[SpawnUtils] " + LastStatus));
			return;
		}
		Item val = list[Random.Range(0, list.Count)];
		LastSpawnedName = ((Object)val).name.Replace("Item ", "").Trim();
		LastStatus = $"Explosive: {((Object)val).name} at {pos:F0}";
		Debug.Log((object)("[SpawnUtils] " + LastStatus));
		GameObject val2 = ((!SemiFunc.IsMultiplayer()) ? Object.Instantiate<GameObject>(((PrefabRef<GameObject>)(object)val.prefab).Prefab, pos, Quaternion.identity) : Items.SpawnItem(val, pos, Quaternion.identity));
		if (!((Object)(object)val2 == (Object)null))
		{
			ActivateIfExplosive(val2);
			ItemGrenade componentInChildren = val2.GetComponentInChildren<ItemGrenade>();
			if ((Object)(object)componentInChildren != (Object)null)
			{
				componentInChildren.tickTime = 0.5f;
			}
		}
	}

	internal static void SpawnPotion(Vector3 groundPos)
	{
		//IL_00c7: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		if (_potions == null)
		{
			_potions = new List<PrefabRef>();
			foreach (PrefabRef allValuable in Valuables.AllValuables)
			{
				if (((PrefabRef<GameObject>)(object)allValuable).PrefabName.IndexOf("potion", StringComparison.OrdinalIgnoreCase) >= 0)
				{
					_potions.Add(allValuable);
				}
			}
		}
		if (_potions.Count == 0)
		{
			LastStatus = "SpawnPotion: no valuable containing 'potion' found";
			Debug.LogWarning((object)("[SpawnUtils] " + LastStatus));
			return;
		}
		PrefabRef val = _potions[Random.Range(0, _potions.Count)];
		Vector3 val2 = groundPos + Vector3.up * 1.2f;
		GameObject val3 = ((!SemiFunc.IsMultiplayer()) ? Object.Instantiate<GameObject>(((PrefabRef<GameObject>)(object)val).Prefab, val2, Quaternion.identity) : Valuables.SpawnValuable(val, val2, Quaternion.identity));
		LastSpawnedName = ((PrefabRef<GameObject>)(object)val).PrefabName.Replace("Valuable ", "").Trim();
		LastStatus = "Potion dropped: " + ((PrefabRef<GameObject>)(object)val).PrefabName;
		if ((Object)(object)val3 != (Object)null)
		{
			LuckyBlockPlugin.StartManagedCoroutine(BreakPotionAfter(val3, 0.6f));
		}
	}

	private static IEnumerator BreakPotionAfter(GameObject potion, float delay)
	{
		yield return (object)new WaitForSeconds(delay);
		if (!((Object)(object)potion == (Object)null) && SemiFunc.IsMasterClientOrSingleplayer())
		{
			PhysGrabObjectImpactDetector impact = potion.GetComponentInChildren<PhysGrabObjectImpactDetector>();
			if ((Object)(object)impact != (Object)null)
			{
				impact.BreakHeavy(potion.transform.position, true, 0f);
			}
			else
			{
				Object.Destroy((Object)(object)potion);
			}
		}
	}

	internal static Item GetLuckyItem()
	{
		if ((Object)(object)_luckyItem != (Object)null)
		{
			return _luckyItem;
		}
		foreach (Item allItem in Items.AllItems)
		{
			if ((Object)(object)allItem == (Object)null || ((allItem.itemName ?? "").IndexOf("Drone Battery", StringComparison.OrdinalIgnoreCase) < 0 && (((Object)allItem).name ?? "").IndexOf("Drone Battery", StringComparison.OrdinalIgnoreCase) < 0))
			{
				continue;
			}
			_luckyItem = allItem;
			Debug.Log((object)("[LuckyBlock] Private edition base item: '" + allItem.itemName + "' (asset '" + ((Object)allItem).name + "')."));
			return allItem;
		}
		return null;
	}

	internal static GameObject SpawnLuckyItem(Vector3 pos)
	{
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		Item luckyItem = GetLuckyItem();
		if ((Object)(object)luckyItem == (Object)null)
		{
			return null;
		}
		GameObject result = ((!SemiFunc.IsMultiplayer()) ? Object.Instantiate<GameObject>(((PrefabRef<GameObject>)(object)luckyItem.prefab).Prefab, pos, Quaternion.identity) : Items.SpawnItem(luckyItem, pos, Quaternion.identity));
		LastSpawnedName = luckyItem.itemName;
		return result;
	}

	internal static List<Vector3> GetFloorRing(Vector3 centre, int count, float radius)
	{
		//IL_0022: 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)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: 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_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: 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)
		List<Vector3> list = new List<Vector3>(count);
		RaycastHit val2 = default(RaycastHit);
		for (int i = 0; i < count; i++)
		{
			float num = (float)i * (360f / (float)count) * ((float)Math.PI / 180f);
			Vector3 val = centre + new Vector3(Mathf.Cos(num) * radius, 2f, Mathf.Sin(num) * radius);
			Vector3 item = ((!Physics.Raycast(val, Vector3.down, ref val2, 6f)) ? (centre + new Vector3(Mathf.Cos(num) * radius, 0.5f, Mathf.Sin(num) * radius)) : (((RaycastHit)(ref val2)).point + Vector3.up * 0.5f));
			list.Add(item);
		}
		return list;
	}

	internal static void SpawnExplosiveCluster(PlayerAvatar avatar)
	{
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: 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_00bf: 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_00c9: 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_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)avatar == (Object)null))
		{
			Vector3 val = default(Vector3);
			RaycastHit val3 = default(RaycastHit);
			for (int i = 0; i < 3; i++)
			{
				float num = (float)i * 120f * ((float)Math.PI / 180f);
				((Vector3)(ref val))..ctor(Mathf.Cos(num) * 2f, 2f, Mathf.Sin(num) * 2f);
				Vector3 val2 = ((Component)avatar).transform.position + val;
				Vector3 pos = ((!Physics.Raycast(val2, Vector3.down, ref val3, 5f)) ? (((Component)avatar).transform.position + new Vector3(Mathf.Cos(num) * 2f, 0.5f, Mathf.Sin(num) * 2f)) : (((RaycastHit)(ref val3)).point + Vector3.up * 0.15f));
				SpawnRandomExplosive(pos);
			}
			LastStatus = "Explosive cluster x3 around " + ((Object)((Component)avatar).gameObject).name;
			Debug.Log((object)("[SpawnUtils] " + LastStatus));
		}
	}

	internal static void SpawnLargeExplosiveCluster(Vector3 centre)
	{
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: 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_0045: 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_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: 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_00a3: 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_0063: 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_0072: 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_00a5: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = default(Vector3);
		RaycastHit val3 = default(RaycastHit);
		for (int i = 0; i < 5; i++)
		{
			float num = (float)i * 72f * ((float)Math.PI / 180f);
			((Vector3)(ref val))..ctor(Mathf.Cos(num) * 2.4f, 2f, Mathf.Sin(num) * 2.4f);
			Vector3 val2 = centre + val;
			Vector3 pos = ((!Physics.Raycast(val2, Vector3.down, ref val3, 6f)) ? (centre + new Vector3(Mathf.Cos(num) * 2.4f, 0.5f, Mathf.Sin(num) * 2.4f)) : (((RaycastHit)(ref val3)).point + Vector3.up * 0.15f));
			SpawnRandomExplosive(pos);
		}
		LastStatus = $"Large explosive cluster x5 at {centre:F0}";
		Debug.Log((object)("[SpawnUtils] " + LastStatus));
	}

	internal static void SpawnRandomValuable(Vector3 pos)
	{
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		List<PrefabRef> list = new List<PrefabRef>(Valuables.AllValuables);
		if (list.Count == 0)
		{
			LastStatus = "SpawnRandomValuable: no valuables available";
			return;
		}
		PrefabRef val = list[Random.Range(0, list.Count)];
		LastSpawnedName = ((PrefabRef<GameObject>)(object)val).PrefabName.Replace("Valuable ", "").Trim();
		LastStatus = $"Random valuable: {((PrefabRef<GameObject>)(object)val).PrefabName} at {pos:F0}";
		Debug.Log((object)("[SpawnUtils] " + LastStatus));
		SpawnSpecificValuable(val, pos);
	}

	internal static void SpawnSpecificEnemy(EnemySetup setup, Vector3 pos, MonoBehaviour context)
	{
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)EnemyDirector.instance == (Object)null)
		{
			LastStatus = "SpawnSpecificEnemy: EnemyDirector null";
			return;
		}
		if (_spawning)
		{
			LastStatus = "SpawnSpecificEnemy: already spawning";
			return;
		}
		MonoBehaviour val = (MonoBehaviour)(((Object)(object)EnemyDirector.instance != (Object)null) ? ((object)EnemyDirector.instance) : ((object)context));
		val.StartCoroutine(SpawnEnemyCoroutine(setup, pos));
	}

	internal static void SpawnSpecificItem(Item item, Vector3 pos)
	{
		//IL_005d: 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_0074: 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_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)item == (Object)null)
		{
			LastStatus = "SpawnSpecificItem: item null";
			return;
		}
		GameObject val;
		if (SemiFunc.IsMultiplayer())
		{
			val = Items.SpawnItem(item, pos, Quaternion.identity);
			LastStatus = $"Item '{((Object)item).name}' spawned at {pos:F0} (MP)";
		}
		else
		{
			val = Object.Instantiate<GameObject>(((PrefabRef<GameObject>)(object)item.prefab).Prefab, pos, Quaternion.identity);
			LastStatus = $"Item '{((Object)item).name}' spawned at {pos:F0} (SP)";
		}
		Debug.Log((object)("[SpawnUtils] " + LastStatus));
		if ((Object)(object)val != (Object)null)
		{
			ItemBattery componentInParent = val.GetComponentInParent<ItemBattery>();
			if ((Object)(object)componentInParent != (Object)null && componentInParent.batteryBars < 6)
			{
				componentInParent.SetBatteryLife(100);
			}
			ActivateIfExplosive(val);
		}
	}

	internal static void SpawnSpecificValuable(PrefabRef prefab, Vector3 pos)
	{
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: 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_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		if (prefab == null)
		{
			LastStatus = "SpawnSpecificValuable: prefab null";
			return;
		}
		if (SemiFunc.IsMultiplayer())
		{
			Valuables.SpawnValuable(prefab, pos, Quaternion.identity);
			LastStatus = $"Valuable '{((PrefabRef<GameObject>)(object)prefab).PrefabName}' spawned at {pos:F0} (MP)";
		}
		else
		{
			Object.Instantiate<GameObject>(((PrefabRef<GameObject>)(object)prefab).Prefab, pos, Quaternion.identity);
			LastStatus = $"Valuable '{((PrefabRef<GameObject>)(object)prefab).PrefabName}' spawned at {pos:F0} (SP)";
		}
		Debug.Log((object)("[SpawnUtils] " + LastStatus));
	}

	internal static void SpawnValuableByName(string _unused)
	{
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: 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)
		IReadOnlyList<PrefabRef> allValuables = Valuables.AllValuables;
		PrefabRef val = null;
		string text = null;
		string[] valuableSearchTerms = ValuableSearchTerms;
		foreach (string text2 in valuableSearchTerms)
		{
			val = SearchPrefabList(allValuables, text2);
			if (val != null)
			{
				text = text2;
				break;
			}
		}
		if (val == null)
		{
			LastStatus = "Valuable not found. Tried: [" + string.Join(", ", ValuableSearchTerms) + "]";
			Debug.LogWarning((object)("[SpawnUtils] " + LastStatus));
			return;
		}
		Vector3 spawnPositionInFront = GetSpawnPositionInFront(PlayerAvatar.instance);
		SpawnSpecificValuable(val, spawnPositionInFront);
		LastStatus = "[F9] Valuable '" + ((PrefabRef<GameObject>)(object)val).PrefabName + "' via '" + text + "'";
	}

	internal static void SpawnItemByName(string _unused)
	{
		//IL_00e2: 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_00e9: Unknown result type (might be due to invalid IL or missing references)
		IReadOnlyList<Item> allItems = Items.AllItems;
		Item val = null;
		string text = null;
		string[] itemSearchTerms = ItemSearchTerms;
		foreach (string text2 in itemSearchTerms)
		{
			foreach (Item item in allItems)
			{
				if (((Object)item).name.IndexOf(text2, StringComparison.OrdinalIgnoreCase) >= 0)
				{
					val = item;
					text = text2;
					break;
				}
			}
			if ((Object)(o