diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt index d5c4ec9b1..33bfeb79d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt @@ -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 { + clearChunkCache() + }) + connection.registerEvent(CallbackEventInvoker.of { val sectionHeights: MutableSet = mutableSetOf() for ((key) in it.blocks) { diff --git a/src/main/java/de/bixilon/minosoft/modding/event/CallbackEventInvoker.kt b/src/main/java/de/bixilon/minosoft/modding/event/CallbackEventInvoker.kt index be930c064..05958937e 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/CallbackEventInvoker.kt +++ b/src/main/java/de/bixilon/minosoft/modding/event/CallbackEventInvoker.kt @@ -17,7 +17,7 @@ import de.bixilon.minosoft.modding.loading.Priorities class CallbackEventInvoker private constructor( ignoreCancelled: Boolean, - private val callback: (event: E) -> Unit, + private val callback: (E) -> Unit, override val eventType: Class, ) : EventInvoker(ignoreCancelled, Priorities.NORMAL, null) { @@ -28,7 +28,7 @@ class CallbackEventInvoker private constructor( companion object { @JvmOverloads @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") - inline fun of(ignoreCancelled: Boolean = false, noinline callback: (event: E) -> Unit): CallbackEventInvoker { + inline fun of(ignoreCancelled: Boolean = false, noinline callback: (E) -> Unit): CallbackEventInvoker { return CallbackEventInvoker( ignoreCancelled = ignoreCancelled, callback = callback, diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/ChunkDataChangeEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/ChunkDataChangeEvent.kt index 97e6d266b..5f6538ee7 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/ChunkDataChangeEvent.kt +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/ChunkDataChangeEvent.kt @@ -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)!!) } diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/RespawnEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/RespawnEvent.java index 0ae6a2b40..d37e94a86 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/RespawnEvent.java +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/RespawnEvent.java @@ -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; diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketChunkBulk.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketChunkBulk.kt index 692539cfc..215220a7a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketChunkBulk.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketChunkBulk.kt @@ -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) diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt index 8e21717cb..bd64e522a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt @@ -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() { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketUpdateLight.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketUpdateLight.kt index cf3f40713..e688eca74 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketUpdateLight.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketUpdateLight.kt @@ -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)) } }