summaryrefslogtreecommitdiff
path: root/src/SMAPI.Mods.ConsoleCommands
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Mods.ConsoleCommands')
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/AddCommand.cs2
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/ListItemsCommand.cs4
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetMoneyCommand.cs4
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/Framework/Commands/World/SetTimeCommand.cs2
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/Framework/ItemData/ItemType.cs17
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/Framework/ItemRepository.cs340
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/Properties/AssemblyInfo.cs4
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/SMAPI.Mods.ConsoleCommands.csproj73
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj35
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/manifest.json4
10 files changed, 294 insertions, 191 deletions
diff --git a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/AddCommand.cs b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/AddCommand.cs
index 263e126c..6cb2b624 100644
--- a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/AddCommand.cs
+++ b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/AddCommand.cs
@@ -15,7 +15,7 @@ namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.Player
/// <summary>Provides methods for searching and constructing items.</summary>
private readonly ItemRepository Items = new ItemRepository();
- /// <summary>The type names recognised by this command.</summary>
+ /// <summary>The type names recognized by this command.</summary>
private readonly string[] ValidTypes = Enum.GetNames(typeof(ItemType)).Concat(new[] { "Name" }).ToArray();
diff --git a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/ListItemsCommand.cs b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/ListItemsCommand.cs
index 5b52e9a2..4232ce16 100644
--- a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/ListItemsCommand.cs
+++ b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/ListItemsCommand.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using StardewModdingAPI.Mods.ConsoleCommands.Framework.ItemData;
@@ -58,7 +58,7 @@ namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.Player
/// <param name="searchWords">The search string to find.</param>
private IEnumerable<SearchableItem> GetItems(string[] searchWords)
{
- // normalise search term
+ // normalize search term
searchWords = searchWords?.Where(word => !string.IsNullOrWhiteSpace(word)).ToArray();
if (searchWords?.Any() == false)
searchWords = null;
diff --git a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetMoneyCommand.cs b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetMoneyCommand.cs
index ad11cc66..1706bbc1 100644
--- a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetMoneyCommand.cs
+++ b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetMoneyCommand.cs
@@ -1,4 +1,4 @@
-using System.Linq;
+using System.Linq;
using StardewValley;
namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.Player
@@ -65,7 +65,7 @@ namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.Player
public override void Update(IMonitor monitor)
{
if (this.InfiniteMoney)
- Game1.player.money = 999999;
+ Game1.player.Money = 999999;
}
}
}
diff --git a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/World/SetTimeCommand.cs b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/World/SetTimeCommand.cs
index a6075013..9eae6741 100644
--- a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/World/SetTimeCommand.cs
+++ b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/World/SetTimeCommand.cs
@@ -60,7 +60,7 @@ namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.World
{
for (int i = 0; i > intervals; i--)
{
- Game1.timeOfDay = FromTimeSpan(ToTimeSpan(Game1.timeOfDay).Subtract(TimeSpan.FromMinutes(20))); // offset 20 mins so game updates to next interval
+ Game1.timeOfDay = FromTimeSpan(ToTimeSpan(Game1.timeOfDay).Subtract(TimeSpan.FromMinutes(20))); // offset 20 minutes so game updates to next interval
Game1.performTenMinuteClockUpdate();
}
}
diff --git a/src/SMAPI.Mods.ConsoleCommands/Framework/ItemData/ItemType.cs b/src/SMAPI.Mods.ConsoleCommands/Framework/ItemData/ItemType.cs
index 7ee662d0..5d269c89 100644
--- a/src/SMAPI.Mods.ConsoleCommands/Framework/ItemData/ItemType.cs
+++ b/src/SMAPI.Mods.ConsoleCommands/Framework/ItemData/ItemType.cs
@@ -6,28 +6,31 @@ namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.ItemData
/// <summary>A big craftable object in <see cref="StardewValley.Game1.bigCraftablesInformation"/></summary>
BigCraftable,
- /// <summary>A <see cref="Boots"/> item.</summary>
+ /// <summary>A <see cref="StardewValley.Objects.Boots"/> item.</summary>
Boots,
- /// <summary>A <see cref="Wallpaper"/> flooring item.</summary>
+ /// <summary>A <see cref="StardewValley.Objects.Clothing"/> item.</summary>
+ Clothing,
+
+ /// <summary>A <see cref="StardewValley.Objects.Wallpaper"/> flooring item.</summary>
Flooring,
- /// <summary>A <see cref="Furniture"/> item.</summary>
+ /// <summary>A <see cref="StardewValley.Objects.Furniture"/> item.</summary>
Furniture,
- /// <summary>A <see cref="Hat"/> item.</summary>
+ /// <summary>A <see cref="StardewValley.Objects.Hat"/> item.</summary>
Hat,
/// <summary>Any object in <see cref="StardewValley.Game1.objectInformation"/> (except rings).</summary>
Object,
- /// <summary>A <see cref="Ring"/> item.</summary>
+ /// <summary>A <see cref="StardewValley.Objects.Ring"/> item.</summary>
Ring,
- /// <summary>A <see cref="Tool"/> tool.</summary>
+ /// <summary>A <see cref="StardewValley.Tool"/> tool.</summary>
Tool,
- /// <summary>A <see cref="Wallpaper"/> wall item.</summary>
+ /// <summary>A <see cref="StardewValley.Objects.Wallpaper"/> wall item.</summary>
Wallpaper,
/// <summary>A <see cref="StardewValley.Tools.MeleeWeapon"/> or <see cref="StardewValley.Tools.Slingshot"/> item.</summary>
diff --git a/src/SMAPI.Mods.ConsoleCommands/Framework/ItemRepository.cs b/src/SMAPI.Mods.ConsoleCommands/Framework/ItemRepository.cs
index fc631826..0648aa2b 100644
--- a/src/SMAPI.Mods.ConsoleCommands/Framework/ItemRepository.cs
+++ b/src/SMAPI.Mods.ConsoleCommands/Framework/ItemRepository.cs
@@ -1,7 +1,11 @@
+using System;
using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
using Microsoft.Xna.Framework;
using StardewModdingAPI.Mods.ConsoleCommands.Framework.ItemData;
using StardewValley;
+using StardewValley.Menus;
using StardewValley.Objects;
using StardewValley.Tools;
using SObject = StardewValley.Object;
@@ -22,172 +26,234 @@ namespace StardewModdingAPI.Mods.ConsoleCommands.Framework
** Public methods
*********/
/// <summary>Get all spawnable items.</summary>
+ [SuppressMessage("ReSharper", "AccessToModifiedClosure", Justification = "TryCreate invokes the lambda immediately.")]
public IEnumerable<SearchableItem> GetAll()
{
- // get tools
- yield return new SearchableItem(ItemType.Tool, ToolFactory.axe, ToolFactory.getToolFromDescription(ToolFactory.axe, 0));
- yield return new SearchableItem(ItemType.Tool, ToolFactory.hoe, ToolFactory.getToolFromDescription(ToolFactory.hoe, 0));
- yield return new SearchableItem(ItemType.Tool, ToolFactory.pickAxe, ToolFactory.getToolFromDescription(ToolFactory.pickAxe, 0));
- yield return new SearchableItem(ItemType.Tool, ToolFactory.wateringCan, ToolFactory.getToolFromDescription(ToolFactory.wateringCan, 0));
- yield return new SearchableItem(ItemType.Tool, ToolFactory.fishingRod, ToolFactory.getToolFromDescription(ToolFactory.fishingRod, 0));
- yield return new SearchableItem(ItemType.Tool, this.CustomIDOffset, new MilkPail()); // these don't have any sort of ID, so we'll just assign some arbitrary ones
- yield return new SearchableItem(ItemType.Tool, this.CustomIDOffset + 1, new Shears());
- yield return new SearchableItem(ItemType.Tool, this.CustomIDOffset + 2, new Pan());
- yield return new SearchableItem(ItemType.Tool, this.CustomIDOffset + 3, new Wand());
-
- // wallpapers
- for (int id = 0; id < 112; id++)
- yield return new SearchableItem(ItemType.Wallpaper, id, new Wallpaper(id) { Category = SObject.furnitureCategory });
-
- // flooring
- for (int id = 0; id < 40; id++)
- yield return new SearchableItem(ItemType.Flooring, id, new Wallpaper(id, isFloor: true) { Category = SObject.furnitureCategory });
-
- // equipment
- foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\Boots").Keys)
- yield return new SearchableItem(ItemType.Boots, id, new Boots(id));
- foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\hats").Keys)
- yield return new SearchableItem(ItemType.Hat, id, new Hat(id));
- foreach (int id in Game1.objectInformation.Keys)
+ IEnumerable<SearchableItem> GetAllRaw()
{
- if (id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange)
- yield return new SearchableItem(ItemType.Ring, id, new Ring(id));
- }
+ // get tools
+ for (int quality = Tool.stone; quality <= Tool.iridium; quality++)
+ {
+ yield return this.TryCreate(ItemType.Tool, ToolFactory.axe, () => ToolFactory.getToolFromDescription(ToolFactory.axe, quality));
+ yield return this.TryCreate(ItemType.Tool, ToolFactory.hoe, () => ToolFactory.getToolFromDescription(ToolFactory.hoe, quality));
+ yield return this.TryCreate(ItemType.Tool, ToolFactory.pickAxe, () => ToolFactory.getToolFromDescription(ToolFactory.pickAxe, quality));
+ yield return this.TryCreate(ItemType.Tool, ToolFactory.wateringCan, () => ToolFactory.getToolFromDescription(ToolFactory.wateringCan, quality));
+ if (quality != Tool.iridium)
+ yield return this.TryCreate(ItemType.Tool, ToolFactory.fishingRod, () => ToolFactory.getToolFromDescription(ToolFactory.fishingRod, quality));
+ }
+ yield return this.TryCreate(ItemType.Tool, this.CustomIDOffset, () => new MilkPail()); // these don't have any sort of ID, so we'll just assign some arbitrary ones
+ yield return this.TryCreate(ItemType.Tool, this.CustomIDOffset + 1, () => new Shears());
+ yield return this.TryCreate(ItemType.Tool, this.CustomIDOffset + 2, () => new Pan());
+ yield return this.TryCreate(ItemType.Tool, this.CustomIDOffset + 3, () => new Wand());
- // weapons
- foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\weapons").Keys)
- {
- Item weapon = (id >= 32 && id <= 34)
- ? (Item)new Slingshot(id)
- : new MeleeWeapon(id);
- yield return new SearchableItem(ItemType.Weapon, id, weapon);
- }
+ // wallpapers
+ for (int id = 0; id < 112; id++)
+ yield return this.TryCreate(ItemType.Wallpaper, id, () => new Wallpaper(id) { Category = SObject.furnitureCategory });
- // furniture
- foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\Furniture").Keys)
- {
- if (id == 1466 || id == 1468)
- yield return new SearchableItem(ItemType.Furniture, id, new TV(id, Vector2.Zero));
- else
- yield return new SearchableItem(ItemType.Furniture, id, new Furniture(id, Vector2.Zero));
- }
+ // flooring
+ for (int id = 0; id < 40; id++)
+ yield return this.TryCreate(ItemType.Flooring, id, () => new Wallpaper(id, isFloor: true) { Category = SObject.furnitureCategory });
- // craftables
- foreach (int id in Game1.bigCraftablesInformation.Keys)
- yield return new SearchableItem(ItemType.BigCraftable, id, new SObject(Vector2.Zero, id));
+ // equipment
+ foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\Boots").Keys)
+ yield return this.TryCreate(ItemType.Boots, id, () => new Boots(id));
+ foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\hats").Keys)
+ yield return this.TryCreate(ItemType.Hat, id, () => new Hat(id));
+ foreach (int id in Game1.objectInformation.Keys)
+ {
+ if (id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange)
+ yield return this.TryCreate(ItemType.Ring, id, () => new Ring(id));
+ }
- // secret notes
- foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\SecretNotes").Keys)
- {
- SObject note = new SObject(79, 1);
- note.name = $"{note.name} #{id}";
- yield return new SearchableItem(ItemType.Object, this.CustomIDOffset + id, note);
- }
+ // weapons
+ foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\weapons").Keys)
+ {
+ yield return this.TryCreate(ItemType.Weapon, id, () => (id >= 32 && id <= 34)
+ ? (Item)new Slingshot(id)
+ : new MeleeWeapon(id)
+ );
+ }
- // objects
- foreach (int id in Game1.objectInformation.Keys)
- {
- if (id == 79)
- continue; // secret note handled above
- if (id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange)
- continue; // handled separated
+ // furniture
+ foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\Furniture").Keys)
+ {
+ if (id == 1466 || id == 1468)
+ yield return this.TryCreate(ItemType.Furniture, id, () => new TV(id, Vector2.Zero));
+ else
+ yield return this.TryCreate(ItemType.Furniture, id, () => new Furniture(id, Vector2.Zero));
+ }
- SObject item = new SObject(id, 1);
- yield return new SearchableItem(ItemType.Object, id, item);
+ // craftables
+ foreach (int id in Game1.bigCraftablesInformation.Keys)
+ yield return this.TryCreate(ItemType.BigCraftable, id, () => new SObject(Vector2.Zero, id));
- // fruit products
- if (item.Category == SObject.FruitsCategory)
+ // secret notes
+ foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\SecretNotes").Keys)
{
- // wine
- SObject wine = new SObject(348, 1)
- {
- Name = $"{item.Name} Wine",
- Price = item.Price * 3
- };
- wine.preserve.Value = SObject.PreserveType.Wine;
- wine.preservedParentSheetIndex.Value = item.ParentSheetIndex;
- yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 2 + id, wine);
-
- // jelly
- SObject jelly = new SObject(344, 1)
+ yield return this.TryCreate(ItemType.Object, this.CustomIDOffset + id, () =>
{
- Name = $"{item.Name} Jelly",
- Price = 50 + item.Price * 2
- };
- jelly.preserve.Value = SObject.PreserveType.Jelly;
- jelly.preservedParentSheetIndex.Value = item.ParentSheetIndex;
- yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 3 + id, jelly);
+ SObject note = new SObject(79, 1);
+ note.name = $"{note.name} #{id}";
+ return note;
+ });
}
- // vegetable products
- else if (item.Category == SObject.VegetableCategory)
+ // objects
+ foreach (int id in Game1.objectInformation.Keys)
{
- // juice
- SObject juice = new SObject(350, 1)
- {
- Name = $"{item.Name} Juice",
- Price = (int)(item.Price * 2.25d)
- };
- juice.preserve.Value = SObject.PreserveType.Juice;
- juice.preservedParentSheetIndex.Value = item.ParentSheetIndex;
- yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 4 + id, juice);
-
- // pickled
- SObject pickled = new SObject(342, 1)
+ if (id == 79)
+ continue; // secret note handled above
+ if (id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange)
+ continue; // handled separated
+
+ // spawn main item
+ SObject item;
{
- Name = $"Pickled {item.Name}",
- Price = 50 + item.Price * 2
- };
- pickled.preserve.Value = SObject.PreserveType.Pickle;
- pickled.preservedParentSheetIndex.Value = item.ParentSheetIndex;
- yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 5 + id, pickled);
- }
+ SearchableItem main = this.TryCreate(ItemType.Object, id, () => id == 812
+ ? new ColoredObject(id, 1, Color.White)
+ : new SObject(id, 1)
+ );
+ yield return main;
+ item = main?.Item as SObject;
+ }
+ if (item == null)
+ continue;
- // flower honey
- else if (item.Category == SObject.flowersCategory)
- {
- // get honey type
- SObject.HoneyType? type = null;
- switch (item.ParentSheetIndex)
+ // fruit products
+ if (item.Category == SObject.FruitsCategory)
{
- case 376:
- type = SObject.HoneyType.Poppy;
- break;
- case 591:
- type = SObject.HoneyType.Tulip;
- break;
- case 593:
- type = SObject.HoneyType.SummerSpangle;
- break;
- case 595:
- type = SObject.HoneyType.FairyRose;
- break;
- case 597:
- type = SObject.HoneyType.BlueJazz;
- break;
- case 421: // sunflower standing in for all other flowers
- type = SObject.HoneyType.Wild;
- break;
+ // wine
+ yield return this.TryCreate(ItemType.Object, this.CustomIDOffset * 2 + id, () =>
+ {
+ SObject wine = new SObject(348, 1)
+ {
+ Name = $"{item.Name} Wine",
+ Price = item.Price * 3
+ };
+ wine.preserve.Value = SObject.PreserveType.Wine;
+ wine.preservedParentSheetIndex.Value = item.ParentSheetIndex;
+ return wine;
+ });
+
+ // jelly
+ yield return this.TryCreate(ItemType.Object, this.CustomIDOffset * 3 + id, () =>
+ {
+ SObject jelly = new SObject(344, 1)
+ {
+ Name = $"{item.Name} Jelly",
+ Price = 50 + item.Price * 2
+ };
+ jelly.preserve.Value = SObject.PreserveType.Jelly;
+ jelly.preservedParentSheetIndex.Value = item.ParentSheetIndex;
+ return jelly;
+ });
}
- // yield honey
- if (type != null)
+ // vegetable products
+ else if (item.Category == SObject.VegetableCategory)
{
- SObject honey = new SObject(Vector2.Zero, 340, item.Name + " Honey", false, true, false, false)
+ // juice
+ yield return this.TryCreate(ItemType.Object, this.CustomIDOffset * 4 + id, () =>
+ {
+ SObject juice = new SObject(350, 1)
+ {
+ Name = $"{item.Name} Juice",
+ Price = (int)(item.Price * 2.25d)
+ };
+ juice.preserve.Value = SObject.PreserveType.Juice;
+ juice.preservedParentSheetIndex.Value = item.ParentSheetIndex;
+ return juice;
+ });
+
+ // pickled
+ yield return this.TryCreate(ItemType.Object, this.CustomIDOffset * 5 + id, () =>
{
- Name = "Wild Honey"
- };
- honey.honeyType.Value = type;
+ SObject pickled = new SObject(342, 1)
+ {
+ Name = $"Pickled {item.Name}",
+ Price = 50 + item.Price * 2
+ };
+ pickled.preserve.Value = SObject.PreserveType.Pickle;
+ pickled.preservedParentSheetIndex.Value = item.ParentSheetIndex;
+ return pickled;
+ });
+ }
- if (type != SObject.HoneyType.Wild)
+ // flower honey
+ else if (item.Category == SObject.flowersCategory)
+ {
+ yield return this.TryCreate(ItemType.Object, this.CustomIDOffset * 5 + id, () =>
{
- honey.Name = $"{item.Name} Honey";
+ SObject honey = new SObject(Vector2.Zero, 340, $"{item.Name} Honey", false, true, false, false)
+ {
+ Name = $"{item.Name} Honey",
+ preservedParentSheetIndex = { item.ParentSheetIndex }
+ };
honey.Price += item.Price * 2;
+ return honey;
+ });
+ }
+
+ // roe and aged roe (derived from FishPond.GetFishProduce)
+ else if (id == 812)
+ {
+ foreach (var pair in Game1.objectInformation)
+ {
+ // get input
+ SObject input = new SObject(pair.Key, 1);
+ if (input.Category != SObject.FishCategory)
+ continue;
+ Color color = TailoringMenu.GetDyeColor(input) ?? Color.Orange;
+
+ // yield roe
+ SObject roe = new ColoredObject(812, 1, color)
+ {
+ name = $"{input.Name} Roe",
+ preserve = { Value = SObject.PreserveType.Roe },
+ preservedParentSheetIndex = { Value = input.ParentSheetIndex }
+ };
+ roe.Price += input.Price / 2;
+ yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 6 + 1, roe);
+
+ // aged roe
+ if (pair.Key != 698) // aged sturgeon roe is caviar, which is a separate item
+ {
+ ColoredObject agedRoe = new ColoredObject(447, 1, color)
+ {
+ name = $"Aged {input.Name} Roe",
+ Category = -27,
+ preserve = { Value = SObject.PreserveType.AgedRoe },
+ preservedParentSheetIndex = { Value = input.ParentSheetIndex },
+ Price = roe.Price * 2
+ };
+ yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 6 + 1, agedRoe);
+ }
}
- yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 5 + id, honey);
}
}
}
+
+ return GetAllRaw().Where(p => p != null);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ /// <summary>Create a searchable item if valid.</summary>
+ /// <param name="type">The item type.</param>
+ /// <param name="id">The unique ID (if different from the item's parent sheet index).</param>
+ /// <param name="createItem">Create an item instance.</param>
+ private SearchableItem TryCreate(ItemType type, int id, Func<Item> createItem)
+ {
+ try
+ {
+ return new SearchableItem(type, id, createItem());
+ }
+ catch
+ {
+ return null; // if some item data is invalid, just don't include it
+ }
}
}
}
diff --git a/src/SMAPI.Mods.ConsoleCommands/Properties/AssemblyInfo.cs b/src/SMAPI.Mods.ConsoleCommands/Properties/AssemblyInfo.cs
deleted file mode 100644
index 86653141..00000000
--- a/src/SMAPI.Mods.ConsoleCommands/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,4 +0,0 @@
-using System.Reflection;
-
-[assembly: AssemblyTitle("SMAPI.Mods.ConsoleCommands")]
-[assembly: AssemblyDescription("")]
diff --git a/src/SMAPI.Mods.ConsoleCommands/SMAPI.Mods.ConsoleCommands.csproj b/src/SMAPI.Mods.ConsoleCommands/SMAPI.Mods.ConsoleCommands.csproj
new file mode 100644
index 00000000..ce35bf73
--- /dev/null
+++ b/src/SMAPI.Mods.ConsoleCommands/SMAPI.Mods.ConsoleCommands.csproj
@@ -0,0 +1,73 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <AssemblyName>ConsoleCommands</AssemblyName>
+ <RootNamespace>StardewModdingAPI.Mods.ConsoleCommands</RootNamespace>
+ <TargetFramework>net45</TargetFramework>
+ <LangVersion>latest</LangVersion>
+ <OutputPath>$(SolutionDir)\..\bin\$(Configuration)\Mods\ConsoleCommands</OutputPath>
+ <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+ <PlatformTarget>x86</PlatformTarget>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\SMAPI\SMAPI.csproj">
+ <Private>False</Private>
+ </ProjectReference>
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="$(GameExecutableName)">
+ <HintPath>$(GamePath)\$(GameExecutableName).exe</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="StardewValley.GameData">
+ <HintPath>$(GamePath)\StardewValley.GameData.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ </ItemGroup>
+
+ <Choose>
+ <!-- Windows -->
+ <When Condition="$(OS) == 'Windows_NT'">
+ <ItemGroup>
+ <Reference Include="Netcode">
+ <HintPath>$(GamePath)\Netcode.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Microsoft.Xna.Framework.Graphics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Microsoft.Xna.Framework.Xact, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ </ItemGroup>
+ </When>
+
+ <!-- Linux/Mac -->
+ <Otherwise>
+ <ItemGroup>
+ <Reference Include="MonoGame.Framework">
+ <HintPath>$(GamePath)\MonoGame.Framework.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ </ItemGroup>
+ </Otherwise>
+ </Choose>
+
+ <ItemGroup>
+ <None Update="manifest.json">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
+
+ <Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
+ <Import Project="..\..\build\common.targets" />
+
+</Project>
diff --git a/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj b/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj
deleted file mode 100644
index b535e2fd..00000000
--- a/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj
+++ /dev/null
@@ -1,35 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <RootNamespace>StardewModdingAPI.Mods.ConsoleCommands</RootNamespace>
- <AssemblyName>ConsoleCommands</AssemblyName>
- <TargetFramework>net45</TargetFramework>
- <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
- <LangVersion>latest</LangVersion>
- <OutputPath>$(SolutionDir)\..\bin\$(Configuration)\Mods\ConsoleCommands</OutputPath>
- <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
- <PlatformTarget>x86</PlatformTarget>
- </PropertyGroup>
-
- <ItemGroup>
- <ProjectReference Include="..\SMAPI\StardewModdingAPI.csproj">
- <Private>False</Private>
- </ProjectReference>
- </ItemGroup>
-
- <ItemGroup>
- <Compile Include="..\..\build\GlobalAssemblyInfo.cs">
- <Link>Properties\GlobalAssemblyInfo.cs</Link>
- </Compile>
- </ItemGroup>
-
- <ItemGroup>
- <None Update="manifest.json">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </None>
- </ItemGroup>
-
- <Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
- <Import Project="..\..\build\common.targets" />
-
-</Project>
diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json
index 74295410..802de3a6 100644
--- a/src/SMAPI.Mods.ConsoleCommands/manifest.json
+++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json
@@ -1,9 +1,9 @@
{
"Name": "Console Commands",
"Author": "SMAPI",
- "Version": "2.11.3",
+ "Version": "3.0.0",
"Description": "Adds SMAPI console commands that let you manipulate the game.",
"UniqueID": "SMAPI.ConsoleCommands",
"EntryDll": "ConsoleCommands.dll",
- "MinimumApiVersion": "2.11.3"
+ "MinimumApiVersion": "3.0.0"
}