Merge pull request #70 from deansheather/dean/dt-fixes-1
Various DT fixes
This commit is contained in:
@@ -76,19 +76,18 @@ internal unsafe class GameFunctions : IDisposable
|
|||||||
Plugin.Common.SendMessage($"/{commandName} add {Placeholder}");
|
Plugin.Common.SendMessage($"/{commandName} add {Placeholder}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static T* GetAddon<T>(string name) where T : unmanaged
|
||||||
|
{
|
||||||
|
var addon = RaptureAtkModule.Instance()->RaptureAtkUnitManager.GetAddonByName(name);
|
||||||
|
return addon != null && addon->IsReady ? (T*)addon : null;
|
||||||
|
}
|
||||||
|
|
||||||
internal static void SetAddonInteractable(string name, bool interactable)
|
internal static void SetAddonInteractable(string name, bool interactable)
|
||||||
{
|
{
|
||||||
var unitManager = AtkStage.Instance()->RaptureAtkUnitManager;
|
var addon = GetAddon<AtkUnitBase>(name);
|
||||||
|
if (addon == null)
|
||||||
var addon = (nint) unitManager->GetAddonByName(name);
|
|
||||||
if (addon == nint.Zero)
|
|
||||||
return;
|
return;
|
||||||
|
addon->IsVisible = interactable;
|
||||||
var flags = (uint*) (addon + 0x180);
|
|
||||||
if (interactable)
|
|
||||||
*flags &= ~(1u << 22);
|
|
||||||
else
|
|
||||||
*flags |= 1 << 22;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void SetChatInteractable(bool interactable)
|
internal static void SetChatInteractable(bool interactable)
|
||||||
@@ -101,62 +100,52 @@ internal unsafe class GameFunctions : IDisposable
|
|||||||
|
|
||||||
internal static bool IsAddonInteractable(string name)
|
internal static bool IsAddonInteractable(string name)
|
||||||
{
|
{
|
||||||
var unitManager = AtkStage.Instance()->RaptureAtkUnitManager;
|
var addon = GetAddon<AtkUnitBase>(name);
|
||||||
|
return addon != null && addon->IsVisible;
|
||||||
var addon = (nint) unitManager->GetAddonByName(name);
|
|
||||||
if (addon == nint.Zero)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var flags = (uint*) (addon + 0x180);
|
|
||||||
return (*flags & (1 << 22)) == 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void OpenItemTooltip(uint id, ItemPayload.ItemKind itemKind)
|
internal static void OpenItemTooltip(uint id, ItemPayload.ItemKind itemKind)
|
||||||
{
|
{
|
||||||
var atkStage = AtkStage.Instance();
|
var atkStage = AtkStage.Instance();
|
||||||
var agent = AgentItemDetail.Instance();
|
var agent = AgentItemDetail.Instance();
|
||||||
var addon = atkStage->RaptureAtkUnitManager->GetAddonByName("ItemDetail");
|
var addon = GetAddon<AtkUnitBase>("ItemDetail");
|
||||||
|
|
||||||
// atkStage ain't gonna be null or we have bigger problems
|
// atkStage ain't gonna be null or we have bigger problems
|
||||||
if (agent == null || addon == null)
|
if (agent == null || addon == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var agentPtr = (nint) agent;
|
var agentPtr = (nint) agent;
|
||||||
// addresses mentioned here are 6.11
|
// addresses mentioned here are 7.0
|
||||||
// see the call near the end of AgentItemDetail.Update
|
// see the call near the end of AgentItemDetail.Update
|
||||||
// offsets valid as of 6.11
|
// offsets valid as of 7.0
|
||||||
|
|
||||||
// A54B19: sets some shit
|
// Switch goes down to default, which is what we want
|
||||||
*(uint*) (agentPtr + 0x20) = 22;
|
|
||||||
// A55218: switch goes down to default, which is what we want
|
|
||||||
*(byte*) (agentPtr + 0x118) = itemKind == ItemPayload.ItemKind.EventItem ? (byte)8 : (byte)1;
|
*(byte*) (agentPtr + 0x118) = itemKind == ItemPayload.ItemKind.EventItem ? (byte)8 : (byte)1;
|
||||||
// A54BE0: item id when hovering over item in chat
|
// Item id when hovering over item in chat
|
||||||
*(uint*) (agentPtr + 0x11C) = id;
|
*(uint*) (agentPtr + 0x11C) = id;
|
||||||
// A54BCC: always 0 when hovering over item in chat
|
// Always 0 when hovering over item in chat
|
||||||
*(uint*) (agentPtr + 0x120) = 0;
|
*(uint*) (agentPtr + 0x120) = 0;
|
||||||
// A558A5: skips a check to do with inventory
|
// Skips a check to do with inventory
|
||||||
*(byte*) (agentPtr + 0x128) &= 0xEF;
|
*(byte*) (agentPtr + 0x128) &= 0xEF;
|
||||||
// Is also set to the ID of the item when in chat
|
// Is also set to the ID of the item when in chat
|
||||||
*(uint*) (agentPtr + 0x138) = id;
|
agent->ItemId = id;
|
||||||
// A54B3F: when set to 1, lets everything continue (one frame)
|
// When set to 1, lets everything continue (one frame)
|
||||||
*(byte*) (agentPtr + 0x14A) = 1;
|
*(byte*) (agentPtr + 0x1B2) = 1;
|
||||||
// A54B59: skips early return
|
// Skips early return
|
||||||
*(byte*) (agentPtr + 0x14E) = 0;
|
*(byte*) (agentPtr + 0x1B6) = 0;
|
||||||
|
|
||||||
// this just probably needs to be set
|
// This just probably needs to be set
|
||||||
agent->AddonId = addon->Id;
|
agent->AddonId = addon->Id;
|
||||||
|
|
||||||
// vcall from E8 ?? ?? ?? ?? 0F B7 C0 48 83 C4 60 (FF 50 28 48 8B D3 48 8B CF)
|
// Skips early return
|
||||||
var vf5 = (delegate* unmanaged<AtkUnitBase*, byte, uint, void>*) ((nint) addon->VirtualTable + 40);
|
|
||||||
// EA8BED: lets vf5 actually run
|
|
||||||
*(byte*) ((nint) atkStage + 0x2B4) |= 2;
|
*(byte*) ((nint) atkStage + 0x2B4) |= 2;
|
||||||
(*vf5)(addon, 0, 15);
|
addon->Show(false, 15);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void CloseItemTooltip()
|
internal static void CloseItemTooltip()
|
||||||
{
|
{
|
||||||
// hide addon first to prevent the "addon close" sound
|
// hide addon first to prevent the "addon close" sound
|
||||||
var addon = AtkStage.Instance()->RaptureAtkUnitManager->GetAddonByName("ItemDetail");
|
var addon = GetAddon<AtkUnitBase>("ItemDetail");
|
||||||
if (addon != null)
|
if (addon != null)
|
||||||
addon->Hide(true, false, 0);
|
addon->Hide(true, false, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ internal class TextureCache : IDisposable
|
|||||||
if (dict.ContainsKey((icon, hq)))
|
if (dict.ContainsKey((icon, hq)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var tex = Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(icon, hq)).GetWrapOrDefault();
|
var tex = Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(icon, hq)).RentAsync().Result;
|
||||||
if (tex != null)
|
if (tex != null)
|
||||||
dict[(icon, hq)] = tex;
|
dict[(icon, hq)] = tex;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user