Add RenderUtil.kt, fix a logic issue in the setter of ButtonImpl.toggled, add keystrokes and set the version number to 0.3.0
This commit is contained in:
parent
38e0989358
commit
e5f0cd0ab2
|
@ -26,7 +26,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "fr.username404"
|
group = "fr.username404"
|
||||||
version = "0.2.7"
|
version = "0.3.0"
|
||||||
val groupAndName = "${rootProject.group}.${rootProject.name.toLowerCase()}"
|
val groupAndName = "${rootProject.group}.${rootProject.name.toLowerCase()}"
|
||||||
|
|
||||||
architectury {
|
architectury {
|
||||||
|
|
|
@ -16,8 +16,9 @@ abstract class Snowy {
|
||||||
private val displayInitMessage: Boolean by Configuration
|
private val displayInitMessage: Boolean by Configuration
|
||||||
companion object {
|
companion object {
|
||||||
val MissingComponent: TranslatableComponent = object: TranslatableComponent(null) { override fun getString(): String = "MISSING_COMPONENT" }
|
val MissingComponent: TranslatableComponent = object: TranslatableComponent(null) { override fun getString(): String = "MISSING_COMPONENT" }
|
||||||
|
@Suppress("JVM_STATIC_ON_CONST_OR_JVM_FIELD") // See KT-39868
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
protected val FeaturePackage: String = ButtonInfo::class.java.packageName
|
protected const val FeaturePackage: String = "fr.username404.snowygui.gui.feature"
|
||||||
lateinit var annotatedButtons: Set<Class<out ButtonImpl>>
|
lateinit var annotatedButtons: Set<Class<out ButtonImpl>>
|
||||||
fun onEvent(e: Any, lambda: argsLambda) = useKey(e.toString()).add(lambda)
|
fun onEvent(e: Any, lambda: argsLambda) = useKey(e.toString()).add(lambda)
|
||||||
@JvmField
|
@JvmField
|
||||||
|
|
|
@ -2,7 +2,7 @@ package fr.username404.snowygui.config
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack
|
import com.mojang.blaze3d.vertex.PoseStack
|
||||||
import fr.username404.snowygui.ClickGui
|
import fr.username404.snowygui.ClickGui
|
||||||
import fr.username404.snowygui.gui.FontUtil
|
import fr.username404.snowygui.utils.FontUtil
|
||||||
import fr.username404.snowygui.gui.elements.ClickBox
|
import fr.username404.snowygui.gui.elements.ClickBox
|
||||||
import fr.username404.snowygui.gui.elements.ClickBox.Companion.buttonsMax
|
import fr.username404.snowygui.gui.elements.ClickBox.Companion.buttonsMax
|
||||||
import fr.username404.snowygui.gui.elements.ClickBox.Companion.sortAlphabetically
|
import fr.username404.snowygui.gui.elements.ClickBox.Companion.sortAlphabetically
|
||||||
|
|
|
@ -1,32 +1,20 @@
|
||||||
package fr.username404.snowygui.gui
|
package fr.username404.snowygui.gui
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.*
|
import com.mojang.blaze3d.vertex.PoseStack
|
||||||
|
import com.mojang.blaze3d.vertex.VertexConsumer
|
||||||
import fr.username404.snowygui.Snowy
|
import fr.username404.snowygui.Snowy
|
||||||
import fr.username404.snowygui.gui.feature.Colors
|
import fr.username404.snowygui.gui.feature.Colors
|
||||||
|
import fr.username404.snowygui.utils.RenderingUtil
|
||||||
|
import fr.username404.snowygui.utils.RenderingUtil.colorEnd
|
||||||
import net.minecraft.client.gui.components.events.GuiEventListener
|
import net.minecraft.client.gui.components.events.GuiEventListener
|
||||||
import org.lwjgl.opengl.GL20
|
|
||||||
|
|
||||||
fun interface Renderable {
|
fun interface Renderable {
|
||||||
companion object Rendering {
|
|
||||||
@JvmStatic val tessellator: Tesselator = Tesselator.getInstance()
|
|
||||||
@JvmStatic val buffer: BufferBuilder = tessellator.builder
|
|
||||||
fun ColoredElement.defaultRectFunc() {
|
|
||||||
with(buffer) {
|
|
||||||
begin(GL20.GL_QUADS, DefaultVertexFormat.POSITION_COLOR)
|
|
||||||
vertex(x, y + height, 0.0).colorEnd()
|
|
||||||
vertex(x + width, y + height, 0.0).colorEnd()
|
|
||||||
vertex(x + width, y, 0.0).colorEnd()
|
|
||||||
vertex(x, y, 0.0).colorEnd()
|
|
||||||
tessellator.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fun render(poseStack: PoseStack?)
|
fun render(poseStack: PoseStack?)
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class Element(
|
abstract class Element(
|
||||||
@JvmField val xOrigin: Double, @JvmField val yOrigin: Double,
|
@JvmField val xOrigin: Double, @JvmField val yOrigin: Double,
|
||||||
val originalWidth: Int, val originalHeight: Int
|
@JvmField val originalWidth: Int, @JvmField val originalHeight: Int
|
||||||
): Renderable, GuiEventListener {
|
): Renderable, GuiEventListener {
|
||||||
open var width = originalWidth; open var height = originalHeight
|
open var width = originalWidth; open var height = originalHeight
|
||||||
open var x = xOrigin; open var y = yOrigin
|
open var x = xOrigin; open var y = yOrigin
|
||||||
|
@ -34,11 +22,6 @@ abstract class Element(
|
||||||
(coordinateX in x..(x + width + offsetWidth)) && (coordinateY in y..(y + height + offsetHeight))
|
(coordinateX in x..(x + width + offsetWidth)) && (coordinateY in y..(y + height + offsetHeight))
|
||||||
companion object {
|
companion object {
|
||||||
private var caughtError: Boolean = false
|
private var caughtError: Boolean = false
|
||||||
fun fromRenderable(r: Renderable, x: Double, y: Double, width: Int, height: Int): Element {
|
|
||||||
return object: Element(x, y, width, height) {
|
|
||||||
override fun render(poseStack: PoseStack?) = r.render(poseStack)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
open fun display(stack: PoseStack? = null) {
|
open fun display(stack: PoseStack? = null) {
|
||||||
if (!hidden && !caughtError) try {
|
if (!hidden && !caughtError) try {
|
||||||
|
@ -59,14 +42,8 @@ abstract class ColoredElement(
|
||||||
x: Double, y: Double, width: Int, height: Int,
|
x: Double, y: Double, width: Int, height: Int,
|
||||||
open val color: Int = Colors.TRANSPARENT.hexValue, protected var opacity: Float,
|
open val color: Int = Colors.TRANSPARENT.hexValue, protected var opacity: Float,
|
||||||
) : Element(x, y, width, height) {
|
) : Element(x, y, width, height) {
|
||||||
companion object {
|
protected fun VertexConsumer.colorEnd(color: Int = this@ColoredElement.color) = colorEnd(color, opacity)
|
||||||
@JvmStatic protected fun VertexConsumer.colorIt(color: Int, opacity: Float = 1F): VertexConsumer {
|
protected fun defaultRectFunc() = RenderingUtil.drawRectangle(x, y, height, width, color, opacity)
|
||||||
with(hextoRGB(color)) {
|
|
||||||
return this@colorIt.color(get(0), get(1), get(2), opacity)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
internal fun VertexConsumer.colorEnd(color: Int = this@ColoredElement.color) = colorIt(color, opacity).endVertex()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun hextoRGB(hex: Int): MutableList<Float> {
|
fun hextoRGB(hex: Int): MutableList<Float> {
|
||||||
|
|
|
@ -6,12 +6,11 @@ import com.mojang.blaze3d.vertex.PoseStack
|
||||||
import fr.username404.snowygui.Snowy.Companion.MissingComponent
|
import fr.username404.snowygui.Snowy.Companion.MissingComponent
|
||||||
import fr.username404.snowygui.config.Configuration
|
import fr.username404.snowygui.config.Configuration
|
||||||
import fr.username404.snowygui.gui.ColoredElement
|
import fr.username404.snowygui.gui.ColoredElement
|
||||||
import fr.username404.snowygui.gui.Renderable.Rendering.buffer
|
|
||||||
import fr.username404.snowygui.gui.Renderable.Rendering.defaultRectFunc
|
|
||||||
import fr.username404.snowygui.gui.Renderable.Rendering.tessellator
|
|
||||||
import fr.username404.snowygui.gui.feature.ButtonImpl
|
import fr.username404.snowygui.gui.feature.ButtonImpl
|
||||||
import fr.username404.snowygui.gui.feature.Category
|
import fr.username404.snowygui.gui.feature.Category
|
||||||
import fr.username404.snowygui.gui.feature.Colors
|
import fr.username404.snowygui.gui.feature.Colors
|
||||||
|
import fr.username404.snowygui.utils.RenderingUtil.buffer
|
||||||
|
import fr.username404.snowygui.utils.RenderingUtil.tessellator
|
||||||
import io.github.config4k.extract
|
import io.github.config4k.extract
|
||||||
import kotlinx.coroutines.CoroutineStart
|
import kotlinx.coroutines.CoroutineStart
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
|
@ -6,8 +6,7 @@ import fr.username404.snowygui.ClickGui
|
||||||
import fr.username404.snowygui.Snowy
|
import fr.username404.snowygui.Snowy
|
||||||
import fr.username404.snowygui.config.Configuration
|
import fr.username404.snowygui.config.Configuration
|
||||||
import fr.username404.snowygui.gui.ColoredElement
|
import fr.username404.snowygui.gui.ColoredElement
|
||||||
import fr.username404.snowygui.gui.FontUtil
|
import fr.username404.snowygui.utils.FontUtil
|
||||||
import fr.username404.snowygui.gui.Renderable.Rendering.defaultRectFunc
|
|
||||||
import fr.username404.snowygui.gui.feature.ButtonInfo.Companion.Type
|
import fr.username404.snowygui.gui.feature.ButtonInfo.Companion.Type
|
||||||
import kotlin.reflect.full.findAnnotation
|
import kotlin.reflect.full.findAnnotation
|
||||||
|
|
||||||
|
@ -55,7 +54,7 @@ sealed class ButtonImpl: ColoredElement(0.0, 0.0, 73, 8, opacity = 0.60F) {
|
||||||
}
|
}
|
||||||
@JvmField
|
@JvmField
|
||||||
val info = this::class.findAnnotation<ButtonInfo>() ?: throw Exception("Missing @ButtonInfo annotaton")
|
val info = this::class.findAnnotation<ButtonInfo>() ?: throw Exception("Missing @ButtonInfo annotaton")
|
||||||
override var color = info.parent.categoryColor; get() {
|
final override var color = info.parent.categoryColor; get() {
|
||||||
return info.parent.box.color.let {
|
return info.parent.box.color.let {
|
||||||
if (field == it) field else it
|
if (field == it) field else it
|
||||||
}
|
}
|
||||||
|
@ -64,8 +63,8 @@ sealed class ButtonImpl: ColoredElement(0.0, 0.0, 73, 8, opacity = 0.60F) {
|
||||||
protected open fun execAction() = Unit
|
protected open fun execAction() = Unit
|
||||||
private var wasWithinBounds: Boolean = false
|
private var wasWithinBounds: Boolean = false
|
||||||
var toggled: Boolean = false; private set(value) {
|
var toggled: Boolean = false; private set(value) {
|
||||||
if (value) lightUp() else if (field) lightDown()
|
|
||||||
if (field xor value) {
|
if (field xor value) {
|
||||||
|
if (value) lightUp() else lightDown()
|
||||||
field = value
|
field = value
|
||||||
execAction()
|
execAction()
|
||||||
} else field = value
|
} else field = value
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package fr.username404.snowygui.gui.feature
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack
|
||||||
|
import fr.username404.snowygui.EventSnowy.Companion.useKey
|
||||||
|
import fr.username404.snowygui.argsLambda
|
||||||
|
import fr.username404.snowygui.gui.Renderable
|
||||||
|
|
||||||
|
sealed class ButtonImplWithHud: ButtonImpl() {
|
||||||
|
protected abstract val hudRenderLambda: Renderable
|
||||||
|
private val generatedLambda: argsLambda = { hudRenderLambda.render(it.first() as PoseStack?) }
|
||||||
|
final override fun execAction() {
|
||||||
|
useKey("HudRender").run {
|
||||||
|
if (toggled) add(generatedLambda)
|
||||||
|
else remove(generatedLambda)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,13 +16,14 @@ annotation class ButtonInfo(
|
||||||
val ignored: Boolean = false /** Excludes a class from button collection */
|
val ignored: Boolean = false /** Excludes a class from button collection */
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
internal var lightningFactor: Float = 0.33F
|
const val lightningFactor: Float = 0.33F
|
||||||
enum class Type {
|
enum class Type {
|
||||||
TOGGLE,
|
TOGGLE,
|
||||||
CLICK
|
CLICK
|
||||||
}
|
}
|
||||||
enum class Category(val translationKey: String, val categoryColor: Int, val shouldHide: Boolean = false) {
|
enum class Category(val translationKey: String, val categoryColor: Int, val shouldHide: Boolean = false) {
|
||||||
MISC("snowy.clickbox.misc", Colors.BLUE),
|
MISC("snowy.clickbox.misc", Colors.BLUE),
|
||||||
|
HUD("snowy.clickbox.hud", Colors.DARK_PURPLE),
|
||||||
RISKY("snowy.clickbox.risky", Colors.RED, !riskyCheats),
|
RISKY("snowy.clickbox.risky", Colors.RED, !riskyCheats),
|
||||||
MACROS("snowy.clickbox.macros", Colors.GREEN);
|
MACROS("snowy.clickbox.macros", Colors.GREEN);
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -1,26 +1,24 @@
|
||||||
package fr.username404.snowygui.gui.feature
|
package fr.username404.snowygui.gui.feature
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack
|
import fr.username404.snowygui.gui.Renderable
|
||||||
import fr.username404.snowygui.Snowy.Companion.onEvent
|
import fr.username404.snowygui.utils.FontUtil
|
||||||
import fr.username404.snowygui.gui.FontUtil
|
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
@ButtonInfo(Category.MISC)
|
@ButtonInfo(Category.HUD)
|
||||||
object Clock: ButtonImpl() {
|
object Clock: ButtonImplWithHud() {
|
||||||
override fun toString(): String = LocalDateTime.now().run {
|
override fun toString(): String = LocalDateTime.now().run {
|
||||||
arrayOf(hour, minute, second).map {
|
arrayOf(hour, minute, second).map {
|
||||||
(it.takeIf { (it >= 10) } ?: "0$it").toString()
|
(it.takeIf { (it >= 10) } ?: "0$it").toString()
|
||||||
}.reduce { previous, current -> "$previous:$current"}
|
}.reduce { previous, current -> "$previous:$current"}
|
||||||
}
|
}
|
||||||
init {
|
|
||||||
onEvent("HudRender") {
|
override val hudRenderLambda = Renderable { poseStack ->
|
||||||
if (toggled) {
|
poseStack?.let {
|
||||||
FontUtil.drawScaled(it.first() as PoseStack,
|
FontUtil.drawScaled(
|
||||||
this@Clock.toString(),
|
it, this@Clock.toString(),
|
||||||
5.0, 5.0,
|
5.0, 5.0,
|
||||||
0.85F, color = Colors.GOLD
|
0.85F, color = Colors.GOLD
|
||||||
)
|
)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@ enum class Colors(val hexValue: Int) {
|
||||||
RED(0x660000),
|
RED(0x660000),
|
||||||
GREEN(0x00FF7F),
|
GREEN(0x00FF7F),
|
||||||
ORANGE(0xf18e33),
|
ORANGE(0xf18e33),
|
||||||
PURPLE(0xA97BFF);
|
PURPLE(0xA97BFF),
|
||||||
|
DARK_PURPLE(0x3C204C);
|
||||||
|
operator fun invoke() = hexValue
|
||||||
fun asTextColor(): TextColor = TextColor.fromRgb(hexValue)
|
fun asTextColor(): TextColor = TextColor.fromRgb(hexValue)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
package fr.username404.snowygui.gui.feature
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack
|
||||||
|
import fr.username404.snowygui.gui.ColoredElement
|
||||||
|
import fr.username404.snowygui.gui.Renderable
|
||||||
|
import fr.username404.snowygui.utils.FontUtil
|
||||||
|
import fr.username404.snowygui.utils.RenderingUtil
|
||||||
|
import net.minecraft.client.Minecraft
|
||||||
|
|
||||||
|
@ButtonInfo(Category.HUD)
|
||||||
|
object Keystrokes: ButtonImplWithHud() {
|
||||||
|
private val hud = object : ColoredElement(x = 135.0, y = 325.0, height = 36, width = 36, color = Colors.BLACK(), opacity = 0.5F) {
|
||||||
|
private val keysArray by lazy {
|
||||||
|
Minecraft.getInstance().options.run {
|
||||||
|
arrayOf(keyLeft, keyDown, keyRight, keyUp) to arrayOf(0.5, 0.5, 0.5, 0.5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private val minimumOpacity = opacity.toDouble()
|
||||||
|
private fun getDynamicOpacity(i: Int): Double {
|
||||||
|
val dynamicOpacity = keysArray.second
|
||||||
|
if (keysArray.first[i].isDown) {
|
||||||
|
if (dynamicOpacity[i] < 1) {
|
||||||
|
dynamicOpacity[i] += 0.05
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (dynamicOpacity[i] > minimumOpacity) {
|
||||||
|
dynamicOpacity[i] -= 0.05
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dynamicOpacity[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun drawKey(x: Double, y: Double, key: Int, poseStack: PoseStack? = null) {
|
||||||
|
RenderingUtil.prepareDraw()
|
||||||
|
RenderingUtil.drawRectangle(
|
||||||
|
x, y, height / 2, height / 2,
|
||||||
|
color = color, opacity = getDynamicOpacity(key).toFloat()
|
||||||
|
)
|
||||||
|
RenderingUtil.endDraw()
|
||||||
|
poseStack?.let {
|
||||||
|
FontUtil.drawScaled(
|
||||||
|
it, keysArray.first[key].translatedKeyMessage.string.uppercase(),
|
||||||
|
x + height.toDouble() / 5.5, y + height.toDouble() / 6.5,
|
||||||
|
scaleFactor = 1F, color = Colors.WHITE
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private fun getNewPos(i: Int) = x + (i * (2 + (height / 2)))
|
||||||
|
override fun render(poseStack: PoseStack?) = with(RenderingUtil) {
|
||||||
|
for (i in 0 until 3) {
|
||||||
|
drawKey(getNewPos(i), y, i, poseStack)
|
||||||
|
}
|
||||||
|
drawKey(getNewPos(1), y - (height / 2) - 2, 3, poseStack)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
override val hudRenderLambda = Renderable {
|
||||||
|
hud.display(it)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package fr.username404.snowygui.gui
|
package fr.username404.snowygui.utils
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack
|
import com.mojang.blaze3d.vertex.PoseStack
|
||||||
import net.minecraft.client.Minecraft
|
import net.minecraft.client.Minecraft
|
|
@ -0,0 +1,41 @@
|
||||||
|
package fr.username404.snowygui.utils
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem
|
||||||
|
import com.mojang.blaze3d.vertex.BufferBuilder
|
||||||
|
import com.mojang.blaze3d.vertex.DefaultVertexFormat
|
||||||
|
import com.mojang.blaze3d.vertex.Tesselator
|
||||||
|
import com.mojang.blaze3d.vertex.VertexConsumer
|
||||||
|
import fr.username404.snowygui.gui.feature.Colors
|
||||||
|
import fr.username404.snowygui.gui.hextoRGB
|
||||||
|
import org.lwjgl.opengl.GL20
|
||||||
|
|
||||||
|
object RenderingUtil {
|
||||||
|
@JvmField val tessellator: Tesselator = Tesselator.getInstance()
|
||||||
|
@JvmField val buffer: BufferBuilder = tessellator.builder
|
||||||
|
@JvmStatic
|
||||||
|
fun VertexConsumer.colorIt(color: Int, opacity: Float = 1F): VertexConsumer = hextoRGB(color).run {
|
||||||
|
color(get(0), get(1), get(2), opacity)
|
||||||
|
}
|
||||||
|
fun VertexConsumer.colorEnd(color: Int, opacity: Float = 1F) = colorIt(color, opacity).endVertex()
|
||||||
|
fun prepareDraw() {
|
||||||
|
RenderSystem.disableTexture()
|
||||||
|
RenderSystem.enableBlend()
|
||||||
|
RenderSystem.defaultBlendFunc()
|
||||||
|
}
|
||||||
|
fun endDraw() {
|
||||||
|
RenderSystem.enableTexture()
|
||||||
|
RenderSystem.disableBlend()
|
||||||
|
}
|
||||||
|
fun drawRectangle(
|
||||||
|
x: Double, y: Double, height: Int, width: Int,
|
||||||
|
color: Int = Colors.TRANSPARENT(), opacity: Float = 1F
|
||||||
|
): Unit = buffer.run {
|
||||||
|
fun VertexConsumer.colorEnd() = colorEnd(color, opacity)
|
||||||
|
begin(GL20.GL_QUADS, DefaultVertexFormat.POSITION_COLOR)
|
||||||
|
vertex(x, y + height, 0.0).colorEnd()
|
||||||
|
vertex(x + width, y + height, 0.0).colorEnd()
|
||||||
|
vertex(x + width, y, 0.0).colorEnd()
|
||||||
|
vertex(x, y, 0.0).colorEnd()
|
||||||
|
tessellator.end()
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,7 @@
|
||||||
"key.snowy.opengui": "Open the snowy gui",
|
"key.snowy.opengui": "Open the snowy gui",
|
||||||
"key.snowy.configkey": "Open the snowy configuration screen",
|
"key.snowy.configkey": "Open the snowy configuration screen",
|
||||||
"snowy.clickbox.misc": "Miscellaneous",
|
"snowy.clickbox.misc": "Miscellaneous",
|
||||||
|
"snowy.clickbox.hud": "HUD",
|
||||||
"snowy.clickbox.risky": "Risky",
|
"snowy.clickbox.risky": "Risky",
|
||||||
"snowy.clickbox.macros": "Macros"
|
"snowy.clickbox.macros": "Macros"
|
||||||
}
|
}
|
|
@ -17,6 +17,7 @@
|
||||||
"key.snowy.opengui": "Ouvrir l'interface de snowy",
|
"key.snowy.opengui": "Ouvrir l'interface de snowy",
|
||||||
"key.snowy.configkey": "Ouvrir l'écran de configuration de snowy",
|
"key.snowy.configkey": "Ouvrir l'écran de configuration de snowy",
|
||||||
"snowy.clickbox.misc": "Divers",
|
"snowy.clickbox.misc": "Divers",
|
||||||
|
"snowy.clickbox.hud": "ATH",
|
||||||
"snowy.clickbox.risky": "Risqué",
|
"snowy.clickbox.risky": "Risqué",
|
||||||
"snowy.clickbox.macros": "Macros"
|
"snowy.clickbox.macros": "Macros"
|
||||||
}
|
}
|
Loading…
Reference in New Issue