45 lines
1.3 KiB
C#
45 lines
1.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Game.Features.Console.Contracts;
|
|
using Game.Features.Items.Contracts;
|
|
|
|
namespace Game.Features.Console.Application.Commands;
|
|
|
|
public sealed class SpawnItemCommand : ICommand
|
|
{
|
|
private readonly IItemSpawner _spawner;
|
|
private readonly IItemSpawnPoint _spawnPoint;
|
|
|
|
public string Name => "spawn_item";
|
|
public string Description => "Spawns an item in front of the player.";
|
|
public IReadOnlyList<CommandArgSpec> Args { get; }
|
|
|
|
public SpawnItemCommand(IItemSpawner spawner, IItemSpawnPoint spawnPoint)
|
|
{
|
|
_spawner = spawner;
|
|
_spawnPoint = spawnPoint;
|
|
|
|
string[] definitions = spawner.DefinitionIds
|
|
.Select(id => id.Value)
|
|
.OrderBy(id => id, StringComparer.Ordinal)
|
|
.ToArray();
|
|
|
|
Args = new CommandArgsBuilder().AddChoiceArg("item", definitions).Build();
|
|
}
|
|
|
|
public CommandResult Execute(CommandArgValues args)
|
|
{
|
|
ItemDefinitionId definitionId = new(args.GetString(0));
|
|
ItemActionResult result = _spawner.TrySpawn(
|
|
definitionId,
|
|
_spawnPoint.GetItemSpawnPosition(),
|
|
out ItemInstanceId itemId
|
|
);
|
|
|
|
return result.Success
|
|
? CommandResult.Ok($"Spawned {definitionId} ({itemId}).")
|
|
: CommandResult.Fail(result.Message);
|
|
}
|
|
}
|