Skip to content

Commit

Permalink
prevent the need for knowing dimension in multigenerator
Browse files Browse the repository at this point in the history
  • Loading branch information
Pixaurora committed Aug 17, 2023
1 parent cc4ed85 commit 38858dd
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 59 deletions.
14 changes: 8 additions & 6 deletions src/main/java/net/pixaurora/janerator/Janerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import net.minecraft.world.level.chunk.LevelChunk;
import net.pixaurora.janerator.config.GraphProperties;
import net.pixaurora.janerator.config.JaneratorConfig;
import net.pixaurora.janerator.worldgen.MultiGenerator;
import net.pixaurora.janerator.worldgen.generator.MultiGenerator;

public class Janerator {
public static final Logger LOGGER = LoggerFactory.getLogger("Janerator");
Expand All @@ -26,15 +26,17 @@ public static ChunkGenerator getGeneratorAt(
boolean chunkAlreadyGenerated = chunk instanceof LevelChunk || chunk instanceof ImposterProtoChunk;

if (chunkAlreadyGenerated || config.missingPresetFor(dimension)) {
defaultGenerator.janerator$setDimension(dimension);
return defaultGenerator;
}

GraphProperties dimensionPreset = config.getPresetFor(dimension);

ChunkGenerator modifiedGenerator = dimensionPreset.getShadedGenerator();
ChunkGenerator outlineGenerator = dimensionPreset.getOutlineGenerator();

return new MultiGenerator(defaultGenerator, modifiedGenerator, outlineGenerator, chunk, dimensionPreset);
return new MultiGenerator(
dimensionPreset.getGrapher(),
defaultGenerator,
dimensionPreset.getShadedGenerator(),
dimensionPreset.getOutlineGenerator(),
chunk
);
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,47 @@
package net.pixaurora.janerator.mixin;

import java.util.Objects;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.core.BlockPos;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.chunk.ChunkGeneratorStructureState;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager;
import net.pixaurora.janerator.config.GraphProperties;
import net.pixaurora.janerator.config.JaneratorConfig;
import net.pixaurora.janerator.graphing.ChunkGrapher;
import net.pixaurora.janerator.worldgen.JaneratorGenerator;
import net.pixaurora.janerator.worldgen.generator.MultiGenerator;

@Mixin(ChunkGenerator.class)
public class ChunkGeneratorMixin implements JaneratorGenerator {
private ResourceKey<Level> janerator$dimension;
private ChunkGrapher janerator$grapher;
private MultiGenerator janerator$parent;

@Override
public void janerator$setupMultiGenerating(ChunkGrapher dimension, MultiGenerator parent) {
this.janerator$grapher = dimension;
this.janerator$parent = parent;
}

@Override
public boolean janerator$notMultiGenerating() {
return Objects.isNull(this.janerator$parent);
}

public void janerator$setDimension(ResourceKey<Level> dimension) {
this.janerator$dimension = dimension;
@Override
public ChunkGrapher janerator$getGrapher() {
return this.janerator$grapher;
}

@Override
public MultiGenerator janerator$getParent() {
return this.janerator$parent;
}

@Inject(
Expand All @@ -39,17 +57,13 @@ public class ChunkGeneratorMixin implements JaneratorGenerator {
StructureTemplateManager templateManager,
CallbackInfo callbackInfo
) {
JaneratorConfig config = JaneratorConfig.getInstance();

if (config.missingPresetFor(this.janerator$dimension)) {
if (this.janerator$notMultiGenerating()) {
return;
}

BlockPos pos = chunk.getPos().getMiddleBlockPosition(0);

GraphProperties dimensionPreset = config.getPresetFor(this.janerator$dimension);

if (dimensionPreset.getGrapher().isPointShaded(pos)) {
if (this.janerator$getGrapher().isPointShaded(pos)) {
callbackInfo.cancel();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,29 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.world.level.levelgen.RandomState;
import net.pixaurora.janerator.config.GraphProperties;
import net.pixaurora.janerator.config.JaneratorConfig;
import net.pixaurora.janerator.worldgen.JaneratorGenerator;

@Mixin(NoiseBasedChunkGenerator.class)
public class NoiseBasedChunkGeneratorMixin implements JaneratorGenerator {
private ResourceKey<Level> janerator$dimension;

public void janerator$setDimension(ResourceKey<Level> dimension) {
this.janerator$dimension = dimension;
}

@Inject(
method = "getBaseHeight(IILnet/minecraft/world/level/levelgen/Heightmap$Types;Lnet/minecraft/world/level/LevelHeightAccessor;Lnet/minecraft/world/level/levelgen/RandomState;)I",
at = @At("HEAD"),
cancellable = true
)
private void janerator$overrideBaseHeight(int x, int z, Heightmap.Types heightmap, LevelHeightAccessor world, RandomState randomState, CallbackInfoReturnable<Integer> cir) {
JaneratorConfig config = JaneratorConfig.getInstance();
NoiseBasedChunkGenerator asGenerator = (NoiseBasedChunkGenerator) (Object) this;

if (config.missingPresetFor(this.janerator$dimension)) {
if (asGenerator.janerator$notMultiGenerating()) {
return;
}

GraphProperties dimensionPreset = config.getPresetFor(this.janerator$dimension);

if (dimensionPreset.getGrapher().isPointShaded(x, z)) {
if (asGenerator.janerator$getGrapher().isPointShaded(x, z)) {
cir.setReturnValue(
dimensionPreset.getShadedGenerator()
asGenerator.janerator$getParent()
.getBaseHeight(x, z, heightmap, world, randomState)
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,22 @@
package net.pixaurora.janerator.worldgen;

import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
import net.pixaurora.janerator.graphing.ChunkGrapher;
import net.pixaurora.janerator.worldgen.generator.MultiGenerator;

public interface JaneratorGenerator {
public default void janerator$setDimension (ResourceKey<Level> dimension) {}
public default void janerator$setupMultiGenerating(ChunkGrapher dimension, MultiGenerator parent) {
throw new RuntimeException("No implementation for `janerator$setGrapher` could be found.");
}

public default boolean janerator$notMultiGenerating() {
throw new RuntimeException("No implementation for `janerator$notMultiGenerating` could be found.");
}

public default ChunkGrapher janerator$getGrapher() {
throw new RuntimeException("No implementation for `janerator$getGrapher` could be found.");
}

public default MultiGenerator janerator$getParent() {
throw new RuntimeException("No implementation for `janerator$getParent` could be found.");
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.pixaurora.janerator.worldgen;
package net.pixaurora.janerator.worldgen.generator;

import java.util.List;
import java.util.concurrent.CompletableFuture;
Expand All @@ -23,69 +23,75 @@
import net.minecraft.world.level.levelgen.RandomState;
import net.minecraft.world.level.levelgen.blending.Blender;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager;
import net.pixaurora.janerator.config.GraphProperties;
import net.pixaurora.janerator.graphing.Coordinate;
import net.pixaurora.janerator.graphing.ChunkGrapher;
import net.pixaurora.janerator.graphing.GraphedChunk;
import net.pixaurora.janerator.worldgen.GeneratorFinder;
import net.pixaurora.janerator.worldgen.PlacementSelection;
import net.pixaurora.janerator.worldgen.WrappedBiomeResolver;

public class MultiGenerator extends ChunkGenerator {
private boolean generatorsInitialized;
private boolean generatorsMapped;
private ChunkGenerator defaultGenerator;
private ChunkGenerator modifiedGenerator;
private ChunkGenerator outlineGenerator;

private GraphProperties dimensionPreset;
private ChunkPos pos;

private GeneratorFinder generators;
private GeneratorFinder biomeGenerators;

public MultiGenerator(
ChunkGrapher grapher,
ChunkGenerator defaultGenerator,
ChunkGenerator modifiedGenerator,
ChunkGenerator outlineGenerator,
ChunkAccess chunk,
GraphProperties dimensionPreset
ChunkAccess chunk
) {
super(defaultGenerator.getBiomeSource());

this.generatorsInitialized = false;
this.generatorsMapped = false;

this.defaultGenerator = defaultGenerator;
this.modifiedGenerator = modifiedGenerator;
this.outlineGenerator = outlineGenerator;

this.pos = chunk.getPos();
this.dimensionPreset = dimensionPreset;

List.of(this, defaultGenerator, modifiedGenerator, outlineGenerator)
.stream()
.forEach(generator -> generator.janerator$setDimension(dimensionPreset.getDimension()));
for (ChunkGenerator generator : List.of(this, defaultGenerator, modifiedGenerator, outlineGenerator)) {
generator.janerator$setupMultiGenerating(grapher, this);
}
}

@Override
public MultiGenerator janerator$getParent() {
throw new RuntimeException("MultiGenerator cannot have a MultiGenerator parent.");
}

@Override
public Codec<? extends ChunkGenerator> codec() {
return CODEC;
}

private void initializeGenerators() {
GraphedChunk graphedArea = dimensionPreset.getGrapher().getChunkGraph(pos);
private void organizeGenerators() {
GraphedChunk graphedArea = this.janerator$getGrapher().getChunkGraph(pos);

this.generators = new GeneratorFinder(graphedArea.getGeneratorMap(this.defaultGenerator, this.modifiedGenerator, this.outlineGenerator));
this.biomeGenerators = new GeneratorFinder(graphedArea.sampleBiomeGeneratorMap(this.defaultGenerator, this.modifiedGenerator));

this.generatorsInitialized = true;
this.generatorsMapped = true;
}

private GeneratorFinder getGenerators() {
if (!generatorsInitialized) {
this.initializeGenerators();
if (!generatorsMapped) {
this.organizeGenerators();
}

return this.generators;
}

private GeneratorFinder getBiomeGenerators() {
if (!generatorsInitialized) {
this.initializeGenerators();
if (!generatorsMapped) {
this.organizeGenerators();
}

return this.biomeGenerators;
Expand Down Expand Up @@ -139,12 +145,12 @@ public CompletableFuture<ChunkAccess> fillFromNoise(

@Override
public int getBaseHeight(int x, int z, Heightmap.Types heightmap, LevelHeightAccessor world, RandomState randomState) {
return this.getGenerators().getAt(new Coordinate(x, z)).getBaseHeight(x, z, heightmap, world, randomState);
return this.modifiedGenerator.getBaseHeight(x, z, heightmap, world, randomState);
}

@Override
public NoiseColumn getBaseColumn(int x, int z, LevelHeightAccessor world, RandomState randomState) {
return this.getGenerators().getAt(new Coordinate(x, z)).getBaseColumn(x, z, world, randomState);
return this.modifiedGenerator.getBaseColumn(x, z, world, randomState);
}

@Override
Expand Down

0 comments on commit 38858dd

Please sign in to comment.