using System; using System.Collections.Generic; using System.Linq; using IronMountain.ResourceUtilities; using UnityEngine; using UnityEngine.Localization; namespace SpellBoundAR.Items { [CreateAssetMenu(menuName = "Scriptable Objects/Gameplay/Items/Item Type Data")] public class ScriptedItemTypeData : ScriptableObject, IItemTypeData { [SerializeField] private string id; [SerializeField] private string defaultName; [SerializeField] private LocalizedString localizedName; [SerializeField] private ResourceSprite depiction; [SerializeField] private LocalizedString description; [SerializeField] private bool showInInventory = true; [SerializeField] private List instances = new (); [SerializeField] private ResourceGameObject instancePrefab; public string ID { get => id; set => id = value; } public virtual string Name => name; public string LocalizedName { get { if (Application.isPlaying) { return localizedName.IsEmpty ? defaultName : localizedName.GetLocalizedString(); } #if UNITY_EDITOR if (localizedName.IsEmpty || string.IsNullOrEmpty(localizedName.TableReference)) return defaultName; var collection = UnityEditor.Localization.LocalizationEditorSettings.GetStringTableCollection(localizedName.TableReference); var entry = collection.SharedData.GetEntryFromReference(localizedName.TableEntryReference); return entry != null ? entry.Key : defaultName; #else return string.Empty; #endif } } public Sprite Depiction => depiction ? depiction.Asset : null; public string Description => description.IsEmpty ? string.Empty : description.GetLocalizedString(); public bool ShowInInventory => showInInventory; public List ScriptedInstances => instances; public List Instances => new (instances); public object InstantiateAnInstance(Transform parent = null) where T : IItem { if (!instancePrefab) return null; GameObject gameObject = instancePrefab.Asset; if (!gameObject) return null; gameObject = Instantiate(gameObject, parent); T item = gameObject.GetComponent(); if (item != null) item.Type = this; return item != null ? item : gameObject; } protected virtual void OnEnable() => ItemsManager.Types.Add(this); protected virtual void OnDisable() => ItemsManager.Types.Remove(this); #if UNITY_EDITOR public void Reset() { GenerateNewID(); RefreshInstances(); } public virtual void OnValidate() { RefreshInstances(); } [ContextMenu("Generate New ID")] public void GenerateNewID() { id = Guid.NewGuid().ToString(); } [ContextMenu("Refresh Instances")] private void RefreshInstances() { instances = instances.Distinct().ToList(); instances.RemoveAll(instance => !instance || (ScriptedItemTypeData) instance.Type != this); foreach (IItemInstanceData instance in ItemsManager.Instances) { if (instance is not ScriptedItemInstanceData scriptedItemInstanceData) continue; if ((ScriptedItemTypeData) scriptedItemInstanceData.Type != this) continue; if (instances.Contains(scriptedItemInstanceData)) continue; if (instances.Find(test => test.ID == scriptedItemInstanceData.ID)) continue; instances.Add(scriptedItemInstanceData); } } public virtual bool HasErrors() { return localizedName.IsEmpty || description.IsEmpty || !depiction; } #endif } }