merge from main

This commit is contained in:
Stanley Dimant
2022-09-03 15:06:01 +02:00
11 changed files with 183 additions and 130 deletions

View File

@@ -9,9 +9,9 @@ using FFXIVClientStructs.FFXIV.Client.Game.Character;
using MareSynchronos.API;
using MareSynchronos.FileCacheDB;
using MareSynchronos.Interop;
using MareSynchronos.Models;
using MareSynchronos.Utils;
using MareSynchronos.WebAPI;
using Penumbra.GameData.Structs;
namespace MareSynchronos.Managers;
@@ -59,7 +59,7 @@ public class CachedPlayer
private CharacterCacheDto _cachedData = new();
private CharacterEquipment? _currentCharacterEquipment;
private PlayerRelatedObject? _currentCharacterEquipment;
public void ApplyCharacterData(CharacterCacheDto characterData)
{
@@ -235,15 +235,29 @@ public class CachedPlayer
RequestedPenumbraRedraw = true;
Logger.Debug(
$"Request Redraw for {PlayerName}");
_ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter.Address);
}
else if (objectKind == ObjectKind.Minion)
{
var minion = ((Character*)PlayerCharacter.Address)->CompanionObject;
if (minion != null)
if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData))
{
Logger.Debug($"Request Redraw for Minion");
_ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minion);
_ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter.Address);
}
else
{
_ipcManager.PenumbraRedraw(PlayerCharacter.Address);
}
}
else if (objectKind == ObjectKind.MinionOrMount)
{
var minionOrMount = ((Character*)PlayerCharacter.Address)->CompanionObject;
if (minionOrMount != null)
{
Logger.Debug($"Request Redraw for Minion/Mount");
if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData))
{
_ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minionOrMount);
}
else
{
_ipcManager.PenumbraRedraw((IntPtr)minionOrMount);
}
}
}
else if (objectKind == ObjectKind.Pet)
@@ -252,7 +266,14 @@ public class CachedPlayer
if (pet != IntPtr.Zero)
{
Logger.Debug("Request Redraw for Pet");
_ipcManager.GlamourerApplyAll(glamourerData, pet);
if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData))
{
_ipcManager.GlamourerApplyAll(glamourerData, pet);
}
else
{
_ipcManager.PenumbraRedraw(pet);
}
}
}
else if (objectKind == ObjectKind.Companion)
@@ -261,16 +282,14 @@ public class CachedPlayer
if (companion != IntPtr.Zero)
{
Logger.Debug("Request Redraw for Companion");
_ipcManager.GlamourerApplyAll(glamourerData, companion);
}
}
else if (objectKind == ObjectKind.Mount)
{
var mount = ((CharaExt*)PlayerCharacter.Address)->Mount;
if (mount != null)
{
Logger.Debug($"Request Redraw for Mount");
_ipcManager.PenumbraRedraw((IntPtr)mount);
if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData))
{
_ipcManager.GlamourerApplyAll(glamourerData, companion);
}
else
{
_ipcManager.PenumbraRedraw(companion);
}
}
}
}
@@ -281,15 +300,22 @@ public class CachedPlayer
if (objectKind == ObjectKind.Player)
{
_ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter);
_ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter);
}
else if (objectKind == ObjectKind.Minion)
{
var minion = ((Character*)PlayerCharacter.Address)->CompanionObject;
if (minion != null)
if (_ipcManager.CheckGlamourerApi())
{
_ipcManager.PenumbraRedraw((IntPtr)minion);
_ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter);
_ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter);
}
else
{
_ipcManager.PenumbraRedraw(PlayerCharacter.Address);
}
}
else if (objectKind == ObjectKind.MinionOrMount)
{
var minionOrMount = ((Character*)PlayerCharacter.Address)->CompanionObject;
if (minionOrMount != null)
{
_ipcManager.PenumbraRedraw((IntPtr)minionOrMount);
}
}
else if (objectKind == ObjectKind.Pet)
@@ -308,14 +334,6 @@ public class CachedPlayer
_ipcManager.PenumbraRedraw(companion);
}
}
else if (objectKind == ObjectKind.Mount)
{
var mount = ((CharaExt*)PlayerCharacter.Address)->Mount;
if (mount != null)
{
_ipcManager.PenumbraRedraw((IntPtr)mount);
}
}
}
public void DisposePlayer()
@@ -363,7 +381,8 @@ public class CachedPlayer
_dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate;
_ipcManager.PenumbraRedrawEvent += IpcManagerOnPenumbraRedrawEvent;
_originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter);
_currentCharacterEquipment = new CharacterEquipment(PlayerCharacter);
_currentCharacterEquipment = new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero,
() => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero);
_isDisposed = false;
if (cache != null)
{
@@ -382,7 +401,8 @@ public class CachedPlayer
return;
}
if (!_currentCharacterEquipment!.CompareAndUpdate(PlayerCharacter))
_currentCharacterEquipment?.CheckAndUpdateObject();
if (_currentCharacterEquipment?.HasUnprocessedUpdate ?? false)
{
OnPlayerChanged();
}
@@ -406,7 +426,9 @@ public class CachedPlayer
_penumbraRedrawEventTask = Task.Run(() =>
{
PlayerCharacter = player;
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address);
using var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5));
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address, cts.Token);
if (RequestedPenumbraRedraw == false)
{
@@ -425,6 +447,7 @@ public class CachedPlayer
private void OnPlayerChanged()
{
Logger.Debug($"Player {PlayerName} changed, PenumbraRedraw is {RequestedPenumbraRedraw}");
_currentCharacterEquipment!.HasUnprocessedUpdate = false;
if (!RequestedPenumbraRedraw && PlayerCharacter is not null)
{
Logger.Debug($"Saving new Glamourer data");

View File

@@ -158,12 +158,19 @@ namespace MareSynchronos.Managers
public string GlamourerGetCharacterCustomization(GameObject character)
{
if (!CheckGlamourerApi()) return string.Empty;
var glamourerString = _glamourerGetAllCustomization!.InvokeFunc(character);
byte[] bytes = Convert.FromBase64String(glamourerString);
// ignore transparency
bytes[88] = 128;
bytes[89] = 63;
return Convert.ToBase64String(bytes);
try
{
var glamourerString = _glamourerGetAllCustomization!.InvokeFunc(character);
byte[] bytes = Convert.FromBase64String(glamourerString);
// ignore transparency
bytes[88] = 128;
bytes[89] = 63;
return Convert.ToBase64String(bytes);
}
catch
{
return string.Empty;
}
}
public void GlamourerRevertCharacterCustomization(GameObject character)

View File

@@ -5,12 +5,10 @@ using System;
using System.Threading;
using System.Threading.Tasks;
using MareSynchronos.API;
using Penumbra.GameData.Structs;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using System.Collections.Generic;
using System.Linq;
using MareSynchronos.Models;
using MareSynchronos.Interop;
namespace MareSynchronos.Managers
{
@@ -30,7 +28,6 @@ namespace MareSynchronos.Managers
private CancellationTokenSource? _playerChangedCts = new();
private DateTime _lastPlayerObjectCheck;
private CharacterEquipment? _currentCharacterEquipment = new();
private List<PlayerRelatedObject> playerRelatedObjects = new List<PlayerRelatedObject>();
@@ -58,10 +55,9 @@ namespace MareSynchronos.Managers
playerRelatedObjects = new List<PlayerRelatedObject>()
{
new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.PlayerPointer),
new PlayerRelatedObject(ObjectKind.Minion, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((Character*)_dalamudUtil.PlayerPointer)->CompanionObject),
new PlayerRelatedObject(ObjectKind.MinionOrMount, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((Character*)_dalamudUtil.PlayerPointer)->CompanionObject),
new PlayerRelatedObject(ObjectKind.Pet, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetPet()),
new PlayerRelatedObject(ObjectKind.Companion, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetCompanion()),
new PlayerRelatedObject(ObjectKind.Mount, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((CharaExt*)_dalamudUtil.PlayerPointer)->Mount),
};
}