Skip to content

Commit

Permalink
network: 23w40a
Browse files Browse the repository at this point in the history
New game state: `receive_chunks`, json chat was replaced with nbt on network
  • Loading branch information
Bixilon committed Oct 7, 2023
1 parent 6955fae commit d143b98
Show file tree
Hide file tree
Showing 25 changed files with 97 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import de.bixilon.kutil.json.JsonObject
import de.bixilon.kutil.uuid.UUIDUtil.toUUID
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.protocol.protocol.buffers.InByteBuffer
import de.bixilon.minosoft.protocol.protocol.buffers.OutByteBuffer
import de.bixilon.minosoft.util.KUtil.toResourceLocation
import de.bixilon.minosoft.util.json.Jackson
import java.util.*
Expand Down Expand Up @@ -48,7 +50,10 @@ data class EntityHoverEvent(
type = it.toResourceLocation()
}

return EntityHoverEvent(json["id"].toString().toUUID(), type, ChatComponent.of(json["name"]))
val rawUUID = json["id"]
val uuid = if (rawUUID is IntArray) InByteBuffer(OutByteBuffer().apply { writeBareIntArray(rawUUID) }.toArray()).readUUID() else rawUUID.toString().toUUID()

return EntityHoverEvent(uuid, type, ChatComponent.of(json["name"]))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType

class KickS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val reason: ChatComponent = buffer.readChatComponent()
val reason: ChatComponent = if (buffer.connection.network.state == ProtocolStates.LOGIN) buffer.readChatComponent() else buffer.readNbtChatComponent()

override fun handle(connection: PlayConnection) {
if (!connection.network.connected) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class ResourcepackS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {

init {
if (buffer.versionId >= ProtocolVersions.V_21W15A) {
promptText = buffer.readOptional { buffer.readChatComponent() }
promptText = buffer.readOptional { buffer.readNbtChatComponent() }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType

class PlayStatusS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val motd = if (buffer.versionId >= ProtocolVersions.V_23W07A) buffer.readChatComponent() else buffer.readOptional { buffer.readChatComponent() }
val motd = if (buffer.versionId >= ProtocolVersions.V_23W07A) buffer.readNbtChatComponent() else buffer.readOptional { buffer.readNbtChatComponent() }
val favicon = if (buffer.versionId >= ProtocolVersions.V_23W07A) buffer.readOptional { buffer.readByteArray() } else buffer.readOptional { buffer.readString().toFavicon() }
val previewsChat = if (buffer.versionId < ProtocolVersions.V_22W42A) buffer.readBoolean() else false
val forcesSecureChat = if (buffer.versionId >= ProtocolVersions.V_1_19_1_RC2) buffer.readBoolean() else null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@ import de.bixilon.minosoft.data.bossbar.BossbarFlags
import de.bixilon.minosoft.data.bossbar.BossbarNotches
import de.bixilon.minosoft.modding.event.events.bossbar.BossbarAddEvent
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.protocol.buffers.InByteBuffer
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import java.util.*

class AddBossbarS2CP(
val uuid: UUID,
buffer: InByteBuffer,
buffer: PlayInByteBuffer,
) : BossbarS2CP {
val title = buffer.readChatComponent()
val title = buffer.readNbtChatComponent()
val value = buffer.readFloat()
val color = BossbarColors[buffer.readVarInt()]
val notches = BossbarNotches[buffer.readVarInt()]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar

import de.bixilon.minosoft.modding.event.events.bossbar.BossbarTitleSetEvent
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.protocol.buffers.InByteBuffer
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import java.util.*

class TitleBossbarS2CP(
val uuid: UUID,
buffer: InByteBuffer,
buffer: PlayInByteBuffer,
) : BossbarS2CP {
val title = buffer.readChatComponent()
val title = buffer.readNbtChatComponent()

override fun handle(connection: PlayConnection) {
val bossbar = connection.bossbarManager.bossbars[uuid] ?: return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import de.bixilon.minosoft.util.logging.LogMessageType
import java.util.*

class ChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val text: ChatComponent = buffer.readChatComponent()
val text: ChatComponent = buffer.readNbtChatComponent()
var type: ChatMessageType = buffer.connection.registries.messageType[DefaultMessageTypes.CHAT]!!
private set
var sender: UUID? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,15 @@ class SignedChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {

val message = readChatComponent().message
if (versionId >= ProtocolVersions.V_1_19_1_PRE5 && versionId < ProtocolVersions.V_22W42A) {
readOptional { readChatComponent() } // formatted text
readOptional { readNbtChatComponent() } // formatted text
}

val sent = readInstant()
val salt = readLong()
val lastSeen = readArray { if (versionId >= ProtocolVersions.V_22W42A) readIndexedLastSeenMessage() else readLastSeenMessage() }

parameters[ChatParameter.CONTENT] = TextComponent(message)
val unsigned = readOptional { readChatComponent() }
val unsigned = readOptional { readNbtChatComponent() }
var filter: Filter? = null
if (versionId >= ProtocolVersions.V_1_19_1_RC3) {
filter = ChatFilter[readVarInt()].reader.invoke(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType

class UnsignedChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val text: ChatComponent = buffer.readChatComponent()
val text: ChatComponent = buffer.readNbtChatComponent()
val type = buffer.readRegistryItem(buffer.connection.registries.messageType)
val parameters: Map<ChatParameter, ChatComponent> = mutableMapOf<ChatParameter, ChatComponent>().apply {
buffer.readChatMessageParameters(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import de.bixilon.minosoft.util.logging.LogMessageType
class KillCombatEventS2CP(buffer: PlayInByteBuffer) : CombatEventS2CP {
val deadEntityId = buffer.readVarInt()
val killerEntityId = if (buffer.versionId >= V_1_20_PRE3) -1 else buffer.readInt()
val message = buffer.readChatComponent()
val message = buffer.readNbtChatComponent()

override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_IN, level = LogLevels.VERBOSE) { "Combat event kill (deadEntityId=$deadEntityId, killerEntityId=$killerEntityId, message=$message )" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class OpenContainerS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
buffer.versionId < V_1_14 -> buffer.readLegacyRegistryItem(buffer.connection.registries.containerType)!! // TODO: version completely guessed
else -> buffer.readRegistryItem(buffer.connection.registries.containerType)
}
val title: ChatComponent = buffer.readChatComponent()
val title: ChatComponent = buffer.readNbtChatComponent()
val slotCount: Int = if (buffer.versionId <= V_19W02A) buffer.readUnsignedByte() else 0 // ToDo: This is completely guessed, it is not present in 1.16.5 (unchecked)
val hasTitle: Boolean = if (buffer.versionId > V_14W03B && buffer.versionId <= V_1_8_9) buffer.readBoolean() else true // TODO: upper version (1.8) is probably worng. it changed between 1.7.10..1.8
var entityId: Int? = if ((buffer.versionId >= V_19W02A && containerType.identifier == DefaultInventoryTypes.HORSE) || buffer.versionId < V_14W03B) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class CreateObjectiveS2CP(

init {
if (buffer.versionId >= ProtocolVersions.V_14W04A) { // ToDo
this._displayName = buffer.readChatComponent()
this._displayName = buffer.readNbtChatComponent()
}
if (buffer.versionId >= ProtocolVersions.V_14W08A) {
when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ object ObjectiveS2CF : PlayPacketFactory {
override fun create(buffer: PlayInByteBuffer): ObjectiveS2CP {
val objective = buffer.readString()
val displayName = if (buffer.versionId < ProtocolVersions.V_14W04A) { // ToDo
buffer.readChatComponent()
buffer.readNbtChatComponent()
} else {
null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class UpdateObjectiveS2CP(

init {
if (buffer.versionId >= ProtocolVersions.V_14W04A) { // ToDo
this._displayName = buffer.readChatComponent()
this._displayName = buffer.readNbtChatComponent()
}
if (buffer.versionId >= ProtocolVersions.V_14W08A) {
when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class CreateTeamS2CP(
val name: String,
buffer: PlayInByteBuffer,
) : TeamsS2CP {
val displayName = buffer.readChatComponent()
val displayName = buffer.readNbtChatComponent()
lateinit var prefix: ChatComponent
private set
lateinit var suffix: ChatComponent
Expand All @@ -53,8 +53,8 @@ class CreateTeamS2CP(

init {
if (buffer.versionId < ProtocolVersions.V_18W01A) {
this.prefix = buffer.readChatComponent()
this.suffix = buffer.readChatComponent()
this.prefix = buffer.readNbtChatComponent()
this.suffix = buffer.readNbtChatComponent()
}

if (buffer.versionId < ProtocolVersions.V_16W06A) { // ToDo
Expand All @@ -79,8 +79,8 @@ class CreateTeamS2CP(
}

if (buffer.versionId >= ProtocolVersions.V_18W20A) {
prefix = buffer.readChatComponent()
suffix = buffer.readChatComponent()
prefix = buffer.readNbtChatComponent()
suffix = buffer.readNbtChatComponent()
}

members = buffer.readArray(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType

class TabListTextS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val header: ChatComponent = buffer.readChatComponent()
val footer: ChatComponent = buffer.readChatComponent()
val header: ChatComponent = buffer.readNbtChatComponent()
val footer: ChatComponent = buffer.readNbtChatComponent()

override fun handle(connection: PlayConnection) {
connection.tabList.header = header
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType

class HotbarTextS2CP(buffer: PlayInByteBuffer) : TitleS2CP {
val text = buffer.readChatComponent()
val text = buffer.readNbtChatComponent()

override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_IN, level = LogLevels.VERBOSE) { "Hotbar text (text=$text)" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType

class SubtitleS2CP(buffer: PlayInByteBuffer) : TitleS2CP {
val text = buffer.readChatComponent()
val text = buffer.readNbtChatComponent()

override fun handle(connection: PlayConnection) {
connection.events.fire(TitleSubtitleSetEvent(connection, this))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType

class TitleTextS2CP(buffer: PlayInByteBuffer) : TitleS2CP {
val text = buffer.readChatComponent()
val text = buffer.readNbtChatComponent()

override fun handle(connection: PlayConnection) {
connection.events.fire(TitleSetEvent(connection, this))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.protocol

@Suppress("UNUSED")
object ProtocolVersions {
const val V_23W40A = 916
const val V_1_20_2 = 915
const val V_1_20_2_RC2 = 914
const val V_1_20_2_RC1 = 913
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ package de.bixilon.minosoft.protocol.protocol

import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_13W41B
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_1_20_2
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_23W40A

object VersionSupport {
const val MINIMUM_VERSION = V_13W41B
const val LATEST_VERSION = V_1_20_2
const val LATEST_VERSION = V_23W40A
const val LATEST_RELEASE = V_1_20_2
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ class PlayInByteBuffer : InByteBuffer {
return ChatComponent.of(string, connection.language, null, restricted = true)
}

fun readNbtChatComponent(): ChatComponent {
if (versionId < ProtocolVersions.V_23W40A) {
return readChatComponent()
}
val nbt = readNBT()
return ChatComponent.of(nbt, connection.language, null, restricted = true)
}

fun readParticleData(): ParticleData {
val type = connection.registries.particleType[readVarInt()]
return readParticleData(type)
Expand Down Expand Up @@ -333,8 +341,8 @@ class PlayInByteBuffer : InByteBuffer {
}

fun readChatMessageParameters(parameters: MutableMap<ChatParameter, ChatComponent>) {
parameters[ChatParameter.SENDER] = readChatComponent()
readOptional { readChatComponent() }?.let { parameters[ChatParameter.TARGET] = it }
parameters[ChatParameter.SENDER] = readNbtChatComponent()
readOptional { readNbtChatComponent() }?.let { parameters[ChatParameter.TARGET] = it }
}

fun readSoundPitch(): Float {
Expand Down

Large diffs are not rendered by default.

44 changes: 44 additions & 0 deletions src/main/resources/assets/minosoft/mapping/default_registries.json
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,50 @@
"minecraft:limited_crafting": {
"id": 12
}
},
"916": {
"minecraft:bed_break": {
"id": 0
},
"minecraft:rain_start": {
"id": 1
},
"minecraft:rain_stop": {
"id": 2
},
"minecraft:gamemode_change": {
"id": 3
},
"minecraft:win_game": {
"id": 4
},
"minecraft:hide_demo_messages": {
"id": 5
},
"minecraft:arrow_player_hit": {
"id": 6
},
"minecraft:rain_gradient_set": {
"id": 7
},
"minecraft:thunder_gradient_set": {
"id": 8
},
"minecraft:pufferfish_sting": {
"id": 9
},
"minecraft:elder_guardian_effect": {
"id": 10
},
"minecraft:immediate_respawn": {
"id": 11
},
"minecraft:limited_crafting": {
"id": 12
},
"minecraft:receive_chunks": {
"id": 13
}
}
},
"minecraft:world_events": {
Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/assets/minosoft/mapping/versions.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
{
"916": {
"name": "23w40a",
"protocol_id": 1073741978,
"packets": 910
},
"915": {
"name": "1.20.2",
"protocol_id": 764,
Expand Down

0 comments on commit d143b98

Please sign in to comment.