Помогите [Решено] Как установить флаг на регион

Статус
Закрыто для дальнейших ответов.

IlyaHaker

Активный участник
Пользователь
Баллы
76
Нужно запретить ставить в регион определенный блок, если он уже есть там.
Самые очевидные варианты - записать название региона куда-то в конфиг и при установке блока проверять, есть ли этот регион в списке. Но этот вариант мне не подходит
Так же есть другой вариант - сделать кастомный флаг, но это доступно с версии WG 6.2
Есть ли еще какие-то варианты?
 
public void onLoad() {
WorldGuard.getInstance().getFlagRegistry().register(FlagObject);
Код:
public class CustomStateFlag extends StateFlag {

    protected CustomStateFlag() {
        super("custom-state-flag", true);
    }
 

    public State getDefault() {
        return State.ALLOW;
    }
 
    public static StateFlag.State allowOrNone(boolean flag) {
        return StateFlag.State.ALLOW;
    }
}

P.s в старой версии REGION_QUERY по другому получается и игрок другим классом врапился. Ну возможно в этом методе он не врапился, шел как есть, давно было.
Код:
    @EventHandler
    public void on(BlockPlaceEvent e) {
        RegionQuery REGION_QUERY = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
        boolean allow = REGION_QUERY.testState(BukkitAdapter.adapt(e.getBlock().getLocation()), Flags.getWorldGuard().wrapPlayer(e.getPlayer()), FlagObject);
    }
 
Последнее редактирование:
На самом деле ничего не понял(
Во-первых, FlagRegistry только с версии 6.2 появился
Во-вторых, зачем в функцию allowOrNone прихочит аргумент логического типа? Может, там ошибка какая-то?
В-третьих, RegionQuery - такого класса нет в WG API
 
На самом деле ничего не понял(
Во-первых, FlagRegistry только с версии 6.2 появился
Во-вторых, зачем в функцию allowOrNone прихочит аргумент логического типа? Может, там ошибка какая-то?
В-третьих, RegionQuery - такого класса нет в WG API
Ну там разные типы флагов бывают. Все там было в старой версии, в других местах но было. Искать лень.
 
В общем, спасибо. Посмотрел, как регистрируются флаги в WGCustomFlags. Оказалось, чтобы зарегистрировать флаг - его достаточно добавить в массив DefaultFlag.flagsList
Может кому пригодится решение:
Код:
    private void setStaticValue(Field field, Object value) {
        try {
            Field ex = Field.class.getDeclaredField("modifiers");
            ex.setAccessible(true);
            ex.setInt(field, field.getModifiers() & -17);
            field.set((Object)null, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void addWGFlag(Flag flag) {
        try {
            Field field = DefaultFlag.class.getField("flagsList");
            Flag[] defFlags = DefaultFlag.flagsList;
            Flag[] flags = new Flag[defFlags.length + 1];
            System.arraycopy(defFlags, 0, flags, 0, defFlags.length);
            flags[defFlags.length] = flag;
            setStaticValue(field, flags);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Сам флаг создал так:
Код:
 Flag IS_SELLER = new BooleanFlag("is-seller");
Ну и, конечно, после установки флага на регион нужно сохраниться
Код:
 regionManager.save();
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх