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

Помогите Вставляем схематик

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

  1. Автор темы
    reZero

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

    Баллы:
    76
    Когда игрок ставит блок, отменяю ивент, отбираю блок у игрока и на месте, куда он им тыкнул (тобишь хотел поставить) ставлю схематик.
    Мне нужно, чтобы схематик вставился центром по блоку, на который кликнул игрок. А сейчас у меня получается так, что схематик ставится на пару блоков дальше и сбоку

    Может быть, конечно, у меня проблемы с математикой, но я реально не понимаю, как оно вставляется и как его отрегулировать. Могёт кто объяснить ?

    (1.12.2)

    HTML:
     
    Location toPaste = event.getBlockPlaced().getLocation();
    loadArea(player.getWorld(), Main.getSchem(), BukkitUtil.toVector(toPaste));
    
    private void loadArea(World world, File file, Vector origin) {
            EditSession es = new EditSession(new BukkitWorld(world), 999999999);
            CuboidClipboard cc = null;
            try {
                cc = CuboidClipboard.loadSchematic(file);
            } catch (DataException e) {
                //e.printStackTrace();
            } catch (IOException e) {
                //e.printStackTrace();
            }
            try {
                cc.paste(es, origin, false);
            } catch (MaxChangedBlocksException e) {
                //e.printStackTrace();
            }
        }
     
  2. _MRDen3000YT_

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

    Баллы:
    76
    ну так вставляй на на несколько блоков в бок, в чем проблема?
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Значит ты его сохранил стоя в углу.
     
  4. Автор темы
    reZero

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

    Баллы:
    76
    Я думал мб есть какой-то другой способ
     
  5. Автор темы
    reZero

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

    Баллы:
    76
    Ну копировал от угла к углу
    А как надо?)
     
  6. HauserGrim

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

    Баллы:
    96
    Постройка копируется и вставляется относительно игрока. (следовательно и схематик сохраняется относительно определённой позиции, а не высчитывается центр)
     
    Последнее редактирование: 11 дек 2020
  7. Автор темы
    reZero

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

    Баллы:
    76
    Не знал
    Проверю чуть позже, отпишусь
     
  8. Iimpro608

    Iimpro608 Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Iimpro608
    Команды.
    Код:
    //schematic list - лист схематик.
    //schematic load <name> - загрузить схематику. Название схематики до точки(без .schematic) (загрузка в буфер)
    //paste  - Поставить загруженный объект.
    //rotate <градус> - повернуть загруженную схематику(она поварачивается внутри буфера) (должно быть кратно 90)
    На счет его места появления. Чаще всего схематика при прогрузке появляется так, что ты стоишь в углу постройки. (Это не исправить, если только ты сам не создашь схематку)
     
  9. MurlikMurlik

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

    Баллы:
    96
    Бери схему и меняй в ней относительную локацию на нужную локацию и тогда все вставится правильно.
     
  10. Автор темы
    reZero

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

    Баллы:
    76
    Я не понимаю, какой параметр там отвечает за относительную локацию
     
  11. Автор темы
    reZero

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

    Баллы:
    76
    Я попробовал сделать "правильный" схематик и понял вот что:
    Когда я его вставляю, он вроде вставляется, все как по маслу, но есть одно НО:
    вставляется он так же той стороной, которой его копировали. То есть, если я смотрел в одну сторону и копировал, неважно куда я буду смотреть, когда буду его вставлять - он все равно вставиться так, как я его копировал. А мне надо его вставить перед лицом игрока, соответственно в сторону, в которую смотрит игрок.

    Я уже пробовал шаманить с передаваемым в метод loadArea параметром-вектором origin, но все равно вставляется так же
    Я не понимаю, что мне нужно еще поменять?

    Я уже думал над костыльным способом: вращать схематик в ту сторону, куда смотрит игрок, через угол. Но, думаю, это не самый лучший способ реализации

    Подскажите, какой из параметров и как нужно отредактировать?
     
  12. Iimpro608

    Iimpro608 Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Iimpro608
    Я уже писал сверхну, если хочешь повернуть лицом постройку, нужно:
    WorldEdit или FAWE
    Там есть команда //rotate <угол>
    И потом просто вставляешь.

    Если это не работает, ставь постройку где то, потом возьми позиции (1-ую и 2-ую как в привате дома) и напиши //copy. Дальше снова //rotate
     
  13. Автор темы
    reZero

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

    Баллы:
    76
    Я же написал, что знаю про rotate. Но прикол в том, что мне постоянно придется вычислять нужный угол, на который нужно будет повернуть постройку
    Вот я и спрашиваю: возможно есть варианты лучше?
    Человек сверху написал мне, что можно менять относительную локацию... Вот я и пытаюсь здесь узнать, как это можно сделать, потому что я таких методов не вижу. Может кто ткнет носом в подходящий вариант
     
  14. HauserGrim

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

    Баллы:
    96
    Берёшь взгялд и ротейтишь как надо перед вставкой, логично.
    Место, относительно которого постройка сохранена и вставляется, это не будет её поворачивать.
     
  15. MurlikMurlik

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

    Баллы:
    96
    CuboidClipboard#setOrigin

    Создай вектор com.sk89q.worldedit.Vector, в качестве аргумента введи x, y , z из координат игрока (но перед этим отмени от каждой координаты игрока координату текущего смещения получив вектор методом getOrigin), передай этот вектор тому методу и ты установишь относительную локацию.
    Теперь при вставке схемы, она будет ставится туда куда нужно.
     
  16. adodvstudios

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

    Баллы:
    76
    Имя в Minecraft:
    Jenka20091
    Код:
    WorldEditPlugin we = (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit");
            
            p.teleport(new Location(Bukkit.getWorld("islands"), IslandLocation.islandX, IslandLocation.islandY, IslandLocation.islandZ));
    
            File schematic = new File("plugins/AdodvStudios/" + "default.schematic");
            EditSession session = we.getWorldEdit()
                .getEditSessionFactory()
                .getEditSession(
                    new BukkitWorld(Bukkit.getWorld("islands")), 1000000
                );
            try {
               MCEditSchematicFormat.getFormat(schematic).load(schematic)
                    .paste(session, new Vector(IslandLocation.islandX, IslandLocation.islandY, IslandLocation.islandZ), false);
            } catch (MaxChangedBlocksException|com.sk89q.worldedit.data.DataException | IOException e2) {
                e2.printStackTrace();
            }
            
            if(p.getWorld() == Bukkit.getWorld("islands")) {
                p.sendMessage("Вы вошли на свой остров!");
            }
    Ты уж сам разберись, я свой скайблок делал.
    P.S.IslandLocation.islandX -- это координата X
     
  17. Автор темы
    reZero

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

    Баллы:
    76
    Все равно не перед лицом спавнится


    Код:
        
    Location toPaste = event.getBlockPlaced().getLocation();
    loadArea(player.getWorld(), Main.getSchem(), BukkitUtil.toVector(toPaste), player);
    
    private void loadArea(World world, File file, Vector origin, Player player) {
            EditSession es = new EditSession(new BukkitWorld(world), 999999999);
            CuboidClipboard cc = null;
            try {
                cc = CuboidClipboard.loadSchematic(file);
            } catch (DataException e) {
                //e.printStackTrace();
            } catch (IOException e) {
                //e.printStackTrace();
            }
            try {
    
                Location location = player.getEyeLocation();
                location.subtract(cc.getOrigin().getBlockX(), cc.getOrigin().getBlockY(), cc.getOrigin().getBlockZ());
                Vector vector = new Vector(location.getBlockX(), location.getBlockY(), location.getBlockZ());
                cc.setOrigin(vector);
                cc.paste(es, origin, false);
            } catch (MaxChangedBlocksException e) {
                //e.printStackTrace();
            }
        }
     
  18. Автор темы
    reZero

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

    Баллы:
    76
    не помогло
     
  19. Автор темы
    reZero

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

    Баллы:
    76
  20. adodvstudios

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

    Баллы:
    76
    Имя в Minecraft:
    Jenka20091
    Версия World Edit какая? И ещё версия баккита. Помогу в лс
     

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