 93aff198f2
			
		
	
	93aff198f2
	
	
	
		
			
			* add api glue * most of gpose together impl * more cleanup and impl * more impl * minor fixes and chara name abbreviations --------- Co-authored-by: Stanley Dimant <root.darkarchon@outlook.com>
		
			
				
	
	
		
			175 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Dalamud.Utility;
 | |
| using MareSynchronos.API.Data;
 | |
| using MareSynchronos.API.Dto.CharaData;
 | |
| using MareSynchronos.Utils;
 | |
| using System.Globalization;
 | |
| using System.Numerics;
 | |
| using System.Text;
 | |
| 
 | |
| namespace MareSynchronos.Services.CharaData.Models;
 | |
| 
 | |
| public sealed record GposeLobbyUserData(UserData UserData)
 | |
| {
 | |
|     public void Reset()
 | |
|     {
 | |
|         HasWorldDataUpdate = WorldData != null;
 | |
|         HasPoseDataUpdate = ApplicablePoseData != null;
 | |
|         SpawnedVfxId = null;
 | |
|         LastAppliedCharaDataDate = DateTime.MinValue;
 | |
|     }
 | |
| 
 | |
|     private WorldData? _worldData;
 | |
|     public WorldData? WorldData
 | |
|     {
 | |
|         get => _worldData; set
 | |
|         {
 | |
|             _worldData = value;
 | |
|             HasWorldDataUpdate = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public bool HasWorldDataUpdate { get; set; } = false;
 | |
| 
 | |
|     private PoseData? _fullPoseData;
 | |
|     private PoseData? _deltaPoseData;
 | |
| 
 | |
|     public PoseData? FullPoseData
 | |
|     {
 | |
|         get => _fullPoseData;
 | |
|         set
 | |
|         {
 | |
|             _fullPoseData = value;
 | |
|             ApplicablePoseData = CombinePoseData();
 | |
|             HasPoseDataUpdate = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public PoseData? DeltaPoseData
 | |
|     {
 | |
|         get => _deltaPoseData;
 | |
|         set
 | |
|         {
 | |
|             _deltaPoseData = value;
 | |
|             ApplicablePoseData = CombinePoseData();
 | |
|             HasPoseDataUpdate = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public PoseData? ApplicablePoseData { get; private set; }
 | |
|     public bool HasPoseDataUpdate { get; set; } = false;
 | |
|     public Guid? SpawnedVfxId { get; set; }
 | |
|     public Vector3? LastWorldPosition { get; set; }
 | |
|     public Vector3? TargetWorldPosition { get; set; }
 | |
|     public DateTime? UpdateStart { get; set; }
 | |
|     private CharaDataDownloadDto? _charaData;
 | |
|     public CharaDataDownloadDto? CharaData
 | |
|     {
 | |
|         get => _charaData; set
 | |
|         {
 | |
|             _charaData = value;
 | |
|             LastUpdatedCharaData = _charaData?.UpdatedDate ?? DateTime.MaxValue;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public DateTime LastUpdatedCharaData { get; private set; } = DateTime.MaxValue;
 | |
|     public DateTime LastAppliedCharaDataDate { get; set; } = DateTime.MinValue;
 | |
|     public nint Address { get; set; }
 | |
|     public string AssociatedCharaName { get; set; } = string.Empty;
 | |
| 
 | |
|     private PoseData? CombinePoseData()
 | |
|     {
 | |
|         if (DeltaPoseData == null && FullPoseData != null) return FullPoseData;
 | |
|         if (FullPoseData == null) return null;
 | |
| 
 | |
|         PoseData output = FullPoseData!.Value.DeepClone();
 | |
|         PoseData delta = DeltaPoseData!.Value;
 | |
| 
 | |
|         foreach (var bone in FullPoseData!.Value.Bones)
 | |
|         {
 | |
|             if (!delta.Bones.TryGetValue(bone.Key, out var data)) continue;
 | |
|             if (!data.Exists)
 | |
|             {
 | |
|                 output.Bones.Remove(bone.Key);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 output.Bones[bone.Key] = data;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         foreach (var bone in FullPoseData!.Value.MainHand)
 | |
|         {
 | |
|             if (!delta.MainHand.TryGetValue(bone.Key, out var data)) continue;
 | |
|             if (!data.Exists)
 | |
|             {
 | |
|                 output.MainHand.Remove(bone.Key);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 output.MainHand[bone.Key] = data;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         foreach (var bone in FullPoseData!.Value.OffHand)
 | |
|         {
 | |
|             if (!delta.OffHand.TryGetValue(bone.Key, out var data)) continue;
 | |
|             if (!data.Exists)
 | |
|             {
 | |
|                 output.OffHand.Remove(bone.Key);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 output.OffHand[bone.Key] = data;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return output;
 | |
|     }
 | |
| 
 | |
|     public string WorldDataDescriptor { get; private set; } = string.Empty;
 | |
|     public Vector2 MapCoordinates { get; private set; }
 | |
|     public Lumina.Excel.Sheets.Map Map { get; private set; }
 | |
|     public HandledCharaDataEntry? HandledChara { get; set; }
 | |
| 
 | |
|     public async Task SetWorldDataDescriptor(DalamudUtilService dalamudUtilService)
 | |
|     {
 | |
|         if (WorldData == null)
 | |
|         {
 | |
|             WorldDataDescriptor = "No World Data found";
 | |
|         }
 | |
| 
 | |
|         var worldData = WorldData!.Value;
 | |
|         MapCoordinates = await dalamudUtilService.RunOnFrameworkThread(() =>
 | |
|                 MapUtil.WorldToMap(new Vector2(worldData.PositionX, worldData.PositionY), dalamudUtilService.MapData.Value[worldData.LocationInfo.MapId].Map))
 | |
|             .ConfigureAwait(false);
 | |
|         Map = dalamudUtilService.MapData.Value[worldData.LocationInfo.MapId].Map;
 | |
| 
 | |
|         StringBuilder sb = new();
 | |
|         sb.AppendLine("Server: " + dalamudUtilService.WorldData.Value[(ushort)worldData.LocationInfo.ServerId]);
 | |
|         sb.AppendLine("Territory: " + dalamudUtilService.TerritoryData.Value[worldData.LocationInfo.TerritoryId]);
 | |
|         sb.AppendLine("Map: " + dalamudUtilService.MapData.Value[worldData.LocationInfo.MapId].MapName);
 | |
| 
 | |
|         if (worldData.LocationInfo.WardId != 0)
 | |
|             sb.AppendLine("Ward #: " + worldData.LocationInfo.WardId);
 | |
|         if (worldData.LocationInfo.DivisionId != 0)
 | |
|         {
 | |
|             sb.AppendLine("Subdivision: " + worldData.LocationInfo.DivisionId switch
 | |
|             {
 | |
|                 1 => "No",
 | |
|                 2 => "Yes",
 | |
|                 _ => "-"
 | |
|             });
 | |
|         }
 | |
|         if (worldData.LocationInfo.HouseId != 0)
 | |
|         {
 | |
|             sb.AppendLine("House #: " + (worldData.LocationInfo.HouseId == 100 ? "Apartments" : worldData.LocationInfo.HouseId.ToString()));
 | |
|         }
 | |
|         if (worldData.LocationInfo.RoomId != 0)
 | |
|         {
 | |
|             sb.AppendLine("Apartment #: " + worldData.LocationInfo.RoomId);
 | |
|         }
 | |
|         sb.AppendLine("Coordinates: X: " + MapCoordinates.X.ToString("0.0", CultureInfo.InvariantCulture) + ", Y: " + MapCoordinates.Y.ToString("0.0", CultureInfo.InvariantCulture));
 | |
|         WorldDataDescriptor = sb.ToString();
 | |
|     }
 | |
| }
 |