hasAnyDamageValue()){ throw new \InvalidArgumentException("Recipe outputs must not have wildcard meta values"); } if(!$factory->isRegistered($item->getId(), $item->getMeta())){ return true; } } return false; } public static function make(string $filePath) : CraftingManager{ $recipes = json_decode(Utils::assumeNotFalse(file_get_contents($filePath), "Missing required resource file"), true); if(!is_array($recipes)){ throw new AssumptionFailedError("recipes.json root should contain a map of recipe types"); } $result = new CraftingManager(); $itemDeserializerFunc = \Closure::fromCallable([Item::class, 'jsonDeserialize']); foreach($recipes["shapeless"] as $recipe){ $recipeType = match($recipe["block"]){ "crafting_table" => ShapelessRecipeType::CRAFTING(), "stonecutter" => ShapelessRecipeType::STONECUTTER(), //TODO: Cartography Table default => null }; if($recipeType === null){ continue; } $output = array_map($itemDeserializerFunc, $recipe["output"]); if(self::containsUnknownOutputs($output)){ continue; } $result->registerShapelessRecipe(new ShapelessRecipe( array_map($itemDeserializerFunc, $recipe["input"]), $output, $recipeType )); } foreach($recipes["shaped"] as $recipe){ if($recipe["block"] !== "crafting_table"){ //TODO: filter others out for now to avoid breaking economics continue; } $output = array_map($itemDeserializerFunc, $recipe["output"]); if(self::containsUnknownOutputs($output)){ continue; } $result->registerShapedRecipe(new ShapedRecipe( $recipe["shape"], array_map($itemDeserializerFunc, $recipe["input"]), $output )); } foreach($recipes["smelting"] as $recipe){ $furnaceType = match ($recipe["block"]){ "furnace" => FurnaceType::FURNACE(), "blast_furnace" => FurnaceType::BLAST_FURNACE(), "smoker" => FurnaceType::SMOKER(), //TODO: campfire default => null }; if($furnaceType === null){ continue; } $output = Item::jsonDeserialize($recipe["output"]); if(self::containsUnknownOutputs([$output])){ continue; } $result->getFurnaceRecipeManager($furnaceType)->register(new FurnaceRecipe( $output, Item::jsonDeserialize($recipe["input"])) ); } foreach($recipes["potion_type"] as $recipe){ $output = Item::jsonDeserialize($recipe["output"]); if(self::containsUnknownOutputs([$output])){ continue; } $result->registerPotionTypeRecipe(new PotionTypeRecipe( Item::jsonDeserialize($recipe["input"]), Item::jsonDeserialize($recipe["ingredient"]), $output )); } foreach($recipes["potion_container_change"] as $recipe){ if(!ItemFactory::getInstance()->isRegistered($recipe["output_item_id"])){ continue; } $result->registerPotionContainerChangeRecipe(new PotionContainerChangeRecipe( $recipe["input_item_id"], Item::jsonDeserialize($recipe["ingredient"]), $recipe["output_item_id"] )); } return $result; } }