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 UnityEngine.Playables; using UnityEngine.UIElements; using AYellowpaper.SerializedCollections; namespace BITFALL { public class UXEquipSelector : MonoBehaviour { [Header(Constant.Header.Components)] [SerializeField] private SerializedDictionary dictionary = new(); [Header(Constant.Header.Services)] [SerializeReference,SubclassSelector] private IPlayerService playerService; private readonly ConcurrentDictionary cache=new(); [Inject] private IPlayerEquipSelector _equipSelector; private void Start() { playerService.OnPlayerInitialized += OnStartLocalPlayer; 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; } 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 OnStartLocalPlayer(IUnityEntity unityEntity) { cache.Clear(); unityEntity.Inject(this); _equipSelector.OnUpdateEquip += OnUpdateEquip; } } }