From 02b01e4e7506a2c25e253d57a9b9cb3bc85ca5d8 Mon Sep 17 00:00:00 2001 From: DrPerkyLegit Date: Fri, 24 Apr 2026 12:01:14 -0400 Subject: [PATCH] sync furnace recipes --- Minecraft.World/FurnaceRecipes.cpp | 62 ++++++++++++++++++------------ Minecraft.World/Recipes.cpp | 34 +++++++++++++--- 2 files changed, 67 insertions(+), 29 deletions(-) diff --git a/Minecraft.World/FurnaceRecipes.cpp b/Minecraft.World/FurnaceRecipes.cpp index f0a4c770e..0c08cb448 100644 --- a/Minecraft.World/FurnaceRecipes.cpp +++ b/Minecraft.World/FurnaceRecipes.cpp @@ -17,30 +17,7 @@ FurnaceRecipes *FurnaceRecipes::getInstance() FurnaceRecipes::FurnaceRecipes() { - addFurnaceRecipy(Tile::ironOre_Id, new ItemInstance(Item::ironIngot), .7f); - addFurnaceRecipy(Tile::goldOre_Id, new ItemInstance(Item::goldIngot), 1); - addFurnaceRecipy(Tile::diamondOre_Id, new ItemInstance(Item::diamond), 1); - addFurnaceRecipy(Tile::sand_Id, new ItemInstance(Tile::glass), .1f); - addFurnaceRecipy(Item::porkChop_raw_Id, new ItemInstance(Item::porkChop_cooked), .35f); - addFurnaceRecipy(Item::beef_raw_Id, new ItemInstance(Item::beef_cooked), .35f); - addFurnaceRecipy(Item::chicken_raw_Id, new ItemInstance(Item::chicken_cooked), .35f); - addFurnaceRecipy(Item::fish_raw_Id, new ItemInstance(Item::fish_cooked), .35f); - addFurnaceRecipy(Tile::cobblestone_Id, new ItemInstance(Tile::stone), .1f); - addFurnaceRecipy(Item::clay_Id, new ItemInstance(Item::brick), .3f); - addFurnaceRecipy(Tile::clay_Id, new ItemInstance(Tile::clayHardened), .35f); - addFurnaceRecipy(Tile::cactus_Id, new ItemInstance(Item::dye_powder, 1, DyePowderItem::GREEN), .2f); - addFurnaceRecipy(Tile::treeTrunk_Id, new ItemInstance(Item::coal, 1, CoalItem::CHAR_COAL), .15f); - addFurnaceRecipy(Tile::emeraldOre_Id, new ItemInstance(Item::emerald), 1); - addFurnaceRecipy(Item::potato_Id, new ItemInstance(Item::potatoBaked), .35f); - addFurnaceRecipy(Tile::netherRack_Id, new ItemInstance(Item::netherbrick), .1f); - - // special silk touch related recipes: - addFurnaceRecipy(Tile::coalOre_Id, new ItemInstance(Item::coal), .1f); - addFurnaceRecipy(Tile::redStoneOre_Id, new ItemInstance(Item::redStone), .7f); - addFurnaceRecipy(Tile::lapisOre_Id, new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), .2f); - addFurnaceRecipy(Tile::netherQuartz_Id, new ItemInstance(Item::netherQuartz), .2f); - - + this->rebuildRecipeArray(); } void FurnaceRecipes::addFurnaceRecipy(int itemId, ItemInstance *result, float value) @@ -79,4 +56,41 @@ float FurnaceRecipes::getRecipeValue(int itemId) return it->second; } return 0.0f; +} + +void FurnaceRecipes::rebuildRecipeArray() { + this->clearAllRecipies(); + + addFurnaceRecipy(Tile::ironOre_Id, new ItemInstance(Item::ironIngot), .7f); + addFurnaceRecipy(Tile::goldOre_Id, new ItemInstance(Item::goldIngot), 1); + addFurnaceRecipy(Tile::diamondOre_Id, new ItemInstance(Item::diamond), 1); + addFurnaceRecipy(Tile::sand_Id, new ItemInstance(Tile::glass), .1f); + addFurnaceRecipy(Item::porkChop_raw_Id, new ItemInstance(Item::porkChop_cooked), .35f); + addFurnaceRecipy(Item::beef_raw_Id, new ItemInstance(Item::beef_cooked), .35f); + addFurnaceRecipy(Item::chicken_raw_Id, new ItemInstance(Item::chicken_cooked), .35f); + addFurnaceRecipy(Item::fish_raw_Id, new ItemInstance(Item::fish_cooked), .35f); + addFurnaceRecipy(Tile::cobblestone_Id, new ItemInstance(Tile::stone), .1f); + addFurnaceRecipy(Item::clay_Id, new ItemInstance(Item::brick), .3f); + addFurnaceRecipy(Tile::clay_Id, new ItemInstance(Tile::clayHardened), .35f); + addFurnaceRecipy(Tile::cactus_Id, new ItemInstance(Item::dye_powder, 1, DyePowderItem::GREEN), .2f); + addFurnaceRecipy(Tile::treeTrunk_Id, new ItemInstance(Item::coal, 1, CoalItem::CHAR_COAL), .15f); + addFurnaceRecipy(Tile::emeraldOre_Id, new ItemInstance(Item::emerald), 1); + addFurnaceRecipy(Item::potato_Id, new ItemInstance(Item::potatoBaked), .35f); + addFurnaceRecipy(Tile::netherRack_Id, new ItemInstance(Item::netherbrick), .1f); + + // special silk touch related recipes: + addFurnaceRecipy(Tile::coalOre_Id, new ItemInstance(Item::coal), .1f); + addFurnaceRecipy(Tile::redStoneOre_Id, new ItemInstance(Item::redStone), .7f); + addFurnaceRecipy(Tile::lapisOre_Id, new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), .2f); + addFurnaceRecipy(Tile::netherQuartz_Id, new ItemInstance(Item::netherQuartz), .2f); +} + +void FurnaceRecipes::clearAllRecipies() +{ + for (auto &pair : recipies) { + delete pair.second; + } + + recipies.clear(); + recipeValue.clear(); } \ No newline at end of file diff --git a/Minecraft.World/Recipes.cpp b/Minecraft.World/Recipes.cpp index 6347cbbf2..afff7c7b8 100644 --- a/Minecraft.World/Recipes.cpp +++ b/Minecraft.World/Recipes.cpp @@ -1,3 +1,4 @@ +#include "FurnaceRecipes.h" #include "Recipes.h" #include "Recipes.h" #include "Recipes.h" @@ -1457,17 +1458,20 @@ inline ItemInstance* Recipes::parseItemInstance(DataInputStream* dis) { void Recipes::rebuildRecipeArray() { deleteAllRecipes(); loadAllRecipes(); + + FurnaceRecipes::getInstance()->rebuildRecipeArray(); } void Recipes::rebuildRecipeArray(std::shared_ptr packet) { deleteAllRecipes(); + FurnaceRecipes::getInstance()->clearAllRecipies(); ByteArrayInputStream bais(packet->data); DataInputStream input(&bais); _init(); - int recipeCount = input.readInt(); - for (int i = 0; i < recipeCount; i++) { + int iCraftingRecipeC = input.readInt(); + for (int i = 0; i < iCraftingRecipeC; i++) { unsigned char recipeHeader = input.readByte(); int recipeType = recipeHeader & 0x0F; @@ -1504,17 +1508,26 @@ void Recipes::rebuildRecipeArray(std::shared_ptr packet) { } } + int iFurnaceRecipesC = input.readInt(); + for (int i = 0; i < iFurnaceRecipesC; i++) { + int inputId = input.readInt(); + float recipeValue = input.readFloat(); + + ItemInstance* result = parseItemInstance(&input); + FurnaceRecipes::getInstance()->addFurnaceRecipy(inputId, result, recipeValue); + } + buildRecipeIngredientsArray(); //we manually add recipes so we need to build the ingredients array } byteArray Recipes::buildSyncedRecipeArray() { - int iRecipeC = static_cast(recipies->size()); ByteArrayOutputStream baos; DataOutputStream dos(&baos); - dos.writeInt(iRecipeC); - for (int i = 0; i < iRecipeC; i++) { + int iCraftingRecipeC = static_cast(recipies->size()); + dos.writeInt(iCraftingRecipeC); + for (int i = 0; i < iCraftingRecipeC; i++) { Recipy* recipe = (*recipies)[i]; bool isShapeless = dynamic_cast(recipe) != nullptr; dos.writeByte((recipe->getGroup() << 4) | ((isShapeless ? 0 : 1) & 0x0F)); @@ -1548,5 +1561,16 @@ byteArray Recipes::buildSyncedRecipeArray() { serializeItemInstance(&dos, const_cast(recipe->getResultItem())); } + unordered_map* furnaceRecipes = FurnaceRecipes::getInstance()->getRecipies(); + int iFurnaceRecipesC = static_cast(furnaceRecipes->size()); + dos.writeInt(iFurnaceRecipesC); + + for (auto& pair : *furnaceRecipes) { + dos.writeInt(pair.first); + dos.writeFloat(FurnaceRecipes::getInstance()->getRecipeValue(pair.first)); + + serializeItemInstance(&dos, pair.second); + } + return baos.toByteArray(); }