Fix scaling stuff.

This commit is contained in:
Ottermandias 2023-07-27 13:19:50 +02:00
parent 4ac062fdc5
commit 749a64aeb3

View file

@ -2,12 +2,12 @@
using Dalamud.Hooking; using Dalamud.Hooking;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using Glamourer.Interop.Structs;
using Character = FFXIVClientStructs.FFXIV.Client.Game.Character.Character; using Character = FFXIVClientStructs.FFXIV.Client.Game.Character.Character;
namespace Glamourer.Interop; namespace Glamourer.Interop;
// TODO: Use clientstructs sigs. // TODO: Use client structs sigs.
public unsafe class ScalingService : IDisposable public unsafe class ScalingService : IDisposable
{ {
public ScalingService() public ScalingService()
@ -33,54 +33,47 @@ public unsafe class ScalingService : IDisposable
private readonly Hook<SetupOrnament> _setupOrnamentHook = null!; private readonly Hook<SetupOrnament> _setupOrnamentHook = null!;
[Signature("E8 ?? ?? ?? ?? 48 85 C0 48 0F 45 F8")] [Signature("E8 ?? ?? ?? ?? 48 85 C0 48 0F 45 F8")]
private readonly delegate* unmanaged<Ornament*, Character*> GetParentGameObject = null!; private readonly delegate* unmanaged<Ornament*, Character*> _getParentGameObject = null!;
private void SetupMountDetour(Character.MountContainer* container, short mountId, uint unk1, uint unk2, uint unk3, byte unk4) private void SetupMountDetour(Character.MountContainer* container, short mountId, uint unk1, uint unk2, uint unk3, byte unk4)
{ {
var oldRace = container->OwnerObject->Character.DrawData.CustomizeData.Race; var (race, clan, gender) = GetRelevantCustomize(&container->OwnerObject->Character);
var oldSex = container->OwnerObject->Character.DrawData.CustomizeData.Sex; SetCustomize(&container->OwnerObject->Character, container->OwnerObject->Character.GameObject.DrawObject);
var oldClan = container->OwnerObject->Character.DrawData.CustomizeData.Clan;
var drawObject = container->OwnerObject->Character.GameObject.DrawObject;
if (drawObject != null
&& drawObject->Object.GetObjectType() is ObjectType.CharacterBase
&& ((CharacterBase*)drawObject)->GetModelType() is CharacterBase.ModelType.Human)
{
container->OwnerObject->Character.DrawData.CustomizeData.Race = ((Human*)drawObject)->Customize.Race;
container->OwnerObject->Character.DrawData.CustomizeData.Sex = ((Human*)drawObject)->Customize.Sex;
container->OwnerObject->Character.DrawData.CustomizeData.Clan = ((Human*)drawObject)->Customize.Clan;
}
_setupMountHook.Original(container, mountId, unk1, unk2, unk3, unk4); _setupMountHook.Original(container, mountId, unk1, unk2, unk3, unk4);
container->OwnerObject->Character.DrawData.CustomizeData.Race = oldRace; SetCustomize(&container->OwnerObject->Character, race, clan, gender);
container->OwnerObject->Character.DrawData.CustomizeData.Sex = oldSex;
container->OwnerObject->Character.DrawData.CustomizeData.Clan = oldClan;
} }
private void SetupOrnamentDetour(Ornament* ornament, uint* unk1, float* unk2) private void SetupOrnamentDetour(Ornament* ornament, uint* unk1, float* unk2)
{ {
var character = GetParentGameObject(ornament); var character = _getParentGameObject(ornament);
if (character == null) if (character == null)
{ {
_setupOrnamentHook.Original(ornament, unk1, unk2); _setupOrnamentHook.Original(ornament, unk1, unk2);
return; return;
} }
var oldRace = character->DrawData.CustomizeData.Race; var (race, clan, gender) = GetRelevantCustomize(character);
var oldSex = character->DrawData.CustomizeData.Sex; SetCustomize(character, character->GameObject.DrawObject);
var oldClan = character->DrawData.CustomizeData.Clan;
var drawObject = character->GameObject.DrawObject;
if (drawObject != null
&& drawObject->Object.GetObjectType() is ObjectType.CharacterBase
&& ((CharacterBase*)drawObject)->GetModelType() is CharacterBase.ModelType.Human)
{
character->DrawData.CustomizeData.Race = ((Human*)drawObject)->Customize.Race;
character->DrawData.CustomizeData.Sex = ((Human*)drawObject)->Customize.Sex;
character->DrawData.CustomizeData.Clan = ((Human*)drawObject)->Customize.Clan;
}
_setupOrnamentHook.Original(ornament, unk1, unk2); _setupOrnamentHook.Original(ornament, unk1, unk2);
character->DrawData.CustomizeData.Race = oldRace; SetCustomize(character, race, clan, gender);
character->DrawData.CustomizeData.Sex = oldSex; }
character->DrawData.CustomizeData.Clan = oldClan;
/// <summary> We do not change the Customize gender because the functions use the GetGender() vfunc, which uses the game objects gender value. </summary>
private static (byte Race, byte Clan, byte Gender) GetRelevantCustomize(Character* character)
=> (character->DrawData.CustomizeData.Race, character->DrawData.CustomizeData.Clan, character->GameObject.Gender);
private static void SetCustomize(Character* character, Model model)
{
if (!model.IsHuman)
return;
SetCustomize(character, model.AsHuman->Customize.Race, model.AsHuman->Customize.Clan, model.AsHuman->Customize.Sex);
}
private static void SetCustomize(Character* character, byte race, byte clan, byte gender)
{
character->DrawData.CustomizeData.Race = race;
character->DrawData.CustomizeData.Clan = clan;
character->GameObject.Gender = gender;
} }
} }