//
// CombatCommands.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.ChatCommands;
using NosSmooth.Core.Client;
using NosSmooth.LocalBinding;
using NosSmooth.LocalBinding.Objects;
using NosSmooth.LocalBinding.Structs;
using Remora.Commands.Attributes;
using Remora.Commands.Groups;
using Remora.Results;
namespace WalkCommands.Commands;
///
/// Represents command group for combat commands.
///
public class CombatCommands : CommandGroup
{
private readonly UnitManagerBinding _unitManagerBinding;
private readonly SceneManager _sceneManager;
private readonly PlayerManagerBinding _playerManagerBinding;
private readonly FeedbackService _feedbackService;
///
/// Initializes a new instance of the class.
///
/// The scene manager binding.
/// The scene manager.
/// The character binding.
/// The feedback service.
public CombatCommands
(
UnitManagerBinding unitManagerBinding,
SceneManager sceneManager,
PlayerManagerBinding playerManagerBinding,
FeedbackService feedbackService
)
{
_unitManagerBinding = unitManagerBinding;
_sceneManager = sceneManager;
_playerManagerBinding = playerManagerBinding;
_feedbackService = feedbackService;
}
///
/// Focus the given entity.
///
/// The entity id to focus.
/// A task that may or may not have succeeded.
[Command("focus")]
public Task HandleFocusAsync(int entityId)
{
var entityResult = _sceneManager.FindEntity(entityId);
if (!entityResult.IsSuccess)
{
return Task.FromResult(Result.FromError(entityResult));
}
return Task.FromResult(_unitManagerBinding.FocusEntity(entityResult.Entity));
}
///
/// Follow the given entity.
///
/// The entity id to follow.
/// A task that may or may not have succeeded.
[Command("follow")]
public Task HandleFollowAsync(int entityId)
{
var entityResult = _sceneManager.FindEntity(entityId);
if (!entityResult.IsSuccess)
{
return Task.FromResult(Result.FromError(entityResult));
}
return Task.FromResult(_playerManagerBinding.FollowEntity(entityResult.Entity));
}
///
/// Stop following an entity.
///
/// A task that may or may not have succeeded.
[Command("unfollow")]
public Task HandleUnfollowAsync()
{
return Task.FromResult(_playerManagerBinding.UnfollowEntity());
}
}