From 05e9063b425bd40d29e679ff7aa0c52012e10f6d Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 29 May 2021 16:01:08 +0200 Subject: [PATCH] world: play sounds and add particles, remove some parameters from particle constructor --- .../entities/block/CampfireBlockEntity.kt | 4 +- .../data/mappings/blocks/types/Block.kt | 3 +- .../mappings/blocks/types/CampfireBlock.kt | 17 ++++---- .../minosoft/data/mappings/items/BlockItem.kt | 2 +- .../data/mappings/particle/ParticleType.kt | 2 +- .../de/bixilon/minosoft/data/world/World.kt | 42 ++++++++++++++++--- .../gui/rendering/input/LeftClickHandler.kt | 2 +- .../particle/DefaultParticleBehavior.kt | 8 ++-- .../gui/rendering/particle/ParticleFactory.kt | 2 +- .../rendering/particle/ParticleRenderer.kt | 6 +++ .../gui/rendering/particle/types/Particle.kt | 10 +++-- .../norender/ExplosionEmitterParticle.kt | 15 ++++--- .../types/norender/NoRenderParticle.kt | 3 +- .../particle/types/render/RenderParticle.kt | 3 +- .../types/render/texture/TextureParticle.kt | 9 ++-- .../texture/simple/AscendingParticle.kt | 6 +-- .../texture/simple/CampfireSmokeParticle.kt | 11 +++-- .../texture/simple/ExplosionParticle.kt | 7 ++-- .../texture/simple/SimpleTextureParticle.kt | 11 +++-- .../texture/simple/fire/SmokeParticle.kt | 7 ++-- .../texture/simple/lava/LavaParticle.kt | 10 ++--- .../gui/rendering/sound/AudioPlayer.kt | 4 +- .../rendering/sound/DefaultAudioBehavior.kt | 7 ++-- 23 files changed, 111 insertions(+), 80 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt index bf3cb05b5..cd953d288 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt @@ -19,7 +19,6 @@ import de.bixilon.minosoft.data.mappings.blocks.BlockState import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties import de.bixilon.minosoft.data.mappings.blocks.types.CampfireBlock import de.bixilon.minosoft.gui.rendering.RenderConstants -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.nullCast import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast @@ -46,7 +45,6 @@ class CampfireBlockEntity(connection: PlayConnection) : BlockEntity(connection) override fun realTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i) { - val particleRenderer = connection.rendering?.renderWindow?.get(ParticleRenderer) ?: return if (blockState.properties[BlockProperties.LIT] != true) { return } @@ -56,7 +54,7 @@ class CampfireBlockEntity(connection: PlayConnection) : BlockEntity(connection) if (Random.nextFloat() < 0.11f) { for (i in 0 until Random.nextInt(2) + 2) { - blockState.block.spawnSmokeParticles(connection, particleRenderer, blockState, blockPosition, false) + blockState.block.spawnSmokeParticles(connection, blockState, blockPosition, false) } } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt index 6b057b796..5b43e0ad5 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt @@ -30,7 +30,6 @@ import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.TintColorCalculator import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3i import kotlin.random.Random @@ -98,7 +97,7 @@ open class Block( return this.defaultState.withProperties(properties) } - open fun randomTick(connection: PlayConnection, particleRenderer: ParticleRenderer?, blockState: BlockState, blockPosition: Vec3i, random: Random) {} + open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {} companion object : ResourceLocationDeserializer { override fun deserialize(mappings: Registries?, resourceLocation: ResourceLocation, data: JsonObject): Block { diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/CampfireBlock.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/CampfireBlock.kt index 711ff4c5e..ebaec3d88 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/CampfireBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/CampfireBlock.kt @@ -23,7 +23,6 @@ import de.bixilon.minosoft.data.mappings.items.tools.ShovelItem import de.bixilon.minosoft.data.mappings.versions.Registries import de.bixilon.minosoft.data.player.Hands import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.CampfireSmokeParticle import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.lava.LavaParticle @@ -46,13 +45,12 @@ open class CampfireBlock(resourceLocation: ResourceLocation, registries: Registr private val smokeParticle = registries.particleTypeRegistry[SmokeParticle]!! private fun extinguish(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i) { - val particleRenderer = connection.rendering?.renderWindow?.get(ParticleRenderer) ?: return for (i in 0 until 20) { - spawnSmokeParticles(connection, particleRenderer, blockState, blockPosition, true) + spawnSmokeParticles(connection, blockState, blockPosition, true) } } - fun spawnSmokeParticles(connection: PlayConnection, particleRenderer: ParticleRenderer, blockState: BlockState, blockPosition: Vec3i, extinguished: Boolean) { + fun spawnSmokeParticles(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, extinguished: Boolean) { let { val position = Vec3(blockPosition).verticalPlus( { 0.5f + 3.0f.noise }, @@ -67,7 +65,7 @@ open class CampfireBlock(resourceLocation: ResourceLocation, registries: Registr cosySmokeParticle } - particleRenderer.add(CampfireSmokeParticle(connection, particleRenderer, position, Vec3(0.0f, 0.07f, 0.0f), particleType.simple(), isSignal)) + connection.world += CampfireSmokeParticle(connection, position, Vec3(0.0f, 0.07f, 0.0f), particleType.default(), isSignal) } if (extinguished) { @@ -75,23 +73,22 @@ open class CampfireBlock(resourceLocation: ResourceLocation, registries: Registr { 0.5f + 4.0f.noise }, 0.5f ) - particleRenderer.add(SmokeParticle(connection, particleRenderer, position, Vec3(0.0f, 0.005f, 0.0f), smokeParticle.simple())) + connection.world += SmokeParticle(connection, position, Vec3(0.0f, 0.005f, 0.0f), smokeParticle.default()) } } - override fun randomTick(connection: PlayConnection, particleRenderer: ParticleRenderer?, blockState: BlockState, blockPosition: Vec3i, random: Random) { - particleRenderer ?: return + override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { if (blockState.properties[BlockProperties.LIT] != true) { return } if (random.chance(10)) { - connection.rendering?.audioPlayer?.playSoundEvent(campfireCrackleSoundEvent, blockPosition + Vec3(0.5f), 0.5f + random.nextFloat(), 0.6f + random.nextFloat() * 0.7f) + connection.world.playSoundEvent(campfireCrackleSoundEvent, blockPosition + Vec3(0.5f), 0.5f + random.nextFloat(), 0.6f + random.nextFloat() * 0.7f) } if (lavaParticles && random.chance(20)) { val position = Vec3(blockPosition) + Vec3(0.5f) for (i in 0 until random.nextInt(1) + 1) { - particleRenderer.add(LavaParticle(connection, particleRenderer, position, lavaParticle.simple())) + connection.world += LavaParticle(connection, position, lavaParticle.default()) } } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt b/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt index bb3d8fc15..a6e7e6394 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt @@ -63,7 +63,7 @@ open class BlockItem( } placeBlockState.placeSoundEvent?.let { - connection.rendering?.audioPlayer?.playSoundEvent(it, placePosition, placeBlockState.soundEventVolume, placeBlockState.soundEventPitch) + connection.world.playSoundEvent(it, placePosition, placeBlockState.soundEventVolume, placeBlockState.soundEventPitch) } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/particle/ParticleType.kt b/src/main/java/de/bixilon/minosoft/data/mappings/particle/ParticleType.kt index 4de2a496c..a476945cc 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/particle/ParticleType.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/particle/ParticleType.kt @@ -34,7 +34,7 @@ data class ParticleType( return resourceLocation.full } - fun simple(): ParticleData { + fun default(): ParticleData { return ParticleData(this) } diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index 9b0693624..f4d9df488 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -15,13 +15,17 @@ package de.bixilon.minosoft.data.world import de.bixilon.minosoft.data.Difficulties import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.mappings.Dimension +import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.biomes.Biome import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.data.mappings.sounds.SoundEvent import de.bixilon.minosoft.data.mappings.tweaker.VersionTweaker import de.bixilon.minosoft.data.world.biome.accessor.BiomeAccessor import de.bixilon.minosoft.data.world.biome.accessor.NullBiomeAccessor import de.bixilon.minosoft.data.world.light.WorldLightAccessor import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer +import de.bixilon.minosoft.gui.rendering.particle.types.Particle +import de.bixilon.minosoft.gui.rendering.sound.AudioPlayer import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkPosition @@ -36,6 +40,7 @@ import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.synchronizedMapOf import de.bixilon.minosoft.util.KUtil.toSynchronizedMap import glm_.vec2.Vec2i +import glm_.vec3.Vec3 import glm_.vec3.Vec3i import kotlin.random.Random @@ -58,6 +63,9 @@ class World( var age = 0L private val random = Random + var audioPlayer: AudioPlayer? = null + var particleRenderer: ParticleRenderer? = null + operator fun get(blockPosition: Vec3i): BlockState? { return chunks[blockPosition.chunkPosition]?.get(blockPosition.inChunkPosition) } @@ -169,19 +177,18 @@ class World( } fun randomTick() { - val particleRenderer = connection.rendering?.renderWindow?.get(ParticleRenderer) for (i in 0 until 667) { - randomTick(16, particleRenderer) - randomTick(32, particleRenderer) + randomTick(16) + randomTick(32) } } - private fun randomTick(radius: Int, particleRenderer: ParticleRenderer?) { + private fun randomTick(radius: Int) { val blockPosition = connection.player.entity.position.blockPosition + { random.nextInt(radius) } - { random.nextInt(radius) } val blockState = this[blockPosition] ?: return - blockState.block.randomTick(connection, particleRenderer, blockState, blockPosition, random) + blockState.block.randomTick(connection, blockState, blockPosition, random) } fun getBlocks(start: Vec3i, end: Vec3i): Map { @@ -200,4 +207,29 @@ class World( return blocks.toMap() } + + + fun playSoundEvent(resourceLocation: ResourceLocation, position: Vec3i? = null, volume: Float = 1.0f, pitch: Float = 1.0f) { + audioPlayer?.playSoundEvent(resourceLocation, position, volume, pitch) + } + + fun playSoundEvent(resourceLocation: ResourceLocation, position: Vec3? = null, volume: Float = 1.0f, pitch: Float = 1.0f) { + audioPlayer?.playSoundEvent(resourceLocation, position, volume, pitch) + } + + fun playSoundEvent(soundEvent: SoundEvent, position: Vec3i? = null, volume: Float = 1.0f, pitch: Float = 1.0f) { + audioPlayer?.playSoundEvent(soundEvent, position, volume, pitch) + } + + fun playSoundEvent(soundEvent: SoundEvent, position: Vec3? = null, volume: Float = 1.0f, pitch: Float = 1.0f) { + audioPlayer?.playSoundEvent(soundEvent, position, volume, pitch) + } + + fun addParticle(particle: Particle) { + particleRenderer?.add(particle) + } + + operator fun plusAssign(particle: Particle) { + addParticle(particle) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt index 8b980d4c3..897348333 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt @@ -133,7 +133,7 @@ class LeftClickHandler( connection.world.setBlockState(raycastHit.blockPosition, null) raycastHit.blockState.breakSoundEvent?.let { - renderWindow.rendering.audioPlayer.playSoundEvent(it, raycastHit.blockPosition, volume = raycastHit.blockState.soundEventVolume, pitch = raycastHit.blockState.soundEventPitch) + connection.world.playSoundEvent(it, raycastHit.blockPosition, volume = raycastHit.blockState.soundEventVolume, pitch = raycastHit.blockState.soundEventPitch) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/DefaultParticleBehavior.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/DefaultParticleBehavior.kt index b5c489ff0..cb98c21cf 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/DefaultParticleBehavior.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/DefaultParticleBehavior.kt @@ -34,18 +34,18 @@ object DefaultParticleBehavior { val invokers = listOf( CallbackEventInvoker.of { if (it.power >= 2.0f) { - particleRenderer.add(ExplosionEmitterParticle(connection, particleRenderer, it.position, explosionEmitterParticleType.simple())) + particleRenderer += ExplosionEmitterParticle(connection, it.position, explosionEmitterParticleType.default()) } else { - particleRenderer.add(ExplosionParticle(connection, particleRenderer, it.position, explosionParticleType.simple())) + particleRenderer += ExplosionParticle(connection, it.position, explosionParticleType.default()) } }, CallbackEventInvoker.of { fun spawn(position: Vec3, velocity: Vec3) { - val particle = it.data.type.factory?.build(connection, particleRenderer, position, velocity, it.data) ?: let { _ -> + val particle = it.data.type.factory?.build(connection, position, velocity, it.data) ?: let { _ -> Log.log(LogMessageType.RENDERING_GENERAL, LogLevels.WARN) { "Can not spawn particle: ${it.data.type}" } return } - particleRenderer.add(particle) + particleRenderer += particle } // ToDo: long distance = always spawn? if (it.count == 0) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleFactory.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleFactory.kt index 73269d5e3..5db4cf689 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleFactory.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleFactory.kt @@ -21,6 +21,6 @@ import glm_.vec3.Vec3 interface ParticleFactory : CompanionResourceLocation { - fun build(connection: PlayConnection, particleRenderer: ParticleRenderer = connection.rendering!!.renderWindow[ParticleRenderer]!!, position: Vec3, velocity: Vec3, data: ParticleData = ParticleData(connection.registries.particleTypeRegistry[RESOURCE_LOCATION]!!)): T + fun build(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData = connection.registries.particleTypeRegistry[RESOURCE_LOCATION]!!.default()): T } 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 63297466b..729c6f296 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 @@ -68,6 +68,8 @@ class ParticleRenderer( particleShader.load() renderWindow.textures.use(particleShader) renderWindow.textures.animator.use(particleShader) + + connection.world.particleRenderer = this } @@ -76,6 +78,10 @@ class ParticleRenderer( particles += particle } + operator fun plusAssign(particle: Particle) { + add(particle) + } + override fun draw() { particleShader.use() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt index 3be1bd1b4..9ca6e75b0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt @@ -16,8 +16,8 @@ package de.bixilon.minosoft.gui.rendering.particle.types import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.data.physics.Speedable import de.bixilon.minosoft.gui.rendering.chunk.models.AABB +import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory import de.bixilon.minosoft.gui.rendering.particle.ParticleMesh -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.assign import de.bixilon.minosoft.gui.rendering.util.VecUtil.millis @@ -29,14 +29,18 @@ import glm_.vec3.Vec3 import kotlin.math.abs import kotlin.math.sqrt import kotlin.random.Random +import kotlin.reflect.full.companionObjectInstance abstract class Particle( protected val connection: PlayConnection, - protected val particleRenderer: ParticleRenderer, final override val position: Vec3, final override val velocity: Vec3 = Vec3.EMPTY, - protected val data: ParticleData, + data: ParticleData? = null, ) : Speedable { + protected val data: ParticleData = data ?: let { + val resourceLocation = this::class.companionObjectInstance as ParticleFactory<*> + connection.registries.particleTypeRegistry[resourceLocation]!!.default() + } protected val random = Random var lastTickTime = -1L diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt index b9269986d..34054a59d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt @@ -16,7 +16,6 @@ package de.bixilon.minosoft.gui.rendering.particle.types.norender import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.ExplosionParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus @@ -24,8 +23,8 @@ import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.asResourceLocation import glm_.vec3.Vec3 -class ExplosionEmitterParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, data: ParticleData) : NoRenderParticle(connection, particleRenderer, position, Vec3.EMPTY, data) { - private val explosionParticleType = connection.registries.particleTypeRegistry[ExplosionParticle]!! +class ExplosionEmitterParticle(connection: PlayConnection, position: Vec3, data: ParticleData? = null) : NoRenderParticle(connection, position, Vec3.EMPTY, data) { + private val explosionParticleType = connection.registries.particleTypeRegistry[ExplosionParticle] init { maxAge = MAX_AGE @@ -34,10 +33,14 @@ class ExplosionEmitterParticle(connection: PlayConnection, particleRenderer: Par override fun realTick() { super.realTick() + explosionParticleType ?: let { + dead = true + return + } for (i in 0 until 6) { val position = position + { (random.nextFloat() - random.nextFloat()) * 4.0f } - particleRenderer.add(ExplosionParticle(connection, particleRenderer, position, explosionParticleType.simple(), floatAge / MAX_AGE)) + connection.world += ExplosionParticle(connection, position, explosionParticleType.default(), floatAge / MAX_AGE) } } @@ -45,8 +48,8 @@ class ExplosionEmitterParticle(connection: PlayConnection, particleRenderer: Par override val RESOURCE_LOCATION: ResourceLocation = "minecraft:explosion_emitter".asResourceLocation() private const val MAX_AGE = 9 - override fun build(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData): ExplosionEmitterParticle { - return ExplosionEmitterParticle(connection, particleRenderer, position, data) + override fun build(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData): ExplosionEmitterParticle { + return ExplosionEmitterParticle(connection, position, data) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt index a32715528..3f075126c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt @@ -15,12 +15,11 @@ package de.bixilon.minosoft.gui.rendering.particle.types.norender import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.gui.rendering.particle.ParticleMesh -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.Particle import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3 -abstract class NoRenderParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData) : Particle(connection, particleRenderer, position, velocity, data) { +abstract class NoRenderParticle(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData?) : Particle(connection, position, velocity, data) { override fun addVertex(particleMesh: ParticleMesh) {} } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/RenderParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/RenderParticle.kt index ea154e8e2..c844a7a94 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/RenderParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/RenderParticle.kt @@ -16,12 +16,11 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.RGBColor -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.Particle import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3 -abstract class RenderParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData) : Particle(connection, particleRenderer, position, velocity, data) { +abstract class RenderParticle(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData? = null) : Particle(connection, position, velocity, data) { protected open var scale: Float = 0.1f * (random.nextFloat() * 0.5f + 0.5f) * 2.0f protected var color: RGBColor = ChatColors.WHITE } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt index efdf0460c..4bf0bf6de 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt @@ -15,17 +15,18 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.gui.rendering.particle.ParticleMesh -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.render.RenderParticle import de.bixilon.minosoft.gui.rendering.textures.Texture import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3 -abstract class TextureParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, velocity: Vec3, position: Vec3, data: ParticleData) : RenderParticle(connection, particleRenderer, velocity, position, data) { - abstract val texture: Texture +abstract class TextureParticle(connection: PlayConnection, velocity: Vec3, position: Vec3, data: ParticleData? = null) : RenderParticle(connection, velocity, position, data) { + abstract val texture: Texture? override fun addVertex(particleMesh: ParticleMesh) { - particleMesh.addVertex(position, scale, texture, color) + texture?.let { + particleMesh.addVertex(position, scale, it, color) + } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/AscendingParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/AscendingParticle.kt index c3b1397de..c968a3ffb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/AscendingParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/AscendingParticle.kt @@ -15,7 +15,6 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.data.text.RGBColor.Companion.asGray -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.MMath @@ -23,7 +22,6 @@ import glm_.vec3.Vec3 abstract class AscendingParticle( connection: PlayConnection, - particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, velocityMultiplier: Vec3, @@ -32,8 +30,8 @@ abstract class AscendingParticle( baseAge: Int, gravityStrength: Float, physics: Boolean, - data: ParticleData, -) : SimpleTextureParticle(connection, particleRenderer, position, Vec3.EMPTY, data) { + data: ParticleData? = null, +) : SimpleTextureParticle(connection, position, Vec3.EMPTY, data) { override var scale: Float get() = super.scale * MMath.clamp(floatAge / maxAge * 32.0f, 0.0f, 1.0f) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/CampfireSmokeParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/CampfireSmokeParticle.kt index f9ae82fed..04fd08096 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/CampfireSmokeParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/CampfireSmokeParticle.kt @@ -16,7 +16,6 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.assign import de.bixilon.minosoft.gui.rendering.util.VecUtil.millis @@ -24,7 +23,7 @@ import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.asResourceLocation import glm_.vec3.Vec3 -class CampfireSmokeParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData, signal: Boolean) : SimpleTextureParticle(connection, particleRenderer, position, Vec3.EMPTY, data) { +class CampfireSmokeParticle(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData? = null, signal: Boolean) : SimpleTextureParticle(connection, position, Vec3.EMPTY, data) { init { scale *= 3.0f @@ -70,8 +69,8 @@ class CampfireSmokeParticle(connection: PlayConnection, particleRenderer: Partic object CosyFactory : ParticleFactory { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:campfire_cosy_smoke".asResourceLocation() - override fun build(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData): CampfireSmokeParticle { - return CampfireSmokeParticle(connection, particleRenderer, position, velocity, data, false) + override fun build(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData): CampfireSmokeParticle { + return CampfireSmokeParticle(connection, position, velocity, data, false) } } @@ -79,8 +78,8 @@ class CampfireSmokeParticle(connection: PlayConnection, particleRenderer: Partic object SignalFactory : ParticleFactory { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:campfire_signal_smoke".asResourceLocation() - override fun build(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData): CampfireSmokeParticle { - return CampfireSmokeParticle(connection, particleRenderer, position, velocity, data, true) + override fun build(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData): CampfireSmokeParticle { + return CampfireSmokeParticle(connection, position, velocity, data, true) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/ExplosionParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/ExplosionParticle.kt index 9a7ef0483..1bb9c80d6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/ExplosionParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/ExplosionParticle.kt @@ -17,13 +17,12 @@ import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.data.text.RGBColor.Companion.asGray import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.asResourceLocation import glm_.vec3.Vec3 -class ExplosionParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, data: ParticleData, power: Float = 1.0f) : SimpleTextureParticle(connection, particleRenderer, position, Vec3.EMPTY, data) { +class ExplosionParticle(connection: PlayConnection, position: Vec3, data: ParticleData? = null, power: Float = 1.0f) : SimpleTextureParticle(connection, position, Vec3.EMPTY, data) { init { movement = false @@ -36,8 +35,8 @@ class ExplosionParticle(connection: PlayConnection, particleRenderer: ParticleRe companion object : ParticleFactory { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:explosion".asResourceLocation() - override fun build(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData): ExplosionParticle { - return ExplosionParticle(connection, particleRenderer, position, data, velocity.x) + override fun build(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData): ExplosionParticle { + return ExplosionParticle(connection, position, data, velocity.x) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt index f9f739bf3..ecbc2bccf 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt @@ -14,13 +14,12 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple import de.bixilon.minosoft.data.mappings.particle.data.ParticleData -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.TextureParticle import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3 -abstract class SimpleTextureParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData) : TextureParticle(connection, particleRenderer, position, velocity, data) { - override var texture = particleRenderer.renderWindow.textures.allTextures[data.type.textures.first()]!! +abstract class SimpleTextureParticle(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData? = null) : TextureParticle(connection, position, velocity, data) { + override var texture = connection.rendering?.renderWindow?.textures?.allTextures?.get(this.data.type.textures.first()) var spriteDisabled = false @@ -31,14 +30,14 @@ abstract class SimpleTextureParticle(connection: PlayConnection, particleRendere } // calculate next texture val nextTextureResourceLocation = data.type.textures[age / (maxAge / totalTextures + 1)] - if (texture.resourceLocation == nextTextureResourceLocation) { + if (texture?.resourceLocation == nextTextureResourceLocation) { return } - texture = particleRenderer.renderWindow.textures.allTextures[nextTextureResourceLocation]!! + texture = connection.rendering?.renderWindow?.textures?.allTextures?.get(nextTextureResourceLocation) } fun setRandomSprite() { - texture = particleRenderer.renderWindow.textures.allTextures[data.type.textures.random(random)]!! + texture = connection.rendering?.renderWindow?.textures?.allTextures?.get(data.type.textures.random(random)) } override fun tick(deltaTime: Int) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/fire/SmokeParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/fire/SmokeParticle.kt index 942efcb7c..3c3ce8eeb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/fire/SmokeParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/fire/SmokeParticle.kt @@ -16,20 +16,19 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.f import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.AscendingParticle import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.asResourceLocation import glm_.vec3.Vec3 -class SmokeParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData, scaleMultiplier: Float = 1.0f) : AscendingParticle(connection, particleRenderer, position, velocity, Vec3(0.1f), scaleMultiplier, 0.3f, 8, -0.1f, true, data) { +class SmokeParticle(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData? = null, scaleMultiplier: Float = 1.0f) : AscendingParticle(connection, position, velocity, Vec3(0.1f), scaleMultiplier, 0.3f, 8, -0.1f, true, data) { companion object : ParticleFactory { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:smoke".asResourceLocation() - override fun build(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData): SmokeParticle { - return SmokeParticle(connection, particleRenderer, position, velocity, data) + override fun build(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData): SmokeParticle { + return SmokeParticle(connection, position, velocity, data) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt index 88572f28f..92b96789c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt @@ -16,7 +16,6 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.l import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory -import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.SimpleTextureParticle import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY @@ -25,8 +24,7 @@ import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.asResourceLocation import glm_.vec3.Vec3 -class LavaParticle(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, data: ParticleData) : SimpleTextureParticle(connection, particleRenderer, position, Vec3.EMPTY, data) { - private val smokeParticleType = connection.registries.particleTypeRegistry[SmokeParticle]!! +class LavaParticle(connection: PlayConnection, position: Vec3, data: ParticleData? = null) : SimpleTextureParticle(connection, position, Vec3.EMPTY, data) { override var scale: Float get() = super.scale * (1.0f - (floatAge / maxAge).sqr) @@ -48,15 +46,15 @@ class LavaParticle(connection: PlayConnection, particleRenderer: ParticleRendere super.realTick() if (random.nextFloat() > (floatAge / maxAge)) { - particleRenderer.add(SmokeParticle(connection, particleRenderer, Vec3(position), Vec3(velocity), smokeParticleType.simple())) + connection.world += SmokeParticle(connection, Vec3(position), Vec3(velocity)) } } companion object : ParticleFactory { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:lava".asResourceLocation() - override fun build(connection: PlayConnection, particleRenderer: ParticleRenderer, position: Vec3, velocity: Vec3, data: ParticleData): LavaParticle { - return LavaParticle(connection, particleRenderer, position, data) + override fun build(connection: PlayConnection, position: Vec3, velocity: Vec3, data: ParticleData): LavaParticle { + return LavaParticle(connection, position, data) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sound/AudioPlayer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sound/AudioPlayer.kt index e26d8be9f..7c0437cf9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sound/AudioPlayer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sound/AudioPlayer.kt @@ -112,12 +112,13 @@ class AudioPlayer( } }) - DefaultAudioBehavior.register(connection, this) + DefaultAudioBehavior.register(connection) Log.log(LogMessageType.AUDIO_LOADING, LogLevels.INFO) { "OpenAL loaded!" } initialized = true + connection.world.audioPlayer = this latch.dec() } @@ -133,7 +134,6 @@ class AudioPlayer( playSoundEvent(soundEvent, position?.center, volume, pitch) } - fun playSoundEvent(soundEvent: SoundEvent, position: Vec3? = null, volume: Float = 1.0f, pitch: Float = 1.0f) { if (!initialized) { return diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sound/DefaultAudioBehavior.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sound/DefaultAudioBehavior.kt index 4ac118424..5c97ca9ed 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sound/DefaultAudioBehavior.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sound/DefaultAudioBehavior.kt @@ -24,10 +24,11 @@ import kotlin.random.Random object DefaultAudioBehavior { val ENTITY_GENERIC_EXPLODE = "minecraft:entity.generic.explode".asResourceLocation() - fun register(connection: PlayConnection, audioPlayer: AudioPlayer) { + fun register(connection: PlayConnection) { + val world = connection.world val invokers = listOf( - CallbackEventInvoker.of { audioPlayer.playSoundEvent(it.soundEvent, it.position.toVec3, it.volume, it.pitch) }, - CallbackEventInvoker.of { audioPlayer.playSoundEvent(ENTITY_GENERIC_EXPLODE, it.position, 4.0f, (1.0f + (Random.nextFloat() - Random.nextFloat()) * 0.2f) * 0.7f) }, + CallbackEventInvoker.of { world.playSoundEvent(it.soundEvent, it.position.toVec3, it.volume, it.pitch) }, + CallbackEventInvoker.of { world.playSoundEvent(ENTITY_GENERIC_EXPLODE, it.position, 4.0f, (1.0f + (Random.nextFloat() - Random.nextFloat()) * 0.2f) * 0.7f) }, ) connection.registerEvents(*invokers.toTypedArray())