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

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

Discussion in 'Разработка плагинов для новичков' started by HunterGaming, Dec 4, 2016.

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

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

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

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

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

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

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

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

    Trophy Points:
    46
    Вот код из алгоритма выше, только создает кубоид он на блоке(targetBlock), на который мы смотрим:
    Code:
    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 Активный участник Пользователь

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

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

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

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

    Trophy Points:
    46
    Это радиус.У меня кастомная реализация этого метода, так как стандартный устарел и может работать неправильно.[DOUBLEPOST=1480975740][/DOUBLEPOST]В реализации, что выше, есть один минус, он создает блок, опираясь на target, но target в нём не центральный, а угловой.А вот код, который создает блок, где targetBlock - центральный, соотв. получается, что блок создается во всех направлениях:
    Code:
                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 Старожил

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

Share This Page