more checks on drawing

This commit is contained in:
defnotken
2026-01-05 15:07:48 -06:00
parent a2ed9f8d2b
commit 9048b3bd87

View File

@@ -958,59 +958,78 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
if (address == nint.Zero) if (address == nint.Zero)
return; return;
var gameObj = (GameObject*)address; try
if (gameObj == null || gameObj->ObjectKind == 0)
return;
var drawObj = gameObj->DrawObject;
bool isDrawing = false;
bool isDrawingChanged = false;
if ((nint)drawObj != IntPtr.Zero)
{ {
isDrawing = gameObj->RenderFlags == (VisibilityFlags)0b100000000000; var gameObj = (GameObject*)address;
if (!isDrawing)
if (gameObj == null || gameObj->ObjectKind == 0)
return;
if (!IsGameObjectPresent(address))
{ {
isDrawing = ((CharacterBase*)drawObj)->HasModelInSlotLoaded != 0; _logger.LogDebug("Character {name} at {addr} no longer present in object table", characterName, address.ToString("X"));
return;
}
var drawObj = gameObj->DrawObject;
bool isDrawing = false;
bool isDrawingChanged = false;
if ((nint)drawObj != IntPtr.Zero)
{
isDrawing = gameObj->RenderFlags == (VisibilityFlags)0b100000000000;
if (!isDrawing) if (!isDrawing)
{ {
isDrawing = ((CharacterBase*)drawObj)->HasModelFilesInSlotLoaded != 0; var charBase = (CharacterBase*)drawObj;
if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal) if (charBase != null)
&& !string.Equals(_lastGlobalBlockReason, "HasModelFilesInSlotLoaded", StringComparison.Ordinal))
{ {
_lastGlobalBlockPlayer = characterName; isDrawing = charBase->HasModelInSlotLoaded != 0;
_lastGlobalBlockReason = "HasModelFilesInSlotLoaded"; if (!isDrawing)
isDrawingChanged = true; {
isDrawing = charBase->HasModelFilesInSlotLoaded != 0;
if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal)
&& !string.Equals(_lastGlobalBlockReason, "HasModelFilesInSlotLoaded", StringComparison.Ordinal))
{
_lastGlobalBlockPlayer = characterName;
_lastGlobalBlockReason = "HasModelFilesInSlotLoaded";
isDrawingChanged = true;
}
}
else
{
if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal)
&& !string.Equals(_lastGlobalBlockReason, "HasModelInSlotLoaded", StringComparison.Ordinal))
{
_lastGlobalBlockPlayer = characterName;
_lastGlobalBlockReason = "HasModelInSlotLoaded";
isDrawingChanged = true;
}
}
} }
} }
else else
{ {
if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal) if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal)
&& !string.Equals(_lastGlobalBlockReason, "HasModelInSlotLoaded", StringComparison.Ordinal)) && !string.Equals(_lastGlobalBlockReason, "RenderFlags", StringComparison.Ordinal))
{ {
_lastGlobalBlockPlayer = characterName; _lastGlobalBlockPlayer = characterName;
_lastGlobalBlockReason = "HasModelInSlotLoaded"; _lastGlobalBlockReason = "RenderFlags";
isDrawingChanged = true; isDrawingChanged = true;
} }
} }
} }
else
if (isDrawingChanged)
{ {
if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal) _logger.LogTrace("Global draw block: START => {name} ({reason})", characterName, _lastGlobalBlockReason);
&& !string.Equals(_lastGlobalBlockReason, "RenderFlags", StringComparison.Ordinal))
{
_lastGlobalBlockPlayer = characterName;
_lastGlobalBlockReason = "RenderFlags";
isDrawingChanged = true;
}
} }
}
if (isDrawingChanged) IsAnythingDrawing |= isDrawing;
}
catch (AccessViolationException ex)
{ {
_logger.LogTrace("Global draw block: START => {name} ({reason})", characterName, _lastGlobalBlockReason); _logger.LogWarning(ex, "access violation checking character {name} at {addr}", characterName, address.ToString("X"));
} }
IsAnythingDrawing |= isDrawing;
} }
private void FrameworkOnUpdate(IFramework framework) private void FrameworkOnUpdate(IFramework framework)