Гайд Настройки/Settings system 1.16.5 mcp

Начинающий
Статус
Оффлайн
Регистрация
29 Май 2023
Сообщения
14
Реакции[?]
0
Поинты[?]
0
Настройки для модулей в гуи. Все что я хотел сказать.
Начнем писать.

Подразделяем на этапы:
1) Создание обьекта
2) Виджеты наследники.
3) Основная логика виджетов.
4) Определение сэттинга.


Главное тело (обьект):
//contructor
public class Setting {
   
    private final String name;
    private double x, y;

    public Setting(String name, double x, double y) {
        this.name = name;
    }
   
    public String getName() {
        return name;
    }
   
    //logic
    public void render(MatrixStack matrices, double x, double y) {
        //pre
        this.x = x;
        this.y = y;
    }
   
    public void click(double mouseX, double mouseY, int button) {
        //mouse logic
    }
   
}
Пишем дальше, теперь нужно будет создать аннотацию для определение строк в классах. Таким образом мы будем автоматически проверять является ли модуль настриваемым, короче рефлексия.
Аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public [USER=1340661]@interface[/USER] TSetting {
}
Теперь добавим виджетов (чекбокс, слайдер и тд). Лучше задикларируем переменные там.
Widget (checkbox):
public class CheckBox extends Setting {



    public boolean isActivate; //состояние чекбокса



    public CheckBox(String name) {

        super(name);

    }



    [USER=1367676]@override[/USER]

    public void render(MatrixStack matrixStack, double x, double y) {

        super.render(matrixStack, x, y);

      

        //псевдо код

        double width = 30;

        double height = 15;



        Render2D.drawRectGradient(x, y, width, height, styleOPA.getColor()[0], styleOPA.getColor()[1]);

        Render2D.drawRectGradient(x, y, width, 2, styleOP.getColor()[0], styleOP.getColor()[1]);

        Render2D.drawRect(x + (isActivate ? 15 : 0), y + 2.5f, width / 2, height - 2.7f, isActivate ? new Color(80, 80, 80) : new Color(25, 25, 25));

        mc.fontRenderer.drawString(matrixStack, getName(), (float) ((x + width) + 2), (float) y + 3, isActivate ? -1 : Color.DARK_GRAY.getRGB());

    }



    [USER=1367676]@override[/USER]

    public void click(double mouseX, double mouseY, int button) {

        if(Mouse.isHovered(mouseX, mouseY, x, y, 30, 20)) isActivate = !isActivate;

        super.click(mouseX, mouseY, button);

    }
Теперь кешируем данные об настриваемом модуле.
в классе Module:
//метод для обнаружения
    private boolean detect() {
        Class<?> clazz = this.getClass();
        for(Field field : clazz.getDeclaredFields()) {
            if(field.isAnnotationPresent(TSetting.class)) { //проверяем на наличие аннотации
                return true;
            }
        }

        return false;
    }

//Не забудьте в этом же классе обьявить ArrayList<Setting> как константу.
//Апдейтить лист можно будет на этапе инициализации. Так же для кеширования присвоите boolean isSetting = detect();
Далее пишем логику рендера в гуи или где то еще. Там просто задействуйте логику через итерацию, отрендерите области настроек как захотите.
 
Сверху Снизу