*/ private $caches = []; public function getCache(CraftingManager $manager) : CraftingDataPacket{ $id = spl_object_id($manager); if(!isset($this->caches[$id])){ $manager->getDestructorCallbacks()->add(function() use ($id) : void{ unset($this->caches[$id]); }); $manager->getRecipeRegisteredCallbacks()->add(function() use ($id) : void{ unset($this->caches[$id]); }); $this->caches[$id] = $this->buildCraftingDataCache($manager); } return $this->caches[$id]; } /** * Rebuilds the cached CraftingDataPacket. */ private function buildCraftingDataCache(CraftingManager $manager) : CraftingDataPacket{ Timings::$craftingDataCacheRebuildTimer->startTiming(); $pk = new CraftingDataPacket(); $pk->cleanRecipes = true; $counter = 0; $nullUUID = UUID::fromData(str_repeat("\x00", 16)); $converter = TypeConverter::getInstance(); foreach($manager->getShapelessRecipes() as $list){ foreach($list as $recipe){ $pk->entries[] = new ProtocolShapelessRecipe( CraftingDataPacket::ENTRY_SHAPELESS, Binary::writeInt($counter++), array_map(function(Item $item) use ($converter) : RecipeIngredient{ return $converter->coreItemStackToRecipeIngredient($item); }, $recipe->getIngredientList()), array_map(function(Item $item) use ($converter) : ItemStack{ return $converter->coreItemStackToNet($item); }, $recipe->getResults()), $nullUUID, "crafting_table", 50, $counter ); } } foreach($manager->getShapedRecipes() as $list){ foreach($list as $recipe){ $inputs = []; for($row = 0, $height = $recipe->getHeight(); $row < $height; ++$row){ for($column = 0, $width = $recipe->getWidth(); $column < $width; ++$column){ $inputs[$row][$column] = $converter->coreItemStackToRecipeIngredient($recipe->getIngredient($column, $row)); } } $pk->entries[] = $r = new ProtocolShapedRecipe( CraftingDataPacket::ENTRY_SHAPED, Binary::writeInt($counter++), $inputs, array_map(function(Item $item) use ($converter) : ItemStack{ return $converter->coreItemStackToNet($item); }, $recipe->getResults()), $nullUUID, "crafting_table", 50, $counter ); } } foreach($manager->getFurnaceRecipeManager()->getAll() as $recipe){ $input = $converter->coreItemStackToNet($recipe->getInput()); $pk->entries[] = new ProtocolFurnaceRecipe( CraftingDataPacket::ENTRY_FURNACE_DATA, $input->getId(), $input->getMeta(), $converter->coreItemStackToNet($recipe->getResult()), "furnace" ); } return $pk; } }