diff --git a/src/main/java/de/bixilon/minosoft/data/world/particle/AbstractParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/data/world/particle/AbstractParticleRenderer.kt index b78ce6304..8c90e9017 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/particle/AbstractParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/particle/AbstractParticleRenderer.kt @@ -23,5 +23,5 @@ interface AbstractParticleRenderer { addParticle(particle ?: return) } - fun removeAll() + fun removeAllParticles() } diff --git a/src/main/java/de/bixilon/minosoft/data/world/particle/WorldParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/data/world/particle/WorldParticleRenderer.kt index 1bb7229b4..f63edf306 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/particle/WorldParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/particle/WorldParticleRenderer.kt @@ -22,7 +22,7 @@ interface WorldParticleRenderer : AbstractParticleRenderer { particleRenderer?.addParticle(particle) } - override fun removeAll() { - particleRenderer?.removeAll() + override fun removeAllParticles() { + particleRenderer?.removeAllParticles() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt index 7b176faca..4e7375379 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt @@ -38,6 +38,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.phases.TransparentDrawable import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates.Companion.disconnected import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.chunk.ChunkUtil.isInViewDistance @@ -147,7 +148,7 @@ class ParticleRenderer( connection.world.particleRenderer = this particleTask = TimeWorkerTask(ProtocolDefinition.TICK_TIME, maxDelayTime = ProtocolDefinition.TICK_TIME / 2) { - if (renderWindow.renderingState == RenderingStates.PAUSED || renderWindow.renderingState == RenderingStates.STOPPED || !enabled) { + if (renderWindow.renderingState == RenderingStates.PAUSED || renderWindow.renderingState == RenderingStates.STOPPED || !enabled || connection.state != PlayConnectionStates.PLAYING) { return@TimeWorkerTask } val cameraPosition = connection.player.positionInfo.chunkPosition @@ -257,7 +258,7 @@ class ParticleRenderer( translucentMesh.draw() } - override fun removeAll() { + override fun removeAllParticles() { particlesLock.lock() particles.clear() particlesLock.unlock() diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt index 017175c81..c1a9df698 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt @@ -13,10 +13,12 @@ package de.bixilon.minosoft.protocol.network.connection.play +import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.minosoft.data.text.BaseComponent import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.gui.rendering.RenderConstants +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.modding.event.events.ChatMessageSendEvent import de.bixilon.minosoft.modding.event.events.InternalMessageReceiveEvent import de.bixilon.minosoft.protocol.packets.c2s.play.chat.ChatMessageC2SP @@ -52,4 +54,11 @@ class ConnectionUtil( Log.log(LogMessageType.CHAT_OUT) { toSend } connection.sendPacket(ChatMessageC2SP(toSend)) } + + fun prepareSpawn() { + connection.world.chunks.clear() + connection.player.velocity = Vec3d.EMPTY + connection.world.audioPlayer?.stopAllSounds() + connection.world.particleRenderer?.removeAllParticles() + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt index 1427954d1..446238f95 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt @@ -150,6 +150,7 @@ class InitializeS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { } override fun handle(connection: PlayConnection) { + connection.util.prepareSpawn() val playerEntity = connection.player val previousGamemode = playerEntity.tabListItem.gamemode diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt index a7ef19594..42a55ec18 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt @@ -12,13 +12,11 @@ */ package de.bixilon.minosoft.protocol.packets.s2c.play -import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.kutil.json.JsonUtil.asJsonObject import de.bixilon.minosoft.data.Difficulties import de.bixilon.minosoft.data.abilities.Gamemodes import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.dimension.DimensionProperties -import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.modding.event.events.RespawnEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates @@ -92,16 +90,10 @@ class RespawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { } override fun handle(connection: PlayConnection) { - // clear all chunks - connection.state = PlayConnectionStates.SPAWNING - connection.world.chunks.clear() - connection.world.dimension = dimension - connection.player.isSpawnConfirmed = false + connection.util.prepareSpawn() connection.player.tabListItem.gamemode = gamemode - connection.player.velocity = Vec3d.EMPTY - - // connection.world.view.serverViewDistance = 0 - + connection.world.dimension = dimension + connection.state = PlayConnectionStates.SPAWNING connection.fireEvent(RespawnEvent(connection, this)) }