Создание собственного дерева растущего из определенного саженца

Версия Minecraft
1.7.10
50
1
0
Добрый день, хотел бы узнать ,как создать свое дерево из своего саженца. Видел подобные вопросы на форуме, но на них даны не очень понятные ответы, если ли видео-урок (желательно русский), о создании этого "чуда", или дайте расписанный до мелочей пример. И желательно с пояснениями. =DD
 
Почему не посмотришь ,как это в ванильке сделано?
 
У меня типа свой класс.
Код:
/**Класс ItemBlock, для этого класса, обязательно использовать.**/
public class BlockSapling extends BlockBush implements IGrowable {

	public static final String[] names = new String[] {
		"1",
		"2",
		"3",
		"4",
		"5",
		"6",
		"7",
		"8",
		"9",
		"10",
		"11",
		"12",
		"13",
		"14",
		"15",
		"16"
	};

	@SideOnly(Side.CLIENT)
	private static final IIcon[] icons = new IIcon[names.length];

	public BlockSapling() {
		super(Material.plants);
		float f = 0.4F;
		setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
	}

	/**
	 * Ticks the block if it's been scheduled
	 */
	@Override
	public void updateTick(World world, int x, int y, int z, Random random) {
		if (!world.isRemote) {
			super.updateTick(world, x, y, z, random);

			//Если для этого блока будет свет 9 и больше, и рандомом от 0 о 6 будет равняться 0, то ...
			if (world.getBlockLightValue(x, y + 1, z) >= 9 && random.nextInt(7) == 0)
				//будет выполнен метод saplingGrowTree.
				saplingGrowTree(world, x, y, z, random);
		}
	}

	/**
	 * Gets the block's texture. Args: side, meta
	 */
	@SideOnly(Side.CLIENT)
	@Override
	public IIcon getIcon(int side, int metadata) {
		if (metadata < 0 || metadata >= icons.length) metadata = 0;
		return icons[metadata];
	}

	/**Наш метод, в котором будет выстраиваться структура дерева.**/
	public void saplingGrowTree(World world, int x, int y, int z, Random random) {
		//Если эвентом будет отменён рост этого саженца, то дальше не будет выполняться.
		if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, random, x, y, z)) return;
		int l = world.getBlockMetadata(x, y, z);
		WorldGenerator gen = null;

		//По определённой метадате будет выбран объект WorldGenerator'а.
		switch (l) {
		case 0:
			gen = new WorldGenOneTree();
			break;
		case 1:
			gen = new WorldGenTwoTree();
			break;

		default:break;
		}

		//Если в локальной переменной gen если не null, то будет выполнен метод generate от объекта WorldGenerator.
		if (gen != null) gen.generate(world, random, x, y, z);

	}

	/**
	 * Determines the damage on the item the block drops. Used in cloth and wood.
	 */
	@Override
	public int damageDropped(int metadata) {
		return metadata;
	}

	/**
	 * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
	 */
	@SideOnly(Side.CLIENT)
	@Override
	public void getSubBlocks(Item item, CreativeTabs tab, List list) {
		for (int i = 0; i < names.length; ++i)
			list.add(new ItemStack(item, 1, i));
	}

	@SideOnly(Side.CLIENT)
	@Override
	public void registerBlockIcons(IIconRegister ir) {
		for (int i = 0; i < icons.length; ++i) {
			icons[i] = ir.registerIcon(getTextureName() + "_" + names[i]);
		}
	}

	@Override
	/**Можно-ли использовать костную муку.**/
	public boolean func_149851_a(World world, int x, int y, int z, boolean p_149851_5_) {
		return true;
	}

	@Override
	/**Будет-ли использован метод func_149853_b.**/
	public boolean func_149852_a(World world, Random random, int x, int y, int z) {
		return (double)world.rand.nextFloat() < 0.45D;
	}

	@Override
	/**Если func_149851_a и func_149852_a будут true, то будет сработает этот метод.**/
	public void func_149853_b(World world, Random random, int x, int y, int z) {
		saplingGrowTree(world, x, y, z, random);
	}

}
 
timaxa007 написал(а):
У меня типа свой класс.
Код:
/**Класс ItemBlock, для этого класса, обязательно использовать.**/
...

Спасибо, а вот возникло пару вопросов:
Код:
@Override
    public void getSubBlocks(Item item, CreativeTabs tab, List list)
Что такое list list
Код:
            gen = new WorldGenOneTree();
Я так понял [font=Monaco, Consolas, Courier, monospace]WorldGenOneTree- класс, а можно показать его пример?
И куда и как загружать иконку с:
[/font]

Код:
    private static final IIcon[] icons = new IIcon[names.length];
 
Ага, Ага! Я пытался сделать урок, но меня обсмеяли и прогнали!
 
Aleksand написал(а):
Что такое list list
Аргумент объекта java.util.List.

Aleksand написал(а):
Я так понял WorldGenOneTree- класс, а можно показать его пример?
Примерно такой:
http://forum.mcmodding.ru/%D0%A2%D0%B5%D0%BC%D0%B0-1-7-10-%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%A3%D0%B4%D0%BE%D0%B1%D0%BD%D0%B0%D1%8F-%D0%BF%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F?pid=96186#pid96186

Aleksand написал(а):
И куда и как загружать иконку с:
В методе registerBlockIcons.
 
timaxa007 написал(а):
Aleksand написал(а):
Что такое list list
Аргумент объекта java.util.List.

Aleksand написал(а):
Я так понял WorldGenOneTree- класс, а можно показать его пример?
...
Ага, понял, сделал, это я сделал саженец верно?
А теперь подскажи, пожалуйста, на языке чайников, как добавить его в креатив таб, ну или верней куда это писать:        this.setCreativeTab(...);
И не очень понял прикол с иконкой, объяснишь?
 
Aleksand написал(а):
Ага, понял, сделал, это я сделал саженец верно?
Я не знаю.

Aleksand написал(а):
А теперь подскажи, пожалуйста, на языке чайников, как добавить его в креатив таб, ну или верней куда это писать:        this.setCreativeTab(...);
В конструктор объекта или класса.
- конструктор объекта


- конструктор класса


Aleksand написал(а):
И не очень понял прикол с иконкой, объяснишь?
Ну, у некоторых идов рендоров берутся иконки не из блока, а из предмета блока (ItemBlock). По этому в нашем ItemBlock мы указываем на иконку из блока.
Код:
GameRegistry.registerBlock(sapling, ItemBlockSapling.class, "sapling");
Код:
public class ItemBlockSapling extends ItemMultiTexture {

	public ItemBlockSapling(Block block) {
		super(block, block, BlockSapling.names);
	}

}
 
timaxa007 написал(а):
Aleksand написал(а):
Ага, понял, сделал, это я сделал саженец верно?
Я не знаю.

...

Код:
package ru.Aleksandr;

import java.util.Random;

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

public class WorldGenTree extends WorldGenerator {

    static byte[][][] structural_layers = new byte[][][]{
        {
            {0, 0, 0},
            {0, 1, 0},
            {0, 0, 0}
        },{
            {0, 0, 0},
            {0, 1, 0},
            {0, 0, 0}
        },{
            {0, 0, 0},
            {0, 1, 0},
            {0, 0, 0}
        },{
            {2, 2, 2},
            {2, 1, 2},
            {2, 2, 2}
        },{
            {0, 2, 0},
            {2, 1, 2},
            {0, 2, 0}
        },{
            {0, 0, 0},
            {0, 2, 0},
            {0, 0, 0}
        }
    };

//Длина первого массива - это высота постройки.
//Длина второго и третьего - это ширина и длина постройки и длина второго и третьего массива должна быть не чётной, дабы аргументы координат, указанные в методе generate, были центром постройки.

    @Override
    public boolean generate(World world, Random random, int x, int y, int z) {
        //Тройной массив пропускаем по трём циклам.
        for (int py = 0; py < structural_layers.length; ++py) {
        for (int px = 0; px < structural_layers[py].length; ++px) {
        for (int pz = 0; pz < structural_layers[py][px].length; ++pz) {

            //Смещение для центровки x и z координат.
            int px2 = px - (structural_layers[py].length / 2);
            int pz2 = pz - (structural_layers[py][px].length / 2);

            switch(structural_layers[py][px][pz]){
            case 1:
                //Поставиться блок, если даже стоял какой-либо другой блок.
                world.setBlock(x + px2, y + py, z + pz2, socrafice.Log, 1, 3);
                break;
            case 2:
                //Если на данной координате будет блок с материалом isReplaceable ...
                if (world.getBlock(x + px2, y + py, z + pz2).isReplaceable(world, x + px2, y + py, z + pz2)) {
                    //то будет поставлен блок.
                    world.setBlock(x + px2, y + py, z + pz2, socrafice.Leaves, 1, 3);
                }
                break;
            //Любые другие значения (тот-же '0') будут пропускать свой цикл (и ни чего делать в мире).
            default:continue;
            }

        }
        }
        }
        return true;
    }

}
Тим, использовал твой ген деревьев, но теперь, при выращивании дерева происходит краш, вот лог:
Код:
...
[16:08:52] [Netty Client IO #0/INFO] [FML]: Attempting connection with missing mods [] at SERVER
[16:08:52] [Server thread/INFO] [FML]: [Server thread] Server side modded connection established
[16:08:52] [Server thread/INFO]: Aleksandr[local:E:246c77bf] logged in with entity id 217 at (-0.12282516292682015, 92.0, -10.393703910450903)
[16:08:52] [Server thread/INFO]: Aleksandr joined the game
[16:08:52] [Client thread/INFO] [FML]: [Client thread] Client side modded connection established
[16:09:02] [Server thread/INFO] [STDOUT]: [ru.Aleksandr.SeedlingTree:func_149878_d:92]: World Gen Tree Test // Тестовое сообщение при выращивании
[16:09:02] [Server thread/ERROR]: Encountered an unexpected exception
net.minecraft.util.ReportedException: Ticking memory connection
 at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:198) ~[NetworkSystem.class:?]
 at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) ~[MinecraftServer.class:?]
 at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) ~[MinecraftServer.class:?]
 at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[IntegratedServer.class:?]
 at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
 at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
Caused by: java.lang.NullPointerException
 at net.minecraft.world.chunk.storage.ExtendedBlockStorage.func_150818_a(ExtendedBlockStorage.java:86) ~[ExtendedBlockStorage.class:?]
 at net.minecraft.world.chunk.Chunk.func_150807_a(Chunk.java:653) ~[Chunk.class:?]
 at net.minecraft.world.World.setBlock(World.java:519) ~[World.class:?]
 at ru.Aleksandr.WorldGenTree.generate(WorldGenTree.java:58) ~[WorldGenTree.class:?]
 at ru.Aleksandr.SeedlingTree.func_149878_d(SeedlingTree.java:102) ~[SeedlingTree.class:?]
 at net.minecraft.block.BlockSapling.func_149879_c(BlockSapling.java:74) ~[BlockSapling.class:?]
 at net.minecraft.block.BlockSapling.func_149853_b(BlockSapling.java:246) ~[BlockSapling.class:?]
 at net.minecraft.item.ItemDye.applyBonemeal(ItemDye.java:178) ~[ItemDye.class:?]
 at net.minecraft.item.ItemDye.onItemUse(ItemDye.java:76) ~[ItemDye.class:?]
 at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:507) ~[ForgeHooks.class:?]
 at net.minecraft.item.ItemStack.tryPlaceItemIntoWorld(ItemStack.java:142) ~[ItemStack.class:?]
 at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:422) ~[ItemInWorldManager.class:?]
 at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593) ~[NetHandlerPlayServer.class:?]
 at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74) ~[C08PacketPlayerBlockPlacement.class:?]
 at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122) ~[C08PacketPlayerBlockPlacement.class:?]
 at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) ~[NetworkManager.class:?]
 at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) ~[NetworkSystem.class:?]
 ... 5 more
[16:09:02] [Server thread/ERROR]: This crash report has been saved to: C:\SocraficeEclips\eclipse\.\crash-reports\crash-2017-03-30_16.09.02-server.txt
[16:09:02] [Server thread/INFO]: Stopping server
[16:09:02] [Client thread/INFO] [STDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:388]: ---- Minecraft Crash Report ----
// This doesn't make any sense!

Time: 30.03.17 16:09
Description: Ticking memory connection

java.lang.NullPointerException: Ticking memory connection
 at net.minecraft.world.chunk.storage.ExtendedBlockStorage.func_150818_a(ExtendedBlockStorage.java:86)
 at net.minecraft.world.chunk.Chunk.func_150807_a(Chunk.java:653)
 at net.minecraft.world.World.setBlock(World.java:519)
 at ru.Aleksandr.WorldGenTree.generate(WorldGenTree.java:58)
 at ru.Aleksandr.SeedlingTree.func_149878_d(SeedlingTree.java:102)
 at net.minecraft.block.BlockSapling.func_149879_c(BlockSapling.java:74)
 at net.minecraft.block.BlockSapling.func_149853_b(BlockSapling.java:246)
 at net.minecraft.item.ItemDye.applyBonemeal(ItemDye.java:178)
 at net.minecraft.item.ItemDye.onItemUse(ItemDye.java:76)
 at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:507)
 at net.minecraft.item.ItemStack.tryPlaceItemIntoWorld(ItemStack.java:142)
 at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:422)
 at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)
 at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
 at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
 at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
 at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
 at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
 at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
 at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
 at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
 at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
 at net.minecraft.world.chunk.storage.ExtendedBlockStorage.func_150818_a(ExtendedBlockStorage.java:86)
 at net.minecraft.world.chunk.Chunk.func_150807_a(Chunk.java:653)
 at net.minecraft.world.World.setBlock(World.java:519)
 at ru.Aleksandr.WorldGenTree.generate(WorldGenTree.java:58)
 at ru.Aleksandr.SeedlingTree.func_149878_d(SeedlingTree.java:102)
 at net.minecraft.block.BlockSapling.func_149879_c(BlockSapling.java:74)
 at net.minecraft.block.BlockSapling.func_149853_b(BlockSapling.java:246)
 at net.minecraft.item.ItemDye.applyBonemeal(ItemDye.java:178)
 at net.minecraft.item.ItemDye.onItemUse(ItemDye.java:76)
 at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:507)
 at net.minecraft.item.ItemStack.tryPlaceItemIntoWorld(ItemStack.java:142)
 at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:422)
 at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)
 at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
 at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
 at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

-- Ticking connection --
Details:
 Connection: net.minecraft.network.NetworkManager@114f12b5
Stacktrace:
 at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
 at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
 at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
 at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
 at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
 at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

-- System Details --
Details:
 Minecraft Version: 1.7.10
 Operating System: Windows 7 (amd64) version 6.1
 Java Version: 1.8.0_111, Oracle Corporation
 Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
 Memory: 1313905968 bytes (1253 MB) / 1580597248 bytes (1507 MB) up to 1580597248 bytes (1507 MB)
 JVM Flags: 4 total; -Xincgc -Xmx1524M -Xms1524M -XX:MaxPermSize=512M
 AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
 IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95
 FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.4.1558 4 mods loaded, 4 mods active
 States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
 UCHIJAAAA mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) 
 UCHIJAAAA FML{7.10.99.99} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.4.1558-1.7.10.jar) 
 UCHIJAAAA Forge{10.13.4.1558} [Minecraft Forge] (forgeSrc-1.7.10-10.13.4.1558-1.7.10.jar) 
 UCHIJAAAA socrafice{0.0.1} [socrafice] (bin) 
 GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
 Profiler Position: N/A (disabled)
 Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
 Player Count: 1 / 8; [EntityPlayerMP['Aleksandr'/217, l='New World', x=-0,54, y=92,00, z=-9,24]]
 Type: Integrated Server (map_client.txt)
 Is Modded: Definitely; Client brand changed to 'fml,forge'
[16:09:02] [Client thread/INFO] [STDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:393]: #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2017-03-30_16.09.02-server.txt
[16:09:02] [Client thread/INFO] [FML]: Waiting for the server to terminate/save.
[16:09:02] [Server thread/INFO]: Saving players
[16:09:02] [Server thread/INFO]: Saving worlds
[16:09:02] [Server thread/INFO]: Saving chunks for level 'New World'/Overworld
[16:09:02] [Server thread/INFO]: Saving chunks for level 'New World'/Nether
[16:09:02] [Server thread/INFO]: Saving chunks for level 'New World'/The End
[16:09:02] [Server thread/INFO] [FML]: Unloading dimension 0
[16:09:02] [Server thread/INFO] [FML]: Unloading dimension -1
[16:09:02] [Server thread/INFO] [FML]: Unloading dimension 1
[16:09:02] [Server thread/INFO] [FML]: Applying holder lookups
[16:09:02] [Server thread/INFO] [FML]: Holder lookups applied
[16:09:02] [Server thread/INFO] [FML]: The state engine was in incorrect state SERVER_STOPPING and forced into state SERVER_STOPPED. Errors may have been discarded.
[16:09:02] [Client thread/INFO] [FML]: Server terminated.
AL lib: (EE) alc_cleanup: 1 device not closed
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
 
Aleksand написал(а):
Код:
java.lang.NullPointerException: Ticking memory connection
...
at ru.Aleksandr.WorldGenTree.generate(WorldGenTree.java:58)
Код:
world.setBlock(x + px2, y + py, z + pz2, socrafice.Log, 1, 3);
Предположительно, что Log является null'ом. Т.е. может даже не зарегистрирован этот блок.
 
timaxa007 написал(а):

Тимоха, могу спросить?
Как создать 2 варианта ген. дерева из саженца.
вот я использую твой генератор, который использует слои. так я сделал 1 вариант дерева, как сделать второй?
В классе саженца в этом разделе кода:
Код:
 @Override
 public void func_149878_d(World world, int x, int y, int z, Random random)
 {
 int meta = world.getBlockMetadata(x, y, z);
 Object obj = null;
 
 if (obj == null)
 {
 switch(meta)
 {
 default:
 {
 
 obj = new WorldGenTree(); //Где ВорлдГен я сделал послойный генератор дерева
 break;
 }
 }
 }
?
 
timaxa007 написал(а):
Кто такой Тимоха?
В WorldGenTree или в методе func_149878_d, с помощью рандома будет выбирать рандомно генерацию постройки.

Я думал timoxa- Тимоха.
а можешь показать, как примерно будет смотреться это в WorldGenTree?
 
Код:
public class WorldGenOneTree extends WorldGenerator {

	static byte[][][] structural_layers1 = new byte[][][] {
		{
			{1}
		},{
			{1}
		},{
			{1}
		},{
			{1}
		},{
			{2, 2, 2},
			{2, 1, 2},
			{2, 2, 2}
		},{
			{2, 2, 2},
			{2, 1, 2},
			{2, 2, 2}
		},{
			{0, 2, 0},
			{2, 1, 2},
			{0, 2, 0}
		},{
			{0, 2, 0},
			{2, 1, 2},
			{0, 2, 0}
		},{
			{2}
		}
	};

	static byte[][][] structural_layers2 = new byte[][][] {
		{
			{1}
		},{
			{1}
		},{
			{1}
		},{
			{1}
		},{
			{1}
		},{
			{2, 2, 2},
			{2, 1, 2},
			{2, 2, 2}
		},{
			{2, 2, 2},
			{2, 1, 2},
			{2, 2, 2}
		},{
			{0, 2, 0},
			{2, 1, 2},
			{0, 2, 0}
		},{
			{0, 2, 0},
			{2, 1, 2},
			{0, 2, 0}
		},{
			{0, 2, 0},
			{2, 1, 2},
			{0, 2, 0}
		},{
			{2}
		}
	};

	@Override
	public boolean generate(World world, Random random, int x, int y, int z) {
		if (random.nextBoolean())
			generate(structural_layers1, world, random, x, y, z);
		else
			generate(structural_layers2, world, random, x, y, z);
		return true;
	}

	public void generate(byte[][][] structural_layers, World world, Random random, int x, int y, int z) {
		for (int py = 0; py < structural_layers.length; ++py) {
			for (int px = 0; px < structural_layers[py].length; ++px) {
				for (int pz = 0; pz < structural_layers[py][px].length; ++pz) {

					int px2 = px - (structural_layers[py].length / 2);
					int pz2 = pz - (structural_layers[py][px].length / 2);

					switch(structural_layers[py][px][pz]){
					case 1:
						world.setBlock(x + px2, y + py, z + pz2, SMTPhytology.block.log, 0, 3);
						break;
					case 2:
						if (world.getBlock(x + px2, y + py, z + pz2).isReplaceable(world, x + px2, y + py, z + pz2))
							world.setBlock(x + px2, y + py, z + pz2, SMTPhytology.block.leaves, 0, 3);
						break;
					default:continue;
					}

				}
			}
		}
	}

}
 
Aleksand написал(а):
Я думал timoxa- Тимоха.
а можешь показать, как примерно будет смотреться это в WorldGenTree?

У него ник timAxa.
 
В учебнике есть тема - "удобная послойная генерация" . Там код от Тимахи, проапргрейженый Dahaka. Посмотри, с помощью этой штуки можно что угодно генерить в мире
 
Maxik001 написал(а):
В учебнике есть тема - "удобная послойная генерация" . Там код от Тимахи, проапргрейженый Dahaka. Посмотри, с помощью этой штуки можно что угодно генерить в мире

Как это ему поможет?(если он даже не знает как засунуть предмет во вкладку креатива)
 
Назад
Сверху