Беда. Текстура блока с метадатой.

1,057
50
234
Добрый день, всезнающие юзеры данного форума.
Проблема такая:
f7722a6162ca.png

Пытаюсь объединить растения в 1 блок с метадатой, но на все блоки с метой налазит одна текстура (как правило первая)
Код:
public class BarnardaCBlockDandelions extends BlockBush implements ITerraformableBlock, IShearable
{
 private static String[] dandelion = new String[] {
 "Dandelion1",
 "Dandelion2",
 "Dandelion3"
 };
 
 @SideOnly(Side.CLIENT)
 private IIcon[] textures = new IIcon[this.dandelion.length];
 
    public BarnardaCBlockDandelions()    
    {
        super(Material.plants);
        this.setBlockName("Barnarda2Dandelion");
        this.setStepSound(Block.soundTypeGrass);
        
        float var4 = 0.2F;
 this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var4 * 3.0F, 0.5F + var4);

    }
    
    @Override
 public void registerBlockIcons(IIconRegister iconRegister)
 {
     super.registerBlockIcons(iconRegister);

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

 }
    
    //@Override
 @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata) {
       
 metadata &= 7;
 return textures[MathHelper.clamp_int(metadata, 0, 5)];
     
    }


    @Override
    public Item getItemDropped(int meta, Random random, int par3)
    {
     return null;
    }
    
    public int quantityDropped(Random random)
    {
        return 0;
    }
    
    @Override
    public int damageDropped(int metadata) {
        return metadata;
    }
    
    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack is) {
        world.setBlockMetadataWithNotify(x, y, z, is.getItemDamage(), 3);
    }
    
 @Override
 public void getSubBlocks(Item block, CreativeTabs creativeTabs, List list)
 {
 for (int i = 0; i < this.dandelion.length; ++i)
 {
 list.add(new ItemStack(block, 1, i));
 }
 }
 
    @Override
    @SideOnly(Side.CLIENT)
    public CreativeTabs getCreativeTabToDisplayOn()
    {
        return CreativeTabsGS.GSBlocksTab;
    }
    
    @Override
 public boolean isTerraformable(World world, int x, int y, int z) {
 return false;
 }
    
    @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);
 
 if (world.getBlock(x, y - 1, z) == Blocks.air)
 {
 return false;
 }
 
 return block == BRBlocks.BarnardaCGrass || block == BRBlocks.BarnardaCDirt;
 }

 @Override
 public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) {
 return true;
 }

 @Override
 public ArrayList<ItemStack> onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) {
 
 ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
 ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z)));
 return ret;
 }
    
       
}

Блок зареган в preInit.

public static Block BarnardaCDandelion1;
BarnardaCDandelion1 = new BarnardaCBlockDandelions();
GameRegistry.registerBlock(BarnardaCDandelion1, "barnardaCdandelion1");

При установки блока текстуры работают как надо
8f51b1d242a2.png


Подскажите, что делать?
 
В методе getIcon верни текстуру, относительно меты.
Он у тебя есть уже, кстати.. Кхм...
Код:
    //@Override
 @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata) {
       
 metadata &= 7;
 return textures[MathHelper.clamp_int(metadata, 0, 5)];
     
    }
 
Через свитч тоже не работает....
Код:
    @Override
 @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata) {
       
 switch (metadata)
        {
         case 0: return this.textures[0];
         case 1: return this.textures[1];
         case 2: return this.textures[2];
        }
     
 return this.textures[0];
    }
Что я не так делаю то?
 
BlesseNtumble написал(а):
Через свитч тоже не работает....
Код:
    @Override
 @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata) {
       
 switch (metadata)
        {
         case 0: return this.textures[0];
         case 1: return this.textures[1];
         case 2: return this.textures[2];
        }
     
 return this.textures[0];
    }
Что я не так делаю то?
Что у тебя задаёт метадату? Рандомайзер?
 
mayakplay написал(а):
BlesseNtumble написал(а):
Через свитч тоже не работает....
Код:
    @Override
 @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata) {
       
 switch (metadata)
        {
         case 0: return this.textures[0];
         case 1: return this.textures[1];
         case 2: return this.textures[2];
        }
     
 return this.textures[0];
    }
Что я не так делаю то?
Что у тебя задаёт метадату? Рандомайзер?
Вот тут точно не отвечу.
getSubBlocks регает блоки в творческой панели с метой.
 
Liahim написал(а):
Попробуй по дубовому, через if. Вдруг сработает.
Можно ещё и от массивов избавится... что б наверняка )))
Я уже что только не пробовал. Массив убирал, делал через if, через switch...
Уже полностью копировал код тимахи, и один хрен метадата не вешается.

Еще такую байду обнаружил, что если в инвентаре лежит 1 блок с 0 метадатой (495 к примеру) и 1 блок с метой 1 (495:1), то при выбрасывании и подбора одного из них, блок без меты, стакается с метой, и становится с метой, а блок с метой теряет мету и стакается с 0 метой.
[merge_posts_bbcode]Добавлено: 14.04.2016 19:49:19[/merge_posts_bbcode]

Методом тыка, выяснил что это из-за BlockBush'a.
Наследую просто Block - мета и иконки работают как надо, наследую bush - такая вот хрень.

И что делать то?
 
Ой хз...
У меня буш нормально работает...
Вот, глянь говнокод из моего мода. Там всё фурычит.

Код:
public class SaltWort extends BlockBush implements IGrowable {

    public SaltWort(String name, CreativeTabs tab) {
        this.setBlockName(name);
        this.setStepSound(soundTypeGrass);
        this.setCreativeTab(tab);
        this.setTickRandomly(true);
        this.setBlockTextureName("saltmod:SaltWort");
    }

    @SideOnly(Side.CLIENT)
    private IIcon STAGE_1;
    @SideOnly(Side.CLIENT)
    private IIcon STAGE_2;
    @SideOnly(Side.CLIENT)
    private IIcon STAGE_3;
    @SideOnly(Side.CLIENT)
    private IIcon STAGE_4;
    @SideOnly(Side.CLIENT)
    private IIcon DEAD;

    @Override
    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta) {
        if (meta < 0 || meta > 5) {
            meta = 0;
        }
        return meta == 1 ? this.STAGE_1 : (meta == 2) ? this.STAGE_2 : (meta == 3) ? this.STAGE_3 :
                meta == 4 ? this.STAGE_4 : meta == 5 ? this.DEAD : this.blockIcon;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister par1) {
        this.blockIcon = par1.registerIcon(this.getTextureName());
        this.STAGE_1 = par1.registerIcon(this.getTextureName() + "_1");
        this.STAGE_2 = par1.registerIcon(this.getTextureName() + "_2");
        this.STAGE_3 = par1.registerIcon(this.getTextureName() + "_3");
        this.STAGE_4 = par1.registerIcon(this.getTextureName() + "_4");
        this.DEAD = par1.registerIcon(this.getTextureName() + "_D");
    }
Вдруг, поможет.

А на счёт стаканья различных метадат смотри блок кварца.
 
Не понимаю....
Такое чувство, что метадата только визуально дается блокам.
 
BlesseNtumble написал(а):
Не понимаю....
Такое чувство, что метадата только визуально дается блокам.
Не мучайся сделай НБТ для тайла с травкой и на рандом давай нбт при размещении :D
От нбт уже текстура зависит
 
mayakplay написал(а):
BlesseNtumble написал(а):
Не понимаю....
Такое чувство, что метадата только визуально дается блокам.
Не мучайся сделай НБТ для тайла с травкой и на рандом давай нбт при размещении :D
От нбт уже текстура зависит
Позор мне, но я с НБТ никогда не работал, я даже хз что это и как это.
 
mayakplay написал(а):
Не мучайся сделай НБТ для тайла с травкой и на рандом давай нбт при размещении :D
От нбт уже текстура зависит
Вредный совет. Это верный путь к тормозам. Может одна только травка к катастрофе не приведет, но если каждый мод будет такое делать...
 
Создал отдельно чистый мод.
Код полностью взял из темы тимахи: http://forum.mcmodding.ru/viewtopic.php?id=2003
И хрен. Тоже самое.
075020d55a2f.png

0a5e7d9c6766.png


Метадата то вроде работает, но для блоков, а не для итемов....
Forge 1448 у меня, если что.
 
Есть вероятность, что виноват getRender, а точнее рендер который используется под этим идом рендера, потому-что у меня так блоки в инвентаре не рендереться.
 
timaxa007 написал(а):
Есть вероятность, что виноват getRender, а точнее рендер который используется под этим идом рендера, потому-что у меня так блоки в инвентаре не рендереться.
    public int getRenderType()
    {
        return 1;
    }
Это чтоли?
Но, саплинги, цветы и прочее в ванилле ведь спокойно работают с метадатой...
 
Ага. Сначала я тоже подумал и начал у себя проверять в чём может быть беда.
[merge_posts_bbcode]Добавлено: 14.04.2016 21:08:41[/merge_posts_bbcode]

Ну да, я был почти прав. Нужно ещё использовать ItemBlock и возвращать там метадату.

Смотри в net.minecraft.item.ItemMultiTexture для примера, так как саженцы, цветочки и не только, его используют для подобного.
То что у меня работает:
Код:
public class ItemBlockPlant extends ItemMultiTexture {

    public ItemBlockPlant(Block block) {
        super(block, block, BlockPlant.metadata);
    }

}
BlockPlant.metadata - массив String.
 
Назад
Сверху