summaryrefslogtreecommitdiff
path: root/StardewModdingAPI/Inheritance
diff options
context:
space:
mode:
Diffstat (limited to 'StardewModdingAPI/Inheritance')
-rw-r--r--StardewModdingAPI/Inheritance/ItemStackChange.cs23
-rw-r--r--StardewModdingAPI/Inheritance/SGame.cs42
2 files changed, 59 insertions, 6 deletions
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<Item, int> 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<ItemStackChange> 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<Item> items, out List<ItemStackChange> changedItems)
+ {
+ changedItems = new List<ItemStackChange>();
+ IEnumerable<Item> 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