Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
[submodule "submodules/OtterGui"]
path = submodules/OtterGui
url = https://github.com/Ottermandias/OtterGui.git
branch = main
[submodule "submodules/Penumbra.GameData"]
path = submodules/Penumbra.GameData
url = https://github.com/Ottermandias/Penumbra.GameData
Expand All @@ -16,5 +12,9 @@
branch = main
[submodule "submodules/ECommonsLite"]
path = submodules/ECommonsLite
url = https://github.com/Aether-Tools/ECommonsLite.git
url = https://github.com/Abelfreyja/ECommonsLite.git
branch = api15
[submodule "submodules/Luna"]
path = submodules/Luna
url = https://github.com/Ottermandias/Luna.git
branch = main
3 changes: 2 additions & 1 deletion CustomizePlus.GameData/CustomizePlus.GameData.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<Project Sdk="Dalamud.NET.Sdk/14.0.2">
<Project Sdk="Dalamud.NET.Sdk/15.0.0">

<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\submodules\Luna\Luna\Luna.csproj" />
<ProjectReference Include="..\submodules\Penumbra.GameData\Penumbra.GameData.csproj" />
</ItemGroup>

Expand Down
4 changes: 2 additions & 2 deletions CustomizePlus.GameData/Data/ReverseNameDicts.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using CustomizePlus.GameData.ReverseSearchDictionaries;
using Dalamud.Game.ClientState.Objects.Enums;
using OtterGui.Services;
using Luna;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;

Expand Down Expand Up @@ -52,7 +52,7 @@ public bool TryGetID(ObjectKind kind, string name, [NotNullWhen(true)] out uint
npcId = default;
return kind switch
{
ObjectKind.MountType => Mounts.TryGetValue(name, out npcId),
ObjectKind.Mount => Mounts.TryGetValue(name, out npcId),
ObjectKind.Companion => Companions.TryGetValue(name, out npcId),
ObjectKind.BattleNpc => BNpcs.TryGetValue(name, out npcId),
ObjectKind.EventNpc => ENpcs.TryGetValue(name, out npcId),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public static string TypeToString(this ActorIdentifier identifier)
_ => " (Retainer)",
}}",
IdentifierType.Owned => $" ({identifier.Kind switch {
ObjectKind.MountType => "Mount",
ObjectKind.Mount => "Mount",
ObjectKind.Companion => "Companion",
ObjectKind.Ornament => "Accessory",
_ => $"Owned {identifier.Kind}",
Expand Down Expand Up @@ -130,7 +130,7 @@ public static bool IsAllowedForProfiles(this ActorIdentifier identifier)
case IdentifierType.Owned:
return
identifier.Kind == ObjectKind.BattleNpc ||
//identifier.Kind == ObjectKind.MountType ||
//identifier.Kind == ObjectKind.Mount ||
identifier.Kind == ObjectKind.Companion ||
identifier.Kind == ObjectKind.Ornament;
default:
Expand Down
1 change: 1 addition & 0 deletions CustomizePlus.GameData/GlobalUsings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
global using Logger = Luna.MainLogger;
18 changes: 11 additions & 7 deletions CustomizePlus.GameData/Hooks/Objects/CharacterDestructor.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
using Dalamud.Hooking;
using Dalamud.Hooking;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using OtterGui.Classes;
using OtterGui.Services;
using Luna;
using Penumbra.GameData;

namespace CustomizePlus.GameData.Hooks.Objects;
public sealed unsafe class CharacterDestructor : EventWrapperPtr<Character, CharacterDestructor.Priority>, IHookService
public sealed unsafe class CharacterDestructor : EventBase<CharacterDestructor.Arguments, CharacterDestructor.Priority>, IHookService
{
public readonly struct Arguments(Character* character)
{
public readonly Character* Character = character;
}

public enum Priority
{
/// <seealso cref="PathResolving.CutsceneService"/>
Expand All @@ -16,8 +20,8 @@ public enum Priority
IdentifiedCollectionCache = 0,
}

public CharacterDestructor(HookManager hooks)
: base("Character Destructor")
public CharacterDestructor(HookManager hooks, LunaLogger log)
: base("Character Destructor", log)
=> _task = hooks.CreateHook<Delegate>(Name, Sigs.CharacterDestructor, Detour, true);

private readonly Task<Hook<Delegate>> _task;
Expand All @@ -42,7 +46,7 @@ public bool Finished
private void Detour(Character* character)
{
//Penumbra.Log.Verbose($"[{Name}] Triggered with 0x{(nint)character:X}.");
Invoke(character);
Invoke(new Arguments(character));
_task.Result.Original(character);
}
}
30 changes: 17 additions & 13 deletions CustomizePlus.GameData/Hooks/Objects/CopyCharacter.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
using Dalamud.Hooking;
using Dalamud.Hooking;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using OtterGui.Classes;
using OtterGui.Services;
using Luna;

namespace CustomizePlus.GameData.Hooks.Objects;
public sealed unsafe class CopyCharacter : EventWrapperPtr<Character, Character, CopyCharacter.Priority>, IHookService
public sealed unsafe class CopyCharacter : EventBase<CopyCharacter.Arguments, CopyCharacter.Priority>, IHookService
{
public readonly struct Arguments(Character* target, Character* source)
{
public readonly Character* Target = target;
public readonly Character* Source = source;
}

public enum Priority
{
/// <seealso cref="PathResolving.CutsceneService"/>
CutsceneService = 0,
}

public CopyCharacter(HookManager hooks)
: base("Copy Character")
public CopyCharacter(HookManager hooks, LunaLogger log)
: base("Copy Character", log)
=> _task = hooks.CreateHook<Delegate>(Name, Address, Detour, true);

private readonly Task<Hook<Delegate>> _task;
Expand All @@ -33,14 +38,13 @@ public Task Awaiter
public bool Finished
=> _task.IsCompletedSuccessfully;

private delegate ulong Delegate(CharacterSetupContainer* target, Character* source, uint unk);
private delegate ulong Delegate(CharacterSetupContainer* target, Character* source, CharacterSetupContainer.CopyFlags flags);

private ulong Detour(CharacterSetupContainer* target, Character* source, uint unk)
private ulong Detour(CharacterSetupContainer* target, Character* source, CharacterSetupContainer.CopyFlags flags)
{
// TODO: update when CS updated.
var character = ((Character**)target)[1];
//Penumbra.Log.Verbose($"[{Name}] Triggered with target: 0x{(nint)target:X}, source : 0x{(nint)source:X} unk: {unk}.");
Invoke(character, source);
return _task.Result.Original(target, source, unk);
var character = target->OwnerObject;
//Penumbra.Log.Verbose($"[{Name}] Triggered with target: 0x{(nint)target:X}, source : 0x{(nint)source:X} flags: {flags}.");
Invoke(new Arguments(character, source));
return _task.Result.Original(target, source, flags);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Dalamud.Plugin.Services;
using Dalamud.Plugin;
using OtterGui.Log;
using Penumbra.GameData.Data;
using Penumbra.GameData.DataContainers.Bases;
using Penumbra.GameData.Structs;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Dalamud.Plugin.Services;
using Dalamud.Plugin;
using OtterGui.Log;
using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
using CustomizePlus.GameData.ReverseSearchDictionaries.Bases;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Dalamud.Plugin.Services;
using Dalamud.Plugin;
using OtterGui.Log;
using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
using CustomizePlus.GameData.ReverseSearchDictionaries.Bases;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Dalamud.Plugin.Services;
using Dalamud.Plugin;
using OtterGui.Log;
using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
using CustomizePlus.GameData.ReverseSearchDictionaries.Bases;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Dalamud.Plugin.Services;
using Dalamud.Plugin;
using OtterGui.Log;
using Penumbra.GameData.Data;
using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Dalamud.Plugin.Services;
using Dalamud.Plugin;
using OtterGui.Log;
using Penumbra.GameData.Data;
using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
Expand Down
11 changes: 8 additions & 3 deletions CustomizePlus.GameData/Services/CutsceneService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using OtterGui.Services;
using Luna;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop;
using Penumbra.String;
Expand Down Expand Up @@ -90,8 +90,10 @@ public unsafe void Dispose()
_characterDestructor.Unsubscribe(OnCharacterDestructor);
}

private unsafe void OnCharacterDestructor(Character* character)
private unsafe void OnCharacterDestructor(in CharacterDestructor.Arguments args)
{
var character = args.Character;

if (character->GameObject.ObjectIndex < CutsceneStartIdx)
{
// Remove all associations for now non-existing actor.
Expand All @@ -116,8 +118,11 @@ private unsafe void OnCharacterDestructor(Character* character)
}
}

private unsafe void OnCharacterCopy(Character* target, Character* source)
private unsafe void OnCharacterCopy(in CopyCharacter.Arguments args)
{
var target = args.Target;
var source = args.Source;

if (target == null || target->GameObject.ObjectIndex is < CutsceneStartIdx or >= CutsceneEndIdx)
return;

Expand Down
32 changes: 15 additions & 17 deletions CustomizePlus.GameData/Services/GameEventManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using Penumbra.GameData;

Expand Down Expand Up @@ -77,20 +76,19 @@ private void CharacterDestructorDetour(Character* character)

#region Copy Character

private delegate ulong CopyCharacterDelegate(CharacterSetupContainer* target, GameObject* source, uint unk);
private delegate ulong CopyCharacterDelegate(CharacterSetupContainer* target, Character* source, CharacterSetupContainer.CopyFlags flags);

private readonly Hook<CopyCharacterDelegate> _copyCharacterHook;

private ulong CopyCharacterDetour(CharacterSetupContainer* target, GameObject* source, uint unk)
private ulong CopyCharacterDetour(CharacterSetupContainer* target, Character* source, CharacterSetupContainer.CopyFlags flags)
{
// TODO: update when CS updated.
var character = ((Character**)target)[1];
var character = target->OwnerObject;
if (CopyCharacter != null)
foreach (var subscriber in CopyCharacter.GetInvocationList())
{
try
{
((CopyCharacterEvent)subscriber).Invoke(character, (Character*)source);
((CopyCharacterEvent)subscriber).Invoke(character, source);
}
catch (Exception ex)
{
Expand All @@ -101,9 +99,9 @@ private ulong CopyCharacterDetour(CharacterSetupContainer* target, GameObject* s
}

/*Penumbra.Log.Verbose(
$"{Prefix} {nameof(CopyCharacter)} triggered with target 0x{(nint)target:X} and source 0x{(nint)source:X}.");*/
$"{Prefix} {nameof(CopyCharacter)} triggered with target 0x{(nint)target:X}, source 0x{(nint)source:X} and flags {flags}.");*/
//todo: log
return _copyCharacterHook.Original(target, source, unk);
return _copyCharacterHook.Original(target, source, flags);
}

public delegate void CopyCharacterEvent(Character* target, Character* source);
Expand All @@ -112,18 +110,18 @@ private ulong CopyCharacterDetour(CharacterSetupContainer* target, GameObject* s

#region CharacterBaseCreate

private delegate nint CharacterBaseCreateDelegate(uint a, nint b, nint c, byte d);
private delegate CharacterBase* CharacterBaseCreateDelegate(uint modelId, CustomizeData* customize, EquipmentModelId* equipment, byte unk);

private readonly Hook<CharacterBaseCreateDelegate> _characterBaseCreateHook;

private nint CharacterBaseCreateDetour(uint a, nint b, nint c, byte d)
private CharacterBase* CharacterBaseCreateDetour(uint modelId, CustomizeData* customize, EquipmentModelId* equipment, byte unk)
{
if (CreatingCharacterBase != null)
foreach (var subscriber in CreatingCharacterBase.GetInvocationList())
{
try
{
((CreatingCharacterBaseEvent)subscriber).Invoke((nint)(&a), b, c);
((CreatingCharacterBaseEvent)subscriber).Invoke(&modelId, customize, equipment);
}
catch (Exception ex)
{
Expand All @@ -133,13 +131,13 @@ private nint CharacterBaseCreateDetour(uint a, nint b, nint c, byte d)
}
}

var ret = _characterBaseCreateHook.Original(a, b, c, d);
var ret = _characterBaseCreateHook.Original(modelId, customize, equipment, unk);
if (CharacterBaseCreated != null)
foreach (var subscriber in CharacterBaseCreated.GetInvocationList())
{
try
{
((CharacterBaseCreatedEvent)subscriber).Invoke(a, b, c, ret);
((CharacterBaseCreatedEvent)subscriber).Invoke(modelId, customize, equipment, ret);
}
catch (Exception ex)
{
Expand All @@ -152,18 +150,18 @@ private nint CharacterBaseCreateDetour(uint a, nint b, nint c, byte d)
return ret;
}

public delegate void CreatingCharacterBaseEvent(nint modelCharaId, nint customize, nint equipment);
public delegate void CharacterBaseCreatedEvent(uint modelCharaId, nint customize, nint equipment, nint drawObject);
public delegate void CreatingCharacterBaseEvent(uint* modelCharaId, CustomizeData* customize, EquipmentModelId* equipment);
public delegate void CharacterBaseCreatedEvent(uint modelCharaId, CustomizeData* customize, EquipmentModelId* equipment, CharacterBase* drawObject);

#endregion

#region CharacterBase Destructor

public delegate void CharacterBaseDestructorEvent(nint drawBase);
public delegate void CharacterBaseDestructorEvent(CharacterBase* drawBase);

private readonly Hook<CharacterBaseDestructorEvent> _characterBaseDestructorHook;

private void CharacterBaseDestructorDetour(nint drawBase)
private void CharacterBaseDestructorDetour(CharacterBase* drawBase)
{
if (CharacterBaseDestructor != null)
foreach (var subscriber in CharacterBaseDestructor.GetInvocationList())
Expand Down
Loading