1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем xflyiwnl, 3 авг 2022.

Статус темы:
Закрыта.
  1. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    У меня есть куб, теперь этот куб надо поворачивать налево (90 градусов) или направо (90 градусов). Такое возможно? Позже гляну и на сурс код World Edit.
     
  2. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Все гуру разработчики, отзовитесь
     
  3. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Что-то мешает использовать, собственно, WE API? Плюс поддержка вставки от FAWE из коробки.
     
  4. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Если без него это делать?
     
  5. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В первую очередь тебе требуется как-то сохранить текущее состояние. Допустим, сохраним в трехмерный массив
    PHP:
    public static BlockState[][][] getBlocksMatrix(Location startint size) {
        
    BlockState[][][] matrix = new BlockState[size][size][size];
        
    Block startBlock start.getBlock();
        for (
    int x 0sizex++) {
            
    Block xBlock startBlock.getRelative(x00);
            for (
    int y 0sizey++) {
                
    Block yBlock xBlock.getRelative(0y0);
                for (
    int z 0sizez++) {
                    
    matrix[x][y][z] = yBlock.getRelative(00z).getState();
                }
            }
        }
        return 
    matrix;
    }
    Это нужно, чтоб была возможность в принципе откуда-то брать данные, не подтирая те в процессе. BlockState не меняется, если его Block был изменен, так что используем его.
    Далее, просто мухлюем с индексами массива, чтоб брать и устанавливать нужные блоки.
    PHP:
    public static void rotateBlocks(BlockState[][][] matrix) {
        
    int size matrix.length;
        
    int fixSize size 1;
        for (
    int x 0sizex++) {
            for (
    int y 0sizey++) {
                for (
    int z 0sizez++) {
                    
    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(truefalse);
                }
            }
        }
    }
    Код выше повернет куб на 90 градусов против часовой. Поиграв с получением target из matrix можно повернуть куб в нужную тебе сторону, и даже отзеркалить.
    Также замечу, код не берет в расчет повороты отдельных блоков, вроде ступенек, табличек и прочих. Там тоже должна быть своя своеобразная логика, но в целом можно сделать, опираясь на описанную ранее. В любом случае, тебе придется учесть BlockData - Directional, Orientable и MultipleFacing.

    Код написан на скорую руку, и может быть неэффективен. Чисто технически, возможно всё сделать без сохранения дополнительных данных в массив, меняя блоки местами сразу, но мне было слишком лень править код к моменту осознания. Да и итоговый код выходит более универсальным.
     
  6. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    На WorldEdit API легче перевернуть? Как думаешь?
     
  7. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Может несовсем легче, но явно надежнее и эффективнее.
     
Статус темы:
Закрыта.

Поделиться этой страницей