This commit is contained in:
Stanley Dimant
2022-07-24 14:44:36 +02:00
parent af7dd239aa
commit e31c232f79
7 changed files with 24 additions and 43 deletions

View File

@@ -11,7 +11,6 @@ using MareSynchronos.FileCacheDB;
using MareSynchronos.Interop; using MareSynchronos.Interop;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
using Penumbra.GameData.ByteString;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
namespace MareSynchronos.Managers; namespace MareSynchronos.Managers;

View File

@@ -254,7 +254,7 @@ public class OnlinePlayerManager : IDisposable
{ {
Task.Run(async () => Task.Run(async () =>
{ {
await _apiController.PushCharacterData(_playerManager.LastCreatedCharacterData!, await _apiController.PushCharacterData(_playerManager.LastCreatedCharacterData,
visiblePlayers); visiblePlayers);
}); });
} }

View File

@@ -31,7 +31,7 @@ namespace MareSynchronos.Managers
private DateTime _lastPlayerObjectCheck; private DateTime _lastPlayerObjectCheck;
private CharacterEquipment? _currentCharacterEquipment = new(); private CharacterEquipment? _currentCharacterEquipment = new();
private List<PlayerOrRelatedObject> playerAttachedObjects = new List<PlayerOrRelatedObject>(); private List<PlayerRelatedObject> playerRelatedObjects = new List<PlayerRelatedObject>();
public unsafe PlayerManager(ApiController apiController, IpcManager ipcManager, public unsafe PlayerManager(ApiController apiController, IpcManager ipcManager,
CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil) CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil)
@@ -53,13 +53,13 @@ namespace MareSynchronos.Managers
ApiControllerOnConnected(); ApiControllerOnConnected();
} }
playerAttachedObjects = new List<PlayerOrRelatedObject>() playerRelatedObjects = new List<PlayerRelatedObject>()
{ {
new PlayerOrRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.PlayerPointer), new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.PlayerPointer),
new PlayerOrRelatedObject(ObjectKind.Minion, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((Character*)_dalamudUtil.PlayerPointer)->CompanionObject), new PlayerRelatedObject(ObjectKind.Minion, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((Character*)_dalamudUtil.PlayerPointer)->CompanionObject),
new PlayerOrRelatedObject(ObjectKind.Pet, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetPet()), new PlayerRelatedObject(ObjectKind.Pet, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetPet()),
new PlayerOrRelatedObject(ObjectKind.Companion, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetCompanion()), new PlayerRelatedObject(ObjectKind.Companion, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetCompanion()),
new PlayerOrRelatedObject(ObjectKind.Mount, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((CharaExt*)_dalamudUtil.PlayerPointer)->Mount), new PlayerRelatedObject(ObjectKind.Mount, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((CharaExt*)_dalamudUtil.PlayerPointer)->Mount),
}; };
} }
@@ -80,8 +80,8 @@ namespace MareSynchronos.Managers
if (DateTime.Now < _lastPlayerObjectCheck.AddSeconds(0.25)) return; if (DateTime.Now < _lastPlayerObjectCheck.AddSeconds(0.25)) return;
playerAttachedObjects.ForEach(k => k.CheckAndUpdateObject()); playerRelatedObjects.ForEach(k => k.CheckAndUpdateObject());
if (playerAttachedObjects.Any(c => c.HasUnprocessedUpdate && !c.IsProcessing)) if (playerRelatedObjects.Any(c => c.HasUnprocessedUpdate && !c.IsProcessing))
{ {
OnPlayerOrAttachedObjectsChanged(); OnPlayerOrAttachedObjectsChanged();
} }
@@ -105,7 +105,7 @@ namespace MareSynchronos.Managers
private async Task<CharacterCacheDto?> CreateFullCharacterCacheDto(CancellationToken token) private async Task<CharacterCacheDto?> CreateFullCharacterCacheDto(CancellationToken token)
{ {
foreach (var unprocessedObject in playerAttachedObjects.Where(c => c.HasUnprocessedUpdate).ToList()) foreach (var unprocessedObject in playerRelatedObjects.Where(c => c.HasUnprocessedUpdate).ToList())
{ {
Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind); Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind);
PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address); PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address);
@@ -130,7 +130,7 @@ namespace MareSynchronos.Managers
{ {
Logger.Verbose("RedrawEvent for addr " + address); Logger.Verbose("RedrawEvent for addr " + address);
foreach (var item in playerAttachedObjects) foreach (var item in playerRelatedObjects)
{ {
if (address == item.Address) if (address == item.Address)
{ {
@@ -139,7 +139,7 @@ namespace MareSynchronos.Managers
} }
} }
if (playerAttachedObjects.Any(c => c.HasUnprocessedUpdate)) if (playerRelatedObjects.Any(c => c.HasUnprocessedUpdate))
{ {
OnPlayerOrAttachedObjectsChanged(); OnPlayerOrAttachedObjectsChanged();
} }
@@ -149,7 +149,7 @@ namespace MareSynchronos.Managers
{ {
if (_dalamudUtil.IsInGpose) return; if (_dalamudUtil.IsInGpose) return;
var unprocessedObjects = playerAttachedObjects.Where(c => c.HasUnprocessedUpdate); var unprocessedObjects = playerRelatedObjects.Where(c => c.HasUnprocessedUpdate);
foreach (var unprocessedObject in unprocessedObjects) foreach (var unprocessedObject in unprocessedObjects)
{ {
unprocessedObject.IsProcessing = true; unprocessedObject.IsProcessing = true;

View File

@@ -7,7 +7,7 @@ using Penumbra.GameData.ByteString;
namespace MareSynchronos.Models namespace MareSynchronos.Models
{ {
internal class PlayerOrRelatedObject internal class PlayerRelatedObject
{ {
private readonly Func<IntPtr> getAddress; private readonly Func<IntPtr> getAddress;
@@ -21,7 +21,7 @@ namespace MareSynchronos.Models
private IntPtr CurrentAddress => getAddress.Invoke(); private IntPtr CurrentAddress => getAddress.Invoke();
public PlayerOrRelatedObject(ObjectKind objectKind, IntPtr address, IntPtr drawObjectAddress, Func<IntPtr> getAddress) public PlayerRelatedObject(ObjectKind objectKind, IntPtr address, IntPtr drawObjectAddress, Func<IntPtr> getAddress)
{ {
ObjectKind = objectKind; ObjectKind = objectKind;
Address = address; Address = address;

View File

@@ -114,18 +114,6 @@ namespace MareSynchronos.Utils
return (Dalamud.Game.ClientState.Objects.Types.Character)objTableObj; return (Dalamud.Game.ClientState.Objects.Types.Character)objTableObj;
} }
internal unsafe int GetIdxBasedOnPtr(FFXIVClientStructs.FFXIV.Client.Game.Character.Character* pet)
{
var idx = 0;
foreach (var item in _objectTable)
{
if (item.Address == (IntPtr)pet) return idx;
idx++;
}
return -1;
}
public PlayerCharacter? GetPlayerCharacterFromObjectTableByName(string characterName) public PlayerCharacter? GetPlayerCharacterFromObjectTableByName(string characterName)
{ {
foreach (var item in _objectTable) foreach (var item in _objectTable)
@@ -137,12 +125,6 @@ namespace MareSynchronos.Utils
return null; return null;
} }
public unsafe void DebugPrintRenderFlags(IntPtr characterAddress)
{
var obj = (GameObject*)characterAddress;
Logger.Verbose("RenderFlags for " + characterAddress + ": " + Convert.ToString(obj->RenderFlags, 2));
}
public unsafe void WaitWhileCharacterIsDrawing(IntPtr characterAddress, CancellationToken? ct = null) public unsafe void WaitWhileCharacterIsDrawing(IntPtr characterAddress, CancellationToken? ct = null)
{ {
if (!_clientState.IsLoggedIn) return; if (!_clientState.IsLoggedIn) return;

View File

@@ -19,10 +19,10 @@ namespace MareSynchronos.WebAPI
private int _downloadId = 0; private int _downloadId = 0;
public void CancelUpload() public void CancelUpload()
{ {
if (_uploadToken != null) if (_uploadCancellationTokenSource != null)
{ {
Logger.Debug("Cancelling upload"); Logger.Debug("Cancelling upload");
_uploadToken?.Cancel(); _uploadCancellationTokenSource?.Cancel();
_mareHub!.SendAsync(Api.SendFileAbortUpload); _mareHub!.SendAsync(Api.SendFileAbortUpload);
CurrentUploads.Clear(); CurrentUploads.Clear();
} }
@@ -123,8 +123,8 @@ namespace MareSynchronos.WebAPI
Logger.Debug("Sending Character data to service " + ApiUri); Logger.Debug("Sending Character data to service " + ApiUri);
CancelUpload(); CancelUpload();
_uploadToken = new CancellationTokenSource(); _uploadCancellationTokenSource = new CancellationTokenSource();
var uploadToken = _uploadToken.Token; var uploadToken = _uploadCancellationTokenSource.Token;
Logger.Verbose("New Token Created"); Logger.Verbose("New Token Created");
var filesToUpload = await _mareHub!.InvokeAsync<List<UploadFileDto>>(Api.InvokeFileSendFiles, character.FileReplacements.SelectMany(c => c.Value.Select(v => v.Hash)).Distinct(), uploadToken); var filesToUpload = await _mareHub!.InvokeAsync<List<UploadFileDto>>(Api.InvokeFileSendFiles, character.FileReplacements.SelectMany(c => c.Value.Select(v => v.Hash)).Distinct(), uploadToken);
@@ -204,7 +204,7 @@ namespace MareSynchronos.WebAPI
} }
Logger.Verbose("Upload complete for " + character.GetHashCode()); Logger.Verbose("Upload complete for " + character.GetHashCode());
_uploadToken = null; _uploadCancellationTokenSource = null;
} }
private async Task<(string, byte[])> GetCompressedFileData(string fileHash, CancellationToken uploadToken) private async Task<(string, byte[])> GetCompressedFileData(string fileHash, CancellationToken uploadToken)

View File

@@ -37,7 +37,7 @@ namespace MareSynchronos.WebAPI
private HubConnection? _mareHub; private HubConnection? _mareHub;
private CancellationTokenSource? _uploadToken = new(); private CancellationTokenSource? _uploadCancellationTokenSource = new();
private ConnectionDto? _connectionDto; private ConnectionDto? _connectionDto;
public SystemInfoDto SystemInfoDto { get; private set; } = new(); public SystemInfoDto SystemInfoDto { get; private set; } = new();
@@ -268,7 +268,7 @@ namespace MareSynchronos.WebAPI
{ {
CurrentUploads.Clear(); CurrentUploads.Clear();
CurrentDownloads.Clear(); CurrentDownloads.Clear();
_uploadToken?.Cancel(); _uploadCancellationTokenSource?.Cancel();
Logger.Debug("Connection closed"); Logger.Debug("Connection closed");
Disconnected?.Invoke(); Disconnected?.Invoke();
return Task.CompletedTask; return Task.CompletedTask;
@@ -286,7 +286,7 @@ namespace MareSynchronos.WebAPI
{ {
CurrentUploads.Clear(); CurrentUploads.Clear();
CurrentDownloads.Clear(); CurrentDownloads.Clear();
_uploadToken?.Cancel(); _uploadCancellationTokenSource?.Cancel();
Logger.Debug("Connection closed... Reconnecting"); Logger.Debug("Connection closed... Reconnecting");
Disconnected?.Invoke(); Disconnected?.Invoke();
return Task.CompletedTask; return Task.CompletedTask;