TileEntity - установка нового блока по прошествии определённого времени

Версия Minecraft
1.9 -1.10+
917
22
332
Доброго времени суток.
Мне нужно чтобы мой блок превращался в другой блок если 30 секунд под ним находится горящая печка.
Насколько я понял, это можно сделать через TileEntity. TileEntity я создал установил метод update(), но что делать дальше?
Пробовал как-то так:
Код:
	BlockPos pos = getPos();
	World world = getWorld();
	
	int x = pos.getX();int y = pos.getY();int z = pos.getZ();
	
	int dryResult = 0;
	
	public void update() {
		
		BlockPos posBottom = new BlockPos(x, y-1, z);
		
		if(world.isRemote && Blocks.FURNACE.isBurning(world, posBottom) && world.rand.nextBoolean()) {
			if(dryResult < 1000) {
				dryResult++;
			}
			else {
				
			}
		}
	}
Я и сам понимаю что это работать не будет :D(ну, наверно). Как вариант записывать переменную в nbt , но может можно как-то воспользоваться getTotalWorldTime? Но метод update вызывается каждый тик, будет ли getTotalWorldTime в таком случае работать, я не знаю.
В общем посоветуйте как мне поступить!
P.S.
К тому же я так и не разобрался как мне установить новый блок в мире)))
 
Решение
Горящая печка - отдельный блок - Blocks.lit_furnace

В онапдейте:

Код:
int Timer;

onUpdate {
    if (this.worldObj.getBlock(this.posX, this.posY - 1, this.posZ) == Blocks.lit_furnace) {
        timer++;
    } else {
        timer = 0;
    }
    if (timer >= 600) {
        this.worldObj.setBlock(this.posX, this.posY, this.posZ, Blocks.lava);
    }
}


P.S. Ну, как-то так :D Писал по памяти, но в целом понятно
1,976
68
220
Горящая печка - отдельный блок - Blocks.lit_furnace

В онапдейте:

Код:
int Timer;

onUpdate {
    if (this.worldObj.getBlock(this.posX, this.posY - 1, this.posZ) == Blocks.lit_furnace) {
        timer++;
    } else {
        timer = 0;
    }
    if (timer >= 600) {
        this.worldObj.setBlock(this.posX, this.posY, this.posZ, Blocks.lava);
    }
}


P.S. Ну, как-то так :D Писал по памяти, но в целом понятно
 
917
22
332
Спасибо! С меня лайк :).


AlexSocol написал(а):
Код:
this.worldObj.setBlock(this.posX, this.posY, this.posZ, Blocks.lava);
У меня 1.8+ метод setBlock отправился "погулять" :/ Вместо него теперь есть некий setBlockSate, но как им пользоваться в данном случае, я не знаю.
Кто-нибудь, кто в этом разбирается, помогите!


Что никто не знает?
 
917
22
332
Попробовал сделать так:
Код:
package ru.mousecray.reals.entity.tileentity;

import ru.mousecray.reals.blocks.RegistryBlock;
import ru.mousecray.reals.blocks.complexblocks.BlockLeaves;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class EntityBlockLeaves extends TileEntity implements ITickable{

	BlockPos pos = getPos();
	
	int x = pos.getX();
	int y = pos.getY();
	int z = pos.getZ();
	
	BlockPos posBottom = new BlockPos(x, y-1, z);
	
	Block block = RegistryBlock.BlockDryLeaves;
	
	IBlockState state = block.getDefaultState();
	
	int Timer;
	
	public void update() {
		
	    if (worldObj.getBlockState(posBottom).getBlock() == Blocks.LIT_FURNACE) {
	        Timer++;
	    } else {
	        Timer = 0;
	    }
	    if (Timer >= 200) {
	        this.worldObj.setBlockState(pos, state);
	    }
	}
}
Сам TileEntity работает, проверял, а вот этот код майн похоже игнорирует :(. Кто-нибудь помогите!!!
 
667
7
2
Попробуй глянуть в блоке травы, когда на нём стоит блок, он через время превращается в блок земли.
 
917
22
332
Не работает, завтра буду эксперементировать.


Не работает именно скан блока(((


Код:
package ru.mousecray.reals.entity.tileentity;

import ru.mousecray.reals.blocks.RegistryBlock;
import ru.mousecray.reals.blocks.complexblocks.BlockLeaves;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class EntityBlockLeaves extends TileEntity implements ITickable{

	BlockPos pos = getPos();
	
	int timer = 0;
	
	public void update() {
		
	    if (this.worldObj.getBlockState(pos.add(0, -1, 0)).getBlock() == Blocks.STONE) {
	        timer++; 
	        System.out.println("setyggggggf898w00yjheyiiiiihhhhhshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfg");
	    } 
	    else {
	        timer = 0;
	    }
	    
	    if (timer >= 200) {
	    	this.worldObj.setBlockToAir(pos);
	        this.worldObj.setBlockState(pos, RegistryBlock.BlockDryLeaves.getDefaultState());
	    }
	}
}
На System.out.println не обращайте внимания, я так проверял работу кода)))


Ну неужели никто не знает? Проверка блоков вроде часто используется..
 
917
22
332
Agravaine написал(а):
Убить тебя нужно за глобальные переменные.
Так update вызывается каждый тик, значит если я переменную установлю внутри него она будет обнулятся к исходному состоянию каждый тик? Или я туплю?
 
917
22
332
Всё работает, разобрался. Отдельное спасибо Agravaine.


Вот так сделал:
Код:
public class EntityBlockLeaves extends TileEntity implements ITickable{
	
	int timer = 0;
	
	public void update() {
		
		BlockPos pos = getPos();
		BlockPos posx = pos.add(0, -1, 0);
		Block block = this.worldObj.getBlockState(posx).getBlock();
		
	    if (block == Blocks.LIT_FURNACE) {
	        timer = worldObj.rand.nextInt(5)+1;
	    } 
	    else {
	    	timer = 0;
	    }
	    
	    if (timer >= 2000) {
	    	this.worldObj.setBlockToAir(pos);
	        this.worldObj.setBlockState(pos, RegistryBlock.BlockDryLeaves.getDefaultState());
	    }
	}
}
 
Сверху