Разрушение блока через некоторое время

  • Автор темы Автор темы Den_d_y
  • Дата начала Дата начала

Den_d_y

Ньюби
Баллы
1
Имя в Minecraft
Den_d_y
Здравствуйте, форумчане и плагиноделы! Появилась проблема, ну и естесвенно, в гугле ответы не нашёл. Вот суть проблемы: пытаюсь я реализовать исчезновение блока через определённый интервал времени при условии, что рядом маяка нет. Если его нет, то, через 10 секунд блок должен пропадать... Я пытался сделать примерно так:
Код:
@EventHandler
    public void onPlayerSetBlock(BlockPlaceEvent e)
    {
        //Player p = e.getPlayer();
        Block b = e.getBlockPlaced();
        int x = b.getX();
        int y = b.getY();
        int z = b.getZ();
        Location loc;
        boolean Maik = false;
        for(int ix = x-20; ix<=x; ix++)
        {
            for(int iy = y-20; iy<=y; iy++)
            {
                for(int iz = z-20; iz<=z+20; iz++)
                {
                    loc = new Location(e.getPlayer().getWorld(),ix,iy,iz);
                    if((loc.getBlock().getType() == Material.BEACON))
                    {
                        Maik = true;
                    }
                }
            }
        }
        
        for(int ix = x; ix<=x+20; ix++)
        {
            for(int iy = y; iy<=y+20; iy++)
            {
                for(int iz = z-20; iz<=z+20; iz++)
                {
                    loc = new Location(e.getPlayer().getWorld(),ix,iy,iz);
                    if((loc.getBlock().getType() == Material.BEACON))
                    {
                        Maik = true;
                    }
                }
            }
        }
        
        for(int ix = x; ix<=x; ix++)
        {
            for(int iy = y-20; iy<=y; iy++)
            {
                for(int iz = z-20; iz<=z+20; iz++)
                {
                    loc = new Location(e.getPlayer().getWorld(),ix,iy,iz);
                    if((loc.getBlock().getType() == Material.BEACON))
                    {
                        Maik = true;
                    }
                }
            }
        }
        
        
        
        if(!Maik)
        {
            if(b.getType() == Material.COBBLESTONE)
            {
                Bukkit.getScheduler().runTaskLaterAsynchronously(this,()->{try {
                    wait(10000);
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } b.setType(Material.AIR);}, 20*10);
            }
            
        }
    }
Ошибка. Окей, пользовался таким образом:
Код:
if(!Maik)
       {
           if(b.getType() == Material.COBBLESTONE)
           {
               Thread th = new Thread(new BlockDestroyTime(b));//b - блок, который нужно разрушить.
           
       }
package ru.fxgame;


//import org.bukkit.Location;
import java.util.TimerTask;

import org.bukkit.Material;
import org.bukkit.block.*;

public class BlockDestroyTime implements Runnable
{
private Block db;
BlockDestroyTime(Block b)
{
this.db = b;
run();
}

public void BlockDestroy()
{
db.setType(Material.AIR);
}



@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.currentThread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BlockDestroy();
}

}
Но,блин, в этом варианте сервер зависает. wait() там просто крашит сервер. Ничего придумать не могу. Может вы поможете?
 
Изучи:
https://bukkit.gamepedia.com/Scheduler_Programming
И работать с большей частью баккита нельзя в асинхронных потоках.

Метод wait(long) блокирует поток на заданное количество миллисекунд. Если это основной - то понятное дело сервер "крашнется", т.к. по сути ты его зафризил на долгое время и наблюдатель будет выбрасывать таймаут.
 
Изучи:
https://bukkit.gamepedia.com/Scheduler_Programming
И работать с большей частью баккита нельзя в асинхронных потоках.

Метод wait(long) блокирует поток на заданное количество миллисекунд. Если это основной - то понятное дело сервер "крашнется", т.к. по сути ты его зафризил на долгое время и наблюдатель будет выбрасывать таймаут.
Спасибо большое, LuckyZeeRo!
 
Назад
Верх