[1.7.2] Разносторонняя текстура блока

Статус
В этой теме нельзя размещать новые ответы.
47
0
[1.7.2] Разно сторонняя текстура

Как сделать похожую текстуру как у печки(чтоб когда ставишь текстура блока поворачивалась лицом к игроку).

код частично работает но когда ставишь сбоку блока, а когда ставишь на блок то нет текстура показывает на север

Код блока
Код:
package net.minecrftgases.Blocks;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecrftgases.Stuff.ModInfo;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class BlockTest extends Block{
    @SideOnly(Side.CLIENT)
    private IIcon field_149991_b;
    @SideOnly(Side.CLIENT)
    private IIcon gaspump_top;
    @SideOnly(Side.CLIENT)
    private IIcon gaspump;
    
     public BlockTest()
        {
            super(Material.iron);
            this.setHardness(2F);
        }
     
     
     
     /**
         * Called whenever the block is added into the world. Args: world, x, y, z
         */
        public void onBlockAdded(World p_149726_1_, int p_149726_2_, int p_149726_3_, int p_149726_4_)
        {
            super.onBlockAdded(p_149726_1_, p_149726_2_, p_149726_3_, p_149726_4_);
            this.func_149930_e(p_149726_1_, p_149726_2_, p_149726_3_, p_149726_4_);
        }

        private void func_149930_e(World p_149930_1_, int p_149930_2_, int p_149930_3_, int p_149930_4_)
        {
            if (!p_149930_1_.isRemote)
            {
                Block block = p_149930_1_.getBlock(p_149930_2_, p_149930_3_, p_149930_4_ - 1);
                Block block1 = p_149930_1_.getBlock(p_149930_2_, p_149930_3_, p_149930_4_ + 1);
                Block block2 = p_149930_1_.getBlock(p_149930_2_ - 1, p_149930_3_, p_149930_4_);
                Block block3 = p_149930_1_.getBlock(p_149930_2_ + 1, p_149930_3_, p_149930_4_);
                byte b0 = 3;

                if (block.func_149730_j() && !block1.func_149730_j())
                {
                    b0 = 3;
                }

                if (block1.func_149730_j() && !block.func_149730_j())
                {
                    b0 = 2;
                }

                if (block2.func_149730_j() && !block3.func_149730_j())
                {
                    b0 = 5;
                }

                if (block3.func_149730_j() && !block2.func_149730_j())
                {
                    b0 = 4;
                }

                p_149930_1_.setBlockMetadataWithNotify(p_149930_2_, p_149930_3_, p_149930_4_, b0, 2);
            }
        }

        /**
         * Gets the block's texture. Args: side, meta
         */
        @SideOnly(Side.CLIENT)
        public IIcon getIcon(int p_149691_1_, int p_149691_2_)
        {
            return p_149691_1_ == 1 ? this.gaspump_top : (p_149691_1_ == 0 ? this.gaspump : (p_149691_1_ != p_149691_2_ ? this.blockIcon : this.field_149991_b));
        }
     
     
    //от фонаря текстуры для проверки
        @SideOnly(Side.CLIENT)
        public void registerBlockIcons(IIconRegister par1IconRegister)
        {
            this.blockIcon = par1IconRegister.registerIcon(ModInfo.ModId + ":" + "blockTest");
            this.field_149991_b = par1IconRegister.registerIcon(ModInfo.ModId + ":" + "gasseparator_side");
            this.gaspump_top =  par1IconRegister.registerIcon(ModInfo.ModId + ":" + "gaspump_top");
            this.gaspump =  par1IconRegister.registerIcon(ModInfo.ModId + ":" + "bedrockgaspump_bottom");
        }
}
 
забыл, как принято блоки поворачивать? сам мне в теме за ТЕ отчитываешь, хотя это абсолютно мой метод
 
329
13
Не до конца понял, что там за проблема. Доработал свой код из соседней темы, забирай. Получилось похоже на твой код, только я чуть прибрался:

taogunner.taomod.block.BlockTest - собственно, класс блока полностью
Код:
package taogunner.taomod.block;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import taogunner.taomod.TaoModMain;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class BlockTest extends Block
{
    @SideOnly(Side.CLIENT)
    // Объявляем текстуры для сторон
    protected IIcon BlockIconFront;
    protected IIcon BlockIconSide;
    protected IIcon BlockIconTop;
    
    // Конструктор класса
    public BlockTest(Material material)
    {
        super(material);
        // Указываем вкладку креатива, в которой будет наш блок (вкладка Блоки, можно указать любую)
        this.setCreativeTab(CreativeTabs.tabBlock);
        // Указываем имя для блока (понадобится для локализации)
        this.setBlockName(TaoModMain.MODID + "." + "testblock");
    }
 
    @SideOnly(Side.CLIENT)
    @Override
    public void registerBlockIcons(IIconRegister par1IconRegister)
    {
        // Регистрируем путь до png-текстур для разных сторон блока
        BlockIconFront = par1IconRegister.registerIcon(TaoModMain.MODID + ":" + "testblock_front");
        BlockIconSide = par1IconRegister.registerIcon(TaoModMain.MODID + ":" + "testblock_side");
        BlockIconTop = par1IconRegister.registerIcon(TaoModMain.MODID + ":" + "testblock_top");
    }
    
    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int par1int, int par2int)
    {
        // par1int - это номер стороны от 0 до 5
        // 0 - низ; 1- верх; 2,3,4,5 - стороны
        // par2int - это метадата стороны
        if (par1int == 0 || par1int == 1) { return BlockIconTop; }
        else if (par1int != par2int) { return BlockIconSide; }
        else { return BlockIconFront; }
    }
    
    // Этот метод вызывается когда блок ставится кем-то
    @Override
    public void onBlockPlacedBy(World par1World, int par2int, int par3int, int par4int, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        // Это - хитрая функция, которая определяет куда смотрел игрок, когда ставил
        int i = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
        
        // Тут мы меняем метадату нужной стороны, чтобы getIcon() потом покрасил эту сторону по-другому
        // setBlockMetadataWithNotify(x, y, z, номер стороны, 2 - хз оно так в оригинале);
        switch (i)
        {
            case 0: par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, 2, 2); break;
            case 1: par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, 5, 2); break;
            case 2: par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, 3, 2); break;
            case 3: par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, 4, 2); break;
        }
    }
}
 
47
0
и последний вопрос как поправить отображение в инвентаре то фронтовую не отображает.
 
329
13
zbctvz написал(а):
и последний вопрос как поправить отображение в инвентаре то фронтовую не отображает.
Долго пытался сделать это красиво. В итоге плюнул и взял с тыквы.
Код:
public class BlockTest extends Block
{
    @SideOnly(Side.CLIENT)
    // Объявляем текстуры для сторон
    protected IIcon BlockIconFront;
    protected IIcon BlockIconSide;
    protected IIcon BlockIconTop;
    
    // Конструктор класса
    public BlockTest(Material material)
    {
        super(material);
        // Указываем вкладку креатива, в которой будет наш блок (вкладка Блоки, можно указать любую)
        this.setCreativeTab(CreativeTabs.tabBlock);
        // Указываем имя для блока (понадобится для локализации)
        this.setBlockName(TaoModMain.MODID + "." + "testblock");
        //this.getIcon(1,0);
    }
 
    @SideOnly(Side.CLIENT)
    @Override
    public void registerBlockIcons(IIconRegister par1IconRegister)
    {
        // Регистрируем путь до png-текстур для разных сторон блока
        BlockIconFront = par1IconRegister.registerIcon(TaoModMain.MODID + ":" + "testblock_front");
        BlockIconSide = par1IconRegister.registerIcon(TaoModMain.MODID + ":" + "testblock_side");
        BlockIconTop = par1IconRegister.registerIcon(TaoModMain.MODID + ":" + "testblock_top");
    }
    
    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int par1int, int par2int)
    {
        if (par1int == 0 || par1int == 1) { return BlockIconTop; }
        if (par2int == 2 && par1int == 2) { return BlockIconFront; }
        if (par2int == 3 && par1int == 5) { return BlockIconFront; }
        if (par2int == 0 && par1int == 3) { return BlockIconFront; }
        if (par2int == 1 && par1int == 4) { return BlockIconFront; }
        return BlockIconSide;
    }
    
    // Этот метод вызывается когда блок ставится кем-то
    @Override
    public void onBlockPlacedBy(World par1World, int par2int, int par3int, int par4int, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        int i = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
        par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, i, 2);
    }
}
Что изменилось: сократился метод onBlockPlacedBy, теперь там 2 строчки, но в getIcon теперь много страшных условий. Содержимое метода можно сократить до 1 строчки, кому как удобнее и приятнее глазу:
Код:
@SideOnly(Side.CLIENT)
@Override
public IIcon getIcon(int par1int, int par2int)
{
    return par1int == 1 ? BlockIconTop : (par1int == 0 ? BlockIconTop : (par2int == 2 && par1int == 2 ? BlockIconFront : (par2int == 3 && par1int == 5 ? BlockIconFront : (par2int == 0 && par1int == 3 ? BlockIconFront : (par2int == 1 && par1int == 4 ? BlockIconFront : BlockIconSide)))));
}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху