Вставить регион и заменить сундуки WE API

  • Автор темы Автор темы Snowmaze
  • Дата начала Дата начала

Snowmaze

Участник
Пользователь
Баллы
36
Мне нужно вставить регион скопированный с помощью //copy и заменить в нём сундуки на воздух. Как можно сделать? Версия 1.12.2
 
Вставить с помощью //paste, а потом выделить новое место и заменить сундуки на воздух с помощью //replace chest air
 
Код:
WorldEdit.getInstance().getEventBus().register(new MyEventHandler());

Код:
package Example;

import com.sk89q.worldedit.event.extent.EditSessionEvent;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import com.sk89q.worldedit.EditSession;

public class MyEventHandler {
    @Subscribe
    public void onEditSessionChange(EditSessionEvent event) {
        if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) {
            event.setExtent(new DelegateExtent(event.getExtent()));
        }
    }
}

Код:
package Example;

import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;

public class DelegateExtent extends AbstractDelegateExtent {
    public DelegateExtent(Extent extent) {
        super(extent);
    }

    @Override
    public boolean setBlock(BlockVector3 location, BlockStateHolder block) throws WorldEditException {
        BlockStateHolder oldBlock = getBlock(location);
        if(block.getAsString().equals("minecraft:chest")) {
            //TODO не знаю пока как поменять стату). Не искал, потому просто пропуск.
            return true;
        }
        return super.setBlock(location, block);
    }
}
 
Последнее редактирование:
2019-06-06_11-31-58.png Посмотреть вложение 54027 Посмотреть вложение 54026
Код:
WorldEdit.getInstance().getEventBus().register(new MyEventHandler());

Код:
package Example;

import com.sk89q.worldedit.event.extent.EditSessionEvent;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import com.sk89q.worldedit.EditSession;

public class MyEventHandler {
    @Subscribe
    public void onEditSessionChange(EditSessionEvent event) {
        if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) {
            event.setExtent(new DelegateExtent(event.getExtent()));
        }
    }
}

Код:
package Example;

import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;

public class DelegateExtent extends AbstractDelegateExtent {
    public DelegateExtent(Extent extent) {
        super(extent);
    }

    @Override
    public boolean setBlock(BlockVector3 location, BlockStateHolder block) throws WorldEditException {
        BlockStateHolder oldBlock = getBlock(location);
        if(oldBlock.getAsString().equals("minecraft:chest")) {
            //TODO не знаю пока как поменять стату). Не искал, потому просто пропуск.
            return true;
        }
        return super.setBlock(location, block);
    }
}
Почему-то не работает, я проставил логи, там метод onEditSessionChange ещё вызывается,а setBlock уже не вызывается. Сундук остаётся
 
Последнее редактирование:
Касячек допустил. Там блок проверялся не в клипбоарде, а на карте). Поправил.
 
Почему-то не работает, я проставил логи, там метод onEditSessionChange ещё вызывается,а setBlock уже не вызывается. Сундук остаётся
Пошамань с EditSession.Stage, может тебе на другой стадии ловить надо.
 
Пошаманил, но сам метод setBlock не вызывается, хотя
Код:
event.getStage() == EditSession.Stage.BEFORE_CHANGE
возвращает true два раза
Ну все значит работает, если только еще какой то плагин не подменяет Extent.
 
Это локалка, тут нету ничего не заменяет. А сундуки как были так и остаются. У меня стоит API 7.0.0 версии если надо
 

Вложения

  • 2019-06-06_13-46-56.png
    2019-06-06_13-46-56.png
    25,8 КБ · Просмотры: 6
Уж не знаю как ты сломал, то что юзалось и работало. На той же версии причем. Ток у меня проверялся блок в мире, вся разница.
 
Уж не знаю как ты сломал, то что юзалось и работало. На той же версии причем. Ток у меня проверялся блок в мире, вся разница.
Я всё точно перекопил. Если происходит проверка, то по идее должен вызываться метод setBlock, но он так и не вызывался
2019-06-06_14-00-28.png 2019-06-06_14-00-42.png 2019-06-06_14-00-52.png
 
Вот собрал тебе, там нужно было вот так.

Код:
public class DelegateExtent extends AbstractDelegateExtent {
    public DelegateExtent(Extent extent) {
        super(extent);
    }

    @Override
    public boolean setBlock(BlockVector3 location, BlockStateHolder block) throws WorldEditException {
        if (block.getAsString().contains("minecraft:chest")) {
            return true;
        }
        return super.setBlock(location, block);
    }
}
 
Последнее редактирование:
Вот собрал тебе, там нужно было вот так.

Код:
public class DelegateExtent extends AbstractDelegateExtent {
    public DelegateExtent(Extent extent) {
        super(extent);
    }

    @Override
    public boolean setBlock(BlockVector3 location, BlockStateHolder block) throws WorldEditException {
        if (block.getAsString().contains("minecraft:chest")) {
            return true;
        }
        return super.setBlock(location, block);
    }
}
Ссылка почему-то не работает и сундуки всё равно вставляются xD
Как не изменяй этот setBlock внутри, факт - этот метод вообще не вызывается
Надеюсь, этот Extent используется до paste,а не после
 

Вложения

  • 2019-06-06_14-29-05.png
    2019-06-06_14-29-05.png
    28,3 КБ · Просмотры: 9
  • 2019-06-06_14-30-47.png
    2019-06-06_14-30-47.png
    453,6 КБ · Просмотры: 7
Последнее редактирование:
Все, нашел как сетнуть воздух. Обновил плаг. Ссылку поправил.
Код:
        if (block.getAsString().contains("minecraft:chest")) {
            return super.setBlock(location, BukkitAdapter.adapt(Bukkit.createBlockData(Material.AIR)));
        }
 
Все, нашел как сетнуть воздух. Обновил плаг. Ссылку поправил.
Код:
        if (block.getAsString().contains("minecraft:chest")) {
            return super.setBlock(location, BukkitAdapter.adapt(Bukkit.createBlockData(Material.AIR)));
        }
Вы видимо в том плагине в ссылке забыли добавить либу, у меня всю консоль заспамило наллами 😁
 
Назад
Верх