Skip to content

Commit

Permalink
Edit Serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
Julian Haag committed Nov 7, 2022
1 parent a812d3b commit 30ff9c7
Show file tree
Hide file tree
Showing 35 changed files with 540 additions and 487 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/gradle-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ jobs:
uses: mikepenz/release-changelog-builder-action@v3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
commitMode: true # remove later when the translation api is finished

- name: Upload a Build Artifact
uses: softprops/action-gh-release@v1
Expand Down
9 changes: 5 additions & 4 deletions src/main/kotlin/io/layercraft/translator/TranslatorAPI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,27 @@ import io.layercraft.translator.packets.Packet
import io.layercraft.translator.packets.PacketDirection
import io.layercraft.translator.packets.PacketSerializer
import io.layercraft.translator.packets.PacketState
import io.layercraft.translator.utils.minecraft

object TranslatorAPI{

fun <T : Packet> decodeFromByteArray(bytes: ByteArray, serializer: PacketSerializer<T>): T {
val packetRead = ByteReadPacket(bytes)
return serializer.serialize(packetRead as Input)
return serializer.serialize(packetRead.minecraft)
}

fun <T : Packet> encodeToByteArray(value: T, serializer: PacketSerializer<T>): ByteArray {
val packetWrite = BytePacketBuilder()

serializer.deserialize(packetWrite as Output, value)
serializer.deserialize(packetWrite.minecraft, value)
return packetWrite.build().readBytes()
}

fun decodeFromInputWithCodec(input: Input, codec: MinecraftCodec, packetDirection: PacketDirection, packetState: PacketState, packetId: Int): Packet? {
return codec.getCodecPacket(packetDirection, packetState, packetId)?.packetSerializer?.serialize(input)
return codec.getCodecPacket(packetDirection, packetState, packetId)?.packetSerializer?.serialize(input.minecraft)
}

fun encodeToOutputWithCodec(value: Packet, codec: MinecraftCodec, output: Output) {
codec.getCodecPacketFromPacket(value)?.packetSerializer!!.deserialize(output, value)
codec.getCodecPacketFromPacket(value)?.packetSerializer!!.deserialize(output.minecraft, value)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package io.layercraft.translator.packets

import io.ktor.utils.io.core.*
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.MinecraftByteInput
import io.layercraft.translator.utils.MinecraftByteOutput


interface Packet{
Expand All @@ -17,10 +21,10 @@ interface ClientBoundPacket: Packet {
}


interface PacketSerializer<T> where T: Packet {
fun serialize(input: Input): T
interface PacketSerializer<T> where T:Packet {
fun serialize(input: MinecraftProtocolDeserializeInterface<*>): T

fun deserialize(output: Output, value: T)
fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: T)
}

@Target(AnnotationTarget.CLASS)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import io.ktor.utils.io.core.*
import io.layercraft.translator.data.ProtocolVersion
import io.layercraft.translator.packets.*
import io.layercraft.translator.packets.handshake.data.HandshakeNextState
import io.layercraft.translator.utils.mc
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.minecraft


/**
Expand All @@ -27,21 +29,21 @@ data class Handshake(
) : ServerBoundPacket {
companion object: PacketSerializer<Handshake> {

override fun serialize(input: Input): Handshake {
val version = input.mc.readVarInt()
val address = input.mc.readString(255)
val port = input.mc.readUShort()
val nextState = HandshakeNextState.values()[input.mc.readVarInt() - 1]
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): Handshake {
val version = input.readVarInt()
val address = input.readString(255)
val port = input.readUShort()
val nextState = HandshakeNextState.values()[input.readVarInt() - 1]


return Handshake(ProtocolVersion.fromProtocolNumber(version), address, port, nextState)
}

override fun deserialize(output: Output, value: Handshake) {
output.mc.writeVarInt(value.protocolVersion.protocolNumber)
output.mc.writeString(value.address, 255)
output.mc.writeUShort(value.port)
output.mc.writeVarInt(value.nextState.ordinal + 1)
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: Handshake) {
output.writeVarInt(value.protocolVersion.protocolNumber)
output.writeString(value.address, 255)
output.writeUShort(value.port)
output.writeVarInt(value.nextState.ordinal + 1)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package io.layercraft.translator.packets.handshake.serverbound
import io.ktor.utils.io.core.*
import io.layercraft.translator.data.ProtocolVersion
import io.layercraft.translator.packets.*
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface

@MinecraftPacket(packetId = 0xFE, state = PacketState.HANDSHAKE, direction = PacketDirection.SERVERBOUND)
data class LegacyServerListPing(
Expand All @@ -12,11 +14,11 @@ data class LegacyServerListPing(
): ServerBoundPacket {
companion object: PacketSerializer<LegacyServerListPing> {

override fun serialize(input: Input): LegacyServerListPing {
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): LegacyServerListPing {
TODO("Not yet implemented")
}

override fun deserialize(output: Output, value: LegacyServerListPing) {
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: LegacyServerListPing) {
TODO("Not yet implemented")
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package io.layercraft.translator.packets.login.clientbound

import io.ktor.utils.io.core.*
import io.layercraft.translator.packets.*
import io.layercraft.translator.utils.mc
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.minecraft


/**
Expand All @@ -17,14 +19,14 @@ data class Disconnect(
): ClientBoundPacket {
companion object : PacketSerializer<Disconnect>{

override fun serialize(input: Input): Disconnect {
val reason = input.mc.readChat()
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): Disconnect {
val reason = input.readChat()

return Disconnect(reason)
}

override fun deserialize(output: Output, value: Disconnect) {
output.mc.writeChat(value.reason)
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: Disconnect) {
output.writeChat(value.reason)
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package io.layercraft.translator.packets.login.clientbound

import io.ktor.utils.io.core.*
import io.layercraft.translator.packets.*
import io.layercraft.translator.utils.mc
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.minecraft

/**
* Encryption request | 0x01 | login | client-bound
Expand All @@ -21,18 +23,18 @@ data class EncryptionRequest(
): ClientBoundPacket {
companion object: PacketSerializer<EncryptionRequest> {

override fun serialize(input: Input): EncryptionRequest {
val serverId = input.mc.readString(20)
val publicKey = input.mc.readVarIntByteArray()
val verifyToken = input.mc.readVarIntByteArray()
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): EncryptionRequest {
val serverId = input.readString(20)
val publicKey = input.readVarIntByteArray()
val verifyToken = input.readVarIntByteArray()

return EncryptionRequest(serverId, publicKey, verifyToken)
}

override fun deserialize(output: Output, value: EncryptionRequest) {
output.mc.writeString(value.serverId, 20)
output.mc.writeVarIntByteArray(value.publicKey)
output.mc.writeVarIntByteArray(value.verifyToken)
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: EncryptionRequest) {
output.writeString(value.serverId, 20)
output.writeVarIntByteArray(value.publicKey)
output.writeVarIntByteArray(value.verifyToken)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package io.layercraft.translator.packets.login.clientbound

import io.ktor.utils.io.core.*
import io.layercraft.translator.packets.*
import io.layercraft.translator.utils.mc
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.minecraft

/**
* Login plugin request | 0x04 | login | client-bound
Expand All @@ -20,18 +22,18 @@ data class LoginPluginRequest(
): ClientBoundPacket {
companion object: PacketSerializer<LoginPluginRequest> {

override fun serialize(input: Input): LoginPluginRequest {
val messageId = input.mc.readVarInt()
val channel = input.mc.readIdentifier()
val data = input.mc.readRemainingByteArray()
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): LoginPluginRequest {
val messageId = input.readVarInt()
val channel = input.readIdentifier()
val data = input.readRemainingByteArray()

return LoginPluginRequest(messageId, channel, data)
}

override fun deserialize(output: Output, value: LoginPluginRequest) {
output.mc.writeVarInt(value.messageId)
output.mc.writeIdentifier(value.channel)
output.mc.writeRemainingByteArray(value.data)
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: LoginPluginRequest) {
output.writeVarInt(value.messageId)
output.writeIdentifier(value.channel)
output.writeRemainingByteArray(value.data)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package io.layercraft.translator.packets.login.clientbound

import io.ktor.utils.io.core.*
import io.layercraft.translator.packets.*
import io.layercraft.translator.utils.mc
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.minecraft
import java.util.*

/**
Expand All @@ -20,27 +22,27 @@ data class LoginSuccess(
val properties: List<LoginProperty>, //varint array of login properties
): ClientBoundPacket {
companion object: PacketSerializer<LoginSuccess> {
override fun serialize(input: Input): LoginSuccess {
val uuid = input.mc.readUUID()
val username = input.mc.readString(16)
val properties = input.mc.readVarIntArray {
val name = it.mc.readString(32767)
val value = it.mc.readString(32767)
val isSigned = it.mc.readBoolean()
val signature = if (isSigned) it.mc.readString(32767) else null
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): LoginSuccess {
val uuid = input.readUUID()
val username = input.readString(16)
val properties = input.readVarIntArray {
val name = it.readString(32767)
val value = it.readString(32767)
val isSigned = it.readBoolean()
val signature = if (isSigned) it.readString(32767) else null
LoginProperty(name, value, signature)
}
return LoginSuccess(uuid, username, properties)
}

override fun deserialize(output: Output, value: LoginSuccess) {
output.mc.writeUUID(value.uuid)
output.mc.writeString(value.username, 16)
output.mc.writeVarIntArray(value.properties) { arrayValue, arrayOutput ->
arrayOutput.mc.writeString(arrayValue.name, 32767)
arrayOutput.mc.writeString(arrayValue.value, 32767)
arrayOutput.mc.writeBoolean(arrayValue.signed)
if (arrayValue.signed) arrayOutput.mc.writeString(arrayValue.signature!!, 32767)
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: LoginSuccess) {
output.writeUUID(value.uuid)
output.writeString(value.username, 16)
output.writeVarIntArray(value.properties) { arrayValue, arrayOutput ->
arrayOutput.writeString(arrayValue.name, 32767)
arrayOutput.writeString(arrayValue.value, 32767)
arrayOutput.writeBoolean(arrayValue.signed)
if (arrayValue.signed) arrayOutput.writeString(arrayValue.signature!!, 32767)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package io.layercraft.translator.packets.login.clientbound

import io.ktor.utils.io.core.*
import io.layercraft.translator.packets.*
import io.layercraft.translator.utils.mc
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.minecraft

/**
* (Optional) Set compression | 0x03 | login | client-bound
Expand All @@ -17,14 +19,14 @@ data class SetCompression(

companion object: PacketSerializer<SetCompression> {

override fun serialize(input: Input): SetCompression {
val threshold = input.mc.readVarInt()
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): SetCompression {
val threshold = input.readVarInt()

return SetCompression(threshold)
}

override fun deserialize(output: Output, value: SetCompression) {
output.mc.writeVarInt(value.threshold)
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: SetCompression) {
output.writeVarInt(value.threshold)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package io.layercraft.translator.packets.login.serverbound

import io.ktor.utils.io.core.*
import io.layercraft.translator.packets.*
import io.layercraft.translator.utils.mc
import io.layercraft.translator.serialization.MinecraftProtocolDeserializeInterface
import io.layercraft.translator.serialization.MinecraftProtocolSerializeInterface
import io.layercraft.translator.utils.minecraft


/**
Expand All @@ -26,28 +28,28 @@ data class EncryptionResponse(
) : ServerBoundPacket {
companion object: PacketSerializer<EncryptionResponse> {

override fun serialize(input: Input): EncryptionResponse {
val sharedSecret = input.mc.readVarIntByteArray()
val hasVerifyToken = input.mc.readBoolean()
override fun serialize(input: MinecraftProtocolDeserializeInterface<*>): EncryptionResponse {
val sharedSecret = input.readVarIntByteArray()
val hasVerifyToken = input.readBoolean()
return if (hasVerifyToken) {
val verifyToken = input.mc.readVarIntByteArray()
val verifyToken = input.readVarIntByteArray()
EncryptionResponse(sharedSecret, true, verifyToken, null, null)
} else {
val salt = input.mc.readLong()
val messageSignature = input.mc.readVarIntByteArray()
val salt = input.readLong()
val messageSignature = input.readVarIntByteArray()
EncryptionResponse(sharedSecret, false, null, salt, messageSignature)
}
}

override fun deserialize(output: Output, value: EncryptionResponse) {
output.mc.writeVarIntByteArray(value.sharedSecret)
output.mc.writeBoolean(value.hasVerifyToken)
override fun deserialize(output: MinecraftProtocolSerializeInterface<*>, value: EncryptionResponse) {
output.writeVarIntByteArray(value.sharedSecret)
output.writeBoolean(value.hasVerifyToken)
if (value.hasVerifyToken) {
output.mc.writeVarIntByteArray(value.verifyToken!!)
output.writeVarIntByteArray(value.verifyToken!!)
}
if (!value.hasVerifyToken) {
output.mc.writeLong(value.salt!!)
output.mc.writeVarIntByteArray(value.messageSignature!!)
output.writeLong(value.salt!!)
output.writeVarIntByteArray(value.messageSignature!!)
}
}
}
Expand Down
Loading

0 comments on commit 30ff9c7

Please sign in to comment.