Удаление блока через время

Статус
В этой теме нельзя размещать новые ответы.
И снова здравствуйте. Допустим стоит какой-то блок у меня на пути, я тыкаю по этому блоку итемом и выполняется код, который заменят этот блок на землю:
Код:
world.setBlock(x, y, z, Blocks.dirt);

Я хочу, чтобы спустя 5 секунд вместо земли появлялся тот блок, который был изначально. Как так сделать?
 

timaxa007

Модератор
5,831
409
672
Записать "куда-нибудь" до замены блока, что там стояло. Затем через 5 секунд от "куда-нибудь" взять и вернуть что там стояло.
 
timaxa007 написал(а):
Записать "куда-нибудь" до замены блока, что там стояло. Затем через 5 секунд от "куда-нибудь" взять и вернуть что там стояло.
Нашел markBlockForUpdate, я так понимаю, в моем случаи можно с помощью неё?
 

timaxa007

Модератор
5,831
409
672
evgeny3121, я не думаю, что этим как-то можно сделать, что ты хочешь.
[merge_posts_bbcode]Добавлено: 04.07.2016 00:43:12[/merge_posts_bbcode]

У каждого может быть своя реализация. Если простые блоки заменять, то это легко. Но если на дорогое TileEntity, то тут чуть по-сложнее, но тоже можно реализовать. Но некоторые блоки (из модов), не возможно заменять по нормальному.
"куда-нибудь" - это возможно лист в который будем записывать что сохранять. Это к примеру наш созданый класс, который будет хранит: Block, intx, y и z координаты, так-же метадата и возможно NBT от TileEntity.
Так-же возможно будет нужно сохранять "куда-нибудь", так как в это время было закрытия/перезагрузки сервера. Т.е. возможно понадобиться использовать WorldSavedData с эвентами.
 
Схожий пример нашел. Теперь меня интересует время замены одного блока на другой. 
Пробовал через getWorldTime:
Код:
world.setBlock(x, y, z, Blocks.stone);
if (world.getWorldTime() % 60 == 0)
world.setBlock(x, y, z, Blocks.dirt);

Спустя 3 секунды ничего не происходит, код не выполняется.
Так же пробовал через int delay = 0; и т.д. Результата тоже никакого.
 

timaxa007

Модератор
5,831
409
672
И где ты этот код у тебя должен работать? Думаю, лучше использовать какой-нибудь update тиков, по-типу эвента тиков.
 
timaxa007 написал(а):
И где ты этот код у тебя должен работать? Думаю, лучше использовать какой-нибудь update тиков, по-типу эвента тиков.
Я пробовал уже updateTick, но не очень понял как мне его использовать. Если я в методе onItemRightClick ставлю блок, то с помощью updateTick я не могу заменить этот блок.
 

timaxa007

Модератор
5,831
409
672
Ну если подумать, то у тебя может замениться на камень и на какой-то тик он может замениться на землю, а на следующий тик снова в камень.
[merge_posts_bbcode]Добавлено: 04.07.2016 13:58:59[/merge_posts_bbcode]

Я не скоро напишу свой вариант.
 
Смена блока x на блок y (на примере грязь-->трава) [1.7.10]{решено}
Пробовал использовать данный код, убрав getBlockLightValue/lightOpacity. Через методonItemRightClick сетаю блок, в итоге метод updateTick не срабатывает и засетанный блок не заменяет на другой.
[merge_posts_bbcode]Добавлено: 04.07.2016 15:06:50[/merge_posts_bbcode]

Пробовал и delay + updateTick, тоже не выходит. Вроде легкая задача, думал за минуту сделаю, а столько проблем.
 

timaxa007

Модератор
5,831
409
672
updateTick - это метод блока. А ты где пытаешься использовать? В предмете?
 
timaxa007 написал(а):
updateTick - это метод блока. А ты где пытаешься использовать? В предмете?
Так я с самого начала написал, что использую итем :lol:
Просто я сетаю итемом блок и в дальнейшем мне нужно работать с блоком из мира, вот я и использовал updateTick.
[merge_posts_bbcode]Добавлено: 04.07.2016 15:40:23[/merge_posts_bbcode]

Использовал самый обычный способ. Блок все так же не сетается :c
Код:
public int cooldown = 0;

public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player)
    {    
        ...
        world.setBlock(x, y, z, Blocks.stone);
        if (cooldown > 60){
        world.setBlock(x, y, z, Blocks.dirt);
        cooldown = 0;
        }
    }
    
public void onUpdate(ItemStack is, World world, Entity entity, int par4, boolean par5) {
       
    cooldown++;
      
}
 

timaxa007

Модератор
5,831
409
672
-_-
onItemRightClick срабатывает только когда игрок пытается использует предмет.
И надеюсь что в onItemRightClick x, y, z, не левые координаты используешь.
 
timaxa007 написал(а):
-_-
onItemRightClick срабатывает только когда игрок пытается использует предмет.
И надеюсь что в onItemRightClick x, y, z, не левые координаты используешь.
Так а что не так? Игрок жмет пкм по блоку, блок сетается камнем, потом должен сработать таймер и спустя время выполнить строку, т.е. камень сетнуть землей. Координаты не левые.
 

timaxa007

Модератор
5,831
409
672
Эм... Просто код не очень выглядит. Но типа код рабочий.
У тебя земля будет ставиться если cooldown больше 60, а cooldown станет 0, если меньше то камень. cooldown у тебя в onUpdate постоянно увеличивается. И замена будет срабатываеться если ты используешь предмет, т.е. стандартно при ПКМ предметом. А не заменяться когда просто время прошло.
 
Забил на итем, решил использовать updateTick  в самом блоке. Сделал вывод сообщения в консоль - ничего не выводит.
Код:
   public void updateTick(World world, int x, int y, int z, Random random) 
   {
    System.out.println("tadaa");
   }
 
Вообщем решил вопрос с помощью updateEntity в тайле. Огромное спасибо Сергею за помощь. Спустя три дня, мучения окончены. :lol:
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху