major refactoring, maybe some bugfixes, idk

This commit is contained in:
Stanley Dimant
2022-06-24 00:47:47 +02:00
parent 0fe3f1cf25
commit 2dcd02d170
22 changed files with 997 additions and 949 deletions

View File

@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Threading;
using Dalamud.Game.ClientState;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.SubKinds;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
namespace MareSynchronos.Utils
{
public class DalamudUtil
{
private readonly ClientState _clientState;
private readonly ObjectTable _objectTable;
public DalamudUtil(ClientState clientState, ObjectTable objectTable)
{
_clientState = clientState;
_objectTable = objectTable;
}
public bool IsPlayerPresent => _clientState.LocalPlayer != null;
public string PlayerName => _clientState.LocalPlayer!.Name.ToString();
public string PlayerNameHashed => Crypto.GetHash256(PlayerName + _clientState.LocalPlayer!.HomeWorld.Id);
public Dictionary<string, PlayerCharacter> GetLocalPlayers()
{
Dictionary<string, PlayerCharacter> allLocalPlayers = new();
foreach (var obj in _objectTable)
{
if (obj.ObjectKind != Dalamud.Game.ClientState.Objects.Enums.ObjectKind.Player) continue;
string playerName = obj.Name.ToString();
if (playerName == PlayerName) continue;
var playerObject = (PlayerCharacter)obj;
allLocalPlayers[Crypto.GetHash256(playerObject.Name.ToString() + playerObject.HomeWorld.Id.ToString())] = playerObject;
}
return allLocalPlayers;
}
public unsafe void WaitWhileCharacterIsDrawing(IntPtr characterAddress)
{
var obj = (GameObject*)characterAddress;
while ((obj->RenderFlags & 0b100000000000) == 0b100000000000) // 0b100000000000 is "still rendering" or something
{
Logger.Debug("Waiting for character to finish drawing");
Thread.Sleep(1000);
}
// wait half a second just in case
Thread.Sleep(500);
}
public void WaitWhileSelfIsDrawing() => WaitWhileCharacterIsDrawing(_clientState.LocalPlayer!.Address);
}
}