vibration source registry

fixes network packet reading of ParticleS2CP in > 1.12.2?
This commit is contained in:
Moritz Zwerger 2023-12-14 18:04:12 +01:00
parent 67722f8e78
commit c24c92aa29
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 34 additions and 24 deletions

View File

@ -70,6 +70,7 @@ object FallbackRegistries {
val MESSAGE_TYPES_REGISTRY: PerVersionRegistry<ChatMessageType, Registry<ChatMessageType>> = PerVersionRegistry { Registry(codec = ChatMessageType) }
val VIBRATION_SOURCE: PerVersionRegistry<ResourceLocation, ResourceLocationRegistry> = PerVersionRegistry { ResourceLocationRegistry() }
fun load() {
@ -93,21 +94,22 @@ object FallbackRegistries {
val registriesJson: Map<ResourceLocation, Any> = IntegratedAssets.DEFAULT[REGISTRIES_RESOURCE_LOCATION].readJson()
DEFAULT_PLUGIN_CHANNELS_REGISTRY.initialize(registriesJson[ResourceLocation.of("default_channels")].asJsonObject(), PluginChannel)
DEFAULT_PLUGIN_CHANNELS_REGISTRY.initialize(registriesJson[ResourceLocation.of("default_channels")].asJsonObject())
ENTITY_OBJECT_REGISTRY.initialize(registriesJson[ResourceLocation.of("entity_objects")].asJsonObject(), EntityObjectType)
ENTITY_OBJECT_REGISTRY.initialize(registriesJson[ResourceLocation.of("entity_objects")].asJsonObject())
BLOCK_DATA_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation.of("block_data_data_types")].asJsonObject(), BlockDataDataType)
BLOCK_DATA_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation.of("block_data_data_types")].asJsonObject())
CONTAINER_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation.of("container_types")].asJsonObject(), ContainerType)
CONTAINER_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation.of("container_types")].asJsonObject())
GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation.of("game_events")].asJsonObject(), null)
WORLD_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation.of("world_events")].asJsonObject(), null)
GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation.of("game_events")].asJsonObject())
WORLD_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation.of("world_events")].asJsonObject())
CAT_VARIANT_REGISTRY.initialize(registriesJson[ResourceLocation.of("variants/cat")].asJsonObject(), CatVariant)
CAT_VARIANT_REGISTRY.initialize(registriesJson[ResourceLocation.of("variants/cat")].asJsonObject())
MESSAGE_TYPES_REGISTRY.initialize(registriesJson[minecraft("message_types")].asJsonObject(), ChatMessageType)
MESSAGE_TYPES_REGISTRY.initialize(registriesJson[minecraft("message_types")].asJsonObject())
VIBRATION_SOURCE.initialize(registriesJson[minecraft("vibration_source")].asJsonObject())
initialized = true
Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loaded default registries!" }

View File

@ -14,6 +14,7 @@
package de.bixilon.minosoft.data.registries.particle.data.vibration
import de.bixilon.minosoft.data.registries.factory.DefaultFactory
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_1_20_2
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
object VibrationSources : DefaultFactory<VibrationFactory<*>>(
@ -22,7 +23,7 @@ object VibrationSources : DefaultFactory<VibrationFactory<*>>(
) {
fun read(buffer: PlayInByteBuffer): VibrationSource {
val type = buffer.readResourceLocation()
val type = if (buffer.versionId <= V_1_20_2) buffer.readResourceLocation() else buffer.readRegistryItem(buffer.connection.registries.vibrationSource) // TODO: fix out version
val factory = this[type] ?: throw IllegalArgumentException("Can not find vibration source: $type")
return factory.read(buffer)

View File

@ -130,6 +130,7 @@ class Registries(
val containerType: Registry<ContainerType> = Registry(codec = ContainerType)
val gameEvent: ResourceLocationRegistry = ResourceLocationRegistry()
val worldEvent: ResourceLocationRegistry = ResourceLocationRegistry()
val vibrationSource: ResourceLocationRegistry = ResourceLocationRegistry()
val argumentType: ResourceLocationRegistry = ResourceLocationRegistry()
val messageType: Registry<ChatMessageType> = register("chat_type", Registry(codec = ChatMessageType))
@ -183,6 +184,7 @@ class Registries(
worker += WorkerTask(this::containerType.i) { containerType.update(pixlyzerData["container_types", "container_type"]?.toJsonObject(), version, this) }
worker += WorkerTask(this::gameEvent.i) { gameEvent.update(pixlyzerData["game_events"]?.toJsonObject(), version, this) }
worker += WorkerTask(this::worldEvent.i) { worldEvent.update(pixlyzerData["world_events"]?.toJsonObject(), version, this) }
worker += WorkerTask(this::vibrationSource.i) { vibrationSource.update(pixlyzerData["vibration_source"]?.toJsonObject(), version, this) }
worker += WorkerTask(this::argumentType.i) { argumentType.update(pixlyzerData["argument_type"]?.toJsonObject(), version, this) }
worker += WorkerTask(this::messageType.i) { messageType.update(pixlyzerData["message_types"]?.toJsonObject(), version, this) }

View File

@ -46,6 +46,7 @@ object RegistriesLoader {
gameEvent.parent = FallbackRegistries.GAME_EVENT_REGISTRY.forVersion(version)
worldEvent.parent = FallbackRegistries.WORLD_EVENT_REGISTRY.forVersion(version)
blockDataType.parent = FallbackRegistries.BLOCK_DATA_TYPE_REGISTRY.forVersion(version)
vibrationSource.parent = FallbackRegistries.VIBRATION_SOURCE.forVersion(version)
catVariants.parent = FallbackRegistries.CAT_VARIANT_REGISTRY.forVersion(version)
}
}

View File

@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.registries.registry
import de.bixilon.kutil.json.JsonUtil.toJsonObject
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.data.registries.registries.registry.codec.IdentifierCodec
import de.bixilon.minosoft.protocol.versions.Version
import de.bixilon.minosoft.protocol.versions.Versions
import java.util.*
@ -34,7 +33,7 @@ class PerVersionRegistry<E, R : AbstractRegistry<E>>(private val registryCreator
throw IllegalArgumentException("Can not find a registry for version $version")
}
fun initialize(data: Map<String, Any>, codec: IdentifierCodec<E>?) {
fun initialize(data: Map<String, Any>) {
check(!this::versions.isInitialized) { "Already initialized!" }
val versions: SortedMap<Int, R> = sortedMapOf({ t, t2 -> t2 - t })

View File

@ -14,7 +14,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play.world
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3d
import de.bixilon.minosoft.data.registries.particle.ParticleType
import de.bixilon.minosoft.data.registries.particle.data.ParticleData
import de.bixilon.minosoft.modding.event.events.ParticleSpawnEvent
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
@ -26,18 +25,8 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
class ParticleS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val type: ParticleType = if (buffer.versionId < ProtocolVersions.V_14W19A) {
buffer.readLegacyRegistryItem(buffer.connection.registries.particleType)!!
} else if (buffer.versionId >= ProtocolVersions.V_22W17A) { // ToDo: maybe this was even earlier, should only differ some snapshots
buffer.readRegistryItem(buffer.connection.registries.particleType)
} else {
buffer.connection.registries.particleType[buffer.readInt()]
}
val longDistance = if (buffer.versionId >= ProtocolVersions.V_14W29A) {
buffer.readBoolean()
} else {
false
}
val type = buffer.readParticleType()
val longDistance = if (buffer.versionId >= ProtocolVersions.V_14W29A) buffer.readBoolean() else false
val position: Vec3d = if (buffer.versionId < ProtocolVersions.V_1_15_PRE4) {
Vec3d(buffer.readVec3f())
} else {
@ -49,6 +38,12 @@ class ParticleS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val data: ParticleData = buffer.readParticleData(type)
private fun PlayInByteBuffer.readParticleType() = when {
versionId >= ProtocolVersions.V_22W17A -> readRegistryItem(connection.registries.particleType) // ToDo: maybe this was even earlier, should only differ some snapshots
versionId >= ProtocolVersions.V_14W19A -> connection.registries.particleType[readInt()]
else -> readLegacyRegistryItem(connection.registries.particleType)!!
}
override fun handle(connection: PlayConnection) {
if (!connection.profiles.particle.types.packet) {
return

View File

@ -767,5 +767,15 @@
}
}
}
},
"minecraft:vibration_source": {
"0": {
"minecraft:block": {
"id": 0
},
"minecraft:entity": {
"id": 1
}
}
}
}