Skip to content

Commit f6bc8f6

Browse files
SwedzTechnici4n
andauthored
Add support for recipe conditions to have icons (#918)
Co-authored-by: Bruno Ploumhans <[email protected]>
1 parent 9eaff49 commit f6bc8f6

File tree

11 files changed

+77
-67
lines changed

11 files changed

+77
-67
lines changed

src/client/java/aztech/modern_industrialization/compat/viewer/abstraction/ViewerCategory.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,6 @@ default void rectangle(Rectangle rectangle, int fillColor) {
143143

144144
void drawable(Consumer<GuiGraphics> widget);
145145

146-
void item(double x, double y, double w, double h, ItemLike item);
147-
148146
void tooltip(int x, int y, int w, int h, List<Component> tooltip);
149147
}
150148

src/client/java/aztech/modern_industrialization/compat/viewer/impl/emi/ViewerCategoryEmi.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import net.minecraft.resources.ResourceLocation;
4747
import net.minecraft.world.item.ItemStack;
4848
import net.minecraft.world.item.crafting.Ingredient;
49-
import net.minecraft.world.level.ItemLike;
5049
import org.jetbrains.annotations.Nullable;
5150

5251
class ViewerCategoryEmi<D> extends EmiRecipeCategory {
@@ -288,20 +287,6 @@ public void drawable(Consumer<GuiGraphics> widget) {
288287
});
289288
}
290289

291-
@Override
292-
public void item(double x, double y, double w, double h, ItemLike item) {
293-
var stack = EmiStack.of(item);
294-
widgets.addDrawable(-4, -4, 0, 0, (guiGraphics, mouseX, mouseY, delta) -> {
295-
guiGraphics.pose().pushPose();
296-
guiGraphics.pose().translate(x, y, 0);
297-
guiGraphics.pose().scale((float) w / 16, (float) h / 16, 0);
298-
299-
stack.render(guiGraphics, 0, 0, delta);
300-
301-
guiGraphics.pose().popPose();
302-
});
303-
}
304-
305290
@Override
306291
public void tooltip(int x, int y, int w, int h, List<Component> tooltip) {
307292
var mapped = tooltip.stream().map(c -> ClientTooltipComponent.create(c.getVisualOrderText())).toList();

src/client/java/aztech/modern_industrialization/compat/viewer/impl/jei/ViewerCategoryJei.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import net.minecraft.resources.ResourceLocation;
5151
import net.minecraft.world.item.ItemStack;
5252
import net.minecraft.world.item.crafting.Ingredient;
53-
import net.minecraft.world.level.ItemLike;
5453
import net.neoforged.neoforge.fluids.FluidType;
5554
import org.jetbrains.annotations.Nullable;
5655

@@ -207,16 +206,6 @@ public void drawable(Consumer<GuiGraphics> widget) {
207206
widget.accept(guiGraphics);
208207
}
209208

210-
@Override
211-
public void item(double x, double y, double w, double h, ItemLike item) {
212-
guiGraphics.pose().pushPose();
213-
var drawable = helpers.getGuiHelper().createDrawableItemLike(item);
214-
guiGraphics.pose().translate(x, y, 0);
215-
guiGraphics.pose().scale((float) w / 16, (float) h / 16, 0);
216-
drawable.draw(guiGraphics);
217-
guiGraphics.pose().popPose();
218-
}
219-
220209
@Override
221210
public void tooltip(int x, int y, int w, int h, List<Component> tooltip) {
222211
}
@@ -255,10 +244,6 @@ public void texture(ResourceLocation loc, int x, int y, int u, int v, int width,
255244
public void drawable(Consumer<GuiGraphics> widget) {
256245
}
257246

258-
@Override
259-
public void item(double x, double y, double w, double h, ItemLike item) {
260-
}
261-
262247
@Override
263248
public void tooltip(int x, int y, int w, int h, List<Component> tooltip) {
264249
if (x <= mouseX && y <= mouseY && mouseX <= x + w && mouseY <= y + h) {

src/client/java/aztech/modern_industrialization/compat/viewer/impl/rei/ViewerCategoryRei.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import net.minecraft.resources.ResourceLocation;
5353
import net.minecraft.world.item.ItemStack;
5454
import net.minecraft.world.item.crafting.Ingredient;
55-
import net.minecraft.world.level.ItemLike;
5655
import org.jetbrains.annotations.Nullable;
5756

5857
class ViewerCategoryRei<D> implements DisplayCategory<ViewerCategoryRei<D>.ViewerDisplay> {
@@ -297,15 +296,6 @@ public void drawable(Consumer<GuiGraphics> widget) {
297296
}));
298297
}
299298

300-
@Override
301-
public void item(double x, double y, double w, double h, ItemLike item) {
302-
widgets.add(Widgets.createSlot(new Rectangle(bounds.x + x, bounds.y + y, w, h))
303-
.entry(EntryStacks.of(item))
304-
.disableTooltips()
305-
.disableHighlight()
306-
.disableBackground());
307-
}
308-
309299
@Override
310300
public void tooltip(int x, int y, int w, int h, List<Component> tooltip) {
311301
widgets.add(Widgets.createDrawableWidget((matrices, reiMouseX, reiMouseY, delta) -> {

src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@
5151
import net.minecraft.network.chat.Component;
5252
import net.minecraft.network.chat.Style;
5353
import net.minecraft.resources.ResourceLocation;
54+
import net.minecraft.world.item.ItemStack;
5455
import net.minecraft.world.item.crafting.RecipeHolder;
5556
import net.minecraft.world.item.crafting.RecipeManager;
56-
import net.minecraft.world.level.ItemLike;
5757

5858
public class MachineCategory extends ViewerCategory<RecipeHolder<MachineRecipe>> {
5959
public static MachineCategory create(MachineCategoryParams params) {
@@ -226,15 +226,36 @@ public void buildWidgets(RecipeHolder<MachineRecipe> recipeHolder, WidgetList wi
226226
// Conditions
227227
boolean conditionsRequired = recipe.conditions.size() > 0;
228228
if (steelHatchRequired || upgradeEuRequired > 0 || conditionsRequired) {
229-
ItemLike displayedItem;
229+
List<ItemStack> displayedItems = new ArrayList<>();
230230
if (steelHatchRequired) {
231-
displayedItem = BuiltInRegistries.ITEM.get(MI.id("steel_item_input_hatch"));
232-
} else if (conditionsRequired) {
233-
displayedItem = MIItem.WRENCH;
234-
} else {
235-
displayedItem = MIItem.BASIC_UPGRADE;
231+
displayedItems.add(BuiltInRegistries.ITEM.get(MI.id("steel_item_input_hatch")).getDefaultInstance());
232+
}
233+
if (upgradeEuRequired > 0) {
234+
displayedItems.add(MIItem.BASIC_UPGRADE.stack());
235+
}
236+
for (var condition : recipe.conditions) {
237+
ItemStack displayedItem = condition.icon();
238+
if (!displayedItem.isEmpty()) {
239+
displayedItems.add(displayedItem);
240+
}
241+
}
242+
if (displayedItems.isEmpty()) {
243+
displayedItems.add(MIItem.WRENCH.stack());
236244
}
237-
widgets.item(width / 2f - 3, 3.75, 10.8, 10.8, displayedItem);
245+
246+
double x = width / 2f - 3;
247+
double y = 3.75;
248+
double wh = 10.8;
249+
widgets.drawable(graphics -> {
250+
int itemIndex = (int) ((System.currentTimeMillis() / 1500L) % displayedItems.size());
251+
ItemStack displayedItem = displayedItems.get(itemIndex).copyWithCount(1);
252+
253+
graphics.pose().pushPose();
254+
graphics.pose().translate(x, y, 0);
255+
graphics.pose().scale((float) wh / 16, (float) wh / 16, 1);
256+
graphics.renderFakeItem(displayedItem, 0, 0);
257+
graphics.pose().popPose();
258+
});
238259
}
239260
// Tooltips
240261
List<Component> tooltips = new ArrayList<>();

src/main/java/aztech/modern_industrialization/compat/kubejs/recipe/CustomConditionEventJS.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,14 @@
2929
import dev.latvian.mods.kubejs.event.KubeEvent;
3030
import java.util.function.BiPredicate;
3131
import net.minecraft.network.chat.Component;
32+
import net.minecraft.world.item.ItemStack;
3233

3334
public class CustomConditionEventJS implements KubeEvent {
35+
public void register(String id, BiPredicate<MachineProcessCondition.Context, MachineRecipe> predicate, ItemStack icon, Component... description) {
36+
CustomProcessCondition.register(id, predicate, icon, description);
37+
}
38+
3439
public void register(String id, BiPredicate<MachineProcessCondition.Context, MachineRecipe> predicate, Component... description) {
35-
CustomProcessCondition.register(id, predicate, description);
40+
register(id, predicate, ItemStack.EMPTY, description);
3641
}
3742
}

src/main/java/aztech/modern_industrialization/machines/recipe/condition/AdjacentBlockProcessCondition.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import net.minecraft.network.codec.ByteBufCodecs;
3737
import net.minecraft.network.codec.StreamCodec;
3838
import net.minecraft.util.StringRepresentable;
39+
import net.minecraft.world.item.ItemStack;
3940
import net.minecraft.world.level.block.Block;
4041

4142
public record AdjacentBlockProcessCondition(Block block, RelativePosition relativePosition) implements MachineProcessCondition {
@@ -76,6 +77,11 @@ public void appendDescription(List<Component> list) {
7677
list.add(text.text(block.getName()));
7778
}
7879

80+
@Override
81+
public ItemStack icon() {
82+
return block.asItem().getDefaultInstance();
83+
}
84+
7985
@Override
8086
public MapCodec<? extends MachineProcessCondition> codec() {
8187
return CODEC;

src/main/java/aztech/modern_industrialization/machines/recipe/condition/BiomeProcessCondition.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import net.minecraft.resources.ResourceKey;
4040
import net.minecraft.resources.ResourceLocation;
4141
import net.minecraft.tags.TagKey;
42+
import net.minecraft.world.item.ItemStack;
43+
import net.minecraft.world.item.Items;
4244
import net.minecraft.world.level.biome.Biome;
4345
import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs;
4446

@@ -82,6 +84,11 @@ public void appendDescription(List<Component> list) {
8284
});
8385
}
8486

87+
@Override
88+
public ItemStack icon() {
89+
return Items.OAK_SAPLING.getDefaultInstance();
90+
}
91+
8592
@Override
8693
public MapCodec<? extends MachineProcessCondition> codec() {
8794
return CODEC;

src/main/java/aztech/modern_industrialization/machines/recipe/condition/CustomProcessCondition.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,17 @@
2727
import aztech.modern_industrialization.machines.recipe.MachineRecipe;
2828
import com.mojang.serialization.Codec;
2929
import com.mojang.serialization.MapCodec;
30-
import com.mojang.serialization.codecs.RecordCodecBuilder;
3130
import java.util.HashMap;
3231
import java.util.List;
3332
import java.util.Map;
3433
import java.util.Objects;
35-
import java.util.Optional;
3634
import java.util.function.BiPredicate;
3735
import net.minecraft.network.RegistryFriendlyByteBuf;
3836
import net.minecraft.network.chat.Component;
3937
import net.minecraft.network.chat.ComponentSerialization;
4038
import net.minecraft.network.codec.ByteBufCodecs;
4139
import net.minecraft.network.codec.StreamCodec;
40+
import net.minecraft.world.item.ItemStack;
4241

4342
public class CustomProcessCondition implements MachineProcessCondition {
4443
static final Map<String, Definition> definitions = new HashMap<>();
@@ -49,8 +48,10 @@ public static void onReload() {
4948
KubeJSProxy.instance.fireCustomConditionEvent();
5049
}
5150

52-
public static void register(String id, BiPredicate<MachineProcessCondition.Context, MachineRecipe> predicate, Component... description) {
51+
public static void register(String id, BiPredicate<MachineProcessCondition.Context, MachineRecipe> predicate, ItemStack icon,
52+
Component... description) {
5353
Objects.requireNonNull(predicate);
54+
Objects.requireNonNull(icon);
5455

5556
if (definitions.containsKey(id)) {
5657
throw new IllegalArgumentException("Duplicate custom process condition definition: " + id);
@@ -60,28 +61,20 @@ public static void register(String id, BiPredicate<MachineProcessCondition.Conte
6061
throw new IllegalArgumentException("Custom process condition must have a description");
6162
}
6263

63-
definitions.put(id, new Definition(predicate, List.of(description)));
64+
definitions.put(id, new Definition(predicate, icon, List.of(description)));
6465
}
6566

6667
private record Definition(
6768
BiPredicate<MachineProcessCondition.Context, MachineRecipe> predicate,
68-
List<Component> description) {
69-
}
70-
71-
private static MapCodec<CustomProcessCondition> makeCodec(boolean syncToClient) {
72-
return RecordCodecBuilder.mapCodec(
73-
g -> g
74-
.group(
75-
Codec.STRING.fieldOf("custom_id").forGetter(c -> c.id),
76-
ComponentSerialization.CODEC.listOf().optionalFieldOf("description")
77-
.forGetter(c -> syncToClient ? Optional.of(c.description) : Optional.empty()))
78-
.apply(g, (id, desc) -> desc.map(d -> new CustomProcessCondition(id, d)).orElseGet(() -> new CustomProcessCondition(id))));
69+
ItemStack icon, List<Component> description) {
7970
}
8071

8172
static final MapCodec<CustomProcessCondition> CODEC = Codec.STRING.fieldOf("custom_id").xmap(CustomProcessCondition::new, c -> c.id);
8273
static final StreamCodec<RegistryFriendlyByteBuf, CustomProcessCondition> STREAM_CODEC = StreamCodec.composite(
8374
ByteBufCodecs.STRING_UTF8,
8475
c -> c.id,
76+
ItemStack.OPTIONAL_STREAM_CODEC,
77+
c -> c.icon,
8578
ComponentSerialization.TRUSTED_STREAM_CODEC.apply(ByteBufCodecs.list()),
8679
c -> c.description,
8780
CustomProcessCondition::new);
@@ -92,15 +85,18 @@ public CustomProcessCondition(String id) {
9285
throw new IllegalArgumentException("Unknown custom process condition definition: " + id);
9386
}
9487
this.id = id;
88+
this.icon = definition.icon;
9589
this.description = definition.description;
9690
}
9791

98-
public CustomProcessCondition(String id, List<Component> description) {
92+
public CustomProcessCondition(String id, ItemStack icon, List<Component> description) {
9993
this.id = id;
94+
this.icon = icon;
10095
this.description = description;
10196
}
10297

10398
private final String id;
99+
private final ItemStack icon;
104100
private final List<Component> description;
105101

106102
@Override
@@ -113,6 +109,11 @@ public void appendDescription(List<Component> list) {
113109
list.addAll(description);
114110
}
115111

112+
@Override
113+
public ItemStack icon() {
114+
return icon;
115+
}
116+
116117
@Override
117118
public MapCodec<? extends MachineProcessCondition> codec() {
118119
return CODEC;

src/main/java/aztech/modern_industrialization/machines/recipe/condition/DimensionProcessCondition.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package aztech.modern_industrialization.machines.recipe.condition;
2525

26+
import aztech.modern_industrialization.MIItem;
2627
import aztech.modern_industrialization.MIText;
2728
import aztech.modern_industrialization.machines.recipe.MachineRecipe;
2829
import com.mojang.serialization.MapCodec;
@@ -32,6 +33,7 @@
3233
import net.minecraft.network.chat.Component;
3334
import net.minecraft.network.codec.StreamCodec;
3435
import net.minecraft.resources.ResourceKey;
36+
import net.minecraft.world.item.ItemStack;
3537
import net.minecraft.world.level.Level;
3638

3739
public record DimensionProcessCondition(ResourceKey<Level> dimension) implements MachineProcessCondition {
@@ -56,6 +58,11 @@ public void appendDescription(List<Component> list) {
5658
list.add(MIText.RequiresDimension.text(dimComponent));
5759
}
5860

61+
@Override
62+
public ItemStack icon() {
63+
return MIItem.SINGULARITY.asItem().getDefaultInstance();
64+
}
65+
5966
@Override
6067
public MapCodec<? extends MachineProcessCondition> codec() {
6168
return CODEC;

0 commit comments

Comments
 (0)