using System.Collections.Generic; using UnityEngine; public class GenerateableDatabase : MonoBehaviour { public static GenerateableDatabase Instance { get; private set; } private Dictionary> generateableDict = new Dictionary>(); private void Awake() { if (Instance == null) { Instance = this; } else { Destroy(gameObject); } } public void InitializeFromGenerateables(List generateables) { generateableDict.Clear(); foreach (Generateable generateable in generateables) { Dropable dropable = generateable.GetComponent(); if (dropable != null && dropable.dropable != null) { int itemId = dropable.dropable.itemId; if (!generateableDict.ContainsKey(itemId)) { generateableDict[itemId] = new List<(int, int, int, Vector2 dropRange)>(); } generateableDict[itemId].Add(( generateable.minClusterSize, generateable.maxSpawnHeight, generateable.minSpawnHeight, dropable.dropRange )); } } if (generateableDict.Count == 0) { Debug.LogWarning("No valid generateables found with dropable items"); } } public bool TryGetGenerateables(int itemId, out List<(int minClusterSize, int maxHeight, int minHeight, Vector2 dropRange)> generateables) { if (generateableDict.TryGetValue(itemId, out generateables)) { return true; } generateables = null; return false; } // Optional: Helper method to get ranges across all variants public bool TryGetGenerateableRanges(int itemId, out int minClusterSize, out int maxHeight, out int minHeight) { if (generateableDict.TryGetValue(itemId, out var variants)) { minClusterSize = int.MaxValue; maxHeight = int.MinValue; minHeight = int.MaxValue; foreach (var variant in variants) { minClusterSize = Mathf.Min(minClusterSize, variant.minClusterSize); maxHeight = Mathf.Max(maxHeight, variant.maxHeight); minHeight = Mathf.Min(minHeight, variant.minHeight); } return true; } minClusterSize = 0; maxHeight = 0; minHeight = 0; return false; } public IEnumerable GetAllGenerateableIds() { return generateableDict.Keys; } }