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