This commit is contained in:
rootdarkarchon
2023-05-02 20:56:07 +02:00
parent f8993916bd
commit ae5f1e9527
12 changed files with 170 additions and 121 deletions

View File

@@ -83,7 +83,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
}
});
CheckAndUpdateObject();
_dalamudUtil.RunOnFrameworkThread(CheckAndUpdateObject).GetAwaiter().GetResult();
}
public IntPtr Address { get; private set; }
@@ -93,6 +93,19 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
private IntPtr DrawObjectAddress { get; set; }
private byte[] EquipSlotData { get; set; } = new byte[40];
public async Task ActOnFrameworkAfterEnsureNoDrawAsync(Action act, CancellationToken token)
{
while (await _dalamudUtil.RunOnFrameworkThread(() =>
{
if (IsBeingDrawn()) return true;
act();
return false;
}).ConfigureAwait(false))
{
await Task.Delay(250, token).ConfigureAwait(false);
}
}
public IntPtr CurrentAddress()
{
_dalamudUtil.EnsureIsOnFramework();
@@ -104,25 +117,6 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
return _dalamudUtil.CreateGameObject(Address);
}
private bool IsBeingDrawn()
{
var curPtr = _getAddress();
Logger.LogTrace("[{this}] IsBeingDrawnRunOnFramework, CurPtr: {ptr}", this, curPtr.ToString("X"));
if (curPtr == IntPtr.Zero)
{
Logger.LogTrace("[{this}] IsBeingDrawnRunOnFramework, CurPtr is ZERO, returning", this);
Address = IntPtr.Zero;
DrawObjectAddress = IntPtr.Zero;
return false;
}
var drawObj = GetDrawObj(curPtr);
Logger.LogTrace("[{this}] IsBeingDrawnRunOnFramework, DrawObjPtr: {ptr}", this, drawObj.ToString("X"));
return IsBeingDrawn(drawObj, curPtr);
}
public async Task<bool> IsBeingDrawnRunOnFrameworkAsync()
{
return await _dalamudUtil.RunOnFrameworkThread(IsBeingDrawn).ConfigureAwait(false);
@@ -142,19 +136,6 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
Mediator.Publish(new RemoveWatchedGameObjectHandler(this));
}
public async Task ActOnFrameworkAfterEnsureNoDrawAsync(Action act, CancellationToken token)
{
while (await _dalamudUtil.RunOnFrameworkThread(() =>
{
if (IsBeingDrawn()) return true;
act();
return false;
}).ConfigureAwait(false))
{
await Task.Delay(250, token).ConfigureAwait(false);
}
}
private unsafe void CheckAndUpdateObject()
{
if (_haltProcessing) return;
@@ -281,6 +262,25 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
return (IntPtr)((GameObject*)curPtr)->DrawObject;
}
private bool IsBeingDrawn()
{
var curPtr = _getAddress();
Logger.LogTrace("[{this}] IsBeingDrawnRunOnFramework, CurPtr: {ptr}", this, curPtr.ToString("X"));
if (curPtr == IntPtr.Zero)
{
Logger.LogTrace("[{this}] IsBeingDrawnRunOnFramework, CurPtr is ZERO, returning", this);
Address = IntPtr.Zero;
DrawObjectAddress = IntPtr.Zero;
return false;
}
var drawObj = GetDrawObj(curPtr);
Logger.LogTrace("[{this}] IsBeingDrawnRunOnFramework, DrawObjPtr: {ptr}", this, drawObj.ToString("X"));
return IsBeingDrawn(drawObj, curPtr);
}
private unsafe bool IsBeingDrawn(IntPtr drawObj, IntPtr curPtr)
{
Logger.LogTrace("[{this}] IsBeingDrawnRunOnFramework, Checking IsBeingDrawn for Ptr {curPtr} : DrawObj {drawObj}", this, curPtr.ToString("X"), drawObj.ToString("X"));