using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Localization; namespace SpellBoundAR.Items { public class Item : MonoBehaviour, IItem { public event Action OnVisibleChanged; public event Action OnInteractableChanged; public event Action OnInteractionCountChanged; [SerializeField] private ScriptedItemTypeData type; [SerializeField] private ScriptedItemInstanceData instance; [SerializeField] private string defaultID; [SerializeField] private string defaultName; [SerializeField] private Sprite defaultDepiction; [SerializeField] private string defaultDescription; [SerializeField] private LocalizedString defaultLocalizedName; [SerializeField] private bool defaultShowInInventory = true; [SerializeField] private bool visible = true; [SerializeField] private bool interactable = true; public IItemTypeData Type { get => type; set => type = value as ScriptedItemTypeData; } public int InteractionCount { get; set; } public string ID { get => type ? type.ID : defaultID; set { if (type) type.ID = value; defaultID = value; } } public string Name => type ? type.Name : defaultName; public Sprite Depiction => type ? type.Depiction : defaultDepiction; public string LocalizedName { get { if (type) return type.LocalizedName; if (Application.isPlaying) { return defaultLocalizedName.IsEmpty ? defaultName : defaultLocalizedName.GetLocalizedString(); } #if UNITY_EDITOR if (defaultLocalizedName.IsEmpty || string.IsNullOrEmpty(defaultLocalizedName.TableReference)) return defaultName; var collection = UnityEditor.Localization.LocalizationEditorSettings.GetStringTableCollection(defaultLocalizedName.TableReference); var entry = collection.SharedData.GetEntryFromReference(defaultLocalizedName.TableEntryReference); return entry != null ? entry.Key : defaultName; #else return string.Empty; #endif } } public string Description => type ? type.Description : defaultDescription; public bool ShowInInventory => type ? type.ShowInInventory : defaultShowInInventory; public List Instances => new(); public object InstantiateAnInstance(Transform parent = null) where T : IItem { return null; } public void RefreshName() { throw new NotImplementedException(); } public virtual bool Visible { get => instance ? instance.Visible : visible; set { bool oldValue = visible; visible = value; if (instance) instance.Visible = value; if (oldValue != value) OnVisibleChanged?.Invoke(); } } public virtual bool Interactable { get => interactable; set { bool oldValue = interactable; interactable = value; if (instance) instance.Interactable = value; if (oldValue != value) OnInteractableChanged?.Invoke(); } } protected virtual void Awake() { Visible = instance ? instance.InitiallyVisible : visible; Interactable = instance ? instance.InitiallyInteractable : interactable; if (!instance) return; instance.OnVisibleChanged += RefreshVisible; instance.OnInteractableChanged += RefreshInteractable; } protected virtual void OnDestroy() { if (!instance) return; instance.OnVisibleChanged -= RefreshVisible; instance.OnInteractableChanged -= RefreshInteractable; } protected virtual void OnEnable() { RefreshVisible(); RefreshInteractable(); ItemsManager.RegisterActiveItem(this); } protected virtual void OnDisable() { ItemsManager.UnregisterActiveItem(this); } public void OnValidate() { if (instance) type = instance.Type as ScriptedItemTypeData; OnVisibleChanged?.Invoke(); OnInteractableChanged?.Invoke(); } private void RefreshVisible() { if (instance) Visible = instance.Visible; } private void RefreshInteractable() { if (instance) Interactable = instance.Interactable; } } }