From 40e8d3da0e204117d0a6de91b368ef420eb31df0 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 2 Jul 2017 17:37:30 -0400 Subject: migrate list_items command to new item repository (#302) --- release-notes.md | 2 + .../Framework/Commands/Player/ListItemsCommand.cs | 55 ++++++++++------------ src/TrainerMod/Framework/ItemData/ISearchItem.cs | 21 --------- .../Framework/ItemData/SearchableObject.cs | 48 ------------------- .../Framework/ItemData/SearchableRing.cs | 48 ------------------- .../Framework/ItemData/SearchableWeapon.cs | 48 ------------------- src/TrainerMod/TrainerMod.csproj | 4 -- 7 files changed, 27 insertions(+), 199 deletions(-) delete mode 100644 src/TrainerMod/Framework/ItemData/ISearchItem.cs delete mode 100644 src/TrainerMod/Framework/ItemData/SearchableObject.cs delete mode 100644 src/TrainerMod/Framework/ItemData/SearchableRing.cs delete mode 100644 src/TrainerMod/Framework/ItemData/SearchableWeapon.cs diff --git a/release-notes.md b/release-notes.md index 816c2b68..e23a1e45 100644 --- a/release-notes.md +++ b/release-notes.md @@ -16,6 +16,8 @@ For players: * SMAPI no longer loads mods known to be obsolete or unneeded. * SMAPI now lists mods in an easier-to-read format in the console. * When the `ObjectInformation.xnb` is broken, SMAPI now prints one error to the console instead of a warning flood. (The individual issues are still listed in the log file if needed.) +* TrainerMod's `list_items` command now shows all item types in the game. You can search specific item types like `list_items weapons`, and use `list_item_types` to see a list of types. +* TrainerMod's `list_items` with search keywords now also searches items' translated names. For modders: * You can now specify minimum dependency versions in `manifest.json`. diff --git a/src/TrainerMod/Framework/Commands/Player/ListItemsCommand.cs b/src/TrainerMod/Framework/Commands/Player/ListItemsCommand.cs index 30c3de3b..7f4f454c 100644 --- a/src/TrainerMod/Framework/Commands/Player/ListItemsCommand.cs +++ b/src/TrainerMod/Framework/Commands/Player/ListItemsCommand.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Linq; using StardewModdingAPI; -using StardewValley; -using StardewValley.Objects; using TrainerMod.Framework.ItemData; namespace TrainerMod.Framework.Commands.Player @@ -11,6 +9,13 @@ namespace TrainerMod.Framework.Commands.Player /// A command which list items available to spawn. internal class ListItemsCommand : TrainerCommand { + /********* + ** Properties + *********/ + /// Provides methods for searching and constructing items. + private readonly ItemRepository Items = new ItemRepository(); + + /********* ** Public methods *********/ @@ -24,12 +29,24 @@ namespace TrainerMod.Framework.Commands.Player /// The command arguments. public override void Handle(IMonitor monitor, string command, ArgumentParser args) { - var matches = this.GetItems(args.ToArray()).ToArray(); + // validate + if (!Context.IsWorldReady) + { + monitor.Log("You need to load a save to use this command.", LogLevel.Error); + return; + } - // show matches + // handle + SearchableItem[] matches = + ( + from item in this.GetItems(args.ToArray()) + orderby item.Type.ToString(), item.Name + select item + ) + .ToArray(); string summary = "Searching...\n"; if (matches.Any()) - monitor.Log(summary + this.GetTableString(matches, new[] { "type", "id", "name" }, val => new[] { val.Type.ToString(), val.ID.ToString(), val.Name }), LogLevel.Info); + monitor.Log(summary + this.GetTableString(matches, new[] { "type", "name", "id" }, val => new[] { val.Type.ToString(), val.Name, val.ID.ToString() }), LogLevel.Info); else monitor.Log(summary + "No items found", LogLevel.Info); } @@ -40,7 +57,7 @@ namespace TrainerMod.Framework.Commands.Player *********/ /// Get all items which can be searched and added to the player's inventory through the console. /// The search string to find. - private IEnumerable GetItems(string[] searchWords) + private IEnumerable GetItems(string[] searchWords) { // normalise search term searchWords = searchWords?.Where(word => !string.IsNullOrWhiteSpace(word)).ToArray(); @@ -49,33 +66,11 @@ namespace TrainerMod.Framework.Commands.Player // find matches return ( - from item in this.GetItems() - let term = $"{item.ID}|{item.Type}|{item.Name}" + from item in this.Items.GetAll() + let term = $"{item.ID}|{item.Type}|{item.Name}|{item.DisplayName}" where searchWords == null || searchWords.All(word => term.IndexOf(word, StringComparison.CurrentCultureIgnoreCase) != -1) select item ); } - - /// Get all items which can be searched and added to the player's inventory through the console. - private IEnumerable GetItems() - { - // objects - foreach (int id in Game1.objectInformation.Keys) - { - ISearchItem obj = id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange - ? new SearchableRing(id) - : (ISearchItem)new SearchableObject(id); - if (obj.IsValid) - yield return obj; - } - - // weapons - foreach (int id in Game1.content.Load>("Data\\weapons").Keys) - { - ISearchItem weapon = new SearchableWeapon(id); - if (weapon.IsValid) - yield return weapon; - } - } } } diff --git a/src/TrainerMod/Framework/ItemData/ISearchItem.cs b/src/TrainerMod/Framework/ItemData/ISearchItem.cs deleted file mode 100644 index db30da77..00000000 --- a/src/TrainerMod/Framework/ItemData/ISearchItem.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace TrainerMod.Framework.ItemData -{ - /// An item that can be searched and added to the player's inventory through the console. - internal interface ISearchItem - { - /********* - ** Accessors - *********/ - /// Whether the item is valid. - bool IsValid { get; } - - /// The item ID. - int ID { get; } - - /// The item name. - string Name { get; } - - /// The item type. - ItemType Type { get; } - } -} \ No newline at end of file diff --git a/src/TrainerMod/Framework/ItemData/SearchableObject.cs b/src/TrainerMod/Framework/ItemData/SearchableObject.cs deleted file mode 100644 index 7e44a315..00000000 --- a/src/TrainerMod/Framework/ItemData/SearchableObject.cs +++ /dev/null @@ -1,48 +0,0 @@ -using StardewValley; - -namespace TrainerMod.Framework.ItemData -{ - /// An object that can be searched and added to the player's inventory through the console. - internal class SearchableObject : ISearchItem - { - /********* - ** Properties - *********/ - /// The underlying item. - private readonly Item Item; - - - /********* - ** Accessors - *********/ - /// Whether the item is valid. - public bool IsValid => this.Item != null && this.Item.Name != "Broken Item"; - - /// The item ID. - public int ID => this.Item.parentSheetIndex; - - /// The item name. - public string Name => this.Item.Name; - - /// The item type. - public ItemType Type => ItemType.Object; - - - /********* - ** Accessors - *********/ - /// Construct an instance. - /// The item ID. - public SearchableObject(int id) - { - try - { - this.Item = new Object(id, 1); - } - catch - { - // invalid - } - } - } -} \ No newline at end of file diff --git a/src/TrainerMod/Framework/ItemData/SearchableRing.cs b/src/TrainerMod/Framework/ItemData/SearchableRing.cs deleted file mode 100644 index 20b6aef2..00000000 --- a/src/TrainerMod/Framework/ItemData/SearchableRing.cs +++ /dev/null @@ -1,48 +0,0 @@ -using StardewValley.Objects; - -namespace TrainerMod.Framework.ItemData -{ - /// A ring that can be searched and added to the player's inventory through the console. - internal class SearchableRing : ISearchItem - { - /********* - ** Properties - *********/ - /// The underlying item. - private readonly Ring Ring; - - - /********* - ** Accessors - *********/ - /// Whether the item is valid. - public bool IsValid => this.Ring != null; - - /// The item ID. - public int ID => this.Ring.parentSheetIndex; - - /// The item name. - public string Name => this.Ring.Name; - - /// The item type. - public ItemType Type => ItemType.Ring; - - - /********* - ** Accessors - *********/ - /// Construct an instance. - /// The ring ID. - public SearchableRing(int id) - { - try - { - this.Ring = new Ring(id); - } - catch - { - // invalid - } - } - } -} \ No newline at end of file diff --git a/src/TrainerMod/Framework/ItemData/SearchableWeapon.cs b/src/TrainerMod/Framework/ItemData/SearchableWeapon.cs deleted file mode 100644 index 70d659ee..00000000 --- a/src/TrainerMod/Framework/ItemData/SearchableWeapon.cs +++ /dev/null @@ -1,48 +0,0 @@ -using StardewValley.Tools; - -namespace TrainerMod.Framework.ItemData -{ - /// A weapon that can be searched and added to the player's inventory through the console. - internal class SearchableWeapon : ISearchItem - { - /********* - ** Properties - *********/ - /// The underlying item. - private readonly MeleeWeapon Weapon; - - - /********* - ** Accessors - *********/ - /// Whether the item is valid. - public bool IsValid => this.Weapon != null; - - /// The item ID. - public int ID => this.Weapon.initialParentTileIndex; - - /// The item name. - public string Name => this.Weapon.Name; - - /// The item type. - public ItemType Type => ItemType.Weapon; - - - /********* - ** Accessors - *********/ - /// Construct an instance. - /// The weapon ID. - public SearchableWeapon(int id) - { - try - { - this.Weapon = new MeleeWeapon(id); - } - catch - { - // invalid - } - } - } -} \ No newline at end of file diff --git a/src/TrainerMod/TrainerMod.csproj b/src/TrainerMod/TrainerMod.csproj index 8e4e2b2e..332833df 100644 --- a/src/TrainerMod/TrainerMod.csproj +++ b/src/TrainerMod/TrainerMod.csproj @@ -83,11 +83,7 @@ - - - - -- cgit