diff options
| author | shedaniel <daniel@shedaniel.me> | 2024-04-16 18:32:47 +0900 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2024-04-17 02:55:39 +0900 |
| commit | 6cc0322aacd36bbf325d3e08b7fa0b76d2eb0e5a (patch) | |
| tree | cb3e0febcfd5d2be673ea6ec1a37227397453b05 /default-plugin/src/main/java/me/shedaniel/rei/plugin/common | |
| parent | da47c76268e89abc8bb95f02964ca9ae3550d5a9 (diff) | |
| download | RoughlyEnoughItems-6cc0322aacd36bbf325d3e08b7fa0b76d2eb0e5a.tar.gz RoughlyEnoughItems-6cc0322aacd36bbf325d3e08b7fa0b76d2eb0e5a.tar.bz2 RoughlyEnoughItems-6cc0322aacd36bbf325d3e08b7fa0b76d2eb0e5a.zip | |
Add anvil recipes, Close #1381
Diffstat (limited to 'default-plugin/src/main/java/me/shedaniel/rei/plugin/common')
2 files changed, 60 insertions, 6 deletions
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/AnvilRecipe.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/AnvilRecipe.java index ba4f70458..694868145 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/AnvilRecipe.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/AnvilRecipe.java @@ -28,6 +28,7 @@ import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.OptionalInt; public class AnvilRecipe { @Nullable @@ -35,12 +36,18 @@ public class AnvilRecipe { private final List<ItemStack> leftInput; private final List<ItemStack> rightInputs; private final List<ItemStack> outputs; + private final OptionalInt cost; public AnvilRecipe(@Nullable ResourceLocation id, List<ItemStack> leftInput, List<ItemStack> rightInputs, List<ItemStack> outputs) { + this(id, leftInput, rightInputs, outputs, OptionalInt.empty()); + } + + public AnvilRecipe(@Nullable ResourceLocation id, List<ItemStack> leftInput, List<ItemStack> rightInputs, List<ItemStack> outputs, OptionalInt cost) { this.id = id; this.leftInput = leftInput; this.rightInputs = rightInputs; this.outputs = outputs; + this.cost = cost; } public ResourceLocation getId() { @@ -58,4 +65,8 @@ public class AnvilRecipe { public List<ItemStack> getOutputs() { return outputs; } + + public OptionalInt getCost() { + return cost; + } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/DefaultAnvilDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/DefaultAnvilDisplay.java index 0c2b5e655..befc8d143 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/DefaultAnvilDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/DefaultAnvilDisplay.java @@ -28,14 +28,20 @@ import me.shedaniel.rei.api.common.display.basic.BasicDisplay; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.plugin.common.BuiltinPlugin; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.item.ItemStack; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.ApiStatus; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; public class DefaultAnvilDisplay extends BasicDisplay { + private final OptionalInt cost; + public DefaultAnvilDisplay(AnvilRecipe recipe) { this( Arrays.asList( @@ -43,12 +49,22 @@ public class DefaultAnvilDisplay extends BasicDisplay { EntryIngredients.ofItemStacks(recipe.getRightInputs()) ), Collections.singletonList(EntryIngredients.ofItemStacks(recipe.getOutputs())), - Optional.ofNullable(recipe.getId()) + Optional.ofNullable(recipe.getId()), + recipe.getCost() ); } public DefaultAnvilDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<ResourceLocation> location) { + this(inputs, outputs, location, OptionalInt.empty()); + } + + public DefaultAnvilDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<ResourceLocation> location, CompoundTag tag) { + this(inputs, outputs, location, tag.contains("Cost") ? OptionalInt.of(tag.getInt("Cost")) : OptionalInt.empty()); + } + + public DefaultAnvilDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<ResourceLocation> location, OptionalInt cost) { super(inputs, outputs, location); + this.cost = cost; } @Override @@ -56,7 +72,34 @@ public class DefaultAnvilDisplay extends BasicDisplay { return BuiltinPlugin.ANVIL; } + public OptionalInt getCost() { + return cost; + } + public static BasicDisplay.Serializer<DefaultAnvilDisplay> serializer() { - return BasicDisplay.Serializer.ofSimple(DefaultAnvilDisplay::new); + return BasicDisplay.Serializer.of(DefaultAnvilDisplay::new, (display, tag) -> { + if (display.getCost().isPresent()) { + tag.putInt("Cost", display.getCost().getAsInt()); + } + }); + } + + @ApiStatus.Experimental + @ApiStatus.Internal + public static Optional<Pair<ItemStack, Integer>> calculateOutput(ItemStack left, ItemStack right) { + try { + if (Minecraft.getInstance().player == null) return Optional.empty(); + AnvilMenu menu = new AnvilMenu(0, new Inventory(Minecraft.getInstance().player)); + menu.setItem(0, menu.incrementStateId(), left); + menu.setItem(1, menu.incrementStateId(), right); + ItemStack output = menu.getSlot(2).getItem().copy(); + if (!output.isEmpty()) { + return Optional.of(Pair.of(output, menu.getCost())); + } else { + return Optional.empty(); + } + } catch (Throwable ignored) { + return Optional.empty(); + } } } |
