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.
openrs2/protocol/build.gradle.kts

28 lines
519 B

plugins {
`maven-publish`
kotlin("jvm")
}
dependencies {
Add initial implementation of the RS framing layer I have spent a while thinking about the best way to implement this, especially after I discovered that OSRS treats the packets sent during the handshake stage as normal packets (see share/doc/protocol/login.md for a longer explanation). I have settled on a design where the same Rs2Decoder and Rs2Encoder instances, which deal with decoding packet opcodes and lengths, will remain the same for the entire connection - unless it switches into a mode where a completely different framing scheme is used, such as JAGGRAB and JS5. Rs2Decoder and Rs2Encoder both support optional opcode encryption. The initial cipher is set to NopStreamCipher. It will be set to an IsaacRandom instance during the login process. As the scrambled opcodes used in-game overlap with the opcodes used during the login process, a class called Protocol is used to represent a set of opcodes that can be used in a particular state. The protocol can be changed at any time. Rs2Decoder sets isSingleDecode to true initially to help do this safely, but once in the final in-game state this can be disabled for performance. Unlike previous servers, like Apollo and ScapeEmulator, intermediate frame objects are not used. Rs2Decoder and Rs2Encoder call PacketCodec to directly translate an inbound ByteBuf into a POJO, or an outbound POJO into a ByteBuf. This saves a memory allocation per packet. PacketCodec implementations must provide both an encode() and a decode() method for every packet. This will ensure the library is usable as both a client and server, allowing the development of tools, such as a JS5 client, a game server stress-tester or even a proxy server for inspecting the flow of packets. PacketCodec implementations may optionally override getLength() to return their exact length, to optimise the size of the ByteBuf passed to the decode() method. (It is not necessary to override getLength() for fixed packets, as the size is already known.) The 256-element packet length array is automatically generated by the Protocol class based on the length attribute of the PacketCodec objects passed to it. This is less error-prone than populating the array manually. However, it does mean stub implementations of every packet packet will need to be provided during development - all lengths must be known in advance to ensure the client and server remain in sync. For the moment, it is legal to throw NotImplementError from a decode() method. Rs2Decoder catches this exception, prints a warning and then proceed to the next packet. Once all packets have been implemented, this code may be removed. Signed-off-by: Graham <gpe@openrs2.org>
3 years ago
api(project(":crypto"))
api(libs.netty.codec)
implementation(project(":buffer"))
}
publishing {
publications.create<MavenPublication>("maven") {
from(components["java"])
pom {
packaging = "jar"
name.set("OpenRS2 Protocol")
description.set(
"""
An implementation of the RuneScape protocol.
""".trimIndent()
)
}
}
}