add minion sync (experimental)
This commit is contained in:
		| @@ -195,10 +195,24 @@ public class CharacterDataFactory | |||||||
|  |  | ||||||
|         AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->Decal->FileName()).ToString(), cache, 0, "Decal", false); |         AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->Decal->FileName()).ToString(), cache, 0, "Decal", false); | ||||||
|         AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->LegacyBodyDecal->FileName()).ToString(), cache, 0, "Legacy Decal", false); |         AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->LegacyBodyDecal->FileName()).ToString(), cache, 0, "Legacy Decal", false); | ||||||
|  |  | ||||||
|  |  | ||||||
|         AddReplacementSkeleton(((HumanExt*)human)->Human.RaceSexId, cache); |         AddReplacementSkeleton(((HumanExt*)human)->Human.RaceSexId, cache); | ||||||
|  |  | ||||||
|  |         var minion = ((Character*)_dalamudUtil.PlayerPointer)->CompanionObject; | ||||||
|  |         if (minion != null) | ||||||
|  |         { | ||||||
|  |             var minionDrawObj = ((CharacterBase*)minion->Character.GameObject.GetDrawObject()); | ||||||
|  |             for (var mdlIdx = 0; mdlIdx < minionDrawObj->SlotCount; mdlIdx++) | ||||||
|  |             { | ||||||
|  |                 var mdl = (RenderModel*)minionDrawObj->ModelArray[mdlIdx]; | ||||||
|  |                 if (mdl == null || mdl->ResourceHandle == null) | ||||||
|  |                 { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 AddReplacementsFromRenderModel(mdl, cache, 0, "Companion"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         st.Stop(); |         st.Stop(); | ||||||
|         Logger.Verbose("Building Character Data took " + st.Elapsed); |         Logger.Verbose("Building Character Data took " + st.Elapsed); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,11 +5,13 @@ using System.Threading; | |||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using Dalamud.Game.ClientState.Objects.SubKinds; | using Dalamud.Game.ClientState.Objects.SubKinds; | ||||||
| using Dalamud.Logging; | using Dalamud.Logging; | ||||||
|  | using FFXIVClientStructs.FFXIV.Client.Game.Character; | ||||||
| using MareSynchronos.API; | using MareSynchronos.API; | ||||||
| using MareSynchronos.FileCacheDB; | using MareSynchronos.FileCacheDB; | ||||||
| using MareSynchronos.Utils; | using MareSynchronos.Utils; | ||||||
| using MareSynchronos.WebAPI; | using MareSynchronos.WebAPI; | ||||||
| using MareSynchronos.WebAPI.Utils; | using MareSynchronos.WebAPI.Utils; | ||||||
|  | using Penumbra.GameData.ByteString; | ||||||
| using Penumbra.GameData.Structs; | using Penumbra.GameData.Structs; | ||||||
|  |  | ||||||
| namespace MareSynchronos.Managers; | namespace MareSynchronos.Managers; | ||||||
| @@ -182,7 +184,7 @@ public class CachedPlayer | |||||||
|         return missingFiles; |         return missingFiles; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void ApplyCharacterData(CharacterCacheDto cache, Dictionary<string, string> moddedPaths) |     private unsafe void ApplyCharacterData(CharacterCacheDto cache, Dictionary<string, string> moddedPaths) | ||||||
|     { |     { | ||||||
|         if (PlayerCharacter is null) return; |         if (PlayerCharacter is null) return; | ||||||
|         _ipcManager.PenumbraRemoveTemporaryCollection(PlayerName!); |         _ipcManager.PenumbraRemoveTemporaryCollection(PlayerName!); | ||||||
| @@ -193,6 +195,15 @@ public class CachedPlayer | |||||||
|             $"Request Redraw for {PlayerName}"); |             $"Request Redraw for {PlayerName}"); | ||||||
|         _ipcManager.PenumbraSetTemporaryMods(tempCollection, moddedPaths, cache.ManipulationData); |         _ipcManager.PenumbraSetTemporaryMods(tempCollection, moddedPaths, cache.ManipulationData); | ||||||
|         _ipcManager.GlamourerApplyAll(cache.GlamourerData, PlayerCharacter!); |         _ipcManager.GlamourerApplyAll(cache.GlamourerData, PlayerCharacter!); | ||||||
|  |         var minion = ((Character*)PlayerCharacter.Address)->CompanionObject; | ||||||
|  |         if (minion != null) | ||||||
|  |         { | ||||||
|  |             var compName = new Utf8String(minion->Character.GameObject.GetName()).ToString(); | ||||||
|  |             if (compName != null) | ||||||
|  |             { | ||||||
|  |                 _ipcManager.PenumbraRedraw(compName); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void DisposePlayer() |     public void DisposePlayer() | ||||||
|   | |||||||
| @@ -7,6 +7,9 @@ using System.Threading; | |||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using MareSynchronos.API; | using MareSynchronos.API; | ||||||
| using Penumbra.GameData.Structs; | using Penumbra.GameData.Structs; | ||||||
|  | using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; | ||||||
|  | using FFXIVClientStructs.FFXIV.Client.Game.Character; | ||||||
|  | using Penumbra.GameData.ByteString; | ||||||
|  |  | ||||||
| namespace MareSynchronos.Managers | namespace MareSynchronos.Managers | ||||||
| { | { | ||||||
| @@ -25,6 +28,7 @@ namespace MareSynchronos.Managers | |||||||
|         private CancellationTokenSource? _playerChangedCts; |         private CancellationTokenSource? _playerChangedCts; | ||||||
|         private DateTime _lastPlayerObjectCheck; |         private DateTime _lastPlayerObjectCheck; | ||||||
|         private CharacterEquipment? _currentCharacterEquipment; |         private CharacterEquipment? _currentCharacterEquipment; | ||||||
|  |         private string _lastMinionName = string.Empty; | ||||||
|  |  | ||||||
|         public PlayerManager(ApiController apiController, IpcManager ipcManager, |         public PlayerManager(ApiController apiController, IpcManager ipcManager, | ||||||
|             CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil) |             CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil) | ||||||
| @@ -57,14 +61,23 @@ namespace MareSynchronos.Managers | |||||||
|             _dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate; |             _dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void DalamudUtilOnFrameworkUpdate() |         private unsafe void DalamudUtilOnFrameworkUpdate() | ||||||
|         { |         { | ||||||
|             if (!_dalamudUtil.IsPlayerPresent || !_ipcManager.Initialized || !_apiController.IsConnected) return; |             if (!_dalamudUtil.IsPlayerPresent || !_ipcManager.Initialized || !_apiController.IsConnected) return; | ||||||
|  |  | ||||||
|             if (DateTime.Now < _lastPlayerObjectCheck.AddSeconds(0.25)) return; |             if (DateTime.Now < _lastPlayerObjectCheck.AddSeconds(0.25)) return; | ||||||
|  |  | ||||||
|             if (_dalamudUtil.IsPlayerPresent && !_currentCharacterEquipment!.CompareAndUpdate(_dalamudUtil.PlayerCharacter)) |             var minion = ((Character*)_dalamudUtil.PlayerPointer)->CompanionObject; | ||||||
|  |             string minionName = ""; | ||||||
|  |             if (minion != null) | ||||||
|             { |             { | ||||||
|  |                 minionName = new Utf8String(minion->Character.GameObject.GetName()).ToString(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (_dalamudUtil.IsPlayerPresent | ||||||
|  |                 && (!_currentCharacterEquipment!.CompareAndUpdate(_dalamudUtil.PlayerCharacter) || minionName != _lastMinionName)) | ||||||
|  |             { | ||||||
|  |                 _lastMinionName = minionName; | ||||||
|                 OnPlayerChanged(); |                 OnPlayerChanged(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Stanley Dimant
					Stanley Dimant