Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions protocol/osrs-238/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
dependencies {
implementation(platform(rootProject.libs.netty.bom))
implementation(rootProject.libs.netty.buffer)
implementation(rootProject.libs.netty.transport)
implementation(rootProject.libs.netty.handler)
implementation(rootProject.libs.rsprot.buffer)
implementation(rootProject.libs.rsprot.compression)
implementation(rootProject.libs.rsprot.protocol)
implementation(rootProject.libs.rsprot.crypto)
implementation(platform(rootProject.libs.log4j.bom))
implementation(rootProject.libs.bundles.log4j)
implementation(projects.protocol)
implementation(projects.cache.cacheApi)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package net.rsprox.protocol.v238

import net.rsprot.buffer.JagByteBuf
import net.rsprot.compression.HuffmanCodec
import net.rsprot.protocol.message.IncomingMessage
import net.rsprox.protocol.ClientPacketDecoder
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.ClientMessageDecoderRepository

public class ClientPacketDecoderServiceV238(
huffmanCodec: HuffmanCodec,
) : ClientPacketDecoder {
@OptIn(ExperimentalStdlibApi::class)
private val repository = ClientMessageDecoderRepository.build(huffmanCodec)

override fun decode(
opcode: Int,
payload: JagByteBuf,
session: Session,
): IncomingMessage {
return repository
.getDecoder(opcode)
.decode(payload, session)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.rsprox.protocol.v238

import net.rsprox.protocol.ProtProvider
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt
import kotlin.enums.EnumEntries

public data object GameClientProtProviderV238 : ProtProvider<GameClientProt> {
override fun get(opcode: Int): GameClientProt {
return GameClientProt.entries.firstOrNull { it.opcode == opcode }
?: throw IllegalArgumentException("Unknown game client prot: $opcode")
}

override fun allProts(): EnumEntries<GameClientProt> {
return GameClientProt.entries
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.rsprox.protocol.v238

import net.rsprox.protocol.ProtProvider
import net.rsprox.protocol.v238.game.outgoing.decoder.prot.GameServerProt
import kotlin.enums.EnumEntries

public data object GameServerProtProviderV238 : ProtProvider<GameServerProt> {
override fun get(opcode: Int): GameServerProt {
return GameServerProt.entries.firstOrNull { it.opcode == opcode }
?: throw IllegalArgumentException("Unknown game server prot: $opcode")
}

override fun allProts(): EnumEntries<GameServerProt> {
return GameServerProt.entries
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.rsprox.protocol.v238

import net.rsprot.buffer.JagByteBuf
import net.rsprot.compression.HuffmanCodec
import net.rsprot.protocol.message.IncomingMessage
import net.rsprox.cache.api.CacheProvider
import net.rsprox.protocol.ServerPacketDecoder
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.outgoing.decoder.prot.ServerMessageDecoderRepository

public class ServerPacketDecoderServiceV238(
huffmanCodec: HuffmanCodec,
cache: CacheProvider,
) : ServerPacketDecoder {
@OptIn(ExperimentalStdlibApi::class)
private val repository =
ServerMessageDecoderRepository.build(
huffmanCodec,
cache,
)

override fun decode(
opcode: Int,
payload: JagByteBuf,
session: Session,
): IncomingMessage {
return repository
.getDecoder(opcode)
.decode(payload, session)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.buttons

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.metadata.Consistent
import net.rsprot.protocol.util.gCombinedId
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.buttons.If1Button
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

@Consistent
public class If1ButtonDecoder : ProxyMessageDecoder<If1Button> {
override val prot: ClientProt = GameClientProt.IF_BUTTON

override fun decode(
buffer: JagByteBuf,
session: Session,
): If1Button {
val combinedId = buffer.gCombinedId()
return If1Button(combinedId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.buttons

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.util.gCombinedId
import net.rsprot.protocol.util.gCombinedIdAlt3
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.buttons.IfButtonD
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

public class IfButtonDDecoder : ProxyMessageDecoder<IfButtonD> {
override val prot: ClientProt = GameClientProt.IF_BUTTOND

override fun decode(
buffer: JagByteBuf,
session: Session,
): IfButtonD {
val selectedCombinedId = buffer.gCombinedIdAlt3()
val selectedSub = buffer.g2Alt1()
val targetCombinedId = buffer.gCombinedId()
val selectedObj = buffer.g2Alt1()
val targetObj = buffer.g2Alt3()
val targetSub = buffer.g2Alt2()
return IfButtonD(
selectedCombinedId,
selectedSub,
selectedObj,
targetCombinedId,
targetSub,
targetObj,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.buttons

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.util.gCombinedId
import net.rsprot.protocol.util.gCombinedIdAlt2
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.buttons.IfButtonT
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

public class IfButtonTDecoder : ProxyMessageDecoder<IfButtonT> {
override val prot: ClientProt = GameClientProt.IF_BUTTONT

override fun decode(
buffer: JagByteBuf,
session: Session,
): IfButtonT {
val targetCombinedId = buffer.gCombinedId()
val selectedSub = buffer.g2Alt2()
val selectedObj = buffer.g2Alt3()
val selectedCombinedId = buffer.gCombinedIdAlt2()
val targetSub = buffer.g2()
val targetObj = buffer.g2Alt3()
return IfButtonT(
selectedCombinedId,
selectedSub,
selectedObj,
targetCombinedId,
targetSub,
targetObj,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.buttons

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.metadata.Consistent
import net.rsprot.protocol.util.gCombinedId
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.buttons.If3Button
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

@Consistent
public class IfButtonXDecoder : ProxyMessageDecoder<If3Button> {
override val prot: ClientProt = GameClientProt.IF_BUTTONX

override fun decode(
buffer: JagByteBuf,
session: Session,
): If3Button {
val combinedId = buffer.gCombinedId()
val sub = buffer.g2()
val obj = buffer.g2()
val op = buffer.g1()
return If3Button(
combinedId,
sub,
obj,
op,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.buttons

import net.rsprot.buffer.JagByteBuf
import net.rsprot.buffer.extensions.toByteArray
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.util.gCombinedIdAlt2
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.buttons.IfScriptTrigger
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

public class IfScriptTriggerDecoder : ProxyMessageDecoder<IfScriptTrigger> {
override val prot: ClientProt = GameClientProt.IF_SCRIPT_TRIGGER

override fun decode(
buffer: JagByteBuf,
session: Session,
): IfScriptTrigger {
// Function is method(int combinedId, int sub, int obj, int crc, Object[] args)
val sub = buffer.g2Alt3()
val obj = buffer.g2Alt2()
val combinedId = buffer.gCombinedIdAlt2()
val crc = buffer.g4Alt2()
val bytes = buffer.buffer.toByteArray()
return IfScriptTrigger(
combinedId,
sub,
obj,
crc,
bytes,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.buttons

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.metadata.Consistent
import net.rsprot.protocol.util.gCombinedId
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.buttons.IfSubOp
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

@Consistent
public class IfSubOpDecoder : ProxyMessageDecoder<IfSubOp> {
override val prot: ClientProt = GameClientProt.IF_SUBOP

override fun decode(
buffer: JagByteBuf,
session: Session,
): IfSubOp {
val combinedId = buffer.gCombinedId()
val sub = buffer.g2()
val obj = buffer.g2()
val op = buffer.g1()
val subop = buffer.g1()
return IfSubOp(
combinedId,
sub,
obj,
op,
subop,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.clan

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.metadata.Consistent
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.clan.AffinedClanSettingsAddBannedFromChannel
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

@Consistent
public class AffinedClanSettingsAddBannedFromChannelDecoder :
ProxyMessageDecoder<AffinedClanSettingsAddBannedFromChannel> {
override val prot: ClientProt = GameClientProt.AFFINEDCLANSETTINGS_ADDBANNED_FROMCHANNEL

override fun decode(
buffer: JagByteBuf,
session: Session,
): AffinedClanSettingsAddBannedFromChannel {
val clanId = buffer.g1()
val memberIndex = buffer.g2()
val name = buffer.gjstr()
return AffinedClanSettingsAddBannedFromChannel(
name,
clanId,
memberIndex,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.clan

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.metadata.Consistent
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.clan.AffinedClanSettingsSetMutedFromChannel
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

@Consistent
public class AffinedClanSettingsSetMutedFromChannelDecoder :
ProxyMessageDecoder<AffinedClanSettingsSetMutedFromChannel> {
override val prot: ClientProt = GameClientProt.AFFINEDCLANSETTINGS_SETMUTED_FROMCHANNEL

override fun decode(
buffer: JagByteBuf,
session: Session,
): AffinedClanSettingsSetMutedFromChannel {
val clanId = buffer.g1()
val memberIndex = buffer.g2()
val muted = buffer.g1() == 1
val name = buffer.gjstr()
return AffinedClanSettingsSetMutedFromChannel(
name,
clanId,
memberIndex,
muted,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package net.rsprox.protocol.v238.game.incoming.decoder.codec.clan

import net.rsprot.buffer.JagByteBuf
import net.rsprot.protocol.ClientProt
import net.rsprot.protocol.metadata.Consistent
import net.rsprox.protocol.ProxyMessageDecoder
import net.rsprox.protocol.game.incoming.model.clan.ClanChannelFullRequest
import net.rsprox.protocol.session.Session
import net.rsprox.protocol.v238.game.incoming.decoder.prot.GameClientProt

@Consistent
public class ClanChannelFullRequestDecoder : ProxyMessageDecoder<ClanChannelFullRequest> {
override val prot: ClientProt = GameClientProt.CLANCHANNEL_FULL_REQUEST

override fun decode(
buffer: JagByteBuf,
session: Session,
): ClanChannelFullRequest {
val clanId = buffer.g1s()
return ClanChannelFullRequest(clanId)
}
}
Loading
Loading