diff options
Diffstat (limited to 'default-plugin/src/main/java/me')
14 files changed, 114 insertions, 76 deletions
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java index 6c93af751..4ea379854 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @@ -448,7 +448,7 @@ public class DefaultClientPlugin implements REIClientPlugin, BuiltinClientPlugin ItemStack itemStack = stack.castValue(); if (!itemStack.isEnchantable()) return; for (Pair<EnchantmentInstance, ItemStack> pair : enchantmentBooks) { - if (!pair.getKey().enchantment.value().canEnchant(itemStack)) continue; + if (!pair.getKey().enchantment().value().canEnchant(itemStack)) continue; Optional<Pair<ItemStack, Integer>> output = DefaultAnvilDisplay.calculateOutput(itemStack, pair.getValue()); if (output.isEmpty()) continue; registry.add(new DefaultAnvilDisplay(List.of(EntryIngredients.of(itemStack), EntryIngredients.of(pair.getValue())), diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java index 7d1e9455c..9ef500b6f 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java @@ -24,7 +24,6 @@ package me.shedaniel.rei.plugin.client.categories; import com.google.common.collect.Lists; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexConsumer; import me.shedaniel.clothconfig2.ClothConfigInitializer; import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; @@ -99,7 +98,6 @@ public class DefaultInformationCategory implements DisplayCategory<DefaultInform return new Renderer() { @Override public void render(GuiGraphics graphics, Rectangle bounds, int mouseX, int mouseY, float delta) { - RenderSystem.setShaderTexture(0, REIRuntime.getInstance().getDefaultDisplayTexture()); graphics.pose().pushPose(); graphics.pose().translate(-1.2f, -1, 0); Matrix4f matrix = graphics.pose().last().pose(); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java index 003e9410b..2dc96a7b8 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java @@ -100,8 +100,8 @@ public class DefaultSmithingCategory implements DisplayCategory<SmithingDisplay> @ApiStatus.Experimental private static EntryIngredient getOutput(SmithingDisplay display, RegistryAccess registryAccess, EntryStack<?> template, EntryStack<?> base, EntryStack<?> addition) { - if (display.type() == SmithingDisplay.SmithingRecipeType.TRIM) { - EntryIngredient output = DefaultSmithingDisplay.getTrimmingOutput(registryAccess, template, base, addition); + if (display.type() == SmithingDisplay.SmithingRecipeType.TRIM && display instanceof SmithingDisplay.Trimming trimming) { + EntryIngredient output = DefaultSmithingDisplay.getTrimmingOutput(registryAccess, trimming.pattern(), base, addition); if (!output.isEmpty()) return output; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java index d58d4f501..e78e10cc3 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java @@ -193,7 +193,7 @@ public class GameModeFavoriteEntry extends FavoriteEntry { @Override public DataResult<GameModeFavoriteEntry> read(CompoundTag object) { - String stringValue = object.getString(KEY); + String stringValue = object.getStringOr(KEY, "NOT_SET"); GameType type = stringValue.equals("NOT_SET") ? null : GameType.valueOf(stringValue); return DataResult.success(new GameModeFavoriteEntry(type), Lifecycle.stable()); } @@ -275,14 +275,16 @@ public class GameModeFavoriteEntry extends FavoriteEntry { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { + Minecraft.getInstance().player.connection.sendCommand(StringUtils.removeStart(ConfigObject.getInstance().getGamemodeCommand().replaceAll("\\{gamemode}", gameMode.name().toLowerCase(Locale.ROOT)), "/")); + minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + closeMenu(); + return true; + } + + @Override + public boolean containsMouse(double mouseX, double mouseY) { boolean disabled = this.minecraft.gameMode.getPlayerMode() == gameMode; - if (!disabled && rendering && mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 12) { - Minecraft.getInstance().player.connection.sendCommand(StringUtils.removeStart(ConfigObject.getInstance().getGamemodeCommand().replaceAll("\\{gamemode}", gameMode.name().toLowerCase(Locale.ROOT)), "/")); - minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - closeMenu(); - return true; - } - return super.mouseClicked(mouseX, mouseY, button); + return rendering && mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 12 && !disabled; } } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java index e78cb4016..dec965a60 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java @@ -223,7 +223,7 @@ public class TimeFavoriteEntry extends FavoriteEntry { @Override public DataResult<TimeFavoriteEntry> read(CompoundTag object) { - String stringValue = object.getString(KEY); + String stringValue = object.getStringOr(KEY, "NOT_SET"); Time type = stringValue.equals("NOT_SET") ? null : Time.valueOf(stringValue); return DataResult.success(new TimeFavoriteEntry(type), Lifecycle.stable()); } @@ -300,13 +300,15 @@ public class TimeFavoriteEntry extends FavoriteEntry { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (rendering && mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 12) { - Minecraft.getInstance().player.connection.sendCommand(StringUtils.removeStart(ConfigObject.getInstance().getTimeCommand().replaceAll("\\{time}", time.getPart().toLowerCase(Locale.ROOT)), "/")); - minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - closeMenu(); - return true; - } - return super.mouseClicked(mouseX, mouseY, button); + Minecraft.getInstance().player.connection.sendCommand(StringUtils.removeStart(ConfigObject.getInstance().getTimeCommand().replaceAll("\\{time}", time.getPart().toLowerCase(Locale.ROOT)), "/")); + minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + closeMenu(); + return true; + } + + @Override + public boolean containsMouse(double mouseX, double mouseY) { + return rendering && mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 12; } } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java index 902b96a5c..fde840d21 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java @@ -197,7 +197,7 @@ public class WeatherFavoriteEntry extends FavoriteEntry { @Override public DataResult<WeatherFavoriteEntry> read(CompoundTag object) { - String stringValue = object.getString(KEY); + String stringValue = object.getStringOr(KEY, "NOT_SET"); Weather weather = stringValue.equals("NOT_SET") ? null : Weather.valueOf(stringValue); return DataResult.success(new WeatherFavoriteEntry(weather), Lifecycle.stable()); } @@ -309,13 +309,15 @@ public class WeatherFavoriteEntry extends FavoriteEntry { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (rendering && mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 12) { - Minecraft.getInstance().player.connection.sendCommand(StringUtils.removeStart(ConfigObject.getInstance().getWeatherCommand().replaceAll("\\{weather}", weather.name().toLowerCase(Locale.ROOT)), "/")); - minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - closeMenu(); - return true; - } - return super.mouseClicked(mouseX, mouseY, button); + Minecraft.getInstance().player.connection.sendCommand(StringUtils.removeStart(ConfigObject.getInstance().getWeatherCommand().replaceAll("\\{weather}", weather.name().toLowerCase(Locale.ROOT)), "/")); + minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + closeMenu(); + return true; + } + + @Override + public boolean containsMouse(double mouseX, double mouseY) { + return rendering && mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 12; } } } 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 ceed9d1b4..472b30cbe 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 @@ -163,6 +163,7 @@ public class DefaultPlugin implements BuiltinPlugin, REICommonPlugin { registry.register(id("default/composting"), DefaultCompostingDisplay.SERIALIZER); registry.register(id("default/fuel"), DefaultFuelDisplay.SERIALIZER); registry.register(id("default/smithing"), DefaultSmithingDisplay.SERIALIZER); + registry.register(id("default/smithing/trimming"), DefaultSmithingDisplay.Trimming.SERIALIZER); registry.register(id("default/anvil"), DefaultAnvilDisplay.SERIALIZER); registry.register(id("default/beacon_base"), DefaultBeaconBaseDisplay.SERIALIZER); registry.register(id("default/beacon_payment"), DefaultBeaconPaymentDisplay.SERIALIZER); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/SmithingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/SmithingDisplay.java index 919eb561b..ed00d4f60 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/SmithingDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/SmithingDisplay.java @@ -26,9 +26,11 @@ package me.shedaniel.rei.plugin.common; import com.mojang.serialization.Codec; import io.netty.buffer.ByteBuf; import me.shedaniel.rei.api.common.display.Display; +import net.minecraft.core.Holder; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ByIdMap; +import net.minecraft.world.item.equipment.trim.TrimPattern; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -38,6 +40,10 @@ public interface SmithingDisplay extends Display { @Nullable SmithingRecipeType type(); + interface Trimming { + Holder<TrimPattern> pattern(); + } + @ApiStatus.Experimental enum SmithingRecipeType { TRIM, diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCampfireDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCampfireDisplay.java index 67f0e69bb..057c8acfe 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCampfireDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCampfireDisplay.java @@ -72,7 +72,7 @@ public class DefaultCampfireDisplay extends BasicDisplay implements CampfireDisp } public DefaultCampfireDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<ResourceLocation> location, CompoundTag tag) { - this(inputs, outputs, location, tag.getDouble("cookTime")); + this(inputs, outputs, location, tag.getDouble("cookTime").orElseThrow()); } public DefaultCampfireDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<ResourceLocation> location, double cookTime) { diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCompostingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCompostingDisplay.java index 25b08fbe0..ffd2e0270 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCompostingDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultCompostingDisplay.java @@ -76,7 +76,7 @@ public class DefaultCompostingDisplay extends BasicDisplay { @ApiStatus.Internal public DefaultCompostingDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, CompoundTag tag) { - this(inputs, outputs, tag.getInt("page")); + this(inputs, outputs, tag.getInt("page").orElseThrow()); } public DefaultCompostingDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs) { diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultFuelDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultFuelDisplay.java index 873afd126..865d58493 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultFuelDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultFuelDisplay.java @@ -57,7 +57,7 @@ public class DefaultFuelDisplay extends BasicDisplay { private final int fuelTime; public DefaultFuelDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, CompoundTag tag) { - this(inputs, outputs, tag.getInt("fuelTime")); + this(inputs, outputs, tag.getInt("fuelTime").orElseThrow()); } public DefaultFuelDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, int fuelTime) { diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultSmithingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultSmithingDisplay.java index a682850ab..be9dcf28f 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultSmithingDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultSmithingDisplay.java @@ -32,29 +32,32 @@ import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryIngredients; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.plugin.common.BuiltinPlugin; import me.shedaniel.rei.plugin.common.SmithingDisplay; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistryAccess; import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.Registries; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ProvidesTrimMaterial; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.SmithingTransformRecipe; import net.minecraft.world.item.crafting.SmithingTrimRecipe; -import net.minecraft.world.item.equipment.trim.*; +import net.minecraft.world.item.equipment.trim.ArmorTrim; +import net.minecraft.world.item.equipment.trim.TrimMaterial; +import net.minecraft.world.item.equipment.trim.TrimMaterials; +import net.minecraft.world.item.equipment.trim.TrimPattern; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; @@ -78,17 +81,17 @@ public class DefaultSmithingDisplay extends BasicDisplay implements SmithingDisp DefaultSmithingDisplay::new )); - private final Optional<SmithingRecipeType> type; + protected final Optional<SmithingRecipeType> type; @ApiStatus.Experimental public static DefaultSmithingDisplay ofTransforming(RecipeHolder<SmithingTransformRecipe> recipe) { return new DefaultSmithingDisplay( List.of( recipe.value().templateIngredient().map(EntryIngredients::ofIngredient).orElse(EntryIngredient.empty()), - recipe.value().baseIngredient().map(EntryIngredients::ofIngredient).orElse(EntryIngredient.empty()), + EntryIngredients.ofIngredient(recipe.value().baseIngredient()), recipe.value().additionIngredient().map(EntryIngredients::ofIngredient).orElse(EntryIngredient.empty()) ), - List.of(EntryIngredients.of(recipe.value().result)), + List.of(EntryIngredients.ofSlotDisplay(recipe.value().result.display())), Optional.of(SmithingRecipeType.TRANSFORM), Optional.of(recipe.id().location()) ); @@ -97,26 +100,19 @@ public class DefaultSmithingDisplay extends BasicDisplay implements SmithingDisp public static List<DefaultSmithingDisplay> fromTrimming(RecipeHolder<SmithingTrimRecipe> recipe) { RegistryAccess registryAccess = BasicDisplay.registryAccess(); List<DefaultSmithingDisplay> displays = new ArrayList<>(); - for (Holder<Item> templateItem : (Iterable<Holder<Item>>) recipe.value().templateIngredient().map(Ingredient::items).orElse(Stream.of())::iterator) { - Holder.Reference<TrimPattern> trimPattern = getPatternFromTemplate(registryAccess, templateItem) + Holder<TrimPattern> trimPattern = recipe.value().pattern; + for (Holder<Item> additionStack : (Iterable<Holder<Item>>) recipe.value().additionIngredient().map(Ingredient::items).orElse(Stream.of())::iterator) { + Holder<TrimMaterial> trimMaterial = getMaterialFromIngredient(registryAccess, additionStack) .orElse(null); - if (trimPattern == null) continue; + if (trimMaterial == null) continue; - for (Holder<Item> additionStack : (Iterable<Holder<Item>>) recipe.value().additionIngredient().map(Ingredient::items).orElse(Stream.of())::iterator) { - Holder.Reference<TrimMaterial> trimMaterial = getMaterialFromIngredient(registryAccess, additionStack) - .orElse(null); - if (trimMaterial == null) continue; - - EntryIngredient baseIngredient = recipe.value().baseIngredient().map(EntryIngredients::ofIngredient).orElse(EntryIngredient.empty()); - EntryIngredient templateOutput = baseIngredient.isEmpty() ? EntryIngredient.empty() - : getTrimmingOutput(registryAccess, EntryStacks.ofItemHolder(templateItem), baseIngredient.get(0), EntryStacks.ofItemHolder(additionStack)); - - displays.add(new DefaultSmithingDisplay(List.of( - EntryIngredients.ofItemHolder(templateItem), - baseIngredient, - EntryIngredients.ofItemHolder(additionStack) - ), List.of(templateOutput), Optional.of(SmithingRecipeType.TRIM), Optional.of(recipe.id().location()))); - } + EntryIngredient baseIngredient = EntryIngredients.ofIngredient(recipe.value().baseIngredient()); + + displays.add(new DefaultSmithingDisplay.Trimming(List.of( + recipe.value().templateIngredient().map(EntryIngredients::ofIngredient).orElse(EntryIngredient.empty()), + baseIngredient, + EntryIngredients.ofItemHolder(additionStack) + ), List.of(baseIngredient), Optional.of(SmithingRecipeType.TRIM), Optional.of(recipe.id().location()), recipe.value().pattern)); } return displays; } @@ -149,36 +145,65 @@ public class DefaultSmithingDisplay extends BasicDisplay implements SmithingDisp @ApiStatus.Experimental @ApiStatus.Internal - public static EntryIngredient getTrimmingOutput(RegistryAccess registryAccess, EntryStack<?> template, EntryStack<?> base, EntryStack<?> addition) { - if (template.getType() != VanillaEntryTypes.ITEM || base.getType() != VanillaEntryTypes.ITEM || addition.getType() != VanillaEntryTypes.ITEM) return EntryIngredient.empty(); - ItemStack templateItem = template.castValue(); + public static EntryIngredient getTrimmingOutput(RegistryAccess registryAccess, Holder<TrimPattern> trimPattern, EntryStack<?> base, EntryStack<?> addition) { + if (base.getType() != VanillaEntryTypes.ITEM || addition.getType() != VanillaEntryTypes.ITEM) return EntryIngredient.empty(); ItemStack baseItem = base.castValue(); ItemStack additionItem = addition.castValue(); - Holder.Reference<TrimPattern> trimPattern = TrimPatterns.getFromTemplate(registryAccess, templateItem) - .orElse(null); if (trimPattern == null) return EntryIngredient.empty(); - Holder.Reference<TrimMaterial> trimMaterial = TrimMaterials.getFromIngredient(registryAccess, additionItem) + Holder<TrimMaterial> trimMaterial = TrimMaterials.getFromIngredient(registryAccess, additionItem) .orElse(null); if (trimMaterial == null) return EntryIngredient.empty(); ArmorTrim armorTrim = new ArmorTrim(trimMaterial, trimPattern); ArmorTrim trim = baseItem.get(DataComponents.TRIM); - if (trim != null && trim.hasPatternAndMaterial(trimPattern, trimMaterial)) return EntryIngredient.empty(); + if (Objects.equals(trim, armorTrim)) return EntryIngredient.empty(); ItemStack newItem = baseItem.copyWithCount(1); newItem.set(DataComponents.TRIM, armorTrim); return EntryIngredients.of(newItem); } - private static Optional<Holder.Reference<TrimPattern>> getPatternFromTemplate(HolderLookup.Provider provider, Holder<Item> item) { - return provider.lookupOrThrow(Registries.TRIM_PATTERN) - .listElements() - .filter(reference -> item == reference.value().templateItem()) - .findFirst(); + private static Optional<Holder<TrimMaterial>> getMaterialFromIngredient(HolderLookup.Provider provider, Holder<Item> item) { + ProvidesTrimMaterial providesTrimMaterial = new ItemStack(item).get(DataComponents.PROVIDES_TRIM_MATERIAL); + return providesTrimMaterial != null ? providesTrimMaterial.unwrap(provider) : Optional.empty(); } - private static Optional<Holder.Reference<TrimMaterial>> getMaterialFromIngredient(HolderLookup.Provider provider, Holder<Item> item) { - return provider.lookupOrThrow(Registries.TRIM_MATERIAL) - .listElements() - .filter(reference -> item == reference.value().ingredient()) - .findFirst(); + public static class Trimming extends DefaultSmithingDisplay implements SmithingDisplay.Trimming { + public static final DisplaySerializer<DefaultSmithingDisplay.Trimming> SERIALIZER = DisplaySerializer.of( + RecordCodecBuilder.mapCodec(instance -> instance.group( + EntryIngredient.codec().listOf().fieldOf("inputs").forGetter(DefaultSmithingDisplay.Trimming::getInputEntries), + EntryIngredient.codec().listOf().fieldOf("outputs").forGetter(DefaultSmithingDisplay.Trimming::getOutputEntries), + SmithingRecipeType.CODEC.optionalFieldOf("smithing_type").forGetter(d -> d.type), + ResourceLocation.CODEC.optionalFieldOf("location").forGetter(DefaultSmithingDisplay.Trimming::getDisplayLocation), + TrimPattern.CODEC.fieldOf("pattern").forGetter(DefaultSmithingDisplay.Trimming::pattern) + ).apply(instance, DefaultSmithingDisplay.Trimming::new)), + StreamCodec.composite( + EntryIngredient.streamCodec().apply(ByteBufCodecs.list()), + DefaultSmithingDisplay.Trimming::getInputEntries, + EntryIngredient.streamCodec().apply(ByteBufCodecs.list()), + DefaultSmithingDisplay.Trimming::getOutputEntries, + ByteBufCodecs.optional(SmithingRecipeType.STREAM_CODEC), + d -> d.type, + ByteBufCodecs.optional(ResourceLocation.STREAM_CODEC), + DefaultSmithingDisplay.Trimming::getDisplayLocation, + TrimPattern.STREAM_CODEC, + DefaultSmithingDisplay.Trimming::pattern, + DefaultSmithingDisplay.Trimming::new + )); + + private final Holder<TrimPattern> pattern; + + public Trimming(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<SmithingRecipeType> type, Optional<ResourceLocation> location, Holder<TrimPattern> pattern) { + super(inputs, outputs, type, location); + this.pattern = pattern; + } + + @Override + public Holder<TrimPattern> pattern() { + return pattern; + } + + @Override + public DisplaySerializer<? extends Display> getSerializer() { + return DefaultSmithingDisplay.Trimming.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 d6c7e7459..7f1d20ec5 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 @@ -34,11 +34,13 @@ 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.Util; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityEquipment; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AnvilMenu; import net.minecraft.world.item.ItemStack; @@ -86,7 +88,7 @@ public class DefaultAnvilDisplay extends BasicDisplay { } 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()); + this(inputs, outputs, location, tag.contains("Cost") ? Util.make(() -> tag.getInt("Cost").isPresent() ? OptionalInt.of(tag.getInt("Cost").get()) : OptionalInt.empty()) : OptionalInt.empty()); } public DefaultAnvilDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<ResourceLocation> location, OptionalInt cost) { @@ -114,7 +116,7 @@ public class DefaultAnvilDisplay extends BasicDisplay { 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)); + AnvilMenu menu = new AnvilMenu(0, new Inventory(Minecraft.getInstance().player, new EntityEquipment())); menu.setItem(0, menu.incrementStateId(), left); menu.setItem(1, menu.incrementStateId(), right); ItemStack output = menu.getSlot(2).getItem().copy(); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/cooking/DefaultCookingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/cooking/DefaultCookingDisplay.java index 4fd648765..0e9097138 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/cooking/DefaultCookingDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/cooking/DefaultCookingDisplay.java @@ -51,7 +51,7 @@ public abstract class DefaultCookingDisplay extends BasicDisplay implements Cook } public DefaultCookingDisplay(List<EntryIngredient> input, List<EntryIngredient> output, Optional<ResourceLocation> id, CompoundTag tag) { - this(input, output, id, tag.getFloat("xp"), tag.getDouble("cookTime")); + this(input, output, id, tag.getFloat("xp").orElseThrow(), tag.getDouble("cookTime").orElseThrow()); } public DefaultCookingDisplay(List<EntryIngredient> input, List<EntryIngredient> output, Optional<ResourceLocation> id, float xp, double cookTime) { |
