• MONEY за подписку! Ничего делать не надо совсем, всего-то подписаться на тг одмена и нажать кнопку "Принять участие" в розыгрыше: https://t.me/govthing/7650

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

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
29 Май 2023
Сообщения
23
Реакции
1
Тема полностью редактирована (29.03.2025).

Начнем. Напишем базовую логику настроек.
С чего начать? Начнем с главного класса (тело).

Setting.java

Java:
Expand Collapse Copy
public class Setting implements Wrapper {

    private final String name;

    public double x, y, width, height;

    public Setting(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void render(MatrixStack matrixStack, double x, double y) {
        this.x = x;
        this.y = y;
    }

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

    @Override
    public void release(double mouseX, double mouseY, int button) {
    }

    @Override
    public void moved(double xPos, double mouseY) {
    }
}

Данный класс потребуется для создания экземпляров на его основе. Будем наследоваться от него.
Далее создадим аннотацию "TSetting", можете назвать ее как хотите. Потребуется для мета-анализа рефлексии, будем отслеживать классы (поля) на наличие аннотации.
Можно сделать и с помощью переопределения методов Module, но так как будто бы правильнее.

TSetting.java

Java:
Expand Collapse Copy
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TSetting {
}

Все. Теперь можем начать писать сами виджеты.
Напишем самый простой CheckBox.

CheckBox.java (псевдо код)

Java:
Expand Collapse Copy
public class CheckBox extends Setting {

    public boolean isActivate;

    public CheckBox(String name) {
        super(name);

        this.width = 30;
        this.height = 15;
    }

    @Override
    public void render(MatrixStack matrixStack, double x, double y) {
        super.render(matrixStack, x, y);

        Render2D.drawRectGradient(this.x, this.y, this.width, this.height, color1, color2);
        Render2D.drawRectGradient(this.x + (isActivate ? 15 : 0), this.y + 2.5f, this.width / 2, this.height - 2.7f, color1, color2);
        mc.fontRenderer.drawString(matrixStack, this.getName(), (float) ((x + this.width) + 2), (float) y + 3, isActivate ? -1 : Color.DARK_GRAY.getRGB());
    }

    @Override
    public void click(double mouseX, double mouseY, int button) {
        if(Mouse.isHovered(mouseX, mouseY, this.x, this.y, this.width, this.height)) isActivate = !isActivate;
        super.click(mouseX, mouseY, button);
    }
}

Че дальше? А дальше нам нужно написать саму логику распознавания полей.
Для наглядности предположим что данный метод будет находиться в классе ModuleManager.java.

isSetting.boolean (метод класса)

Java:
Expand Collapse Copy
public boolean isSetting(Module module) {
        Class<?> clazz = module.getClass();
        for(Field field : clazz.getDeclaredFields()) {
            if(field.isAnnotationPresent(TSetting.class)) {
                return true;
            }
        }

        return false;
    }

Все, теперь каждый модуль будет проверен на наличие настроек.
Создайте экземпляр настройки в полях класса и добавьте его в структуру.

Пример:

Java:
Expand Collapse Copy
@TSetting
private final CheckBox test = new CheckBox("Test");
@TSetting
private final CheckBox test1 = new CheckBox("Test1");
@TSetting
private final CheckBox test1 = new CheckBox("Test2");

public ModuleTest() {
    super("ModuleTest");
    super.setting(test, test1, test2, ...); //используем varargs способ добавления.
}

Вот и все, далее вам просто нужно будет реализовать рендер в Gui.

Советы?
1) Рекомендую использовать заранее заготовленные интерфейсы клика и рендера. Тем самым поступите более правильно и в дальнейшем сможете использовать их же для реализации рендера и обработки в вашей гуишке. Достаточно интересное решения если вы создаете "Подразделяющую" структуру ваших гуи компонентов.
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Тема полностью редактирована (29.03.2025).

Начнем. Напишем базовую логику настроек.
С чего начать? Начнем с главного класса (тело).

Setting.java

Java:
Expand Collapse Copy
public class Setting implements Wrapper {

    private final String name;

    public double x, y, width, height;

    public Setting(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void render(MatrixStack matrixStack, double x, double y) {
        this.x = x;
        this.y = y;
    }

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

    @Override
    public void release(double mouseX, double mouseY, int button) {
    }

    @Override
    public void moved(double xPos, double mouseY) {
    }
}

Данный класс потребуется для создания экземпляров на его основе. Будем наследоваться от него.
Далее создадим аннотацию "TSetting", можете назвать ее как хотите. Потребуется для мета-анализа рефлексии, будем отслеживать классы (поля) на наличие аннотации.
Можно сделать и с помощью переопределения методов Module, но так как будто бы правильнее.

TSetting.java

Java:
Expand Collapse Copy
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TSetting {
}

Все. Теперь можем начать писать сами виджеты.
Напишем самый простой CheckBox.

CheckBox.java (псевдо код)

Java:
Expand Collapse Copy
public class CheckBox extends Setting {

    public boolean isActivate;

    public CheckBox(String name) {
        super(name);

        this.width = 30;
        this.height = 15;
    }

    @Override
    public void render(MatrixStack matrixStack, double x, double y) {
        super.render(matrixStack, x, y);

        Render2D.drawRectGradient(this.x, this.y, this.width, this.height, color1, color2);
        Render2D.drawRectGradient(this.x + (isActivate ? 15 : 0), this.y + 2.5f, this.width / 2, this.height - 2.7f, color1, color2);
        mc.fontRenderer.drawString(matrixStack, this.getName(), (float) ((x + this.width) + 2), (float) y + 3, isActivate ? -1 : Color.DARK_GRAY.getRGB());
    }

    @Override
    public void click(double mouseX, double mouseY, int button) {
        if(Mouse.isHovered(mouseX, mouseY, this.x, this.y, this.width, this.height)) isActivate = !isActivate;
        super.click(mouseX, mouseY, button);
    }
}

Че дальше? А дальше нам нужно написать саму логику распознавания полей.
Для наглядности предположим что данный метод будет находиться в классе ModuleManager.java.

isSetting.void (метод класса)

Java:
Expand Collapse Copy
public boolean isSetting(Module module) {
        Class<?> clazz = module.getClass();
        for(Field field : clazz.getDeclaredFields()) {
            if(field.isAnnotationPresent(TSetting.class)) {
                return true;
            }
        }

        return false;
    }

Все, теперь каждый модуль будет проверен на наличие настроек.
Создайте экземпляр настройки в полях класса и добавьте его в структуру.

Пример:

Java:
Expand Collapse Copy
@TSetting
private final CheckBox test = new CheckBox("Test");
@TSetting
private final CheckBox test1 = new CheckBox("Test1");
@TSetting
private final CheckBox test1 = new CheckBox("Test2");

public ModuleTest() {
    super("ModuleTest");
    super.setting(test, test1, test2, ...); //используем varargs способ добавления.
}

Вот и все, далее вам просто нужно будет реализовать рендер в Gui.

Советы?
1) Рекомендую использовать заранее заготовленные интерфейсы клика и рендера. Тем самым поступите более правильно и в дальнейшем сможете использовать их же для реализации рендера и обработки в вашей гуишке. Достаточно интересное решения если вы создаете "Подразделяющую" структуру ваших гуи компонентов.
Прикольна
 
Назад
Сверху Снизу