~ruther/NosSmooth.Local

8afebb53feb19bc2e7931abd6de33ce94a780301 — Rutherther 3 years ago 0e8ef7c
feat(binding): add detour event for pet walk function
1 files changed, 29 insertions(+), 10 deletions(-)

M src/Core/NosSmooth.LocalBinding/Objects/PetManagerBinding.cs
M src/Core/NosSmooth.LocalBinding/Objects/PetManagerBinding.cs => src/Core/NosSmooth.LocalBinding/Objects/PetManagerBinding.cs +29 -10
@@ 8,6 8,7 @@ using NosSmooth.LocalBinding.Options;
using NosSmooth.LocalBinding.Structs;
using Reloaded.Hooks.Definitions;
using Reloaded.Hooks.Definitions.X86;
using Reloaded.Memory.Sources;
using Remora.Results;

namespace NosSmooth.LocalBinding.Objects;


@@ 17,6 18,8 @@ namespace NosSmooth.LocalBinding.Objects;
/// </summary>
public class PetManagerBinding
{
    private readonly IMemory _memory;

    /// <summary>
    /// Create nostale pet manager binding.
    /// </summary>


@@ 28,12 31,13 @@ public class PetManagerBinding
        (NosBindingManager bindingManager, PetManagerList petManagerList, PetManagerBindingOptions options)
    {
        var petManager = new PetManagerBinding(petManagerList);
        var petManager = new PetManagerBinding(bindingManager.Memory, petManagerList);
        var hookResult = bindingManager.CreateHookFromPattern<PetWalkDelegate>
        (
            "PetManagerBinding.PetWalk",
            petManager.PetWalkDetour,
            options.PetWalkPattern,
            hook: options.HookPetWalk
            enableHook: options.HookPetWalk
        );

        if (!hookResult.IsSuccess)


@@ 62,12 66,21 @@ public class PetManagerBinding

    private IHook<PetWalkDelegate> _petWalkHook = null!;

    private PetManagerBinding(PetManagerList petManagerList)
    private PetManagerBinding(IMemory memory, PetManagerList petManagerList)
    {
        _memory = memory;
        PetManagerList = petManagerList;
    }

    /// <summary>
    /// Event that is called when walk was called by NosTale.
    /// </summary>
    /// <remarks>
    /// The walk must be hooked for this event to be called.
    /// </remarks>
    public event Func<PetManager, ushort, ushort, bool>? PetWalkCall;

    /// <summary>
    /// Gets the hook of the pet walk function.
    /// </summary>
    public IHook PetWalkHook => _petWalkHook;


@@ 117,13 130,19 @@ public class PetManagerBinding
        int unknown2 = 1
    )
    {
        return _petWalkHook.OriginalFunction
        (
            petManagerPtr,
            position,
            unknown0,
            unknown1,
            unknown2
        );
        var result = PetWalkCall?.Invoke(new PetManager(_memory, petManagerPtr), (ushort)(position & 0xFFFF), (ushort)((position >> 16) & 0xFFFF));
        if (result ?? true)
        {
            return _petWalkHook.OriginalFunction
            (
                petManagerPtr,
                position,
                unknown0,
                unknown1,
                unknown2
            );
        }

        return false;
    }
}
\ No newline at end of file

Do not follow this link