mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 18:05:51 -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.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) {
|
||||||
|
@ -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,
|
||||||
|
@ -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)!!)
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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() {
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user