Add Furniture Redrawing despite crash.

This commit is contained in:
Ottermandias 2023-11-15 16:10:15 +01:00
parent ab902cbe9e
commit d026ca888f

View file

@ -4,6 +4,8 @@ using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Housing;
using FFXIVClientStructs.Interop;
using Penumbra.Api;
using Penumbra.Api.Enums;
using Penumbra.GameData;
@ -101,6 +103,8 @@ public unsafe partial class RedrawService
public sealed unsafe partial class RedrawService : IDisposable
{
private const int FurnitureIdx = 1337;
private readonly IFramework _framework;
private readonly IObjectTable _objects;
private readonly ITargetManager _targets;
@ -231,6 +235,18 @@ public sealed unsafe partial class RedrawService : IDisposable
for (var i = 0; i < _queue.Count; ++i)
{
var idx = _queue[i];
if (idx == FurnitureIdx)
{
EnableFurniture();
continue;
}
if (idx == ~FurnitureIdx)
{
DisableFurniture();
continue;
}
if (FindCorrectActor(idx < 0 ? ~idx : idx, out var obj))
_afterGPoseQueue.Add(idx < 0 ? idx : ~idx);
@ -340,8 +356,10 @@ public sealed unsafe partial class RedrawService : IDisposable
public void RedrawObject(string name, RedrawType settings)
{
var lowerName = name.ToLowerInvariant();
if (GetName(lowerName, out var target))
var lowerName = name.ToLowerInvariant().Trim();
if (lowerName == "furniture")
_queue.Add(~FurnitureIdx);
else if (GetName(lowerName, out var target))
RedrawObject(target, settings);
else
foreach (var actor in _objects.Where(a => a.Name.ToString().ToLowerInvariant() == lowerName))
@ -353,4 +371,40 @@ public sealed unsafe partial class RedrawService : IDisposable
foreach (var actor in _objects)
RedrawObject(actor, settings);
}
private void DisableFurniture()
{
var housingManager = HousingManager.Instance();
if (housingManager == null)
return;
var currentTerritory = housingManager->CurrentTerritory;
if (currentTerritory == null)
return;
foreach (var f in currentTerritory->FurnitureSpan.PointerEnumerator())
{
var gameObject = f->Index >= 0 ? currentTerritory->HousingObjectManager.ObjectsSpan[f->Index].Value : null;
if (gameObject == null)
continue;
gameObject->DisableDraw();
}
}
private void EnableFurniture()
{
var housingManager = HousingManager.Instance();
if (housingManager == null)
return;
var currentTerritory = housingManager->CurrentTerritory;
if (currentTerritory == null)
return;
foreach (var f in currentTerritory->FurnitureSpan.PointerEnumerator())
{
var gameObject = f->Index >= 0 ? currentTerritory->HousingObjectManager.ObjectsSpan[f->Index].Value : null;
if (gameObject == null)
continue;
gameObject->EnableDraw();
}
}
}