mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 09:56:37 -04:00
remove all calls to world renderer in packets (use modding api)
This commit is contained in:
parent
cae32126c3
commit
4a4e645cc0
@ -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) {
|
||||
|
@ -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,
|
||||
|
@ -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)!!)
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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() {
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user