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

View File

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

View File

@ -12,8 +12,7 @@
*/ */
package de.bixilon.minosoft.modding.event.events 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.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.PacketChunkData import de.bixilon.minosoft.protocol.packets.s2c.play.PacketChunkData
import glm_.vec2.Vec2i import glm_.vec2.Vec2i
@ -24,8 +23,8 @@ import glm_.vec2.Vec2i
class ChunkDataChangeEvent( class ChunkDataChangeEvent(
connection: PlayConnection, connection: PlayConnection,
val chunkPosition: Vec2i, val chunkPosition: Vec2i,
val chunkData: ChunkData, val chunk: Chunk,
) : PlayConnectionEvent(connection) { ) : 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.network.connection.PlayConnection;
import de.bixilon.minosoft.protocol.packets.s2c.play.PacketRespawn; 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 Gamemodes gamemode;
private final Dimension dimension; private final Dimension dimension;
private final Difficulties difficulty; private final Difficulties difficulty;

View File

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

View File

@ -83,16 +83,13 @@ class PacketRespawn(buffer: PlayInByteBuffer) : PlayS2CPacket() {
} }
override fun handle(connection: PlayConnection) { override fun handle(connection: PlayConnection) {
if (connection.fireEvent(RespawnEvent(connection, this))) {
return
}
// clear all chunks // clear all chunks
connection.world.chunks.clear() connection.world.chunks.clear()
connection.world.dimension = dimension connection.world.dimension = dimension
connection.player.isSpawnConfirmed = false connection.player.isSpawnConfirmed = false
connection.player.entity.tabListItem.gamemode = gamemode connection.player.entity.tabListItem.gamemode = gamemode
connection.renderer?.renderWindow?.worldRenderer?.clearChunkCache()
connection.fireEvent(RespawnEvent(connection, this))
} }
override fun log() { 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.ChunkLightAccessor
import de.bixilon.minosoft.data.world.light.LightAccessor 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.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
@ -26,7 +27,7 @@ import glm_.vec2.Vec2i
import java.util.* import java.util.*
class PacketUpdateLight(buffer: PlayInByteBuffer) : PlayS2CPacket() { 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 var trustEdges: Boolean = false
private set private set
val lightAccessor: LightAccessor val lightAccessor: LightAccessor
@ -55,16 +56,16 @@ class PacketUpdateLight(buffer: PlayInByteBuffer) : PlayS2CPacket() {
} }
override fun log() { 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) { 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) { if (chunk.lightAccessor != null && chunk.lightAccessor is ChunkLightAccessor && lightAccessor is ChunkLightAccessor) {
(chunk.lightAccessor as ChunkLightAccessor).merge(lightAccessor) (chunk.lightAccessor as ChunkLightAccessor).merge(lightAccessor)
} else { } else {
chunk.lightAccessor = lightAccessor chunk.lightAccessor = lightAccessor
} }
connection.renderer?.renderWindow?.worldRenderer?.prepareChunk(position, chunk) connection.fireEvent(ChunkDataChangeEvent(connection, chunkPosition, chunk))
} }
} }