Визуальная часть Nursultan theme system skid

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
18 Авг 2023
Сообщения
478
Реакции
8
Выберите загрузчик игры
  1. Fabric

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Пожалуйста, авторизуйтесь для просмотра ссылки.


code:
Expand Collapse Copy
package wtf.evaware.implement.screen.clickgui.panel.theme

import net.minecraft.client.MinecraftClient
import net.minecraft.client.util.math.MatrixStack
import org.joml.Vector2f
import org.joml.Vector4f
import org.lwjgl.glfw.GLFW
import wtf.evaware.api.module.setting.settings.ColorSetting
import wtf.evaware.common.utils.animation.AnimationUtil
import wtf.evaware.common.utils.animation.Easing
import wtf.evaware.common.utils.color.ColorUtil
import wtf.evaware.common.utils.math.MouseUtil
import wtf.evaware.common.utils.render.RenderUtil
import wtf.evaware.common.utils.render.ScissorUtil
import wtf.evaware.common.utils.render.fonts.Fonts
import wtf.evaware.implement.modules.render.cosmetics.HudModule
import wtf.evaware.implement.screen.clickgui.builder.Component
import wtf.evaware.implement.screen.clickgui.components.module.settings.ColorComponent
import java.awt.Color

class ThemeEditor : Component() {
    var themeList: MutableList<Theme> = ArrayList()
    val defaultTheme = Theme("Evaware")
    private var selectedTheme: Theme? = null
    var currentTheme = defaultTheme

    private val placeHolderText = "Enter name"
    private var typing = false
    private var text = ""
    var showPanel = true

    init {
        defaultTheme.addElement(ThemeElement("Primary", Color(214, 135, 255, 255)))
        defaultTheme.addElement(ThemeElement("Secondary", Color(191, 129, 255, 255)))
        defaultTheme.addElement(ThemeElement("Text", Color(255, 255, 255, 255)))
        defaultTheme.addElement(ThemeElement("Inactive Text", Color(155, 155, 155, 255)))
        defaultTheme.addElement(ThemeElement("Outline", Color(214, 195, 222, 255)))
        defaultTheme.addElement(ThemeElement("Background", Color(13, 13, 13, 146)))
        defaultTheme.addElement(ThemeElement("Module", Color(104, 76, 122, 51)))
        defaultTheme.addElement(ThemeElement("Module Outline", Color(182, 129, 215, 166)))
        defaultTheme.addElement(ThemeElement("Inactive Module Outline", Color(200, 163, 223, 88)))

        registerThemes(defaultTheme)

        height = 200f
        y = height / 2f
    }

    fun render(stack: MatrixStack, mouseX: Float, mouseY: Float, globalAlpha: Float) {
        width = 105f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor

        y = MinecraftClient.getInstance().window.scaledHeight / 2f - height / 2f

        if (!showPanel) return

        ScissorUtil.start(stack, x, y, width, height)
        RenderUtil.rect(stack, x, y, width, height, 2f * HudModule.scaleFactor, ColorUtil.getClientColor("Background", globalAlpha))
        Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Theme Editor", x + width / 2, headerY, headerF, ColorUtil.getClientColor("Primary", globalAlpha))

        RenderUtil.rect(stack, x, headerY + paddingH + headerF, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))
        RenderUtil.rect(stack, x, headerY + paddingH + headerF * 2.6f, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))

        if (selectedTheme == null) {
            val cursor = if (typing && System.currentTimeMillis() % 1000 > 500) "_" else ""
            val displayText = text.ifEmpty { placeHolderText }
            val textColor = if (text.isEmpty()) ColorUtil.getClientColor("Inactive Text", 1f) else ColorUtil.getClientColor("Text", 1f)
            Fonts.render(stack, Fonts.INTER_MEDIUM, displayText + cursor, x + padding * 2f, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, textColor)

            //// --------------------------------------------------------- ////

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor
            height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f)

            for (theme in themeList) {
                val color = if (currentTheme.name == theme.name) Color(83, 83, 83, (110 * globalAlpha).toInt()) else Color(11, 11, 11, (110 * globalAlpha).toInt())
                RenderUtil.rect(stack, x + padding, themeYOffset, width - padding * 2, themeHeight, 2f * HudModule.scaleFactor, color)
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, theme.name, x + width / 2, themeYOffset + padding + 0.5f * HudModule.scaleFactor, 7f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
                themeYOffset += padding + themeHeight
                height += padding + themeHeight + 0.5f * HudModule.scaleFactor
            }
        } else {
            val deleteButtonHeight = if (themeList.size > 1) 12f * HudModule.scaleFactor else 0f
            if (themeList.size > 1) {
                RenderUtil.rect(stack, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight, 2f * HudModule.scaleFactor, Color(180, 0, 0, (180 * globalAlpha).toInt()))
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Delete", x + width / 2, y + height - deleteButtonHeight - padding + 1.5f * HudModule.scaleFactor, 7.5f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
            }

            if (selectedTheme != null) {
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, selectedTheme!!.name, x + width / 2, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, ColorUtil.getClientColor("Secondary", 1f))
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
                height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f) + (if (themeList.size <= 1) -12f else 0f)

                val colorWidth = 10f * HudModule.scaleFactor
                for (element in selectedTheme!!.elements) {
                    element.expandAnim.run(if (element.opened) 1.0 else 0.0)
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    val borderColor = ColorUtil.getClientColor("Outline", 1f * globalAlpha)
                    RenderUtil.rect(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, 1f * HudModule.scaleFactor, ColorUtil.setAlpha(element.color, 255f * globalAlpha))
                    RenderUtil.border(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, Vector4f(1f), Vector2f(0.5f), 0.3f, borderColor, borderColor, borderColor, borderColor)
                    Fonts.render(stack, Fonts.INTER_MEDIUM, element.name, x + padding * 2.5f, elementYOffset + padding, 7f * HudModule.scaleFactor, ColorUtil.getClientColor("Text", globalAlpha))

                    if (element.opened) {
                        element.colorComponent?.let { colorComponent ->
                            colorComponent.expanded = true
                            colorComponent.visibleAnim.value = element.expandAnim.value
                            colorComponent.expandAnim.value = 1.0
                            colorComponent.alpha = element.expandAnim.value.toFloat() * globalAlpha
                            colorComponent.x = x + padding * 2
                            colorComponent.y = elementYOffset + elementHeight + 2 * (1f - element.expandAnim.value.toFloat())
                            colorComponent.width = width - padding * 4
                            colorComponent.scaleFactor = HudModule.scaleFactor
                            colorComponent.render(stack, mouseX, mouseY)
                        }
                    }

                    elementYOffset += totalHeight + padding
                    height += padding + totalHeight + 1.5f * HudModule.scaleFactor
                }
            }
        }

        ScissorUtil.end(stack)
    }

    override fun mouseClick(mouseX: Float, mouseY: Float, mouse: Int) {
        super.mouseClick(mouseX, mouseY, mouse)
        if (!showPanel) return
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor

        if (selectedTheme == null) {
            if (MouseUtil.isHovered(mouseX, mouseY, x, headerY, width, paddingH + headerF * 2.6f)) {
                typing = !typing
            }

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor

            for (theme in themeList) {
                if (MouseUtil.isHovered(mouseX, mouseY, x + padding, themeYOffset, width - padding * 2, themeHeight)) {
                    if (mouse == isRMB()) {
                        selectedTheme = theme
                    } else if (mouse == isLMB()) {
                        currentTheme = theme
                    }
                }
                themeYOffset += padding + themeHeight
            }
        } else {
            if (MouseUtil.isHovered(mouseX, mouseY, x, y, width, (8.5f * 2.1f) * HudModule.scaleFactor) && mouse == isLMB()) {
                selectedTheme = null
                return
            }

            val deleteButtonHeight = 12f * HudModule.scaleFactor
            if (MouseUtil.isHovered(mouseX, mouseY, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight)) {
                if (mouse == isLMB() && themeList.size > 1) {
                    themeList.remove(selectedTheme)
                    selectedTheme = null
                }
            }

            if (selectedTheme != null) {
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)

                for (element in selectedTheme!!.elements) {
                    //val format = "(${ColorUtil.red(element.color.rgb)}, ${ColorUtil.green(element.color.rgb)}, ${ColorUtil.blue(element.color.rgb)}, ${ColorUtil.alpha(element.color.rgb)})"
                    //println("${element.name}: $format")
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    if (MouseUtil.isHovered(mouseX, mouseY, x + padding, elementYOffset, width - padding * 2, elementHeight
                        )
                    ) {
                        if (mouse == isRMB()) {
                            element.opened = !element.opened
                            if (element.opened && element.colorComponent == null) {
                                element.colorComponent = createColorComponent(element)
                            }
                        }
                    }

                    element.colorComponent?.mouseClick(mouseX, mouseY, mouse)
                    elementYOffset += totalHeight + padding
                }
            }
        }
    }

    override fun mouseRelease(mouseX: Float, mouseY: Float, button: Int) {
        selectedTheme?.elements?.forEach { it.colorComponent?.mouseRelease(mouseX, mouseY, button) }
        super.mouseRelease(mouseX, mouseY, button)
    }

    private fun createColorComponent(element: ThemeElement): ColorComponent {
        val colorSetting = ColorSetting(element.name).defaultValue(element.color).apply {
            setVisible { true }
            set(element.color)
        }

        colorSetting.onChange { newColor ->
            element.color = newColor
        }

        return ColorComponent(colorSetting, true).apply {
            this.expanded = true
        }
    }

    private fun registerThemes(vararg themes: Theme) {
        themeList.addAll(themes)
    }

    override fun keyPressed(key: Int, scanCode: Int, modifiers: Int) {
        if (!showPanel) return
        if (typing && selectedTheme == null) {
            when (key) {
                GLFW.GLFW_KEY_BACKSPACE -> {
                    if (text.isNotEmpty()) {
                        text = text.dropLast(1)
                    }
                }
                GLFW.GLFW_KEY_ENTER, GLFW.GLFW_KEY_KP_ENTER -> {
                    if (text.isNotEmpty()) {
                        val newTheme = Theme(text)
                        currentTheme?.elements?.forEach { element ->
                            newTheme.addElement(ThemeElement(element.name, element.color))
                        }
                        themeList.add(newTheme)
                        text = ""
                    }
                    typing = false
                }
                else -> {
                    val char = getCharFromKey(key, modifiers)
                    if (char != null && (char.isLetterOrDigit() || char == ' ')) {
                        text += char
                    }
                }
            }
        }
    }

    open class Theme(val name: String) {
        val elements: MutableList<ThemeElement> = ArrayList()

        fun addElement(element: ThemeElement) {
            elements.add(element)
        }

        fun getElementColor(elementName: String): Color {
            return elements.find { it.name.lowercase() == elementName.lowercase() }?.color ?: Color(-1)
        }
    }

    open class ThemeElement(val name: String, var color: Color) {
        var opened = false
        val expandAnim = AnimationUtil(Easing.EXPO_OUT, 300)
        var colorComponent: ColorComponent? = null
    }

    private fun getCharFromKey(key: Int, modifiers: Int): Char? {
        val capsLockOn = GLFW.glfwGetKey(MinecraftClient.getInstance().window.handle, GLFW.GLFW_KEY_CAPS_LOCK) == GLFW.GLFW_PRESS

        val shiftPressed = modifiers and GLFW.GLFW_MOD_SHIFT != 0

        val uppercase = capsLockOn xor shiftPressed

        return when (key) {
            in GLFW.GLFW_KEY_A..GLFW.GLFW_KEY_Z -> {
                if (uppercase) {
                    (key - GLFW.GLFW_KEY_A + 'A'.code).toChar()
                } else {
                    (key - GLFW.GLFW_KEY_A + 'a'.code).toChar()
                }
            }
            GLFW.GLFW_KEY_SPACE -> ' '
            GLFW.GLFW_KEY_0 -> if (shiftPressed) ')' else '0'
            GLFW.GLFW_KEY_1 -> if (shiftPressed) '!' else '1'
            GLFW.GLFW_KEY_2 -> if (shiftPressed) '@' else '2'
            GLFW.GLFW_KEY_3 -> if (shiftPressed) '#' else '3'
            GLFW.GLFW_KEY_4 -> if (shiftPressed) '$' else '4'
            GLFW.GLFW_KEY_5 -> if (shiftPressed) '%' else '5'
            GLFW.GLFW_KEY_6 -> if (shiftPressed) '^' else '6'
            GLFW.GLFW_KEY_7 -> if (shiftPressed) '&' else '7'
            GLFW.GLFW_KEY_8 -> if (shiftPressed) '*' else '8'
            GLFW.GLFW_KEY_9 -> if (shiftPressed) '(' else '9'
            GLFW.GLFW_KEY_GRAVE_ACCENT -> if (shiftPressed) '~' else '`'
            GLFW.GLFW_KEY_MINUS -> if (shiftPressed) '_' else '-'
            GLFW.GLFW_KEY_EQUAL -> if (shiftPressed) '+' else '='
            GLFW.GLFW_KEY_LEFT_BRACKET -> if (shiftPressed) '{' else '['
            GLFW.GLFW_KEY_RIGHT_BRACKET -> if (shiftPressed) '}' else ']'
            GLFW.GLFW_KEY_BACKSLASH -> if (shiftPressed) '|' else '\\'
            GLFW.GLFW_KEY_SEMICOLON -> if (shiftPressed) ':' else ';'
            GLFW.GLFW_KEY_APOSTROPHE -> if (shiftPressed) '"' else '\''
            GLFW.GLFW_KEY_COMMA -> if (shiftPressed) '<' else ','
            GLFW.GLFW_KEY_PERIOD -> if (shiftPressed) '>' else '.'
            GLFW.GLFW_KEY_SLASH -> if (shiftPressed) '?' else '/'
            else -> null
        }
    }
}
 
Пожалуйста, авторизуйтесь для просмотра ссылки.


code:
Expand Collapse Copy
package wtf.evaware.implement.screen.clickgui.panel.theme

import net.minecraft.client.MinecraftClient
import net.minecraft.client.util.math.MatrixStack
import org.joml.Vector2f
import org.joml.Vector4f
import org.lwjgl.glfw.GLFW
import wtf.evaware.api.module.setting.settings.ColorSetting
import wtf.evaware.common.utils.animation.AnimationUtil
import wtf.evaware.common.utils.animation.Easing
import wtf.evaware.common.utils.color.ColorUtil
import wtf.evaware.common.utils.math.MouseUtil
import wtf.evaware.common.utils.render.RenderUtil
import wtf.evaware.common.utils.render.ScissorUtil
import wtf.evaware.common.utils.render.fonts.Fonts
import wtf.evaware.implement.modules.render.cosmetics.HudModule
import wtf.evaware.implement.screen.clickgui.builder.Component
import wtf.evaware.implement.screen.clickgui.components.module.settings.ColorComponent
import java.awt.Color

class ThemeEditor : Component() {
    var themeList: MutableList<Theme> = ArrayList()
    val defaultTheme = Theme("Evaware")
    private var selectedTheme: Theme? = null
    var currentTheme = defaultTheme

    private val placeHolderText = "Enter name"
    private var typing = false
    private var text = ""
    var showPanel = true

    init {
        defaultTheme.addElement(ThemeElement("Primary", Color(214, 135, 255, 255)))
        defaultTheme.addElement(ThemeElement("Secondary", Color(191, 129, 255, 255)))
        defaultTheme.addElement(ThemeElement("Text", Color(255, 255, 255, 255)))
        defaultTheme.addElement(ThemeElement("Inactive Text", Color(155, 155, 155, 255)))
        defaultTheme.addElement(ThemeElement("Outline", Color(214, 195, 222, 255)))
        defaultTheme.addElement(ThemeElement("Background", Color(13, 13, 13, 146)))
        defaultTheme.addElement(ThemeElement("Module", Color(104, 76, 122, 51)))
        defaultTheme.addElement(ThemeElement("Module Outline", Color(182, 129, 215, 166)))
        defaultTheme.addElement(ThemeElement("Inactive Module Outline", Color(200, 163, 223, 88)))

        registerThemes(defaultTheme)

        height = 200f
        y = height / 2f
    }

    fun render(stack: MatrixStack, mouseX: Float, mouseY: Float, globalAlpha: Float) {
        width = 105f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor

        y = MinecraftClient.getInstance().window.scaledHeight / 2f - height / 2f

        if (!showPanel) return

        ScissorUtil.start(stack, x, y, width, height)
        RenderUtil.rect(stack, x, y, width, height, 2f * HudModule.scaleFactor, ColorUtil.getClientColor("Background", globalAlpha))
        Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Theme Editor", x + width / 2, headerY, headerF, ColorUtil.getClientColor("Primary", globalAlpha))

        RenderUtil.rect(stack, x, headerY + paddingH + headerF, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))
        RenderUtil.rect(stack, x, headerY + paddingH + headerF * 2.6f, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))

        if (selectedTheme == null) {
            val cursor = if (typing && System.currentTimeMillis() % 1000 > 500) "_" else ""
            val displayText = text.ifEmpty { placeHolderText }
            val textColor = if (text.isEmpty()) ColorUtil.getClientColor("Inactive Text", 1f) else ColorUtil.getClientColor("Text", 1f)
            Fonts.render(stack, Fonts.INTER_MEDIUM, displayText + cursor, x + padding * 2f, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, textColor)

            //// --------------------------------------------------------- ////

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor
            height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f)

            for (theme in themeList) {
                val color = if (currentTheme.name == theme.name) Color(83, 83, 83, (110 * globalAlpha).toInt()) else Color(11, 11, 11, (110 * globalAlpha).toInt())
                RenderUtil.rect(stack, x + padding, themeYOffset, width - padding * 2, themeHeight, 2f * HudModule.scaleFactor, color)
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, theme.name, x + width / 2, themeYOffset + padding + 0.5f * HudModule.scaleFactor, 7f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
                themeYOffset += padding + themeHeight
                height += padding + themeHeight + 0.5f * HudModule.scaleFactor
            }
        } else {
            val deleteButtonHeight = if (themeList.size > 1) 12f * HudModule.scaleFactor else 0f
            if (themeList.size > 1) {
                RenderUtil.rect(stack, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight, 2f * HudModule.scaleFactor, Color(180, 0, 0, (180 * globalAlpha).toInt()))
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Delete", x + width / 2, y + height - deleteButtonHeight - padding + 1.5f * HudModule.scaleFactor, 7.5f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
            }

            if (selectedTheme != null) {
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, selectedTheme!!.name, x + width / 2, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, ColorUtil.getClientColor("Secondary", 1f))
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
                height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f) + (if (themeList.size <= 1) -12f else 0f)

                val colorWidth = 10f * HudModule.scaleFactor
                for (element in selectedTheme!!.elements) {
                    element.expandAnim.run(if (element.opened) 1.0 else 0.0)
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    val borderColor = ColorUtil.getClientColor("Outline", 1f * globalAlpha)
                    RenderUtil.rect(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, 1f * HudModule.scaleFactor, ColorUtil.setAlpha(element.color, 255f * globalAlpha))
                    RenderUtil.border(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, Vector4f(1f), Vector2f(0.5f), 0.3f, borderColor, borderColor, borderColor, borderColor)
                    Fonts.render(stack, Fonts.INTER_MEDIUM, element.name, x + padding * 2.5f, elementYOffset + padding, 7f * HudModule.scaleFactor, ColorUtil.getClientColor("Text", globalAlpha))

                    if (element.opened) {
                        element.colorComponent?.let { colorComponent ->
                            colorComponent.expanded = true
                            colorComponent.visibleAnim.value = element.expandAnim.value
                            colorComponent.expandAnim.value = 1.0
                            colorComponent.alpha = element.expandAnim.value.toFloat() * globalAlpha
                            colorComponent.x = x + padding * 2
                            colorComponent.y = elementYOffset + elementHeight + 2 * (1f - element.expandAnim.value.toFloat())
                            colorComponent.width = width - padding * 4
                            colorComponent.scaleFactor = HudModule.scaleFactor
                            colorComponent.render(stack, mouseX, mouseY)
                        }
                    }

                    elementYOffset += totalHeight + padding
                    height += padding + totalHeight + 1.5f * HudModule.scaleFactor
                }
            }
        }

        ScissorUtil.end(stack)
    }

    override fun mouseClick(mouseX: Float, mouseY: Float, mouse: Int) {
        super.mouseClick(mouseX, mouseY, mouse)
        if (!showPanel) return
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor

        if (selectedTheme == null) {
            if (MouseUtil.isHovered(mouseX, mouseY, x, headerY, width, paddingH + headerF * 2.6f)) {
                typing = !typing
            }

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor

            for (theme in themeList) {
                if (MouseUtil.isHovered(mouseX, mouseY, x + padding, themeYOffset, width - padding * 2, themeHeight)) {
                    if (mouse == isRMB()) {
                        selectedTheme = theme
                    } else if (mouse == isLMB()) {
                        currentTheme = theme
                    }
                }
                themeYOffset += padding + themeHeight
            }
        } else {
            if (MouseUtil.isHovered(mouseX, mouseY, x, y, width, (8.5f * 2.1f) * HudModule.scaleFactor) && mouse == isLMB()) {
                selectedTheme = null
                return
            }

            val deleteButtonHeight = 12f * HudModule.scaleFactor
            if (MouseUtil.isHovered(mouseX, mouseY, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight)) {
                if (mouse == isLMB() && themeList.size > 1) {
                    themeList.remove(selectedTheme)
                    selectedTheme = null
                }
            }

            if (selectedTheme != null) {
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)

                for (element in selectedTheme!!.elements) {
                    //val format = "(${ColorUtil.red(element.color.rgb)}, ${ColorUtil.green(element.color.rgb)}, ${ColorUtil.blue(element.color.rgb)}, ${ColorUtil.alpha(element.color.rgb)})"
                    //println("${element.name}: $format")
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    if (MouseUtil.isHovered(mouseX, mouseY, x + padding, elementYOffset, width - padding * 2, elementHeight
                        )
                    ) {
                        if (mouse == isRMB()) {
                            element.opened = !element.opened
                            if (element.opened && element.colorComponent == null) {
                                element.colorComponent = createColorComponent(element)
                            }
                        }
                    }

                    element.colorComponent?.mouseClick(mouseX, mouseY, mouse)
                    elementYOffset += totalHeight + padding
                }
            }
        }
    }

    override fun mouseRelease(mouseX: Float, mouseY: Float, button: Int) {
        selectedTheme?.elements?.forEach { it.colorComponent?.mouseRelease(mouseX, mouseY, button) }
        super.mouseRelease(mouseX, mouseY, button)
    }

    private fun createColorComponent(element: ThemeElement): ColorComponent {
        val colorSetting = ColorSetting(element.name).defaultValue(element.color).apply {
            setVisible { true }
            set(element.color)
        }

        colorSetting.onChange { newColor ->
            element.color = newColor
        }

        return ColorComponent(colorSetting, true).apply {
            this.expanded = true
        }
    }

    private fun registerThemes(vararg themes: Theme) {
        themeList.addAll(themes)
    }

    override fun keyPressed(key: Int, scanCode: Int, modifiers: Int) {
        if (!showPanel) return
        if (typing && selectedTheme == null) {
            when (key) {
                GLFW.GLFW_KEY_BACKSPACE -> {
                    if (text.isNotEmpty()) {
                        text = text.dropLast(1)
                    }
                }
                GLFW.GLFW_KEY_ENTER, GLFW.GLFW_KEY_KP_ENTER -> {
                    if (text.isNotEmpty()) {
                        val newTheme = Theme(text)
                        currentTheme?.elements?.forEach { element ->
                            newTheme.addElement(ThemeElement(element.name, element.color))
                        }
                        themeList.add(newTheme)
                        text = ""
                    }
                    typing = false
                }
                else -> {
                    val char = getCharFromKey(key, modifiers)
                    if (char != null && (char.isLetterOrDigit() || char == ' ')) {
                        text += char
                    }
                }
            }
        }
    }

    open class Theme(val name: String) {
        val elements: MutableList<ThemeElement> = ArrayList()

        fun addElement(element: ThemeElement) {
            elements.add(element)
        }

        fun getElementColor(elementName: String): Color {
            return elements.find { it.name.lowercase() == elementName.lowercase() }?.color ?: Color(-1)
        }
    }

    open class ThemeElement(val name: String, var color: Color) {
        var opened = false
        val expandAnim = AnimationUtil(Easing.EXPO_OUT, 300)
        var colorComponent: ColorComponent? = null
    }

    private fun getCharFromKey(key: Int, modifiers: Int): Char? {
        val capsLockOn = GLFW.glfwGetKey(MinecraftClient.getInstance().window.handle, GLFW.GLFW_KEY_CAPS_LOCK) == GLFW.GLFW_PRESS

        val shiftPressed = modifiers and GLFW.GLFW_MOD_SHIFT != 0

        val uppercase = capsLockOn xor shiftPressed

        return when (key) {
            in GLFW.GLFW_KEY_A..GLFW.GLFW_KEY_Z -> {
                if (uppercase) {
                    (key - GLFW.GLFW_KEY_A + 'A'.code).toChar()
                } else {
                    (key - GLFW.GLFW_KEY_A + 'a'.code).toChar()
                }
            }
            GLFW.GLFW_KEY_SPACE -> ' '
            GLFW.GLFW_KEY_0 -> if (shiftPressed) ')' else '0'
            GLFW.GLFW_KEY_1 -> if (shiftPressed) '!' else '1'
            GLFW.GLFW_KEY_2 -> if (shiftPressed) '@' else '2'
            GLFW.GLFW_KEY_3 -> if (shiftPressed) '#' else '3'
            GLFW.GLFW_KEY_4 -> if (shiftPressed) '$' else '4'
            GLFW.GLFW_KEY_5 -> if (shiftPressed) '%' else '5'
            GLFW.GLFW_KEY_6 -> if (shiftPressed) '^' else '6'
            GLFW.GLFW_KEY_7 -> if (shiftPressed) '&' else '7'
            GLFW.GLFW_KEY_8 -> if (shiftPressed) '*' else '8'
            GLFW.GLFW_KEY_9 -> if (shiftPressed) '(' else '9'
            GLFW.GLFW_KEY_GRAVE_ACCENT -> if (shiftPressed) '~' else '`'
            GLFW.GLFW_KEY_MINUS -> if (shiftPressed) '_' else '-'
            GLFW.GLFW_KEY_EQUAL -> if (shiftPressed) '+' else '='
            GLFW.GLFW_KEY_LEFT_BRACKET -> if (shiftPressed) '{' else '['
            GLFW.GLFW_KEY_RIGHT_BRACKET -> if (shiftPressed) '}' else ']'
            GLFW.GLFW_KEY_BACKSLASH -> if (shiftPressed) '|' else '\\'
            GLFW.GLFW_KEY_SEMICOLON -> if (shiftPressed) ':' else ';'
            GLFW.GLFW_KEY_APOSTROPHE -> if (shiftPressed) '"' else '\''
            GLFW.GLFW_KEY_COMMA -> if (shiftPressed) '<' else ','
            GLFW.GLFW_KEY_PERIOD -> if (shiftPressed) '>' else '.'
            GLFW.GLFW_KEY_SLASH -> if (shiftPressed) '?' else '/'
            else -> null
        }
    }
}
красава
 
Поможешь перенести pahanyakudza дс
 
уже пастишь?)
Поможешь перенести pahanyakudza дс
под 3,1 легче с 0 написать
Поможешь перенести pahanyakudza дс
и тебе дефолт система экспенсива помешает там надо свои темы делать
 
Понял , шаришь за гуи? У меня есть идея поможешь реализовать?
 
Пожалуйста, авторизуйтесь для просмотра ссылки.


code:
Expand Collapse Copy
package wtf.evaware.implement.screen.clickgui.panel.theme

import net.minecraft.client.MinecraftClient
import net.minecraft.client.util.math.MatrixStack
import org.joml.Vector2f
import org.joml.Vector4f
import org.lwjgl.glfw.GLFW
import wtf.evaware.api.module.setting.settings.ColorSetting
import wtf.evaware.common.utils.animation.AnimationUtil
import wtf.evaware.common.utils.animation.Easing
import wtf.evaware.common.utils.color.ColorUtil
import wtf.evaware.common.utils.math.MouseUtil
import wtf.evaware.common.utils.render.RenderUtil
import wtf.evaware.common.utils.render.ScissorUtil
import wtf.evaware.common.utils.render.fonts.Fonts
import wtf.evaware.implement.modules.render.cosmetics.HudModule
import wtf.evaware.implement.screen.clickgui.builder.Component
import wtf.evaware.implement.screen.clickgui.components.module.settings.ColorComponent
import java.awt.Color

class ThemeEditor : Component() {
    var themeList: MutableList<Theme> = ArrayList()
    val defaultTheme = Theme("Evaware")
    private var selectedTheme: Theme? = null
    var currentTheme = defaultTheme

    private val placeHolderText = "Enter name"
    private var typing = false
    private var text = ""
    var showPanel = true

    init {
        defaultTheme.addElement(ThemeElement("Primary", Color(214, 135, 255, 255)))
        defaultTheme.addElement(ThemeElement("Secondary", Color(191, 129, 255, 255)))
        defaultTheme.addElement(ThemeElement("Text", Color(255, 255, 255, 255)))
        defaultTheme.addElement(ThemeElement("Inactive Text", Color(155, 155, 155, 255)))
        defaultTheme.addElement(ThemeElement("Outline", Color(214, 195, 222, 255)))
        defaultTheme.addElement(ThemeElement("Background", Color(13, 13, 13, 146)))
        defaultTheme.addElement(ThemeElement("Module", Color(104, 76, 122, 51)))
        defaultTheme.addElement(ThemeElement("Module Outline", Color(182, 129, 215, 166)))
        defaultTheme.addElement(ThemeElement("Inactive Module Outline", Color(200, 163, 223, 88)))

        registerThemes(defaultTheme)

        height = 200f
        y = height / 2f
    }

    fun render(stack: MatrixStack, mouseX: Float, mouseY: Float, globalAlpha: Float) {
        width = 105f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor

        y = MinecraftClient.getInstance().window.scaledHeight / 2f - height / 2f

        if (!showPanel) return

        ScissorUtil.start(stack, x, y, width, height)
        RenderUtil.rect(stack, x, y, width, height, 2f * HudModule.scaleFactor, ColorUtil.getClientColor("Background", globalAlpha))
        Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Theme Editor", x + width / 2, headerY, headerF, ColorUtil.getClientColor("Primary", globalAlpha))

        RenderUtil.rect(stack, x, headerY + paddingH + headerF, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))
        RenderUtil.rect(stack, x, headerY + paddingH + headerF * 2.6f, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))

        if (selectedTheme == null) {
            val cursor = if (typing && System.currentTimeMillis() % 1000 > 500) "_" else ""
            val displayText = text.ifEmpty { placeHolderText }
            val textColor = if (text.isEmpty()) ColorUtil.getClientColor("Inactive Text", 1f) else ColorUtil.getClientColor("Text", 1f)
            Fonts.render(stack, Fonts.INTER_MEDIUM, displayText + cursor, x + padding * 2f, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, textColor)

            //// --------------------------------------------------------- ////

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor
            height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f)

            for (theme in themeList) {
                val color = if (currentTheme.name == theme.name) Color(83, 83, 83, (110 * globalAlpha).toInt()) else Color(11, 11, 11, (110 * globalAlpha).toInt())
                RenderUtil.rect(stack, x + padding, themeYOffset, width - padding * 2, themeHeight, 2f * HudModule.scaleFactor, color)
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, theme.name, x + width / 2, themeYOffset + padding + 0.5f * HudModule.scaleFactor, 7f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
                themeYOffset += padding + themeHeight
                height += padding + themeHeight + 0.5f * HudModule.scaleFactor
            }
        } else {
            val deleteButtonHeight = if (themeList.size > 1) 12f * HudModule.scaleFactor else 0f
            if (themeList.size > 1) {
                RenderUtil.rect(stack, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight, 2f * HudModule.scaleFactor, Color(180, 0, 0, (180 * globalAlpha).toInt()))
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Delete", x + width / 2, y + height - deleteButtonHeight - padding + 1.5f * HudModule.scaleFactor, 7.5f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
            }

            if (selectedTheme != null) {
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, selectedTheme!!.name, x + width / 2, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, ColorUtil.getClientColor("Secondary", 1f))
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
                height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f) + (if (themeList.size <= 1) -12f else 0f)

                val colorWidth = 10f * HudModule.scaleFactor
                for (element in selectedTheme!!.elements) {
                    element.expandAnim.run(if (element.opened) 1.0 else 0.0)
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    val borderColor = ColorUtil.getClientColor("Outline", 1f * globalAlpha)
                    RenderUtil.rect(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, 1f * HudModule.scaleFactor, ColorUtil.setAlpha(element.color, 255f * globalAlpha))
                    RenderUtil.border(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, Vector4f(1f), Vector2f(0.5f), 0.3f, borderColor, borderColor, borderColor, borderColor)
                    Fonts.render(stack, Fonts.INTER_MEDIUM, element.name, x + padding * 2.5f, elementYOffset + padding, 7f * HudModule.scaleFactor, ColorUtil.getClientColor("Text", globalAlpha))

                    if (element.opened) {
                        element.colorComponent?.let { colorComponent ->
                            colorComponent.expanded = true
                            colorComponent.visibleAnim.value = element.expandAnim.value
                            colorComponent.expandAnim.value = 1.0
                            colorComponent.alpha = element.expandAnim.value.toFloat() * globalAlpha
                            colorComponent.x = x + padding * 2
                            colorComponent.y = elementYOffset + elementHeight + 2 * (1f - element.expandAnim.value.toFloat())
                            colorComponent.width = width - padding * 4
                            colorComponent.scaleFactor = HudModule.scaleFactor
                            colorComponent.render(stack, mouseX, mouseY)
                        }
                    }

                    elementYOffset += totalHeight + padding
                    height += padding + totalHeight + 1.5f * HudModule.scaleFactor
                }
            }
        }

        ScissorUtil.end(stack)
    }

    override fun mouseClick(mouseX: Float, mouseY: Float, mouse: Int) {
        super.mouseClick(mouseX, mouseY, mouse)
        if (!showPanel) return
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor

        if (selectedTheme == null) {
            if (MouseUtil.isHovered(mouseX, mouseY, x, headerY, width, paddingH + headerF * 2.6f)) {
                typing = !typing
            }

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor

            for (theme in themeList) {
                if (MouseUtil.isHovered(mouseX, mouseY, x + padding, themeYOffset, width - padding * 2, themeHeight)) {
                    if (mouse == isRMB()) {
                        selectedTheme = theme
                    } else if (mouse == isLMB()) {
                        currentTheme = theme
                    }
                }
                themeYOffset += padding + themeHeight
            }
        } else {
            if (MouseUtil.isHovered(mouseX, mouseY, x, y, width, (8.5f * 2.1f) * HudModule.scaleFactor) && mouse == isLMB()) {
                selectedTheme = null
                return
            }

            val deleteButtonHeight = 12f * HudModule.scaleFactor
            if (MouseUtil.isHovered(mouseX, mouseY, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight)) {
                if (mouse == isLMB() && themeList.size > 1) {
                    themeList.remove(selectedTheme)
                    selectedTheme = null
                }
            }

            if (selectedTheme != null) {
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)

                for (element in selectedTheme!!.elements) {
                    //val format = "(${ColorUtil.red(element.color.rgb)}, ${ColorUtil.green(element.color.rgb)}, ${ColorUtil.blue(element.color.rgb)}, ${ColorUtil.alpha(element.color.rgb)})"
                    //println("${element.name}: $format")
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    if (MouseUtil.isHovered(mouseX, mouseY, x + padding, elementYOffset, width - padding * 2, elementHeight
                        )
                    ) {
                        if (mouse == isRMB()) {
                            element.opened = !element.opened
                            if (element.opened && element.colorComponent == null) {
                                element.colorComponent = createColorComponent(element)
                            }
                        }
                    }

                    element.colorComponent?.mouseClick(mouseX, mouseY, mouse)
                    elementYOffset += totalHeight + padding
                }
            }
        }
    }

    override fun mouseRelease(mouseX: Float, mouseY: Float, button: Int) {
        selectedTheme?.elements?.forEach { it.colorComponent?.mouseRelease(mouseX, mouseY, button) }
        super.mouseRelease(mouseX, mouseY, button)
    }

    private fun createColorComponent(element: ThemeElement): ColorComponent {
        val colorSetting = ColorSetting(element.name).defaultValue(element.color).apply {
            setVisible { true }
            set(element.color)
        }

        colorSetting.onChange { newColor ->
            element.color = newColor
        }

        return ColorComponent(colorSetting, true).apply {
            this.expanded = true
        }
    }

    private fun registerThemes(vararg themes: Theme) {
        themeList.addAll(themes)
    }

    override fun keyPressed(key: Int, scanCode: Int, modifiers: Int) {
        if (!showPanel) return
        if (typing && selectedTheme == null) {
            when (key) {
                GLFW.GLFW_KEY_BACKSPACE -> {
                    if (text.isNotEmpty()) {
                        text = text.dropLast(1)
                    }
                }
                GLFW.GLFW_KEY_ENTER, GLFW.GLFW_KEY_KP_ENTER -> {
                    if (text.isNotEmpty()) {
                        val newTheme = Theme(text)
                        currentTheme?.elements?.forEach { element ->
                            newTheme.addElement(ThemeElement(element.name, element.color))
                        }
                        themeList.add(newTheme)
                        text = ""
                    }
                    typing = false
                }
                else -> {
                    val char = getCharFromKey(key, modifiers)
                    if (char != null && (char.isLetterOrDigit() || char == ' ')) {
                        text += char
                    }
                }
            }
        }
    }

    open class Theme(val name: String) {
        val elements: MutableList<ThemeElement> = ArrayList()

        fun addElement(element: ThemeElement) {
            elements.add(element)
        }

        fun getElementColor(elementName: String): Color {
            return elements.find { it.name.lowercase() == elementName.lowercase() }?.color ?: Color(-1)
        }
    }

    open class ThemeElement(val name: String, var color: Color) {
        var opened = false
        val expandAnim = AnimationUtil(Easing.EXPO_OUT, 300)
        var colorComponent: ColorComponent? = null
    }

    private fun getCharFromKey(key: Int, modifiers: Int): Char? {
        val capsLockOn = GLFW.glfwGetKey(MinecraftClient.getInstance().window.handle, GLFW.GLFW_KEY_CAPS_LOCK) == GLFW.GLFW_PRESS

        val shiftPressed = modifiers and GLFW.GLFW_MOD_SHIFT != 0

        val uppercase = capsLockOn xor shiftPressed

        return when (key) {
            in GLFW.GLFW_KEY_A..GLFW.GLFW_KEY_Z -> {
                if (uppercase) {
                    (key - GLFW.GLFW_KEY_A + 'A'.code).toChar()
                } else {
                    (key - GLFW.GLFW_KEY_A + 'a'.code).toChar()
                }
            }
            GLFW.GLFW_KEY_SPACE -> ' '
            GLFW.GLFW_KEY_0 -> if (shiftPressed) ')' else '0'
            GLFW.GLFW_KEY_1 -> if (shiftPressed) '!' else '1'
            GLFW.GLFW_KEY_2 -> if (shiftPressed) '@' else '2'
            GLFW.GLFW_KEY_3 -> if (shiftPressed) '#' else '3'
            GLFW.GLFW_KEY_4 -> if (shiftPressed) '$' else '4'
            GLFW.GLFW_KEY_5 -> if (shiftPressed) '%' else '5'
            GLFW.GLFW_KEY_6 -> if (shiftPressed) '^' else '6'
            GLFW.GLFW_KEY_7 -> if (shiftPressed) '&' else '7'
            GLFW.GLFW_KEY_8 -> if (shiftPressed) '*' else '8'
            GLFW.GLFW_KEY_9 -> if (shiftPressed) '(' else '9'
            GLFW.GLFW_KEY_GRAVE_ACCENT -> if (shiftPressed) '~' else '`'
            GLFW.GLFW_KEY_MINUS -> if (shiftPressed) '_' else '-'
            GLFW.GLFW_KEY_EQUAL -> if (shiftPressed) '+' else '='
            GLFW.GLFW_KEY_LEFT_BRACKET -> if (shiftPressed) '{' else '['
            GLFW.GLFW_KEY_RIGHT_BRACKET -> if (shiftPressed) '}' else ']'
            GLFW.GLFW_KEY_BACKSLASH -> if (shiftPressed) '|' else '\\'
            GLFW.GLFW_KEY_SEMICOLON -> if (shiftPressed) ':' else ';'
            GLFW.GLFW_KEY_APOSTROPHE -> if (shiftPressed) '"' else '\''
            GLFW.GLFW_KEY_COMMA -> if (shiftPressed) '<' else ','
            GLFW.GLFW_KEY_PERIOD -> if (shiftPressed) '>' else '.'
            GLFW.GLFW_KEY_SLASH -> if (shiftPressed) '?' else '/'
            else -> null
        }
    }
}
сылка баганная
Понял , шаришь за гуи? У меня есть идея поможешь реализовать?
ну?
Понял , шаришь за гуи? У меня есть идея поможешь реализовать?
мб дс?
 
наф катлин пастишь((
 
Пожалуйста, авторизуйтесь для просмотра ссылки.


code:
Expand Collapse Copy
package wtf.evaware.implement.screen.clickgui.panel.theme

import net.minecraft.client.MinecraftClient
import net.minecraft.client.util.math.MatrixStack
import org.joml.Vector2f
import org.joml.Vector4f
import org.lwjgl.glfw.GLFW
import wtf.evaware.api.module.setting.settings.ColorSetting
import wtf.evaware.common.utils.animation.AnimationUtil
import wtf.evaware.common.utils.animation.Easing
import wtf.evaware.common.utils.color.ColorUtil
import wtf.evaware.common.utils.math.MouseUtil
import wtf.evaware.common.utils.render.RenderUtil
import wtf.evaware.common.utils.render.ScissorUtil
import wtf.evaware.common.utils.render.fonts.Fonts
import wtf.evaware.implement.modules.render.cosmetics.HudModule
import wtf.evaware.implement.screen.clickgui.builder.Component
import wtf.evaware.implement.screen.clickgui.components.module.settings.ColorComponent
import java.awt.Color

class ThemeEditor : Component() {
    var themeList: MutableList<Theme> = ArrayList()
    val defaultTheme = Theme("Evaware")
    private var selectedTheme: Theme? = null
    var currentTheme = defaultTheme

    private val placeHolderText = "Enter name"
    private var typing = false
    private var text = ""
    var showPanel = true

    init {
        defaultTheme.addElement(ThemeElement("Primary", Color(214, 135, 255, 255)))
        defaultTheme.addElement(ThemeElement("Secondary", Color(191, 129, 255, 255)))
        defaultTheme.addElement(ThemeElement("Text", Color(255, 255, 255, 255)))
        defaultTheme.addElement(ThemeElement("Inactive Text", Color(155, 155, 155, 255)))
        defaultTheme.addElement(ThemeElement("Outline", Color(214, 195, 222, 255)))
        defaultTheme.addElement(ThemeElement("Background", Color(13, 13, 13, 146)))
        defaultTheme.addElement(ThemeElement("Module", Color(104, 76, 122, 51)))
        defaultTheme.addElement(ThemeElement("Module Outline", Color(182, 129, 215, 166)))
        defaultTheme.addElement(ThemeElement("Inactive Module Outline", Color(200, 163, 223, 88)))

        registerThemes(defaultTheme)

        height = 200f
        y = height / 2f
    }

    fun render(stack: MatrixStack, mouseX: Float, mouseY: Float, globalAlpha: Float) {
        width = 105f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor

        y = MinecraftClient.getInstance().window.scaledHeight / 2f - height / 2f

        if (!showPanel) return

        ScissorUtil.start(stack, x, y, width, height)
        RenderUtil.rect(stack, x, y, width, height, 2f * HudModule.scaleFactor, ColorUtil.getClientColor("Background", globalAlpha))
        Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Theme Editor", x + width / 2, headerY, headerF, ColorUtil.getClientColor("Primary", globalAlpha))

        RenderUtil.rect(stack, x, headerY + paddingH + headerF, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))
        RenderUtil.rect(stack, x, headerY + paddingH + headerF * 2.6f, width, 1f * HudModule.scaleFactor, 0f, ColorUtil.getClientColor("Outline", globalAlpha))

        if (selectedTheme == null) {
            val cursor = if (typing && System.currentTimeMillis() % 1000 > 500) "_" else ""
            val displayText = text.ifEmpty { placeHolderText }
            val textColor = if (text.isEmpty()) ColorUtil.getClientColor("Inactive Text", 1f) else ColorUtil.getClientColor("Text", 1f)
            Fonts.render(stack, Fonts.INTER_MEDIUM, displayText + cursor, x + padding * 2f, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, textColor)

            //// --------------------------------------------------------- ////

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor
            height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f)

            for (theme in themeList) {
                val color = if (currentTheme.name == theme.name) Color(83, 83, 83, (110 * globalAlpha).toInt()) else Color(11, 11, 11, (110 * globalAlpha).toInt())
                RenderUtil.rect(stack, x + padding, themeYOffset, width - padding * 2, themeHeight, 2f * HudModule.scaleFactor, color)
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, theme.name, x + width / 2, themeYOffset + padding + 0.5f * HudModule.scaleFactor, 7f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
                themeYOffset += padding + themeHeight
                height += padding + themeHeight + 0.5f * HudModule.scaleFactor
            }
        } else {
            val deleteButtonHeight = if (themeList.size > 1) 12f * HudModule.scaleFactor else 0f
            if (themeList.size > 1) {
                RenderUtil.rect(stack, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight, 2f * HudModule.scaleFactor, Color(180, 0, 0, (180 * globalAlpha).toInt()))
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, "Delete", x + width / 2, y + height - deleteButtonHeight - padding + 1.5f * HudModule.scaleFactor, 7.5f * HudModule.scaleFactor, Color(255, 255, 255, (255 * globalAlpha).toInt()))
            }

            if (selectedTheme != null) {
                Fonts.renderCentered(stack, Fonts.INTER_MEDIUM, selectedTheme!!.name, x + width / 2, headerY + paddingH + headerF + padding, 8f * HudModule.scaleFactor, ColorUtil.getClientColor("Secondary", 1f))
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
                height = 4f * HudModule.scaleFactor + paddingH + headerF * (2.6f + 0.3f) + (if (themeList.size <= 1) -12f else 0f)

                val colorWidth = 10f * HudModule.scaleFactor
                for (element in selectedTheme!!.elements) {
                    element.expandAnim.run(if (element.opened) 1.0 else 0.0)
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    val borderColor = ColorUtil.getClientColor("Outline", 1f * globalAlpha)
                    RenderUtil.rect(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, 1f * HudModule.scaleFactor, ColorUtil.setAlpha(element.color, 255f * globalAlpha))
                    RenderUtil.border(stack, x + width - padding * 2 - colorWidth, elementYOffset + padding, colorWidth, elementHeight - padding * 2, Vector4f(1f), Vector2f(0.5f), 0.3f, borderColor, borderColor, borderColor, borderColor)
                    Fonts.render(stack, Fonts.INTER_MEDIUM, element.name, x + padding * 2.5f, elementYOffset + padding, 7f * HudModule.scaleFactor, ColorUtil.getClientColor("Text", globalAlpha))

                    if (element.opened) {
                        element.colorComponent?.let { colorComponent ->
                            colorComponent.expanded = true
                            colorComponent.visibleAnim.value = element.expandAnim.value
                            colorComponent.expandAnim.value = 1.0
                            colorComponent.alpha = element.expandAnim.value.toFloat() * globalAlpha
                            colorComponent.x = x + padding * 2
                            colorComponent.y = elementYOffset + elementHeight + 2 * (1f - element.expandAnim.value.toFloat())
                            colorComponent.width = width - padding * 4
                            colorComponent.scaleFactor = HudModule.scaleFactor
                            colorComponent.render(stack, mouseX, mouseY)
                        }
                    }

                    elementYOffset += totalHeight + padding
                    height += padding + totalHeight + 1.5f * HudModule.scaleFactor
                }
            }
        }

        ScissorUtil.end(stack)
    }

    override fun mouseClick(mouseX: Float, mouseY: Float, mouse: Int) {
        super.mouseClick(mouseX, mouseY, mouse)
        if (!showPanel) return
        val paddingH = 5f * HudModule.scaleFactor
        val headerY = y + 4f * HudModule.scaleFactor
        val headerF = 8.5f * HudModule.scaleFactor
        val padding = 2f * HudModule.scaleFactor

        if (selectedTheme == null) {
            if (MouseUtil.isHovered(mouseX, mouseY, x, headerY, width, paddingH + headerF * 2.6f)) {
                typing = !typing
            }

            var themeYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)
            val themeHeight = 14f * HudModule.scaleFactor

            for (theme in themeList) {
                if (MouseUtil.isHovered(mouseX, mouseY, x + padding, themeYOffset, width - padding * 2, themeHeight)) {
                    if (mouse == isRMB()) {
                        selectedTheme = theme
                    } else if (mouse == isLMB()) {
                        currentTheme = theme
                    }
                }
                themeYOffset += padding + themeHeight
            }
        } else {
            if (MouseUtil.isHovered(mouseX, mouseY, x, y, width, (8.5f * 2.1f) * HudModule.scaleFactor) && mouse == isLMB()) {
                selectedTheme = null
                return
            }

            val deleteButtonHeight = 12f * HudModule.scaleFactor
            if (MouseUtil.isHovered(mouseX, mouseY, x + padding, y + height - deleteButtonHeight - padding, width - padding * 2f, deleteButtonHeight)) {
                if (mouse == isLMB() && themeList.size > 1) {
                    themeList.remove(selectedTheme)
                    selectedTheme = null
                }
            }

            if (selectedTheme != null) {
                var elementYOffset = headerY + paddingH + headerF * (2.6f + 0.3f)

                for (element in selectedTheme!!.elements) {
                    //val format = "(${ColorUtil.red(element.color.rgb)}, ${ColorUtil.green(element.color.rgb)}, ${ColorUtil.blue(element.color.rgb)}, ${ColorUtil.alpha(element.color.rgb)})"
                    //println("${element.name}: $format")
                    val elementHeight = 14f * HudModule.scaleFactor
                    val totalHeight = elementHeight + if (element.opened) (element.colorComponent?.height ?: 0f) else 0f

                    if (MouseUtil.isHovered(mouseX, mouseY, x + padding, elementYOffset, width - padding * 2, elementHeight
                        )
                    ) {
                        if (mouse == isRMB()) {
                            element.opened = !element.opened
                            if (element.opened && element.colorComponent == null) {
                                element.colorComponent = createColorComponent(element)
                            }
                        }
                    }

                    element.colorComponent?.mouseClick(mouseX, mouseY, mouse)
                    elementYOffset += totalHeight + padding
                }
            }
        }
    }

    override fun mouseRelease(mouseX: Float, mouseY: Float, button: Int) {
        selectedTheme?.elements?.forEach { it.colorComponent?.mouseRelease(mouseX, mouseY, button) }
        super.mouseRelease(mouseX, mouseY, button)
    }

    private fun createColorComponent(element: ThemeElement): ColorComponent {
        val colorSetting = ColorSetting(element.name).defaultValue(element.color).apply {
            setVisible { true }
            set(element.color)
        }

        colorSetting.onChange { newColor ->
            element.color = newColor
        }

        return ColorComponent(colorSetting, true).apply {
            this.expanded = true
        }
    }

    private fun registerThemes(vararg themes: Theme) {
        themeList.addAll(themes)
    }

    override fun keyPressed(key: Int, scanCode: Int, modifiers: Int) {
        if (!showPanel) return
        if (typing && selectedTheme == null) {
            when (key) {
                GLFW.GLFW_KEY_BACKSPACE -> {
                    if (text.isNotEmpty()) {
                        text = text.dropLast(1)
                    }
                }
                GLFW.GLFW_KEY_ENTER, GLFW.GLFW_KEY_KP_ENTER -> {
                    if (text.isNotEmpty()) {
                        val newTheme = Theme(text)
                        currentTheme?.elements?.forEach { element ->
                            newTheme.addElement(ThemeElement(element.name, element.color))
                        }
                        themeList.add(newTheme)
                        text = ""
                    }
                    typing = false
                }
                else -> {
                    val char = getCharFromKey(key, modifiers)
                    if (char != null && (char.isLetterOrDigit() || char == ' ')) {
                        text += char
                    }
                }
            }
        }
    }

    open class Theme(val name: String) {
        val elements: MutableList<ThemeElement> = ArrayList()

        fun addElement(element: ThemeElement) {
            elements.add(element)
        }

        fun getElementColor(elementName: String): Color {
            return elements.find { it.name.lowercase() == elementName.lowercase() }?.color ?: Color(-1)
        }
    }

    open class ThemeElement(val name: String, var color: Color) {
        var opened = false
        val expandAnim = AnimationUtil(Easing.EXPO_OUT, 300)
        var colorComponent: ColorComponent? = null
    }

    private fun getCharFromKey(key: Int, modifiers: Int): Char? {
        val capsLockOn = GLFW.glfwGetKey(MinecraftClient.getInstance().window.handle, GLFW.GLFW_KEY_CAPS_LOCK) == GLFW.GLFW_PRESS

        val shiftPressed = modifiers and GLFW.GLFW_MOD_SHIFT != 0

        val uppercase = capsLockOn xor shiftPressed

        return when (key) {
            in GLFW.GLFW_KEY_A..GLFW.GLFW_KEY_Z -> {
                if (uppercase) {
                    (key - GLFW.GLFW_KEY_A + 'A'.code).toChar()
                } else {
                    (key - GLFW.GLFW_KEY_A + 'a'.code).toChar()
                }
            }
            GLFW.GLFW_KEY_SPACE -> ' '
            GLFW.GLFW_KEY_0 -> if (shiftPressed) ')' else '0'
            GLFW.GLFW_KEY_1 -> if (shiftPressed) '!' else '1'
            GLFW.GLFW_KEY_2 -> if (shiftPressed) '@' else '2'
            GLFW.GLFW_KEY_3 -> if (shiftPressed) '#' else '3'
            GLFW.GLFW_KEY_4 -> if (shiftPressed) '$' else '4'
            GLFW.GLFW_KEY_5 -> if (shiftPressed) '%' else '5'
            GLFW.GLFW_KEY_6 -> if (shiftPressed) '^' else '6'
            GLFW.GLFW_KEY_7 -> if (shiftPressed) '&' else '7'
            GLFW.GLFW_KEY_8 -> if (shiftPressed) '*' else '8'
            GLFW.GLFW_KEY_9 -> if (shiftPressed) '(' else '9'
            GLFW.GLFW_KEY_GRAVE_ACCENT -> if (shiftPressed) '~' else '`'
            GLFW.GLFW_KEY_MINUS -> if (shiftPressed) '_' else '-'
            GLFW.GLFW_KEY_EQUAL -> if (shiftPressed) '+' else '='
            GLFW.GLFW_KEY_LEFT_BRACKET -> if (shiftPressed) '{' else '['
            GLFW.GLFW_KEY_RIGHT_BRACKET -> if (shiftPressed) '}' else ']'
            GLFW.GLFW_KEY_BACKSLASH -> if (shiftPressed) '|' else '\\'
            GLFW.GLFW_KEY_SEMICOLON -> if (shiftPressed) ':' else ';'
            GLFW.GLFW_KEY_APOSTROPHE -> if (shiftPressed) '"' else '\''
            GLFW.GLFW_KEY_COMMA -> if (shiftPressed) '<' else ','
            GLFW.GLFW_KEY_PERIOD -> if (shiftPressed) '>' else '.'
            GLFW.GLFW_KEY_SLASH -> if (shiftPressed) '?' else '/'
            else -> null
        }
    }
}
Как всегда наш слоняра!
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Похожие темы

Назад
Сверху Снизу