Ух уж этот 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");
       
       
   }
}
 

timaxa007

Модератор
5,831
409
672
if(this.getWorldObj().isRemote) - это значит на стороне клиента.
Minecraft.getMinecraft().theWorld.setBlock - пытаешься ставить на клиенте (на сервере краш).
this.getWorldObj().setBlock(this.xCoord, this.yCoord+1, this.zCoord+this.bl-1, Blocks.air); - ты ставишь воздух.
Ты уверен в том, что твой TileEntity ставиться в мир?


Пробуй типа this.getWorldObj().setBlock(this.xCoord, this.yCoord+1, this.zCoord+this.bl, Blocks.gold_block, 0, 3);
 
271
2
0
if(this.getWorldObj().isRemote) менял миры итог тот же
Minecraft.getMinecraft().theWorld.setBlock я просто попробовал)))
this.getWorldObj().setBlock(this.xCoord, this.yCoord+1, this.zCoord+this.bl-1, Blocks.air); я знаю что воздух(убирает предыдущй блок) изначально ставил блоки так.
 
124
1
0
volt написал(а):
if(this.getWorldObj().isRemote) менял миры итог тот же
Minecraft.getMinecraft().theWorld.setBlock я просто попробовал)))
this.getWorldObj().setBlock(this.xCoord, this.yCoord+1, this.zCoord+this.bl-1, Blocks.air); я знаю что воздух(убирает предыдущй блок) изначально ставил блоки так.

в главном классе тайл зарегестрировал?


ещё приложи класс описания блока
 
271
2
0
Вырвите мне руки, я забыл зарегать тайлЭнтити))

НО СТОП, НИЧЕГО НЕ ИЗМЕНИЛОСЬ.

Код:
public class BlockWithTE extends BlockContainer implements ITileEntityProvider{

 public BlockWithTE(Material m) {
 super(m);
 this.setBlockName("BlockWithTE");
 this.setCreativeTab(Main.MyMainTab);
 setBlockTextureName("diamond_block");
 this.isBlockContainer = true;
 }

 @Override
 public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
 
 return new TileEntityForBlockWithTE();
 }
 
 @Override
    public void breakBlock(World world, int x,int y,int z, Block b,int m) {
        super.breakBlock(world, x,y,z,b,m);
        world.removeTileEntity(x,y,z);
    }
 
 public int getRenderType() {
 return -1;
 }

 public boolean isOpaqueCube() {
 return false;
 }

 public boolean renderAsNormalBlock() {
 return false;
 }

}


Надеюсь то что это блок контейнер не на что не влияет?
 
7,099
324
1,510
"implements ITileEntityProvider" - зачем, если это уже есть в BlockContainer, от которого наследуешь?
 
271
2
0
Изначально наследовал с блока, потом решил попробовать контейнер.Ничего не поменялось,так и оставил


Я тут что заметил,при выходе из мира сами блоки становятся фантомными, при пкм ставятся обратно
 
124
1
0
какое-то непонятное условие, пока что сделай просто чтобы он ставил определённый блок в определённых координатах когда progress = 100, а по x при каждой установке смещай на 1 блок относительно предыдущего, ставить блок надо командой this.worldObj.setBlock(x, y, z, Blocks.gold_block);
 
271
2
0
Все работает нормально если "обновить" блок при каждом перезаходе на мир. В чем проблема!?


После перезахода "создается" фантомный тайлЭнтити который ставит фантомные блоки....


Вопрос до сих пор не решен.
 
3,005
192
592
Попробуй так. Код не проверял, код делал не в eclipse, просто переписал твой код.
Код:
@Override
public void updateEntity() {
	super.updateEntity();
	if(!getWorldObj().isRemote){
		if(progress++ >=100){
			getWorldObj().setBlock(xCoord, yCoord+1, zCoord + bl, Blocks.gold_block);
			progress = 0;
			if(bl++ >= 5)
				bl=0;
		}
	}
}


А в 1.7.10 не нужно делать implements ITickable ?
 
271
2
0
Doc, я не понял что ты поменял но алгоритм мой работал. Проблема в том что после перезахода в мир появляется фантомный тайлЭнтити который ставит фантомные блоки.


Почему-то создается новый тайлЭнтити и именно на стороне клиента... Почему?!
 

timaxa007

Модератор
5,831
409
672
Код:
GameRegistry.registerTileEntity(TileEntityStand.class, SMTDecorative.MODID + "Stand");
Код:
public class TileEntityStand extends TileEntity {

	public TileEntityStand() {

	}

	@Override
	public void updateEntity() {

	}

}
Код:
public class BlockStand extends Block implements ITileEntityProvider {

	public BlockStand() {
		super(Material.wood);
	}

	@Override
	public TileEntity createNewTileEntity(World world, int metadata) {
		return new TileEntityStand();
	}

}
 
271
2
0
В конструкторе тайла написал System.out.println("PLACE");
Сообщение выводится не только при появлении тайла, а и при перезаходе в мир(причем 1 раз,т.е только в одном мире)
 
7,099
324
1,510
Minecraft.getMinecraft().theWorld - только клиентский мир.
Тебе нужен this.worldObj(можно без this)
 
Сверху