forked from openrs2/openrs2
Signed-off-by: Graham <gpe@openrs2.org>
parent
21cf2526c5
commit
849b083400
@ -0,0 +1,28 @@ |
||||
plugins { |
||||
`maven-publish` |
||||
kotlin("jvm") |
||||
} |
||||
|
||||
dependencies { |
||||
api(projects.cache) |
||||
|
||||
implementation(projects.buffer) |
||||
implementation(projects.util) |
||||
} |
||||
|
||||
publishing { |
||||
publications.create<MavenPublication>("maven") { |
||||
from(components["java"]) |
||||
|
||||
pom { |
||||
packaging = "jar" |
||||
name.set("OpenRS2 Cache (Build 550)") |
||||
description.set( |
||||
""" |
||||
A library for encoding and decoding files contained within the |
||||
RuneScape cache. It is only compatible with build 550. |
||||
""".trimIndent() |
||||
) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,100 @@ |
||||
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) |
||||
} |
||||
} |
@ -0,0 +1,15 @@ |
||||
package org.openrs2.cache.config.enum |
||||
|
||||
import org.openrs2.cache.Cache |
||||
import org.openrs2.cache.Js5Archive |
||||
import org.openrs2.cache.config.ArchiveConfigTypeList |
||||
|
||||
public class EnumTypeList(cache: Cache) : ArchiveConfigTypeList<EnumType>( |
||||
cache, |
||||
archive = Js5Archive.CONFIG_ENUM, |
||||
fileBits = 8 |
||||
) { |
||||
override fun allocate(id: Int): EnumType { |
||||
return EnumType(id) |
||||
} |
||||
} |
@ -0,0 +1,42 @@ |
||||
package org.openrs2.cache.config.param |
||||
|
||||
import io.netty.buffer.ByteBuf |
||||
import org.openrs2.buffer.readString |
||||
import org.openrs2.buffer.writeString |
||||
import org.openrs2.cache.config.ConfigType |
||||
import org.openrs2.util.charset.Cp1252Charset |
||||
|
||||
public class ParamType(id: Int) : ConfigType(id) { |
||||
public var type: Char = 0.toChar() |
||||
public var defaultInt: Int = 0 |
||||
public var defaultString: String? = null |
||||
|
||||
override fun read(buf: ByteBuf, code: Int) { |
||||
when (code) { |
||||
1 -> type = Cp1252Charset.decode(buf.readByte()) |
||||
2 -> defaultInt = buf.readInt() |
||||
5 -> defaultString = buf.readString() |
||||
else -> throw IllegalArgumentException("Unsupported config code: $code") |
||||
} |
||||
} |
||||
|
||||
override fun write(buf: ByteBuf) { |
||||
if (type.code != 0) { |
||||
buf.writeByte(1) |
||||
buf.writeByte(Cp1252Charset.encode(type).toInt()) |
||||
} |
||||
|
||||
if (defaultInt != 0) { |
||||
buf.writeByte(2) |
||||
buf.writeInt(defaultInt) |
||||
} |
||||
|
||||
val defaultString = defaultString |
||||
if (defaultString != null) { |
||||
buf.writeByte(5) |
||||
buf.writeString(defaultString) |
||||
} |
||||
|
||||
buf.writeByte(0) |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
package org.openrs2.cache.config.param |
||||
|
||||
import org.openrs2.cache.Cache |
||||
import org.openrs2.cache.Js5Archive |
||||
import org.openrs2.cache.Js5ConfigGroup |
||||
import org.openrs2.cache.config.GroupConfigTypeList |
||||
|
||||
public class ParamTypeList(cache: Cache) : GroupConfigTypeList<ParamType>( |
||||
cache, |
||||
archive = Js5Archive.CONFIG, |
||||
group = Js5ConfigGroup.PARAMTYPE |
||||
) { |
||||
override fun allocate(id: Int): ParamType { |
||||
return ParamType(id) |
||||
} |
||||
} |
@ -0,0 +1,57 @@ |
||||
package org.openrs2.cache.config.struct |
||||
|
||||
import io.netty.buffer.ByteBuf |
||||
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 |
||||
|
||||
public class StructType(id: Int) : ConfigType(id) { |
||||
// TODO(gpe): methods for manipulating the map |
||||
private val params: Int2ObjectMap<Any> = Int2ObjectOpenHashMap() |
||||
|
||||
override fun read(buf: ByteBuf, code: Int) { |
||||
when (code) { |
||||
249 -> { |
||||
val size = buf.readUnsignedByte().toInt() |
||||
for (i in 0 until size) { |
||||
val string = buf.readBoolean() |
||||
val id = buf.readUnsignedMedium() |
||||
|
||||
if (string) { |
||||
params[id] = buf.readString() |
||||
} else { |
||||
params[id] = buf.readInt() |
||||
} |
||||
} |
||||
} |
||||
else -> throw IllegalArgumentException("Unsupported config code: $code") |
||||
} |
||||
} |
||||
|
||||
override fun write(buf: ByteBuf) { |
||||
if (params.isNotEmpty()) { |
||||
buf.writeByte(249) |
||||
buf.writeByte(params.size) |
||||
|
||||
for ((id, value) in params.int2ObjectEntrySet()) { |
||||
when (value) { |
||||
is String -> { |
||||
buf.writeBoolean(true) |
||||
buf.writeMedium(id) |
||||
buf.writeString(value) |
||||
} |
||||
is Int -> { |
||||
buf.writeBoolean(false) |
||||
buf.writeMedium(id) |
||||
buf.writeInt(value) |
||||
} |
||||
else -> throw IllegalStateException() |
||||
} |
||||
} |
||||
} |
||||
|
||||
buf.writeByte(0) |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
package org.openrs2.cache.config.struct |
||||
|
||||
import org.openrs2.cache.Cache |
||||
import org.openrs2.cache.Js5Archive |
||||
import org.openrs2.cache.Js5ConfigGroup |
||||
import org.openrs2.cache.config.GroupConfigTypeList |
||||
|
||||
public class StructTypeList(cache: Cache) : GroupConfigTypeList<StructType>( |
||||
cache, |
||||
archive = Js5Archive.CONFIG, |
||||
group = Js5ConfigGroup.STRUCTTYPE |
||||
) { |
||||
override fun allocate(id: Int): StructType { |
||||
return StructType(id) |
||||
} |
||||
} |
@ -0,0 +1,32 @@ |
||||
package org.openrs2.cache.config.varbit |
||||
|
||||
import io.netty.buffer.ByteBuf |
||||
import org.openrs2.cache.config.ConfigType |
||||
|
||||
public class VarbitType(id: Int) : ConfigType(id) { |
||||
public var baseVar: Int = 0 |
||||
public var startBit: Int = 0 |
||||
public var endBit: Int = 0 |
||||
|
||||
override fun read(buf: ByteBuf, code: Int) { |
||||
when (code) { |
||||
1 -> { |
||||
baseVar = buf.readUnsignedShort() |
||||
startBit = buf.readUnsignedByte().toInt() |
||||
endBit = buf.readUnsignedByte().toInt() |
||||
} |
||||
else -> throw IllegalArgumentException("Unsupported config code: $code") |
||||
} |
||||
} |
||||
|
||||
override fun write(buf: ByteBuf) { |
||||
if (baseVar != 0 || startBit != 0 || endBit != 0) { |
||||
buf.writeByte(1) |
||||
buf.writeShort(baseVar) |
||||
buf.writeByte(startBit) |
||||
buf.writeByte(endBit) |
||||
} |
||||
|
||||
buf.writeByte(0) |
||||
} |
||||
} |
@ -0,0 +1,15 @@ |
||||
package org.openrs2.cache.config.varbit |
||||
|
||||
import org.openrs2.cache.Cache |
||||
import org.openrs2.cache.Js5Archive |
||||
import org.openrs2.cache.config.ArchiveConfigTypeList |
||||
|
||||
public class VarbitTypeList(cache: Cache) : ArchiveConfigTypeList<VarbitType>( |
||||
cache, |
||||
archive = Js5Archive.CONFIG_VAR_BIT, |
||||
fileBits = 10 |
||||
) { |
||||
override fun allocate(id: Int): VarbitType { |
||||
return VarbitType(id) |
||||
} |
||||
} |
@ -0,0 +1,24 @@ |
||||
package org.openrs2.cache.config.varp |
||||
|
||||
import io.netty.buffer.ByteBuf |
||||
import org.openrs2.cache.config.ConfigType |
||||
|
||||
public class VarpType(id: Int) : ConfigType(id) { |
||||
public var clientCode: Int = 0 |
||||
|
||||
override fun read(buf: ByteBuf, code: Int) { |
||||
when (code) { |
||||
5 -> clientCode = buf.readUnsignedShort() |
||||
else -> throw IllegalArgumentException("Unsupported config code: $code") |
||||
} |
||||
} |
||||
|
||||
override fun write(buf: ByteBuf) { |
||||
if (clientCode != 0) { |
||||
buf.writeByte(5) |
||||
buf.writeShort(clientCode) |
||||
} |
||||
|
||||
buf.writeByte(0) |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
package org.openrs2.cache.config.varp |
||||
|
||||
import org.openrs2.cache.Cache |
||||
import org.openrs2.cache.Js5Archive |
||||
import org.openrs2.cache.Js5ConfigGroup |
||||
import org.openrs2.cache.config.GroupConfigTypeList |
||||
|
||||
public class VarpTypeList(cache: Cache) : GroupConfigTypeList<VarpType>( |
||||
cache, |
||||
archive = Js5Archive.CONFIG, |
||||
group = Js5ConfigGroup.VAR_PLAYER |
||||
) { |
||||
override fun allocate(id: Int): VarpType { |
||||
return VarpType(id) |
||||
} |
||||
} |
Loading…
Reference in new issue