using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using BITFALL.Entities.Equipment; using UnityEngine; using BITKit; using BITKit.Entities; using BITKit.Entities.Player; using BITKit.UX; using RotaryHeart.Lib.SerializableDictionary; using UnityEngine.Playables; using UnityEngine.UIElements; namespace BITFALL { public class UXEquipSelector : MonoBehaviour { [SerializeReference,SubclassSelector] private IPlayerService playerService; [SerializeField] private SerializableDictionaryBase dictionary = new(); [SerializeField] private UXImage currentUXEquip; private readonly ConcurrentDictionary cache=new(); [Inject] private IPlayerEquipSelector _equipSelector; [Inject] private IEntityEquipment _entityEquipment; public void OnEquip(IBasicItem item) { if(item is null) return; var assets = item.GetAssetable(); currentUXEquip.SetTexture(assets.RectangleIcon); } public void OnUnEquip(IBasicItem item) { currentUXEquip.SetTexture(null); } public void OnUpdateEquip(IDictionary maps) { cache.Clear(); foreach (var (key, image) in dictionary) { if (maps.TryGetValue(key, out var item)) { var asset = item.GetAssetable(); image.SetTexture(asset.RectangleIcon); } else { image.SetTexture(null); } cache.TryAdd(key, item); } } private void Start() { playerService.OnPlayerInitialized += OnStartLocalPlayer; OnUnEquip(null); foreach (var x in dictionary) { x.Value.visualElement.RegisterCallback(evt => { if (evt.button is not 1) return; if (cache.TryGetValue(x.Key, out var item)) { _equipSelector.TryDeEquip(item); } }); } } private void OnDestroy() { playerService.OnPlayerInitialized -= OnStartLocalPlayer; } private void OnStartLocalPlayer(IUnityEntity unityEntity) { cache.Clear(); unityEntity.Inject(this); _entityEquipment.OnEquip += OnEquip; _entityEquipment.OnUnEquip += OnUnEquip; _equipSelector.OnUpdateEquip += OnUpdateEquip; } } }