mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2025-01-24 20:48:03 +03:00
Fixed items not being removed when the player no longer has it
Fixed item quantity and properties not updating when changed Fixed an error message getting into the items list Also checking if an item is nul wont NRE anymore
This commit is contained in:
parent
13280cd57c
commit
7d66fc9744
@ -55,19 +55,19 @@ namespace Facepunch.Steamworks
|
||||
|
||||
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 @@ namespace Facepunch.Steamworks
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -114,6 +114,10 @@ namespace Facepunch.Steamworks
|
||||
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 @@ namespace Facepunch.Steamworks
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -129,14 +129,14 @@ namespace Facepunch.Steamworks
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ namespace Facepunch.Steamworks
|
||||
}
|
||||
|
||||
LastTimestamp = r.Timestamp;
|
||||
ApplyResult( r );
|
||||
ApplyResult( r, isFullUpdate );
|
||||
}
|
||||
|
||||
r.Dispose();
|
||||
@ -161,7 +161,7 @@ namespace Facepunch.Steamworks
|
||||
/// Here we're trying to keep our stack up to date with whatever happens
|
||||
/// with the crafting, stacking etc
|
||||
/// </summary>
|
||||
internal void ApplyResult( Result r )
|
||||
internal void ApplyResult( Result r, bool isFullUpdate )
|
||||
{
|
||||
if ( IsServer ) return;
|
||||
|
||||
@ -170,12 +170,19 @@ namespace Facepunch.Steamworks
|
||||
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!
|
||||
|
@ -94,6 +94,28 @@ namespace Facepunch.Steamworks
|
||||
|
||||
return Encoding.UTF8.GetString( buffer, 0, i );
|
||||
}
|
||||
|
||||
|
||||
public static IEnumerable<T> UnionSelect<T>(
|
||||
this IEnumerable<T> first,
|
||||
IEnumerable<T> second,
|
||||
Func<T, T, T> selector) where T : IEquatable<T>
|
||||
{
|
||||
var items = new Dictionary<T, T>();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user