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

  • Автор темы Автор темы 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();
        }
    }
 
Когда игрок ставит блок, отменяю ивент, отбираю блок у игрока и на месте, куда он им тыкнул (тобишь хотел поставить) ставлю схематик.
Мне нужно, чтобы схематик вставился центром по блоку, на который кликнул игрок. А сейчас у меня получается так, что схематик ставится на пару блоков дальше и сбоку

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

(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();
        }
    }
ну так вставляй на на несколько блоков в бок, в чем проблема?
 
Ну копировал от угла к углу
А как надо?)
Постройка копируется и вставляется относительно игрока. (следовательно и схематик сохраняется относительно определённой позиции, а не высчитывается центр)
 
Последнее редактирование:
Команды.
Код:
//schematic list - лист схематик.
//schematic load <name> - загрузить схематику. Название схематики до точки(без .schematic) (загрузка в буфер)
//paste  - Поставить загруженный объект.
//rotate <градус> - повернуть загруженную схематику(она поварачивается внутри буфера) (должно быть кратно 90)

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

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

(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();
        }
    }
Бери схему и меняй в ней относительную локацию на нужную локацию и тогда все вставится правильно.
 
Я попробовал сделать "правильный" схематик и понял вот что:
Когда я его вставляю, он вроде вставляется, все как по маслу, но есть одно НО:
вставляется он так же той стороной, которой его копировали. То есть, если я смотрел в одну сторону и копировал, неважно куда я буду смотреть, когда буду его вставлять - он все равно вставиться так, как я его копировал. А мне надо его вставить перед лицом игрока, соответственно в сторону, в которую смотрит игрок.

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

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

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

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

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

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

Если это не работает, ставь постройку где то, потом возьми позиции (1-ую и 2-ую как в привате дома) и напиши //copy. Дальше снова //rotate
 
Я уже писал сверхну, если хочешь повернуть лицом постройку, нужно:
WorldEdit или FAWE
Там есть команда //rotate <угол>
И потом просто вставляешь.

Если это не работает, ставь постройку где то, потом возьми позиции (1-ую и 2-ую как в привате дома) и напиши //copy. Дальше снова //rotate
Я же написал, что знаю про rotate. Но прикол в том, что мне постоянно придется вычислять нужный угол, на который нужно будет повернуть постройку
Вот я и спрашиваю: возможно есть варианты лучше?
Человек сверху написал мне, что можно менять относительную локацию... Вот я и пытаюсь здесь узнать, как это можно сделать, потому что я таких методов не вижу. Может кто ткнет носом в подходящий вариант
 
вычислять нужный угол, на который нужно будет повернуть постройку
Берёшь взгялд и ротейтишь как надо перед вставкой, логично.
можно менять относительную локацию
Место, относительно которого постройка сохранена и вставляется, это не будет её поворачивать.
 
Я не понимаю, какой параметр там отвечает за относительную локацию
CuboidClipboard#setOrigin

Создай вектор com.sk89q.worldedit.Vector, в качестве аргумента введи x, y , z из координат игрока (но перед этим отмени от каждой координаты игрока координату текущего смещения получив вектор методом getOrigin), передай этот вектор тому методу и ты установишь относительную локацию.
Теперь при вставке схемы, она будет ставится туда куда нужно.
 
Код:
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
 
CuboidClipboard#setOrigin

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


Код:
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();
        }
    }
 
Код:
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
не помогло
 
Версия World Edit какая? И ещё версия баккита. Помогу в лс
 
Назад
Верх