diff --git a/src/client/java/aztech/modern_industrialization/compat/viewer/abstraction/ViewerCategory.java b/src/client/java/aztech/modern_industrialization/compat/viewer/abstraction/ViewerCategory.java index 97072e497..7b7b85ff1 100644 --- a/src/client/java/aztech/modern_industrialization/compat/viewer/abstraction/ViewerCategory.java +++ b/src/client/java/aztech/modern_industrialization/compat/viewer/abstraction/ViewerCategory.java @@ -143,8 +143,6 @@ default void rectangle(Rectangle rectangle, int fillColor) { void drawable(Consumer widget); - void item(double x, double y, double w, double h, ItemLike item); - void tooltip(int x, int y, int w, int h, List tooltip); } diff --git a/src/client/java/aztech/modern_industrialization/compat/viewer/impl/emi/ViewerCategoryEmi.java b/src/client/java/aztech/modern_industrialization/compat/viewer/impl/emi/ViewerCategoryEmi.java index 3acb1afb7..b565bbed4 100644 --- a/src/client/java/aztech/modern_industrialization/compat/viewer/impl/emi/ViewerCategoryEmi.java +++ b/src/client/java/aztech/modern_industrialization/compat/viewer/impl/emi/ViewerCategoryEmi.java @@ -46,7 +46,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.ItemLike; import org.jetbrains.annotations.Nullable; class ViewerCategoryEmi extends EmiRecipeCategory { @@ -288,20 +287,6 @@ public void drawable(Consumer widget) { }); } - @Override - public void item(double x, double y, double w, double h, ItemLike item) { - var stack = EmiStack.of(item); - widgets.addDrawable(-4, -4, 0, 0, (guiGraphics, mouseX, mouseY, delta) -> { - guiGraphics.pose().pushPose(); - guiGraphics.pose().translate(x, y, 0); - guiGraphics.pose().scale((float) w / 16, (float) h / 16, 0); - - stack.render(guiGraphics, 0, 0, delta); - - guiGraphics.pose().popPose(); - }); - } - @Override public void tooltip(int x, int y, int w, int h, List tooltip) { var mapped = tooltip.stream().map(c -> ClientTooltipComponent.create(c.getVisualOrderText())).toList(); diff --git a/src/client/java/aztech/modern_industrialization/compat/viewer/impl/jei/ViewerCategoryJei.java b/src/client/java/aztech/modern_industrialization/compat/viewer/impl/jei/ViewerCategoryJei.java index 3681c354d..2df3382a9 100644 --- a/src/client/java/aztech/modern_industrialization/compat/viewer/impl/jei/ViewerCategoryJei.java +++ b/src/client/java/aztech/modern_industrialization/compat/viewer/impl/jei/ViewerCategoryJei.java @@ -50,7 +50,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.ItemLike; import net.neoforged.neoforge.fluids.FluidType; import org.jetbrains.annotations.Nullable; @@ -207,16 +206,6 @@ public void drawable(Consumer widget) { widget.accept(guiGraphics); } - @Override - public void item(double x, double y, double w, double h, ItemLike item) { - guiGraphics.pose().pushPose(); - var drawable = helpers.getGuiHelper().createDrawableItemLike(item); - guiGraphics.pose().translate(x, y, 0); - guiGraphics.pose().scale((float) w / 16, (float) h / 16, 0); - drawable.draw(guiGraphics); - guiGraphics.pose().popPose(); - } - @Override public void tooltip(int x, int y, int w, int h, List tooltip) { } @@ -255,10 +244,6 @@ public void texture(ResourceLocation loc, int x, int y, int u, int v, int width, public void drawable(Consumer widget) { } - @Override - public void item(double x, double y, double w, double h, ItemLike item) { - } - @Override public void tooltip(int x, int y, int w, int h, List tooltip) { if (x <= mouseX && y <= mouseY && mouseX <= x + w && mouseY <= y + h) { diff --git a/src/client/java/aztech/modern_industrialization/compat/viewer/impl/rei/ViewerCategoryRei.java b/src/client/java/aztech/modern_industrialization/compat/viewer/impl/rei/ViewerCategoryRei.java index 07ea91e88..03dfe47b7 100644 --- a/src/client/java/aztech/modern_industrialization/compat/viewer/impl/rei/ViewerCategoryRei.java +++ b/src/client/java/aztech/modern_industrialization/compat/viewer/impl/rei/ViewerCategoryRei.java @@ -52,7 +52,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.ItemLike; import org.jetbrains.annotations.Nullable; class ViewerCategoryRei implements DisplayCategory.ViewerDisplay> { @@ -297,15 +296,6 @@ public void drawable(Consumer widget) { })); } - @Override - public void item(double x, double y, double w, double h, ItemLike item) { - widgets.add(Widgets.createSlot(new Rectangle(bounds.x + x, bounds.y + y, w, h)) - .entry(EntryStacks.of(item)) - .disableTooltips() - .disableHighlight() - .disableBackground()); - } - @Override public void tooltip(int x, int y, int w, int h, List tooltip) { widgets.add(Widgets.createDrawableWidget((matrices, reiMouseX, reiMouseY, delta) -> { diff --git a/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java b/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java index d6a877947..d46155083 100644 --- a/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java +++ b/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java @@ -51,9 +51,9 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.ItemLike; public class MachineCategory extends ViewerCategory> { public static MachineCategory create(MachineCategoryParams params) { @@ -226,15 +226,36 @@ public void buildWidgets(RecipeHolder recipeHolder, WidgetList wi // Conditions boolean conditionsRequired = recipe.conditions.size() > 0; if (steelHatchRequired || upgradeEuRequired > 0 || conditionsRequired) { - ItemLike displayedItem; + List displayedItems = new ArrayList<>(); if (steelHatchRequired) { - displayedItem = BuiltInRegistries.ITEM.get(MI.id("steel_item_input_hatch")); - } else if (conditionsRequired) { - displayedItem = MIItem.WRENCH; - } else { - displayedItem = MIItem.BASIC_UPGRADE; + displayedItems.add(BuiltInRegistries.ITEM.get(MI.id("steel_item_input_hatch")).getDefaultInstance()); + } + if (upgradeEuRequired > 0) { + displayedItems.add(MIItem.BASIC_UPGRADE.stack()); + } + for (var condition : recipe.conditions) { + ItemStack displayedItem = condition.icon(); + if (!displayedItem.isEmpty()) { + displayedItems.add(displayedItem); + } + } + if (displayedItems.isEmpty()) { + displayedItems.add(MIItem.WRENCH.stack()); } - widgets.item(width / 2f - 3, 3.75, 10.8, 10.8, displayedItem); + + double x = width / 2f - 3; + double y = 3.75; + double wh = 10.8; + widgets.drawable(graphics -> { + int itemIndex = (int) ((System.currentTimeMillis() / 1500L) % displayedItems.size()); + ItemStack displayedItem = displayedItems.get(itemIndex).copyWithCount(1); + + graphics.pose().pushPose(); + graphics.pose().translate(x, y, 0); + graphics.pose().scale((float) wh / 16, (float) wh / 16, 1); + graphics.renderFakeItem(displayedItem, 0, 0); + graphics.pose().popPose(); + }); } // Tooltips List tooltips = new ArrayList<>(); diff --git a/src/main/java/aztech/modern_industrialization/compat/kubejs/recipe/CustomConditionEventJS.java b/src/main/java/aztech/modern_industrialization/compat/kubejs/recipe/CustomConditionEventJS.java index ef73a26ed..9cad1acb7 100644 --- a/src/main/java/aztech/modern_industrialization/compat/kubejs/recipe/CustomConditionEventJS.java +++ b/src/main/java/aztech/modern_industrialization/compat/kubejs/recipe/CustomConditionEventJS.java @@ -29,9 +29,14 @@ import dev.latvian.mods.kubejs.event.KubeEvent; import java.util.function.BiPredicate; import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; public class CustomConditionEventJS implements KubeEvent { + public void register(String id, BiPredicate predicate, ItemStack icon, Component... description) { + CustomProcessCondition.register(id, predicate, icon, description); + } + public void register(String id, BiPredicate predicate, Component... description) { - CustomProcessCondition.register(id, predicate, description); + register(id, predicate, ItemStack.EMPTY, description); } } diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/AdjacentBlockProcessCondition.java b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/AdjacentBlockProcessCondition.java index 5b5780bd1..5d4e8581b 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/AdjacentBlockProcessCondition.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/AdjacentBlockProcessCondition.java @@ -36,6 +36,7 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; public record AdjacentBlockProcessCondition(Block block, RelativePosition relativePosition) implements MachineProcessCondition { @@ -76,6 +77,11 @@ public void appendDescription(List list) { list.add(text.text(block.getName())); } + @Override + public ItemStack icon() { + return block.asItem().getDefaultInstance(); + } + @Override public MapCodec codec() { return CODEC; diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/BiomeProcessCondition.java b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/BiomeProcessCondition.java index b59af540b..e536b0442 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/BiomeProcessCondition.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/BiomeProcessCondition.java @@ -39,6 +39,8 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.biome.Biome; import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs; @@ -82,6 +84,11 @@ public void appendDescription(List list) { }); } + @Override + public ItemStack icon() { + return Items.OAK_SAPLING.getDefaultInstance(); + } + @Override public MapCodec codec() { return CODEC; diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/CustomProcessCondition.java b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/CustomProcessCondition.java index 579e9182c..7e35ec6f8 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/CustomProcessCondition.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/CustomProcessCondition.java @@ -27,18 +27,17 @@ import aztech.modern_industrialization.machines.recipe.MachineRecipe; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.function.BiPredicate; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStack; public class CustomProcessCondition implements MachineProcessCondition { static final Map definitions = new HashMap<>(); @@ -49,8 +48,10 @@ public static void onReload() { KubeJSProxy.instance.fireCustomConditionEvent(); } - public static void register(String id, BiPredicate predicate, Component... description) { + public static void register(String id, BiPredicate predicate, ItemStack icon, + Component... description) { Objects.requireNonNull(predicate); + Objects.requireNonNull(icon); if (definitions.containsKey(id)) { throw new IllegalArgumentException("Duplicate custom process condition definition: " + id); @@ -60,28 +61,20 @@ public static void register(String id, BiPredicate predicate, - List description) { - } - - private static MapCodec makeCodec(boolean syncToClient) { - return RecordCodecBuilder.mapCodec( - g -> g - .group( - Codec.STRING.fieldOf("custom_id").forGetter(c -> c.id), - ComponentSerialization.CODEC.listOf().optionalFieldOf("description") - .forGetter(c -> syncToClient ? Optional.of(c.description) : Optional.empty())) - .apply(g, (id, desc) -> desc.map(d -> new CustomProcessCondition(id, d)).orElseGet(() -> new CustomProcessCondition(id)))); + ItemStack icon, List description) { } static final MapCodec CODEC = Codec.STRING.fieldOf("custom_id").xmap(CustomProcessCondition::new, c -> c.id); static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, c -> c.id, + ItemStack.OPTIONAL_STREAM_CODEC, + c -> c.icon, ComponentSerialization.TRUSTED_STREAM_CODEC.apply(ByteBufCodecs.list()), c -> c.description, CustomProcessCondition::new); @@ -92,15 +85,18 @@ public CustomProcessCondition(String id) { throw new IllegalArgumentException("Unknown custom process condition definition: " + id); } this.id = id; + this.icon = definition.icon; this.description = definition.description; } - public CustomProcessCondition(String id, List description) { + public CustomProcessCondition(String id, ItemStack icon, List description) { this.id = id; + this.icon = icon; this.description = description; } private final String id; + private final ItemStack icon; private final List description; @Override @@ -113,6 +109,11 @@ public void appendDescription(List list) { list.addAll(description); } + @Override + public ItemStack icon() { + return icon; + } + @Override public MapCodec codec() { return CODEC; diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/DimensionProcessCondition.java b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/DimensionProcessCondition.java index 751547510..017fbd9b0 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/DimensionProcessCondition.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/DimensionProcessCondition.java @@ -23,6 +23,7 @@ */ package aztech.modern_industrialization.machines.recipe.condition; +import aztech.modern_industrialization.MIItem; import aztech.modern_industrialization.MIText; import aztech.modern_industrialization.machines.recipe.MachineRecipe; import com.mojang.serialization.MapCodec; @@ -32,6 +33,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; public record DimensionProcessCondition(ResourceKey dimension) implements MachineProcessCondition { @@ -56,6 +58,11 @@ public void appendDescription(List list) { list.add(MIText.RequiresDimension.text(dimComponent)); } + @Override + public ItemStack icon() { + return MIItem.SINGULARITY.asItem().getDefaultInstance(); + } + @Override public MapCodec codec() { return CODEC; diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/MachineProcessCondition.java b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/MachineProcessCondition.java index dedb41be0..32e7de1b3 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/condition/MachineProcessCondition.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/condition/MachineProcessCondition.java @@ -35,6 +35,7 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; public interface MachineProcessCondition { Codec CODEC = ResourceLocation.CODEC @@ -60,6 +61,10 @@ public interface MachineProcessCondition { void appendDescription(List list); + default ItemStack icon() { + return ItemStack.EMPTY; + } + MapCodec codec(); StreamCodec streamCodec();