- Версия(и) Minecraft
- 1.7.10+
Доброго времени суток.
Здесь я скину несложный код генерации, которым я пользовался года два назад, а сегодня случайно обнаружил в текстовом файле.
Внимание: Данный код НЕ "хороший", служит в первую очередь для упрощения представления и понимания работы циклов в области майнкрафта. На практике данный код является некачественным, и НЕ рекомендуется к применению в исходном виде.
Итак, по пунктам, ибо моя фантазия сегодня на нуле:
Версия майнкрафт:
При желании любая, но здесь только для 1.7.10+ и для 1.8+
Для кого предназначен:
Для тех, кто при генерации больших структур, пользуется исключительно:
Кому пригодится:
Тем, кто использует в коде подобные конструкции, но считает их недостаточно гибкими:
Для кого неактуально:
Для тех, кто хорошо ориентируется вот в этом:
Или вот в этом:
Достоинства:
Код лёгок для понимания и представления, работа выполняется в 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);
}
}
}
}
}