• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Визуальная часть ConfigEditor | Exp 3.1/Evaware

  • Автор темы Автор темы Terca
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
11 Май 2024
Сообщения
10
Реакции
0
Выберите загрузчик игры
  1. Vanilla
ну, короче, было мне скучно, и я решил сделать конфигэдитор.
тут можно создать конфиг, удалить его и выбрать.
может есть ошибки, хотя я вроде не замечал
ss -
Пожалуйста, авторизуйтесь для просмотра ссылки.
ConfigEditor:
Expand Collapse Copy
package no.clips.ui.clickgui;

import com.mojang.blaze3d.matrix.MatrixStack;
import no.clips.NoClips;
import no.clips.config.Config;
import no.clips.config.ConfigStorage;
import no.clips.modules.impl.render.Theme;
import no.clips.ui.clickgui.components.builder.IBuilder;
import no.clips.utils.math.MathUtil;
import no.clips.utils.render.color.ColorUtils;
import no.clips.utils.render.gl.Scissor;
import no.clips.utils.render.rect.RenderUtility;
import no.clips.utils.text.font.ClientFonts;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;

import java.util.ArrayList;
import java.util.List;

[USER=270918]@Getter[/USER]
[USER=1132491]@setter[/USER]
public class ConfigEditor implements IBuilder {
    private final Vector4f ROUNDING_VECTOR = new Vector4f(8, 8, 8, 8);
    protected float x;
    protected float y;
    private float scroll, animatedScrool, scrollbarHeight, scrollbarY;
    protected final float width = (200 / 2) + 20;
protected final float height = (210 / 2) + 15;
    private boolean draggingScrollbar = false;
    private float lastMouseY;
    
    private String newConfigName = "";
    private boolean isInputActive = false;
    
    private List<ConfigComponent> configs = new ArrayList<>();
    
    public ConfigEditor() {
        initConfigs();
    }
    
    private List<String> lastConfigNames = new ArrayList<>();
    
    private void checkAndUpdateConfigs() {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> currentConfigs = configStorage.getConfigs();
        
        List<String> currentConfigNames = new ArrayList<>();
        for (Config config : currentConfigs) {
            currentConfigNames.add(config.getName());
        }
        
        if (!currentConfigNames.equals(lastConfigNames)) {
            initConfigs();
            lastConfigNames = currentConfigNames;
        }
    }
    
    private void initConfigs() {
        configs.clear();
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> configList = configStorage.getConfigs();
        
        if (configList.isEmpty()) {
            configStorage.saveConfiguration("default");
            configList = configStorage.getConfigs();
        }
        
        for (Config config : configList) {
            ConfigComponent component = new ConfigComponent(config.getName());
            if (config.getName().equals(NoClips.getInstance().getCurrentConfig())) {
                component.setSelected(true);
            }
            configs.add(component);
        }
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack stack, float mouseX, float mouseY) {
        checkAndUpdateConfigs();
        
        animatedScrool = MathUtil.fast(animatedScrool, scroll, 10);
        float header = 45 / 2.3f;

        int fillColor = ColorUtils.multDark(Theme.RectColor(0), 0.1f);
        RenderUtility.drawRoundedRect(x + 0.5f, y, width - 1, height + 1, 5, ColorUtils.setAlpha(fillColor, 170));
        int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);
        RenderUtility.drawRoundedRectOutline(x + 0.5f, y, width - 1, height + 1, 5, 1.0f, outlineColor);

        ClientFonts.regular[20].drawCenteredString(stack, "Config Editor", x + width / 2f, y + header / 1.5f - 5, Theme.MainColor(0));
        
        float inputHeight = 15;
        float inputY = y + header + 5;
        float buttonWidth = 20;
        
        int inputBgColor = isInputActive ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);
        
        RenderUtility.drawRoundedRect(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, ColorUtils.setAlpha(inputBgColor, 100));
        RenderUtility.drawRoundedRectOutline(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, 1.0f, outlineColor);
        String displayText = newConfigName.isEmpty() ? "Имя конфига" : newConfigName;
        ClientFonts.interRegular[16].drawString(stack, displayText, x + 10, inputY + inputHeight / 2f - 2.5f, newConfigName.isEmpty() ? ColorUtils.rgba(150, 150, 150, 255) : Theme.Text(0));
        
        int buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.3f);
        if (isButtonHovered(mouseX, mouseY)) {
            buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.5f);
        }
        
        RenderUtility.drawRoundedRect(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, buttonColor);
        RenderUtility.drawRoundedRectOutline(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, 1.0f, outlineColor);
        ClientFonts.regular[16].drawCenteredString(stack, "+", x + width - buttonWidth / 2 - 5, inputY + inputHeight / 2f - 2.5f, Theme.Text(0));

        float configY = inputY + inputHeight + 5;
        float contentHeight = inputHeight + 5;

        Scissor.push();
        Scissor.scissor(net.minecraft.client.Minecraft.getInstance().getMainWindow(), x, configY, width, height - (header + inputHeight + 10));

        for (ConfigComponent configComponent : configs) {
            configComponent.setX(x + 5);
            configComponent.setY(configY + animatedScrool);
            configComponent.setWidth(width - 10);
            configComponent.render(stack, mouseX, mouseY);
            configY += configComponent.getHeight() + 5;
            contentHeight += configComponent.getHeight() + 5;
        }

        Scissor.pop();

        float maxScroll = Math.max(0, contentHeight - (height - header));
        if (maxScroll > 0) {
            float contentRatio = Math.min(1, (height - header) / contentHeight);
            scrollbarHeight = (height - header) * contentRatio;
            scrollbarY = y + header + (-animatedScrool / maxScroll) * (height - header - scrollbarHeight);
            
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseClick(float mouseX, float mouseY, int mouseButton) {
        if (isHovered(mouseX, mouseY)) {
            float header = 45 / 2.3f;
            float inputHeight = 20;
            float inputY = y + header + 5;
            float buttonWidth = 20;
            
            if (mouseX >= x + 5 && mouseX <= x + width - buttonWidth - 10 &&
                mouseY >= inputY && mouseY <= inputY + inputHeight) {
                isInputActive = true;
                return;
            }
            
            if (isButtonHovered(mouseX, mouseY) && !newConfigName.isEmpty()) {
                ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                configStorage.saveConfiguration(newConfigName);
                
                NoClips.getInstance().setCurrentConfig(newConfigName);
                
                initConfigs();
                
                newConfigName = "";
                isInputActive = false;
                return;
            }
            
            if (mouseX >= x + width - 4 && mouseX <= x + width - 2 && mouseY >= scrollbarY && mouseY <= scrollbarY + scrollbarHeight) {
                draggingScrollbar = true;
                lastMouseY = mouseY;
                return;
            }

            for (ConfigComponent configComponent : configs) {
                if (configComponent.isHovered(mouseX, mouseY)) {
                    configComponent.mouseClick(mouseX, mouseY, mouseButton);
                    return;
                }
            }
            
            isInputActive = false;
        } else {
            isInputActive = false;
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseRelease(float mouseX, float mouseY, int state) {
        draggingScrollbar = false;
        for (ConfigComponent configComponent : configs) {
            configComponent.mouseRelease(mouseX, mouseY, state);
        }
    }

    [USER=1367676]@override[/USER]
    public void keyPressed(int keyCode, int scanCode, int modifiers) {
        if (isInputActive) {
            if (keyCode == 259) {
                if (!newConfigName.isEmpty()) {
                    newConfigName = newConfigName.substring(0, newConfigName.length() - 1);
                }
            } else if (keyCode == 257) {
                if (!newConfigName.isEmpty()) {
                    createConfig();
                }
            }
        }
        
        for (ConfigComponent configComponent : configs) {
            configComponent.keyPressed(keyCode, scanCode, modifiers);
        }
    }
    
    public void charTyped(char codePoint, int modifiers) {
        if (isInputActive) {
            if (Character.isLetterOrDigit(codePoint) || codePoint == '_' || codePoint == '-') {
                newConfigName += codePoint;
            }
        }
    }

    public void mouseScroll(float mouseX, float mouseY, float amount) {
        if (isHovered(mouseX, mouseY)) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
            
            contentHeight += inputHeight + 5;
            
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
            
            float maxScroll = Math.max(0, contentHeight - (height - header));
            scroll = MathHelper.clamp(scroll - amount * 10, -maxScroll, 0);
        }
    }

    public boolean isHovered(float mouseX, float mouseY) {
        return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
    }
    
    private boolean isButtonHovered(float mouseX, float mouseY) {
        float header = 55 / 2.3f;
        float inputY = y + header + 5;
        float inputHeight = 20;
        float buttonWidth = 30;
        
        return mouseX >= x + width - buttonWidth - 5 && mouseX <= x + width - 5 &&
               mouseY >= inputY && mouseY <= inputY + inputHeight;
    }

    public void mouseDrag(float mouseX, float mouseY) {
        if (draggingScrollbar) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
            
            contentHeight += inputHeight + 5;
            
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
            
            float maxScroll = Math.max(0, contentHeight - (height - header));
            float scrollDelta = (mouseY - lastMouseY) / (height - header - scrollbarHeight) * maxScroll;
            scroll = MathHelper.clamp(scroll + scrollDelta, -maxScroll, 0);
            lastMouseY = mouseY;
        }
    }
    
    private void createConfig() {
        if (!newConfigName.isEmpty()) {
            ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
            configStorage.saveConfiguration(newConfigName);
            
            initConfigs();
            
            newConfigName = "";
            isInputActive = false;
        }
    }
    
    private void saveConfig(String configName) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        configStorage.saveConfiguration(configName);
        
        initConfigs();
    }
    
    private void deleteConfig(ConfigComponent config) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        Config configToDelete = configStorage.findConfig(config.getConfigName());
        if (configToDelete != null && configToDelete.getFile().exists()) {
            configToDelete.getFile().delete();
        }
        
        if (config.getConfigName().equals(NoClips.getInstance().getCurrentConfig())) {
            NoClips.getInstance().setCurrentConfig("default");
            configStorage.loadConfiguration("default");
        }
        
        configs.remove(config);
        initConfigs();
    }
    
    [USER=270918]@Getter[/USER]
    [USER=1132491]@setter[/USER]
    public class ConfigComponent {
        private float x;
        private float y;
        private float width;
        private float height = 30;
        private final String configName;
        private boolean selected;
        
        public ConfigComponent(String configName) {
            this.configName = configName;
            this.selected = false;
        }
        
        public void render(MatrixStack stack, float mouseX, float mouseY) {
            int backgroundColor = selected ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);

            int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);

            RenderUtility.drawRoundedRect(x, y, width, height, 5, ColorUtils.setAlpha(backgroundColor, 100));
            RenderUtility.drawRoundedRectOutline(x, y, width, height, 5, 1.0f, outlineColor);
            ClientFonts.regular[16].drawString(stack, configName, x + 10, y + height / 2f - 4, Theme.Text(0));
            
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
            
            if (isDeleteButtonHovered(mouseX, mouseY)) {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
                RenderUtility.drawRoundedRectOutline(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, 1.0f, ColorUtils.rgba(200, 50, 50, 255));
            } else {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
            }
            ClientFonts.noclipslogo[25].drawString(stack, "C", deleteButtonX + 4f, deleteButtonY + 7, ColorUtils.rgba(255, 0, 0, 255));
        }
        
        public void mouseClick(float mouseX, float mouseY, int mouseButton) {
            if (isHovered(mouseX, mouseY) && mouseButton == 0) {
                if (isDeleteButtonHovered(mouseX, mouseY)) {
                    deleteConfig(this);
                } else {
                    selected = true;
                    
                    ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                    Config config = configStorage.findConfig(configName);
                    
                    if (config != null && config.getFile().exists()) {
                        String previousConfig = NoClips.getInstance().getCurrentConfig();
                        configStorage.saveConfiguration(previousConfig);
                        
                        configStorage.loadConfiguration(configName);
                        
                        NoClips.getInstance().setCurrentConfig(configName);
                    }
                    
                    for (ConfigComponent other : configs) {
                        if (other != this) {
                            other.setSelected(false);
                        }
                    }
                }
            }
        }
        
        public void mouseRelease(float mouseX, float mouseY, int state) {
        }
        
        public void keyPressed(int keyCode, int scanCode, int modifiers) {
        }
        
        public boolean isHovered(float mouseX, float mouseY) {
            return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
        }
        
        private boolean isDeleteButtonHovered(float mouseX, float mouseY) {
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
            
            return mouseX >= deleteButtonX && mouseX <= deleteButtonX + deleteButtonSize &&
                   mouseY >= deleteButtonY && mouseY <= deleteButtonY + deleteButtonSize;
        }
    }
}
 
Звучит годно, но на практике хз
 
ну, короче, было мне скучно, и я решил сделать конфигэдитор.
тут можно создать конфиг, удалить его и выбрать.
может есть ошибки, хотя я вроде не замечал
ss -
Пожалуйста, авторизуйтесь для просмотра ссылки.
ConfigEditor:
Expand Collapse Copy
package no.clips.ui.clickgui;

import com.mojang.blaze3d.matrix.MatrixStack;
import no.clips.NoClips;
import no.clips.config.Config;
import no.clips.config.ConfigStorage;
import no.clips.modules.impl.render.Theme;
import no.clips.ui.clickgui.components.builder.IBuilder;
import no.clips.utils.math.MathUtil;
import no.clips.utils.render.color.ColorUtils;
import no.clips.utils.render.gl.Scissor;
import no.clips.utils.render.rect.RenderUtility;
import no.clips.utils.text.font.ClientFonts;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;

import java.util.ArrayList;
import java.util.List;

[USER=270918]@Getter[/USER]
[USER=1132491]@setter[/USER]
public class ConfigEditor implements IBuilder {
    private final Vector4f ROUNDING_VECTOR = new Vector4f(8, 8, 8, 8);
    protected float x;
    protected float y;
    private float scroll, animatedScrool, scrollbarHeight, scrollbarY;
    protected final float width = (200 / 2) + 20;
protected final float height = (210 / 2) + 15;
    private boolean draggingScrollbar = false;
    private float lastMouseY;
   
    private String newConfigName = "";
    private boolean isInputActive = false;
   
    private List<ConfigComponent> configs = new ArrayList<>();
   
    public ConfigEditor() {
        initConfigs();
    }
   
    private List<String> lastConfigNames = new ArrayList<>();
   
    private void checkAndUpdateConfigs() {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> currentConfigs = configStorage.getConfigs();
       
        List<String> currentConfigNames = new ArrayList<>();
        for (Config config : currentConfigs) {
            currentConfigNames.add(config.getName());
        }
       
        if (!currentConfigNames.equals(lastConfigNames)) {
            initConfigs();
            lastConfigNames = currentConfigNames;
        }
    }
   
    private void initConfigs() {
        configs.clear();
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> configList = configStorage.getConfigs();
       
        if (configList.isEmpty()) {
            configStorage.saveConfiguration("default");
            configList = configStorage.getConfigs();
        }
       
        for (Config config : configList) {
            ConfigComponent component = new ConfigComponent(config.getName());
            if (config.getName().equals(NoClips.getInstance().getCurrentConfig())) {
                component.setSelected(true);
            }
            configs.add(component);
        }
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack stack, float mouseX, float mouseY) {
        checkAndUpdateConfigs();
       
        animatedScrool = MathUtil.fast(animatedScrool, scroll, 10);
        float header = 45 / 2.3f;

        int fillColor = ColorUtils.multDark(Theme.RectColor(0), 0.1f);
        RenderUtility.drawRoundedRect(x + 0.5f, y, width - 1, height + 1, 5, ColorUtils.setAlpha(fillColor, 170));
        int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);
        RenderUtility.drawRoundedRectOutline(x + 0.5f, y, width - 1, height + 1, 5, 1.0f, outlineColor);

        ClientFonts.regular[20].drawCenteredString(stack, "Config Editor", x + width / 2f, y + header / 1.5f - 5, Theme.MainColor(0));
       
        float inputHeight = 15;
        float inputY = y + header + 5;
        float buttonWidth = 20;
       
        int inputBgColor = isInputActive ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);
       
        RenderUtility.drawRoundedRect(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, ColorUtils.setAlpha(inputBgColor, 100));
        RenderUtility.drawRoundedRectOutline(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, 1.0f, outlineColor);
        String displayText = newConfigName.isEmpty() ? "Имя конфига" : newConfigName;
        ClientFonts.interRegular[16].drawString(stack, displayText, x + 10, inputY + inputHeight / 2f - 2.5f, newConfigName.isEmpty() ? ColorUtils.rgba(150, 150, 150, 255) : Theme.Text(0));
       
        int buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.3f);
        if (isButtonHovered(mouseX, mouseY)) {
            buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.5f);
        }
       
        RenderUtility.drawRoundedRect(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, buttonColor);
        RenderUtility.drawRoundedRectOutline(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, 1.0f, outlineColor);
        ClientFonts.regular[16].drawCenteredString(stack, "+", x + width - buttonWidth / 2 - 5, inputY + inputHeight / 2f - 2.5f, Theme.Text(0));

        float configY = inputY + inputHeight + 5;
        float contentHeight = inputHeight + 5;

        Scissor.push();
        Scissor.scissor(net.minecraft.client.Minecraft.getInstance().getMainWindow(), x, configY, width, height - (header + inputHeight + 10));

        for (ConfigComponent configComponent : configs) {
            configComponent.setX(x + 5);
            configComponent.setY(configY + animatedScrool);
            configComponent.setWidth(width - 10);
            configComponent.render(stack, mouseX, mouseY);
            configY += configComponent.getHeight() + 5;
            contentHeight += configComponent.getHeight() + 5;
        }

        Scissor.pop();

        float maxScroll = Math.max(0, contentHeight - (height - header));
        if (maxScroll > 0) {
            float contentRatio = Math.min(1, (height - header) / contentHeight);
            scrollbarHeight = (height - header) * contentRatio;
            scrollbarY = y + header + (-animatedScrool / maxScroll) * (height - header - scrollbarHeight);
           
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseClick(float mouseX, float mouseY, int mouseButton) {
        if (isHovered(mouseX, mouseY)) {
            float header = 45 / 2.3f;
            float inputHeight = 20;
            float inputY = y + header + 5;
            float buttonWidth = 20;
           
            if (mouseX >= x + 5 && mouseX <= x + width - buttonWidth - 10 &&
                mouseY >= inputY && mouseY <= inputY + inputHeight) {
                isInputActive = true;
                return;
            }
           
            if (isButtonHovered(mouseX, mouseY) && !newConfigName.isEmpty()) {
                ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                configStorage.saveConfiguration(newConfigName);
               
                NoClips.getInstance().setCurrentConfig(newConfigName);
               
                initConfigs();
               
                newConfigName = "";
                isInputActive = false;
                return;
            }
           
            if (mouseX >= x + width - 4 && mouseX <= x + width - 2 && mouseY >= scrollbarY && mouseY <= scrollbarY + scrollbarHeight) {
                draggingScrollbar = true;
                lastMouseY = mouseY;
                return;
            }

            for (ConfigComponent configComponent : configs) {
                if (configComponent.isHovered(mouseX, mouseY)) {
                    configComponent.mouseClick(mouseX, mouseY, mouseButton);
                    return;
                }
            }
           
            isInputActive = false;
        } else {
            isInputActive = false;
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseRelease(float mouseX, float mouseY, int state) {
        draggingScrollbar = false;
        for (ConfigComponent configComponent : configs) {
            configComponent.mouseRelease(mouseX, mouseY, state);
        }
    }

    [USER=1367676]@override[/USER]
    public void keyPressed(int keyCode, int scanCode, int modifiers) {
        if (isInputActive) {
            if (keyCode == 259) {
                if (!newConfigName.isEmpty()) {
                    newConfigName = newConfigName.substring(0, newConfigName.length() - 1);
                }
            } else if (keyCode == 257) {
                if (!newConfigName.isEmpty()) {
                    createConfig();
                }
            }
        }
       
        for (ConfigComponent configComponent : configs) {
            configComponent.keyPressed(keyCode, scanCode, modifiers);
        }
    }
   
    public void charTyped(char codePoint, int modifiers) {
        if (isInputActive) {
            if (Character.isLetterOrDigit(codePoint) || codePoint == '_' || codePoint == '-') {
                newConfigName += codePoint;
            }
        }
    }

    public void mouseScroll(float mouseX, float mouseY, float amount) {
        if (isHovered(mouseX, mouseY)) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
           
            contentHeight += inputHeight + 5;
           
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
           
            float maxScroll = Math.max(0, contentHeight - (height - header));
            scroll = MathHelper.clamp(scroll - amount * 10, -maxScroll, 0);
        }
    }

    public boolean isHovered(float mouseX, float mouseY) {
        return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
    }
   
    private boolean isButtonHovered(float mouseX, float mouseY) {
        float header = 55 / 2.3f;
        float inputY = y + header + 5;
        float inputHeight = 20;
        float buttonWidth = 30;
       
        return mouseX >= x + width - buttonWidth - 5 && mouseX <= x + width - 5 &&
               mouseY >= inputY && mouseY <= inputY + inputHeight;
    }

    public void mouseDrag(float mouseX, float mouseY) {
        if (draggingScrollbar) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
           
            contentHeight += inputHeight + 5;
           
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
           
            float maxScroll = Math.max(0, contentHeight - (height - header));
            float scrollDelta = (mouseY - lastMouseY) / (height - header - scrollbarHeight) * maxScroll;
            scroll = MathHelper.clamp(scroll + scrollDelta, -maxScroll, 0);
            lastMouseY = mouseY;
        }
    }
   
    private void createConfig() {
        if (!newConfigName.isEmpty()) {
            ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
            configStorage.saveConfiguration(newConfigName);
           
            initConfigs();
           
            newConfigName = "";
            isInputActive = false;
        }
    }
   
    private void saveConfig(String configName) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        configStorage.saveConfiguration(configName);
       
        initConfigs();
    }
   
    private void deleteConfig(ConfigComponent config) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        Config configToDelete = configStorage.findConfig(config.getConfigName());
        if (configToDelete != null && configToDelete.getFile().exists()) {
            configToDelete.getFile().delete();
        }
       
        if (config.getConfigName().equals(NoClips.getInstance().getCurrentConfig())) {
            NoClips.getInstance().setCurrentConfig("default");
            configStorage.loadConfiguration("default");
        }
       
        configs.remove(config);
        initConfigs();
    }
   
    [USER=270918]@Getter[/USER]
    [USER=1132491]@setter[/USER]
    public class ConfigComponent {
        private float x;
        private float y;
        private float width;
        private float height = 30;
        private final String configName;
        private boolean selected;
       
        public ConfigComponent(String configName) {
            this.configName = configName;
            this.selected = false;
        }
       
        public void render(MatrixStack stack, float mouseX, float mouseY) {
            int backgroundColor = selected ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);

            int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);

            RenderUtility.drawRoundedRect(x, y, width, height, 5, ColorUtils.setAlpha(backgroundColor, 100));
            RenderUtility.drawRoundedRectOutline(x, y, width, height, 5, 1.0f, outlineColor);
            ClientFonts.regular[16].drawString(stack, configName, x + 10, y + height / 2f - 4, Theme.Text(0));
           
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
           
            if (isDeleteButtonHovered(mouseX, mouseY)) {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
                RenderUtility.drawRoundedRectOutline(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, 1.0f, ColorUtils.rgba(200, 50, 50, 255));
            } else {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
            }
            ClientFonts.noclipslogo[25].drawString(stack, "C", deleteButtonX + 4f, deleteButtonY + 7, ColorUtils.rgba(255, 0, 0, 255));
        }
       
        public void mouseClick(float mouseX, float mouseY, int mouseButton) {
            if (isHovered(mouseX, mouseY) && mouseButton == 0) {
                if (isDeleteButtonHovered(mouseX, mouseY)) {
                    deleteConfig(this);
                } else {
                    selected = true;
                   
                    ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                    Config config = configStorage.findConfig(configName);
                   
                    if (config != null && config.getFile().exists()) {
                        String previousConfig = NoClips.getInstance().getCurrentConfig();
                        configStorage.saveConfiguration(previousConfig);
                       
                        configStorage.loadConfiguration(configName);
                       
                        NoClips.getInstance().setCurrentConfig(configName);
                    }
                   
                    for (ConfigComponent other : configs) {
                        if (other != this) {
                            other.setSelected(false);
                        }
                    }
                }
            }
        }
       
        public void mouseRelease(float mouseX, float mouseY, int state) {
        }
       
        public void keyPressed(int keyCode, int scanCode, int modifiers) {
        }
       
        public boolean isHovered(float mouseX, float mouseY) {
            return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
        }
       
        private boolean isDeleteButtonHovered(float mouseX, float mouseY) {
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
           
            return mouseX >= deleteButtonX && mouseX <= deleteButtonX + deleteButtonSize &&
                   mouseY >= deleteButtonY && mouseY <= deleteButtonY + deleteButtonSize;
        }
    }
}
сливали гуишку ,там пизже
 
ет имба /up
хз кто ет в чит вставлять будет там ппц :fffuuu:
с кодом
 
Последнее редактирование:
ну, короче, было мне скучно, и я решил сделать конфигэдитор.
тут можно создать конфиг, удалить его и выбрать.
может есть ошибки, хотя я вроде не замечал
ss -
Пожалуйста, авторизуйтесь для просмотра ссылки.
ConfigEditor:
Expand Collapse Copy
package no.clips.ui.clickgui;

import com.mojang.blaze3d.matrix.MatrixStack;
import no.clips.NoClips;
import no.clips.config.Config;
import no.clips.config.ConfigStorage;
import no.clips.modules.impl.render.Theme;
import no.clips.ui.clickgui.components.builder.IBuilder;
import no.clips.utils.math.MathUtil;
import no.clips.utils.render.color.ColorUtils;
import no.clips.utils.render.gl.Scissor;
import no.clips.utils.render.rect.RenderUtility;
import no.clips.utils.text.font.ClientFonts;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;

import java.util.ArrayList;
import java.util.List;

[USER=270918]@Getter[/USER]
[USER=1132491]@setter[/USER]
public class ConfigEditor implements IBuilder {
    private final Vector4f ROUNDING_VECTOR = new Vector4f(8, 8, 8, 8);
    protected float x;
    protected float y;
    private float scroll, animatedScrool, scrollbarHeight, scrollbarY;
    protected final float width = (200 / 2) + 20;
protected final float height = (210 / 2) + 15;
    private boolean draggingScrollbar = false;
    private float lastMouseY;
    
    private String newConfigName = "";
    private boolean isInputActive = false;
    
    private List<ConfigComponent> configs = new ArrayList<>();
    
    public ConfigEditor() {
        initConfigs();
    }
    
    private List<String> lastConfigNames = new ArrayList<>();
    
    private void checkAndUpdateConfigs() {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> currentConfigs = configStorage.getConfigs();
        
        List<String> currentConfigNames = new ArrayList<>();
        for (Config config : currentConfigs) {
            currentConfigNames.add(config.getName());
        }
        
        if (!currentConfigNames.equals(lastConfigNames)) {
            initConfigs();
            lastConfigNames = currentConfigNames;
        }
    }
    
    private void initConfigs() {
        configs.clear();
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> configList = configStorage.getConfigs();
        
        if (configList.isEmpty()) {
            configStorage.saveConfiguration("default");
            configList = configStorage.getConfigs();
        }
        
        for (Config config : configList) {
            ConfigComponent component = new ConfigComponent(config.getName());
            if (config.getName().equals(NoClips.getInstance().getCurrentConfig())) {
                component.setSelected(true);
            }
            configs.add(component);
        }
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack stack, float mouseX, float mouseY) {
        checkAndUpdateConfigs();
        
        animatedScrool = MathUtil.fast(animatedScrool, scroll, 10);
        float header = 45 / 2.3f;

        int fillColor = ColorUtils.multDark(Theme.RectColor(0), 0.1f);
        RenderUtility.drawRoundedRect(x + 0.5f, y, width - 1, height + 1, 5, ColorUtils.setAlpha(fillColor, 170));
        int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);
        RenderUtility.drawRoundedRectOutline(x + 0.5f, y, width - 1, height + 1, 5, 1.0f, outlineColor);

        ClientFonts.regular[20].drawCenteredString(stack, "Config Editor", x + width / 2f, y + header / 1.5f - 5, Theme.MainColor(0));
        
        float inputHeight = 15;
        float inputY = y + header + 5;
        float buttonWidth = 20;
        
        int inputBgColor = isInputActive ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);
        
        RenderUtility.drawRoundedRect(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, ColorUtils.setAlpha(inputBgColor, 100));
        RenderUtility.drawRoundedRectOutline(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, 1.0f, outlineColor);
        String displayText = newConfigName.isEmpty() ? "Имя конфига" : newConfigName;
        ClientFonts.interRegular[16].drawString(stack, displayText, x + 10, inputY + inputHeight / 2f - 2.5f, newConfigName.isEmpty() ? ColorUtils.rgba(150, 150, 150, 255) : Theme.Text(0));
        
        int buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.3f);
        if (isButtonHovered(mouseX, mouseY)) {
            buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.5f);
        }
        
        RenderUtility.drawRoundedRect(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, buttonColor);
        RenderUtility.drawRoundedRectOutline(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, 1.0f, outlineColor);
        ClientFonts.regular[16].drawCenteredString(stack, "+", x + width - buttonWidth / 2 - 5, inputY + inputHeight / 2f - 2.5f, Theme.Text(0));

        float configY = inputY + inputHeight + 5;
        float contentHeight = inputHeight + 5;

        Scissor.push();
        Scissor.scissor(net.minecraft.client.Minecraft.getInstance().getMainWindow(), x, configY, width, height - (header + inputHeight + 10));

        for (ConfigComponent configComponent : configs) {
            configComponent.setX(x + 5);
            configComponent.setY(configY + animatedScrool);
            configComponent.setWidth(width - 10);
            configComponent.render(stack, mouseX, mouseY);
            configY += configComponent.getHeight() + 5;
            contentHeight += configComponent.getHeight() + 5;
        }

        Scissor.pop();

        float maxScroll = Math.max(0, contentHeight - (height - header));
        if (maxScroll > 0) {
            float contentRatio = Math.min(1, (height - header) / contentHeight);
            scrollbarHeight = (height - header) * contentRatio;
            scrollbarY = y + header + (-animatedScrool / maxScroll) * (height - header - scrollbarHeight);
            
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseClick(float mouseX, float mouseY, int mouseButton) {
        if (isHovered(mouseX, mouseY)) {
            float header = 45 / 2.3f;
            float inputHeight = 20;
            float inputY = y + header + 5;
            float buttonWidth = 20;
            
            if (mouseX >= x + 5 && mouseX <= x + width - buttonWidth - 10 &&
                mouseY >= inputY && mouseY <= inputY + inputHeight) {
                isInputActive = true;
                return;
            }
            
            if (isButtonHovered(mouseX, mouseY) && !newConfigName.isEmpty()) {
                ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                configStorage.saveConfiguration(newConfigName);
                
                NoClips.getInstance().setCurrentConfig(newConfigName);
                
                initConfigs();
                
                newConfigName = "";
                isInputActive = false;
                return;
            }
            
            if (mouseX >= x + width - 4 && mouseX <= x + width - 2 && mouseY >= scrollbarY && mouseY <= scrollbarY + scrollbarHeight) {
                draggingScrollbar = true;
                lastMouseY = mouseY;
                return;
            }

            for (ConfigComponent configComponent : configs) {
                if (configComponent.isHovered(mouseX, mouseY)) {
                    configComponent.mouseClick(mouseX, mouseY, mouseButton);
                    return;
                }
            }
            
            isInputActive = false;
        } else {
            isInputActive = false;
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseRelease(float mouseX, float mouseY, int state) {
        draggingScrollbar = false;
        for (ConfigComponent configComponent : configs) {
            configComponent.mouseRelease(mouseX, mouseY, state);
        }
    }

    [USER=1367676]@override[/USER]
    public void keyPressed(int keyCode, int scanCode, int modifiers) {
        if (isInputActive) {
            if (keyCode == 259) {
                if (!newConfigName.isEmpty()) {
                    newConfigName = newConfigName.substring(0, newConfigName.length() - 1);
                }
            } else if (keyCode == 257) {
                if (!newConfigName.isEmpty()) {
                    createConfig();
                }
            }
        }
        
        for (ConfigComponent configComponent : configs) {
            configComponent.keyPressed(keyCode, scanCode, modifiers);
        }
    }
    
    public void charTyped(char codePoint, int modifiers) {
        if (isInputActive) {
            if (Character.isLetterOrDigit(codePoint) || codePoint == '_' || codePoint == '-') {
                newConfigName += codePoint;
            }
        }
    }

    public void mouseScroll(float mouseX, float mouseY, float amount) {
        if (isHovered(mouseX, mouseY)) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
            
            contentHeight += inputHeight + 5;
            
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
            
            float maxScroll = Math.max(0, contentHeight - (height - header));
            scroll = MathHelper.clamp(scroll - amount * 10, -maxScroll, 0);
        }
    }

    public boolean isHovered(float mouseX, float mouseY) {
        return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
    }
    
    private boolean isButtonHovered(float mouseX, float mouseY) {
        float header = 55 / 2.3f;
        float inputY = y + header + 5;
        float inputHeight = 20;
        float buttonWidth = 30;
        
        return mouseX >= x + width - buttonWidth - 5 && mouseX <= x + width - 5 &&
               mouseY >= inputY && mouseY <= inputY + inputHeight;
    }

    public void mouseDrag(float mouseX, float mouseY) {
        if (draggingScrollbar) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
            
            contentHeight += inputHeight + 5;
            
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
            
            float maxScroll = Math.max(0, contentHeight - (height - header));
            float scrollDelta = (mouseY - lastMouseY) / (height - header - scrollbarHeight) * maxScroll;
            scroll = MathHelper.clamp(scroll + scrollDelta, -maxScroll, 0);
            lastMouseY = mouseY;
        }
    }
    
    private void createConfig() {
        if (!newConfigName.isEmpty()) {
            ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
            configStorage.saveConfiguration(newConfigName);
            
            initConfigs();
            
            newConfigName = "";
            isInputActive = false;
        }
    }
    
    private void saveConfig(String configName) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        configStorage.saveConfiguration(configName);
        
        initConfigs();
    }
    
    private void deleteConfig(ConfigComponent config) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        Config configToDelete = configStorage.findConfig(config.getConfigName());
        if (configToDelete != null && configToDelete.getFile().exists()) {
            configToDelete.getFile().delete();
        }
        
        if (config.getConfigName().equals(NoClips.getInstance().getCurrentConfig())) {
            NoClips.getInstance().setCurrentConfig("default");
            configStorage.loadConfiguration("default");
        }
        
        configs.remove(config);
        initConfigs();
    }
    
    [USER=270918]@Getter[/USER]
    [USER=1132491]@setter[/USER]
    public class ConfigComponent {
        private float x;
        private float y;
        private float width;
        private float height = 30;
        private final String configName;
        private boolean selected;
        
        public ConfigComponent(String configName) {
            this.configName = configName;
            this.selected = false;
        }
        
        public void render(MatrixStack stack, float mouseX, float mouseY) {
            int backgroundColor = selected ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);

            int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);

            RenderUtility.drawRoundedRect(x, y, width, height, 5, ColorUtils.setAlpha(backgroundColor, 100));
            RenderUtility.drawRoundedRectOutline(x, y, width, height, 5, 1.0f, outlineColor);
            ClientFonts.regular[16].drawString(stack, configName, x + 10, y + height / 2f - 4, Theme.Text(0));
            
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
            
            if (isDeleteButtonHovered(mouseX, mouseY)) {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
                RenderUtility.drawRoundedRectOutline(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, 1.0f, ColorUtils.rgba(200, 50, 50, 255));
            } else {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
            }
            ClientFonts.noclipslogo[25].drawString(stack, "C", deleteButtonX + 4f, deleteButtonY + 7, ColorUtils.rgba(255, 0, 0, 255));
        }
        
        public void mouseClick(float mouseX, float mouseY, int mouseButton) {
            if (isHovered(mouseX, mouseY) && mouseButton == 0) {
                if (isDeleteButtonHovered(mouseX, mouseY)) {
                    deleteConfig(this);
                } else {
                    selected = true;
                    
                    ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                    Config config = configStorage.findConfig(configName);
                    
                    if (config != null && config.getFile().exists()) {
                        String previousConfig = NoClips.getInstance().getCurrentConfig();
                        configStorage.saveConfiguration(previousConfig);
                        
                        configStorage.loadConfiguration(configName);
                        
                        NoClips.getInstance().setCurrentConfig(configName);
                    }
                    
                    for (ConfigComponent other : configs) {
                        if (other != this) {
                            other.setSelected(false);
                        }
                    }
                }
            }
        }
        
        public void mouseRelease(float mouseX, float mouseY, int state) {
        }
        
        public void keyPressed(int keyCode, int scanCode, int modifiers) {
        }
        
        public boolean isHovered(float mouseX, float mouseY) {
            return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
        }
        
        private boolean isDeleteButtonHovered(float mouseX, float mouseY) {
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
            
            return mouseX >= deleteButtonX && mouseX <= deleteButtonX + deleteButtonSize &&
                   mouseY >= deleteButtonY && mouseY <= deleteButtonY + deleteButtonSize;
        }
    }
}
Ого
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ха гифтис слейте на 2.0 чота
 
kak дабавить
 
гифтис красава
 
дай пж setCurrentConfig и getCurrentConfig
 
ну, короче, было мне скучно, и я решил сделать конфигэдитор.
тут можно создать конфиг, удалить его и выбрать.
может есть ошибки, хотя я вроде не замечал
ss -
Пожалуйста, авторизуйтесь для просмотра ссылки.
ConfigEditor:
Expand Collapse Copy
package no.clips.ui.clickgui;

import com.mojang.blaze3d.matrix.MatrixStack;
import no.clips.NoClips;
import no.clips.config.Config;
import no.clips.config.ConfigStorage;
import no.clips.modules.impl.render.Theme;
import no.clips.ui.clickgui.components.builder.IBuilder;
import no.clips.utils.math.MathUtil;
import no.clips.utils.render.color.ColorUtils;
import no.clips.utils.render.gl.Scissor;
import no.clips.utils.render.rect.RenderUtility;
import no.clips.utils.text.font.ClientFonts;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;

import java.util.ArrayList;
import java.util.List;

[USER=270918]@Getter[/USER]
[USER=1132491]@setter[/USER]
public class ConfigEditor implements IBuilder {
    private final Vector4f ROUNDING_VECTOR = new Vector4f(8, 8, 8, 8);
    protected float x;
    protected float y;
    private float scroll, animatedScrool, scrollbarHeight, scrollbarY;
    protected final float width = (200 / 2) + 20;
protected final float height = (210 / 2) + 15;
    private boolean draggingScrollbar = false;
    private float lastMouseY;
   
    private String newConfigName = "";
    private boolean isInputActive = false;
   
    private List<ConfigComponent> configs = new ArrayList<>();
   
    public ConfigEditor() {
        initConfigs();
    }
   
    private List<String> lastConfigNames = new ArrayList<>();
   
    private void checkAndUpdateConfigs() {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> currentConfigs = configStorage.getConfigs();
       
        List<String> currentConfigNames = new ArrayList<>();
        for (Config config : currentConfigs) {
            currentConfigNames.add(config.getName());
        }
       
        if (!currentConfigNames.equals(lastConfigNames)) {
            initConfigs();
            lastConfigNames = currentConfigNames;
        }
    }
   
    private void initConfigs() {
        configs.clear();
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        List<Config> configList = configStorage.getConfigs();
       
        if (configList.isEmpty()) {
            configStorage.saveConfiguration("default");
            configList = configStorage.getConfigs();
        }
       
        for (Config config : configList) {
            ConfigComponent component = new ConfigComponent(config.getName());
            if (config.getName().equals(NoClips.getInstance().getCurrentConfig())) {
                component.setSelected(true);
            }
            configs.add(component);
        }
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack stack, float mouseX, float mouseY) {
        checkAndUpdateConfigs();
       
        animatedScrool = MathUtil.fast(animatedScrool, scroll, 10);
        float header = 45 / 2.3f;

        int fillColor = ColorUtils.multDark(Theme.RectColor(0), 0.1f);
        RenderUtility.drawRoundedRect(x + 0.5f, y, width - 1, height + 1, 5, ColorUtils.setAlpha(fillColor, 170));
        int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);
        RenderUtility.drawRoundedRectOutline(x + 0.5f, y, width - 1, height + 1, 5, 1.0f, outlineColor);

        ClientFonts.regular[20].drawCenteredString(stack, "Config Editor", x + width / 2f, y + header / 1.5f - 5, Theme.MainColor(0));
       
        float inputHeight = 15;
        float inputY = y + header + 5;
        float buttonWidth = 20;
       
        int inputBgColor = isInputActive ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);
       
        RenderUtility.drawRoundedRect(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, ColorUtils.setAlpha(inputBgColor, 100));
        RenderUtility.drawRoundedRectOutline(x + 5, inputY, width - buttonWidth + 10, inputHeight, 5, 1.0f, outlineColor);
        String displayText = newConfigName.isEmpty() ? "Имя конфига" : newConfigName;
        ClientFonts.interRegular[16].drawString(stack, displayText, x + 10, inputY + inputHeight / 2f - 2.5f, newConfigName.isEmpty() ? ColorUtils.rgba(150, 150, 150, 255) : Theme.Text(0));
       
        int buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.3f);
        if (isButtonHovered(mouseX, mouseY)) {
            buttonColor = ColorUtils.multDark(Theme.RectColor(0), 0.5f);
        }
       
        RenderUtility.drawRoundedRect(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, buttonColor);
        RenderUtility.drawRoundedRectOutline(x + width - buttonWidth - 5, inputY, buttonWidth, inputHeight, 5, 1.0f, outlineColor);
        ClientFonts.regular[16].drawCenteredString(stack, "+", x + width - buttonWidth / 2 - 5, inputY + inputHeight / 2f - 2.5f, Theme.Text(0));

        float configY = inputY + inputHeight + 5;
        float contentHeight = inputHeight + 5;

        Scissor.push();
        Scissor.scissor(net.minecraft.client.Minecraft.getInstance().getMainWindow(), x, configY, width, height - (header + inputHeight + 10));

        for (ConfigComponent configComponent : configs) {
            configComponent.setX(x + 5);
            configComponent.setY(configY + animatedScrool);
            configComponent.setWidth(width - 10);
            configComponent.render(stack, mouseX, mouseY);
            configY += configComponent.getHeight() + 5;
            contentHeight += configComponent.getHeight() + 5;
        }

        Scissor.pop();

        float maxScroll = Math.max(0, contentHeight - (height - header));
        if (maxScroll > 0) {
            float contentRatio = Math.min(1, (height - header) / contentHeight);
            scrollbarHeight = (height - header) * contentRatio;
            scrollbarY = y + header + (-animatedScrool / maxScroll) * (height - header - scrollbarHeight);
           
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseClick(float mouseX, float mouseY, int mouseButton) {
        if (isHovered(mouseX, mouseY)) {
            float header = 45 / 2.3f;
            float inputHeight = 20;
            float inputY = y + header + 5;
            float buttonWidth = 20;
           
            if (mouseX >= x + 5 && mouseX <= x + width - buttonWidth - 10 &&
                mouseY >= inputY && mouseY <= inputY + inputHeight) {
                isInputActive = true;
                return;
            }
           
            if (isButtonHovered(mouseX, mouseY) && !newConfigName.isEmpty()) {
                ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                configStorage.saveConfiguration(newConfigName);
               
                NoClips.getInstance().setCurrentConfig(newConfigName);
               
                initConfigs();
               
                newConfigName = "";
                isInputActive = false;
                return;
            }
           
            if (mouseX >= x + width - 4 && mouseX <= x + width - 2 && mouseY >= scrollbarY && mouseY <= scrollbarY + scrollbarHeight) {
                draggingScrollbar = true;
                lastMouseY = mouseY;
                return;
            }

            for (ConfigComponent configComponent : configs) {
                if (configComponent.isHovered(mouseX, mouseY)) {
                    configComponent.mouseClick(mouseX, mouseY, mouseButton);
                    return;
                }
            }
           
            isInputActive = false;
        } else {
            isInputActive = false;
        }
    }

    [USER=1367676]@override[/USER]
    public void mouseRelease(float mouseX, float mouseY, int state) {
        draggingScrollbar = false;
        for (ConfigComponent configComponent : configs) {
            configComponent.mouseRelease(mouseX, mouseY, state);
        }
    }

    [USER=1367676]@override[/USER]
    public void keyPressed(int keyCode, int scanCode, int modifiers) {
        if (isInputActive) {
            if (keyCode == 259) {
                if (!newConfigName.isEmpty()) {
                    newConfigName = newConfigName.substring(0, newConfigName.length() - 1);
                }
            } else if (keyCode == 257) {
                if (!newConfigName.isEmpty()) {
                    createConfig();
                }
            }
        }
       
        for (ConfigComponent configComponent : configs) {
            configComponent.keyPressed(keyCode, scanCode, modifiers);
        }
    }
   
    public void charTyped(char codePoint, int modifiers) {
        if (isInputActive) {
            if (Character.isLetterOrDigit(codePoint) || codePoint == '_' || codePoint == '-') {
                newConfigName += codePoint;
            }
        }
    }

    public void mouseScroll(float mouseX, float mouseY, float amount) {
        if (isHovered(mouseX, mouseY)) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
           
            contentHeight += inputHeight + 5;
           
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
           
            float maxScroll = Math.max(0, contentHeight - (height - header));
            scroll = MathHelper.clamp(scroll - amount * 10, -maxScroll, 0);
        }
    }

    public boolean isHovered(float mouseX, float mouseY) {
        return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
    }
   
    private boolean isButtonHovered(float mouseX, float mouseY) {
        float header = 55 / 2.3f;
        float inputY = y + header + 5;
        float inputHeight = 20;
        float buttonWidth = 30;
       
        return mouseX >= x + width - buttonWidth - 5 && mouseX <= x + width - 5 &&
               mouseY >= inputY && mouseY <= inputY + inputHeight;
    }

    public void mouseDrag(float mouseX, float mouseY) {
        if (draggingScrollbar) {
            float contentHeight = 0;
            float header = 55 / 2.3f;
            float inputHeight = 20;
           
            contentHeight += inputHeight + 5;
           
            for (ConfigComponent configComponent : configs) {
                contentHeight += configComponent.getHeight() + 5;
            }
           
            float maxScroll = Math.max(0, contentHeight - (height - header));
            float scrollDelta = (mouseY - lastMouseY) / (height - header - scrollbarHeight) * maxScroll;
            scroll = MathHelper.clamp(scroll + scrollDelta, -maxScroll, 0);
            lastMouseY = mouseY;
        }
    }
   
    private void createConfig() {
        if (!newConfigName.isEmpty()) {
            ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
            configStorage.saveConfiguration(newConfigName);
           
            initConfigs();
           
            newConfigName = "";
            isInputActive = false;
        }
    }
   
    private void saveConfig(String configName) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        configStorage.saveConfiguration(configName);
       
        initConfigs();
    }
   
    private void deleteConfig(ConfigComponent config) {
        ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
        Config configToDelete = configStorage.findConfig(config.getConfigName());
        if (configToDelete != null && configToDelete.getFile().exists()) {
            configToDelete.getFile().delete();
        }
       
        if (config.getConfigName().equals(NoClips.getInstance().getCurrentConfig())) {
            NoClips.getInstance().setCurrentConfig("default");
            configStorage.loadConfiguration("default");
        }
       
        configs.remove(config);
        initConfigs();
    }
   
    [USER=270918]@Getter[/USER]
    [USER=1132491]@setter[/USER]
    public class ConfigComponent {
        private float x;
        private float y;
        private float width;
        private float height = 30;
        private final String configName;
        private boolean selected;
       
        public ConfigComponent(String configName) {
            this.configName = configName;
            this.selected = false;
        }
       
        public void render(MatrixStack stack, float mouseX, float mouseY) {
            int backgroundColor = selected ? ColorUtils.multDark(Theme.RectColor(0), 0.5f) : ColorUtils.multDark(Theme.RectColor(0), 0.2f);

            int outlineColor = ColorUtils.multDark(Theme.RectColor(0), 0.8f);

            RenderUtility.drawRoundedRect(x, y, width, height, 5, ColorUtils.setAlpha(backgroundColor, 100));
            RenderUtility.drawRoundedRectOutline(x, y, width, height, 5, 1.0f, outlineColor);
            ClientFonts.regular[16].drawString(stack, configName, x + 10, y + height / 2f - 4, Theme.Text(0));
           
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
           
            if (isDeleteButtonHovered(mouseX, mouseY)) {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
                RenderUtility.drawRoundedRectOutline(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, 1.0f, ColorUtils.rgba(200, 50, 50, 255));
            } else {
                RenderUtility.drawRoundedRect(deleteButtonX, deleteButtonY, deleteButtonSize, deleteButtonSize, 5, ColorUtils.setAlpha(ColorUtils.rgba(200, 50, 50, 255), 100));
            }
            ClientFonts.noclipslogo[25].drawString(stack, "C", deleteButtonX + 4f, deleteButtonY + 7, ColorUtils.rgba(255, 0, 0, 255));
        }
       
        public void mouseClick(float mouseX, float mouseY, int mouseButton) {
            if (isHovered(mouseX, mouseY) && mouseButton == 0) {
                if (isDeleteButtonHovered(mouseX, mouseY)) {
                    deleteConfig(this);
                } else {
                    selected = true;
                   
                    ConfigStorage configStorage = NoClips.getInstance().getConfigStorage();
                    Config config = configStorage.findConfig(configName);
                   
                    if (config != null && config.getFile().exists()) {
                        String previousConfig = NoClips.getInstance().getCurrentConfig();
                        configStorage.saveConfiguration(previousConfig);
                       
                        configStorage.loadConfiguration(configName);
                       
                        NoClips.getInstance().setCurrentConfig(configName);
                    }
                   
                    for (ConfigComponent other : configs) {
                        if (other != this) {
                            other.setSelected(false);
                        }
                    }
                }
            }
        }
       
        public void mouseRelease(float mouseX, float mouseY, int state) {
        }
       
        public void keyPressed(int keyCode, int scanCode, int modifiers) {
        }
       
        public boolean isHovered(float mouseX, float mouseY) {
            return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height;
        }
       
        private boolean isDeleteButtonHovered(float mouseX, float mouseY) {
            float deleteButtonSize = 20;
            float deleteButtonX = x + width - deleteButtonSize - 5;
            float deleteButtonY = y + (height - deleteButtonSize) / 2;
           
            return mouseX >= deleteButtonX && mouseX <= deleteButtonX + deleteButtonSize &&
                   mouseY >= deleteButtonY && mouseY <= deleteButtonY + deleteButtonSize;
        }
    }
}
норм но криво как-то а так для пастера пойдет
 
Назад
Сверху Снизу