// // PlayerWalkCommandHandler.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 Microsoft.Extensions.Options; using NosSmooth.Core.Client; using NosSmooth.Core.Commands; using NosSmooth.Core.Commands.Control; using NosSmooth.Core.Commands.Walking; using NosSmooth.Core.Extensions; using NosSmooth.LocalBinding; using NosSmooth.LocalBinding.Hooks; using NosSmooth.LocalBinding.Objects; using NosSmooth.LocalBinding.Structs; using Remora.Results; namespace NosSmooth.LocalClient.CommandHandlers.Walk; /// /// Handles . /// public class PlayerWalkCommandHandler : ICommandHandler { /// /// Group that is used for . /// public const string PlayerWalkControlGroup = "PlayerWalk"; private readonly PlayerManager _playerManager; private readonly IPlayerWalkHook _playerWalkHook; private readonly NosThreadSynchronizer _threadSynchronizer; private readonly UserActionDetector _userActionDetector; private readonly INostaleClient _nostaleClient; private readonly WalkCommandHandlerOptions _options; /// /// Initializes a new instance of the class. /// /// The player manager. /// The player walk hook. /// The thread synchronizer. /// The user action detector. /// The nostale client. /// The options. public PlayerWalkCommandHandler ( PlayerManager playerManager, IPlayerWalkHook playerWalkHook, NosThreadSynchronizer threadSynchronizer, UserActionDetector userActionDetector, INostaleClient nostaleClient, IOptions options ) { _options = options.Value; _playerManager = playerManager; _playerWalkHook = playerWalkHook; _threadSynchronizer = threadSynchronizer; _userActionDetector = userActionDetector; _nostaleClient = nostaleClient; } /// public async Task HandleCommand(PlayerWalkCommand command, CancellationToken ct = default) { var handler = new ControlCommandWalkHandler ( _nostaleClient, async (x, y, ct) => await _threadSynchronizer.SynchronizeAsync ( () => _userActionDetector.NotUserWalk(_playerWalkHook, x, y), ct ), _playerManager, _options ); return await handler.HandleCommand ( command.TargetX, command.TargetY, command.ReturnDistanceTolerance, command, PlayerWalkControlGroup, ct ); } }