using MinecraftClient.Inventory; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MinecraftClient.ChatBots { class AutoDrop : ChatBot { private enum Mode { Include, // Items in list will be dropped Exclude, // Items in list will be kept Everything // Everything will be dropped } private Mode dropMode = Mode.Include; private bool enable = true; private int updateDebounce = 0; private int updateDebounceValue = 2; private int inventoryUpdated = -1; private List itemList = new List(); public AutoDrop(string mode, string itemList) { if (!Enum.TryParse(mode, true, out dropMode)) { LogToConsole("Cannot read drop mode from config. Using include mode."); } if (dropMode != Mode.Everything) this.itemList = ItemListParser(itemList).ToList(); } /// /// Convert an item type string to item type array /// /// String to convert /// Item type array private ItemType[] ItemListParser(string itemList) { string trimed = new string(itemList.Where(c => !char.IsWhiteSpace(c)).ToArray()); string[] list = trimed.Split(','); List result = new List(); foreach (string t in list) { ItemType item; if (Enum.TryParse(t, true, out item)) { result.Add(item); } } return result.ToArray(); } public string CommandHandler(string cmd, string[] args) { if (args.Length > 0) { switch (args[0].ToLower()) { case "on": enable = true; inventoryUpdated = 0; OnUpdateFinish(); return Translations.Get("bot.autoDrop.on"); case "off": enable = false; return Translations.Get("bot.autoDrop.off"); case "add": if (args.Length >= 2) { ItemType item; if (Enum.TryParse(args[1], true, out item)) { itemList.Add(item); return Translations.Get("bot.autoDrop.added", item.ToString()); } else { return Translations.Get("bot.autoDrop.incorrect_name", args[1]); } } else { return Translations.Get("cmd.inventory.help.usage") + ": add "; } case "remove": if (args.Length >= 2) { ItemType item; if (Enum.TryParse(args[1], true, out item)) { if (itemList.Contains(item)) { itemList.Remove(item); return Translations.Get("bot.autoDrop.removed", item.ToString()); } else { return Translations.Get("bot.autoDrop.not_in_list"); } } else { return Translations.Get("bot.autoDrop.incorrect_name", args[1]); } } else { return Translations.Get("cmd.inventory.help.usage") + ": remove "; } case "list": if (itemList.Count > 0) { return Translations.Get("bot.autoDrop.list", itemList.Count, string.Join("\n", itemList)); } else { return Translations.Get("bot.autoDrop.no_item"); } default: return GetHelp(); } } else { return GetHelp(); } } private string GetHelp() { return Translations.Get("general.available_cmd", "on, off, add, remove, list"); } public override void Initialize() { if (!GetInventoryEnabled()) { LogToConsoleTranslated("extra.inventory_required"); LogToConsoleTranslated("general.bot_unload"); UnloadBot(); return; } RegisterChatBotCommand("autodrop", Translations.Get("bot.autoDrop.cmd"), GetHelp(), CommandHandler); RegisterChatBotCommand("ad", Translations.Get("bot.autoDrop.alias"), GetHelp(), CommandHandler); } public override void Update() { if (updateDebounce > 0) { updateDebounce--; if (updateDebounce <= 0) { OnUpdateFinish(); } } } public override void OnInventoryUpdate(int inventoryId) { if (enable) { updateDebounce = updateDebounceValue; inventoryUpdated = inventoryId; } } private void OnUpdateFinish() { if (inventoryUpdated != -1) { var inventory = GetInventories()[inventoryUpdated]; var items = inventory.Items.ToDictionary(entry => entry.Key, entry => entry.Value); if (dropMode == Mode.Include) { foreach (var item in items) { if (itemList.Contains(item.Value.Type)) { // Drop it !! WindowAction(inventoryUpdated, item.Key, WindowActionType.DropItemStack); } } } else if (dropMode == Mode.Exclude) { foreach (var item in items) { if (!itemList.Contains(item.Value.Type)) { // Drop it !! WindowAction(inventoryUpdated, item.Key, WindowActionType.DropItemStack); } } } else { foreach (var item in items) { // Drop it !! WindowAction(inventoryUpdated, item.Key, WindowActionType.DropItemStack); } } inventoryUpdated = -1; } } } }