remove all calls to world renderer in packets (use modding api)

This commit is contained in:
Bixilon 2021-04-21 00:57:52 +02:00
parent cae32126c3
commit 4a4e645cc0
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 19 additions and 21 deletions

View File

@ -35,10 +35,7 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.of
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight
import de.bixilon.minosoft.modding.event.CallbackEventInvoker
import de.bixilon.minosoft.modding.event.events.BlockChangeEvent
import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent
import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent
import de.bixilon.minosoft.modding.event.events.MultiBlockChangeEvent
import de.bixilon.minosoft.modding.event.events.*
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.nullCast
@ -139,6 +136,10 @@ class WorldRenderer(
prepareChunkSection(it.blockPosition.chunkPosition, it.blockPosition.sectionHeight)
})
connection.registerEvent(CallbackEventInvoker.of<RespawnEvent> {
clearChunkCache()
})
connection.registerEvent(CallbackEventInvoker.of<MultiBlockChangeEvent> {
val sectionHeights: MutableSet<Int> = mutableSetOf()
for ((key) in it.blocks) {

View File

@ -17,7 +17,7 @@ import de.bixilon.minosoft.modding.loading.Priorities
class CallbackEventInvoker<E : Event?> private constructor(
ignoreCancelled: Boolean,
private val callback: (event: E) -> Unit,
private val callback: (E) -> Unit,
override val eventType: Class<out Event>,
) : EventInvoker(ignoreCancelled, Priorities.NORMAL, null) {
@ -28,7 +28,7 @@ class CallbackEventInvoker<E : Event?> private constructor(
companion object {
@JvmOverloads
@Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE")
inline fun <reified E : Event> of(ignoreCancelled: Boolean = false, noinline callback: (event: E) -> Unit): CallbackEventInvoker<E> {
inline fun <reified E : Event> of(ignoreCancelled: Boolean = false, noinline callback: (E) -> Unit): CallbackEventInvoker<E> {
return CallbackEventInvoker(
ignoreCancelled = ignoreCancelled,
callback = callback,

View File

@ -12,8 +12,7 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.world.ChunkData
import de.bixilon.minosoft.data.world.Chunk
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.PacketChunkData
import glm_.vec2.Vec2i
@ -24,8 +23,8 @@ import glm_.vec2.Vec2i
class ChunkDataChangeEvent(
connection: PlayConnection,
val chunkPosition: Vec2i,
val chunkData: ChunkData,
val chunk: Chunk,
) : PlayConnectionEvent(connection) {
constructor(connection: PlayConnection, packet: PacketChunkData) : this(connection, packet.chunkPosition, packet.chunkData!!)
constructor(connection: PlayConnection, packet: PacketChunkData) : this(connection, packet.chunkPosition, connection.world.getChunk(packet.chunkPosition)!!)
}

View File

@ -20,7 +20,7 @@ import de.bixilon.minosoft.data.mappings.Dimension;
import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
import de.bixilon.minosoft.protocol.packets.s2c.play.PacketRespawn;
public class RespawnEvent extends CancelableEvent {
public class RespawnEvent extends PlayConnectionEvent {
private final Gamemodes gamemode;
private final Dimension dimension;
private final Difficulties difficulty;

View File

@ -76,7 +76,7 @@ class PacketChunkBulk() : PlayS2CPacket() {
data?.let {
val chunk = connection.world.getOrCreateChunk(chunkPosition)
chunk.setData(data)
connection.fireEvent(ChunkDataChangeEvent(connection, chunkPosition, data))
connection.fireEvent(ChunkDataChangeEvent(connection, chunkPosition, chunk))
} ?: let {
// unload chunk
connection.world.unloadChunk(chunkPosition)

View File

@ -83,16 +83,13 @@ class PacketRespawn(buffer: PlayInByteBuffer) : PlayS2CPacket() {
}
override fun handle(connection: PlayConnection) {
if (connection.fireEvent(RespawnEvent(connection, this))) {
return
}
// clear all chunks
connection.world.chunks.clear()
connection.world.dimension = dimension
connection.player.isSpawnConfirmed = false
connection.player.entity.tabListItem.gamemode = gamemode
connection.renderer?.renderWindow?.worldRenderer?.clearChunkCache()
connection.fireEvent(RespawnEvent(connection, this))
}
override fun log() {

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.protocol.packets.s2c.play
import de.bixilon.minosoft.data.world.light.ChunkLightAccessor
import de.bixilon.minosoft.data.world.light.LightAccessor
import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
@ -26,7 +27,7 @@ import glm_.vec2.Vec2i
import java.util.*
class PacketUpdateLight(buffer: PlayInByteBuffer) : PlayS2CPacket() {
val position: Vec2i = Vec2i(buffer.readVarInt(), buffer.readVarInt())
val chunkPosition: Vec2i = Vec2i(buffer.readVarInt(), buffer.readVarInt())
var trustEdges: Boolean = false
private set
val lightAccessor: LightAccessor
@ -55,16 +56,16 @@ class PacketUpdateLight(buffer: PlayInByteBuffer) : PlayS2CPacket() {
}
override fun log() {
Log.protocol("[IN] Received light update (position=%s)", position)
Log.protocol("[IN] Received light update (position=$chunkPosition)")
}
override fun handle(connection: PlayConnection) {
val chunk = connection.world.getOrCreateChunk(position)
val chunk = connection.world.getOrCreateChunk(chunkPosition)
if (chunk.lightAccessor != null && chunk.lightAccessor is ChunkLightAccessor && lightAccessor is ChunkLightAccessor) {
(chunk.lightAccessor as ChunkLightAccessor).merge(lightAccessor)
} else {
chunk.lightAccessor = lightAccessor
}
connection.renderer?.renderWindow?.worldRenderer?.prepareChunk(position, chunk)
connection.fireEvent(ChunkDataChangeEvent(connection, chunkPosition, chunk))
}
}