fix preset creation

This commit is contained in:
dfsek 2023-04-13 18:15:35 -07:00
parent 6f2c01ceb3
commit ca2fe27fb3
6 changed files with 57 additions and 27 deletions

View File

@ -0,0 +1,13 @@
package com.dfsek.terra.mod.mixin.access;
import net.minecraft.world.dimension.DimensionOptions;
import net.minecraft.world.gen.WorldPreset;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(targets = "net.minecraft.world.gen.WorldPresets$Registrar")
public interface WorldPresetsRegistrarAccessor {
@Invoker("createPreset")
WorldPreset callCreatePreset(DimensionOptions dimensionOptions);
}

View File

@ -0,0 +1,23 @@
package com.dfsek.terra.mod.mixin.lifecycle;
import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder;
import com.dfsek.terra.mod.mixin_ifaces.RegistrarInstance;
import net.minecraft.registry.Registerable;
import net.minecraft.world.gen.WorldPreset;
import net.minecraft.world.gen.WorldPresets;
import org.spongepowered.asm.mixin.Implements;
import org.spongepowered.asm.mixin.Interface;
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;
@Mixin(WorldPresets.Registrar.class)
public class WorldPresetsRegistrarMixin {
@Inject(at = @At("RETURN"), method = "<init>")
public void injectConstructor(Registerable<WorldPreset> presetRegisterable, CallbackInfo ci) {
RegistrarInstance.INSTANCE = (WorldPresets.Registrar) (Object) this;
}
}

View File

@ -0,0 +1,8 @@
package com.dfsek.terra.mod.mixin_ifaces;
import net.minecraft.world.gen.WorldPresets;
public class RegistrarInstance {
public static WorldPresets.Registrar INSTANCE;
}

View File

@ -2,19 +2,26 @@ package com.dfsek.terra.mod.util;
import com.dfsek.terra.mod.ModPlatform;
import com.dfsek.terra.mod.mixin.access.WorldPresetsRegistrarAccessor;
import com.dfsek.terra.mod.mixin_ifaces.RegistrarInstance;
import net.minecraft.registry.DynamicRegistryManager;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryEntryLookup;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.util.Identifier;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.source.MultiNoiseBiomeSource;
import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList;
import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterLists;
import net.minecraft.world.biome.source.TheEndBiomeSource;
import net.minecraft.world.dimension.DimensionOptions;
import net.minecraft.world.dimension.DimensionType;
import net.minecraft.world.dimension.DimensionTypes;
import net.minecraft.world.gen.WorldPreset;
import net.minecraft.world.gen.WorldPresets;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import net.minecraft.world.gen.chunk.NoiseChunkGenerator;
@ -40,25 +47,7 @@ public class PresetUtil {
Registry<DimensionType> dimensionTypeRegistry = platform.dimensionTypeRegistry();
Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry();
RegistryEntry<DimensionType> theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow();
RegistryEntry<ChunkGeneratorSettings>
netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow();
DimensionOptions netherDimensionOptions = new DimensionOptions(theNetherDimensionType,
new NoiseChunkGenerator(
MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource(
platform.biomeRegistry().getReadOnlyWrapper()),
netherChunkGeneratorSettings));
RegistryEntry<DimensionType> theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow();
RegistryEntry<ChunkGeneratorSettings> endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(
ChunkGeneratorSettings.END).orElseThrow();
DimensionOptions endDimensionOptions = new DimensionOptions(theEndDimensionType,
new NoiseChunkGenerator(
TheEndBiomeSource.createVanilla(
platform.biomeRegistry().getReadOnlyWrapper()),
endChunkGeneratorSettings));
RegistryEntry<DimensionType> overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow();
RegistryEntry<ChunkGeneratorSettings> overworld = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.OVERWORLD)
.orElseThrow();
@ -71,13 +60,7 @@ public class PresetUtil {
ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld);
DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator);
WorldPreset preset = new WorldPreset(
Map.of(
DimensionOptions.OVERWORLD, dimensionOptions,
DimensionOptions.NETHER, netherDimensionOptions,
DimensionOptions.END, endDimensionOptions
)
);
WorldPreset preset = ((WorldPresetsRegistrarAccessor) RegistrarInstance.INSTANCE).callCreatePreset(dimensionOptions);
LOGGER.info("Created world type \"{}\"", generatorID);
return Pair.of(generatorID, preset);
}

View File

@ -1,2 +1,3 @@
accessWidener v1 named
accessible class net/minecraft/world/biome/Biome$Weather
accessible class net/minecraft/world/biome/Biome$Weather
accessible class net/minecraft/world/gen/WorldPresets$Registrar

View File

@ -9,6 +9,7 @@
"access.StateAccessor",
"access.StructureAccessorAccessor",
"access.VillagerTypeAccessor",
"access.WorldPresetsRegistrarAccessor",
"fix.BeeMoveGoalsUnsynchronizedRandomAccessFix",
"fix.NetherFossilOptimization",
"implementations.compat.GenerationSettingsFloraFeaturesMixin",
@ -36,7 +37,8 @@
"implementations.terra.inventory.meta.ItemStackMetaMixin",
"implementations.terra.world.ChunkRegionMixin",
"implementations.terra.world.ServerWorldMixin",
"lifecycle.DataPackContentsMixin"
"lifecycle.DataPackContentsMixin",
"lifecycle.WorldPresetsRegistrarMixin"
],
"client": [
],