1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Kloper, 9 сен 2021.

  1. Автор темы
    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;
                }
            }
        }
     
  2. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
  3. Автор темы
    Kloper

    Kloper Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    f3azzy
  4. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Соболезную. На всех нормальных серверах уже лет 5 используется спигот, а на самых адекватных уже года 3 как paper. Забудь про существование голого bukkit/craftukkit.

    Для спигота, кстати, тоже есть этот Block.isEmpty():
    https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/Block.html#isEmpty()
     
  5. Автор темы
    Kloper

    Kloper Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    f3azzy
    меня полностью craftbukkit устраивает, пока не вижу необходимости переходить на что то другое
     
  6. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Умные мысли часто преследовали его...
     
  7. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Тяжёлый случай. Ну ок. Рано или поздно сам на грабли наступишь.

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

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

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

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

    Последний вариант - вместо материала сохранять NBT всех заменяемых блоков, а при удалении платформы восстанавливать. Но с крафтбаккитом про этот вариант можно забыть
     
    Последнее редактирование: 10 сен 2021
  8. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Последнее редактирование: 9 сен 2021
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Сам потом сбежит на бумагу, как дюпать начнут :D
     
  10. Witenin

    Witenin Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Witenin
    Ахахах, ну и сиди дальше на нём, динозафр...
     
  11. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Мне кажется, он прибежит сюда с воплями "ПАМАГИТИ миня крашают"
     
  12. Автор темы
    Kloper

    Kloper Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    f3azzy
    никто не начнёт дюпать, ибо это не сервер выживания
     
  13. Witenin

    Witenin Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Witenin
    Разницы не меняет. На бумаге больше возможностей но ты как хочешь, пиши костыли дальше
     
  14. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Ну чел, зачем ты делаешь мини-игры на древней фигне? Бумага тупо быстрее
     
  15. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    В чем проблема взять тип блока и проверить воздух он или нет?
    А вообще у тебя один сплошной костыль, но именно по проблеме:
    Код:
    if (Location.getBlock().getType() == Material.AIR) {
    //Изменяешь блок 
    }
     
  16. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    isEmpty по докам делает то же самое. А если почитаешь тему, то костыль - не самое страшное, что у него на сервере
     
  17. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Мне абсолютно без разницы какое у него ядро, ибо если он пишет на нем, значит ему удобно, либо есть причины/принципы не переходить. Посоветовать перейти - логично, но из этого разбивать конфликт не надо.
    К тому же, я сам не проверял, но если он написал, что у него нет такого метода, я уверен, что получение типа блока есть
     
  18. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    имданих уже нашёл его в стандартном ведре
     

Поделиться этой страницей