From d026ca888fc41511770ecaab255c3587c2247865 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 15 Nov 2023 16:10:15 +0100 Subject: [PATCH] Add Furniture Redrawing despite crash. --- Penumbra/Interop/Services/RedrawService.cs | 58 +++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/Penumbra/Interop/Services/RedrawService.cs b/Penumbra/Interop/Services/RedrawService.cs index ee09ea6e..ddabacd0 100644 --- a/Penumbra/Interop/Services/RedrawService.cs +++ b/Penumbra/Interop/Services/RedrawService.cs @@ -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(); + } + } }