public override void DoSmelt(IWorldAccessor world, ISlotProvider cookingSlotsProvider, ItemSlot inputSlot, ItemSlot outputSlot) { ItemStack[] stacks = GetCookingStacks(cookingSlotsProvider); CookingRecipe recipe = GetMatchingCookingRecipe(world, stacks); Block block = world.GetBlock(CodeWithVariant("type", "cooked")); ItemStack outputStack = new ItemStack(block); if (recipe != null) { int quantityServings = recipe.GetQuantityServings(stacks); for (int i = 0; i < stacks.Length; i++) { CookingRecipeIngredient ingred = recipe.GetIngrendientFor(stacks[i]); ItemStack cookedStack = ingred.GetMatchingStack(stacks[i])?.CookedStack?.ResolvedItemstack.Clone(); if (cookedStack != null) { stacks[i] = cookedStack; } } // Carry over and set perishable properties TransitionableProperties cookedPerishProps = recipe.PerishableProps.Clone(); cookedPerishProps.TransitionedStack.Resolve(world, "cooking container perished stack"); CarryOverFreshness(api, cookingSlotsProvider.Slots, stacks, cookedPerishProps); for (int i = 0; i < stacks.Length; i++) { stacks[i].StackSize /= quantityServings; // whats this good for? Probably doesn't do anything meaningful } // Disabled. Let's sacrifice mergability for letting players select how meals should look and be named like //stacks = stacks.OrderBy(stack => stack.Collectible.Code.ToShortString()).ToArray(); // Required so that different arrangments of ingredients still create mergable meal bowls ((BlockCookedContainer)block).SetContents(recipe.Code, quantityServings, outputStack, stacks); outputStack.Collectible.SetTemperature(world, outputStack, GetIngredientsTemperature(world, stacks)); outputSlot.Itemstack = outputStack; inputSlot.Itemstack = null; for (int i = 0; i < cookingSlotsProvider.Slots.Length; i++) { cookingSlotsProvider.Slots[i].Itemstack = null; } return; } }
public MeshData GenFoodMixMesh(ItemStack[] contentStacks, CookingRecipe recipe, Vec3f foodTranslate) { MeshData mergedmesh = null; MealTextureSource texSource = new MealTextureSource(capi, textureSourceBlock); Shape shape = capi.Assets.TryGet("shapes/" + recipe.Shape.Base.Path + ".json").ToObject <Shape>(); Dictionary <CookingRecipeIngredient, int> usedIngredQuantities = new Dictionary <CookingRecipeIngredient, int>(); for (int i = 0; i < contentStacks.Length; i++) { texSource.ForStack = contentStacks[i]; CookingRecipeIngredient ingred = recipe.GetIngrendientFor( contentStacks[i], usedIngredQuantities.Where(val => val.Key.MaxQuantity <= val.Value).Select(val => val.Key).ToArray() ); if (ingred == null) { ingred = recipe.GetIngrendientFor(contentStacks[i]); } else { int cnt = 0; usedIngredQuantities.TryGetValue(ingred, out cnt); cnt++; usedIngredQuantities[ingred] = cnt; } if (ingred == null) { continue; } MeshData meshpart; string[] selectiveElements = null; CookingRecipeStack recipestack = ingred.GetMatchingStack(contentStacks[i]); if (recipestack.ShapeElement != null) { selectiveElements = new string[] { recipestack.ShapeElement } } ; texSource.customTextureMapping = recipestack.TextureMapping; capi.Tesselator.TesselateShape( "mealpart", shape, out meshpart, texSource, new Vec3f(recipe.Shape.rotateX, recipe.Shape.rotateY, recipe.Shape.rotateZ), 0, 0, null, selectiveElements ); if (mergedmesh == null) { mergedmesh = meshpart; } else { mergedmesh.AddMeshData(meshpart); } } if (foodTranslate != null) { mergedmesh.Translate(foodTranslate); } return(mergedmesh); }
public MeshData GenFoodMixMesh(ItemStack[] contentStacks, CookingRecipe recipe, Vec3f foodTranslate) { MeshData mergedmesh = null; MealTextureSource texSource = new MealTextureSource(capi, mealtextureSourceBlock); var shapePath = recipe.Shape.Base.Clone().WithPathPrefixOnce("shapes/").WithPathAppendixOnce(".json"); bool rotten = ContentsRotten(contentStacks); if (rotten) { shapePath = new AssetLocation("shapes/block/food/meal/rot.json"); } Shape shape = capi.Assets.TryGet(shapePath).ToObject <Shape>(); Dictionary <CookingRecipeIngredient, int> usedIngredQuantities = new Dictionary <CookingRecipeIngredient, int>(); if (rotten) { capi.Tesselator.TesselateShape( "mealpart", shape, out mergedmesh, texSource, new Vec3f(recipe.Shape.rotateX, recipe.Shape.rotateY, recipe.Shape.rotateZ) ); } else { HashSet <string> drawnMeshes = new HashSet <string>(); for (int i = 0; i < contentStacks.Length; i++) { texSource.ForStack = contentStacks[i]; CookingRecipeIngredient ingred = recipe.GetIngrendientFor( contentStacks[i], usedIngredQuantities.Where(val => val.Key.MaxQuantity <= val.Value).Select(val => val.Key).ToArray() ); if (ingred == null) { ingred = recipe.GetIngrendientFor(contentStacks[i]); } else { int cnt = 0; usedIngredQuantities.TryGetValue(ingred, out cnt); cnt++; usedIngredQuantities[ingred] = cnt; } if (ingred == null) { continue; } MeshData meshpart; string[] selectiveElements = null; CookingRecipeStack recipestack = ingred.GetMatchingStack(contentStacks[i]); if (recipestack.ShapeElement != null) { selectiveElements = new string[] { recipestack.ShapeElement } } ; texSource.customTextureMapping = recipestack.TextureMapping; if (drawnMeshes.Contains(recipestack.ShapeElement + recipestack.TextureMapping)) { continue; } drawnMeshes.Add(recipestack.ShapeElement + recipestack.TextureMapping); capi.Tesselator.TesselateShape( "mealpart", shape, out meshpart, texSource, new Vec3f(recipe.Shape.rotateX, recipe.Shape.rotateY, recipe.Shape.rotateZ), 0, 0, 0, null, selectiveElements ); if (mergedmesh == null) { mergedmesh = meshpart; } else { mergedmesh.AddMeshData(meshpart); } } } if (foodTranslate != null && mergedmesh != null) { mergedmesh.Translate(foodTranslate); } return(mergedmesh); }