using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using BITKit; using BITKit.Entities; using BITKit.Mod; using BITKit.UX; using Cysharp.Threading.Tasks; using MemoryPack; using Net.BITKit.Localization; using Net.BITKit.UX; using Net.Project.B.Item; using Net.Project.B.Mark; using Net.Project.B.Quest; using Net.Project.B.World; using Net.Project.B.WorldNode; using Project.B.UX; using Unity.Mathematics; using UnityEngine; using UnityEngine.UIElements; namespace Net.Project.B.UX { public static class UXMapUtils{ public static Vector2 GetPosition(Vector2 size,float mapSize,Vector2 iconSize , Vector2 offset,Vector3 position,float scale ,Vector3 uiOffset) { position -= new Vector3(offset.x,0,offset.y); position.x /= mapSize*2; position.z /= mapSize*2; //size *= scale; var result = new Vector2(position.x * size.x + size.x / 2 - iconSize.x / 2, size.y - (position.z * size.y + size.y / 2) - iconSize.y / 2); result.x += uiOffset.x; result.y += uiOffset.y; return new((int)result.x, (int)result.y); } } public class UXMap : UIToolkitSubPanel,IDisposable, IUXMap where TPanel : IUXPanel { private readonly ILocalizationService _localizationService; private readonly IWorldMinimapService _minimapService; private readonly IFixedTicker _ticker; private readonly IManagedItemService _itemService; private readonly IMarkService _markService; private readonly IEntitiesService _entitiesService; [UXBindPath("map-container")] private VisualElement _mapContainer; [UXBindPath("map-position")] private VisualElement _mapPosition; private VisualTreeAsset _markTemplate; private readonly ConcurrentDictionary _markPoints = new(); private readonly HashSet _fixedPoints = new(); private bool _isInitialized; private bool _isUiInitialized; private bool _isDragging; private float _scale=1; private Vector3 _offset; private readonly Dictionary _registerQueue = new(); public UXMap(IServiceProvider serviceProvider, IWorldMinimapService minimapService, IFixedTicker ticker, IMarkService markService, IEntitiesService entitiesService, IManagedItemService itemService, ILocalizationService localizationService) : base(serviceProvider) { _minimapService = minimapService; _ticker = ticker; _markService = markService; _entitiesService = entitiesService; _itemService = itemService; _localizationService = localizationService; _minimapService.OnMinimapInitialized += OnMinimapInitialized; _entitiesService.OnAdd += OnAdd; _entitiesService.OnRemove += OnRemove; _ticker.Add(OnFixedTick); } private void OnRemove(IEntity obj) { _registerQueue.TryRemove(obj.Id); if (_markPoints.ContainsKey(obj.Id)) { _fixedPoints.Remove(obj.Id); OnMark(obj.Id,false); } } private void OnAdd(IEntity obj) { if (_isUiInitialized is false) { _registerQueue[obj.Id] = obj; return; } switch (obj.ServiceProvider) { case not null when obj.ServiceProvider.QueryComponents(out LandMark landMark) && string.IsNullOrEmpty(landMark.IconName): { var label = _mapContainer.parent.Create