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

HunterGaming

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
sqdFendy
Что мне нужно? Заполнить определенную область блоками, похожая команда есть в WE //set, но мне нужен сам код как это сделать?
 
Что мне нужно? Заполнить определенную область блоками, похожая команда есть в WE //set, но мне нужен сам код как это сделать?
Тебе нужна формула, которая чаще всего выражается циклами, примеры можешь глянуть в WE, там есть и кубоид и сфера и полая сфера.После прохождения по формуле добавляешь в массив с типом Location каждый входящий блок.Дальше заполняешь эти значения нужным блоком.
 
Тебе нужна формула, которая чаще всего выражается циклами, примеры можешь глянуть в WE, там есть и кубоид и сфера и полая сфера.После прохождения по формуле добавляешь в массив с типом Location каждый входящий блок.Дальше заполняешь эти значения нужным блоком.
слишком костыль.
Vector
 
слишком костыль.
Vector
Вот код из алгоритма выше, только создает кубоид он на блоке(targetBlock), на который мы смотрим:
Java:
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);
        }
Вот результат выполнения:

Как реализовать через Vector?
 
Тут важна производительность, от нее и следует отталкиваться.
Кому интересно, проведет юнит тесты, покопается.
 
Вот код из алгоритма выше, только создает кубоид он на блоке(targetBlock), на который мы смотрим:
Java:
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);
        }
Вот результат выполнения:

Как реализовать через Vector?

Благодарствую, завтра попробую.
Вот код из алгоритма выше, только создает кубоид он на блоке(targetBlock), на который мы смотрим:
Java:
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);
        }
Вот результат выполнения:

Как реализовать через Vector?

Можно еще уточнить. Что означает цифра 100, в получении блока на который смотрит игрок?
 
Благодарствую, завтра попробую.


Можно еще уточнить. Что означает цифра 100, в получении блока на который смотрит игрок?
Это радиус.У меня кастомная реализация этого метода, так как стандартный устарел и может работать неправильно.
В реализации, что выше, есть один минус, он создает блок, опираясь на target, но target в нём не центральный, а угловой.А вот код, который создает блок, где targetBlock - центральный, соотв. получается, что блок создается во всех направлениях:
Java:
            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 может вызвать лаги.
Результат выполнения такого кода:


 
Тут важна производительность, от нее и следует отталкиваться.
Кому интересно, проведет юнит тесты, покопается.
Удваиваю. Четыре цикла в основном быстрее трёх.
Даже тред был, где это и оспаривалось, и защищалось.
 
Назад
Верх