65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
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 int PlayerJobId => (int)_clientState.LocalPlayer!.ClassJob.Id;
|
|
|
|
public IntPtr PlayerPointer => _clientState.LocalPlayer!.Address;
|
|
|
|
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;
|
|
|
|
// ReSharper disable once LoopVariableIsNeverChangedInsideLoop
|
|
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);
|
|
}
|
|
}
|