using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Linq; using MoonSharp.Interpreter; namespace Meteor.Map.DataObjects { class RecipeResolver { Dictionary recipeList; Dictionary> matsToRecipes; private RecipeResolver(Dictionary recipeList, Dictionary> matsToRecipes) { this.recipeList = recipeList; this.matsToRecipes = matsToRecipes; } public static RecipeResolver Init() { var recipeList = new Dictionary(); var matToRecipes = new Dictionary>(); Database.GetRecipeGamedata(recipeList, matToRecipes); return new RecipeResolver(recipeList, matToRecipes); } public List GetRecipeFromMats(uint mat1 = 0, uint mat2 = 0, uint mat3 = 0, uint mat4 = 0, uint mat5 = 0, uint mat6 = 0, uint mat7 = 0, uint mat8 = 0) { uint[] mats = new uint[8]; mats[0] = mat1; mats[1] = mat2; mats[2] = mat3; mats[3] = mat4; mats[4] = mat5; mats[5] = mat6; mats[6] = mat7; mats[7] = mat8; byte[] result = new byte[8 * sizeof(int)]; Buffer.BlockCopy(mats, 0, result, 0, result.Length); string hash; using (MD5 md5 = MD5.Create()) { hash = BitConverter.ToString(md5.ComputeHash(result)); } if (matsToRecipes.ContainsKey(hash)) return matsToRecipes[hash]; else return null; } public Recipe GetRecipeByItemID(int objectiveItemID) { return recipeList.Where(recipe => recipe.Value.resultItemID == objectiveItemID).FirstOrDefault().Value; } public DynValue RecipesToItemIdTable(List recipeList) { DynValue[] itemIDs = new DynValue[8]; for (int i = 0; i < 8; i++) itemIDs[i] = recipeList != null && i < recipeList.Count ? DynValue.NewNumber(recipeList[i].resultItemID) : DynValue.NewNil(); return DynValue.NewTable(new Table(new Script(), itemIDs)); } public DynValue RecipeToMatIdTable(Recipe recipe) { DynValue[] itemIDs = new DynValue[8]; for (int i = 0; i < 8; i++) itemIDs[i] = DynValue.NewNumber(recipe.materials[i]); return DynValue.NewTable(new Table(new Script(), itemIDs)); } public Recipe GetRecipeByID(uint recipeID) { if (recipeID == 0) return null; if (recipeList.ContainsKey(recipeID)) return recipeList[recipeID]; else return null; } public int GetNumRecipes() { return recipeList.Count; } } }