Open-source multiplayer game server compatible with the RuneScape client
https://www.openrs2.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.3 KiB
112 lines
3.3 KiB
package org.openrs2.cache.config.enum
|
|
|
|
import io.netty.buffer.ByteBuf
|
|
import it.unimi.dsi.fastutil.ints.Int2IntMap
|
|
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap
|
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap
|
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
|
|
import org.openrs2.buffer.readString
|
|
import org.openrs2.buffer.writeString
|
|
import org.openrs2.cache.config.ConfigType
|
|
import org.openrs2.util.charset.Cp1252Charset
|
|
|
|
public class EnumType(id: Int) : ConfigType(id) {
|
|
public var keyType: Char = 0.toChar()
|
|
public var valueType: Char = 0.toChar()
|
|
public var defaultString: String = "null"
|
|
public var defaultInt: Int = 0
|
|
|
|
// TODO(gpe): methods for manipulating the maps
|
|
private var strings: Int2ObjectMap<String>? = null
|
|
private var ints: Int2IntMap? = null
|
|
|
|
override fun read(buf: ByteBuf, code: Int) {
|
|
when (code) {
|
|
1 -> keyType = Cp1252Charset.decode(buf.readByte())
|
|
2 -> valueType = Cp1252Charset.decode(buf.readByte())
|
|
3 -> defaultString = buf.readString()
|
|
4 -> defaultInt = buf.readInt()
|
|
5 -> {
|
|
val size = buf.readUnsignedShort()
|
|
val strings = Int2ObjectOpenHashMap<String>()
|
|
|
|
for (i in 0 until size) {
|
|
val key = buf.readInt()
|
|
strings[key] = buf.readString()
|
|
}
|
|
|
|
this.strings = strings
|
|
}
|
|
|
|
6 -> {
|
|
val size = buf.readUnsignedShort()
|
|
val ints = Int2IntOpenHashMap()
|
|
|
|
for (i in 0 until size) {
|
|
val key = buf.readInt()
|
|
ints[key] = buf.readInt()
|
|
}
|
|
|
|
this.ints = ints
|
|
}
|
|
|
|
else -> throw IllegalArgumentException("Unsupported config code: $code")
|
|
}
|
|
}
|
|
|
|
override fun write(buf: ByteBuf) {
|
|
if (keyType.code != 0) {
|
|
buf.writeByte(1)
|
|
buf.writeByte(Cp1252Charset.encode(keyType).toInt())
|
|
}
|
|
|
|
if (valueType.code != 0) {
|
|
buf.writeByte(2)
|
|
buf.writeByte(Cp1252Charset.encode(valueType).toInt())
|
|
}
|
|
|
|
if (defaultString != "null") {
|
|
buf.writeByte(3)
|
|
buf.writeString(defaultString)
|
|
}
|
|
|
|
if (defaultInt != 0) {
|
|
buf.writeByte(4)
|
|
buf.writeInt(defaultInt)
|
|
}
|
|
|
|
val strings = strings
|
|
if (strings != null && strings.isNotEmpty()) {
|
|
buf.writeByte(5)
|
|
buf.writeShort(strings.size)
|
|
|
|
for ((key, value) in strings.int2ObjectEntrySet()) {
|
|
buf.writeInt(key)
|
|
buf.writeString(value)
|
|
}
|
|
}
|
|
|
|
val ints = ints
|
|
if (ints != null && ints.isNotEmpty()) {
|
|
buf.writeByte(6)
|
|
buf.writeShort(ints.size)
|
|
|
|
for ((key, value) in ints.int2IntEntrySet()) {
|
|
buf.writeInt(key)
|
|
buf.writeInt(value)
|
|
}
|
|
}
|
|
|
|
buf.writeByte(0)
|
|
}
|
|
|
|
public fun getString(key: Int): String {
|
|
val strings = strings ?: return defaultString
|
|
return strings.getOrDefault(key, defaultString)
|
|
}
|
|
|
|
public fun getInt(key: Int): Int {
|
|
val ints = ints ?: return defaultInt
|
|
return ints.getOrDefault(key, defaultInt)
|
|
}
|
|
}
|
|
|