Как сделать блок самовосстанавливающимся через определённое время после разрушения?

Версия Minecraft
1.6.4
243
28
202
Доброго времени суток. Я новичок в сфере моддинга и у меня возник вопрос о том, как можно реализовать восстановление блока после его разрушения через определённое время или как сделать этот блок неактивным на определённое время. Я создал блок "руды" (TileEntity) и хотел бы добиться того, чтобы после сбора ресурса с него он исчезал и вновь появлялся спустя какое то время или что то похожее.
Хотелось бы добиться подобного варианта:
https://www.youtube.com/watch?v=w0gonwP0irs
 

timaxa007

Модератор
5,831
409
672
Использовать эвенты: Разрушения блока, Тики мира, класс с унаследованием от WorldSaveData.
Когда блок руды разрушен, на его место ставиться камень, а в класс с унаследованием от WorldSaveData записывать о координатах, где был сломан блок руды. А если этот камень был сломан, то выписывать его из класса с унаследованием от WorldSaveData.
В Тиках мира идёт отчёт или счёт до ходя определённого значения на то место где был блок руды, ставить блок руды.
А так-же в классе с унаследованием от WorldSaveData, сохраняем и читаем NBT, дабы после перезахода в игру могло от и дальше работать, после выхода из игры.


Но это моё предположение.


Эвент блок разрушения - net.minecraftforge.event.world.BlockEvent.BreakEvent;
Эвент тики мира - cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent;


Хотя в этом видео, вроде как, когда генерируется мир, ванильная руда меняется на руду из мода.
Когда ломается руда из мода, она превращаться в свой не разрушаемый камень и выпадает ванильная руда.
То можно в своём камне устроить отчёт или подсчёт времени, чтобы вернуть блок руды.


Ах, да тебе на 1.6.4... Эвент тики мира на этой версии это трекер, не знаю как он именно выглядит, но вроде в поисковике гайд по нему вроде был. А на счёт остального не знаю.
 
243
28
202
Большое спасибо за наводки, начал разбираться. Решил попробовать сделать так:
Хотя в этом видео, вроде как, когда генерируется мир, ванильная руда меняется на руду из мода.
Когда ломается руда из мода, она превращаться в свой не разрушаемый камень и выпадает ванильная руда.
То можно в своём камне устроить отчёт или подсчёт времени, чтобы вернуть блок руды.
Учитывая то, что разрушение моего блока происходит при нажатии ПКМ то решил обойтись без EventHandler'а
и ставить блок, производящий подсчёт времени сразу из метода onBlockActivated. Вот код:
Код:
@Override
public boolean onBlockActivated (World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){
 
    if(player.getHeldItem() == null){ 
         return super.onBlockActivated(world, par6, par6, par6, player, par6, par7, par8, par9);
     }
        if(player.getHeldItem().getItem() == Item.pickaxeIron){ 
             SpawnHelper.SpawnItemNear(player, new ItemStack(Block.oreIron, random.nextInt(2) +           1));
             world.destroyBlock(x, y, z, false);
             world.setBlock(x, y, z, 1004); //установка блока c подсчётом
             return true;
        }
     return false;
 }
А вот код блока с подсчётом времени до замены:
Код:
public class RespawnBlock extends BlockContainer{
 
    public int respawntime = 100; //Время респауна

    public RespawnBlock(int par1) {
       super(par1, Material.rock);
    }

    public TileEntity createNewTileEntity(World world) {
        return new TileEntityRespawnBlock();
    }
    
    public void updateTick(World world, int x, int y, int z) {
     
       int counter = respawntime;
 
       if (counter == 0){
          world.setBlock(x, y, z, 2005);
       }
     }
}
При нажатии ПКМ происходит сбор руды, её разрушение и установка подсчитывающего блока, но подсчитывающий блок на руду уже не заменяется. Если знаете в чём может быть проблема, то прошу помочь.
 
243
28
202
С проблемой разобрался, желаемый результат достигнут. Обновление блока происходит в его tile entity, а не в классе самого блока, как я решил сначала. Вот код если вдруг кому понадобится:
Код:
public class TileEntityIronOreRespawnBlock extends TileEntity{
 
 

 private int counter = 0;
 
 public boolean canUpdate(){
    return true;
    }
 
 public void updateEntity() {
 
 counter++;
 
 if (counter == 200){//Время респауна в тиках
 
 worldObj.setBlock(xCoord, yCoord, zCoord, 3005);
    }
 }
}
Однако всё ещё остаётся пара недочётов:
1) Таймер сбрасывается при рестарте сервера/клиента.
2)
Код:
worldObj.setBlock(xCoord, yCoord, zCoord, 3005)
Как вместо id блока вставить ссылку на него, так как это нужно для адекватного функционирования конфиг файла. 
Что можно с этим сделать?
 
173
1
3
Разве огромное количество тайлов в мире не повлияет на нагрузку?​
 
Сверху