Add own RGBColor class
This commit is contained in:
parent
32b83a7e60
commit
83b9124670
5 changed files with 48 additions and 31 deletions
|
@ -7,6 +7,7 @@ package space.uranos.chat
|
||||||
|
|
||||||
import com.squareup.moshi.FromJson
|
import com.squareup.moshi.FromJson
|
||||||
import com.squareup.moshi.ToJson
|
import com.squareup.moshi.ToJson
|
||||||
|
import space.uranos.util.RGBColor
|
||||||
|
|
||||||
@Suppress("ClassName")
|
@Suppress("ClassName")
|
||||||
sealed class ChatColor(val stringRepresentation: String) {
|
sealed class ChatColor(val stringRepresentation: String) {
|
||||||
|
@ -27,19 +28,12 @@ sealed class ChatColor(val stringRepresentation: String) {
|
||||||
object YELLOW : ChatColor("yellow")
|
object YELLOW : ChatColor("yellow")
|
||||||
object WHITE : ChatColor("white")
|
object WHITE : ChatColor("white")
|
||||||
|
|
||||||
class Hex(code: String) : ChatColor("#" + code.removePrefix("#")) {
|
class Custom(color: RGBColor) :
|
||||||
val code = toString()
|
ChatColor("#${color.rgb.toString(16).padStart(6, '0')}")
|
||||||
|
|
||||||
init {
|
|
||||||
if (!HEX_COLOR_REGEX.matches(code)) throw IllegalArgumentException("code is not a valid hexadecimal color")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String = stringRepresentation
|
override fun toString(): String = stringRepresentation
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val HEX_COLOR_REGEX = Regex("^#(?:[0-9a-fA-F]{3}){1,2}\$")
|
|
||||||
|
|
||||||
val NAMED_COLORS by lazy {
|
val NAMED_COLORS by lazy {
|
||||||
setOf(
|
setOf(
|
||||||
BLACK,
|
BLACK,
|
||||||
|
@ -62,12 +56,10 @@ sealed class ChatColor(val stringRepresentation: String) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun fromString(value: String): ChatColor =
|
fun fromString(value: String): ChatColor =
|
||||||
if (value.startsWith("#")) Hex(value)
|
run {
|
||||||
else try {
|
if (value.startsWith("#")) RGBColor.fromString(value.removePrefix("#"))?.let { Custom(it) }
|
||||||
NAMED_COLORS.getValue(value)
|
else NAMED_COLORS[value]
|
||||||
} catch (e: NoSuchElementException) {
|
} ?: throw IllegalArgumentException("There is no color named '${value}'")
|
||||||
throw IllegalArgumentException("There is no color named '${value}'")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object JSONAdapter {
|
object JSONAdapter {
|
||||||
|
@ -78,5 +70,3 @@ sealed class ChatColor(val stringRepresentation: String) {
|
||||||
fun fromJson(value: String) = fromString(value)
|
fun fromJson(value: String) = fromString(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val String.color get() = ChatColor.fromString(this)
|
|
||||||
|
|
32
uranos-api/src/main/kotlin/space/uranos/util/RGBColor.kt
Normal file
32
uranos-api/src/main/kotlin/space/uranos/util/RGBColor.kt
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2020-2021 Moritz Ruth and Uranos contributors
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
package space.uranos.util
|
||||||
|
|
||||||
|
class RGBColor(rgb: Int) {
|
||||||
|
val rgb = rgb and 0xFFFFFF
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
red: UByte,
|
||||||
|
green: UByte,
|
||||||
|
blue: UByte
|
||||||
|
) : this((red.toInt() shl 16) and (green.toInt() shl 8) and blue.toInt())
|
||||||
|
|
||||||
|
constructor(javaColor: java.awt.Color) : this(javaColor.rgb)
|
||||||
|
|
||||||
|
val red: UByte by lazy { ((rgb and 0xFF0000) shr 16).toUByte() }
|
||||||
|
val green: UByte by lazy { ((rgb and 0x00FF00) shr 8).toUByte() }
|
||||||
|
val blue: UByte by lazy { (rgb and 0x0000FF).toUByte() }
|
||||||
|
|
||||||
|
override fun toString() = "0x${rgb.toString(16).toUpperCase().padStart(6, '0')}"
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean = (other == this) || (other is RGBColor && other.rgb == this.rgb)
|
||||||
|
override fun hashCode(): Int = rgb
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun fromString(string: String): RGBColor? =
|
||||||
|
runCatching { string.removePrefix("0x").toInt(16) }.getOrNull()?.let { RGBColor(it) }
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,15 +6,15 @@
|
||||||
package space.uranos.world
|
package space.uranos.world
|
||||||
|
|
||||||
import space.uranos.RegistryItem
|
import space.uranos.RegistryItem
|
||||||
import java.awt.Color
|
import space.uranos.util.RGBColor
|
||||||
|
|
||||||
data class Biome(
|
data class Biome(
|
||||||
override val id: String,
|
override val id: String,
|
||||||
val precipitation: Precipitation,
|
val precipitation: Precipitation,
|
||||||
val skyColor: Color, // TODO: Maybe replace with an own color class
|
val skyColor: RGBColor,
|
||||||
val waterFogColor: Color,
|
val waterFogColor: RGBColor,
|
||||||
val fogColor: Color,
|
val fogColor: RGBColor,
|
||||||
val waterColor: Color,
|
val waterColor: RGBColor,
|
||||||
val moodSound: MoodSound,
|
val moodSound: MoodSound,
|
||||||
/**
|
/**
|
||||||
* Has an effect on grass and foliage color
|
* Has an effect on grass and foliage color
|
||||||
|
@ -60,10 +60,10 @@ data class Biome(
|
||||||
val PLAINS = Biome(
|
val PLAINS = Biome(
|
||||||
"minecraft:plains",
|
"minecraft:plains",
|
||||||
Precipitation.RAIN,
|
Precipitation.RAIN,
|
||||||
Color(7907327),
|
RGBColor(7907327),
|
||||||
Color(329011),
|
RGBColor(329011),
|
||||||
Color(12638463),
|
RGBColor(12638463),
|
||||||
Color(4159204),
|
RGBColor(4159204),
|
||||||
MoodSound(
|
MoodSound(
|
||||||
6000,
|
6000,
|
||||||
2.0,
|
2.0,
|
||||||
|
|
|
@ -11,11 +11,9 @@ import space.uranos.net.packet.OutgoingPacketCodec
|
||||||
import space.uranos.util.checkBit
|
import space.uranos.util.checkBit
|
||||||
import space.uranos.util.setBit
|
import space.uranos.util.setBit
|
||||||
|
|
||||||
// TODO: Implement partial updates
|
|
||||||
object ChunkLightDataPacketCodec : OutgoingPacketCodec<ChunkLightDataPacket>(0x23, ChunkLightDataPacket::class) {
|
object ChunkLightDataPacketCodec : OutgoingPacketCodec<ChunkLightDataPacket>(0x23, ChunkLightDataPacket::class) {
|
||||||
private const val OUTSIDE_SECTIONS_MASK = 0b100000000000000001
|
private const val OUTSIDE_SECTIONS_MASK = 0b100000000000000001
|
||||||
|
|
||||||
@OptIn(ExperimentalUnsignedTypes::class)
|
|
||||||
override fun ChunkLightDataPacket.encode(dst: ByteBuf) {
|
override fun ChunkLightDataPacket.encode(dst: ByteBuf) {
|
||||||
dst.writeVarInt(key.x)
|
dst.writeVarInt(key.x)
|
||||||
dst.writeVarInt(key.z)
|
dst.writeVarInt(key.z)
|
||||||
|
|
|
@ -12,8 +12,5 @@ import space.uranos.net.packet.OutgoingPacketCodec
|
||||||
object DeclareRecipesPacketCodec : OutgoingPacketCodec<DeclareRecipesPacket>(0x5A, DeclareRecipesPacket::class) {
|
object DeclareRecipesPacketCodec : OutgoingPacketCodec<DeclareRecipesPacket>(0x5A, DeclareRecipesPacket::class) {
|
||||||
override fun DeclareRecipesPacket.encode(dst: ByteBuf) {
|
override fun DeclareRecipesPacket.encode(dst: ByteBuf) {
|
||||||
dst.writeVarInt(recipes.size)
|
dst.writeVarInt(recipes.size)
|
||||||
for (recipe in recipes) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue