Помогите Отмена спавна блока в блоках

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

Kloper

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
f3azzy
Делаю что-то типо спасательной платформы, где при её использовании под игроком будет спавниться платформа из слизи, я всё сделал, но блоки могут спавниться внутри различных постройках, разрушая карту, как это избежать?

мой костыль:
Код:
@EventHandler
    public void SlimePlatform(PlayerInteractEvent e) {
        if(e.getAction() != Action.RIGHT_CLICK_AIR && e.getAction() != Action.RIGHT_CLICK_BLOCK) {
            return;
        } else {
            if(e.getPlayer().getInventory().getItemInMainHand().getType() == Material.SLIME_BALL) {
                Player p = e.getPlayer();
                int x = p.getLocation().getBlockX();
                int y = p.getLocation().getBlockY();
                int z = p.getLocation().getBlockZ();
                World w = p.getWorld();
                Location checkblock = new Location(w, x, y -1, z);
                if(checkblock.getBlock().getType() != Material.AIR) {
                    p.sendMessage(ChatColor.GOLD + "HNS" + ChatColor.GRAY + " » " + ChatColor.WHITE + "Вы не можете использовать"
                            + ChatColor.GREEN + " Слизневую-платформу " + ChatColor.WHITE + "стоя на блоке.");
                } else {
                    Location firstBlock = new Location(w, x, y -5, z);
                    Location twoBlock = new Location(w, x -1, y -5, z);
                    Location threeBlock = new Location(w, x +1, y -5, z);
                    Location fourBlock = new Location(w, x -1, y -5, z -1);
                    Location fiveBlock = new Location(w, x +1, y -5, z +1);
                    Location sixBlock = new Location(w, x, y -5, z -1);
                    Location sevenBlock = new Location(w, x, y -5, z +1);
                    Location eightBlock = new Location(w, x -1, y -5, z +1);
                    Location nineBlock = new Location(w, x +1, y -5, z -1);
                    firstBlock.getBlock().setType(Material.SLIME_BLOCK);
                    twoBlock.getBlock().setType(Material.SLIME_BLOCK);
                    threeBlock.getBlock().setType(Material.SLIME_BLOCK);
                    fourBlock.getBlock().setType(Material.SLIME_BLOCK);
                    fiveBlock.getBlock().setType(Material.SLIME_BLOCK);
                    sixBlock.getBlock().setType(Material.SLIME_BLOCK);
                    sevenBlock.getBlock().setType(Material.SLIME_BLOCK);
                    eightBlock.getBlock().setType(Material.SLIME_BLOCK);
                    nineBlock.getBlock().setType(Material.SLIME_BLOCK);
                    Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                    @Override
                    public void run() {
                    firstBlock.getBlock().setType(Material.AIR);
                    twoBlock.getBlock().setType(Material.AIR);
                    threeBlock.getBlock().setType(Material.AIR);
                    fourBlock.getBlock().setType(Material.AIR);
                    fiveBlock.getBlock().setType(Material.AIR);
                    sixBlock.getBlock().setType(Material.AIR);
                    sevenBlock.getBlock().setType(Material.AIR);
                    eightBlock.getBlock().setType(Material.AIR);
                    nineBlock.getBlock().setType(Material.AIR);
                    }
                    }, 150L);
                    return;
                }
                
            } else {
                return;
            }
        }
    }
 
Соболезную. На всех нормальных серверах уже лет 5 используется спигот, а на самых адекватных уже года 3 как paper. Забудь про существование голого bukkit/craftukkit.

Для спигота, кстати, тоже есть этот Block.isEmpty():
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/Block.html#isEmpty()
 
Соболезную. На всех нормальных серверах уже лет 5 используется спигот, а на самых адекватных уже года 3 как paper. Забудь про существование голого bukkit/craftukkit.

Для спигота, кстати, тоже есть этот Block.isEmpty():
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/Block.html#isEmpty()
меня полностью craftbukkit устраивает, пока не вижу необходимости переходить на что то другое
 
меня полностью craftbukkit устраивает, пока не вижу необходимости переходить на что то другое
Тяжёлый случай. Ну ок. Рано или поздно сам на грабли наступишь.

Теперь по теме. Есть несколько вариантов.

Перед установкой блока слизи проверяй текущий материал блока. Если не воздух - замену производить не нужно. Но будь готов, что платформа будет не цельной, а с дырками из-за каких-нибудь подсолнухов, например.

Еще один вариант - не спаунить платформу вовсе, если хотя бы один из блоков не пустой.

Третий вариант - перед спауном платформы записывать предыдущие материалы всех блоков, затем создавать цельную платформу невзирая на другие блоки. А после удаления платформы восстанавливать исходные материалы. Но такое прокатит далеко не со всеми блоками. Например, содержимое контейнеров (сундуков, печек) так точно не восстановить. Также стоит учесть перезагрузку сервера.

Последний вариант - вместо материала сохранять NBT всех заменяемых блоков, а при удалении платформы восстанавливать. Но с крафтбаккитом про этот вариант можно забыть
 
Последнее редактирование:
Последнее редактирование:
В чем проблема взять тип блока и проверить воздух он или нет?
А вообще у тебя один сплошной костыль, но именно по проблеме:
Код:
if (Location.getBlock().getType() == Material.AIR) {
//Изменяешь блок 
}
 
В чем проблема взять тип блока и проверить воздух он или нет?
А вообще у тебя один сплошной костыль, но именно по проблеме:
Код:
if (Location.getBlock().getType() == Material.AIR) {
//Изменяешь блок
}
isEmpty по докам делает то же самое. А если почитаешь тему, то костыль - не самое страшное, что у него на сервере
 
isEmpty по докам делает то же самое. А если почитаешь тему, то костыль - не самое страшное, что у него на сервере
Мне абсолютно без разницы какое у него ядро, ибо если он пишет на нем, значит ему удобно, либо есть причины/принципы не переходить. Посоветовать перейти - логично, но из этого разбивать конфликт не надо.
К тому же, я сам не проверял, но если он написал, что у него нет такого метода, я уверен, что получение типа блока есть
 
Мне абсолютно без разницы какое у него ядро, ибо если он пишет на нем, значит ему удобно, либо есть причины/принципы не переходить. Посоветовать перейти - логично, но из этого разбивать конфликт не надо.
К тому же, я сам не проверял, но если он написал, что у него нет такого метода, я уверен, что получение типа блока есть
имданих уже нашёл его в стандартном ведре
 
Назад
Верх