Начинающий
- Статус
- Оффлайн
- Регистрация
- 11 Май 2024
- Сообщения
- 10
- Реакции
- 0
- Выберите загрузчик игры
- Vanilla
ну, короче, было мне скучно, и я решил сделать конфигэдитор.
тут можно создать конфиг, удалить его и выбрать.
может есть ошибки, хотя я вроде не замечал
ss -
тут можно создать конфиг, удалить его и выбрать.
может есть ошибки, хотя я вроде не замечал
ss -
Пожалуйста, авторизуйтесь для просмотра ссылки.
ConfigEditor:
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;
}
}
}