Войти или зарегистрироваться

Помогите Как поворачивать куб на 90 градусов

  • Автор темы Автор темы xflyiwnl
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

xflyiwnl

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
xflyiwnl
У меня есть куб, теперь этот куб надо поворачивать налево (90 градусов) или направо (90 градусов). Такое возможно? Позже гляну и на сурс код World Edit.
 
Все гуру разработчики, отзовитесь
 
Что-то мешает использовать, собственно, WE API? Плюс поддержка вставки от FAWE из коробки.
 
В первую очередь тебе требуется как-то сохранить текущее состояние. Допустим, сохраним в трехмерный массив
PHP:
public static BlockState[][][] getBlocksMatrix(Location start, int size) {
    BlockState[][][] matrix = new BlockState[size][size][size];
    Block startBlock = start.getBlock();
    for (int x = 0; x < size; x++) {
        Block xBlock = startBlock.getRelative(x, 0, 0);
        for (int y = 0; y < size; y++) {
            Block yBlock = xBlock.getRelative(0, y, 0);
            for (int z = 0; z < size; z++) {
                matrix[x][y][z] = yBlock.getRelative(0, 0, z).getState();
            }
        }
    }
    return matrix;
}
Это нужно, чтоб была возможность в принципе откуда-то брать данные, не подтирая те в процессе. BlockState не меняется, если его Block был изменен, так что используем его.
Далее, просто мухлюем с индексами массива, чтоб брать и устанавливать нужные блоки.
PHP:
public static void rotateBlocks(BlockState[][][] matrix) {
    int size = matrix.length;
    int fixSize = size - 1;
    for (int x = 0; x < size; x++) {
        for (int y = 0; y < size; y++) {
            for (int z = 0; z < size; z++) {
                BlockState cursor = matrix[x][y][z];
                BlockState target = matrix[z][y][fixSize-x].getBlock().getState();
                target.setType(cursor.getType());
                target.setBlockData(cursor.getBlockData());
                target.update(true, false);
            }
        }
    }
}
Код выше повернет куб на 90 градусов против часовой. Поиграв с получением target из matrix можно повернуть куб в нужную тебе сторону, и даже отзеркалить.
Также замечу, код не берет в расчет повороты отдельных блоков, вроде ступенек, табличек и прочих. Там тоже должна быть своя своеобразная логика, но в целом можно сделать, опираясь на описанную ранее. В любом случае, тебе придется учесть BlockData - Directional, Orientable и MultipleFacing.

Код написан на скорую руку, и может быть неэффективен. Чисто технически, возможно всё сделать без сохранения дополнительных данных в массив, меняя блоки местами сразу, но мне было слишком лень править код к моменту осознания. Да и итоговый код выходит более универсальным.
 
На WorldEdit API легче перевернуть? Как думаешь?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх