Dünya Üretimini Değiştirme

  • 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.

Hızlı bir örnek için, çöllerde yumurtlayan kaktüslerin daha uzun olmasını nasıl değiştireceğimizi inceleyelim.

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);
    }
}

Çö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(WorldCreationSettings 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

Bu örnekte, popülatör listesinin sonuna kabak popülatörü ekledik, ancak bu listenin siparişe bağlı olduğuna dikkat edilmelidir. Dolayısıyla popülatörünüzün diğer popülatörlerden daha önce çağırılmasını istiyorsanız, ormandaki popülatörler ile iyi bir fikir olduğu için popülatörünüzü listenin başına ekleyin.

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, 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);
    }
}

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(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);
                }
            }
        }
    }
}