aboutsummaryrefslogtreecommitdiff
path: root/default-plugin/src
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2024-11-10 20:07:35 +0800
committershedaniel <daniel@shedaniel.me>2024-11-10 20:08:06 +0800
commit7343b3cc169b52900c251eeab0e2baaeb82aaf45 (patch)
tree7379b1cda76d76bbe800870e10b726e2bdb8c4d5 /default-plugin/src
parent2f2be7e3b8e5d99cf7a76ce51c13ad01be8ca309 (diff)
downloadRoughlyEnoughItems-7343b3cc169b52900c251eeab0e2baaeb82aaf45.tar.gz
RoughlyEnoughItems-7343b3cc169b52900c251eeab0e2baaeb82aaf45.tar.bz2
RoughlyEnoughItems-7343b3cc169b52900c251eeab0e2baaeb82aaf45.zip
Fix #1751
Diffstat (limited to 'default-plugin/src')
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/ArmorDyeRecipeFiller.java9
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/MapExtendingRecipeFiller.java40
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/TippedArrowRecipeFiller.java38
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java1
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/anvil/DefaultAnvilDisplay.java3
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/MapExtendingCraftingDisplay.java128
6 files changed, 163 insertions, 56 deletions
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/ArmorDyeRecipeFiller.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/ArmorDyeRecipeFiller.java
index 6f7a668d3..95b62a5fe 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/ArmorDyeRecipeFiller.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/ArmorDyeRecipeFiller.java
@@ -23,12 +23,13 @@
package me.shedaniel.rei.plugin.client.categories.crafting.filler;
-import me.shedaniel.rei.api.client.registry.entry.EntryRegistry;
import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryIngredients;
+import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomShapelessDisplay;
+import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.DyeItem;
@@ -43,7 +44,11 @@ public class ArmorDyeRecipeFiller implements CraftingRecipeFiller<ArmorDyeRecipe
@Override
public Collection<Display> apply(RecipeHolder<ArmorDyeRecipe> recipe) {
List<Display> displays = new ArrayList<>();
- List<EntryStack<?>> toDye = EntryRegistry.getInstance().getEntryStacks().filter(entry -> entry.getValueType() == ItemStack.class && entry.<ItemStack>castValue().is(ItemTags.DYEABLE)).toList();
+ List<EntryStack<?>> toDye = BuiltInRegistries.ITEM.stream()
+ .filter(item -> item.builtInRegistryHolder().is(ItemTags.DYEABLE))
+ .map(EntryStacks::of)
+ .<EntryStack<?>>map(EntryStack::cast)
+ .toList();
DyeColor[] colors = DyeColor.values();
for (EntryStack<?> armor : toDye) {
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/MapExtendingRecipeFiller.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/MapExtendingRecipeFiller.java
index 2b8d3d0bb..d336cc2f3 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/MapExtendingRecipeFiller.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/MapExtendingRecipeFiller.java
@@ -24,14 +24,7 @@
package me.shedaniel.rei.plugin.client.categories.crafting.filler;
import me.shedaniel.rei.api.common.display.Display;
-import me.shedaniel.rei.api.common.entry.EntryIngredient;
-import me.shedaniel.rei.api.common.entry.EntryStack;
-import me.shedaniel.rei.api.common.util.EntryIngredients;
-import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomDisplay;
-import net.minecraft.ChatFormatting;
-import net.minecraft.client.resources.language.I18n;
-import net.minecraft.network.chat.Component;
-import net.minecraft.world.item.Items;
+import me.shedaniel.rei.plugin.common.displays.crafting.MapExtendingCraftingDisplay;
import net.minecraft.world.item.crafting.MapExtendingRecipe;
import net.minecraft.world.item.crafting.RecipeHolder;
@@ -46,19 +39,7 @@ public class MapExtendingRecipeFiller implements CraftingRecipeFiller<MapExtendi
List<Display> displays = new ArrayList<>();
for (int i = 0; i < 4; i++) {
- EntryIngredient[] inputs = new EntryIngredient[9];
- for (int j = 0; j < 9; j++) {
- if (j == 4) {
- inputs[j] = mapWith("X", i, 1);
- } else {
- inputs[j] = EntryIngredients.of(Items.PAPER);
- }
- }
-
- displays.add(new DefaultCustomDisplay(
- List.of(inputs),
- List.of(mapWith("X", i + 1, 1)),
- Optional.of(recipe.id().location())));
+ displays.add(new MapExtendingCraftingDisplay(i, Optional.of(recipe.id().location())));
}
return displays;
@@ -68,21 +49,4 @@ public class MapExtendingRecipeFiller implements CraftingRecipeFiller<MapExtendi
public Class<MapExtendingRecipe> getRecipeClass() {
return MapExtendingRecipe.class;
}
-
- public static EntryIngredient mapWith(String mapId, int scale, int count) {
- EntryIngredient stacks = EntryIngredients.of(Items.FILLED_MAP, count);
- String unknown = I18n.get("filled_map.unknown");
- for (EntryStack<?> stack : stacks) {
- stack.tooltipProcessor(($, tooltip) -> {
- tooltip.entries().removeIf(entry -> entry.isText() && entry.getAsText().getString().equals(unknown));
- return tooltip;
- });
- stack.tooltip(
- Component.translatable("filled_map.id", mapId).withStyle(ChatFormatting.GRAY),
- Component.translatable("filled_map.scale", (1 << scale)).withStyle(ChatFormatting.GRAY),
- Component.translatable("filled_map.level", scale, 4).withStyle(ChatFormatting.GRAY)
- );
- }
- return stacks;
- }
}
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/TippedArrowRecipeFiller.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/TippedArrowRecipeFiller.java
index 91b94b0e8..d8118ddaa 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/TippedArrowRecipeFiller.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/filler/TippedArrowRecipeFiller.java
@@ -23,13 +23,16 @@
package me.shedaniel.rei.plugin.client.categories.crafting.filler;
-import me.shedaniel.rei.api.client.registry.entry.EntryRegistry;
import me.shedaniel.rei.api.common.display.Display;
+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.api.common.util.EntryStacks;
import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomDisplay;
+import net.minecraft.core.Registry;
+import net.minecraft.core.RegistryAccess;
import net.minecraft.core.component.DataComponents;
+import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
@@ -46,21 +49,24 @@ public class TippedArrowRecipeFiller implements CraftingRecipeFiller<TippedArrow
Set<ResourceLocation> registeredPotions = new HashSet<>();
List<Display> displays = new ArrayList<>();
- EntryRegistry.getInstance().getEntryStacks().filter(entry -> entry.getValueType() == ItemStack.class && entry.<ItemStack>castValue().getItem() == Items.LINGERING_POTION).forEach(entry -> {
- ItemStack itemStack = (ItemStack) entry.getValue();
- PotionContents potion = itemStack.get(DataComponents.POTION_CONTENTS);
- if (potion.potion().isPresent() && potion.potion().get().unwrapKey().isPresent() && registeredPotions.add(potion.potion().get().unwrapKey().get().location())) {
- List<EntryIngredient> input = new ArrayList<>();
- for (int i = 0; i < 4; i++)
- input.add(arrowStack);
- input.add(EntryIngredients.of(itemStack));
- for (int i = 0; i < 4; i++)
- input.add(arrowStack);
- ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8);
- outputStack.set(DataComponents.POTION_CONTENTS, potion);
- displays.add(new DefaultCustomDisplay(input, List.of(EntryIngredients.of(outputStack)), Optional.of(recipe.id().location())));
- }
- });
+ RegistryAccess registryAccess = BasicDisplay.registryAccess();
+ BasicDisplay.registryAccess().lookup(Registries.POTION).stream()
+ .flatMap(Registry::listElements)
+ .map(reference -> PotionContents.createItemStack(Items.LINGERING_POTION, reference))
+ .forEach(itemStack -> {
+ PotionContents potion = itemStack.get(DataComponents.POTION_CONTENTS);
+ if (potion.potion().isPresent() && potion.potion().get().unwrapKey().isPresent() && registeredPotions.add(potion.potion().get().unwrapKey().get().location())) {
+ List<EntryIngredient> input = new ArrayList<>();
+ for (int i = 0; i < 4; i++)
+ input.add(arrowStack);
+ input.add(EntryIngredients.of(itemStack));
+ for (int i = 0; i < 4; i++)
+ input.add(arrowStack);
+ ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8);
+ outputStack.set(DataComponents.POTION_CONTENTS, potion);
+ displays.add(new DefaultCustomDisplay(input, List.of(EntryIngredients.of(outputStack)), Optional.of(recipe.id().location())));
+ }
+ });
return displays;
}
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java
index 5a4a84ce1..ceed9d1b4 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java
@@ -152,6 +152,7 @@ public class DefaultPlugin implements BuiltinPlugin, REICommonPlugin {
registry.register(id("default/crafting/custom"), DefaultCustomDisplay.SERIALIZER);
registry.register(id("default/crafting/custom_shaped"), DefaultCustomShapedDisplay.SERIALIZER);
registry.register(id("default/crafting/custom_shapeless"), DefaultCustomShapelessDisplay.SERIALIZER);
+ registry.register(id("extension/crafting/map_extending"), MapExtendingCraftingDisplay.SERIALIZER);
registry.register(id("default/smelting"), DefaultSmeltingDisplay.SERIALIZER);
registry.register(id("default/smoking"), DefaultSmokingDisplay.SERIALIZER);
registry.register(id("default/blasting"), DefaultBlastingDisplay.SERIALIZER);
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 581eb042c..d6c7e7459 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
@@ -32,6 +32,8 @@ 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.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.codec.ByteBufCodecs;
@@ -108,6 +110,7 @@ public class DefaultAnvilDisplay extends BasicDisplay {
@ApiStatus.Experimental
@ApiStatus.Internal
+ @Environment(EnvType.CLIENT)
public static Optional<Pair<ItemStack, Integer>> calculateOutput(ItemStack left, ItemStack right) {
try {
if (Minecraft.getInstance().player == null) return Optional.empty();
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/MapExtendingCraftingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/MapExtendingCraftingDisplay.java
new file mode 100644
index 000000000..b40c27f88
--- /dev/null
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/MapExtendingCraftingDisplay.java
@@ -0,0 +1,128 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020, 2021, 2022, 2023 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.plugin.common.displays.crafting;
+
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+import dev.architectury.platform.Platform;
+import dev.architectury.utils.Env;
+import me.shedaniel.rei.api.common.display.Display;
+import me.shedaniel.rei.api.common.display.DisplaySerializer;
+import me.shedaniel.rei.api.common.entry.EntryIngredient;
+import me.shedaniel.rei.api.common.entry.EntryStack;
+import me.shedaniel.rei.api.common.util.EntryIngredients;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.ChatFormatting;
+import net.minecraft.client.resources.language.I18n;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.codec.ByteBufCodecs;
+import net.minecraft.network.codec.StreamCodec;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.item.Items;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Optional;
+
+public class MapExtendingCraftingDisplay extends DefaultCraftingDisplay {
+ public static final DisplaySerializer<MapExtendingCraftingDisplay> SERIALIZER = DisplaySerializer.of(
+ RecordCodecBuilder.mapCodec(instance -> instance.group(
+ Codec.INT.fieldOf("i").forGetter(d -> d.i),
+ ResourceLocation.CODEC.optionalFieldOf("location").forGetter(MapExtendingCraftingDisplay::getDisplayLocation)
+ ).apply(instance, MapExtendingCraftingDisplay::new)),
+ StreamCodec.composite(
+ ByteBufCodecs.INT,
+ d -> d.i,
+ ByteBufCodecs.optional(ResourceLocation.STREAM_CODEC),
+ MapExtendingCraftingDisplay::getDisplayLocation,
+ MapExtendingCraftingDisplay::new
+ ));
+
+ private final int i;
+
+ public MapExtendingCraftingDisplay(int i, Optional<ResourceLocation> id) {
+ super(getInputs(i), List.of(mapWith("X", i + 1, 1)), id);
+ this.i = i;
+ }
+
+ private static List<EntryIngredient> getInputs(int i) {
+ EntryIngredient[] inputs = new EntryIngredient[9];
+ for (int j = 0; j < 9; j++) {
+ if (j == 4) {
+ inputs[j] = mapWith("X", i, 1);
+ } else {
+ inputs[j] = EntryIngredients.of(Items.PAPER);
+ }
+ }
+ return List.of(inputs);
+ }
+
+ @Override
+ @Nullable
+ public DisplaySerializer<? extends Display> getSerializer() {
+ return SERIALIZER;
+ }
+
+ public static EntryIngredient mapWith(String mapId, int scale, int count) {
+ if (Platform.getEnvironment() == Env.CLIENT) {
+ return mapWithClient(mapId, scale, count);
+ } else {
+ return EntryIngredients.of(Items.FILLED_MAP, count);
+ }
+ }
+
+ @Environment(EnvType.CLIENT)
+ public static EntryIngredient mapWithClient(String mapId, int scale, int count) {
+ EntryIngredient stacks = EntryIngredients.of(Items.FILLED_MAP, count);
+ String unknown = I18n.get("filled_map.unknown");
+ for (EntryStack<?> stack : stacks) {
+ stack.tooltipProcessor(($, tooltip) -> {
+ tooltip.entries().removeIf(entry -> entry.isText() && entry.getAsText().getString().equals(unknown));
+ return tooltip;
+ });
+ stack.tooltip(
+ Component.translatable("filled_map.id", mapId).withStyle(ChatFormatting.GRAY),
+ Component.translatable("filled_map.scale", (1 << scale)).withStyle(ChatFormatting.GRAY),
+ Component.translatable("filled_map.level", scale, 4).withStyle(ChatFormatting.GRAY)
+ );
+ }
+ return stacks;
+ }
+
+ @Override
+ public boolean isShapeless() {
+ return false;
+ }
+
+ @Override
+ public int getWidth() {
+ return 3;
+ }
+
+ @Override
+ public int getHeight() {
+ return 3;
+ }
+}