Skip to content

Commit 7bbfeeb

Browse files
jurrejellescreret
andauthored
Fix ore builder KJS errors in 1.21 (#4424)
Co-authored-by: screret <68943070+screret@users.noreply.github.com>
1 parent 052866d commit 7bbfeeb

19 files changed

Lines changed: 445 additions & 250 deletions

src/main/java/com/gregtechceu/gtceu/api/worldgen/GTLayerPattern.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.mojang.datafixers.util.Either;
1515
import com.mojang.serialization.Codec;
1616
import com.mojang.serialization.codecs.RecordCodecBuilder;
17+
import dev.latvian.mods.rhino.util.HideFromJS;
1718
import org.jetbrains.annotations.Nullable;
1819

1920
import java.util.ArrayList;
@@ -36,7 +37,7 @@ public GTLayerPattern(List<Layer> layers) {
3637

3738
public @Nullable Layer rollNext(@Nullable Layer previous, RandomSource random) {
3839
if (layers.isEmpty()) return null;
39-
if (layers.size() == 1) return layers.get(0);
40+
if (layers.size() == 1) return layers.getFirst();
4041

4142
int totalWeight = 0;
4243
for (Layer layer : layers) {
@@ -56,6 +57,11 @@ public GTLayerPattern(List<Layer> layers) {
5657
return null;
5758
}
5859

60+
public static Builder builder(IWorldGenLayer layer) {
61+
return builder(layer.getTarget());
62+
}
63+
64+
@HideFromJS
5965
public static Builder builder(RuleTest... rules) {
6066
return new Builder(rules);
6167
}

src/main/java/com/gregtechceu/gtceu/api/worldgen/OreVeinDefinition.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.gregtechceu.gtceu.api.worldgen.generator.VeinGenerator;
77
import com.gregtechceu.gtceu.api.worldgen.generator.indicators.SurfaceIndicatorGenerator;
88
import com.gregtechceu.gtceu.api.worldgen.generator.veins.*;
9+
import com.gregtechceu.gtceu.utils.codec.CodecUtils;
910

1011
import net.minecraft.core.Holder;
1112
import net.minecraft.core.HolderGetter;
@@ -32,6 +33,7 @@
3233
import lombok.Getter;
3334
import lombok.Setter;
3435
import lombok.experimental.Accessors;
36+
import lombok.experimental.ExtensionMethod;
3537
import lombok.experimental.Tolerate;
3638
import org.jetbrains.annotations.ApiStatus;
3739
import org.jetbrains.annotations.Nullable;
@@ -41,6 +43,7 @@
4143
import java.util.function.Supplier;
4244

4345
@SuppressWarnings("UnusedReturnValue")
46+
@ExtensionMethod(CodecUtils.class)
4447
@Accessors(chain = true, fluent = true)
4548
public class OreVeinDefinition {
4649

@@ -53,8 +56,8 @@ public class OreVeinDefinition {
5356
ResourceKey.codec(Registries.DIMENSION).listOf().fieldOf("dimension_filter").forGetter(ft -> new ArrayList<>(ft.dimensionFilter)),
5457
HeightRangePlacement.CODEC.fieldOf("height_range").forGetter(OreVeinDefinition::heightRange),
5558
Codec.floatRange(0.0F, 1.0F).fieldOf("discard_chance_on_air_exposure").forGetter(OreVeinDefinition::discardChanceOnAirExposure),
56-
RegistryCodecs.homogeneousList(Registries.BIOME).lenientOptionalFieldOf("biomes", HolderSet.empty()).forGetter(OreVeinDefinition::biomes),
57-
BiomeWeightModifier.CODEC.optionalFieldOf("weight_modifier", BiomeWeightModifier.EMPTY).forGetter(ext -> ext.biomeWeightModifier),
59+
RegistryCodecs.homogeneousList(Registries.BIOME).lenientNullableOptionalFieldOf("biomes", HolderSet.empty()).forGetter(OreVeinDefinition::biomes),
60+
BiomeWeightModifier.CODEC.lenientNullableOptionalFieldOf("weight_modifier", BiomeWeightModifier.EMPTY).forGetter(ext -> ext.biomeWeightModifier),
5861
VeinGenerator.DIRECT_CODEC.fieldOf("generator").forGetter(ft -> ft.veinGenerator),
5962
Codec.list(IndicatorGenerator.DIRECT_CODEC).fieldOf("indicators").forGetter(ft -> ft.indicatorGenerators)
6063
).apply(instance, OreVeinDefinition::new));

src/main/java/com/gregtechceu/gtceu/api/worldgen/bedrockore/BedrockOreDefinition.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.gregtechceu.gtceu.api.material.material.Material;
44
import com.gregtechceu.gtceu.api.registry.GTRegistries;
55
import com.gregtechceu.gtceu.api.worldgen.BiomeWeightModifier;
6+
import com.gregtechceu.gtceu.utils.codec.CodecUtils;
67

78
import net.minecraft.core.Holder;
89
import net.minecraft.core.HolderGetter;
@@ -24,10 +25,12 @@
2425
import lombok.Getter;
2526
import lombok.Setter;
2627
import lombok.experimental.Accessors;
28+
import lombok.experimental.ExtensionMethod;
2729
import lombok.experimental.Tolerate;
2830

2931
import java.util.*;
3032

33+
@ExtensionMethod(CodecUtils.class)
3134
@Accessors(fluent = true, chain = true)
3235
public class BedrockOreDefinition {
3336

@@ -40,9 +43,9 @@ public class BedrockOreDefinition {
4043
ExtraCodecs.intRange(0, 100).fieldOf("depletion_chance").forGetter(BedrockOreDefinition::depletionChance),
4144
Codec.INT.fieldOf("depleted_yield").forGetter(BedrockOreDefinition::depletedYield),
4245
WeightedMaterial.CODEC.listOf().fieldOf("materials").forGetter(BedrockOreDefinition::materials),
43-
BiomeWeightModifier.CODEC.optionalFieldOf("weight_modifier", BiomeWeightModifier.EMPTY).forGetter(BedrockOreDefinition::biomeWeightModifier),
46+
BiomeWeightModifier.CODEC.lenientNullableOptionalFieldOf("weight_modifier", BiomeWeightModifier.EMPTY).forGetter(BedrockOreDefinition::biomeWeightModifier),
4447
ResourceKey.codec(Registries.DIMENSION).listOf().fieldOf("dimension_filter").forGetter(ft -> new ArrayList<>(ft.dimensionFilter))
45-
).apply(instance, BedrockOreDefinition::new));
48+
).apply(instance, BedrockOreDefinition::new));
4649
public static final Codec<Holder<BedrockOreDefinition>> CODEC = RegistryFixedCodec.create(GTRegistries.BEDROCK_ORE_REGISTRY);
4750
// spotless:on
4851
@Getter

src/main/java/com/gregtechceu/gtceu/api/worldgen/generator/VeinGenerators.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,8 @@ public class VeinGenerators {
3333
public static final MapCodec<CuboidVeinGenerator> CUBOID = register(GTCEu.id("cuboid"), CuboidVeinGenerator.CODEC,
3434
CuboidVeinGenerator::new);
3535

36-
public static <
37-
T extends VeinGenerator> MapCodec<T> register(ResourceLocation id, MapCodec<T> codec,
38-
Supplier<? extends VeinGenerator> function) {
36+
public static <T extends VeinGenerator> MapCodec<T> register(ResourceLocation id, MapCodec<T> codec,
37+
Supplier<T> function) {
3938
WorldGeneratorUtils.VEIN_GENERATORS.put(id, codec);
4039
WorldGeneratorUtils.VEIN_GENERATOR_FUNCTIONS.put(id, function);
4140
return codec;

src/main/java/com/gregtechceu/gtceu/api/worldgen/generator/veins/LayeredVeinGenerator.java

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.gregtechceu.gtceu.api.material.ChemicalHelper;
44
import com.gregtechceu.gtceu.api.material.material.Material;
55
import com.gregtechceu.gtceu.api.worldgen.GTLayerPattern;
6+
import com.gregtechceu.gtceu.api.worldgen.IWorldGenLayer;
67
import com.gregtechceu.gtceu.api.worldgen.OreVeinDefinition;
78
import com.gregtechceu.gtceu.api.worldgen.generator.VeinGenerator;
89
import com.gregtechceu.gtceu.api.worldgen.ores.OreBlockPlacer;
@@ -19,20 +20,23 @@
1920
import net.minecraft.world.level.chunk.LevelChunkSection;
2021
import net.minecraft.world.level.levelgen.XoroshiroRandomSource;
2122
import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
23+
import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest;
2224

2325
import com.mojang.datafixers.util.Either;
2426
import com.mojang.serialization.MapCodec;
25-
import com.tterrag.registrate.util.nullness.NonNullSupplier;
27+
import dev.latvian.mods.rhino.util.HideFromJS;
2628
import it.unimi.dsi.fastutil.floats.FloatArrayList;
2729
import it.unimi.dsi.fastutil.floats.FloatList;
2830
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
31+
import lombok.Getter;
2932
import lombok.NoArgsConstructor;
33+
import org.jetbrains.annotations.NotNull;
3034

3135
import java.util.ArrayList;
3236
import java.util.List;
3337
import java.util.Map;
38+
import java.util.function.Consumer;
3439
import java.util.function.Supplier;
35-
import java.util.stream.Collectors;
3640

3741
@SuppressWarnings("UnusedReturnValue")
3842
@NoArgsConstructor
@@ -42,16 +46,8 @@ public class LayeredVeinGenerator extends VeinGenerator {
4246
public static final MapCodec<LayeredVeinGenerator> CODEC = GTLayerPattern.CODEC.listOf().fieldOf("layer_patterns")
4347
.xmap(LayeredVeinGenerator::new, LayeredVeinGenerator::getLayerPatterns);
4448
// spotless:on
45-
private final List<NonNullSupplier<GTLayerPattern>> bakingLayerPatterns = new ArrayList<>();
46-
47-
public List<GTLayerPattern> layerPatterns;
48-
49-
public List<GTLayerPattern> getLayerPatterns() {
50-
if (layerPatterns == null || this.layerPatterns.isEmpty()) {
51-
layerPatterns = bakingLayerPatterns.stream().map(Supplier::get).collect(Collectors.toList());
52-
}
53-
return layerPatterns;
54-
}
49+
@Getter
50+
public List<GTLayerPattern> layerPatterns = new ArrayList<>();
5551

5652
@Override
5753
public List<VeinEntry> getAllEntries() {
@@ -204,21 +200,37 @@ private static void placeBlock(BulkSectionAccess access, LevelChunkSection secti
204200
}
205201
}
206202

207-
public LayeredVeinGenerator(List<GTLayerPattern> layerPatterns) {
208-
super();
203+
public LayeredVeinGenerator(@NotNull List<GTLayerPattern> layerPatterns) {
209204
this.layerPatterns = layerPatterns;
210205
}
211206

212-
public LayeredVeinGenerator withLayerPattern(NonNullSupplier<GTLayerPattern> pattern) {
213-
this.bakingLayerPatterns.add(pattern);
207+
public LayeredVeinGenerator buildLayerPattern(IWorldGenLayer layer, Consumer<GTLayerPattern.Builder> config) {
208+
return buildLayerPattern(layer.getTarget(), config);
209+
}
210+
211+
@HideFromJS
212+
public LayeredVeinGenerator buildLayerPattern(RuleTest rule, Consumer<GTLayerPattern.Builder> config) {
213+
var builder = GTLayerPattern.builder(rule);
214+
config.accept(builder);
215+
216+
return withLayerPattern(builder);
217+
}
218+
219+
public LayeredVeinGenerator withLayerPattern(Supplier<GTLayerPattern> pattern) {
220+
return this.withLayerPattern(pattern.get());
221+
}
222+
223+
public LayeredVeinGenerator withLayerPattern(GTLayerPattern pattern) {
224+
this.layerPatterns.add(pattern);
214225
return this;
215226
}
216227

228+
public LayeredVeinGenerator withLayerPattern(GTLayerPattern.Builder builder) {
229+
return this.withLayerPattern(builder.build());
230+
}
231+
232+
@Override
217233
public VeinGenerator build() {
218-
if (this.layerPatterns != null && !this.layerPatterns.isEmpty()) return this;
219-
this.layerPatterns = this.bakingLayerPatterns.stream()
220-
.map(NonNullSupplier::get)
221-
.toList();
222234
return this;
223235
}
224236

src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import com.gregtechceu.gtceu.api.registry.GTRegistries;
1818
import com.gregtechceu.gtceu.api.registry.registrate.forge.GTClientFluidTypeExtensions;
1919
import com.gregtechceu.gtceu.api.tag.TagPrefix;
20+
import com.gregtechceu.gtceu.api.worldgen.OreVeinDefinition;
21+
import com.gregtechceu.gtceu.api.worldgen.bedrockfluid.BedrockFluidDefinition;
22+
import com.gregtechceu.gtceu.api.worldgen.bedrockore.BedrockOreDefinition;
2023
import com.gregtechceu.gtceu.config.ConfigHolder;
2124
import com.gregtechceu.gtceu.core.mixins.BlockBehaviourAccessor;
2225
import com.gregtechceu.gtceu.data.block.GTMaterialBlocks;
@@ -33,6 +36,7 @@
3336
import net.minecraft.core.registries.Registries;
3437
import net.minecraft.data.loot.packs.VanillaBlockLoot;
3538
import net.minecraft.nbt.CompoundTag;
39+
import net.minecraft.resources.RegistryDataLoader;
3640
import net.minecraft.resources.ResourceKey;
3741
import net.minecraft.resources.ResourceLocation;
3842
import net.minecraft.tags.*;
@@ -391,18 +395,24 @@ public static void addMaterialBlockLootTables(TriConsumer<ResourceLocation, Loot
391395
});
392396
}
393397

394-
public static void postKJSVeinEvents(WritableRegistry<?> registry) {
398+
public static void updateCachedRegistryAndPostKJSVeinEvents(RegistryAccess staticRegistries,
399+
List<RegistryDataLoader.Loader<?>> loaders) {
400+
// create a temporary registry access instance from static registries + new dynamic registries
401+
RegistryAccess registries = createRegistryContext(staticRegistries, loaders);
402+
GTRegistries.updateFrozenRegistry(registries);
403+
395404
if (!GTCEu.Mods.isKubeJSLoaded()) {
396405
return;
397406
}
407+
KJSCallWrapper.postOreEvents(loaders, registries);
408+
}
398409

399-
if (registry.key() == GTRegistries.ORE_VEIN_REGISTRY) {
400-
KJSCallWrapper.postOreVeinEvent();
401-
} else if (registry.key() == GTRegistries.BEDROCK_FLUID_REGISTRY) {
402-
KJSCallWrapper.postBedrockFluidEvent();
403-
} else if (registry.key() == GTRegistries.BEDROCK_ORE_REGISTRY) {
404-
KJSCallWrapper.postBedrockOreEvent();
405-
}
410+
private static RegistryAccess createRegistryContext(RegistryAccess staticRegistries,
411+
List<RegistryDataLoader.Loader<?>> registryLoaders) {
412+
final Map<ResourceKey<? extends Registry<?>>, Registry<?>> map = new HashMap<>();
413+
staticRegistries.registries().forEach(entry -> map.put(entry.key(), entry.value()));
414+
registryLoaders.forEach(loader -> map.put(loader.registry().key(), loader.registry()));
415+
return new RegistryAccess.ImmutableRegistryAccess(map);
406416
}
407417

408418
public static void addFluidTexture(Material material, FluidStorage.FluidEntry value) {
@@ -417,16 +427,26 @@ public static void addFluidTexture(Material material, FluidStorage.FluidEntry va
417427

418428
private static final class KJSCallWrapper {
419429

420-
private static void postOreVeinEvent() {
421-
GTCEuServerEvents.ORE_VEIN_MODIFICATION.post(new GTOreVeinKubeEvent());
422-
}
423-
424-
private static void postBedrockFluidEvent() {
425-
GTCEuServerEvents.FLUID_VEIN_MODIFICATION.post(new GTBedrockFluidVeinKubeEvent());
426-
}
427-
428-
private static void postBedrockOreEvent() {
429-
GTCEuServerEvents.BEDROCK_ORE_VEIN_MODIFICATION.post(new GTBedrockOreVeinKubeEvent());
430+
@SuppressWarnings("unchecked")
431+
private static void postOreEvents(List<RegistryDataLoader.Loader<?>> dynamicRegistryLoaders,
432+
RegistryAccess registries) {
433+
for (RegistryDataLoader.Loader<?> loader : dynamicRegistryLoaders) {
434+
switch (loader.registry().key()) {
435+
case ResourceKey<?> key when key ==
436+
GTRegistries.ORE_VEIN_REGISTRY -> GTCEuServerEvents.ORE_VEIN_MODIFICATION.post(
437+
new GTOreVeinKubeEvent((WritableRegistry<OreVeinDefinition>) loader.registry(),
438+
registries));
439+
case ResourceKey<?> key when key ==
440+
GTRegistries.BEDROCK_FLUID_REGISTRY -> GTCEuServerEvents.ORE_VEIN_MODIFICATION
441+
.post(new GTBedrockFluidVeinKubeEvent(
442+
(WritableRegistry<BedrockFluidDefinition>) loader.registry(), registries));
443+
case ResourceKey<?> key when key ==
444+
GTRegistries.BEDROCK_ORE_REGISTRY -> GTCEuServerEvents.ORE_VEIN_MODIFICATION
445+
.post(new GTBedrockOreVeinKubeEvent(
446+
(WritableRegistry<BedrockOreDefinition>) loader.registry(), registries));
447+
default -> {}
448+
}
449+
}
430450
}
431451
}
432452

src/main/java/com/gregtechceu/gtceu/core/mixins/RegistryDataLoader$LoaderMixin.java

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.gregtechceu.gtceu.core.mixins;
2+
3+
import com.gregtechceu.gtceu.core.MixinHelpers;
4+
5+
import net.minecraft.core.RegistryAccess;
6+
import net.minecraft.resources.RegistryDataLoader;
7+
8+
import com.llamalad7.mixinextras.sugar.Local;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
13+
14+
import java.util.List;
15+
16+
@Mixin(RegistryDataLoader.class)
17+
public class RegistryDataLoaderMixin {
18+
19+
/// this is called after data load and before registry freeze
20+
@Inject(method = "load(Lnet/minecraft/resources/RegistryDataLoader$LoadingFunction;Lnet/minecraft/core/RegistryAccess;Ljava/util/List;)Lnet/minecraft/core/RegistryAccess$Frozen;",
21+
at = @At(value = "INVOKE",
22+
target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V",
23+
ordinal = 1,
24+
remap = false))
25+
private static void gtceu$postKJSVeinEvents(RegistryDataLoader.LoadingFunction loadingFunction,
26+
RegistryAccess registryAccess,
27+
List<RegistryDataLoader.RegistryData<?>> registryData,
28+
CallbackInfoReturnable<RegistryAccess.Frozen> cir,
29+
@Local(ordinal = 1) List<RegistryDataLoader.Loader<?>> loaders) {
30+
MixinHelpers.updateCachedRegistryAndPostKJSVeinEvents(registryAccess, loaders);
31+
}
32+
}

src/main/java/com/gregtechceu/gtceu/integration/kjs/GTKubeJSPlugin.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,15 @@
9191
import com.gregtechceu.gtceu.integration.kjs.builders.worldgen.BedrockOreBuilder;
9292
import com.gregtechceu.gtceu.integration.kjs.builders.worldgen.DimensionMarkerBuilder;
9393
import com.gregtechceu.gtceu.integration.kjs.builders.worldgen.OreVeinDefinitionBuilder;
94-
import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation;
95-
import com.gregtechceu.gtceu.integration.kjs.helpers.MachineConstructors;
96-
import com.gregtechceu.gtceu.integration.kjs.helpers.MachineModifiers;
97-
import com.gregtechceu.gtceu.integration.kjs.helpers.MaterialStackWrapper;
94+
import com.gregtechceu.gtceu.integration.kjs.helpers.*;
9895
import com.gregtechceu.gtceu.integration.kjs.recipe.GTRecipeSchema;
9996
import com.gregtechceu.gtceu.integration.kjs.recipe.GTShapedRecipeSchema;
10097
import com.gregtechceu.gtceu.integration.kjs.recipe.KJSHelpers;
10198
import com.gregtechceu.gtceu.integration.kjs.recipe.components.CapabilityMapComponent;
10299
import com.gregtechceu.gtceu.integration.kjs.recipe.components.GTRecipeComponents;
103100
import com.gregtechceu.gtceu.utils.data.RuntimeBlockStateProvider;
104101

102+
import net.minecraft.core.HolderSet;
105103
import net.minecraft.core.Registry;
106104
import net.minecraft.core.registries.BuiltInRegistries;
107105
import net.minecraft.core.registries.Registries;
@@ -366,7 +364,9 @@ public void registerBindings(BindingRegistry event) {
366364
event.add("GTOreVein", OreVeinDefinition.class);
367365
event.add("OreVeinDefinition", OreVeinDefinition.class);
368366
event.add("GTLayerPattern", GTLayerPattern.class);
367+
event.add("LayerPattern", GTLayerPattern.class);
369368
event.add("GTDikeBlockDefinition", DikeVeinGenerator.DikeBlockDefinition.class);
369+
event.add("DikeBlockDefinition", DikeVeinGenerator.DikeBlockDefinition.class);
370370
event.add("GTOres", GTOreVeins.class);
371371
event.add("GTOreVeins", GTOreVeins.class);
372372
event.add("GTWorldGenLayers", WorldGenLayers.class);
@@ -476,6 +476,8 @@ public void registerTypeWrappers(TypeWrapperRegistry registry) {
476476
if (o instanceof IWorldGenLayer.RuleTestSupplier supplier) return supplier;
477477
return () -> BlockStatePredicate.wrapRuleTest(cx, o);
478478
});
479+
// register a conditional type wrapper for early parsing of holder sets
480+
registry.register(HolderSet.class, SpecialHolderWrapper::canWrapHolderSet, SpecialHolderWrapper::wrapHolderSet);
479481
registry.register(CraftingComponent.class, o -> {
480482
if (o instanceof CraftingComponent comp) return comp;
481483
if (o instanceof CharSequence str) return CraftingComponent.ALL_COMPONENTS.get(str.toString());

0 commit comments

Comments
 (0)