Modifying World Generation

  • Modifying Vanilla Generation

  • Creating Custom Base Terrain

  • Creating Custom GenerationPopulators

  • Creating Custom Populators

  • Creating Custom Biomes

Modifying Vanilla Generation

Megjegyzés

This page assumes that you are familiar with setting up your WorldGeneratorModifier. If not, then please read the article on setting up your modifier at WorldGeneratorModifiers.

Sponge exposes a great deal of vanilla world generation, which can be manipulated through the various interfaces. Currently, the only elements of the generation process that are easily exposed to manipulation are the populators.

Egy gyors példa, nézzük meg, hogy megváltoztatjuk a cactii, hogy spawn, sivatagok, hogy magasabb.

import org.spongepowered.api.world.biome.BiomeGenerationSettings;
import org.spongepowered.api.world.biome.BiomeTypes;
import org.spongepowered.api.world.gen.Populator;
import org.spongepowered.api.world.gen.populator.Cactus;

@Override
public void modifyWorldGenerator(WorldCreationSettings world, DataContainer settings, WorldGenerator worldGenerator) {
    BiomeGenerationSettings desertSettings = worldGenerator.getBiomeSettings(BiomeTypes.DESERT);
    for (Cactus populator : desertSettings.getPopulators(Cactus.class)) {
        populator.setHeight(5);
    }
}

Start by getting the BiomeGenerationSettings for the desert biome. This object is a container for all generation settings relating to that biome. Next, iterate through the list of all Cactus populators and set the height to 5, which means it can only generate cactii which are 5 blocks tall.

Megjegyzés

The Cactus#setHeight(int), and many other similar methods on other populators, also takes a VariableAmount which can be used to specify the height as a range or other custom value.

Ez egy egyszerű példa arra, hogyan kell módosítani egy meglévő populator. Nézzük meg, hogyan tudunk egy új példány egy vanília populator. Ezúttal a populator bővül világszerte, ami azt jelenti, hogy alkalmazni fogják, hogy egész darabokat függetlenül attól, hogy az életközösség. Tegyük hozzá, egy Tök populator globálisan, ami sütőtök, hogy mindenfelé szerte a világon.

import org.spongepowered.api.world.gen.populator.Pumpkin;

@Override
public void modifyWorldGenerator(WorldCreationSettings world, DataContainer settings, WorldGenerator worldGenerator) {
    Pumpkin pumpkinPopulator = Pumpkin.builder().perChunk(12).build();
    worldGenerator.getPopulators().add(pumpkinPopulator);
}

Ellentétben az előző példa, ezúttal létre egy teljesen új populator. Ehhez először meg kell, hogy egy építész számára, hogy populator. Akkor állítsa be a kívánt beállításokat a populator bele - ebben az esetben, szeretnénk egy tucat sütőtök, hogy spawn / patch. Végül hozzáadjuk az új populator, hogy a lista populators, hogy alkalmazzák világszerte, hogy a világon.

Voila, now we have pumpkins everywhere.

Megjegyzés

Ebben a példában ki a sütőtök populator, hogy a végén a populators lista, de meg kell jegyezni, hogy ez a lista parancsot függ. Szóval, ha szeretnéd, hogy az populator, hogy hívják korábban, mint más populators, mint általában egy jó ötlet, Erdei populators, akkor a hozzá kell adni a populator, hogy a start a listán.

E két példa kell, hogy szolgálja, hogy segítsen ismeri a birodalmában dolgozik, vanília populators. Ez csak a felszínét érinti annak, hogy mi lehetséges. Lásd a javadocs a teljes lista elérhető populators, majd a tulajdonságok parancsra.

Creating Custom Base Terrain

Changing the base GenerationPopulator of a world generator allows you to change the base terrain shape generation of the world. A generator populator will roughly follow the procedure of using the seed and biome information to seed and modify a series of noise maps, from which the terrain is formed. The terrain created in a modified base generator populator should only consist of stone blocks, to allow the biomes to properly replace blocks for biome-specific ground cover.

public class SinusoidalGenerator implements GenerationPopulator {

    @Override
    public void populate(World world, MutableBlockVolume buffer, ImmutableBiomeArea biomes) {
        for(int x = buffer.getBlockMin().getX(); x < buffer.getBlockMax().getX(); x++) {
            for(int z = buffer.getBlockMin().getZ(); z < buffer.getBlockMax().getZ(); z++) {
                BiomeType biome = biomes.getBiome(x,z);
                int height = getHeight(x, z, world.getWorldGenerator().getBiomeSettings(biome));
                for(int y = 0; y < height || y < 64; y++) {
                    if(y < height) {
                        buffer.setBlockType(x, y, z, BlockTypes.STONE);
                    } else {
                        buffer.setBlockType(x, y, z, BlockTypes.WATER);
                    }
                }
            }
        }
    }

    private int getHeight(int x, int z, BiomeGenerationSettings biome) {
        double sx = Math.sin(x / 64d) + 1;
        double sz = Math.sin(z / 64d) + 1;
        double value = (sx + sz) / 4d;
        double heightRange = biome.getMaxHeight() - biome.getMinHeight();
        double height = heightRange * value / biome.getMinHeight();
        return GenericMath.floor(height * 256);
    }
}

Ez egy viszonylag egyszerű példát, egy bázis terep generációs populator (legalábbis, ha a múltat nézzük a matek számítani a magasság). Minden oszlop a pufferelt területen akarjuk kiszámítani, magasság-értéket, majd töltse ki mindent, amit az alatt a kő hagyni mindent, fölötte, mint a levegő (vagy víz, ha még mindig a tenger alatt-szint).

Creating Custom GenerationPopulators

Megjegyzés

The API for custom GenerationPopulators isn’t finished yet. This section will be expanded in the future.

Creating Custom Populators

Egyéni populators használható hozzá sokféle egyéni jellemzők. Hozzon létre egy egyéni populator, hogy csak hozzon létre egy osztály végrehajtási a Populator felület, illetve adja hozzá a listához a populators csatolt életközösség, vagy, hogy egy olyan világban, generátor, ha kell alkalmazni világszerte.

Your custom populator will be passed an Extent which is a view onto the world covering the area that you should be applying your populator. It is advised that you do not make any assumptions as to the expected size or position of this extent, as it may be larger or smaller for operations such as regenerating a chunk.

Megjegyzés

Annak engedélyezése, hogy a populator, hogy átfedés darab határokat a populator szabad kiterjeszteni, akár 8 blokkok kívül a határokat a mértékben.

Creating Custom Biomes

While it is currently not possible to create entirely new biomes from within sponge, you can replace the system by which they are arranged in the world be implementing the BiomeGenerator interface and setting your custom biome generator onto a WorldGenerator.

Az alábbi példa egy olyan életközösség, generátor, amely létrehoz egy nagy sziget köré (0, 0).

public class IslandBiomeGen implements BiomeGenerator {

    private static final double ISLAND_SIZE = 200f;
    private static final double BEACH_RADIUS = ISLAND_SIZE * ISLAND_SIZE;
    private static final double FOREST_SIZE = ISLAND_SIZE - 7;
    private static final double FOREST_RADIUS = FOREST_SIZE * FOREST_SIZE;
    private static final double HILLS_SIZE = FOREST_SIZE - 120;
    private static final double HILLS_RADIUS = HILLS_SIZE * HILLS_SIZE;

    @Override
    public void generateBiomes(MutableBiomeArea buffer) {
        Vector2i min = buffer.getBiomeMin();
        Vector2i max = buffer.getBiomeMax();

        for (int x = min.getX(); x <= max.getX(); x++) {
            for (int y = min.getY(); y <= max.getY(); y++) {
                if (x * x + y * y < HILLS_RADIUS) {
                    buffer.setBiome(x, y, BiomeTypes.EXTREME_HILLS);
                } else if (x * x + y * y < FOREST_RADIUS) {
                    buffer.setBiome(x, y, BiomeTypes.FOREST);
                } else if (x * x + y * y < BEACH_RADIUS) {
                    buffer.setBiome(x, y, BiomeTypes.BEACH);
                } else {
                    buffer.setBiome(x, y, BiomeTypes.OCEAN);
                }
            }
        }
    }
}