Начинающий
- Статус
- Оффлайн
- Регистрация
- 18 Авг 2023
- Сообщения
- 478
- Реакции
- 8
- Выберите загрузчик игры
- Fabric
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Пожалуйста, авторизуйтесь для просмотра ссылки.
code:
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
}
}
}