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 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); } }