Проблема с заменой блоков

Версия Minecraft
1.7.10
62
0
Есть блок, текстуру которого мне нужно менять в зависимости от обстоятельств. Я решил это делать, заменяя блок через его tileEntity командой world.setBlock(). Всё почти хорошо работает за исключением одной ошибки. При обновлении блока (взрыв TNT неподалёку, нажатие по нему ПКМ) его текстура (то есть он сам) меняется на изначальную версию. Нужен ли код - не знаю, потому что там особого кода и нет. Просто при соблюдении определённых условий ставится новый блок через setBlock и соответственно создаётся его тайл.
 

tox1cozZ

aka Agravaine
Модератор
7,124
455
2,148
Нужен код конечно, что ты делаешь вообще?
Если текстур не больше 15 - вообще не нужен тайл, для этого отлично подходит метадата.
 
62
0
Тайл был изначально, решил этим и воспользоваться заодно.
Код тайла:
public NewTileEntityHopper(int Stage, int Plus)
    {
        lastAction = new Date().getTime();
        plus = Plus;
        stage = Stage;
    }
    
    public void updateEntity()
    {
        if (this.worldObj != null && !this.worldObj.isRemote)
        {
            --this.field_145901_j;

            if (!this.func_145888_j())
            {
                this.func_145896_c(0);
                this.func_145887_i();
            }
        }
        
        World world = this.worldObj;
        int x = this.xCoord;
        int y = this.yCoord;
        int z = this.zCoord;
        
        if(stage == 0) active = true;
        else if(stage == 3) active = false;
        else if(plus == 1) active = true;
        else if(plus == 0) active = false;
        
        if(world.getBlock(x, y + 2, z).toString().contains("BlockAir")) //will remake
            this.canActive = true;
        else
            this.canActive = false;
        
        if(active && !canActive)
        {
            long now = new Date().getTime();
            if(now - lastAction >= 700)
            {
                Deactivate();
            }
        } else if(!active && canActive)
        {
            long now = new Date().getTime();
            if(now - lastAction >= 700)
            {
                Activate();
            }
        }
    }
    
    
    
    public void Deactivate()
    {
        if(worldObj.isRemote)
        {
            worldObj.setBlock(xCoord, yCoord, zCoord, NewBlock(++stage));
        }
    }
    
    public void Activate()
    {
        if(worldObj.isRemote)
        {
            worldObj.setBlock(xCoord, yCoord, zCoord, NewBlock(--stage));
        }
    }
    
    public Block NewBlock(int Stage)
    {
        Block res = RainbowCraftMain.ImprovedRainbowFlowerPot0;
        
        if(Stage == 1)
        {
            if(plus == 0)
            {
                res = RainbowCraftMain.ImprovedRainbowFlowerPot1_0;
            }
            else
            {
                res = RainbowCraftMain.ImprovedRainbowFlowerPot1_1;
            }
        } else if(Stage == 2)
        {
            if(plus == 1)
            {
                res = RainbowCraftMain.ImprovedRainbowFlowerPot2_1;
            }
            else
            {
                res = RainbowCraftMain.ImprovedRainbowFlowerPot2_0;
            }
        } else if(Stage == 3)
        {
            res = RainbowCraftMain.ImprovedRainbowFlowerPot3;
        }
        
        return res;
    }
Код блока:
package com.RainbowCraft.Plants.pots;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.RainbowCraft.RainbowCraftMain;
import com.RainbowCraft.Tiles.NewTileEntityHopper;

import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockCrops;
import net.minecraft.block.BlockHopper;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityHopper;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.Facing;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class ImprovedRainbowFlowerPot extends BlockHopper{

    private final Random field_149922_a = new Random();
    private IIcon[] Texture_1 = new IIcon[] {null, null, null, null};
    private IIcon Texture_2;
    private IIcon Texture_3;
    public int stage;
    public int plus = -1;
    
    public ImprovedRainbowFlowerPot(int Stage) {
        super();
        stage = Stage;
        GameRegistry.registerBlock(this, "ImprovedRainbowFlowerPot" + stage);
        LanguageRegistry.addName(this, "Improved Rainbow Flower Pot");
        this.setBlockName("Improved Rainbow Flower Pot");
        if(Stage == 3)
            this.setCreativeTab(RainbowCraftMain.BlockTab);
        else
            this.setCreativeTab(null);
        this.textureName = RainbowCraftMain.modid + ":ImprovedRainbowFlowerPot";
        this.blockHardness = 7.0F;
        this.setHarvestLevel("pickaxe", 2);
        this.setResistance(7.0f);
        this.setLightLevel(0.4F);
    }
    
    public ImprovedRainbowFlowerPot(int Stage, int Plus) {
        super();
        plus = Plus;
        stage = Stage;
        GameRegistry.registerBlock(this, "ImprovedRainbowFlowerPot" + stage + "_" + plus);
        LanguageRegistry.addName(this, "Improved Rainbow Flower Pot");
        this.setBlockName("Improved Rainbow Flower Pot");
        if(Stage == 3)
            this.setCreativeTab(RainbowCraftMain.BlockTab);
        else
            this.setCreativeTab(null);
        this.textureName = RainbowCraftMain.modid + ":ImprovedRainbowFlowerPot";
        this.blockHardness = 7.0F;
        this.setHarvestLevel("pickaxe", 2);
        this.setResistance(7.0f);
        this.setLightLevel(0.4F);
    }
    
    public void registerBlockIcons(IIconRegister p_149651_1_)
    {
        this.Texture_1[0] = p_149651_1_.registerIcon(this.getTextureName() + "_top_0");
        this.Texture_1[1] = p_149651_1_.registerIcon(this.getTextureName() + "_top_1");
        this.Texture_1[2] = p_149651_1_.registerIcon(this.getTextureName() + "_top_2");
        this.Texture_1[3] = p_149651_1_.registerIcon(this.getTextureName() + "_top_3");
        this.Texture_2 = p_149651_1_.registerIcon(this.getTextureName() + "_front");
        this.Texture_3 = p_149651_1_.registerIcon(this.getTextureName() + "_down");
    }
    
    public IIcon getIcon(int p_149691_1_, int p_149691_2_)
    {
        return p_149691_1_ == 1 ? this.Texture_1[stage] : (p_149691_1_ == 0 ? Texture_3 : Texture_2);
    }
    
    public void addCollisionBoxesToList(World p_149743_1_, int p_149743_2_, int p_149743_3_, int p_149743_4_, AxisAlignedBB p_149743_5_, List p_149743_6_, Entity p_149743_7_)
    {
        AxisAlignedBB axisalignedbb1 = this.getCollisionBoundingBoxFromPool(p_149743_1_, p_149743_2_, p_149743_3_, p_149743_4_);

        if (axisalignedbb1 != null && p_149743_5_.intersectsWith(axisalignedbb1))
        {
            p_149743_6_.add(axisalignedbb1);
        }
    }
    
    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_)
    {
        return new NewTileEntityHopper(stage, plus);
    }
    
    /**
     * Called when the block is placed in the world.
     */
    public void onBlockPlacedBy(World p_149689_1_, int p_149689_2_, int p_149689_3_, int p_149689_4_, EntityLivingBase p_149689_5_, ItemStack p_149689_6_)
    {
        super.onBlockPlacedBy(p_149689_1_, p_149689_2_, p_149689_3_, p_149689_4_, p_149689_5_, p_149689_6_);
        
        if (p_149689_6_.hasDisplayName())
        {
            NewTileEntityHopper var7 = (NewTileEntityHopper)func_149920_e(p_149689_1_, p_149689_2_, p_149689_3_, p_149689_4_);
            var7.func_145886_a(p_149689_6_.getDisplayName());
        }
    }
    
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i1, float f1, float f2, float f3)
    {
        if (world.isRemote)
        {
            return true;
        }
        else
        {
            NewTileEntityHopper tile = func_149920_e(world, x, y, z);

            if (tile != null)
            {
                player.func_146093_a(tile);
            }

            return true;
        }
    }
    
    public void breakBlock(World world, int x, int y, int z, Block block, int i1)
    {
        NewTileEntityHopper tile = (NewTileEntityHopper)world.getTileEntity(x, y, z);

        if (tile != null)
        {
            for (int i = 0; i < tile.getSizeInventory(); ++i)
            {
                ItemStack stack = tile.getStackInSlot(i);

                if (stack != null)
                {
                    float f1 = this.field_149922_a.nextFloat() * 0.8F + 0.1F;
                    float f2 = this.field_149922_a.nextFloat() * 0.8F + 0.1F;
                    float f3 = this.field_149922_a.nextFloat() * 0.8F + 0.1F;

                    while (stack.stackSize > 0)
                    {
                        int ii = this.field_149922_a.nextInt(21) + 10;

                        if (ii > stack.stackSize)
                        {
                            ii = stack.stackSize;
                        }

                        stack.stackSize -= ii;
                        EntityItem item = new EntityItem(world, (double)((float)x + f1), (double)((float)y + f2), (double)((float)z + f3), new ItemStack(stack.getItem(), ii, stack.getItemDamage()));

                        if (stack.hasTagCompound())
                        {
                            item.getEntityItem().setTagCompound((NBTTagCompound)stack.getTagCompound().copy());
                        }

                        float f4 = 0.05F;
                        item.motionX = (double)((float)this.field_149922_a.nextGaussian() * f4);
                        item.motionY = (double)((float)this.field_149922_a.nextGaussian() * f4 + 0.2F);
                        item.motionZ = (double)((float)this.field_149922_a.nextGaussian() * f4);
                        world.spawnEntityInWorld(item);
                    }
                }
            }

            world.func_147453_f(x, y, z, block);
        }

        super.breakBlock(world, x, y, z, block, i1);
    }
    
    /**
     * The type of render function that is called for this block
     */
    public int getRenderType()
    {
        return 0;
    }
    
    public boolean isOpaqueCube()
    {
        return true;
    }
    
    public String getItemIconName()
    {
        return null;
    }
    
    public static NewTileEntityHopper func_149920_e(IBlockAccess p_149920_0_, int p_149920_1_, int p_149920_2_, int p_149920_3_)
    {
        return (NewTileEntityHopper)p_149920_0_.getTileEntity(p_149920_1_, p_149920_2_, p_149920_3_);
    }
}
Не исключено, что это вообще не так делается, я только криво умею.
 

tox1cozZ

aka Agravaine
Модератор
7,124
455
2,148
Дружище, тайл как раз и нужен чтобы у каждого блока в мира были индивидуальные данные. Ты же у себя в блоке создал глобальные переменные и относительно них текстуру возвращаешь...
 
62
0
Ну, как я и написал, я только криво умею:eek:k_hand:
Можно немного подробнее, что и где должно быть?
Ну или хотя бы как всё же исправить ошибку?

В общем, ошибку я так и не смог исправить, но я понял из-за чего она (и понял, что легче немного переделать код и обойти её, чем исправить).
 
Последнее редактирование:
Сверху