Skip to content

Commit 5c4e8c5

Browse files
committed
Add tag support in biome process condition
1 parent 525cdec commit 5c4e8c5

File tree

3 files changed

+42
-9
lines changed

3 files changed

+42
-9
lines changed

docs/ADDING_RECIPES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ The easiest way to add process conditions is via KubeJS, similarly to how inputs
3838
Here is the list of currently supported conditions:
3939
- `dimension(dimension key)`: Requires the machine to be in the specified dimension.
4040
- `biome(biome key)`: Requires the machine to be in the specified biome.
41+
- `biomeTag(biome tag key)`: Requires the machine to be in a biome of the specified tag.
4142
- `adjacentBlock(block, position)`: Requires a specific block to be next to the machine.
4243
- Position indicates where the block should be.
4344
- For multiblocks, the position is always relative to the controller.

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828
import aztech.modern_industrialization.machines.recipe.condition.CustomProcessCondition;
2929
import aztech.modern_industrialization.machines.recipe.condition.DimensionProcessCondition;
3030
import aztech.modern_industrialization.machines.recipe.condition.MachineProcessCondition;
31+
import com.mojang.datafixers.util.Either;
3132
import net.minecraft.core.registries.Registries;
3233
import net.minecraft.resources.ResourceKey;
3334
import net.minecraft.resources.ResourceLocation;
35+
import net.minecraft.tags.TagKey;
3436
import net.minecraft.world.level.block.Block;
3537

3638
public interface ProcessConditionHelper {
@@ -45,7 +47,11 @@ default ProcessConditionHelper adjacentBlock(Block block, String relativePositio
4547
}
4648

4749
default ProcessConditionHelper biome(ResourceLocation biome) {
48-
return processCondition(new BiomeProcessCondition(ResourceKey.create(Registries.BIOME, biome)));
50+
return processCondition(new BiomeProcessCondition(Either.left(ResourceKey.create(Registries.BIOME, biome))));
51+
}
52+
53+
default ProcessConditionHelper biomeTag(ResourceLocation tag) {
54+
return processCondition(new BiomeProcessCondition(Either.right(TagKey.create(Registries.BIOME, tag))));
4955
}
5056

5157
default ProcessConditionHelper customCondition(String id) {

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

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,35 +25,61 @@
2525

2626
import aztech.modern_industrialization.MIText;
2727
import aztech.modern_industrialization.machines.recipe.MachineRecipe;
28+
import aztech.modern_industrialization.proxy.CommonProxy;
29+
import com.mojang.datafixers.util.Either;
2830
import com.mojang.serialization.MapCodec;
2931
import java.util.List;
32+
import net.minecraft.Util;
3033
import net.minecraft.core.registries.Registries;
3134
import net.minecraft.network.RegistryFriendlyByteBuf;
3235
import net.minecraft.network.chat.Component;
36+
import net.minecraft.network.chat.MutableComponent;
37+
import net.minecraft.network.codec.ByteBufCodecs;
3338
import net.minecraft.network.codec.StreamCodec;
3439
import net.minecraft.resources.ResourceKey;
40+
import net.minecraft.resources.ResourceLocation;
41+
import net.minecraft.tags.TagKey;
3542
import net.minecraft.world.level.biome.Biome;
43+
import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs;
3644

37-
public record BiomeProcessCondition(ResourceKey<Biome> biome) implements MachineProcessCondition {
38-
static final MapCodec<BiomeProcessCondition> CODEC = ResourceKey.codec(Registries.BIOME)
39-
.fieldOf("biome")
45+
public record BiomeProcessCondition(Either<ResourceKey<Biome>, TagKey<Biome>> biome) implements MachineProcessCondition {
46+
static final MapCodec<BiomeProcessCondition> CODEC = NeoForgeExtraCodecs
47+
.xor(
48+
ResourceKey.codec(Registries.BIOME).fieldOf("biome"),
49+
TagKey.codec(Registries.BIOME).fieldOf("tag"))
4050
.xmap(BiomeProcessCondition::new, BiomeProcessCondition::biome);
4151
static final StreamCodec<RegistryFriendlyByteBuf, BiomeProcessCondition> STREAM_CODEC = StreamCodec.composite(
42-
ResourceKey.streamCodec(Registries.BIOME),
52+
ByteBufCodecs.either(
53+
ResourceKey.streamCodec(Registries.BIOME),
54+
ResourceLocation.STREAM_CODEC.map(rl -> TagKey.create(Registries.BIOME, rl), TagKey::location)),
4355
BiomeProcessCondition::biome,
4456
BiomeProcessCondition::new);
4557

4658
@Override
4759
public boolean canProcessRecipe(Context context, MachineRecipe recipe) {
4860
var entityBiome = context.getLevel().getBiome(context.getBlockEntity().getBlockPos());
49-
return entityBiome.is(biome);
61+
return biome.map(entityBiome::is, entityBiome::is);
62+
}
63+
64+
private static MutableComponent biomeId(ResourceLocation biomeLocation) {
65+
return Component.translatable(Util.makeDescriptionId("biome", biomeLocation));
5066
}
5167

5268
@Override
5369
public void appendDescription(List<Component> list) {
54-
var loc = biome.location();
55-
var biomeComponent = Component.translatable("biome.%s.%s".formatted(loc.getNamespace(), loc.getPath()));
56-
list.add(MIText.RequiresBiome.text(biomeComponent));
70+
biome.ifLeft(rk -> {
71+
list.add(MIText.RequiresBiome.text(biomeId(rk.location())));
72+
}).ifRight(tag -> {
73+
var holderLookup = CommonProxy.INSTANCE.getClientPlayer().registryAccess();
74+
var biomeNames = holderLookup.lookupOrThrow(tag.registry()).get(tag).map(named -> {
75+
return named.stream()
76+
.map(holder -> biomeId(holder.unwrapKey().orElseThrow().location()))
77+
.reduce((a, b) -> a.append(", ").append(b))
78+
.orElseThrow();
79+
}).orElse(Component.literal("???"));
80+
81+
list.add(MIText.RequiresBiome.text(biomeNames));
82+
});
5783
}
5884

5985
@Override

0 commit comments

Comments
 (0)