feat: worldtype generator

This commit is contained in:
Timo Ley 2024-11-16 17:09:52 +01:00
parent 02c79c5f0b
commit 436014999c
5 changed files with 144 additions and 3 deletions

View file

@ -34,6 +34,7 @@ import dev.tilera.cwg.options.OptionRegistry;
import dev.tilera.cwg.proxy.CommonProxy;
import dev.tilera.cwg.vanilla.SingleBiomeChunkManagerFactory;
import dev.tilera.cwg.vanilla.VanillaChunkManagerFactory;
import dev.tilera.cwg.worldtypes.WorldtypeChunkManagerFactory;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.gen.NoiseGenerator;
import net.minecraft.world.gen.NoiseGeneratorOctaves;
@ -93,7 +94,7 @@ public class ClassicWorldgen {
CwgGlobals.getOptionRegistry().registerOption(new BooleanOption("cwg:disable_jungle_melons", "Disable Jungle Melons", false));
CwgGlobals.getOptionRegistry().registerOption(new BooleanOption("cwg:disable_new_flowers", "Disable new Flowers", false));
CwgGlobals.getOptionRegistry().registerOption(new BooleanOption("cwg:disable_tall_flowers", "Disable Tall Flowers", false));
CwgGlobals.getOptionRegistry().registerOption(new StringOption("cwg:dimensions:name", "Dimension Name", "Custom Dimension", true));
CwgGlobals.getOptionRegistry().registerOption(new StringOption("cwg:dimensions:name", "Dimension Name", "Custom Dimension", true, false));
CwgGlobals.getOptionRegistry().registerOption(new IntOption("cwg:dimensions:provider", "Provider ID", Config.dimensionProviderID, true, false));
CwgGlobals.getOptionRegistry().registerOption(new IntOption("cwg:generator.singleBiome:biomeID", "Biome ID", 0, false, true));
}
@ -119,6 +120,7 @@ public class ClassicWorldgen {
CwgGlobals.getGeneratorRegistry().registerChunkManager(new ClassicChunkManagerFactory());
CwgGlobals.getGeneratorRegistry().registerChunkManager(new SingleBiomeChunkManagerFactory());
CwgGlobals.getGeneratorRegistry().registerChunkManager(new InfdevChunkManagerFactory());
CwgGlobals.getGeneratorRegistry().registerChunkManager(new WorldtypeChunkManagerFactory());
}
@SubscribeEvent

View file

@ -10,6 +10,7 @@ public class StringOption implements IOption<String> {
private String displayName;
private String defaultValue;
private boolean isInternal = false;
private boolean generatorSpecific = false;
public StringOption(String id, String displayName, String defaultValue) {
this.id = id;
@ -17,9 +18,10 @@ public class StringOption implements IOption<String> {
this.defaultValue = defaultValue;
}
public StringOption(String id, String displayName, String defaultValue, boolean isInternal) {
public StringOption(String id, String displayName, String defaultValue, boolean isInternal, boolean generatorSpecific) {
this(id, displayName, defaultValue);
this.isInternal = isInternal;
this.generatorSpecific = generatorSpecific;
}
@Override
@ -67,5 +69,10 @@ public class StringOption implements IOption<String> {
return isInternal ? Type.INTERNAL : Type.STRING;
}
@Override
public boolean isGeneratorSpecific() {
return generatorSpecific;
}
}

View file

@ -0,0 +1,66 @@
package dev.tilera.cwg.worldtypes;
import java.util.HashMap;
import java.util.Map;
import dev.tilera.cwg.api.options.IOption;
import net.minecraft.world.WorldType;
public class WorldTypeOption implements IOption<WorldType> {
@Override
public WorldType getDefault() {
return WorldType.DEFAULT;
}
@Override
public String getID() {
return "cwg:generator.worldtype:worldtype";
}
@Override
public String getVisableName() {
return "World Type";
}
@Override
public Class<WorldType> getType() {
return WorldType.class;
}
@Override
public Type getOptionType() {
return Type.ENUM;
}
@Override
public Map<WorldType, String> getPossibleValues() {
Map<WorldType, String> map = new HashMap<>();
for (WorldType t : WorldType.worldTypes) {
if (t == null) continue;
map.put(t, t.getWorldTypeName());
}
return map;
}
@Override
public WorldType decodeString(String input) {
return null;
}
@Override
public WorldType fromRepresentation(String repr) {
return WorldType.parseWorldType(repr);
}
@Override
public String toRepresentation(WorldType obj) {
return obj.getWorldTypeName();
}
@Override
public boolean isGeneratorSpecific() {
return true;
}
}

View file

@ -0,0 +1,64 @@
package dev.tilera.cwg.worldtypes;
import dev.tilera.cwg.DelegateChunkManager;
import dev.tilera.cwg.api.CwgGlobals;
import dev.tilera.cwg.api.generator.AbstractChunkManager;
import dev.tilera.cwg.api.generator.IChunkManagerFactory;
import dev.tilera.cwg.api.hooks.IHookProvider;
import dev.tilera.cwg.api.options.IGeneratorOptionProvider;
import dev.tilera.cwg.api.options.IOption;
import dev.tilera.cwg.api.utils.StringOption;
import dev.tilera.cwg.hooks.ICavegenHook;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.WorldChunkManager;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.ChunkProviderGenerate;
public class WorldtypeChunkManagerFactory implements IChunkManagerFactory {
@Override
public AbstractChunkManager createChunkManager(IGeneratorOptionProvider options, World world) {
WorldType original = world.getWorldInfo().getTerrainType();
WorldType type = options.getValue("cwg:generator.worldtype:worldtype", WorldType.class);
String generatorOptions = options.getString("cwg:generator.worldtype:options");
String gnBack = tempChangeOpts(world, generatorOptions, type);
IChunkProvider provider = type.getChunkGenerator(world, generatorOptions);
WorldChunkManager manager = type.getChunkManager(world);
tempChangeOpts(world, gnBack, original);
if (provider instanceof ChunkProviderGenerate) {
ICavegenHook hook = options.getValue("cwg:cavegen_hook", IHookProvider.class).getHook(ICavegenHook.class);
hook.setCavegen((ChunkProviderGenerate) provider);
}
return new DelegateChunkManager(options, provider, manager);
}
@Override
public String getID() {
return "cwg:worldtype";
}
@Override
public String getDisplayName() {
return "World Type";
}
@Override
public boolean hasSpecificOption(IOption<?> option) {
return option.getID().startsWith("cwg:generator.worldtype:");
}
private String tempChangeOpts(World world, String generatorOptions, WorldType worldType) {
String temp = world.getWorldInfo().generatorOptions;
world.getWorldInfo().generatorOptions = generatorOptions;
world.getWorldInfo().terrainType = worldType;
return temp;
}
@Override
public void onRegister() {
CwgGlobals.getOptionRegistry().registerOption(new WorldTypeOption());
CwgGlobals.getOptionRegistry().registerOption(new StringOption("cwg:generator.worldtype:options", "Worldtype Generator Options", "", false, true));
}
}

View file

@ -9,4 +9,6 @@ public net.minecraft.world.gen.ChunkProviderGenerate field_73233_x # scatteredFe
public net.minecraft.world.gen.ChunkProviderGenerate field_73226_t # caveGenerator
public net.minecraft.world.gen.ChunkProviderGenerate field_73232_y # ravineGenerator
public net.minecraft.world.gen.NoiseGeneratorOctaves field_76306_b # octaves
public net.minecraft.world.gen.NoiseGeneratorOctaves field_76307_a # generatorCollection
public net.minecraft.world.gen.NoiseGeneratorOctaves field_76307_a # generatorCollection
public net.minecraft.world.storage.WorldInfo field_82576_c # generatorOptions
public net.minecraft.world.storage.WorldInfo field_76098_b # terrainType