Skip to content

Commit 8c2381b

Browse files
committed
Add support for recipe conditions to have icons
1 parent 39d2650 commit 8c2381b

File tree

7 files changed

+80
-14
lines changed

7 files changed

+80
-14
lines changed

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
@@ -52,10 +52,10 @@
5252
import net.minecraft.network.chat.Component;
5353
import net.minecraft.network.chat.Style;
5454
import net.minecraft.resources.ResourceLocation;
55+
import net.minecraft.world.item.ItemStack;
5556
import net.minecraft.world.item.crafting.RecipeHolder;
5657
import net.minecraft.world.item.crafting.RecipeManager;
5758
import net.minecraft.world.item.crafting.RecipeType;
58-
import net.minecraft.world.level.ItemLike;
5959
import net.minecraft.world.level.block.ComposterBlock;
6060

6161
public class MachineCategory extends ViewerCategory<RecipeHolder<MachineRecipe>> {
@@ -258,15 +258,36 @@ public void buildWidgets(RecipeHolder<MachineRecipe> recipeHolder, WidgetList wi
258258
// Conditions
259259
boolean conditionsRequired = recipe.conditions.size() > 0;
260260
if (steelHatchRequired || upgradeEuRequired > 0 || conditionsRequired) {
261-
ItemLike displayedItem;
261+
List<ItemStack> displayedItems = new ArrayList<>();
262262
if (steelHatchRequired) {
263-
displayedItem = BuiltInRegistries.ITEM.get(MI.id("steel_item_input_hatch"));
264-
} else if (conditionsRequired) {
265-
displayedItem = MIItem.WRENCH;
266-
} else {
267-
displayedItem = MIItem.BASIC_UPGRADE;
263+
displayedItems.add(BuiltInRegistries.ITEM.get(MI.id("steel_item_input_hatch")).getDefaultInstance());
264+
}
265+
if (upgradeEuRequired > 0) {
266+
displayedItems.add(MIItem.BASIC_UPGRADE.stack());
267+
}
268+
for (var condition : recipe.conditions) {
269+
ItemStack displayedItem = condition.icon();
270+
if (!displayedItem.isEmpty()) {
271+
displayedItems.add(displayedItem);
272+
}
273+
}
274+
if (displayedItems.isEmpty()) {
275+
displayedItems.add(MIItem.WRENCH.stack());
268276
}
269-
widgets.item(width / 2f - 3, 3.75, 10.8, 10.8, displayedItem);
277+
278+
double x = width / 2f - 3;
279+
double y = 3.75;
280+
double wh = 10.8;
281+
widgets.drawable(graphics -> {
282+
int itemIndex = (int) ((System.currentTimeMillis() / 1500L) % displayedItems.size());
283+
ItemStack displayedItem = displayedItems.get(itemIndex).copyWithCount(1);
284+
285+
graphics.pose().pushPose();
286+
graphics.pose().translate(x, y, 0);
287+
graphics.pose().scale((float) wh / 16, (float) wh / 16, 1);
288+
graphics.renderFakeItem(displayedItem, 0, 0);
289+
graphics.pose().popPose();
290+
});
270291
}
271292
// Tooltips
272293
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
@@ -32,6 +32,8 @@
3232
import net.minecraft.network.chat.Component;
3333
import net.minecraft.network.codec.StreamCodec;
3434
import net.minecraft.resources.ResourceKey;
35+
import net.minecraft.world.item.ItemStack;
36+
import net.minecraft.world.item.Items;
3537
import net.minecraft.world.level.biome.Biome;
3638

3739
public record BiomeProcessCondition(ResourceKey<Biome> biome) implements MachineProcessCondition {
@@ -56,6 +58,11 @@ public void appendDescription(List<Component> list) {
5658
list.add(MIText.RequiresBiome.text(biomeComponent));
5759
}
5860

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

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

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import net.minecraft.network.chat.ComponentSerialization;
4040
import net.minecraft.network.codec.ByteBufCodecs;
4141
import net.minecraft.network.codec.StreamCodec;
42+
import net.minecraft.world.item.ItemStack;
4243

4344
public class CustomProcessCondition implements MachineProcessCondition {
4445
static final Map<String, Definition> definitions = new HashMap<>();
@@ -49,8 +50,10 @@ public static void onReload() {
4950
KubeJSProxy.instance.fireCustomConditionEvent();
5051
}
5152

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

5558
if (definitions.containsKey(id)) {
5659
throw new IllegalArgumentException("Duplicate custom process condition definition: " + id);
@@ -60,28 +63,32 @@ public static void register(String id, BiPredicate<MachineProcessCondition.Conte
6063
throw new IllegalArgumentException("Custom process condition must have a description");
6164
}
6265

63-
definitions.put(id, new Definition(predicate, List.of(description)));
66+
definitions.put(id, new Definition(predicate, icon, List.of(description)));
6467
}
6568

6669
private record Definition(
6770
BiPredicate<MachineProcessCondition.Context, MachineRecipe> predicate,
68-
List<Component> description) {
71+
ItemStack icon, List<Component> description) {
6972
}
7073

7174
private static MapCodec<CustomProcessCondition> makeCodec(boolean syncToClient) {
7275
return RecordCodecBuilder.mapCodec(
7376
g -> g
7477
.group(
7578
Codec.STRING.fieldOf("custom_id").forGetter(c -> c.id),
79+
ItemStack.OPTIONAL_CODEC.fieldOf("icon").forGetter(c -> c.icon),
7680
ComponentSerialization.CODEC.listOf().optionalFieldOf("description")
7781
.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))));
82+
.apply(g, (id, icon, desc) -> desc.map(d -> new CustomProcessCondition(id, icon, d))
83+
.orElseGet(() -> new CustomProcessCondition(id))));
7984
}
8085

8186
static final MapCodec<CustomProcessCondition> CODEC = Codec.STRING.fieldOf("custom_id").xmap(CustomProcessCondition::new, c -> c.id);
8287
static final StreamCodec<RegistryFriendlyByteBuf, CustomProcessCondition> STREAM_CODEC = StreamCodec.composite(
8388
ByteBufCodecs.STRING_UTF8,
8489
c -> c.id,
90+
ItemStack.OPTIONAL_STREAM_CODEC,
91+
c -> c.icon,
8592
ComponentSerialization.TRUSTED_STREAM_CODEC.apply(ByteBufCodecs.list()),
8693
c -> c.description,
8794
CustomProcessCondition::new);
@@ -92,15 +99,18 @@ public CustomProcessCondition(String id) {
9299
throw new IllegalArgumentException("Unknown custom process condition definition: " + id);
93100
}
94101
this.id = id;
102+
this.icon = definition.icon;
95103
this.description = definition.description;
96104
}
97105

98-
public CustomProcessCondition(String id, List<Component> description) {
106+
public CustomProcessCondition(String id, ItemStack icon, List<Component> description) {
99107
this.id = id;
108+
this.icon = icon;
100109
this.description = description;
101110
}
102111

103112
private final String id;
113+
private final ItemStack icon;
104114
private final List<Component> description;
105115

106116
@Override
@@ -113,6 +123,11 @@ public void appendDescription(List<Component> list) {
113123
list.addAll(description);
114124
}
115125

126+
@Override
127+
public ItemStack icon() {
128+
return icon;
129+
}
130+
116131
@Override
117132
public MapCodec<? extends MachineProcessCondition> codec() {
118133
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;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import net.minecraft.network.codec.StreamCodec;
3636
import net.minecraft.resources.ResourceLocation;
3737
import net.minecraft.server.level.ServerLevel;
38+
import net.minecraft.world.item.ItemStack;
3839

3940
public interface MachineProcessCondition {
4041
Codec<MachineProcessCondition> CODEC = ResourceLocation.CODEC
@@ -60,6 +61,10 @@ public interface MachineProcessCondition {
6061

6162
void appendDescription(List<Component> list);
6263

64+
default ItemStack icon() {
65+
return ItemStack.EMPTY;
66+
}
67+
6368
MapCodec<? extends MachineProcessCondition> codec();
6469

6570
StreamCodec<? super RegistryFriendlyByteBuf, ? extends MachineProcessCondition> streamCodec();

0 commit comments

Comments
 (0)