sound groups, reduce memory usage

This commit is contained in:
Bixilon 2022-05-24 22:22:12 +02:00
parent a6057ffff8
commit a1692b2d3d
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 60 additions and 21 deletions

View File

@ -16,7 +16,6 @@ import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.json.JsonUtil.toJsonObject
import de.bixilon.kutil.primitive.BooleanUtil.toBoolean
import de.bixilon.kutil.primitive.FloatUtil.toFloat
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.registries.VoxelShape
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
@ -35,13 +34,6 @@ data class BlockState(
val outlineShape: VoxelShape,
val hardness: Float,
val requiresTool: Boolean,
val breakSoundEvent: ResourceLocation?,
val stepSoundEvent: ResourceLocation?,
val placeSoundEvent: ResourceLocation?,
val hitSoundEvent: ResourceLocation?,
val fallSoundEvent: ResourceLocation?,
val soundEventVolume: Float = 1.0f,
val soundEventPitch: Float = 1.0f,
val isSolid: Boolean,
) {
var blockModel: BakedBlockModel? = null
@ -140,13 +132,6 @@ data class BlockState(
outlineShape = outlineShape,
hardness = data["hardness"]?.toFloat() ?: 1.0f,
requiresTool = data["requires_tool"]?.toBoolean() ?: material.soft,
breakSoundEvent = data["break_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
stepSoundEvent = data["step_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
placeSoundEvent = data["place_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
hitSoundEvent = data["hit_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
fallSoundEvent = data["fall_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
soundEventVolume = data["sound_type_volume"]?.toFloat() ?: 1.0f,
soundEventPitch = data["sound_type_pitch"]?.toFloat() ?: 1.0f,
isSolid = data["solid_render"]?.toBoolean() ?: false,
)
}

View File

@ -62,6 +62,8 @@ open class Block(
open val jumpVelocityMultiplier = data["jump_velocity_multiplier"]?.toDouble() ?: 1.0
var tintProvider: TintProvider? = null
var soundGroup = data["sound_group"]?.toInt()?.let { registries.soundGroupRegistry[it] }
init {
this::item.inject(data["item"])
}

View File

@ -80,8 +80,8 @@ open class BlockItem(
stack.item.decreaseCount()
}
placeBlockState.placeSoundEvent?.let {
connection.world.playSoundEvent(it, placePosition, placeBlockState.soundEventVolume, placeBlockState.soundEventPitch)
placeBlockState.block.soundGroup?.let { group ->
group.place?.let { connection.world.playSoundEvent(it, placePosition, group.volume, group.pitch) }
}
return InteractionResults.SUCCESS
}

View File

@ -30,13 +30,13 @@ object BlockDestroyedHandler : WorldEventHandler {
override val RESOURCE_LOCATION: ResourceLocation = "minecraft:block_destroyed".toResourceLocation()
override fun handle(connection: PlayConnection, position: Vec3i, data: Int, isGlobal: Boolean) {
val state = connection.registries.blockStateRegistry[data] ?: return
val state = connection.registries.blockStateRegistry.getOrNull(data) ?: return
handleDestroy(connection, position, state)
}
fun handleDestroy(connection: PlayConnection, position: Vec3i, state: BlockState) {
state.breakSoundEvent?.let {
connection.world.playSoundEvent(it, position, volume = state.soundEventVolume, pitch = state.soundEventPitch)
state.block.soundGroup?.let { group ->
group.destroy?.let { connection.world.playSoundEvent(it, position, group.volume, group.pitch) }
}
addBlockBreakParticles(connection, position, state)

View File

@ -41,6 +41,7 @@ import de.bixilon.minosoft.data.registries.materials.Material
import de.bixilon.minosoft.data.registries.other.containers.ContainerType
import de.bixilon.minosoft.data.registries.particle.ParticleType
import de.bixilon.minosoft.data.registries.registries.registry.*
import de.bixilon.minosoft.data.registries.sound.SoundGroup
import de.bixilon.minosoft.data.registries.statistics.Statistic
import de.bixilon.minosoft.data.registries.versions.Version
import de.bixilon.minosoft.datafixer.RegistryFixer.fix
@ -94,6 +95,7 @@ class Registries {
val biomePrecipitationRegistry: FakeEnumRegistry<BiomePrecipitation> = FakeEnumRegistry(codec = BiomePrecipitation)
val biomeCategoryRegistry: FakeEnumRegistry<BiomeCategory> = FakeEnumRegistry(codec = BiomeCategory)
val soundGroupRegistry: FakeEnumRegistry<SoundGroup> = FakeEnumRegistry(codec = SoundGroup)
val blockStateRegistry = BlockStateRegistry(false)
@ -160,6 +162,7 @@ class Registries {
motiveRegistry.rawUpdate(pixlyzerData["motives"]?.toJsonObject(), this)
soundEventRegistry.rawUpdate(pixlyzerData["sound_events"]?.toJsonObject(), null)
soundGroupRegistry.update(pixlyzerData["sound_groups"]?.unsafeCast(), this)
particleTypeRegistry.rawUpdate(pixlyzerData["particles"]?.toJsonObject(), this)
materialRegistry.rawUpdate(pixlyzerData["materials"]?.toJsonObject(), this)
enchantmentRegistry.rawUpdate(pixlyzerData["enchantments"]?.toJsonObject(), this)

View File

@ -0,0 +1,49 @@
/*
* Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.data.registries.sound
import de.bixilon.kutil.primitive.FloatUtil.toFloat
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.registries.registries.Registries
import de.bixilon.minosoft.data.registries.registries.registry.RegistryFakeEnumerable
import de.bixilon.minosoft.data.registries.registries.registry.codec.IdCodec
class SoundGroup(
override val name: String,
val destroy: ResourceLocation?,
val step: ResourceLocation?,
val place: ResourceLocation?,
val hit: ResourceLocation?,
val fall: ResourceLocation?,
val volume: Float = 1.0f,
val pitch: Float = 1.0f,
) : RegistryFakeEnumerable {
companion object : IdCodec<SoundGroup> {
override fun deserialize(registries: Registries, data: Map<String, Any>): SoundGroup {
return SoundGroup(
name = data["name"]?.toString()!!,
destroy = data["break_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
step = data["step_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
place = data["place_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
hit = data["hit_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
fall = data["fall_sound_type"]?.toInt()?.let { registries.soundEventRegistry[it] },
volume = data["sound_type_volume"]?.toFloat() ?: 1.0f,
pitch = data["sound_type_pitch"]?.toFloat() ?: 1.0f,
)
}
}
}

File diff suppressed because one or more lines are too long