From c24c92aa2941e9c70e244191484d2b85a0726a19 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 14 Dec 2023 18:04:12 +0100 Subject: [PATCH] vibration source registry fixes network packet reading of ParticleS2CP in > 1.12.2? --- .../registries/fallback/FallbackRegistries.kt | 18 +++++++++------- .../data/vibration/VibrationSources.kt | 3 ++- .../data/registries/registries/Registries.kt | 2 ++ .../registries/registries/RegistriesLoader.kt | 1 + .../registries/registry/PerVersionRegistry.kt | 3 +-- .../packets/s2c/play/world/ParticleS2CP.kt | 21 +++++++------------ .../minosoft/mapping/default_registries.json | 10 +++++++++ 7 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fallback/FallbackRegistries.kt b/src/main/java/de/bixilon/minosoft/data/registries/fallback/FallbackRegistries.kt index f8abbf048..49621be4e 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fallback/FallbackRegistries.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fallback/FallbackRegistries.kt @@ -70,6 +70,7 @@ object FallbackRegistries { val MESSAGE_TYPES_REGISTRY: PerVersionRegistry> = PerVersionRegistry { Registry(codec = ChatMessageType) } + val VIBRATION_SOURCE: PerVersionRegistry = PerVersionRegistry { ResourceLocationRegistry() } fun load() { @@ -93,21 +94,22 @@ object FallbackRegistries { val registriesJson: Map = 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!" } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/particle/data/vibration/VibrationSources.kt b/src/main/java/de/bixilon/minosoft/data/registries/particle/data/vibration/VibrationSources.kt index 01b33bccf..8fa5fa5b6 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/particle/data/vibration/VibrationSources.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/particle/data/vibration/VibrationSources.kt @@ -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>( @@ -22,7 +23,7 @@ object VibrationSources : DefaultFactory>( ) { 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) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt index 6079403fc..8c971852c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt @@ -130,6 +130,7 @@ class Registries( val containerType: Registry = Registry(codec = ContainerType) val gameEvent: ResourceLocationRegistry = ResourceLocationRegistry() val worldEvent: ResourceLocationRegistry = ResourceLocationRegistry() + val vibrationSource: ResourceLocationRegistry = ResourceLocationRegistry() val argumentType: ResourceLocationRegistry = ResourceLocationRegistry() val messageType: Registry = 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) } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt index 492935594..ad017ef68 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt @@ -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) } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.kt index 4d21073d1..59c8db3fa 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.kt @@ -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>(private val registryCreator throw IllegalArgumentException("Can not find a registry for version $version") } - fun initialize(data: Map, codec: IdentifierCodec?) { + fun initialize(data: Map) { check(!this::versions.isInitialized) { "Already initialized!" } val versions: SortedMap = sortedMapOf({ t, t2 -> t2 - t }) diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/world/ParticleS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/world/ParticleS2CP.kt index 5738c1362..ca326cdf3 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/world/ParticleS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/world/ParticleS2CP.kt @@ -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 diff --git a/src/main/resources/assets/minosoft/mapping/default_registries.json b/src/main/resources/assets/minosoft/mapping/default_registries.json index efdea0489..07c38f4c0 100644 --- a/src/main/resources/assets/minosoft/mapping/default_registries.json +++ b/src/main/resources/assets/minosoft/mapping/default_registries.json @@ -767,5 +767,15 @@ } } } + }, + "minecraft:vibration_source": { + "0": { + "minecraft:block": { + "id": 0 + }, + "minecraft:entity": { + "id": 1 + } + } } }