Skip to content

Commit

Permalink
Try to fix generation
Browse files Browse the repository at this point in the history
  • Loading branch information
Hugman76 committed Aug 8, 2023
1 parent fb92f80 commit 7ce2502
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 14 deletions.
9 changes: 9 additions & 0 deletions src/main/java/com/hugman/uhc/UHC.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.hugman.uhc.registry.UHCRegistries;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Expand All @@ -31,4 +32,12 @@ public void onInitialize() {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated, environment) -> ModulesCommand.register(dispatcher));
GameType.register(UHC.id("uhc"), UHCConfig.CODEC, UHCWaiting::open);
}

public static void debug(String s) {
if(debug()) LOGGER.info(s);
}

public static boolean debug() {
return FabricLoader.getInstance().isDevelopmentEnvironment();
}
}
49 changes: 39 additions & 10 deletions src/main/java/com/hugman/uhc/map/ModuledChunkGenerator.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package com.hugman.uhc.map;

import com.hugman.uhc.UHC;
import com.hugman.uhc.config.UHCConfig;
import com.hugman.uhc.modifier.ModifierType;
import com.hugman.uhc.modifier.PlacedFeaturesModifier;
import com.hugman.uhc.util.ChunkGeneratorSettingsProvider;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import net.minecraft.SharedConstants;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.registry.entry.RegistryEntryList;
Expand All @@ -28,10 +34,9 @@
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.gen.GenerationStep;
import net.minecraft.world.gen.StructureAccessor;
import net.minecraft.world.gen.chunk.Blender;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.VerticalBlockSample;
import net.minecraft.world.gen.chunk.*;
import net.minecraft.world.gen.chunk.placement.StructurePlacementCalculator;
import net.minecraft.world.gen.feature.PlacedFeature;
import net.minecraft.world.gen.noise.NoiseConfig;
import net.minecraft.world.gen.structure.Structure;
import org.jetbrains.annotations.Nullable;
Expand All @@ -40,30 +45,49 @@
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.function.Supplier;

public class ModuledChunkGenerator extends GameChunkGenerator {
public class ModuledChunkGenerator extends GameChunkGenerator implements ChunkGeneratorSettingsProvider {
private final UHCConfig config;
private final long seed;
private final ChunkGenerator subGenerator;
private final ChunkGeneratorSettings settings;

public ModuledChunkGenerator(MinecraftServer server, UHCConfig config) {
super(config.mapConfig().dimension().chunkGenerator().getBiomeSource());
this.config = config;
this.seed = server.getOverworld().getRandom().nextLong();
this.subGenerator = config.mapConfig().dimension().chunkGenerator();
if(this.subGenerator instanceof NoiseChunkGenerator generator) {
this.settings = generator.getSettings().value();
}
else {
this.settings = null;
}
}

@Override
public void generateFeatures(StructureWorldAccess world, Chunk chunk, StructureAccessor structureAccessor) {
BlockPos blockPos = ChunkSectionPos.from(chunk.getPos(), world.getBottomSectionCoord()).getMinPos();
this.subGenerator.generateFeatures(world, chunk, structureAccessor);
var chunkPos = chunk.getPos();
if (SharedConstants.isOutsideGenerationArea(chunkPos)) {
return;
}
var blockPos = ChunkSectionPos.from(chunk.getPos(), world.getBottomSectionCoord()).getMinPos();

ChunkRandom chunkRandom = new ChunkRandom(new Xoroshiro128PlusPlusRandom(this.seed));
chunkRandom.setPopulationSeed(world.getSeed(), blockPos.getX(), blockPos.getZ());

for (PlacedFeaturesModifier piece : this.config.getModifiers(ModifierType.PLACED_FEATURES)) {
piece.generate(world, this, chunkRandom, blockPos);
long popSeed = chunkRandom.setPopulationSeed(world.getSeed(), blockPos.getX(), blockPos.getZ());

List<PlacedFeaturesModifier> placedFeaturesModifiers = this.config.getModifiers(ModifierType.PLACED_FEATURES);
for (int i = 0; i < placedFeaturesModifiers.size(); i++) {
chunkRandom.setDecoratorSeed(popSeed, i, 0);
for(var placedFeatureEntry : placedFeaturesModifiers.get(i).features()) {
Supplier<String> s = () -> placedFeatureEntry.getKey().map(Object::toString).orElseGet(placedFeatureEntry::toString);
world.setCurrentlyGeneratingStructureName(s);
placedFeatureEntry.value().generate(world, this, chunkRandom, blockPos);
}
}
this.subGenerator.generateFeatures(world, chunk, structureAccessor);
world.setCurrentlyGeneratingStructureName(null);
}

/*=================*/
Expand Down Expand Up @@ -169,4 +193,9 @@ public GenerationSettings getGenerationSettings(RegistryEntry<Biome> biomeEntry)
private long getSeed() {
return seed;
}

@Override
public @Nullable ChunkGeneratorSettings getSettings() {
return this.settings;
}
}
4 changes: 2 additions & 2 deletions src/main/java/com/hugman/uhc/map/UHCMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ public class UHCMap {

public UHCMap(UHCConfig config, MinecraftServer server) {
this.config = config;
this.chunkGenerator = config.mapConfig().dimension().chunkGenerator(); // temporary fix
//this.chunkGenerator = new ModuledChunkGenerator(server, config);
//this.chunkGenerator = config.mapConfig().dimension().chunkGenerator(); // temporary fix
this.chunkGenerator = new ModuledChunkGenerator(server, config);
}

public RuntimeWorldConfig createRuntimeWorldConfig() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.hugman.uhc.mixin;

import com.hugman.uhc.util.ChunkGeneratorSettingsProvider;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

/**
* Temporary fix, see <a href="https://github.com/NucleoidMC/fantasy/pull/29">Nucleoid/fantasy #29</a>
*/
@Mixin(ThreadedAnvilChunkStorage.class)
public class ThreadedAnvilChunkStorageMixin {
@Shadow
@Final
private ChunkGenerator chunkGenerator;

@Redirect(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;createMissingSettings()Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;"))
private ChunkGeneratorSettings fantasy$useProvidedChunkGeneratorSettings() {
if (this.chunkGenerator instanceof ChunkGeneratorSettingsProvider provider) {
ChunkGeneratorSettings settings = provider.getSettings();
if (settings != null) return settings;
}

return ChunkGeneratorSettings.createMissingSettings();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ public ModifierType<?> getType() {
}

public void generate(StructureWorldAccess world, ChunkGenerator generator, Random random, BlockPos pos) {
this.features().stream().forEach(entry -> entry.value().generate(world, generator, random, pos));
this.features().forEach(entry -> entry.value().generate(world, generator, random, pos));
}
}
1 change: 0 additions & 1 deletion src/main/java/com/hugman/uhc/module/Module.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ public record Module(String translation, Optional<Either<String, List<String>>>
Modifier.TYPE_CODEC.listOf().fieldOf("modifiers").forGetter(Module::modifiers)
).apply(instance, Module::new));


public static final Codec<RegistryEntry<Module>> REGISTRY_CODEC = RegistryElementCodec.of(UHCRegistries.MODULE, CODEC);
public static final Codec<RegistryEntryList<Module>> LIST_CODEC = RegistryCodecs.entryList(UHCRegistries.MODULE, CODEC);
public static final Codec<List<RegistryEntryList<Module>>> LISTS_CODEC = RegistryCodecs.entryList(UHCRegistries.MODULE, CODEC, true).listOf();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.hugman.uhc.util;

import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import org.jetbrains.annotations.Nullable;

/**
* Allows chunk generators other than noise chunk generators to provide custom chunk generator settings.
*/
public interface ChunkGeneratorSettingsProvider {
@Nullable
ChunkGeneratorSettings getSettings();
}
3 changes: 3 additions & 0 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
"com.hugman.uhc.UHC"
]
},
"mixins": [
"uhc.mixins.json"
],
"depends": {
"java": ">=17",
"minecraft": ">=1.20",
Expand Down
12 changes: 12 additions & 0 deletions src/main/resources/uhc.mixins.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"required": true,
"minVersion": "0.8",
"package": "com.hugman.uhc.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"ThreadedAnvilChunkStorageMixin"
],
"injectors": {
"defaultRequire": 1
}
}

0 comments on commit 7ce2502

Please sign in to comment.