Introduce BCLChunkGenerator class

This commit is contained in:
Frank 2022-05-22 03:26:03 +02:00
parent ab0895d48c
commit 0a5a608b7d
17 changed files with 84 additions and 73 deletions

View file

@ -13,7 +13,7 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import com.mojang.datafixers.util.Pair;
import org.betterx.bclib.api.biomes.BiomeAPI;
import org.betterx.bclib.presets.WorldPresets;
import org.betterx.bclib.presets.worldgen.WorldPresets;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;

View file

@ -0,0 +1,22 @@
package org.betterx.bclib.mixin.common;
import net.minecraft.core.Registry;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.chunk.ChunkGenerators;
import com.mojang.serialization.Codec;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.presets.worldgen.BCLChunkGenerator;
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.CallbackInfoReturnable;
@Mixin(ChunkGenerators.class)
public class ChunkGeneratorsMixin {
@Inject(method = "bootstrap", at = @At(value = "HEAD"))
private static void bcl_bootstrap(Registry<Codec<? extends ChunkGenerator>> registry,
CallbackInfoReturnable<Codec<? extends ChunkGenerator>> cir) {
Registry.register(registry, BCLib.makeID("betterx"), BCLChunkGenerator.CODEC);
}
}

View file

@ -2,7 +2,7 @@ package org.betterx.bclib.mixin.common;
import net.minecraft.server.dedicated.DedicatedServerProperties;
import org.betterx.bclib.presets.WorldPresets;
import org.betterx.bclib.presets.worldgen.WorldPresets;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg;
public class DedicatedServerPropertiesMixin {
//Make sure the default server properties use our Default World Preset
@ModifyArg(method = "<init>", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties$WorldGenProperties;<init>(Ljava/lang/String;Lcom/google/gson/JsonObject;ZLjava/lang/String;)V"))
private String bcl_foo(String levelType) {
private String bcl_init(String levelType) {
return WorldPresets.DEFAULT.orElseThrow().location().toString();
}
}

View file

@ -22,14 +22,14 @@ public class MultiPackResourceManagerMixin {
@Inject(method = "getResource", at = @At("HEAD"), cancellable = true)
private void bclib_hasResource(ResourceLocation resourceLocation, CallbackInfoReturnable<Optional<Resource>> info) {
if (resourceLocation.getNamespace().equals("minecraft")) {
for (String key : BCLIB_MISSING_RESOURCES) {
if (resourceLocation.getPath().equals(key)) {
info.setReturnValue(Optional.empty());
info.cancel();
return;
}
}
}
// if (resourceLocation.getNamespace().equals("minecraft")) {
// for (String key : BCLIB_MISSING_RESOURCES) {
// if (resourceLocation.getPath().equals(key)) {
// info.setReturnValue(Optional.empty());
// info.cancel();
// return;
// }
// }
// }
}
}

View file

@ -1,16 +1,14 @@
package org.betterx.bclib.mixin.common;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.core.Registry;
import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.levelgen.*;
import net.minecraft.world.level.levelgen.blending.Blender;
import net.minecraft.world.level.levelgen.carver.CarvingContext;
import net.minecraft.world.level.levelgen.synth.NormalNoise;
import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider;
import org.betterx.bclib.interfaces.SurfaceProvider;
@ -19,7 +17,6 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import java.lang.reflect.Constructor;
import java.util.Optional;
@Mixin(NoiseBasedChunkGenerator.class)
public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider, NoiseGeneratorSettingsProvider {
@ -27,6 +24,9 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider,
@Shadow
protected Holder<NoiseGeneratorSettings> settings;
@Shadow
@Final
private Registry<NormalNoise.NoiseParameters> noises;
@Final
@Shadow
private Aquifer.FluidPicker globalFluidPicker;
@ -39,32 +39,15 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider,
return settings.value();
}
@Override
public Registry<NormalNoise.NoiseParameters> bclib_getNoises() {
return noises;
}
@Shadow
protected abstract NoiseChunk createNoiseChunk(ChunkAccess chunkAccess,
StructureManager structureManager,
Blender blender,
RandomState randomState);
@Override
@SuppressWarnings("deprecation")
public BlockState bclib_getSurface(BlockPos pos, Holder<Biome> biome, ServerLevel level) {
ChunkAccess chunkAccess = level.getChunk(pos.getX() >> 4, pos.getZ() >> 4);
StructureManager structureManager = level.structureManager();
NoiseBasedChunkGenerator generator = NoiseBasedChunkGenerator.class.cast(this);
RandomState randomState = level.getChunkSource().randomState();
NoiseChunk noiseChunk = chunkAccess.getOrCreateNoiseChunk(ca -> this.createNoiseChunk(ca,
structureManager,
Blender.empty(),
randomState));
CarvingContext carvingContext = new CarvingContext(generator,
level.registryAccess(),
chunkAccess.getHeightAccessorForGeneration(),
noiseChunk,
randomState,
this.settings.value().surfaceRule());
Optional<BlockState> optional = carvingContext.topMaterial(bpos -> biome, chunkAccess, pos, false);
return optional.isPresent() ? optional.get() : bclib_air;
}
}

View file

@ -12,6 +12,8 @@ import java.util.Map;
@Mixin(PresetEditor.class)
interface PresetEditorMixin {
//Make Sure the PresetEditor.EDITORS Field is a mutable List. Allows us to add new Custom WorldPreset UIs in
//WorldPresetsUI
@Redirect(method = "<clinit>", at = @At(value = "INVOKE", target = "Ljava/util/Map;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;"))
private static <K, V> Map<K, V> bcl_foo(K k1, V v1, K k2, V v2) {
Map<K, V> a = Maps.newHashMap();

View file

@ -4,7 +4,7 @@ import net.minecraft.resources.ResourceKey;
import net.minecraft.server.dedicated.DedicatedServerProperties;
import net.minecraft.world.level.levelgen.presets.WorldPreset;
import org.betterx.bclib.presets.WorldPresets;
import org.betterx.bclib.presets.worldgen.WorldPresets;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;

View file

@ -51,17 +51,17 @@ public abstract class WorldPresetsBootstrapMixin {
@ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;"))
private LevelStem bcl_getOverworldStem(LevelStem overworldStem) {
WorldPreset preset = new org.betterx.bclib.presets.WorldPresets.SortableWorldPreset(
WorldPreset preset = new org.betterx.bclib.presets.worldgen.WorldPresets.SortableWorldPreset(
Map.of(LevelStem.OVERWORLD,
overworldStem,
LevelStem.NETHER,
org.betterx.bclib.presets.WorldPresets.getBCLNetherLevelStem(this.biomes,
org.betterx.bclib.presets.worldgen.WorldPresets.getBCLNetherLevelStem(this.biomes,
this.netherDimensionType,
this.structureSets,
this.noises,
this.netherNoiseSettings),
LevelStem.END,
org.betterx.bclib.presets.WorldPresets.getBCLEndLevelStem(this.biomes,
org.betterx.bclib.presets.worldgen.WorldPresets.getBCLEndLevelStem(this.biomes,
this.endDimensionType,
this.structureSets,
this.noises,
@ -69,7 +69,7 @@ public abstract class WorldPresetsBootstrapMixin {
), 0
);
BuiltinRegistries.register(this.presets, org.betterx.bclib.presets.WorldPresets.BCL_WORLD, preset);
BuiltinRegistries.register(this.presets, org.betterx.bclib.presets.worldgen.WorldPresets.BCL_WORLD, preset);
return overworldStem;
}