From f346799920d43b5622458e31908aef3cd5254e99 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Sat, 22 Mar 2025 21:47:20 +0100 Subject: [PATCH] fill in CraftingManager for MaterialRepair --- src/block/utils/AnvilHelper.php | 2 +- .../AnvilCraftingManagerDataFiller.php | 67 +++++++++++++++++++ src/crafting/ArmorRecipeIngredient.php | 50 ++++++++++++++ .../CraftingManagerFromDataHelper.php | 18 ++--- src/crafting/MaterialRepairRecipe.php | 2 +- src/crafting/TieredToolRecipeIngredient.php | 49 ++++++++++++++ 6 files changed, 172 insertions(+), 16 deletions(-) create mode 100644 src/crafting/AnvilCraftingManagerDataFiller.php create mode 100644 src/crafting/ArmorRecipeIngredient.php create mode 100644 src/crafting/TieredToolRecipeIngredient.php diff --git a/src/block/utils/AnvilHelper.php b/src/block/utils/AnvilHelper.php index b35c824c9..957c9da3f 100644 --- a/src/block/utils/AnvilHelper.php +++ b/src/block/utils/AnvilHelper.php @@ -36,7 +36,7 @@ final class AnvilHelper{ * * Returns null if the operation can't do anything. */ - public static function calculateResult(Player $player, Item $base, Item $material, ?string $customName = null) : ?AnvilCraftResult { + public static function calculateResult(Player $player, Item $base, Item $material, ?string $customName = null) : ?AnvilCraftResult{ $recipe = Server::getInstance()->getCraftingManager()->matchAnvilRecipe($base, $material); if($recipe === null){ diff --git a/src/crafting/AnvilCraftingManagerDataFiller.php b/src/crafting/AnvilCraftingManagerDataFiller.php new file mode 100644 index 000000000..d226c7a7f --- /dev/null +++ b/src/crafting/AnvilCraftingManagerDataFiller.php @@ -0,0 +1,67 @@ +registerAnvilRecipe(new MaterialRepairRecipe( + new ArmorRecipeIngredient($armorMaterial), + new ExactRecipeIngredient($item) + )); + if($toolTier !== null){ + $manager->registerAnvilRecipe(new MaterialRepairRecipe( + new TieredToolRecipeIngredient($toolTier), + new ExactRecipeIngredient($item) + )); + } + } + + return $manager; + } +} diff --git a/src/crafting/ArmorRecipeIngredient.php b/src/crafting/ArmorRecipeIngredient.php new file mode 100644 index 000000000..6c8cb4453 --- /dev/null +++ b/src/crafting/ArmorRecipeIngredient.php @@ -0,0 +1,50 @@ +material; } + + public function accepts(Item $item) : bool{ + if($item->getCount() < 1){ + return false; + } + + return $item instanceof Armor && $item->getMaterial() === $this->material; + } + + public function __toString() : string{ + return "ArmorRecipeIngredient(ArmorMaterial@" . spl_object_id($this->material) . ")"; + } +} diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index b55fd92ef..52552936b 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -31,16 +31,13 @@ use pocketmine\crafting\json\RecipeIngredientData; use pocketmine\crafting\json\ShapedRecipeData; use pocketmine\crafting\json\ShapelessRecipeData; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; -use pocketmine\data\bedrock\item\ItemTypeNames; use pocketmine\data\bedrock\item\SavedItemData; use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\data\SavedDataLoadingException; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\item\Item; -use pocketmine\item\VanillaItems; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; @@ -188,6 +185,7 @@ final class CraftingManagerFromDataHelper{ /** * @param mixed[] $data + * * @return object[] * * @phpstan-template TRecipeData of object @@ -213,7 +211,7 @@ final class CraftingManagerFromDataHelper{ $result = new CraftingManager(); foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'shapeless_crafting.json'), ShapelessRecipeData::class) as $recipe){ - $recipeType = match($recipe->block){ + $recipeType = match ($recipe->block) { "crafting_table" => ShapelessRecipeType::CRAFTING, "stonecutter" => ShapelessRecipeType::STONECUTTER, "smithing_table" => ShapelessRecipeType::SMITHING, @@ -274,7 +272,7 @@ final class CraftingManagerFromDataHelper{ )); } foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'smelting.json'), FurnaceRecipeData::class) as $recipe){ - $furnaceType = match ($recipe->block){ + $furnaceType = match ($recipe->block) { "furnace" => FurnaceType::FURNACE, "blast_furnace" => FurnaceType::BLAST_FURNACE, "smoker" => FurnaceType::SMOKER, @@ -336,15 +334,7 @@ final class CraftingManagerFromDataHelper{ )); } - $result->registerAnvilRecipe(new MaterialRepairRecipe( - new MetaWildcardRecipeIngredient(ItemTypeNames::DIAMOND_PICKAXE), - new ExactRecipeIngredient(VanillaItems::DIAMOND()) - )); - - $result->registerAnvilRecipe(new ItemCombineRecipe( - new MetaWildcardRecipeIngredient(ItemTypeNames::DIAMOND_PICKAXE), - new MetaWildcardRecipeIngredient(ItemTypeNames::DIAMOND_PICKAXE) - )); + $result = AnvilCraftingManagerDataFiller::fillData($result); //TODO: smithing diff --git a/src/crafting/MaterialRepairRecipe.php b/src/crafting/MaterialRepairRecipe.php index 35397fca4..77d45c9ad 100644 --- a/src/crafting/MaterialRepairRecipe.php +++ b/src/crafting/MaterialRepairRecipe.php @@ -59,7 +59,7 @@ class MaterialRepairRecipe implements AnvilRecipe{ return new AnvilCraftResult( $numberRepair, (clone $input)->setDamage(max(0, $damage)), - $material->pop($numberRepair) + (clone $material)->pop($numberRepair) ); } } diff --git a/src/crafting/TieredToolRecipeIngredient.php b/src/crafting/TieredToolRecipeIngredient.php new file mode 100644 index 000000000..0b187b106 --- /dev/null +++ b/src/crafting/TieredToolRecipeIngredient.php @@ -0,0 +1,49 @@ +tier; } + + public function accepts(Item $item) : bool{ + if($item->getCount() < 1){ + return false; + } + + return $item instanceof TieredTool && $item->getTier() === $this->tier; + } + + public function __toString() : string{ + return "TieredToolRecipeIngredient(" . $this->tier->name . ")"; + } +}