using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using BITKit; using BITKit.Entities; using BITKit.Mod; using BITKit.StateMachine; using BITKit.Tween; using BITKit.UX; using BITKit.UX.Hotkey; using BITKit.WorldNode; using Cysharp.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Net.Project.B.Damage; using Net.Project.B.Emoji; using Net.Project.B.Health; using Net.Project.B.Interaction; using Net.Project.B.Inventory; using Net.Project.B.Item; using Net.Project.B.UX; using Project.B.CharacterController; using Project.B.Entities; using Project.B.Item; using Project.B.Map; using Project.B.Player; using Unity.Mathematics; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Interactions; using UnityEngine.UIElements; namespace Project.B.UX { public class UXHUD : UIToolKitPanel,IUXHud { protected override string DocumentPath => "ux_hud"; public override bool AllowCursor => false; public override bool AllowInput => true; private readonly IDamageService _damageService; private readonly IEntitiesService _entitiesService; private readonly IManagedItemService _itemService; private readonly IGameMapService _gameMapService; private readonly IWorldInteractionService _interactionService; private readonly IUXKeyMap _uxKeyMap; private readonly ConcurrentDictionary _prompts = new(); private readonly IPlayerFactory _playerFactory; private readonly IKnockedService _knockedService; private readonly IUXItemInspector _itemInspector; private readonly ValidHandle _isVisible = new(); private readonly IPlayerKeyMap _playerKeyMap; private readonly IntervalUpdate _fpsSampleInterval=new(0.32f); private readonly IMicroStateMachine _controlMode; private readonly IUXHotKey _uxHotKey; private IEntity _entity; public UXHUD(IUXService uxService, IGameMapService gameMapService, IUXKeyMap uxKeyMap, IWorldInteractionService interactionService, IPlayerFactory playerFactory, IKnockedService knockedService, IManagedItemService itemService, IPlayerKeyMap playerKeyMap, IUXItemInspector itemInspector, IMicroStateMachine controlMode, IEntitiesService entitiesService, IDamageService damageService, IUXHotKey uxHotKey) : base(uxService) { _gameMapService = gameMapService; _uxKeyMap = uxKeyMap; _interactionService = interactionService; _playerFactory = playerFactory; _knockedService = knockedService; _itemService = itemService; _playerKeyMap = playerKeyMap; _itemInspector = itemInspector; _controlMode = controlMode; _entitiesService = entitiesService; _damageService = damageService; _uxHotKey = uxHotKey; _gameMapService.OnMapChanged += OnMapChanged; _interactionService.OnInteraction += OnInteraction; _playerFactory.OnEntityCreated += OnEntityCreated; _knockedService.OnKnocked += OnKnocked; _knockedService.OnKnockedHealthChanged += OnKnockedHealthChanged; OnInitiatedAsync += InitiatedAsync; _controlMode.OnStateChanged += OnControlModeChanged; _damageService.OnDamaged += OnDamaged; } private async UniTask InitiatedAsync() { _isVisible.AddListener(RootVisualElement.SetActive); _isVisible.Invoke(); _healthBar.value = 100; _healthBar.SetActive(true); _knockedBar.SetActive(false); _promptTemplate = await ModService.LoadAsset("ux_prompt_template"); _itemTemplate = await ModService.LoadAsset("ux_item_template"); _flatItemTemplate = await ModService.LoadAsset("ux_item_template-flat"); _damageTemplate = await ModService.LoadAsset("ui_damage-template"); _promptsContainer.Clear(); _hitMark.SetOpacity(0); } private CancellationTokenSource _hitMarkCts; private async void OnDamaged(IDamageReport obj) { if (obj.IsFatal) { if(_entitiesService.TryGetEntity(obj.Initiator,out var e) && e.ServiceProvider.GetRequiredService() is {} initiator) { if (_entitiesService.TryGetEntity(obj.Target, out var t) && t.ServiceProvider.GetRequiredService() is { } target) { if (_damageContainer.childCount > 5) { _damageContainer.Children().Last().RemoveFromHierarchy(); } var container = _damageContainer.Create(_damageTemplate); if (_playerFactory.Entities.ContainsKey(obj.Initiator)) { container.AddToClassList("selected"); } if (obj.DamageType is ScriptableItemDamage { ScriptableId: not 0 } scriptableItemDamage) { var item =await UXInventoryUtils.GetScriptableItem(scriptableItemDamage.ScriptableId); container.Get().style.backgroundImage = new(item.Icon); } container.Get