From 922401c8259d81113ce50e2bd46490915865a396 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Tue, 14 Feb 2023 10:29:17 +0100 Subject: [PATCH] feat(client): implement support for optional modules and hooks --- .../Attack/AttackCommandHandler.cs | 5 +- .../Walk/PetWalkCommandHandler.cs | 5 +- .../NostaleLocalClient.cs | 99 ++++++++++++++----- .../UserActionDetector.cs | 4 +- 4 files changed, 81 insertions(+), 32 deletions(-) diff --git a/src/Core/NosSmooth.LocalClient/CommandHandlers/Attack/AttackCommandHandler.cs b/src/Core/NosSmooth.LocalClient/CommandHandlers/Attack/AttackCommandHandler.cs index 4ee61cf..918eb53 100644 --- a/src/Core/NosSmooth.LocalClient/CommandHandlers/Attack/AttackCommandHandler.cs +++ b/src/Core/NosSmooth.LocalClient/CommandHandlers/Attack/AttackCommandHandler.cs @@ -56,7 +56,10 @@ public class AttackCommandHandler : ICommandHandler var entityResult = _sceneManager.FindEntity(command.TargetId.Value); if (entityResult.IsDefined(out var entity)) { - _synchronizer.EnqueueOperation(() => _entityFocusHook.WrapperFunction(entity)); + if (_entityFocusHook.WrapperFunction.IsPresent) + { + _synchronizer.EnqueueOperation(() => _entityFocusHook.WrapperFunction.Get()(entity)); + } } } diff --git a/src/Core/NosSmooth.LocalClient/CommandHandlers/Walk/PetWalkCommandHandler.cs b/src/Core/NosSmooth.LocalClient/CommandHandlers/Walk/PetWalkCommandHandler.cs index 26a944b..fb2fb29 100644 --- a/src/Core/NosSmooth.LocalClient/CommandHandlers/Walk/PetWalkCommandHandler.cs +++ b/src/Core/NosSmooth.LocalClient/CommandHandlers/Walk/PetWalkCommandHandler.cs @@ -78,8 +78,9 @@ public class PetWalkCommandHandler : ICommandHandler ( () => _userActionDetector.NotUserAction> ( - () => _petWalkHook.WrapperFunction(petManager, (ushort)x, (ushort)y) - ) + () => _petWalkHook.WrapperFunction.Get()(petManager, (ushort)x, (ushort)y) + ), + ct ), petManager, _options diff --git a/src/Core/NosSmooth.LocalClient/NostaleLocalClient.cs b/src/Core/NosSmooth.LocalClient/NostaleLocalClient.cs index 5c385c3..e9d8889 100644 --- a/src/Core/NosSmooth.LocalClient/NostaleLocalClient.cs +++ b/src/Core/NosSmooth.LocalClient/NostaleLocalClient.cs @@ -13,6 +13,7 @@ using NosSmooth.Core.Commands.Control; using NosSmooth.Core.Extensions; using NosSmooth.Core.Packets; using NosSmooth.LocalBinding; +using NosSmooth.LocalBinding.Errors; using NosSmooth.LocalBinding.EventArgs; using NosSmooth.LocalBinding.Hooks; using NosSmooth.LocalBinding.Objects; @@ -85,15 +86,26 @@ public class NostaleLocalClient : BaseNostaleClient /// public override async Task RunAsync(CancellationToken stopRequested = default) { + if (!_hookManager.IsHookLoaded() || !_hookManager.IsHookLoaded()) + { + return new NeededModulesNotInitializedError + ("Client cannot run", IHookManager.PacketSendName, IHookManager.PacketReceiveName); + } + _stopRequested = stopRequested; _logger.LogInformation("Starting local client"); - _synchronizer.StartSynchronizer(); - _hookManager.PacketSend.Called += SendCallCallback; - _hookManager.PacketReceive.Called += ReceiveCallCallback; + var synchronizerResult = _synchronizer.StartSynchronizer(); + if (!synchronizerResult.IsSuccess) + { + return synchronizerResult; + } - _hookManager.EntityFollow.Called += FollowEntity; - _hookManager.PlayerWalk.Called += Walk; - _hookManager.PetWalk.Called += PetWalk; + _hookManager.PacketSend.Get().Called += SendCallCallback; + _hookManager.PacketReceive.Get().Called += ReceiveCallCallback; + + _hookManager.EntityFollow.TryDo(follow => follow.Called += FollowEntity); + _hookManager.PlayerWalk.TryDo(walk => walk.Called += Walk); + _hookManager.PetWalk.TryDo(walk => walk.Called += PetWalk); try { @@ -104,12 +116,12 @@ public class NostaleLocalClient : BaseNostaleClient // ignored } - _hookManager.PacketSend.Called -= SendCallCallback; - _hookManager.PacketReceive.Called -= ReceiveCallCallback; + _hookManager.PacketSend.Get().Called -= SendCallCallback; + _hookManager.PacketReceive.Get().Called -= ReceiveCallCallback; - _hookManager.EntityFollow.Called -= FollowEntity; - _hookManager.PlayerWalk.Called -= Walk; - _hookManager.PetWalk.Called -= PetWalk; + _hookManager.EntityFollow.TryDo(follow => follow.Called -= FollowEntity); + _hookManager.PlayerWalk.TryDo(walk => walk.Called -= Walk); + _hookManager.PetWalk.TryDo(walk => walk.Called -= PetWalk); // the hooks are not needed anymore. _hookManager.DisableAll(); @@ -120,17 +132,59 @@ public class NostaleLocalClient : BaseNostaleClient /// public override async Task ReceivePacketAsync(string packetString, CancellationToken ct = default) { - ReceivePacket(packetString); - await ProcessPacketAsync(PacketSource.Server, packetString); - return Result.FromSuccess(); + var result = _hookManager.PacketReceive.MapResult + ( + receive => receive.WrapperFunction.MapResult + ( + wrapperFunction => + { + _synchronizer.EnqueueOperation(() => wrapperFunction(packetString)); + return Result.FromSuccess(); + } + ) + ); + + if (result.IsSuccess) + { + _logger.LogDebug($"Receiving client packet {packetString}"); + await ProcessPacketAsync(PacketSource.Server, packetString); + } + else + { + _logger.LogError("Could not receive packet"); + _logger.LogResultError(result); + } + + return result; } /// public override async Task SendPacketAsync(string packetString, CancellationToken ct = default) { - SendPacket(packetString); - await ProcessPacketAsync(PacketSource.Client, packetString); - return Result.FromSuccess(); + var result = _hookManager.PacketSend.MapResult + ( + send => send.WrapperFunction.MapResult + ( + wrapperFunction => + { + _synchronizer.EnqueueOperation(() => wrapperFunction(packetString)); + return Result.FromSuccess(); + } + ) + ); + + if (result.IsSuccess) + { + _logger.LogDebug($"Sending client packet {packetString}"); + await ProcessPacketAsync(PacketSource.Server, packetString); + } + else + { + _logger.LogError("Could not send packet"); + _logger.LogResultError(result); + } + + return result; } private void ReceiveCallCallback(object? owner, PacketEventArgs packetArgs) @@ -181,20 +235,11 @@ public class NostaleLocalClient : BaseNostaleClient { _synchronizer.EnqueueOperation ( - () => _hookManager.PacketSend.WrapperFunction(packetString) + () => _hookManager.PacketSend.Get().WrapperFunction.Get()(packetString) ); _logger.LogDebug($"Sending client packet {packetString}"); } - private void ReceivePacket(string packetString) - { - _synchronizer.EnqueueOperation - ( - () => _hookManager.PacketReceive.WrapperFunction(packetString) - ); - _logger.LogDebug($"Receiving client packet {packetString}"); - } - private async Task ProcessPacketAsync(PacketSource type, string packetString) { try diff --git a/src/Core/NosSmooth.LocalClient/UserActionDetector.cs b/src/Core/NosSmooth.LocalClient/UserActionDetector.cs index 214d0e5..dc046c8 100644 --- a/src/Core/NosSmooth.LocalClient/UserActionDetector.cs +++ b/src/Core/NosSmooth.LocalClient/UserActionDetector.cs @@ -106,7 +106,7 @@ public class UserActionDetector () => { _lastWalkPosition = ((ushort)x, (ushort)y); - return walkHook.WrapperFunction((ushort)x, (ushort)y); + return walkHook.WrapperFunction.MapResult(func => func((ushort)x, (ushort)y)); } ); @@ -124,7 +124,7 @@ public class UserActionDetector () => { _lastWalkPosition = ((ushort)x, (ushort)y); - return walkHook.WrapperFunction((ushort)x, (ushort)y); + return walkHook.WrapperFunction.MapResult(func => func((ushort)x, (ushort)y)); }, ct ); -- 2.48.1