From 4712da9f2d382e4593966530145140f33c7673bf Mon Sep 17 00:00:00 2001 From: ClxS Date: Fri, 4 Mar 2016 20:20:58 +0000 Subject: Improved Inventory Changed command to show which items were added/removed/alteredQuantity --- StardewModdingAPI/Inheritance/ItemStackChange.cs | 23 +++++++++++++ StardewModdingAPI/Inheritance/SGame.cs | 42 ++++++++++++++++++++---- 2 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 StardewModdingAPI/Inheritance/ItemStackChange.cs (limited to 'StardewModdingAPI/Inheritance') diff --git a/StardewModdingAPI/Inheritance/ItemStackChange.cs b/StardewModdingAPI/Inheritance/ItemStackChange.cs new file mode 100644 index 00000000..88003579 --- /dev/null +++ b/StardewModdingAPI/Inheritance/ItemStackChange.cs @@ -0,0 +1,23 @@ +using StardewValley; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StardewModdingAPI.Inheritance +{ + public enum ChangeType + { + Removed, + Added, + StackChange + } + + public class ItemStackChange + { + public Item Item { get; set; } + public int StackChange { get; set; } + public ChangeType ChangeType { get; set; } + } +} diff --git a/StardewModdingAPI/Inheritance/SGame.cs b/StardewModdingAPI/Inheritance/SGame.cs index c19dadf2..366f3045 100644 --- a/StardewModdingAPI/Inheritance/SGame.cs +++ b/StardewModdingAPI/Inheritance/SGame.cs @@ -45,7 +45,8 @@ namespace StardewModdingAPI.Inheritance public int PreviousGameLocations { get; private set; } public int PreviousLocationObjects { get; private set; } - public int PreviousItems { get; private set; } + public int PreviousItems_ { get; private set; } + public Dictionary PreviousItems { get; private set; } public GameLocation PreviousGameLocation { get; private set; } public IClickableMenu PreviousActiveMenu { get; private set; } @@ -217,8 +218,7 @@ namespace StardewModdingAPI.Inheritance Program.LogDebug("A custom location could not be created for: " + name); return null; } - - + public void UpdateEventCalls() { KStateNow = Keyboard.GetState(); @@ -264,10 +264,12 @@ namespace StardewModdingAPI.Inheritance PreviousFarmer = player; } - if(player != null && PreviousItems != player.items.GetHash()) + List changedItems; + if (player != null && HasInventoryChanged(player.items, out changedItems)) { - Events.PlayerEvents.InvokeInventoryChanged(player.items); - } + Events.PlayerEvents.InvokeInventoryChanged(player.items, changedItems); + PreviousItems = player.items.Where(n => n != null).ToDictionary(n => n, n => n.Stack); + } if(currentLocation != null && PreviousLocationObjects != currentLocation.objects.GetHash()) { @@ -299,5 +301,33 @@ namespace StardewModdingAPI.Inheritance PreviousYearOfGame = year; } } + + private bool HasInventoryChanged(List items, out List changedItems) + { + changedItems = new List(); + IEnumerable actualItems = items.Where(n => n != null); + foreach (var item in actualItems) + { + if (PreviousItems != null && PreviousItems.ContainsKey(item)) + { + if(PreviousItems[item] != item.Stack) + { + changedItems.Add(new ItemStackChange() { Item = item, StackChange = item.Stack - PreviousItems[item], ChangeType = ChangeType.StackChange }); + } + } + else + { + changedItems.Add(new ItemStackChange() { Item = item, StackChange = item.Stack, ChangeType = ChangeType.Added }); + } + } + + if (PreviousItems != null) + { + changedItems.AddRange(PreviousItems.Where(n => !actualItems.Any(i => i == n.Key)).Select(n => + new ItemStackChange() { Item = n.Key, StackChange = -n.Key.Stack, ChangeType = ChangeType.Removed })); + } + + return (changedItems.Any()); + } } } \ No newline at end of file -- cgit