diff --git a/src/block/tile/Furnace.php b/src/block/tile/Furnace.php index ce67b83fc..d80809b75 100644 --- a/src/block/tile/Furnace.php +++ b/src/block/tile/Furnace.php @@ -155,7 +155,7 @@ class Furnace extends Spawnable implements Container, Nameable{ $fuel = $this->inventory->getFuel(); $raw = $this->inventory->getSmelting(); $product = $this->inventory->getResult(); - $smelt = $this->pos->getWorldNonNull()->getServer()->getCraftingManager()->matchFurnaceRecipe($raw); + $smelt = $this->pos->getWorldNonNull()->getServer()->getCraftingManager()->getFurnaceRecipeManager()->match($raw); $canSmelt = ($smelt instanceof FurnaceRecipe and $raw->getCount() > 0 and (($smelt->getResult()->equals($product) and $product->getCount() < $product->getMaxStackSize()) or $product->isNull())); if($this->remainingFuelTime <= 0 and $canSmelt and $fuel->getFuelTime() > 0 and $fuel->getCount() > 0){ diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index ec2d6effb..701d23164 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -48,12 +48,20 @@ class CraftingManager{ protected $shapedRecipes = []; /** @var ShapelessRecipe[][] */ protected $shapelessRecipes = []; - /** @var FurnaceRecipe[] */ - protected $furnaceRecipes = []; + + /** @var FurnaceRecipeManager */ + protected $furnaceRecipeManager; /** @var CompressBatchPromise[] */ private $craftingDataCaches = []; + public function __construct(){ + $this->furnaceRecipeManager = new FurnaceRecipeManager(); + $this->furnaceRecipeManager->getRecipeRegisteredCallbacks()->add(function(FurnaceRecipe $recipe) : void{ + $this->craftingDataCaches = []; + }); + } + /** * Rebuilds the cached CraftingDataPacket. */ @@ -105,7 +113,7 @@ class CraftingManager{ } } - foreach($this->furnaceRecipes as $recipe){ + foreach($this->furnaceRecipeManager->getAll() as $recipe){ $input = $converter->coreItemStackToNet($recipe->getInput()); $pk->entries[] = new ProtocolFurnaceRecipe( CraftingDataPacket::ENTRY_FURNACE_DATA, @@ -198,11 +206,8 @@ class CraftingManager{ return $this->shapedRecipes; } - /** - * @return FurnaceRecipe[] - */ - public function getFurnaceRecipes() : array{ - return $this->furnaceRecipes; + public function getFurnaceRecipeManager() : FurnaceRecipeManager{ + return $this->furnaceRecipeManager; } public function registerShapedRecipe(ShapedRecipe $recipe) : void{ @@ -217,12 +222,6 @@ class CraftingManager{ $this->craftingDataCaches = []; } - public function registerFurnaceRecipe(FurnaceRecipe $recipe) : void{ - $input = $recipe->getInput(); - $this->furnaceRecipes[$input->getId() . ":" . ($input->hasAnyDamageValue() ? "?" : $input->getMeta())] = $recipe; - $this->craftingDataCaches = []; - } - /** * @param Item[] $outputs */ @@ -273,8 +272,4 @@ class CraftingManager{ } } } - - public function matchFurnaceRecipe(Item $input) : ?FurnaceRecipe{ - return $this->furnaceRecipes[$input->getId() . ":" . $input->getMeta()] ?? $this->furnaceRecipes[$input->getId() . ":?"] ?? null; - } } diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 84ac260a3..c82d437b2 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -60,7 +60,7 @@ final class CraftingManagerFromDataHelper{ if($recipe["block"] !== "furnace"){ //TODO: filter others out for now to avoid breaking economics break; } - $result->registerFurnaceRecipe(new FurnaceRecipe( + $result->getFurnaceRecipeManager()->register(new FurnaceRecipe( Item::jsonDeserialize($recipe["output"]), Item::jsonDeserialize($recipe["input"])) ); diff --git a/src/crafting/FurnaceRecipeManager.php b/src/crafting/FurnaceRecipeManager.php new file mode 100644 index 000000000..18b520476 --- /dev/null +++ b/src/crafting/FurnaceRecipeManager.php @@ -0,0 +1,68 @@ + + */ + private $recipeRegisteredCallbacks; + + public function __construct(){ + $this->recipeRegisteredCallbacks = new Set(); + } + + /** + * @phpstan-return Set<\Closure(FurnaceRecipe) : void> + */ + public function getRecipeRegisteredCallbacks() : Set{ + return $this->recipeRegisteredCallbacks; + } + + /** + * @return FurnaceRecipe[] + */ + public function getAll() : array{ + return $this->furnaceRecipes; + } + + public function register(FurnaceRecipe $recipe) : void{ + $input = $recipe->getInput(); + $this->furnaceRecipes[$input->getId() . ":" . ($input->hasAnyDamageValue() ? "?" : $input->getMeta())] = $recipe; + foreach($this->recipeRegisteredCallbacks as $callback){ + $callback($recipe); + } + } + + public function match(Item $input) : ?FurnaceRecipe{ + return $this->furnaceRecipes[$input->getId() . ":" . $input->getMeta()] ?? $this->furnaceRecipes[$input->getId() . ":?"] ?? null; + } +} \ No newline at end of file