diff --git a/src/main/java/de/bixilon/minosoft/protocol/PacketSkipper.kt b/src/main/java/de/bixilon/minosoft/protocol/PacketSkipper.kt new file mode 100644 index 000000000..fafec2de8 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/PacketSkipper.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.protocol + +import de.bixilon.minosoft.protocol.network.connection.Connection + +interface PacketSkipper { + + fun canSkip(connection: Connection): Boolean +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/network/client/pipeline/encoding/PacketDecoder.kt b/src/main/java/de/bixilon/minosoft/protocol/network/network/client/pipeline/encoding/PacketDecoder.kt index 627ef55a5..2db018868 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/network/client/pipeline/encoding/PacketDecoder.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/network/client/pipeline/encoding/PacketDecoder.kt @@ -49,6 +49,9 @@ class PacketDecoder( if (packetType.clazz == S2CPacket::class.java) { throw S2CPacketNotImplementedException(packetId, state, version) } + if (packetType.canSkip(client.connection)) { + return + } val packet = try { readPacket(packetType, data) diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/factory/PacketTypeRegistry.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/factory/PacketTypeRegistry.kt index bacbeef1c..c30723f71 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/factory/PacketTypeRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/factory/PacketTypeRegistry.kt @@ -24,6 +24,7 @@ import de.bixilon.kutil.reflection.KotlinReflection.kClass import de.bixilon.kutil.reflection.ReflectionUtil.realName import de.bixilon.kutil.string.StringUtil.toSnakeCase import de.bixilon.minosoft.protocol.PacketErrorHandler +import de.bixilon.minosoft.protocol.PacketSkipper import de.bixilon.minosoft.protocol.packets.Packet import de.bixilon.minosoft.protocol.packets.PacketsRoot import de.bixilon.minosoft.protocol.packets.c2s.C2SPacket @@ -122,6 +123,7 @@ object PacketTypeRegistry { val objectInstance: Any? = kClass.objectInstance ?: kClass.companionObjectInstance val annotation = clazz.getAnnotation(LoadPacket::class.java) val errorHandler = if (objectInstance is PacketErrorHandler) objectInstance else null + val packetSkipper = if (objectInstance is PacketSkipper) objectInstance else null val direction = when { objectInstance is PacketFactory -> objectInstance.direction @@ -142,14 +144,15 @@ object PacketTypeRegistry { if (direction == PacketDirection.SERVER_TO_CLIENT) { val s2cClass = clazz.unsafeCast>() - val type = S2CPacketType(annotation.state, s2cClass, errorHandler, annotation, factory) + val type = S2CPacketType(annotation.state, s2cClass, errorHandler, packetSkipper, annotation, factory) s2cClassMap[s2cClass] = type s2cStateMap.synchronizedGetOrPut(annotation.state) { mutableMapOf() }.put(name, type)?.let { throw IllegalStateException("Packet already mapped: $it (name=$name)") } if (parentClass != null && parentClass != s2cClass) { val parentKClass = parentClass.kClass val parentObject = parentKClass.objectInstance ?: parentKClass.companionObjectInstance val parentErrorHandler = parentObject.nullCast() - s2cClassMap[parentClass.unsafeCast()] = S2CPacketType(annotation.state, parentClass.unsafeCast(), parentErrorHandler, annotation) + val parentPacketSkipper = parentObject.nullCast() + s2cClassMap[parentClass.unsafeCast()] = S2CPacketType(annotation.state, parentClass.unsafeCast(), parentErrorHandler, parentPacketSkipper, annotation) s2cStateMap[annotation.state]!!.putIfAbsent(parentClass.getPacketName(null), type) } } else { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/factory/S2CPacketType.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/factory/S2CPacketType.kt index cb013395e..0932b59cb 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/factory/S2CPacketType.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/factory/S2CPacketType.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.packets.factory import de.bixilon.minosoft.protocol.PacketErrorHandler +import de.bixilon.minosoft.protocol.PacketSkipper import de.bixilon.minosoft.protocol.network.connection.Connection import de.bixilon.minosoft.protocol.packets.factory.factories.PacketFactory import de.bixilon.minosoft.protocol.packets.s2c.S2CPacket @@ -23,11 +24,12 @@ class S2CPacketType constructor( val state: ProtocolStates, val clazz: Class, private val packetErrorHandler: PacketErrorHandler?, + private val packetSkipper: PacketSkipper?, val annotation: LoadPacket?, val factory: PacketFactory? = null, override val threadSafe: Boolean = annotation!!.threadSafe, override val lowPriority: Boolean = annotation!!.lowPriority, -) : AbstractPacketType, PacketErrorHandler { +) : AbstractPacketType, PacketErrorHandler, PacketSkipper { override val direction = PacketDirection.SERVER_TO_CLIENT @@ -35,6 +37,10 @@ class S2CPacketType constructor( packetErrorHandler?.onError(error, connection) } + override fun canSkip(connection: Connection): Boolean { + return packetSkipper?.canSkip(connection) ?: false + } + override fun toString(): String { return clazz.toString() } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkLightS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkLightS2CP.kt index ec13fc869..2a970cf6a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkLightS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkLightS2CP.kt @@ -14,7 +14,10 @@ package de.bixilon.minosoft.protocol.packets.s2c.play.chunk import de.bixilon.kotlinglm.vec2.Vec2i +import de.bixilon.minosoft.config.StaticConfiguration import de.bixilon.minosoft.data.world.ChunkData +import de.bixilon.minosoft.protocol.PacketSkipper +import de.bixilon.minosoft.protocol.network.connection.Connection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket @@ -70,4 +73,11 @@ class ChunkLightS2CP @JvmOverloads constructor(buffer: PlayInByteBuffer, chunkPo val chunk = connection.world.getOrCreateChunk(chunkPosition) chunk.setData(chunkData) } + + companion object : PacketSkipper { + + override fun canSkip(connection: Connection): Boolean { + return StaticConfiguration.IGNORE_SERVER_LIGHT + } + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CP.kt index d526b7282..8f3e8af41 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CP.kt @@ -18,6 +18,7 @@ import de.bixilon.kutil.compression.zlib.ZlibUtil.decompress import de.bixilon.kutil.json.JsonUtil.asJsonObject import de.bixilon.kutil.json.JsonUtil.toJsonObject import de.bixilon.kutil.primitive.IntUtil.toInt +import de.bixilon.minosoft.config.StaticConfiguration import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.registries.dimension.DimensionProperties import de.bixilon.minosoft.data.world.ChunkData @@ -142,7 +143,11 @@ class ChunkS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { } if (buffer.versionId >= V_21W37A) { - this.chunkData.replace(ChunkLightS2CP(buffer) { chunkPosition }.chunkData) + if (StaticConfiguration.IGNORE_SERVER_LIGHT) { + buffer.pointer = buffer.size + } else { + this.chunkData.replace(ChunkLightS2CP(buffer) { chunkPosition }.chunkData) + } } } }