// // EntityUnfollowHook.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using NosSmooth.LocalBinding.EventArgs; using NosSmooth.LocalBinding.Structs; using Remora.Results; namespace NosSmooth.LocalBinding.Hooks.Implementations; /// /// A hook of NetworkManager.EntityUnfollow. /// internal class EntityUnfollowHook : CancelableNostaleHook, IEntityUnfollowHook { /// /// Create the packet send hook. /// /// The binding manager. /// The browser manager. /// The options for the binding. /// A packet send hook or an error. public static Result Create (NosBindingManager bindingManager, NosBrowserManager browserManager, HookOptions options) { var hook = CreateHook ( bindingManager, () => new EntityUnfollowHook(browserManager.PlayerManager), hook => hook.Detour, options ); return hook; } private readonly PlayerManager _playerManager; private EntityUnfollowHook(PlayerManager playerManager) { _playerManager = playerManager; } /// public override string Name => IHookManager.EntityUnfollowName; /// public override IEntityUnfollowHook.EntityUnfollowWrapperDelegate WrapperFunction => () => OriginalFunction(_playerManager.Address); /// protected override IEntityUnfollowHook.EntityUnfollowDelegate WrapWithCalling(IEntityUnfollowHook.EntityUnfollowDelegate function) => (playerManagerPtr, un) => { CallingFromNosSmooth = true; var res = function(playerManagerPtr, un); CallingFromNosSmooth = false; return res; }; private nuint Detour ( nuint playerManagerPtr, int unknown = 0 ) => HandleCall(new EntityEventArgs(null)); }