Генерация

1,057
50
234
Добрый день. Делаю аддон для GC3


Вопрос: как сделать подобную генерацию измерения?
PIA16826-1440x900.jpg


Т.е.

Основной слой кастомного блока(TestBlocks.blockone пример), а сверху снег, только не везде, а в случайных местах.

И как сделать каньоны, длинные, километровые.

Код:
Код:
package blessentumble.moons.europajupiter.dimension;

 

import java.util.ArrayList;
import java.util.List;

import micdoodle8.mods.galacticraft.api.prefab.core.BlockMetaPair;
import micdoodle8.mods.galacticraft.api.prefab.world.gen.BiomeDecoratorSpace;
import micdoodle8.mods.galacticraft.api.prefab.world.gen.ChunkProviderSpace;
import micdoodle8.mods.galacticraft.api.prefab.world.gen.MapGenBaseMeta;
import micdoodle8.mods.galacticraft.core.blocks.GCBlocks;
import micdoodle8.mods.galacticraft.core.entities.EntityEvolvedCreeper;
import micdoodle8.mods.galacticraft.core.entities.EntityEvolvedSkeleton;
import micdoodle8.mods.galacticraft.core.entities.EntityEvolvedZombie;
import micdoodle8.mods.galacticraft.core.world.gen.dungeon.MapGenDungeon;
import micdoodle8.mods.galacticraft.planets.mars.world.gen.MapGenCaveMars;
import micdoodle8.mods.galacticraft.planets.mars.world.gen.MapGenCavernMars;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraftforge.common.util.ForgeDirection;
import blessentumble.moons.europajupiter.blocks.EuropaBlocks;
import blessentumble.moons.europajupiter.world.gen.BiomeDecoratorEuropa;
import blessentumble.moons.europajupiter.world.gen.dungeon.RoomBossEuropa;
import blessentumble.moons.europajupiter.world.gen.dungeon.RoomChestsEuropa;
import blessentumble.moons.europajupiter.world.gen.dungeon.RoomEmptyEuropa;
import blessentumble.moons.europajupiter.world.gen.dungeon.RoomSpawnerEuropa;
import blessentumble.moons.europajupiter.world.gen.dungeon.RoomTreasureEuropa;

import com.google.common.collect.Lists;


 

public class ChunkProviderEuropa extends ChunkProviderSpace {

    
    private final BiomeDecoratorEuropa marsBiomeDecorator = new BiomeDecoratorEuropa();
    private final MapGenCaveMars cavernGenerator = new MapGenCaveMars();
    
     private final MapGenDungeon dungeonGenerator = new MapGenDungeon(GCBlocks.blockMoon, 14, 8, 16, 3);
     
     {
         this.dungeonGenerator.otherRooms.add(new RoomEmptyEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomSpawnerEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomChestsEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.otherRooms.add(new RoomChestsEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.bossRooms.add(new RoomBossEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         this.dungeonGenerator.treasureRooms.add(new RoomTreasureEuropa(null, 0, 0, 0, ForgeDirection.UNKNOWN));
         
     }

 
     @Override
        protected List<MapGenBaseMeta> getWorldGenerators()
        {
            List<MapGenBaseMeta> generators = Lists.newArrayList();
            generators.add(this.cavernGenerator);
            return generators;
        }

    public ChunkProviderEuropa(World par1World, long seed, boolean mapFeaturesEnabled) 
    
    {
        super(par1World, seed, mapFeaturesEnabled);
   
    }

      
    @Override

    protected BiomeDecoratorSpace getBiomeGenerator() {

        // TODO Auto-generated method stub

        return new BiomeDecoratorEuropa();

    }

 

     //This should be a custom biome for your mod, but I'm opting to go desert instead out of quickness

    //and the fact that biomes are outside the scope of this tutorial

    @Override

    protected BiomeGenBase[] getBiomesForGeneration() {

        // TODO make phobos biome

        return new BiomeGenBase[]{BiomeGenBase.extremeHillsPlus};

    }

 

    @Override

    public int getCraterProbability() {

        return 2000;

    }

 

    @Override

    protected SpawnListEntry[] getCreatures() {

     

        return new SpawnListEntry[]{};

    }

    @Override

    protected BlockMetaPair getStoneBlock() {

        // TODO Auto-generated method stub

        return new BlockMetaPair(EuropaBlocks.EuropaIce, (byte) 4);

    }

    @Override

    protected BlockMetaPair getDirtBlock() {

        // TODO Auto-generated method stub

        return new BlockMetaPair(Blocks.dirt, (byte) 3);

    }

 

    @Override

    protected BlockMetaPair getGrassBlock() {

        // TODO Auto-generated method stub

        return new BlockMetaPair(Blocks.ice, (byte) 1);

    }

 

    @Override

    public double getHeightModifier() {

        // TODO Auto-generated method stub

        return 10;

    }

 

    @Override

    protected SpawnListEntry[] getMonsters() {

        SpawnListEntry skele = new SpawnListEntry(EntityEvolvedSkeleton.class, 100, 4, 4);

        SpawnListEntry creeper = new SpawnListEntry(EntityEvolvedCreeper.class, 100, 4, 4);

        SpawnListEntry zombie = new SpawnListEntry(EntityEvolvedZombie.class, 100, 4, 4);

      

        return new SpawnListEntry[]{skele, creeper, zombie};

    }

 

    @Override

    public double getMountainHeightModifier() {

        return 10;

    }

 

    @Override

    protected int getSeaLevel() {

        return 70;

    }

 

    @Override

    public double getSmallFeatureHeightModifier() {

        return 0;

    }

 

    @Override

    public double getValleyHeightModifier() {

        return 0;

    }


    @Override

    public void onChunkProvide(int cX, int cZ, Block[] blocks, byte[] metadata) {
        
        this.dungeonGenerator.generateUsingArrays(this.worldObj, this.worldObj.getSeed(), cX * 16, 30, cZ * 16, cX, cZ, blocks, metadata);
    }

 

    @Override

    public void onPopulate(IChunkProvider arg0, int arg1, int arg2){
        
        this.dungeonGenerator.handleTileEntities(this.rand);

    }

   
    @Override

    public boolean chunkExists(int x, int y){

        return false;

    }

 

}
 
Сделать свой биом, с кастомным верхним блоком и кастомным нижним блоком. Декорировать этот биом, делая в нем каньоны по типу ванильных каньонов, и генерировать рандомные "залежи" этого снега.
 
В коде, который я предоставил, есть следующее:

Код:
@Override

 protected BlockMetaPair getStoneBlock() {

 // TODO Auto-generated method stub

 return new BlockMetaPair(EuropaBlocks.EuropaIce, (byte) 4);

 }

 @Override

 protected BlockMetaPair getDirtBlock() {

 // TODO Auto-generated method stub

 return new BlockMetaPair(Blocks.dirt, (byte) 3);

 }

 

 @Override

 protected BlockMetaPair getGrassBlock() {

 // TODO Auto-generated method stub

 return new BlockMetaPair(Blocks.ice, (byte) 1);

 }
Что как-бы намекает на слои.

Вопрос остается в том, как сделать сверху снег, расположенный в случайных районах?

И еще вопрос, где в gradle лежат сурсы mc 1.7.10?
 
@Override
        protected List<MapGenBaseMeta> getWorldGenerators()
        {
            List<MapGenBaseMeta> generators = Lists.newArrayList();
            generators.add(this.cavernGenerator);
            return generators;
        }
Добавь туда свой генератор ущелий и свой генератор снега.
 
Dragon2488 написал(а):
@Override
        protected List<MapGenBaseMeta> getWorldGenerators()
        {
            List<MapGenBaseMeta> generators = Lists.newArrayList();
            generators.add(this.cavernGenerator);
            return generators;
        }
Добавь туда свой генератор ущелий и свой генератор снега.
А можно пример файла?
 
Не представляю просто, как выглядит банальный код на снег в разных участках.

В учебнике на данном сайте такого не нашел.
 
Что-то нахимичил....
Блоки снега генерировались над поверхностью...

Нашел какой-то WorldGen файл, запихал его.
Итог =D


y83uaynmvnbq.png
 
Дык воздух заменять надо же.
 
Код:
package blessentumble.moons.europajupiter.world.gen;

import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.init.Blocks;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;

public class WorldGenSnow extends WorldGenerator
{
 private Block block;
 private Block spreadBlock;
 private int spreadBlockMeta;

 public WorldGenSnow(Block block, Block spreadBlock, int spreadBlockMeta)
 {
 this.block = block;
 this.spreadBlock = spreadBlock;
 this.spreadBlockMeta = spreadBlockMeta;
 }

 @Override
 public boolean generate(World world, Random rand, int x, int y, int z)
 {
 x -= 8;
 z -= 8;

 while (y > 5 && world.isAirBlock(x, y, z))
 {
 y--;
 }
 if (y <= 4)
 {
 return false;
 }

 y -= 4;
 boolean[] arrayOfBoolean = new boolean[2048];
 int i = rand.nextInt(4) + 4;

 for (int j = 0; j < i; j++)
 {
 double d1 = rand.nextDouble() * 6.0D + 3.0D;
 double d2 = rand.nextDouble() * 4.0D + 2.0D;
 double d3 = rand.nextDouble() * 6.0D + 3.0D;
 double d4 = rand.nextDouble() * (16.0D - d1 - 2.0D) + 1.0D + d1 / 2.0D;
 double d5 = rand.nextDouble() * (8.0D - d2 - 4.0D) + 2.0D + d2 / 2.0D;
 double d6 = rand.nextDouble() * (16.0D - d3 - 2.0D) + 1.0D + d3 / 2.0D;

 for (int i2 = 1; i2 < 15; i2++)
 {
 for (int i3 = 1; i3 < 15; i3++)
 {
 for (int i4 = 1; i4 < 7; i4++)
 {
 double d7 = (i2 - d4) / (d1 / 2.0D);
 double d8 = (i4 - d5) / (d2 / 2.0D);
 double d9 = (i3 - d6) / (d3 / 2.0D);
 double d10 = d7 * d7 + d8 * d8 + d9 * d9;

 if (d10 < 1.0D)
 {
 arrayOfBoolean[(i2 * 16 + i3) * 8 + i4] = true;
 }
 }
 }
 }
 }

 int k;
 int m;

 for (int j = 0; j < 16; j++)
 {
 for (k = 0; k < 16; k++)
 {
 for (m = 0; m < 8; m++)
 {
 int n = arrayOfBoolean[(j * 16 + k) * 8 + m] && (j < 15 && arrayOfBoolean[((j + 1) * 16 + k) * 8 + m] || j > 0 && arrayOfBoolean[((j - 1) * 16 + k) * 8 + m] || k < 15 && arrayOfBoolean[(j * 16 + k + 1) * 8 + m] || k > 0 && arrayOfBoolean[(j * 16 + k - 1) * 8 + m] || m < 7 && arrayOfBoolean[(j * 16 + k) * 8 + m + 1] || m > 0 && arrayOfBoolean[(j * 16 + k) * 8 + m - 1]) ? 1 : 0;

 if (n != 0)
 {
 Material localMaterial = world.getBlock(x + j, y + m, z + k).getMaterial();

 if (m >= 4 && localMaterial.isLiquid())
 {
 return false;
 }
 if (m < 4 && !localMaterial.isSolid() && world.getBlock(x + j, y + m, z + k) != this.block)
 {
 return false;
 }
 }
 }
 }
 }
 for (int j = 0; j < 16; j++)
 {
 for (k = 0; k < 16; k++)
 {
 for (m = 0; m < 8; m++)
 {
 if (arrayOfBoolean[(j * 16 + k) * 8 + m])
 {
 world.setBlock(x + j, y + m, z + k, m >= 4 ? Blocks.air : this.block, 0, 2);
 }
 }
 }
 }
 for (int j = 0; j < 16; j++)
 {
 for (k = 0; k < 16; k++)
 {
 for (m = 4; m < 8; m++)
 {
 if (arrayOfBoolean[(j * 16 + k) * 8 + m] && world.getBlock(x + j, y + m - 1, z + k) == Blocks.dirt && world.getSavedLightValue(EnumSkyBlock.Sky, x + j, y + m, z + k) > 0)
 {
 world.setBlock(x + j, y + m - 1, z + k, Blocks.grass, 0, 2);
 }
 }
 }
 }
 if (this.block.getMaterial() == Material.snow)
 {
 for (int j = 0; j < 16; j++)
 {
 for (k = 0; k < 16; k++)
 {
 for (m = 0; m < 8; m++)
 {
 int i1 = arrayOfBoolean[(j * 16 + k) * 8 + m] && (j < 15 && arrayOfBoolean[((j + 1) * 16 + k) * 8 + m] || j > 0 && arrayOfBoolean[((j - 1) * 16 + k) * 8 + m] || k < 15 && arrayOfBoolean[(j * 16 + k + 1) * 8 + m] || k > 0 && arrayOfBoolean[(j * 16 + k - 1) * 8 + m] || m < 7 && arrayOfBoolean[(j * 16 + k) * 8 + m + 1] || m > 0 && arrayOfBoolean[(j * 16 + k) * 8 + m - 1]) ? 1 : 0;

 if (i1 != 0 && (m < 4 || rand.nextInt(2) != 0) && world.getBlock(x + j, y + m, z + k).getMaterial().isSolid())
 {
 world.setBlock(x + j, y + m, z + k, this.spreadBlock, this.spreadBlockMeta, 2);
 }
 }
 }
 }
 }
 return true;
 }
}

 world.setBlock(x + j, y + m, z + k, m >= 4 ? EuropaBlocks.EuropaIce : this.block, 0, 2); 
так чтоли?

Где найти туторы с разбором создания кастомных генераций? Или таких нет?
 
Да ппц...

Даже слой от Ymin = 35 до Ymax = 40 не могу сделать с водой...
Где же найти туторы по использованию генератора?
 
Ну смотри, тебе в методе generate(или как он там называется) дают корды чанка, мир и прочую хрень.Смотри, делаешь как то так:
int x = chunkX*16; 
int z = chunkZ*16; 
int minSnowHeight = 55 //Минимальная высота для генерации. Снег же на поверхности.
Block blockToGenerate = Blocks.grass //Блок на котором будет генериться
for(int y = world.getMaxHeight(); y > minSnowHeight; y--) {
int randX = x + rand.nextInt(16);
int randZ = z + rand.nextInt(16);
if(world.getBlock(randX, y - 1, randZ) == blockToGenerate) {
//Генеришь тут
}
 
Пойдет ли такое?
Код:
package blessentumble.moons.europajupiter.world.gen;

import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;

import java.util.Random;

public class MapGenWater extends WorldGenerator
{
 private Block waterBlock;

 public MapGenWater(Block water)
 {
 this.waterBlock = Blocks.water;
 }

 @Override
 public boolean generate(World par1World, Random par2Random, int x, int y, int z)
 {
 int i1 = x + par2Random.nextInt(8);
 int j1 = y + par2Random.nextInt(4);
 int k1 = z + par2Random.nextInt(8);

 if (par1World.isAirBlock(i1, j1, k1) && (!par1World.provider.hasNoSky || j1 < 127) && this.waterBlock.canBlockStay(par1World, i1, j1, k1))
 {
 par1World.setBlock(i1, j1, k1, this.waterBlock, par2Random.nextInt(3), 2);
 }

 return true;
 }
}
 
BiomeDecoratorEuropa.java
Код:
package blessentumble.moons.europajupiter.world.gen;

import micdoodle8.mods.galacticraft.api.prefab.world.gen.BiomeDecoratorSpace;
import net.minecraft.init.Blocks;
import net.minecraft.world.gen.feature.WorldGenerator;

public class BiomeDecoratorEuropa extends BiomeDecoratorSpace {
 
 public WorldGenerator snowGen;
 public int snowPerChunk;
 
 public BiomeDecoratorEuropa()
 {
 this.snowPerChunk = 50;
 this.snowGen = new WorldGenSnow(Blocks.snow, 15);
 }

 @Override
 protected void decorate() 
 {

 int var2;
 int var3;
 int var4;
 int var5;

 for(var2 = 0; var2 < this.snowPerChunk; ++var2) {
 var3 = this.chunkX + rand.nextInt(16);
 var4 = this.rand.nextInt(76);
 var5 = this.chunkZ + rand.nextInt(16);
 this.snowGen.generate(this.currentWorld, this.rand, var3, var4, var5);
 }
 
 }
 
 

}
WorldGenSnow.java
Код:
package blessentumble.moons.europajupiter.world.gen;

import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.gen.MapGenBase;
import net.minecraft.world.gen.feature.WorldGenerator;

import java.util.Random;

import blessentumble.moons.europajupiter.blocks.EuropaBlocks;

public class WorldGenSnow extends WorldGenerator
{
 private Block snowBlock;

 public WorldGenSnow(Block par1, int meta)
 {
 this.snowBlock = par1;
 }

 public boolean generate(World par1World, Random par2Random, int x, int y, int z)
 {
 for (int j1 = 1; j1 < par1World.getHeight(); ++j1) {
 int i1 = x;
 //int j1 = y + par2Random.nextInt(4);
 int k1 = z;

 if (par1World.getBlock(i1, j1 - 1, k1) == EuropaBlocks.EuropaIce && par1World.isAirBlock(i1, j1, k1))
 {
 par1World.setBlock(i1, j1, k1, Blocks.snow_layer);
 }
 }
 return true;
 
 
 }
}
Результат: 
dtj21cqc3d6i.png


Вопрос: как сделать, чтобы снег генерировался пачками, а не в рассыпную?
 
Назад
Сверху