diff --git a/Facepunch.Steamworks/Interfaces/Inventory.Item.cs b/Facepunch.Steamworks/Interfaces/Inventory.Item.cs index 84c4383..cbda47d 100644 --- a/Facepunch.Steamworks/Interfaces/Inventory.Item.cs +++ b/Facepunch.Steamworks/Interfaces/Inventory.Item.cs @@ -55,19 +55,19 @@ public Definition Definition public bool TradeLocked; - public bool Equals( Item other ) + public bool Equals(Item other) { - return Equals( other, this ); + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Id == other.Id; } - public override bool Equals( object obj ) + public override bool Equals(object obj) { - if ( obj == null || GetType() != obj.GetType() ) - { - return false; - } - - return ((Item)obj).Id == Id; + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((Item)obj); } public override int GetHashCode() @@ -75,15 +75,14 @@ public override int GetHashCode() return Id.GetHashCode(); } - - public static bool operator ==( Item c1, Item c2 ) + public static bool operator ==(Item left, Item right) { - return c1.Equals( c2 ); + return Equals(left, right); } - public static bool operator !=( Item c1, Item c2 ) + public static bool operator !=(Item left, Item right) { - return !c1.Equals( c2 ); + return !Equals(left, right); } /// diff --git a/Facepunch.Steamworks/Interfaces/Inventory.Result.cs b/Facepunch.Steamworks/Interfaces/Inventory.Result.cs index 68935bb..129f64f 100644 --- a/Facepunch.Steamworks/Interfaces/Inventory.Result.cs +++ b/Facepunch.Steamworks/Interfaces/Inventory.Result.cs @@ -114,6 +114,10 @@ internal void Fill() for ( int i=0; i< steamItems.Length; i++ ) { var item = inventory.ItemFrom( Handle, steamItems[i], i ); + if ( item == null ) + { + continue; + } if ( ( steamItems[i].Flags & (int)SteamNative.SteamItemFlags.Removed ) != 0 ) { @@ -189,6 +193,13 @@ internal Item ItemFrom( SteamInventoryResult_t handle, SteamItemDetails_t detail { if ( inventory.GetResultItemProperty(handle, (uint)index, propertyName, out string propertyValue ) ) { + if (propertyName == "error") + { + Console.Write("Steam item error: "); + Console.WriteLine(propertyValue); + return null; + } + props.Add(propertyName, propertyValue); } } diff --git a/Facepunch.Steamworks/Interfaces/Inventory.cs b/Facepunch.Steamworks/Interfaces/Inventory.cs index c0517e3..d3b34e5 100644 --- a/Facepunch.Steamworks/Interfaces/Inventory.cs +++ b/Facepunch.Steamworks/Interfaces/Inventory.cs @@ -129,14 +129,14 @@ private void onResultReady( SteamInventoryResultReady_t data ) } } - private void onResult( Result r, bool serialize ) + private void onResult( Result r, bool isFullUpdate ) { if ( r.IsSuccess ) { // // We only serialize FULL updates // - if ( serialize ) + if ( isFullUpdate ) { // // Only serialize if this result is newer than the last one @@ -149,7 +149,7 @@ private void onResult( Result r, bool serialize ) } LastTimestamp = r.Timestamp; - ApplyResult( r ); + ApplyResult( r, isFullUpdate ); } r.Dispose(); @@ -161,7 +161,7 @@ private void onResult( Result r, bool serialize ) /// Here we're trying to keep our stack up to date with whatever happens /// with the crafting, stacking etc /// - internal void ApplyResult( Result r ) + internal void ApplyResult( Result r, bool isFullUpdate ) { if ( IsServer ) return; @@ -170,12 +170,19 @@ internal void ApplyResult( Result r ) if ( Items == null ) Items = new Item[0]; - Items = Items - .Union( r.Items ) - .Distinct() - .Where( x => !r.Removed.Contains( x ) ) - .Where( x => !r.Consumed.Contains( x ) ) + if (isFullUpdate) + { + Items = r.Items; + } + else + { + // keep the new item instance because it might have a different quantity, properties, etc + Items = Items + .UnionSelect(r.Items, (oldItem, newItem) => newItem) + .Where(x => !r.Removed.Contains(x)) + .Where(x => !r.Consumed.Contains(x)) .ToArray(); + } // // Tell everyone we've got new items! diff --git a/Facepunch.Steamworks/Utility.cs b/Facepunch.Steamworks/Utility.cs index 1bb7e43..86e70e3 100644 --- a/Facepunch.Steamworks/Utility.cs +++ b/Facepunch.Steamworks/Utility.cs @@ -94,6 +94,28 @@ public static string ReadNullTerminatedUTF8String( this BinaryReader br, byte[] return Encoding.UTF8.GetString( buffer, 0, i ); } - + + public static IEnumerable UnionSelect( + this IEnumerable first, + IEnumerable second, + Func selector) where T : IEquatable + { + var items = new Dictionary(); + + foreach (var i in first) + { + items[i] = i; + } + + foreach (var i in second) + { + T firstValue; + if (items.TryGetValue(i, out firstValue)) + { + items.Remove(i); + yield return selector(firstValue, i); + } + } + } } }