Skip to content

Commit

Permalink
Update ore registry to rely on registry events for load order
Browse files Browse the repository at this point in the history
  • Loading branch information
Draylar committed Oct 18, 2021
1 parent 5c0a950 commit 048a526
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 18 deletions.
4 changes: 2 additions & 2 deletions src/main/java/draylar/horizon/MinersHorizon.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ public void onInitialize() {
HorizonBlocks.init();
HorizonWorld.init();

// Register ores from config & KubeJS
HorizonWorld.loadOres();
// Register ores from config
HorizonWorld.registerOreHandlers();

// Load biomes after ores are loaded
HorizonBiomes.init();
Expand Down
53 changes: 37 additions & 16 deletions src/main/java/draylar/horizon/registry/HorizonWorld.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import draylar.horizon.world.MinersHorizonChunkGenerator;
import draylar.horizon.world.MiningCaveCarver;
import draylar.horizon.world.RockySurfaceBuilder;
import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.floatprovider.ConstantFloatProvider;
Expand Down Expand Up @@ -77,23 +79,42 @@ public static void init() {
Registry.register(Registry.CHUNK_GENERATOR, MinersHorizon.id("horizon"), MinersHorizonChunkGenerator.CODEC);
}

public static void loadOres() {
public static void registerOreHandlers() {
List<OreConfig> ores = new ArrayList<>(Arrays.asList(MinersHorizon.CONFIG.oreConfigList));

// Register each ore
for (OreConfig ore : ores) {
ConfiguredFeature<?, ?> feature = register(
String.format("%s_%d_%d_%d", new Identifier(ore.block).getPath(), ore.size, ore.count, ore.maxY),
Feature.ORE.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
Registry.BLOCK.get(new Identifier(ore.block)).getDefaultState(),
ore.size)
)
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(UniformHeightProvider.create(YOffset.fixed(ore.minY), YOffset.fixed(ore.maxY)))))
.spreadHorizontally()
.repeat(ore.count));

ORES.add(feature);
}
// Handle ores that have already been registered.
Registry.BLOCK.getEntries().forEach(entry -> {
RegistryKey<Block> key = entry.getKey();
String id = key.getValue().toString();

// Load every Ore Config with a matching ID.
ores.stream().filter(config -> config.block.equals(id)).forEach(config -> {
ORES.add(load(config, entry.getValue()));
});
});

// TODO: there is a chance this slows down game loading. The question is how much?
// 100 entries * 1,000 registry events = 100,000 filter checks.
// Register a callback to add in future ores.
RegistryEntryAddedCallback.event(Registry.BLOCK).register((rawId, id, object) -> {

// Load every Ore Config with a matching ID.
ores.stream().filter(config -> config.block.equals(id.toString())).forEach(config -> {
ORES.add(load(config, object));
});
});
}

private static ConfiguredFeature<?, ?> load(OreConfig config, Block block) {
return register(
String.format("%s_%d_%d_%d", new Identifier(config.block).getPath(), config.size, config.count, config.maxY),
Feature.ORE.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
block.getDefaultState(),
config.size)
)
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(UniformHeightProvider.create(YOffset.fixed(config.minY), YOffset.fixed(config.maxY)))))
.spreadHorizontally()
.repeat(config.count));
}
}

0 comments on commit 048a526

Please sign in to comment.