The basics aren't that hard. The world type class itself looks like this:
package your.mod.generation;
import javax.annotation.Nonnull;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.BiomeProvider;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.ChunkGeneratorOverworld;
import net.minecraft.world.gen.IChunkGenerator;
public class YourWorldType extends WorldType {
private static BiomeProvider biomeProvider;
public static IChunkProvider chunkProvider;
public YourWorldType() {
super("name of your world type");
}
public IChunkGenerator getChunkGenerator(World world, String generatorOptions) {
return new ChunkGeneratorOverworld(world, world.getSeed(),
world.getWorldInfo().isMapFeaturesEnabled(), generatorOptions);
}
@Override @Nonnull
public BiomeProvider getBiomeProvider(@Nonnull World world) {
//return a copy of your biome provider (could even be from vanilla)
}
}
Your main mod class should have an instance of the type, and preinit should have a line that initializes it.
What you actually do with it, from there (biomes, biome / chunk providers, etc.) is up to you, and could be simple or very complicated.
This is to create a new type and add it as an option to the start menus for starting a new world (the name should be unlocalized, keyed to lang files).
If you want to create a dimension with its own world type I would recommend the "Up To Date Minecraft Modding" Youtube series by Harry Talks.