using System.Collections.Generic; using BITFALL.Entities.Equipment; using BITFALL.Entities.Inventory; using BITFALL.Player.Inventory; using UnityEngine; using UnityEngine.UIElements; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Interactions; using BITKit; using BITKit.UX; using BITKit.Entities; using BITKit.Entities.Player; namespace BITFALL.UX { public class UXInventory : UIToolKitPanel { [Header(Constant.Header.Input)] public InputActionReference inventoryAction; public InputActionReference returnAction; [Header(Constant.Header.Components)] public UXBar weightBar; [Header(Constant.Header.Providers)] [SerializeReference, SubclassSelector] private IPlayerService playerService; [Header(Constant.Header.Components)] public UXBuilder builder; [Header(Constant.Header.InternalVariables)] private readonly Dictionary itemContainers = new(); private readonly Dictionary equipContainers = new(); [Inject] private IEntityInventory inventory; [Inject] private IEntityEquipmentContainer equipContainer; private IUnityEntity _unityEntity; protected override async void Start() { base.Start(); foreach (var x in await ReflectionHelper.GetTypes()) { var element = document.rootVisualElement.Q(x.Name); if (element is null) continue; UXContainer uxContainer = new(element); equipContainers.Add(x.Name, uxContainer); element.RegisterCallback(mouseEvent => { if(_unityEntity is null) return; switch (mouseEvent.button) { case 0: break; case 1: equipContainer.TryDeEquip(System.Activator.CreateInstance(x) as IEquipmentSlot); break; } }); } } protected override void OnPanelEntry() { base.OnPanelEntry(); inputActionGroup.RegisterCallback(returnAction, OnReturn); inputActionGroup.RegisterCallback(inventoryAction, OnReturn); } protected override void OnPanelExit() { base.OnPanelExit(); inputActionGroup.UnRegisterCallback(returnAction, OnReturn); inputActionGroup.UnRegisterCallback(inventoryAction, OnReturn); } protected override void OnEnable() { base.OnEnable(); playerService.OnPlayerInitialized += OnPlayerInitializedLocalPlayer; playerService.OnPlayerDisposed += OnPlayerDisposed; } private void OnPlayerDisposed(Entity obj) { inventory = null; equipContainer = null; } protected override void OnDisable() { base.OnDisable(); playerService.OnPlayerDisposed -= OnPlayerDisposed; playerService.OnPlayerInitialized -= OnPlayerInitializedLocalPlayer; } private void OnPlayerInitializedLocalPlayer(IUnityEntity unityEntity) { unityEntity.Inject(this); itemContainers.Clear(); builder.Clear(); var weighted = unityEntity.Get(); weighted.OnWeighted += OnWeighted; equipContainer.OnEquip += OnEquip; equipContainer.OnDeEquip += DeEquip; inventory.OnAdd += OnAdd; inventory.OnRemove += OnRemove; inventory.OnUsedItem += OnRemove; inventory.OnSet += OnSet; inventory.OnRebuild += OnRebuild; _unityEntity = unityEntity; } private void OnRebuild(IBasicItemContainer obj) { foreach (var x in itemContainers.Values) { x.visualElement.RemoveFromHierarchy(); } foreach (var VARIABLE in obj.GetItems()) { OnAdd(VARIABLE); } } private static void OnReturn(InputAction.CallbackContext context) { if (context is {interaction:PressInteraction,performed:true}) UXService.Entry(); } public void OnWeighted(double current, double max) { var value = current is 0 ? 0 : (current / max); weightBar.SetDirect((float) value,$"{current}/{max}"); } private void OnAdd(IBasicItem item) { // var asset = Addressables.LoadAssetAsync(item.AddressablePath).WaitForCompletion(); // var uxContainer = builder.BuildAsContainer(); // uxContainer.icon.style.backgroundImage = asset.SquareIcon; // uxContainer.contextLabel.text = asset.Name; var uxContainer = UXUtils.CreateItemContainer(builder.BuildAsContainer(), item); uxContainer.button.clicked += () => { UseItem(item); }; uxContainer.visualElement.Q