From 13044763cbfcd8d899a1f05a67c34c41959370cc Mon Sep 17 00:00:00 2001 From: Exter-N Date: Wed, 15 Nov 2023 01:10:35 +0100 Subject: [PATCH 1/4] Redraw player ornament, allow redrawing by index --- Penumbra/Interop/Services/RedrawService.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Penumbra/Interop/Services/RedrawService.cs b/Penumbra/Interop/Services/RedrawService.cs index ec858290..ee09ea6e 100644 --- a/Penumbra/Interop/Services/RedrawService.cs +++ b/Penumbra/Interop/Services/RedrawService.cs @@ -154,11 +154,11 @@ public sealed unsafe partial class RedrawService : IDisposable if (gPose) DisableDraw(actor!); - if (actor is PlayerCharacter && _objects[tableIndex + 1] is { ObjectKind: ObjectKind.MountType } mount) + if (actor is PlayerCharacter && _objects[tableIndex + 1] is { ObjectKind: ObjectKind.MountType or ObjectKind.Ornament } mountOrOrnament) { - *ActorDrawState(mount) |= DrawState.Invisibility; + *ActorDrawState(mountOrOrnament) |= DrawState.Invisibility; if (gPose) - DisableDraw(mount); + DisableDraw(mountOrOrnament); } } @@ -173,11 +173,11 @@ public sealed unsafe partial class RedrawService : IDisposable if (gPose) EnableDraw(actor!); - if (actor is PlayerCharacter && _objects[tableIndex + 1] is { ObjectKind: ObjectKind.MountType } mount) + if (actor is PlayerCharacter && _objects[tableIndex + 1] is { ObjectKind: ObjectKind.MountType or ObjectKind.Ornament } mountOrOrnament) { - *ActorDrawState(mount) &= ~DrawState.Invisibility; + *ActorDrawState(mountOrOrnament) &= ~DrawState.Invisibility; if (gPose) - EnableDraw(mount); + EnableDraw(mountOrOrnament); } GameObjectRedrawn?.Invoke(actor!.Address, tableIndex); @@ -323,6 +323,12 @@ public sealed unsafe partial class RedrawService : IDisposable "mouseover" => (_targets.MouseOverTarget, true), _ => (null, false), }; + if (!ret && lowerName.Length > 1 && lowerName[0] == '#' && ushort.TryParse(lowerName[1..], out var objectIndex)) + { + ret = true; + actor = _objects[objectIndex]; + } + return ret; } From ab902cbe9e784a80f7d0cf5cd77826333022c9fc Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 15 Nov 2023 16:09:48 +0100 Subject: [PATCH 2/4] Fix issue with ring identification --- Penumbra.GameData | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Penumbra.GameData b/Penumbra.GameData index 545aab1f..f39a716a 160000 --- a/Penumbra.GameData +++ b/Penumbra.GameData @@ -1 +1 @@ -Subproject commit 545aab1f007158a5d53bc6a7d73b6b2992deb9b3 +Subproject commit f39a716ad4f908c301d497728ede047ee6bd61c0 From d026ca888fc41511770ecaab255c3587c2247865 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 15 Nov 2023 16:10:15 +0100 Subject: [PATCH 3/4] 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(); + } + } } From aee942468ebb681e2fd153ffe2333d3ece597cb0 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 15 Nov 2023 18:34:24 +0100 Subject: [PATCH 4/4] Only allow redrawing furniture inside. --- Penumbra/Interop/Services/RedrawService.cs | 26 ++-------------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/Penumbra/Interop/Services/RedrawService.cs b/Penumbra/Interop/Services/RedrawService.cs index ddabacd0..49d688af 100644 --- a/Penumbra/Interop/Services/RedrawService.cs +++ b/Penumbra/Interop/Services/RedrawService.cs @@ -235,12 +235,6 @@ 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(); @@ -380,6 +374,8 @@ public sealed unsafe partial class RedrawService : IDisposable var currentTerritory = housingManager->CurrentTerritory; if (currentTerritory == null) return; + if (!housingManager->IsInside()) + return; foreach (var f in currentTerritory->FurnitureSpan.PointerEnumerator()) { @@ -389,22 +385,4 @@ public sealed unsafe partial class RedrawService : IDisposable 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(); - } - } }