@@ 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
@@ 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>();
@@ 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>