Генерация кубов циклами в удобном представлении

Генерация кубов циклами в удобном представлении

Версия(и) Minecraft
1.7.10+
Доброго времени суток.
Здесь я скину несложный код генерации, которым я пользовался года два назад, а сегодня случайно обнаружил в текстовом файле.
Внимание: Данный код НЕ "хороший", служит в первую очередь для упрощения представления и понимания работы циклов в области майнкрафта. На практике данный код является некачественным, и НЕ рекомендуется к применению в исходном виде.
Итак, по пунктам, ибо моя фантазия сегодня на нуле:
Версия майнкрафт:
При желании любая, но здесь только для 1.7.10+ и для 1.8+
Для кого предназначен:
Для тех, кто при генерации больших структур, пользуется исключительно:
Java:
    world.setBlock(x + 1, y, z, state);
    world.setBlock(x, y, z, state);
    world.setBlock(x, y + 1, z, state);
    world.setBlock(x, y, z + 1, state);
    world.setBlock(x, y - 1, z, state);
Кому пригодится:
Тем, кто использует в коде подобные конструкции, но считает их недостаточно гибкими:
Java:
for (int x = 0; x < mX; ++x) {
    for (int y = 0; y < mY; ++y) {
        for (; currZ > minZ; --z) {
            world.setBlock(x, y, currZ-2, state);
            world.setBlock(x-2, y, currZ, state);
        }
    }
}
Для кого неактуально:
Для тех, кто хорошо ориентируется вот в этом:
Java:
for (int x = 0; x < mX; ++x) {
    for (int y = 0; y < mY; ++y) {
        for (int z = 0; z < mZ; ++z) {
            world.setBlockState (x >> yM, y, z);
            world.setBlockState (x, y, z & 7);
            world.setBlockState (x, y | 7 % 3 == 0 ? y : y | 7, z);
        }
    }
}
Или вот в этом:
Java:
ArrayList<BlockPos> finalPosition = Arrays.steam(positions)
    .filter(ModUtils::equalsToPerfect)
    .skip(new Random().nextInt(10) + 5)
    .forEach(e -> e.up())
    .filter(e -> e.getY() < 230)
    .collect(Collectors.toList())
for (BlockPos pos : finalPosition)
    world.setBlockState(pos, Blocks.STONE.getDefaultState())
Достоинства:
Код лёгок для понимания и представления, работа выполняется в 10-ой системе счисления, легко редактировать существующие условия, легко использовать отладку.
Недостатки:
Код с точки зрения логики очень непрактичен и в простонародье именуется "говнокод", есть конструкции более короткие и гибкие, сложно вводить новые условия в дополнение к существующим.
--------------------------------------------------------------------------------
В общем вот код:
Java:
/**
* Коробка без пола и потолка
*/
private void set(World world, int currX, int currY, int currZ, Block block, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //Проверяем, что по x или z координыты пренадлежат
                //к граням коробки (либо равны нулю, либо максимально допустимому)
                if(!(x > 0 && x < width-1) || !(z > 0 && z < lenght-1)) {
                    world.setBlock(currX+x, currY+y, currZ+z, block);                    
                }
            }
        }
    }
}
Java:
/**
* Коробка с полом и потолком.
*/
private void set(World world, int currX, int currY, int currZ, Block block, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //То же самое, что в предыдущем примере,
                //но добавляем проверку по оси y
                if(!(x > 0 && x < width-1) || !(z > 0 && z < lenght-1) || !(y > 0 && y < height-1)) {
                    world.setBlock(currX+x, currY+y, currZ+z, block);                       
                }
            }
        }
    }
}
Java:
/**
* Четыре колоны по углам квадрата
*/
private void set(World world, int currX, int currY, int currZ, Block block, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //Проверяем, что по x или z координыты пренадлежат
                //к граням коробки, но только тогда, когда это
                //верно И для х И для z одновременно
                //(То-есть рёбра куба. Здесь верхние рёбра исключены.)
                if(!(x > 0 && x < width-1) && !(z > 0 && z < lenght-1)) {
                    world.setBlock(currX+x, currY+y, currZ+z, block);
                }
            }
        }
    }
}
Java:
/**
*Восемь кубов по углам куба
*/
private void set(World world, int currX, int currY, int currZ, Block block, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //Ужесточаем предыдущую проверку, чтобы И x И y И z
                //были либо нулём либо максимальным, а это происходит
                //только на пересечении трёх осей, то-есть в углах куба
                if(!(x > 0 && x < width-1) && !(z > 0 && z < lenght-1) && !(y > 0 && y < height-1)) {
                    world.setBlock(currX+x, currY+y, currZ+z, block);
                }
            }
        }
    }
}
Java:
/**
* Коробка без пола и потолка
*/
private void set(World world, BlockPos position, IBlockState stateMaterial, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //Проверяем, что по x или z координыты пренадлежат
                //к граням коробки (либо равны нулю, либо максимально допустимому)
                if(!(x > 0 && x < width-1) || !(z > 0 && z < lenght-1)) {
                    world.setBlockState(position.add(x, y, z), stateMaterial);                    
                }
            }
        }
    }
}
Java:
/**
* Коробка с полом и потолком.
*/
private void set(World world, BlockPos position, IBlockState stateMaterial, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //То же самое, что в предыдущем примере,
                //но добавляем проверку по оси y
                if(!(x > 0 && x < width-1) || !(z > 0 && z < lenght-1) || !(y > 0 && y < height-1)) {
                    world.setBlockState(position.add(x, y, z), stateMaterial);                    
                }
            }
        }
    }
}
Java:
/**
* Четыре колоны по углам квадрата
*/
private void set(World world, BlockPos position, IBlockState stateMaterial, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //Проверяем, что по x или z координыты пренадлежат
                //к граням коробки, но только тогда, когда это
                //верно И для х И для z одновременно
                //(То-есть рёбра куба. Здесь верхние рёбра исключены.)
                if(!(x > 0 && x < width-1) && !(z > 0 && z < lenght-1)) {
                    world.setBlockState(position.add(x, y, z), stateMaterial);
                }
            }
        }
    }
}
Java:
/**
*Восемь кубов по углам куба
*/
private void set(World world, BlockPos position, IBlockState stateMaterial, int width, int lenght, int height) {
    for(int x = 0; x < width; x++) {
        for(int y = 0; y < height; y++) {
            for(int z = 0; z < lenght; z++) {
                //Ужесточаем предыдущую проверку, чтобы И x И y И z
                //были либо нулём либо максимальным, а это происходит
                //только на пересечении трёх осей, то-есть в углах куба
                if(!(x > 0 && x < width-1) && !(z > 0 && z < lenght-1) && !(y > 0 && y < height-1)) {
                    world.setBlockState(position.add(x, y, z), stateMaterial);
                }
            }
        }
    }
}
  • Like
Реакции: Liahim и TheLivan
Автор
mousecray
Просмотры
1,634
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя mousecray

Последние обновления

  1. Исправлено описание

    Автор получил фидбек в комментариях, учёл и в соответствии с предполагаемым посылом подправил...
Сверху