TileEntity block

Здравствуйте.
Сделал TileEntity блок с моделью. Если поставить несколько таких блоков, то тик каждого блока повторяется столько раз, сколько блоков видит игрок. Если блока два, то каждый блок тикает дважды. Если три - трижды и т.д. И переменные у всех блоков общие. Если изменить значение переменной, то оно меняется для всех блоков.
Мне нужно, чтобы когда ставишь блок в него записывались некие значения переменных, которые будут разными для каждого блока. И чтобы каждый блок тикал независимо.
Конкретная задача: доставать эти значения в рендере модели блока.
 
и всё-таки не совсем правильно работает. Нужно менять значение переменной блока, когда по нему клацаешь. Но значение меняется у всех блоков.
Код:
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_){
        if (world.isRemote){
            BlockStatueSteveTileEntity tileEntity = (BlockStatueSteveTileEntity)world.getTileEntity(x,y,z);
            tileEntity.setRotate(!tileEntity.getRotate());
        }
        return true;
    }
 
Код:
package xxx;

import net.minecraft.block.BlockPistonBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class BlockStatueSteveTileEntity extends TileEntity {

    private boolean rotate = false;
    private float rotateAngle = 0.0f;

    public boolean getRotate(){
        return rotate;
    }

    public void setRotate(boolean b){
        rotate = b;
    }

    public float getRotateAngle(){
        return rotateAngle;
    }

    public void setRotateAngle(float angle){
        rotateAngle = angle;
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt)
    {
        super.readFromNBT(nbt);
        rotate = nbt.getBoolean("rotate");
        rotateAngle = nbt.getFloat("rotateAngle");
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt)
    {
        super.writeToNBT(nbt);
        nbt.setBoolean("rotate", rotate);
        nbt.setFloat("rotateAngle", rotateAngle);
    }


    @Override
    public Packet getDescriptionPacket()
    {
        NBTTagCompound tileTag = new NBTTagCompound();
        this.writeToNBT(tileTag);
        return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, tileTag);
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
    {
        this.readFromNBT(pkt.func_148857_g());
    }
}
 
Нашел ошибку. Теперь нормально клацается.
Но при выходе, переменные сбрасываются. Как сделать, чтобы они сохранялись и загружались?
И метадата у блоков после перезапуска сбрасывается на -1
 
Для каждого отдельного блока создается новый тайл, так ведь?
И нестатичные свойства(переменные) ссылаются на разные области памяти?
 
hohserg написал(а):
Для каждого отдельного блока создается новый тайл, так ведь?
да
hohserg написал(а):
И нестатичные свойства(переменные) ссылаются на разные области памяти?
Это глобальные private переменные класса. Я не знаю, на что там они ссылаются. Если создается новый тайл, то, видимо, и области разные.
 
Ну по-идее так. Я когда писал, поч-то подумал про синглтон, а синглтоны - только блоки.
 
Код:
    @Override
    public void readFromNBT(NBTTagCompound nbt)
    {
        System.out.println("nbt read");
        super.readFromNBT(nbt);
        rotate = nbt.getBoolean("rotate");
        rotateAngle = nbt.getFloat("rotateAngle");
    }
Почему этот метод не выполняется?
наверное, причина в этом?
 
всё, разобрался.
надо было каждый раз markBlockForUpdate() делать.
Об этом в туториалах не сказано!
p.s. 350 постов - я теперь ПРО :cool:
 
Dragon2488 написал(а):
Ага, а еще нужно синхронизировать нбт с клиентом.
Разве это не оно?
Код:
    @Override
    public Packet getDescriptionPacket()
    {
        NBTTagCompound tileTag = new NBTTagCompound();
        this.writeToNBT(tileTag);
        return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, tileTag);
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
    {
        this.readFromNBT(pkt.func_148857_g());
    }
 
Назад
Сверху