Decompiled source of PackOfCards v1.0.1

PackOfCards/PackOfCardsMod.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("PackOfCardsMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PackOfCardsMod")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7a22f61b-c571-445a-ba37-b2779eb31345")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
public static class PackOfCardsPreset
{
	public static Value CreateValuePreset()
	{
		Value obj = ScriptableObject.CreateInstance<Value>();
		obj.valueMin = 3500f;
		obj.valueMax = 3500f;
		return obj;
	}

	public static Durability CreateDurabilityPreset()
	{
		Durability obj = ScriptableObject.CreateInstance<Durability>();
		obj.fragility = 10f;
		obj.durability = 50f;
		return obj;
	}

	public static PhysAttribute CreatePhysPreset()
	{
		PhysAttribute obj = ScriptableObject.CreateInstance<PhysAttribute>();
		obj.mass = 0.2f;
		return obj;
	}

	public static PhysAudio CreateAudioPreset()
	{
		return ScriptableObject.CreateInstance<PhysAudio>();
	}
}
[BepInPlugin("ty.packofcards", "Pack of Cards Item", "1.0.0")]
public class TyPackOfCardsLoot : BaseUnityPlugin
{
	internal static TyPackOfCardsLoot Instance;

	internal Dictionary<string, AssetBundle> cardBundles = new Dictionary<string, AssetBundle>();

	internal Dictionary<string, GameObject> cardPrefabs = new Dictionary<string, GameObject>();

	private readonly string[] cardNames = new string[10] { "xrcard", "rcard1", "rarecard2", "basecard", "2ndtmehcard", "3rdtmehcard", "cc", "3rdworstcard", "2ndtwcard", "mcard" };

	private void Awake()
	{
		Instance = this;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"PackOfCardsMod loaded.");
		LoadCardBundles();
		RegisterPackValuable();
	}

	public void Log(string msg)
	{
		((BaseUnityPlugin)this).Logger.LogInfo((object)msg);
	}

	public void LogWarn(string msg)
	{
		((BaseUnityPlugin)this).Logger.LogWarning((object)msg);
	}

	private void LoadCardBundles()
	{
		string path = Path.Combine(Paths.PluginPath, "PackOfCards");
		string[] array = cardNames;
		foreach (string text in array)
		{
			string text2 = Path.Combine(path, text);
			if (!File.Exists(text2))
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Card bundle not found: " + text2));
				continue;
			}
			AssetBundle val = AssetBundle.LoadFromFile(text2);
			if ((Object)(object)val == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load card bundle: " + text2));
				continue;
			}
			cardBundles[text] = val;
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Loaded card bundle: " + text));
			string text3 = val.GetAllAssetNames().FirstOrDefault((string a) => a.EndsWith(".prefab") || !Enumerable.Contains(a, '.'));
			if (!string.IsNullOrEmpty(text3))
			{
				GameObject val2 = val.LoadAsset<GameObject>(text3);
				if ((Object)(object)val2 != (Object)null)
				{
					cardPrefabs[text] = val2;
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Loaded card prefab for " + text + ": " + ((Object)val2).name));
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)("Prefab asset path found but failed to load GameObject: " + text3));
				}
			}
			else
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("No prefab asset found inside bundle: " + text));
			}
		}
	}

	private void RegisterPackValuable()
	{
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0194: Expected O, but got Unknown
		AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(Paths.PluginPath, "PackOfCards", "cardpack"));
		if ((Object)(object)val == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"Cannot register valuable — cardpack bundle not loaded.");
			return;
		}
		string text = val.GetAllAssetNames().FirstOrDefault((string a) => a.EndsWith(".prefab") || !Enumerable.Contains(a, '.'));
		if (text == null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"No prefab found in cardpack AssetBundle!");
			return;
		}
		GameObject val2 = val.LoadAsset<GameObject>(text);
		if ((Object)(object)val2 == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load prefab at path: " + text));
			return;
		}
		if (!Object.op_Implicit((Object)(object)val2.GetComponent<Rigidbody>()))
		{
			val2.AddComponent<Rigidbody>().mass = 0.2f;
		}
		if (!Object.op_Implicit((Object)(object)val2.GetComponent<BoxCollider>()))
		{
			val2.AddComponent<BoxCollider>().size = new Vector3(0.2f, 0.1f, 0.3f);
		}
		ValuableObject obj = val2.GetComponent<ValuableObject>() ?? val2.AddComponent<ValuableObject>();
		obj.valuePreset = PackOfCardsPreset.CreateValuePreset();
		obj.durabilityPreset = PackOfCardsPreset.CreateDurabilityPreset();
		obj.physAttributePreset = PackOfCardsPreset.CreatePhysPreset();
		obj.audioPreset = PackOfCardsPreset.CreateAudioPreset();
		if (!Object.op_Implicit((Object)(object)val2.GetComponent<PhysGrabObject>()))
		{
			val2.AddComponent<PhysGrabObject>();
		}
		if (!Object.op_Implicit((Object)(object)val2.GetComponent<PhysGrabObjectImpactDetector>()))
		{
			val2.AddComponent<PhysGrabObjectImpactDetector>();
		}
		if (!Object.op_Implicit((Object)(object)val2.GetComponent<RoomVolumeCheck>()))
		{
			val2.AddComponent<RoomVolumeCheck>();
		}
		(val2.GetComponent<ValuableVolume>() ?? val2.AddComponent<ValuableVolume>()).VolumeType = (Type)1;
		if (!Object.op_Implicit((Object)(object)val2.GetComponent<PackOpenBehaviourNew>()))
		{
			val2.AddComponent<PackOpenBehaviourNew>().interactRange = 2.5f;
		}
		PrefabRef val3 = new PrefabRef();
		((PrefabRef<GameObject>)(object)val3).SetPrefab(val, text);
		LevelValuables[] array = Resources.FindObjectsOfTypeAll<LevelValuables>();
		((BaseUnityPlugin)this).Logger.LogInfo((object)$"Registering Pack of Cards with {array.Length} levels");
		LevelValuables[] array2 = array;
		foreach (LevelValuables val4 in array2)
		{
			if (val4.small != null)
			{
				val4.small.Add(val3);
				((BaseUnityPlugin)this).Logger.LogInfo((object)("✓ Added Pack of Cards to " + ((Object)val4).name));
			}
		}
	}
}
public class PackOpenBehaviour : MonoBehaviour
{
}
public class PackOpenBehaviourNew : MonoBehaviour
{
	public float interactRange = 2.5f;

	private bool opened;

	private Transform mainCam;

	private void Start()
	{
		Camera main = Camera.main;
		mainCam = ((main != null) ? ((Component)main).transform : null);
	}

	private void Update()
	{
		//IL_0043: 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)
		if (!opened)
		{
			if ((Object)(object)mainCam == (Object)null)
			{
				Camera main = Camera.main;
				mainCam = ((main != null) ? ((Component)main).transform : null);
			}
			if (!((Object)(object)mainCam == (Object)null) && Vector3.Distance(mainCam.position, ((Component)this).transform.position) <= interactRange && Input.GetKeyDown((KeyCode)101))
			{
				OpenPack();
			}
		}
	}

	private void OpenPack()
	{
		//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0200: Unknown result type (might be due to invalid IL or missing references)
		//IL_020a: Unknown result type (might be due to invalid IL or missing references)
		//IL_020f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0214: Unknown result type (might be due to invalid IL or missing references)
		//IL_0216: 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_0235: Unknown result type (might be due to invalid IL or missing references)
		opened = true;
		TyPackOfCardsLoot.Instance?.Log("Player opened a Pack of Cards.");
		List<string> list = new List<string> { "xrcard", "rcard1", "rarecard2", "basecard", "2ndtmehcard", "3rdtmehcard", "cc", "3rdworstcard", "2ndtwcard", "mcard" };
		Random random = new Random();
		int num = list.Count;
		while (num > 1)
		{
			num--;
			int index = random.Next(num + 1);
			string value = list[index];
			list[index] = list[num];
			list[num] = value;
		}
		for (int i = 0; i < list.Count; i++)
		{
			string text = list[i];
			float num2;
			if (text == "mcard")
			{
				num2 = 0.2f;
			}
			else
			{
				switch (i)
				{
				case 0:
					num2 = 0.05f;
					break;
				case 1:
				case 2:
					num2 = 0.075f;
					break;
				default:
					num2 = 0.1f;
					break;
				}
			}
			if (!(Random.value <= num2))
			{
				TyPackOfCardsLoot.Instance?.Log($"Card {text} skipped (roll > {num2}).");
			}
			else if (text == "mcard")
			{
				if (TrySpawnRandomMonster())
				{
					TyPackOfCardsLoot.Instance?.Log("mcard effect: spawned random monster.");
				}
				else
				{
					TyPackOfCardsLoot.Instance?.LogWarn("mcard effect: no monster prefab found to spawn.");
				}
			}
			else if ((Object)(object)TyPackOfCardsLoot.Instance != (Object)null && TyPackOfCardsLoot.Instance.cardPrefabs.ContainsKey(text))
			{
				GameObject obj = TyPackOfCardsLoot.Instance.cardPrefabs[text];
				Vector3 val = ((Component)this).transform.position + Vector3.up * 0.5f + Random.insideUnitSphere * 0.3f;
				Object.Instantiate<GameObject>(obj, val, Quaternion.identity);
				TyPackOfCardsLoot.Instance?.Log($"Spawned card {text} at {val}.");
			}
			else
			{
				TyPackOfCardsLoot.Instance?.LogWarn("Card prefab not available: " + text);
			}
		}
		Collider[] components = ((Component)this).GetComponents<Collider>();
		for (int j = 0; j < components.Length; j++)
		{
			components[j].enabled = false;
		}
		Renderer component = ((Component)this).GetComponent<Renderer>();
		if (Object.op_Implicit((Object)(object)component))
		{
			component.enabled = false;
		}
		Object.Destroy((Object)(object)((Component)this).gameObject, 1f);
	}

	private bool TrySpawnRandomMonster()
	{
		//IL_0046: 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_0055: 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)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		GameObject[] array = (from g in Resources.FindObjectsOfTypeAll<GameObject>()
			where ((Object)g).name.ToLower().Contains("enemy") || ((Object)g).name.ToLower().Contains("monster") || ((Object)g).name.ToLower().Contains("spawner")
			select g).ToArray();
		if (array.Length == 0)
		{
			return false;
		}
		GameObject obj = array[Random.Range(0, array.Length)];
		Vector3 val = ((Component)this).transform.position + Vector3.up * 0.5f;
		Object.Instantiate<GameObject>(obj, val, Quaternion.identity);
		return true;
	}
}