aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2024-09-17 22:15:52 +0800
committershedaniel <daniel@shedaniel.me>2024-09-17 22:15:52 +0800
commit3251f01cacfaf6dcdfd35ee3eaa5e5bee9d372b7 (patch)
tree3b4876ab4de85a4a702300d9bbbb812d94f888e4
parentdcac5f4891046507047c5951c164fb1c1f08da74 (diff)
parent15a46dc3a91cf3f8fdb7a1ddf382ce05bfcf742e (diff)
downloadRoughlyEnoughItems-3251f01cacfaf6dcdfd35ee3eaa5e5bee9d372b7.tar.gz
RoughlyEnoughItems-3251f01cacfaf6dcdfd35ee3eaa5e5bee9d372b7.tar.bz2
RoughlyEnoughItems-3251f01cacfaf6dcdfd35ee3eaa5e5bee9d372b7.zip
Merge remote-tracking branch 'origin/15.x-1.20.5' into 16.x-1.21
# Conflicts: # runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java6
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java4
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java21
-rw-r--r--api/src/main/java/me/shedaniel/rei/impl/Internals.java6
-rw-r--r--api/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloadContext.java48
-rw-r--r--api/src/main/java/me/shedaniel/rei/impl/common/plugins/ReloadInterruptionContext.java63
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java34
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultSmithingDisplay.java71
-rw-r--r--fabric/build.gradle4
-rw-r--r--fabric/src/main/resources/roughlyenoughitems.accessWidener1
-rw-r--r--forge/src/main/resources/META-INF/accesstransformer.cfg2
-rw-r--r--neoforge/src/main/resources/META-INF/accesstransformer.cfg1
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java36
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java47
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigGroups.java3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigOptions.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/DisplayRegistryInfoScreen.java174
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java37
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/SubCategoryListEntry.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ScreenWithMenu.java89
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java7
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayCache.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayCacheImpl.java16
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java78
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/util/OriginalRetainingCyclingList.java42
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java8
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java187
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/ReloadManagerImpl.java211
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java17
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/util/InstanceHelper.java125
-rwxr-xr-xruntime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json6
31 files changed, 1124 insertions, 234 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java
index 02527dafd..c968e685f 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java
@@ -25,10 +25,12 @@ package me.shedaniel.rei.api.client.gui.widgets;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.common.entry.EntryStack;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
+import java.util.function.Consumer;
public abstract class Slot extends WidgetWithBounds {
public static final byte UN_MARKED = 0;
@@ -133,6 +135,10 @@ public abstract class Slot extends WidgetWithBounds {
public abstract Slot entries(Collection<? extends EntryStack<?>> stacks);
+ @ApiStatus.Experimental
+ @ApiStatus.Internal
+ public abstract Slot withEntriesListener(Consumer<Slot> listener);
+
public abstract EntryStack<?> getCurrentEntry();
public abstract List<EntryStack<?>> getEntries();
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java b/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java
index 8d4b45d4d..ba6a4480d 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java
@@ -27,7 +27,7 @@ import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.api.common.display.SimpleDisplaySerializer;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryIngredients;
-import me.shedaniel.rei.impl.common.InternalRegistryAccess;
+import me.shedaniel.rei.impl.Internals;
import net.minecraft.core.RegistryAccess;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
@@ -59,7 +59,7 @@ public abstract class BasicDisplay implements Display {
@ApiStatus.Experimental
public static RegistryAccess registryAccess() {
- return InternalRegistryAccess.getInstance().get();
+ return Internals.getRegistryAccess();
}
/**
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java
index b1072cb21..0e9918c66 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java
@@ -24,9 +24,9 @@
package me.shedaniel.rei.api.common.plugins;
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
-import me.shedaniel.rei.api.common.registry.ReloadStage;
import me.shedaniel.rei.impl.ClientInternals;
import me.shedaniel.rei.impl.Internals;
+import me.shedaniel.rei.impl.common.plugins.PluginReloadContext;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import org.jetbrains.annotations.ApiStatus;
@@ -62,18 +62,25 @@ public interface PluginView<P extends REIPlugin<?>> {
}
@Override
- public void pre(ReloadStage stage) {
- PluginView.this.pre(stage);
+ public void pre(PluginReloadContext context) throws InterruptedException {
+ PluginView.this.pre(context);
}
@Override
- public void post(ReloadStage stage) {
- PluginView.this.post(stage);
+ public void reload(PluginReloadContext context) throws InterruptedException {
+ PluginView.this.reload(context);
+ }
+
+ @Override
+ public void post(PluginReloadContext context) throws InterruptedException {
+ PluginView.this.post(context);
}
};
}
- void pre(ReloadStage stage);
+ void pre(PluginReloadContext context) throws InterruptedException;
+
+ void reload(PluginReloadContext context) throws InterruptedException;
- void post(ReloadStage stage);
+ void post(PluginReloadContext context) throws InterruptedException;
}
diff --git a/api/src/main/java/me/shedaniel/rei/impl/Internals.java b/api/src/main/java/me/shedaniel/rei/impl/Internals.java
index 9666c4b5f..d083a3183 100644
--- a/api/src/main/java/me/shedaniel/rei/impl/Internals.java
+++ b/api/src/main/java/me/shedaniel/rei/impl/Internals.java
@@ -35,6 +35,7 @@ import me.shedaniel.rei.api.common.plugins.REIPlugin;
import me.shedaniel.rei.api.common.plugins.REIServerPlugin;
import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry;
import me.shedaniel.rei.impl.common.InternalLogger;
+import net.minecraft.core.RegistryAccess;
import net.minecraft.core.component.DataComponentMap;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.resources.ResourceLocation;
@@ -56,6 +57,7 @@ public final class Internals {
private static Function<String, CategoryIdentifier<?>> categoryIdentifier = (object) -> throwNotSetup();
private static Supplier<MenuInfoRegistry> stubMenuInfoRegistry = Internals::throwNotSetup;
private static Supplier<InternalLogger> logger = Internals::throwNotSetup;
+ private static Supplier<RegistryAccess> registryAccess = Internals::throwNotSetup;
private static <T> T throwNotSetup() {
throw new AssertionError("REI Internals have not been initialized!");
@@ -118,6 +120,10 @@ public final class Internals {
return logger.get();
}
+ public static RegistryAccess getRegistryAccess() {
+ return registryAccess.get();
+ }
+
public interface EntryStackProvider {
EntryStack<Unit> empty();
diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloadContext.java b/api/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloadContext.java
new file mode 100644
index 000000000..0481b38d0
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloadContext.java
@@ -0,0 +1,48 @@
+/*
+ * 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.impl.common.plugins;
+
+import me.shedaniel.rei.api.common.registry.ReloadStage;
+import org.jetbrains.annotations.ApiStatus;
+
+@ApiStatus.Internal
+public interface PluginReloadContext {
+ ReloadStage stage();
+
+ ReloadInterruptionContext interruptionContext();
+
+ static PluginReloadContext of(ReloadStage stage, ReloadInterruptionContext interruptionContext) {
+ return new PluginReloadContext() {
+ @Override
+ public ReloadStage stage() {
+ return stage;
+ }
+
+ @Override
+ public ReloadInterruptionContext interruptionContext() {
+ return interruptionContext;
+ }
+ };
+ }
+}
diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/plugins/ReloadInterruptionContext.java b/api/src/main/java/me/shedaniel/rei/impl/common/plugins/ReloadInterruptionContext.java
new file mode 100644
index 000000000..19201b20b
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/impl/common/plugins/ReloadInterruptionContext.java
@@ -0,0 +1,63 @@
+/*
+ * 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.impl.common.plugins;
+
+import me.shedaniel.rei.impl.common.InternalLogger;
+import org.jetbrains.annotations.ApiStatus;
+
+@FunctionalInterface
+@ApiStatus.Internal
+public interface ReloadInterruptionContext {
+ boolean isInterrupted();
+
+ default void checkInterrupted() throws InterruptedException {
+ if (isInterrupted()) {
+ InternalLogger.getInstance().debug("Plugin reload interrupted!");
+ throw new InterruptedException();
+ }
+ }
+
+ default ReloadInterruptionContext withJob(Runnable ifInterrupted) {
+ return new ReloadInterruptionContext() {
+ @Override
+ public boolean isInterrupted() {
+ return ReloadInterruptionContext.this.isInterrupted();
+ }
+
+ @Override
+ public void checkInterrupted() throws InterruptedException {
+ try {
+ ReloadInterruptionContext.this.checkInterrupted();
+ } catch (InterruptedException e) {
+ ifInterrupted.run();
+ throw e;
+ }
+ }
+ };
+ }
+
+ static ReloadInterruptionContext ofNever() {
+ return () -> false;
+ }
+}
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 982221600..a7546390c 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
@@ -27,15 +27,22 @@ import com.google.common.collect.Lists;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.Renderer;
+import me.shedaniel.rei.api.client.gui.widgets.Slot;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
+import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
+import me.shedaniel.rei.api.common.entry.EntryIngredient;
+import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.plugin.common.BuiltinPlugin;
import me.shedaniel.rei.plugin.common.displays.DefaultSmithingDisplay;
+import net.minecraft.core.RegistryAccess;
import net.minecraft.network.chat.Component;
import net.minecraft.world.level.block.Blocks;
+import org.apache.commons.lang3.mutable.MutableBoolean;
+import org.jetbrains.annotations.ApiStatus;
import java.util.List;
@@ -65,14 +72,23 @@ public class DefaultSmithingCategory implements DisplayCategory<DefaultSmithingD
widgets.add(Widgets.createArrow(new Point(startPoint.x + 27 + offsetX, startPoint.y + 4)));
widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61 + offsetX, startPoint.y + 5)));
if (!legacy) {
- widgets.add(Widgets.createSlot(new Point(startPoint.x + 4 - 18 * 2 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(0)).markInput());
- widgets.add(Widgets.createSlot(new Point(startPoint.x + 4 - 18 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(1)).markInput());
- widgets.add(Widgets.createSlot(new Point(startPoint.x + 4 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(2)).markInput());
+ Slot templateSlot, baseSlot, additionSlot, resultSlot;
+ MutableBoolean dirty = new MutableBoolean(true);
+ widgets.add(templateSlot = Widgets.createSlot(new Point(startPoint.x + 4 - 18 * 2 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(0)).withEntriesListener(slot -> dirty.setTrue()).markInput());
+ widgets.add(baseSlot = Widgets.createSlot(new Point(startPoint.x + 4 - 18 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(1)).withEntriesListener(slot -> dirty.setTrue()).markInput());
+ widgets.add(additionSlot = Widgets.createSlot(new Point(startPoint.x + 4 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(2)).withEntriesListener(slot -> dirty.setTrue()).markInput());
+ widgets.add(resultSlot = Widgets.createSlot(new Point(startPoint.x + 61 + offsetX, startPoint.y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
+ widgets.add(Widgets.createDrawableWidget((graphics, mouseX, mouseY, delta) -> {
+ if (dirty.booleanValue()) {
+ resultSlot.clearEntries().entries(getOutput(display, BasicDisplay.registryAccess(), templateSlot.getCurrentEntry(), baseSlot.getCurrentEntry(), additionSlot.getCurrentEntry()));
+ dirty.setFalse();
+ }
+ }));
} else {
widgets.add(Widgets.createSlot(new Point(startPoint.x + 4 - 22 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(0)).markInput());
widgets.add(Widgets.createSlot(new Point(startPoint.x + 4 + offsetX, startPoint.y + 5)).entries(display.getInputEntries().get(1)).markInput());
+ widgets.add(Widgets.createSlot(new Point(startPoint.x + 61 + offsetX, startPoint.y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
}
- widgets.add(Widgets.createSlot(new Point(startPoint.x + 61 + offsetX, startPoint.y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
return widgets;
}
@@ -80,4 +96,14 @@ public class DefaultSmithingCategory implements DisplayCategory<DefaultSmithingD
public int getDisplayHeight() {
return 36;
}
+
+ @ApiStatus.Experimental
+ private static EntryIngredient getOutput(DefaultSmithingDisplay display, RegistryAccess registryAccess, EntryStack<?> template, EntryStack<?> base, EntryStack<?> addition) {
+ if (display.getType() == DefaultSmithingDisplay.SmithingRecipeType.TRIM) {
+ EntryIngredient output = DefaultSmithingDisplay.getTrimmingOutput(registryAccess, template, base, addition);
+ if (!output.isEmpty()) return output;
+ }
+
+ return display.getOutputEntries().get(0);
+ }
}
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 a4242768f..4734e7d7d 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
@@ -26,6 +26,8 @@ package me.shedaniel.rei.plugin.common.displays;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
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;
@@ -47,6 +49,9 @@ import java.util.List;
import java.util.Optional;
public class DefaultSmithingDisplay extends BasicDisplay {
+ @Nullable
+ private final SmithingRecipeType type;
+
@ApiStatus.Experimental
public static DefaultSmithingDisplay ofTransforming(RecipeHolder<SmithingTransformRecipe> recipe) {
return new DefaultSmithingDisplay(
@@ -73,23 +78,15 @@ public class DefaultSmithingDisplay extends BasicDisplay {
.orElse(null);
if (trimMaterial == null) continue;
- ArmorTrim armorTrim = new ArmorTrim(trimMaterial, trimPattern);
- EntryIngredient.Builder baseItems = EntryIngredient.builder(), outputItems = EntryIngredient.builder();
- for (ItemStack item : recipe.value().base.getItems()) {
- ArmorTrim trim = item.get(DataComponents.TRIM);
- if (trim == null || !trim.hasPatternAndMaterial(trimPattern, trimMaterial)) {
- ItemStack newItem = item.copyWithCount(1);
- newItem.set(DataComponents.TRIM, armorTrim);
- baseItems.add(EntryStacks.of(item.copy()));
- outputItems.add(EntryStacks.of(newItem));
- }
- }
+ EntryIngredient baseIngredient = EntryIngredients.ofIngredient(recipe.value().base);
+ EntryIngredient templateOutput = baseIngredient.isEmpty() ? EntryIngredient.empty()
+ : getTrimmingOutput(registryAccess, EntryStacks.of(templateItem), baseIngredient.get(0), EntryStacks.of(additionStack));
+
displays.add(new DefaultSmithingDisplay(List.of(
EntryIngredients.of(templateItem),
- baseItems.build(),
+ baseIngredient,
EntryIngredients.of(additionStack)
- ), List.of(outputItems.build()),
- Optional.ofNullable(recipe.id())));
+ ), List.of(templateOutput), SmithingRecipeType.TRIM, Optional.ofNullable(recipe.id())));
}
}
return displays;
@@ -104,7 +101,13 @@ public class DefaultSmithingDisplay extends BasicDisplay {
}
public DefaultSmithingDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, Optional<ResourceLocation> location) {
+ this(inputs, outputs, null, location);
+ }
+
+ @ApiStatus.Experimental
+ public DefaultSmithingDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs, @Nullable SmithingRecipeType type, Optional<ResourceLocation> location) {
super(inputs, outputs, location);
+ this.type = type;
}
@Override
@@ -112,7 +115,45 @@ public class DefaultSmithingDisplay extends BasicDisplay {
return BuiltinPlugin.SMITHING;
}
+ @ApiStatus.Experimental
+ @Nullable
+ public SmithingRecipeType getType() {
+ return type;
+ }
+
public static BasicDisplay.Serializer<DefaultSmithingDisplay> serializer() {
- return BasicDisplay.Serializer.ofSimple(DefaultSmithingDisplay::new);
+ return BasicDisplay.Serializer.of((input, output, id, tag) -> {
+ SmithingRecipeType type = tag.contains("Type") ? SmithingRecipeType.valueOf(tag.getString("Type")) : null;
+ return new DefaultSmithingDisplay(input, output, type, id);
+ }, (display, tag) -> {
+ if (display.type != null) tag.putString("Type", display.type.name());
+ });
+ }
+
+ @ApiStatus.Experimental
+ public enum SmithingRecipeType {
+ TRIM,
+ TRANSFORM
+ }
+
+ @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();
+ 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)
+ .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();
+ ItemStack newItem = baseItem.copyWithCount(1);
+ newItem.set(DataComponents.TRIM, armorTrim);
+ return EntryIngredients.of(newItem);
}
}
diff --git a/fabric/build.gradle b/fabric/build.gradle
index 02676a865..c51d51579 100644
--- a/fabric/build.gradle
+++ b/fabric/build.gradle
@@ -35,8 +35,8 @@ dependencies {
}
//modRuntime("com.terraformersmc:modmenu:${modmenu_version}") { transitive false }
modApi("dev.architectury:architectury-fabric:${architectury_version}")
- modApi("me.shedaniel:error-notifier-fabric:1.0.9")
- include("me.shedaniel:error-notifier-fabric:1.0.9")
+ modApi("me.shedaniel:error-notifier-fabric:1.0.11")
+ include("me.shedaniel:error-notifier-fabric:1.0.11")
depProjects.forEach {
common(project(path: it, configuration: "namedElements")) { transitive false }
diff --git a/fabric/src/main/resources/roughlyenoughitems.accessWidener b/fabric/src/main/resources/roughlyenoughitems.accessWidener
index 461372b01..b83339e8f 100644
--- a/fabric/src/main/resources/roughlyenoughitems.accessWidener
+++ b/fabric/src/main/resources/roughlyenoughitems.accessWidener
@@ -39,4 +39,5 @@ accessible field net/minecraft/world/item/crafting/SmithingTrimRecipe base Lnet/
accessible field net/minecraft/world/item/crafting/SmithingTrimRecipe addition Lnet/minecraft/world/item/crafting/Ingredient;
accessible field net/minecraft/world/item/CreativeModeTab displayItemsGenerator Lnet/minecraft/world/item/CreativeModeTab$DisplayItemsGenerator;
accessible class net/minecraft/world/item/CreativeModeTab$ItemDisplayBuilder
+accessible field net/minecraft/client/multiplayer/ClientLevel connection Lnet/minecraft/client/multiplayer/ClientPacketListener;
accessible field net/minecraft/client/multiplayer/MultiPlayerGameMode connection Lnet/minecraft/client/multiplayer/ClientPacketListener; \ No newline at end of file
diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg
index 082c7dea2..6eb5af3b2 100644
--- a/forge/src/main/resources/META-INF/accesstransformer.cfg
+++ b/forge/src/main/resources/META-INF/accesstransformer.cfg
@@ -48,3 +48,5 @@ public-f net.minecraft.client.gui.font.CodepointMap f_283938_ # blockMap
public-f net.minecraft.client.gui.font.CodepointMap f_283773_ # blockConstructor
public net.minecraft.world.item.CreativeModeTab f_256824_ # displayItemsGenerator
public net.minecraft.world.item.CreativeModeTab$ItemDisplayBuilder
+public net.minecraft.client.multiplayer.ClientLevel f_104561_ # connection
+public net.minecraft.client.multiplayer.MultiPlayerGameMode f_105190_ # connection \ No newline at end of file
diff --git a/neoforge/src/main/resources/META-INF/accesstransformer.cfg b/neoforge/src/main/resources/META-INF/accesstransformer.cfg
index 2d87bddf1..17e4ec408 100644
--- a/neoforge/src/main/resources/META-INF/accesstransformer.cfg
+++ b/neoforge/src/main/resources/META-INF/accesstransformer.cfg
@@ -48,4 +48,5 @@ public-f net.minecraft.client.gui.font.CodepointMap blockMap # blockMap
public-f net.minecraft.client.gui.font.CodepointMap blockConstructor # blockConstructor
public net.minecraft.world.item.CreativeModeTab displayItemsGenerator # displayItemsGenerator
public net.minecraft.world.item.CreativeModeTab$ItemDisplayBuilder
+public net.minecraft.client.multiplayer.ClientLevel connection # connection
public net.minecraft.client.multiplayer.MultiPlayerGameM