Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Заполнение определенной области блоками

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

  1. Автор темы
    HunterGaming

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

    Баллы:
    46
    Имя в Minecraft:
    HunterGaming13
    Что мне нужно? Заполнить определенную область блоками, похожая команда есть в WE //set, но мне нужен сам код как это сделать?
     
  2. Хостинг MineCraft
    <
  3. AtomicInteger

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

    Баллы:
    46
    Тебе нужна формула, которая чаще всего выражается циклами, примеры можешь глянуть в WE, там есть и кубоид и сфера и полая сфера.После прохождения по формуле добавляешь в массив с типом Location каждый входящий блок.Дальше заполняешь эти значения нужным блоком.
     
  4. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    слишком костыль.
    Vector
     
  5. AtomicInteger

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

    Баллы:
    46
    Вот код из алгоритма выше, только создает кубоид он на блоке(targetBlock), на который мы смотрим:
    Код:
    Block targetBlock = getTargetBlock(player, 100);
    for (int x = 0; x < 5; x++)
        for (int y = 0; y < 5; y++)
            for (int z = 0; z < 5; z++) {
                int targetX = targetBlock.getX();
                int targetY = targetBlock.getY();
                int targetZ = targetBlock.getZ();
                Location blockLocation = new Location(targetBlock.getWorld(), targetX + x, targetY + y, targetZ + z);
                blockLocation.getBlock().setType(Material.BRICK);
            }
    Вот результат выполнения:
    [​IMG]
    Как реализовать через Vector?
     
  6. SimMiMo

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

    Баллы:
    76
    Тут важна производительность, от нее и следует отталкиваться.
    Кому интересно, проведет юнит тесты, покопается.
     
  7. Автор темы
    HunterGaming

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

    Баллы:
    46
    Имя в Minecraft:
    HunterGaming13
    Благодарствую, завтра попробую.[DOUBLEPOST=1480971658,1480971355][/DOUBLEPOST]
    Можно еще уточнить. Что означает цифра 100, в получении блока на который смотрит игрок?
     
  8. AtomicInteger

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

    Баллы:
    46
    Это радиус.У меня кастомная реализация этого метода, так как стандартный устарел и может работать неправильно.[DOUBLEPOST=1480975740][/DOUBLEPOST]В реализации, что выше, есть один минус, он создает блок, опираясь на target, но target в нём не центральный, а угловой.А вот код, который создает блок, где targetBlock - центральный, соотв. получается, что блок создается во всех направлениях:
    Код:
                if (getTargetBlock(player, 100) != null && getTargetBlock(player, 100).getType() != Material.AIR) {
                    Block targetBlock = getTargetBlock(player, 100);
                    ArrayList<Location> locationBlocks = new ArrayList<>();
                    for (int x = 0; x < 5; x++)
                        for (int y = 0; y < 5; y++)
                            for (int z = 0; z < 5; z++) {
                                int targetX = targetBlock.getX();
                                int targetY = targetBlock.getY();
                                int targetZ = targetBlock.getZ();
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX + x, targetY + y, targetZ + z));
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX + x, targetY - y, targetZ - z));
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX + x, targetY - y, targetZ + z));
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX + x, targetY + y, targetZ - z));
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX - x, targetY - y, targetZ - z));
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX - x, targetY + y, targetZ - z));
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX - x, targetY - y, targetZ + z));
                                locationBlocks.add(new Location(targetBlock.getWorld(), targetX - x, targetY + y, targetZ + z));
    
                            }
                    for(Location blockLoc : locationBlocks)
                        blockLoc.getBlock().setType(Material.BRICK);
                }
    Выглядит, мягко говоря, не очень, так что можете попытаться сократить.Длина ребра куба = 2r -1, где r - значение, которое мы указали в циклах(5).Осторожно, при особо большом r может вызвать лаги.
    Результат выполнения такого кода:
    [​IMG]
    [​IMG]
    [​IMG]
     
  9. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Удваиваю. Четыре цикла в основном быстрее трёх.
    Даже тред был, где это и оспаривалось, и защищалось.
     

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