mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2024-10-17 07:46:58 +03:00
Parse exchange field for Item Definitions, giving Recipe
This commit is contained in:
parent
019d46580e
commit
41400f56e6
@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
|
||||||
namespace Facepunch.Steamworks.Test
|
namespace Facepunch.Steamworks.Test
|
||||||
@ -221,6 +222,50 @@ public void InventoryDefinitions()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void InventoryDefinitionExchange()
|
||||||
|
{
|
||||||
|
using ( var client = new Facepunch.Steamworks.Client( 252490 ) )
|
||||||
|
{
|
||||||
|
Assert.IsNotNull( client.Inventory.Definitions );
|
||||||
|
Assert.AreNotEqual( 0, client.Inventory.Definitions.Length );
|
||||||
|
|
||||||
|
foreach ( var i in client.Inventory.Definitions )
|
||||||
|
{
|
||||||
|
if ( i.Recipes == null ) continue;
|
||||||
|
|
||||||
|
Console.WriteLine( "Ways To Create " + i.Name );
|
||||||
|
|
||||||
|
foreach ( var r in i.Recipes )
|
||||||
|
{
|
||||||
|
Console.WriteLine( " " + string.Join( ", ", r.Ingredients.Select( x => x.Count + " x " + x.Definition.Name ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void InventoryDefinitionIngredients()
|
||||||
|
{
|
||||||
|
using ( var client = new Facepunch.Steamworks.Client( 252490 ) )
|
||||||
|
{
|
||||||
|
Assert.IsNotNull( client.Inventory.Definitions );
|
||||||
|
Assert.AreNotEqual( 0, client.Inventory.Definitions.Length );
|
||||||
|
|
||||||
|
foreach ( var i in client.Inventory.Definitions )
|
||||||
|
{
|
||||||
|
if ( i.IngredientFor == null ) continue;
|
||||||
|
|
||||||
|
Console.WriteLine( i.Name + " Can Be Used to Make" );
|
||||||
|
|
||||||
|
foreach ( var r in i.IngredientFor )
|
||||||
|
{
|
||||||
|
Console.WriteLine( " " + r.Result.Name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void InventoryItemList()
|
public void InventoryItemList()
|
||||||
{
|
{
|
||||||
|
@ -18,11 +18,27 @@ public class Definition
|
|||||||
internal SteamNative.SteamInventory inventory;
|
internal SteamNative.SteamInventory inventory;
|
||||||
|
|
||||||
public int Id { get; private set; }
|
public int Id { get; private set; }
|
||||||
public string Name;
|
public string Name { get; set; }
|
||||||
public string Description;
|
public string Description { get; set; }
|
||||||
|
|
||||||
public DateTime Created;
|
/// <summary>
|
||||||
public DateTime Modified;
|
/// If this item can be created using other items this string will contain a comma seperated
|
||||||
|
/// list of definition ids that can be used, ie "100,101;102x5;103x3,104x3"
|
||||||
|
/// </summary>
|
||||||
|
public string ExchangeSchema { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A list of recepies for creating this item. Can be null if none.
|
||||||
|
/// </summary>
|
||||||
|
public Recipe[] Recipes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A list of recepies we're included in
|
||||||
|
/// </summary>
|
||||||
|
public Recipe[] IngredientFor { get; set; }
|
||||||
|
|
||||||
|
public DateTime Created { get; set; }
|
||||||
|
public DateTime Modified { get; set; }
|
||||||
|
|
||||||
private Dictionary<string, string> customProperties;
|
private Dictionary<string, string> customProperties;
|
||||||
|
|
||||||
@ -86,6 +102,7 @@ internal void SetupCommonProperties()
|
|||||||
Description = GetStringProperty( "description" );
|
Description = GetStringProperty( "description" );
|
||||||
Created = GetProperty<DateTime>( "timestamp" );
|
Created = GetProperty<DateTime>( "timestamp" );
|
||||||
Modified = GetProperty<DateTime>( "modified" );
|
Modified = GetProperty<DateTime>( "modified" );
|
||||||
|
ExchangeSchema = GetStringProperty( "exchange" );
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -100,6 +117,78 @@ public void TriggerItemDrop()
|
|||||||
inventory.TriggerItemDrop( ref result, Id );
|
inventory.TriggerItemDrop( ref result, Id );
|
||||||
inventory.DestroyResult( result );
|
inventory.DestroyResult( result );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void Link( Definition[] definitions )
|
||||||
|
{
|
||||||
|
LinkExchange( definitions );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LinkExchange( Definition[] definitions )
|
||||||
|
{
|
||||||
|
if ( string.IsNullOrEmpty( ExchangeSchema ) ) return;
|
||||||
|
|
||||||
|
var parts = ExchangeSchema.Split( new[] { ';' }, StringSplitOptions.RemoveEmptyEntries );
|
||||||
|
|
||||||
|
Recipes = parts.Select( x => Recipe.FromString( x, definitions, this ) ).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void InRecipe( Recipe r )
|
||||||
|
{
|
||||||
|
if ( IngredientFor == null )
|
||||||
|
IngredientFor = new Recipe[0];
|
||||||
|
|
||||||
|
var list = new List<Recipe>( IngredientFor );
|
||||||
|
list.Add( r );
|
||||||
|
|
||||||
|
IngredientFor = list.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct Recipe
|
||||||
|
{
|
||||||
|
public struct Ingredient
|
||||||
|
{
|
||||||
|
public int DefinitionId;
|
||||||
|
public Definition Definition;
|
||||||
|
public int Count;
|
||||||
|
|
||||||
|
internal static Ingredient FromString( string part, Definition[] definitions )
|
||||||
|
{
|
||||||
|
var i = new Ingredient();
|
||||||
|
i.Count = 1;
|
||||||
|
|
||||||
|
if ( part.Contains( 'x' ) )
|
||||||
|
{
|
||||||
|
var idx = part.IndexOf( 'x' );
|
||||||
|
i.Count = int.Parse( part.Substring( idx ) );
|
||||||
|
part = part.Substring( 0, idx );
|
||||||
|
}
|
||||||
|
|
||||||
|
i.DefinitionId = int.Parse( part );
|
||||||
|
i.Definition = definitions.FirstOrDefault( x => x.Id == i.DefinitionId );
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Definition Result;
|
||||||
|
public Ingredient[] Ingredients;
|
||||||
|
|
||||||
|
internal static Recipe FromString( string part, Definition[] definitions, Definition Result )
|
||||||
|
{
|
||||||
|
var r = new Recipe();
|
||||||
|
r.Result = Result;
|
||||||
|
var parts = part.Split( new[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
|
||||||
|
|
||||||
|
r.Ingredients = parts.Select( x => Ingredient.FromString( x, definitions ) ).ToArray();
|
||||||
|
|
||||||
|
foreach ( var i in r.Ingredients )
|
||||||
|
{
|
||||||
|
i.Definition.InRecipe( r );
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,6 +118,11 @@ internal void FetchItemDefinitions()
|
|||||||
return CreateDefinition( x );
|
return CreateDefinition( x );
|
||||||
|
|
||||||
} ).ToArray();
|
} ).ToArray();
|
||||||
|
|
||||||
|
foreach ( var def in Definitions )
|
||||||
|
{
|
||||||
|
def.Link( Definitions );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user