Помогите Как установить блок, вместо сломанного

  • Автор темы Автор темы swat1x
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

swat1x

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
swat1x
Хочу сделать такую схему:

После того как игрок ломает любой вид руды (В выживании). Ему даётся кол-во денег указанное в конфиге.

Если этот игрок находиться в креативе, то сначала блок после ломания, секунды на 2 заменялся на редстоун блок, а затем заменялся обратно на руду, которую сломали.

Cам код:


@EventHandler
public void on(BlockBreakEvent e) throws InterruptedException
{
Player p = e.getPlayer();

Material forOre = e.getBlock().getType();
if(p.getGameMode() != GameMode.CREATIVE) {
if(forOre == Material.COAL_ORE || forOre == Material.IRON_ORE || forOre == Material.GOLD_ORE || forOre == Material.DIAMOND_ORE || forOre == Material.LAPIS_ORE || forOre == Material.REDSTONE_ORE) {

if (forOre == Material.COAL_ORE) {
//econ.depositPlayer(p, 100.00);
int coalPrice = (plugin.getConfig().getInt("settings.ore.costs.coal"));
p.sendMessage("§b§lРАБОТА: §fВы получили §b" + coalPrice + "$§f за добычу §bугольной руды");
}
}

}
else {
p.sendMessage("§c§lОШИБКА:§f Выйдите из креатива чтобы взаимодействовать с этим блоком");
TimeUnit.SECONDS.sleep(1);
Location loc = b.getLocation();
Block block = loc.getBlock();
block.setType(Material.COAL_ORE);

p.sendMessage("§c§lОШИБКА:§f Выйдите из креатива чтобы взаимодействовать с этим блоком");

}
}
​
Знаю что код кривой и можно было бы сделать это проще и рациональней, но я этим занимаюсь от силы неделю. Просто помогите без ответов по типу: Научись гуглить



​
 
TimeUnit.SECONDS.sleep(1);
bukkit sheduler плачет в углу
 
Своим TimeUnit.SECONDS.sleep(1) ты усыпляешь основной поток сервера на секунду. В этот момент ни мобы/игроки двигаться не будут, ни редстоун работать, ни что-либо ещё.
Игроки в этот момент ощутят пролаг.

Такие задержки можно делать только в других потоках (асинхронно), но тоже не рекомендуется.

Поэтому используй шедулеры, как и посоветовал человек выше
 
С TimeUnit.SECONDS.sleep(1) я уже порешал, но вопрос не в этом. Как сделать установку блока на место, где чел сломал его. И желательно вернуть его, каким он и был, а не в ручну писать

if (brokenBlock == Material.IRON_ORE){
Location loc = brokenBlock.getLocation();
loc.setType(Material.IRON_ORE);
}
 
p.getWorld().getBlockAt(loc).setType(Material.COAL_ORE));
 
С TimeUnit.SECONDS.sleep(1) я уже порешал, но вопрос не в этом. Как сделать установку блока на место, где чел сломал его. И желательно вернуть его, каким он и был, а не в ручну писать

if (brokenBlock == Material.IRON_ORE){
Location loc = brokenBlock.getLocation();
loc.setType(Material.IRON_ORE);
}

Material material = block.getType();
...
block.setType(material);
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх