private async Task SpawnItems(IReadOnlyList <Item> items) { if (items.Count > MaxRequestCount) { var clamped = $"Users are limited to {MaxRequestCount} items per command. Please use this bot responsibly."; await ReplyAsync(clamped).ConfigureAwait(false); items = items.Take(MaxRequestCount).ToArray(); } var bot = Globals.Bot; var fi = bot.FieldItemState; var cfg = fi.Config; var height = cfg.GetSpawnHeight(items.Count); (int x, int y) = fi.GetNextInjectCoordinates(items.Count, height); string atCoords = $"at coordinates ({x},{y}) (count:{items.Count}, height:{Math.Min(items.Count, height)})"; bool canInject = FieldItemDropper.CanFitDropped(x, y, items.Count, height, cfg.SpawnMinX, cfg.SpawnMaxX, cfg.SpawnMinY, cfg.SpawnMaxY); if (!canInject) { await ReplyAsync($"Unable to inject {atCoords}. Please confirm the bot is configured correctly, and contact the owner.").ConfigureAwait(false); return; } var column = FieldItemDropper.InjectItemsAsDropped(x, y, items, height); fi.Injections.Enqueue(column); var msg = $"Item spawn request{(items.Count > 1 ? "s" : string.Empty)} {atCoords} will be executed momentarily."; await ReplyAsync(msg).ConfigureAwait(false); }
private async Task SpawnItems(IReadOnlyList <Item> items) { if (items.Count > MaxRequestCount) { var clamped = $"Users are limited to {MaxRequestCount} items per command. Please use this bot responsibly."; await ReplyAsync(clamped).ConfigureAwait(false); items = items.Take(MaxRequestCount).ToArray(); } var bot = Globals.Bot; var fi = bot.FieldItemState; var cfg = fi.Config; var height = cfg.GetSpawnHeight(items.Count); (int x, int y) = fi.GetNextInjectCoordinates(items.Count, height); string atCoords = $"at coordinates ({x},{y}) (count:{items.Count}, height:{Math.Min(items.Count, height)})"; bool canInject = FieldItemDropper.CanFitDropped(x, y, items.Count, height, cfg.SpawnMinX, cfg.SpawnMaxX, cfg.SpawnMinY, cfg.SpawnMaxY); if (!canInject) { await ReplyAsync($"Unable to inject {atCoords}. Please confirm the bot is configured correctly, and contact the owner.").ConfigureAwait(false); return; } var column = FieldItemDropper.InjectItemsAsDropped(x, y, items, height); var mention = Context.User.Mention; var request = new SpawnRequest(Context.User.Username, Context.User.Id, column, items) { OnFinish = success => { var reply = success ? "Items have been spawned on the map. Please pick them up!" : "Failed to spawn items. Please tell the bot owner to look at the logs!"; Task.Run(async() => await ReplyAsync($"{mention}: {reply}").ConfigureAwait(false)); } }; fi.Injections.Enqueue(request); var msg = $"{mention}: Item spawn request{(items.Count > 1 ? "s" : string.Empty)} {atCoords} have been added to the queue and will be spawned momentarily."; await ReplyAsync(msg).ConfigureAwait(false); }