Archived
1
0
Fork 0

Add own RGBColor class

This commit is contained in:
Moritz Ruth 2021-01-08 21:55:45 +01:00
parent 32b83a7e60
commit 83b9124670
No known key found for this signature in database
GPG key ID: AFD57E23E753841B
5 changed files with 48 additions and 31 deletions

View file

@ -7,6 +7,7 @@ package space.uranos.chat
import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
import space.uranos.util.RGBColor
@Suppress("ClassName")
sealed class ChatColor(val stringRepresentation: String) {
@ -27,19 +28,12 @@ sealed class ChatColor(val stringRepresentation: String) {
object YELLOW : ChatColor("yellow")
object WHITE : ChatColor("white")
class Hex(code: String) : ChatColor("#" + code.removePrefix("#")) {
val code = toString()
init {
if (!HEX_COLOR_REGEX.matches(code)) throw IllegalArgumentException("code is not a valid hexadecimal color")
}
}
class Custom(color: RGBColor) :
ChatColor("#${color.rgb.toString(16).padStart(6, '0')}")
override fun toString(): String = stringRepresentation
companion object {
private val HEX_COLOR_REGEX = Regex("^#(?:[0-9a-fA-F]{3}){1,2}\$")
val NAMED_COLORS by lazy {
setOf(
BLACK,
@ -62,12 +56,10 @@ sealed class ChatColor(val stringRepresentation: String) {
}
fun fromString(value: String): ChatColor =
if (value.startsWith("#")) Hex(value)
else try {
NAMED_COLORS.getValue(value)
} catch (e: NoSuchElementException) {
throw IllegalArgumentException("There is no color named '${value}'")
}
run {
if (value.startsWith("#")) RGBColor.fromString(value.removePrefix("#"))?.let { Custom(it) }
else NAMED_COLORS[value]
} ?: throw IllegalArgumentException("There is no color named '${value}'")
}
object JSONAdapter {
@ -78,5 +70,3 @@ sealed class ChatColor(val stringRepresentation: String) {
fun fromJson(value: String) = fromString(value)
}
}
val String.color get() = ChatColor.fromString(this)

View 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) }
}
}

View file

@ -6,15 +6,15 @@
package space.uranos.world
import space.uranos.RegistryItem
import java.awt.Color
import space.uranos.util.RGBColor
data class Biome(
override val id: String,
val precipitation: Precipitation,
val skyColor: Color, // TODO: Maybe replace with an own color class
val waterFogColor: Color,
val fogColor: Color,
val waterColor: Color,
val skyColor: RGBColor,
val waterFogColor: RGBColor,
val fogColor: RGBColor,
val waterColor: RGBColor,
val moodSound: MoodSound,
/**
* Has an effect on grass and foliage color
@ -60,10 +60,10 @@ data class Biome(
val PLAINS = Biome(
"minecraft:plains",
Precipitation.RAIN,
Color(7907327),
Color(329011),
Color(12638463),
Color(4159204),
RGBColor(7907327),
RGBColor(329011),
RGBColor(12638463),
RGBColor(4159204),
MoodSound(
6000,
2.0,

View file

@ -11,11 +11,9 @@ import space.uranos.net.packet.OutgoingPacketCodec
import space.uranos.util.checkBit
import space.uranos.util.setBit
// TODO: Implement partial updates
object ChunkLightDataPacketCodec : OutgoingPacketCodec<ChunkLightDataPacket>(0x23, ChunkLightDataPacket::class) {
private const val OUTSIDE_SECTIONS_MASK = 0b100000000000000001
@OptIn(ExperimentalUnsignedTypes::class)
override fun ChunkLightDataPacket.encode(dst: ByteBuf) {
dst.writeVarInt(key.x)
dst.writeVarInt(key.z)

View file

@ -12,8 +12,5 @@ import space.uranos.net.packet.OutgoingPacketCodec
object DeclareRecipesPacketCodec : OutgoingPacketCodec<DeclareRecipesPacket>(0x5A, DeclareRecipesPacket::class) {
override fun DeclareRecipesPacket.encode(dst: ByteBuf) {
dst.writeVarInt(recipes.size)
for (recipe in recipes) {
// TODO
}
}
}