diff --git a/MareSynchronos/PlayerData/Handlers/PairHandler.cs b/MareSynchronos/PlayerData/Handlers/PairHandler.cs index d4320f6..077dafa 100644 --- a/MareSynchronos/PlayerData/Handlers/PairHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/PairHandler.cs @@ -470,6 +470,10 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase if (updateModdedPaths) { + // ensure collection is set + var objIndex = await _dalamudUtil.RunOnFrameworkThread(() => _charaHandler!.GetGameObject()!.ObjectIndex).ConfigureAwait(false); + await _ipcManager.Penumbra.AssignTemporaryCollectionAsync(Logger, _penumbraCollection, objIndex).ConfigureAwait(false); + await _ipcManager.Penumbra.SetTemporaryModsAsync(Logger, _applicationId, _penumbraCollection, moddedPaths.ToDictionary(k => k.Key.GamePath, k => k.Value, StringComparer.Ordinal)).ConfigureAwait(false); LastAppliedDataBytes = -1; diff --git a/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs b/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs index 5fb87e2..7b9e025 100644 --- a/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs +++ b/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs @@ -29,7 +29,7 @@ public sealed class CharaDataCharacterHandler : DisposableMediatorSubscriberBase { foreach (var chara in _handledCharaData) { - RevertHandledChara(chara, false); + RevertHandledChara(chara); } }); @@ -56,11 +56,11 @@ public sealed class CharaDataCharacterHandler : DisposableMediatorSubscriberBase base.Dispose(disposing); foreach (var chara in _handledCharaData) { - RevertHandledChara(chara, false); + RevertHandledChara(chara); } } - public async Task RevertChara(string name, Guid? cPlusId, bool reapplyPose = true) + public async Task RevertChara(string name, Guid? cPlusId) { Guid applicationId = Guid.NewGuid(); await _ipcManager.Glamourer.RevertByNameAsync(Logger, name, applicationId).ConfigureAwait(false); @@ -75,20 +75,20 @@ public sealed class CharaDataCharacterHandler : DisposableMediatorSubscriberBase await _ipcManager.Penumbra.RedrawAsync(Logger, handler, applicationId, CancellationToken.None).ConfigureAwait(false); } - public async Task RevertHandledChara(string name, bool reapplyPose = true) + public async Task RevertHandledChara(string name) { var handled = _handledCharaData.FirstOrDefault(f => string.Equals(f.Name, name, StringComparison.Ordinal)); if (handled == null) return false; _handledCharaData.Remove(handled); - await _dalamudUtilService.RunOnFrameworkThread(() => RevertChara(handled.Name, handled.CustomizePlus, reapplyPose)).ConfigureAwait(false); + await _dalamudUtilService.RunOnFrameworkThread(() => RevertChara(handled.Name, handled.CustomizePlus)).ConfigureAwait(false); return true; } - public Task RevertHandledChara(HandledCharaDataEntry? handled, bool reapplyPose = true) + public Task RevertHandledChara(HandledCharaDataEntry? handled) { if (handled == null) return Task.CompletedTask; _handledCharaData.Remove(handled); - return _dalamudUtilService.RunOnFrameworkThread(() => RevertChara(handled.Name, handled.CustomizePlus, reapplyPose)); + return _dalamudUtilService.RunOnFrameworkThread(() => RevertChara(handled.Name, handled.CustomizePlus)); } internal void AddHandledChara(HandledCharaDataEntry handledCharaDataEntry) diff --git a/MareSynchronos/Services/CharaData/CharaDataGposeTogetherManager.cs b/MareSynchronos/Services/CharaData/CharaDataGposeTogetherManager.cs index dba9897..351f2f8 100644 --- a/MareSynchronos/Services/CharaData/CharaDataGposeTogetherManager.cs +++ b/MareSynchronos/Services/CharaData/CharaDataGposeTogetherManager.cs @@ -131,8 +131,7 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase _lastCreatedCharaData = (playerData, charaDataDownloadDto); } - _lastFullPoseData = null; - _lastWorldData = null; + ForceResendOwnData(); if (_lastCreatedCharaData != null) await _apiController.GposeLobbyPushCharacterData(_lastCreatedCharaData.Value.Dto) @@ -251,8 +250,6 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase node["OffHand"]![bone.Key]!["Rotation"] = $"{bone.Value.RotationX.ToString(CultureInfo.InvariantCulture)}, {bone.Value.RotationY.ToString(CultureInfo.InvariantCulture)}, {bone.Value.RotationZ.ToString(CultureInfo.InvariantCulture)}, {bone.Value.RotationW.ToString(CultureInfo.InvariantCulture)}"; } - Logger.LogTrace(node.ToJsonString(new System.Text.Json.JsonSerializerOptions() { WriteIndented = true })); - return node.ToJsonString(); } @@ -382,7 +379,10 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase var poseJson = await _brio.GetPoseAsync(chara.Address).ConfigureAwait(false); if (string.IsNullOrEmpty(poseJson)) continue; - var poseData = CreatePoseDataFromJson(poseJson, _poseGenerationExecutions++ >= 12 ? null : _lastFullPoseData); + var lastFullData = _poseGenerationExecutions++ >= 12 ? null : _lastFullPoseData; + lastFullData = _forceResendFullPose ? _lastFullPoseData : lastFullData; + + var poseData = CreatePoseDataFromJson(poseJson, lastFullData); if (!poseData.IsDelta) { _lastFullPoseData = poseData; @@ -394,9 +394,12 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase (poseData.Bones.Keys.All(k => _lastDeltaPoseData.Value.Bones.ContainsKey(k) && poseData.Bones.Values.All(k => _lastDeltaPoseData.Value.Bones.ContainsValue(k)))); - if ((poseData.Bones.Any() || poseData.MainHand.Any() || poseData.OffHand.Any()) - && (!poseData.IsDelta || (poseData.IsDelta && !deltaIsSame))) + if (_forceResendFullPose || ((poseData.Bones.Any() || poseData.MainHand.Any() || poseData.OffHand.Any()) + && (!poseData.IsDelta || (poseData.IsDelta && !deltaIsSame)))) + { + _forceResendFullPose = false; await _apiController.GposeLobbyPushPoseData(poseData).ConfigureAwait(false); + } if (poseData.IsDelta) _lastDeltaPoseData = poseData; @@ -450,8 +453,9 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase var loc = await _dalamudUtil.GetMapDataAsync().ConfigureAwait(false); worldData.LocationInfo = loc; - if (worldData != _lastWorldData) + if (_forceResendWorldData || worldData != _lastWorldData) { + _forceResendWorldData = false; await _apiController.GposeLobbyPushWorldData(worldData).ConfigureAwait(false); _lastWorldData = worldData; Logger.LogTrace("WorldData (gpose: {gpose}): {data}", _dalamudUtil.IsInGpose, worldData); @@ -537,6 +541,7 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase private void OnEnterGpose() { + ForceResendOwnData(); ResetOwnData(); foreach (var data in _usersInLobby.Values) { @@ -547,6 +552,7 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase private void OnExitGpose() { + ForceResendOwnData(); ResetOwnData(); foreach (var data in _usersInLobby.Values) { @@ -554,10 +560,18 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase } } + + private bool _forceResendFullPose = false; + private bool _forceResendWorldData = false; + + private void ForceResendOwnData() + { + _forceResendFullPose = true; + _forceResendWorldData = true; + } + private void ResetOwnData() { - _lastFullPoseData = null; - _lastDeltaPoseData = null; _poseGenerationExecutions = 0; _lastCreatedCharaData = null; } @@ -668,8 +682,6 @@ public class CharaDataGposeTogetherManager : DisposableMediatorSubscriberBase if (_usersInLobby.ContainsKey(userData.UID)) OnUserLeaveLobby(userData); _usersInLobby[userData.UID] = new(userData); - _lastFullPoseData = null; - _lastWorldData = null; _ = PushCharacterDownloadDto(); } diff --git a/MareSynchronos/Services/CharaData/CharaDataManager.cs b/MareSynchronos/Services/CharaData/CharaDataManager.cs index 1725fa2..be9be20 100644 --- a/MareSynchronos/Services/CharaData/CharaDataManager.cs +++ b/MareSynchronos/Services/CharaData/CharaDataManager.cs @@ -981,7 +981,7 @@ public sealed partial class CharaDataManager : DisposableMediatorSubscriberBase if (string.IsNullOrEmpty(handledActor)) return; UiBlockingComputation = Task.Run(async () => { - await _characterHandler.RevertHandledChara(handledActor, false).ConfigureAwait(false); + await _characterHandler.RevertHandledChara(handledActor).ConfigureAwait(false); var gposeChara = await _dalamudUtilService.GetGposeCharacterFromObjectTableByNameAsync(handledActor, true).ConfigureAwait(false); if (gposeChara != null) await _ipcManager.Brio.DespawnActorAsync(gposeChara.Address).ConfigureAwait(false);