aboutsummaryrefslogtreecommitdiff
path: root/default-plugin/src/main/java/me
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2024-09-17 21:52:18 +0800
committershedaniel <daniel@shedaniel.me>2024-09-17 21:52:18 +0800
commit581543cb56b8a85d32d7237e0d37fb5ad24da9b5 (patch)
treef3b8a2c81bef17fe6cb4672bbb1b77607e657b50 /default-plugin/src/main/java/me
parent048eccb27ce9907b1028b7acc4f0f98321864750 (diff)
parented0f9e051623b0a37b438a3df11c3e50a7d85ab5 (diff)
downloadRoughlyEnoughItems-581543cb56b8a85d32d7237e0d37fb5ad24da9b5.tar.gz
RoughlyEnoughItems-581543cb56b8a85d32d7237e0d37fb5ad24da9b5.tar.bz2
RoughlyEnoughItems-581543cb56b8a85d32d7237e0d37fb5ad24da9b5.zip
Merge remote-tracking branch 'origin/14.x-1.20.4' into 15.x-1.20.5
# Conflicts: # api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java # api/src/main/java/me/shedaniel/rei/impl/Internals.java # default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/DefaultSmithingDisplay.java # fabric/src/main/resources/roughlyenoughitems.accessWidener # runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java # runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java
Diffstat (limited to 'default-plugin/src/main/java/me')
-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
2 files changed, 86 insertions, 19 deletions
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);
}
}