Плохие саженцы

Версия Minecraft
1.7.10
5,149
49
899
Народ, подзадолбали меня уже эти деревья с их тупой метой(што нильзя было па аднаму дабавить!?!?)
В общем, в мире саженцы как положено со своей текстурой. В инвентаре- одинаковы.


И с листвой какое чтото плохое творится. Текстура типо есть, то есть в консоли не ругается, но ее как бы и нет

 
А почему нельзя сделать на каждый тип саженца отдельный предмет?
 
hohserg написал(а):
А почему нельзя сделать на каждый тип саженца отдельный предмет?

Можно в принципе... А можно! Ну мне прост интересно было как 
это то сделать.
 
junkil335 написал(а):
У меня с предметами разная текстура по мете ставиться, а тут в чём проблема?

А тут видишь ли не предметы. Да я уже решил, мне Тимаха помог
 
Может, решение опубликуешь? Вдруг, кто-то столкнется с такой же проблемой
 
Дайте мне нормальный код саженца или хотя бы
Код:
@Override
   public void updateTick(World world, int x, int y, int z, Random random) {
      if(!world.isRemote && world.getBlockLightValue(x, y + 1, z) >= 9 && random.nextInt(7) == 0) {
         this.func_149878_d(world, x, y, z, random);
      }
   }
вместе с [font=Monaco, Consolas, Courier, monospace]func_149878_d[/font]... Буду очень благодарен.
 
hohserg написал(а):
Может, решение опубликуешь? Вдруг, кто-то столкнется с такой же проблемой

окей.


Короче, проблема была, как и написал BlesseNTumble
Я расширял не от ItemMultiTexture, а от ItemBlock.DВ этом и была проблема.
Вот рабочий код саженца.
Код:
public class OsinaSapling extends BlockSapling{
 public static final String[] saplings = new String[] {"osinaSapling","lipaSapling","sosnaSapling"};
 /*
Это тот самый массив,в котором мы можем насоздавать больше деревьев. 
(!)Интересный факт. Разработчики, добавив Акацию и Темный дуб в обновлении 1.7, создали для них новый класс. Вы можете убедится в этом, увидев в коде BlockNewLog и BlockOldLog. Скорее всего, это связано с тем, что акация и темный дуб не растут строго вверх(Другой генератор)
"Хотя,я хз"(c)
 */
 //Этот массив предназначен для хранения иконок саженцев(если их будет несколько).
 private static final IIcon[] iconLenght = new IIcon[saplings.length];


 /*Это конструктор саженца. Тут вы можете писать любые свойства блока.
 */
 public OsinaSapling()
 {
 float f = 0.4F;//Половина длины блока по каждой из сторон в данном случае.
 //Это физические границы блока(чёрные линии) Тут они не роляют,потому что блок все 
 //равно проходимый
 this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
 this.setCreativeTab(MushroomMain.tabMushroom);
 }

 /*Это могучая вещь-updateTick. Сейчас здесь написано, что типо если нету блока(т.е воздух) над саженцем и если освещение этого блока >= 9 и еще зачем то выборка рандомного числа из 7, причем оно должно стать 0. И только при выполнении этих условий будет генерится дерево.
 */
 public void updateTick(World world, int x, int y, int z, Random random)
 {
 if (!world.isRemote)
 {
 super.updateTick(world, x, y, z, random);

 if (world.getBlockLightValue(x, y + 1, z) >= 9 && random.nextInt(7) == 0)
 {
 this.markOrGrowMarked(world, x, y, z, random);
 }
 }
 }
 /*Тут все очевидно, просто добавляются иконки саженцу в зависимости от его метадаты(номер в массиве)
 */
 @SideOnly(Side.CLIENT)
 public IIcon getIcon(int side, int meta)
 {
 meta &= 7;
 return iconLenght[MathHelper.clamp_int(meta, 0, 5)];
 }

 /*Тот самый метод пометки местоположения саженца. Пока просто копируйте.*/
 public void markOrGrowMarked(World world, int x, int y, int z, Random random)
 {
 int l = world.getBlockMetadata(x, y, z);

 if ((l & 8) == 0)
 {
 world.setBlockMetadataWithNotify(x, y, z, l | 8, 4);
 }
 else
 {
 this.growTree(world, x, y, z, random);
 }
 }


 /*Это собственно метод обращения к ворлдгену дерева*/
 public void growTree(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) & 7;

 //Тут выбирается рандомное число из 10. Если оно равно нулю, то включается генератор большого 
 //дерева, в противном случае (:), срабатывает обычный генератор.
 Object object = random.nextInt(10) == 0 ? new TreeOsinaGen(MyBlocks.treeOsina, MyBlocks.osinaLeaves, 0 ,0, true, 12 , 4, false) : new TreeOsinaGen(MyBlocks.treeOsina, MyBlocks.osinaLeaves, 1 ,1, true, 12 , 4, false); new TreeOsinaGen(MyBlocks.treeOsina, MyBlocks.osinaLeaves, 2 ,2, true, 19 , 8, false);
 int i1 = 0;
 int j1 = 0;
 boolean flag = false;

 /*А это очень классная штука. Switch, или "выбиратор совпадений". Он нужен для того,чтобы каждое дерево генерилось по своему генератору. У нас одно дерево, один генератор.*/
 switch (l)
 {
 case 0:
 /*Тут вот много параметров в скобках. Я поигрался с ними, но так и не смог понять как они работают */
 object = new TreeOsinaGen(MyBlocks.treeOsina, MyBlocks.osinaLeaves, 0 ,0, true, 12 , 4, false);
 break;
 case 1:
 /*Тут вот много параметров в скобках. Я поигрался с ними, но так и не смог понять как они работают */
 object = new TreeOsinaGen(MyBlocks.treeOsina, MyBlocks.osinaLeaves, 1 ,1, true, 12 , 4, false);
 break;
 case 2:
 /*Тут вот много параметров в скобках. Я поигрался с ними, но так и не смог понять как они работают */
 object = new TreeOsinaGen(MyBlocks.treeOsina, MyBlocks.osinaLeaves, 2 ,2, true, 19 , 8, false);
 break;
 default:
 break;

 }
 //Объявляется локальная переменная типа Block и приравнивается в блоку воздуха.
 Block block = Blocks.air;

 /*Возможно вы видели выше булеву переменную flag.Так вот она.Судя по коду,здесь написано,
что на каких то коордах,(к которым прибавляются, судя по всему нули) ставить блоки воздуха.
 */
 if (flag)
 {
 world.setBlock(x + i1, y, z + j1, block, 0, 4);
 world.setBlock(x + i1 + 1, y, z + j1, block, 0, 4);
 world.setBlock(x + i1, y, z + j1 + 1, block, 0, 4);
 world.setBlock(x + i1 + 1, y, z + j1 + 1, block, 0, 4);
 }
 else
 {
 world.setBlock(x, y, z, block, 0, 4);
 }

 if (!((WorldGenerator)object).generate(world, random, x + i1, y, z + j1))
 {
 if (flag)
 {
 world.setBlock(x + i1, y, z + j1, this, l, 3);
 world.setBlock(x + i1 + 1, y, z + j1, this, l, 4);
 world.setBlock(x + i1, y, z + j1 + 1, this, l, 4);
 world.setBlock(x + i1 + 1, y, z + j1 + 1, this, l, 4);
 }
 else
 {
 world.setBlock(x, y, z, this, l, 4);
 }
 }
 }
 /*
 *Эта функция всего лишь возвращает "эквивалентность" блока по указанным координатам текущему *блоку. Условием эквивалентности является совпадение типа блока и соответствие типа саженца 
 *(первых 3 бит метадаты).
 */
 @Override
 public boolean func_149880_a(World world, int x, int y, int z, int UC1)
 {
 return world.getBlock(x, y, z) == this && (world.getBlockMetadata(x, y, z) & 7) == UC1;
 }

 /*Метод "ломать-выпадать", полагаю, тут написано чтобы дропался именно с той метой, которая была, а не абы какой.*/
 public int damageDropped(int p_149692_1_)
 {
 return MathHelper.clamp_int(p_149692_1_ & 7, 0, 5);
 }


 /**
Это метод, добавляющий сабблоки. Походу, больше 4 возвращать для дерева нельзя, судя по оригинальному комментарию.Наверно поэтому писали новый BlockNewLog
 *
 returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
 */
 @SideOnly(Side.CLIENT)
 public void getSubBlocks(Item item, CreativeTabs tab, List list)
 {
 for (int i = 0; i < this.saplings.length; i++)
 {
 list.add(new ItemStack(item, 1, i));
 }
 }

 /*Тут регистрируются иконки*/
 @SideOnly(Side.CLIENT)
 public void registerBlockIcons(IIconRegister iconregister)
 {
 for (int i = 0; i < iconLenght.length; ++i)
 {
 iconLenght[i] = iconregister.registerIcon(MushroomMain.MODID + ":" +  saplings[i]);
 iconLenght[i] = iconregister.registerIcon(MushroomMain.MODID + ":" +  saplings[i]);

 }
 }
 /*
ВСЕ ЭТИ ФУНКИ НЕ В КОЕМ СЛУЧАЕ НЕ ПЕРИМНОВЫВАТЬ!
Метод, "удобряемость". True - можно удобрять костн.мукой, False -нельзя*/
 public boolean func_149851_a(World p_149851_1_, int p_149851_2_, int p_149851_3_, int p_149851_4_, boolean p_149851_5_)
 {
 return true;
 }
 //Сколько удобрять
 public boolean func_149852_a(World world, Random random, int x, int y, int z)
 {
 return (double)world.rand.nextFloat() < 0.9D;
 }
 //Что происходит при удобрении.
 public void func_149853_b(World world, Random random, int x, int y, int z)
 {
 this.markOrGrowMarked(world, x, y, z, random);
 }
}

//Все, саженец готов!
тут с моими комментами, но думаю разберетесь.


func_149878_d - Это growTree
 
Кстати. Попробуй выращивать дерево самим. Ну не костной мукой. Посади по 10 саженцев каждого и попробуй. У меня просто почему то проскакивают ванильные деревья(ввместо моих. Хотя ванильным генератором там нигде и не пахнет)
 
Maxik001 написал(а):
Кстати. Попробуй выращивать дерево самим. Ну не костной мукой. Посади по 10 саженцев каждого и попробуй. У меня просто почему то проскакивают ванильные деревья(ввместо моих. Хотя ванильным генератором там нигде и не пахнет)
Кстати да... Я заметил
 
можно конечно, прямо начинать с WorldGenAbstractTree писать.
Или еще глубже-

ща попробую
 
Я не помню. Но так надо вроде.


Попробовал расширить от своего ворлдгенабстракттрее. жду вот.


Это не помогло. Походу, только свой ворлдген писать.
 
Код:
public class BarnardaCBlockSapling extends BlockSapling
{
	private static String[] saplings = new String[] {
		"violet_tree"
	};

	private IIcon[] textures;

	public BarnardaCBlockSapling(String name)
	{
		super();
		this.setHardness(0.0F);
		this.setStepSound(Block.soundTypeGrass);
		this.setBlockName(name + "_" + BarnardaCBlockSapling.saplings.length);
	}

	@Override
	public void registerBlockIcons(IIconRegister iconRegister)
	{
		this.textures = new IIcon[BarnardaCBlockSapling.saplings.length];

		for (int i = 0; i < BarnardaCBlockSapling.saplings.length; ++i)
		{
			this.textures[i] = iconRegister.registerIcon(GalaxySpace.ASSET_PREFIX + ":" + "barnarda2/barnarda2sapling_" + BarnardaCBlockSapling.saplings[i]);
		}
	}

	@Override
	@SideOnly(Side.CLIENT)
	public IIcon getIcon(int side, int meta)
	{
		if (meta < 0 || meta >= BarnardaCBlockSapling.saplings.length)
		{
			meta = 0;
		}
		return this.textures[meta];
	}

	@Override
	public void getSubBlocks(Item block, CreativeTabs creativeTabs, List list)
	{
		for (int i = 0; i < BarnardaCBlockSapling.saplings.length; ++i)
		{
			list.add(new ItemStack(block, 1, i));
		}
	}

	@Override
	public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side)
	{
		return this.isValidPosition(world, x, y, z, -1);
	}

	public boolean isValidPosition(World world, int x, int y, int z, int metadata)
	{
		Block block = world.getBlock(x, y - 1, z);

		switch (metadata)
		{
			default:
				return block == BRBlocks.BarnardaCGrass || block == BRBlocks.BarnardaCDirt;
		}
	}

	@Override
	public boolean canBlockStay(World par1World, int par2, int par3, int par4)
	{
		Block soil = par1World.getBlock(par2, par3 - 1, par4);
		return (par1World.getFullBlockLightValue(par2, par3, par4) >= 8 || par1World.canBlockSeeTheSky(par2, par3, par4)) && soil != null && soil.canSustainPlant(par1World, par2, par3 - 1, par4, ForgeDirection.UP, this);
	}

	@Override
	public void updateTick(World world, int x, int y, int z, Random random)
	{
		if (!world.isRemote)
		{
			if (world.getBlockLightValue(x, y + 1, z) >= 9 && random.nextInt(7) == 0)
			{
				this.func_149878_d(world, x, y, z, random);
			}
		}
	}

	@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;
		random.nextInt(8);

		if (obj == null)
		{
			switch (meta)
			{
				// Violet Tree
			case 0:
				obj = new WorldGenBarnardaCTree(2, BRBlocks.BarnardaCLog, BRBlocks.BarnardaCLeaves, 0, 0, false, 3, 4, false);
				break;
			default:
				int i;
				i = random.nextInt(2) + 1;
				if(i == 1) obj = new WorldGenBarnardaCTree(1, BRBlocks.BarnardaCLog, BRBlocks.BarnardaCLeaves, 0, 0, false, 3, 4, false);
				if(i == 2) obj = new WorldGenBarnardaCTree(2, BRBlocks.BarnardaCLog, BRBlocks.BarnardaCLeaves, 0, 0, false, 3, 4, false);
				break;
			}
		}

		if (obj != null)
		{
			world.setBlockToAir(x, y, z);

			if (!((WorldGenerator)obj).generate(world, random, x, y, z))
			{
				world.setBlock(x, y, z, this, meta, 2);
			}
		}
	}

	@Override
	public CreativeTabs getCreativeTabToDisplayOn()
	{
		return GSCreativeTabs.GSBlocksTab;
	}

	@Override
	public int damageDropped(int meta)
	{
		return meta;
	}

	@Override
	public int getDamageValue(World world, int x, int y, int z)
	{
		return world.getBlockMetadata(x, y, z);
	}
}
 
Maxik001 написал(а):
Я не помню. Но так надо вроде.
Два одинаковых присваивания несут столько же смысла, сколько и одно. Думай, что пишешь
 
Назад
Сверху