Dünya Üretimini Değiştirme

Uyarı

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

  • Vanilya Üretimini Değiştirme

  • Özel Temel Arazi Oluşturma

  • Özel Nesil Kapayıcıları Oluşturma

  • Özel Popülatör Oluşturma

  • Özel Biyomlar Yaratmak

Vanilya Üretimini Değiştirme

Not

Bu sayfada, :javadoc:’WorldGeneratorModifier’ ayarını yapmayı bildiğinizi varsayılmaktadır. Değilse, değiştiriciyi ayarlama hakkındaki makaleyi lütfen :doc:’modifiers’ bölümünde okuyun.

Sponge, çeşitli arayüzlerle manipule edilebilen çok sayıda vanilla dünyası neslini ortaya çıkarmaktadır. Şu anda, üretim sürecinin manipülasyona easily maruz bırakılabilen tek unsuru popülatörlerdir.

For a quick example, let’s look at how we would change the cacti that spawn in deserts to be taller.

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(WorldProperties world, DataContainer settings, WorldGenerator worldGenerator) {
    BiomeGenerationSettings desertSettings = worldGenerator.getBiomeSettings(BiomeTypes.DESERT);
    for (Cactus populator : desertSettings.getPopulators(Cactus.class)) {
        populator.setHeight(5);
    }
}

Çöl biyomüarı için :javadoc:’BiomeGenerationSettings’a gidin. Bu nesne, biome ile ilgili tüm nesil ayarlar için bir konteynırdır. Sonra, all:javadoc:’Cactus’ popülatörleri listesinde yineleme yapın ve yüksekliği 5 olarak ayarlayın; bu, yalnızca 5 blok boyunda olan kaktüsler üretebileceği anlamına gelir.

Not

:Javadoc:’Cactus#setHeight(int)’, ve diğer populatörler birçok diğer benzer yöntemler, aynı zamanda bir alır :javadoc:’VariableAmount’ bir dizi ya da başka bir özel değer olarak yüksekliğini belirlemek için kullanılabilir.

Bu, mevcut bir popülatörü değiştirmenin basit bir örneğini oluşturmuştur. Bir vanilya popülatörünün yeni bir örneğini nasıl ekleyebildiğimize bakalım. Bu sefer popülatör küresel olarak eklenecek, bu da biyomların bağımsız olarak tüm parçalara uygulanacağı anlamına geliyor. Dünyada her yere dağılmış kabaklara neden olan, Kabak popülatörünü küresel olarak ekleyelim.

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

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

Önceki örneğin aksine, bu sefer tamamen yeni bir popülatör yaratıyorsunuz. Bunu yapmak için, öncelikle o popülatör için bir yapıcı edinmeniz gerekir. Ardından popülatör için istediğiniz ayarları yapın - bu durumda, yama başına bir düzine bal kabağının yumurtlamasını istiyoruz. Son olarak, yeni popülatörünüzü dünyaya küresel olarak uygulanan popülatörler listesine ekleyin.

Ve işte!, şimdi her yerde bal kabaklarımız var.

Not

In this example we added the pumpkin populator to the end of the populators list, but it should be noted that this list is order dependent. So, if you would like your populator to be called earlier than other populators, as is usually a good idea with Forest populators, then you should add your populator to the start of the list.

Bu iki örnek, vanilla popülatörleri ile çalışma alanını tanımanıza yardımcı olması için hizmet etmelidir. Bu sadece mümkün olanın yüzeyine dokunuyor. Mevcut popülatörlerin ve özelliklerinin tam listesi için javadocs’a bakın. Bu iki örnek, vanilya popülatörleriyle çalışma alanını tanımanıza yardımcı olması için hizmet etmelidir. Bu sadece mümkün olanın yüzeyine dokunuyor. Mevcut popülatörlerin ve özelliklerinin tam listesi için javadocs’a bakın.

Özel Temel Arazi Oluşturma

Temelin değiştirilmesi: Bir dünya jeneratörünün :javadoc:’GenerationPopulator’, dünyanın temel arazi şekli üretimini değiştirmenize izin verir. Bir jeneratör popülatörü, arazinin oluşturulduğu bir dizi gürültü haritasını tohumlamak ve değiştirmek için tohum ve biyolojik bilgi kullanma prosedürünü kabaca takip edecektir. Değiştirilmiş bir baz jeneratör popülatöründe yaratılan arazi, sadece biyomlara özgü zemin kaplaması için blokların yerini alması için taş bloklardan oluşmalıdır.

public class SinusoidalGenerator implements GenerationPopulator {

    @Override
    public void populate(World world, MutableBlockVolume buffer, ImmutableBiomeVolume 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, 64, 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);
    }
}

Bu, bir temel arazi üretimi popülatörünün oldukça basit bir örneğidir (en azından eğer yüksekliği hesaplamak için matematiğe bakarsanız). Tamponlanmış bölgedeki her sütun için bir yükseklik değeri hesaplamak ve bunun altındaki her şeyi taşla doldurmak ve her şeyin üstünü havadan (ya da deniz seviyesinin altında ise) bırakmak istiyoruz.

Özel Nesil Kapayıcıları Oluşturma

Not

Özel Nesil Popülatörleri için API henüz bitmedi. Bu bölüm gelecekte genişletilecek.

Özel Popülatör Oluşturma

Özel popülatörler çok çeşitli özel özellikler eklemek için kullanılabilir. Özel bir popülatör oluşturmak için yalnızca Populator arayüzünü uygulayan bir sınıf oluşturmanız yeterlidir ve bir biome’a eklenmiş popülatörler listesine ekleyin veya dünya genelinde uygulanmasını isterseniz bir dünya jeneratörüne ekleyin.

Özel popülatörünüz, popülatörünüzü uygulamanız gereken alanı kapsayan, dünyaya bir görünüm olan bir “Genişlik” e devredilecek. Beklenen boyut ya da konuma ilişkin herhangi bir varsayımda bulunmamanız tavsiye edilir, çünkü bir yığın yeniden oluşturulması gibi işlemler için daha büyük ya da daha küçük olabilir.

Not

Popülatörünüzün yığın sınırlarını aşmasına izin vermek için, popülatörünüzün sınırın sınırlarının dışındaki 8 bloğa kadar uzatılmasına izin verilir.

Özel Biyomlar Yaratmak

Şu anda, sünger içinden tamamen yeni biyomaklar yaratmak mümkün değildir :javadoc: BiomeGenerator arayüzünü uygulayarak ve özel biome jeneratörünüzü bir WorldGenerator’a yerleştirirken dünyada düzenledikleri sistemi değiştirebilirsiniz.

Aşağıda, etrafında merkezlenmiş büyük bir ada yaratan bir biyome jeneratörüne bir örnek verilmiştir (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(MutableBiomeVolume buffer) {
        Vector3i min = buffer.getBiomeMin();
        Vector3i max = buffer.getBiomeMax();

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