Ух уж этот TileEntity

Версия Minecraft
1.7.10
271
2
0
Значит он должен при определенных условиях ставить блоки. В методе "updateEntity()" я чекаю условия и в определенном мире ставит блок. Но блоки фантомные(не сохраняются,исчезаю при пкм и т.д.). Я пробовал убрать проверку на мир, получать "World" через "Minecraft.getMinecraft().theWorld" (пробовал и "tile.getWorldObj()") но увы, результат не менялся.
public class TileEntityForBlockWithTE extends TileEntity{ // да да название найс
public int progress = 0;
public int bl = 0;
public TileEntityForBlockWithTE(){
System.out.println("PLACE");
}

@Override
public void updateEntity() {
super.updateEntity();
//if(this.getWorldObj().isRemote){
this.progress++;
if(this.progress >=100){
Minecraft.getMinecraft().theWorld.setBlock(this.xCoord, this.yCoord+1, this.zCoord+this.bl, Blocks.gold_block);
this.getWorldObj().setBlock(this.xCoord, this.yCoord+1, this.zCoord+this.bl-1, Blocks.air);
this.progress = 0;
this.bl++;
if(this.bl >= 5)this.bl=0;
}
//}

}


public void writeToNBT(NBTTagCompound nbt)
   {
       super.writeToNBT(nbt);
       nbt.setInteger("progress", this.progress);
       nbt.setInteger("bl", this.bl);
   }

   public void readFromNBT(NBTTagCompound nbt)
   {
       super.readFromNBT(nbt);
       this.progress = nbt.getInteger("progress");
       this.bl = nbt.getInteger("bl");
       
       
   }
}
 
271
2
0
Код:
public class RenderTileEntityForBlockWithTE extends TileEntitySpecialRenderer {

 public static final ItemPlusModel model = new ItemPlusModel();
 public static final ResourceLocation texture = new ResourceLocation("mod:textures/items/ItemPlusModel3.png");
 
 @Override
 public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float f) {
 render((TileEntityForBlockWithTE)tile, x, y, z, f);
 
 }

 private void render(TileEntityForBlockWithTE tile, double x, double y, double z, float f) {
 GL11.glPushMatrix();
 GL11.glTranslated(x, y, z);
 GL11.glTranslatef(0.5F, 0.5F, 0.5F);
 GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
 GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F);
 GL11.glRotatef(45F, 1.0F, 0.0F, 0.0F);
 bindTexture(texture);
 model.render(0.0625F);
 
 GL11.glPushMatrix();//начало рендера теста
 FontRenderer fr = this.func_147498_b();
 GL11.glScalef(0.01F, 0.01F, 0.01F);
 GL11.glRotatef(90F, -1.0F, 0.0F, 0.0F);
 GL11.glTranslatef(-10.0F, -45.0F, -0.1F);
 if(true){
 fr.drawString(EnumChatFormatting.GREEN+"ON"+tile.getX(), -30,10, 0);}
 /*else{
 fr.drawString(EnumChatFormatting.RED+"OFF", -30,10, 0);
 }*/
 GL11.glPopMatrix();//конец рендера текста
 
 GL11.glPopMatrix();
 }

}
 
271
2
0
Значит рендер правильный? Вот тайл тогда:
Код:
public class TileEntityForBlockWithTE extends TileEntity{
 public int progress = 0;
 public boolean start = false;
 public boolean pause = true;
 public int[] blocks;
 public byte[] blockData;
 public int width,height,length;
 public int x=0;
 public int y=0;
 public int z=0;
 public TileEntityForBlockWithTE(){
 System.out.println("PLACE");
 File f = new File("C:/1.7.10/src/main/resources/assets/mod/schem/");
        String[] st = f.list();
            SchemUtils s = new SchemUtils();
         s.loadFromFile(new File("C:/1.7.10/src/main/resources/assets/mod/schem/" + st[2]), this.getWorldObj());
         this.blocks = new int[s.getBlocks().length];
         this.blocks = s.getBlocks();
         this.blockData = new byte[s.getBlockData().length];
         this.blockData = s.getBlockData();
         this.width = s.getWidth();
         this.height = s.getHeight();
         this.length = s.getLength();
 }

 @Override
 public void updateEntity() {
 super.updateEntity();
 if(!this.getWorldObj().isRemote){
 if(start){
 
 this.progress++;
 if(this.progress >=10){
 if(this.x<=this.width)x++;else{
 x=0;
 z++;
 };
 if(this.z>=this.length){
 z=0;
 y++;
 }
 if(this.y>=this.height){
 y=0;
 }
 
 
 
 int index = y * width * length + z * width + x;
 this.worldObj.setBlock((int)this.xCoord+2+x, (int)this.yCoord+y, (int)this.zCoord+2+z, Block.getBlockById(this.blocks[index]), this.blockData[index],2);
 if(Block.getBlockById(this.blocks[index])== Blocks.air){
 this.progress = 9;
 }else{
 this.progress = 0;}
 }
 }
 }
 }
 
 public void Start(boolean isStart){
 this.start = isStart;
 }
 @SideOnly(Side.CLIENT)
 public int getX(){return this.x;}
 
 @Override
    public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
        readFromNBT(packet.func_148857_g());
    }
 public void writeToNBT(NBTTagCompound nbt)
    {
        super.writeToNBT(nbt);
        nbt.setInteger("progress", this.progress);
        nbt.setBoolean("start", this.start);
        nbt.setIntArray("blocks", this.blocks);
        nbt.setByteArray("blockData", this.blockData);
        nbt.setInteger("x", this.x);
        nbt.setInteger("y", this.y);
        nbt.setInteger("z", this.z);
    }

    public void readFromNBT(NBTTagCompound nbt)
    {
        super.readFromNBT(nbt);
        this.progress = nbt.getInteger("progress");
        this.start = nbt.getBoolean("start");
        this.blocks = nbt.getIntArray("blocks");
        this.x = nbt.getInteger("x");
        this.y = nbt.getInteger("y");
        this.z = nbt.getInteger("z");
        this.blockData = nbt.getByteArray("blockData");
    }
    
}
 
271
2
0
Код:
@Override
    public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
        readFromNBT(packet.func_148857_g());
  
Без этого кода все нормально рендерится, добавляю и модель исчезает кода ставлю блок.
 
271
2
0
Убираю это:
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
readFromNBT(packet.func_148857_g());
}

Модель рендеится, но переменная не передается((
 
271
2
0
2,505
81
397
Ну ты же создаешь нбт тэг и упаковываешь туда все данные тайла. Когда пакет прилетает - распаковываешь. Что мешает записывать в тэг только то, что необходимо? Это не решение твоей проблемы. Из-за чего у тебя ничего не рендериться - я не знаю. Но передавать все данные тайла - точно бред.

Пушить матрицу для рендера текста тоже не стоит. Лишнее действие.

GL11.glTranslated(x, y, z);
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
Это тоже. Можно за 1 операцию переместить.
Но это я уже упарываюсь.
 
271
2
0
Код:
 @Override
   public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
       readFromNBT(packet.func_148857_g());
что этот код делает? Проблема появляется при его добавлении
 
2,505
81
397
Этот метод обрабатывает твой пакет. В пакете нбт тэг (packet.func_148857_g()).


Попробуй так
Код:
@Override
public Packet getDescriptionPacket() {
    NBTTagCompound nbt = new NBTTagCompound();
    nbt.setInt("x", x);
    return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
}

@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
    NBTTagCompound nbt = packet.func_148857_g();
    x = nbt.getInt("x");
}
 
Сверху