- 5,149
- 49
- 899
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
hohserg написал(а):А почему нельзя сделать на каждый тип саженца отдельный предмет?
junkil335 написал(а):У меня с предметами разная текстура по мете ставиться, а тут в чём проблема?
public class ItemBlockDandelions extends ItemMultiTexture{
public ItemBlockDandelions(Block block) {
super(block, block, BarnardaCBlockDandelions.dandelion);
}
}
@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);
}
}
hohserg написал(а):Может, решение опубликуешь? Вдруг, кто-то столкнется с такой же проблемой
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);
}
}
//Все, саженец готов!
Кстати да... Я заметилMaxik001 написал(а):Кстати. Попробуй выращивать дерево самим. Ну не костной мукой. Посади по 10 саженцев каждого и попробуй. У меня просто почему то проскакивают ванильные деревья(ввместо моих. Хотя ванильным генератором там нигде и не пахнет)
iconLenght[i] = iconregister.registerIcon(MushroomMain.MODID + ":" + saplings[i]);
iconLenght[i] = iconregister.registerIcon(MushroomMain.MODID + ":" + saplings[i]);
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 написал(а):Я не помню. Но так надо вроде.