~ruther/NosSmooth.Local

aa8a49f50bf6de1863c905186e291eb47b1e4b6c — Rutherther 3 years ago dae3dee
feat(samples): add pathfinding support into walkcommands
M src/Samples/LowLevel/WalkCommands/Commands/WalkCommands.cs => src/Samples/LowLevel/WalkCommands/Commands/WalkCommands.cs +62 -7
@@ 9,6 9,7 @@ using NosSmooth.Core.Client;
using NosSmooth.Core.Commands;
using NosSmooth.Core.Commands.Walking;
using NosSmooth.Core.Extensions;
using NosSmooth.Extensions.Pathfinding;
using NosSmooth.Packets.Enums;
using NosSmooth.Packets.Enums.Chat;
using NosSmooth.Packets.Server.Chat;


@@ 24,16 25,19 @@ namespace WalkCommands.Commands;
public class WalkCommands : CommandGroup
{
    private readonly INostaleClient _client;
    private readonly WalkManager _walkManager;
    private readonly FeedbackService _feedbackService;

    /// <summary>
    /// Initializes a new instance of the <see cref="WalkCommands"/> class.
    /// </summary>
    /// <param name="client">The nostale client.</param>
    /// <param name="walkManager">The walk manager.</param>
    /// <param name="feedbackService">The feedback service.</param>
    public WalkCommands(INostaleClient client, FeedbackService feedbackService)
    public WalkCommands(INostaleClient client, WalkManager walkManager, FeedbackService feedbackService)
    {
        _client = client;
        _walkManager = walkManager;
        _feedbackService = feedbackService;
    }



@@ 48,10 52,11 @@ public class WalkCommands : CommandGroup
    [Command("walk")]
    public async Task<Result> HandleWalkToAsync
    (
        ushort x,
        ushort y,
        short x,
        short y,
        bool isCancellable = true,
        [Option('p', "pet")] params int[] petSelectors
        [Option('p', "pet")]
        params int[] petSelectors
    )
    {
        var receiveResult = await _client.ReceivePacketAsync


@@ 65,11 70,12 @@ public class WalkCommands : CommandGroup
            return receiveResult;
        }

        var command = new WalkCommand(x, y, petSelectors, AllowUserCancel: isCancellable);
        var command = new WalkCommand(x, y, petSelectors, 2, AllowUserCancel: isCancellable);
        var walkResult = await _client.SendCommandAsync(command, CancellationToken);
        if (!walkResult.IsSuccess)
        {
            await _feedbackService.SendErrorMessageAsync($"Could not finish walking. {walkResult.ToFullString()}", CancellationToken);
            await _feedbackService.SendErrorMessageAsync
                ($"Could not finish walking. {walkResult.ToFullString()}", CancellationToken);
            await _client.ReceivePacketAsync
            (
                new SayPacket(EntityType.Map, 1, SayColor.Red, "Could not finish walking."),


@@ 84,4 90,53 @@ public class WalkCommands : CommandGroup
            CancellationToken
        );
    }
}

    /// <summary>
    /// Attempts to walk the character to the specified lcoation using path finding.
    /// </summary>
    /// <param name="x">The x coordinate.</param>
    /// <param name="y">The y coordinate.</param>
    /// <param name="isCancellable">Whether the user can cancel the operation.</param>
    /// <param name="petSelectors">The pet selectors indices.</param>
    /// <returns>A result that may or may not have succeeded.</returns>
    [Command("pwalk")]
    public async Task<Result> HandlePathfindingWalkToAsync
    (
        short x,
        short y,
        bool isCancellable = true,
        [Option('p', "pet")]
        params int[] petSelectors
    )
    {
        var receiveResult = await _client.ReceivePacketAsync
        (
            new SayPacket(EntityType.Map, 1, SayColor.Red, $"Going to walk to {x} {y}."),
            CancellationToken
        );

        if (!receiveResult.IsSuccess)
        {
            return receiveResult;
        }

        var walkResult = await _walkManager.GoToAsync(x, y, CancellationToken, petSelectors);
        if (!walkResult.IsSuccess)
        {
            await _feedbackService.SendErrorMessageAsync
                ($"Could not finish walking. {walkResult.ToFullString()}", CancellationToken);
            await _client.ReceivePacketAsync
            (
                new SayPacket(EntityType.Map, 1, SayColor.Red, "Could not finish walking."),
                CancellationToken
            );
            return walkResult;
        }

        return await _client.ReceivePacketAsync
        (
            new SayPacket(EntityType.Map, 1, SayColor.Red, "Walk has finished successfully."),
            CancellationToken
        );
    }
}
\ No newline at end of file

M src/Samples/LowLevel/WalkCommands/DllMain.cs => src/Samples/LowLevel/WalkCommands/DllMain.cs +4 -2
@@ 13,10 13,12 @@ namespace WalkCommands;
/// </summary>
public class DllMain
{
    /// <summary>
    /// Allocate console.
    /// </summary>
    /// <returns>Whether the operation was successful.</returns>
    [DllImport("kernel32")]
#pragma warning disable SA1600
    public static extern bool AllocConsole();
#pragma warning restore SA1600

    /// <summary>
    /// Represents the dll entrypoint method.

M src/Samples/LowLevel/WalkCommands/Startup.cs => src/Samples/LowLevel/WalkCommands/Startup.cs +13 -0
@@ 9,6 9,9 @@ using Microsoft.Extensions.Logging;
using NosSmooth.ChatCommands;
using NosSmooth.Core.Client;
using NosSmooth.Core.Extensions;
using NosSmooth.Data.NOSFiles;
using NosSmooth.Data.NOSFiles.Extensions;
using NosSmooth.Extensions.Pathfinding.Extensions;
using NosSmooth.LocalBinding;
using NosSmooth.LocalClient;
using NosSmooth.LocalClient.Extensions;


@@ 28,6 31,8 @@ public class Startup
    {
        var collection = new ServiceCollection()
            .AddLocalClient()
            .AddNostaleDataFiles()
            .AddNostalePathfinding()
            .AddScoped<Commands.WalkCommands>()
            .AddScoped<DetachCommand>()
            .AddSingleton<CancellationTokenSource>()


@@ 74,6 79,14 @@ public class Startup
            logger.LogResultError(packetAddResult);
        }

        var dataManager = provider.GetRequiredService<NostaleDataFilesManager>();
        var dataResult = dataManager.Initialize();
        if (!dataResult.IsSuccess)
        {
            logger.LogError("Could not initialize the nostale data files");
            logger.LogResultError(dataResult);
        }

        var mainCancellation = provider.GetRequiredService<CancellationTokenSource>();

        var client = provider.GetRequiredService<INostaleClient>();

M src/Samples/LowLevel/WalkCommands/WalkCommands.csproj => src/Samples/LowLevel/WalkCommands/WalkCommands.csproj +6 -1
@@ 20,7 20,6 @@
    <PackageReference Include="Fody">
      <Version>6.6.0</Version>
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.Extensions.DependencyInjection">
      <Version>6.0.0</Version>


@@ 31,6 30,12 @@
    <PackageReference Include="Microsoft.Extensions.Logging.Console">
      <Version>6.0.0</Version>
    </PackageReference>
    <PackageReference Include="NosSmooth.Data.Abstractions">
      <Version>2.0.0</Version>
    </PackageReference>
    <PackageReference Include="NosSmooth.Data.NOSFiles">
      <Version>2.0.1</Version>
    </PackageReference>
    <PackageReference Include="Remora.Results">
      <Version>7.1.0</Version>
    </PackageReference>

Do not follow this link