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)
+ }
}
}
}