dynamic vibration sources

Done with factories now
This commit is contained in:
Moritz Zwerger 2023-12-14 13:37:05 +01:00
parent 1d5c27723c
commit 67722f8e78
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
8 changed files with 147 additions and 14 deletions

View File

@ -13,9 +13,14 @@
package de.bixilon.minosoft.data.registries.particle.data
import de.bixilon.minosoft.data.registries.particle.ParticleType
import de.bixilon.minosoft.data.registries.particle.data.vibration.VibrationSource
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
class VibrationParticleData(val source: Any, val arrival: Int, type: ParticleType) : ParticleData(type) {
class VibrationParticleData(
val source: VibrationSource,
val arrival: Int,
type: ParticleType,
) : ParticleData(type) {
override fun toString(): String {
return "$type: $source in $arrival"

View File

@ -0,0 +1,33 @@
/*
* Minosoft
* Copyright (C) 2020-2023 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.particle.data.vibration
import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
import de.bixilon.minosoft.data.world.positions.BlockPosition
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
class BlockSource(
val position: BlockPosition,
) : VibrationSource {
companion object : VibrationFactory<BlockSource> {
override val identifier = minecraft("block")
override fun read(buffer: PlayInByteBuffer): BlockSource {
val position = buffer.readBlockPosition()
return BlockSource(position)
}
}
}

View File

@ -0,0 +1,35 @@
/*
* Minosoft
* Copyright (C) 2020-2023 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.particle.data.vibration
import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_1_20_1
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
class EntitySource(
val entityId: Int,
val yOffset: Float = 0.0f,
) : VibrationSource {
companion object : VibrationFactory<EntitySource> {
override val identifier = minecraft("entity")
override fun read(buffer: PlayInByteBuffer): EntitySource {
val entityId = buffer.readEntityId()
val yOffset = if (buffer.versionId >= V_1_20_1) buffer.readFloat() else 0.0f // TODO: version guessed. Present in 1.20.2
return EntitySource(entityId, yOffset)
}
}
}

View File

@ -0,0 +1,22 @@
/*
* Minosoft
* Copyright (C) 2020-2023 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.particle.data.vibration
import de.bixilon.minosoft.data.registries.identified.Identified
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
interface VibrationFactory<V : VibrationSource> : Identified {
fun read(buffer: PlayInByteBuffer): V
}

View File

@ -0,0 +1,16 @@
/*
* Minosoft
* Copyright (C) 2020-2023 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.particle.data.vibration
interface VibrationSource

View File

@ -0,0 +1,30 @@
/*
* Minosoft
* Copyright (C) 2020-2023 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.particle.data.vibration
import de.bixilon.minosoft.data.registries.factory.DefaultFactory
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
object VibrationSources : DefaultFactory<VibrationFactory<*>>(
BlockSource,
EntitySource,
) {
fun read(buffer: PlayInByteBuffer): VibrationSource {
val type = buffer.readResourceLocation()
val factory = this[type] ?: throw IllegalArgumentException("Can not find vibration source: $type")
return factory.read(buffer)
}
}

View File

@ -25,9 +25,6 @@ class VibrationS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val arrival: Int = buffer.readVarInt()
override fun log(reducedLog: Boolean) {
Log.log(
LogMessageType.NETWORK_IN,
level = LogLevels.VERBOSE
) { "Vibration signal (sourcePosition=$sourcePosition, target=$target, arrival=$arrival)" }
Log.log(LogMessageType.NETWORK_IN, level = LogLevels.VERBOSE) { "Vibration signal (sourcePosition=$sourcePosition, target=$target, arrival=$arrival)" }
}
}

View File

@ -28,6 +28,8 @@ import de.bixilon.minosoft.data.entities.entities.player.properties.textures.Pla
import de.bixilon.minosoft.data.registries.chat.ChatParameter
import de.bixilon.minosoft.data.registries.particle.ParticleType
import de.bixilon.minosoft.data.registries.particle.data.*
import de.bixilon.minosoft.data.registries.particle.data.vibration.VibrationSource
import de.bixilon.minosoft.data.registries.particle.data.vibration.VibrationSources
import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry
import de.bixilon.minosoft.data.registries.registries.registry.EnumRegistry
import de.bixilon.minosoft.data.registries.registries.registry.Registry
@ -375,15 +377,8 @@ class PlayInByteBuffer : InByteBuffer {
return Vec3d(readShort(), readShort(), readShort()) / ProtocolDefinition.VELOCITY_NETWORK_DIVIDER
}
fun readVibrationSource(): Any {
val type = readResourceLocation()
val source: Any = when (type.toString()) { // TODO: dynamic, factories
"minecraft:block" -> readBlockPosition()
"minecraft:entity" -> readEntityId()
else -> error("Unknown vibration source: $type")
}
return source
fun readVibrationSource(): VibrationSource {
return VibrationSources.read(this)
}
fun readLegacyBitSet(bytes: Int): BitSet {