From 99a082436076602bf0eba0b0573d5bd189bafffe Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 11 Jun 2022 20:19:34 +0200 Subject: [PATCH] rename some registries, load registries async * motive is now motif * renamed *DataDataData* registries * Use TaskWorker to load registries --- .../types/registry/MotiveEntityDataType.kt | 8 +- .../entities/entities/decoration/Painting.kt | 10 +- .../data/registries/DefaultRegistries.kt | 4 +- .../data/registries/{Motive.kt => Motif.kt} | 8 +- .../data/registries/registries/Registries.kt | 100 +++++++++++------- .../registries/registries/RegistriesLoader.kt | 10 +- .../data/registries/versions/Version.kt | 5 +- .../minosoft/datafixer/RegistryFixer.kt | 1 + .../network/connection/play/PlayConnection.kt | 2 +- .../packets/s2c/play/block/BlockDataS2CP.kt | 2 +- .../play/entity/spawn/EntityPaintingS2CP.kt | 12 +-- .../protocol/protocol/PlayInByteBuffer.kt | 4 +- 12 files changed, 94 insertions(+), 72 deletions(-) rename src/main/java/de/bixilon/minosoft/data/registries/{Motive.kt => Motif.kt} (90%) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/data/types/registry/MotiveEntityDataType.kt b/src/main/java/de/bixilon/minosoft/data/entities/data/types/registry/MotiveEntityDataType.kt index d5300538b..10ae7ef57 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/data/types/registry/MotiveEntityDataType.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/data/types/registry/MotiveEntityDataType.kt @@ -13,12 +13,12 @@ package de.bixilon.minosoft.data.entities.data.types.registry -import de.bixilon.minosoft.data.registries.Motive +import de.bixilon.minosoft.data.registries.Motif import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer -object MotiveEntityDataType : RegistryEntityDataType { +object MotiveEntityDataType : RegistryEntityDataType { - override fun read(buffer: PlayInByteBuffer): Motive? { - return read(buffer, buffer.connection.registries.motiveRegistry) + override fun read(buffer: PlayInByteBuffer): Motif? { + return read(buffer, buffer.connection.registries.motifRegistry) } } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/Painting.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/Painting.kt index 233f2222e..86a12e6d3 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/Painting.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/Painting.kt @@ -20,7 +20,7 @@ import de.bixilon.minosoft.data.entities.data.EntityData import de.bixilon.minosoft.data.entities.data.EntityDataField import de.bixilon.minosoft.data.entities.entities.Entity import de.bixilon.minosoft.data.entities.entities.SynchronizedEntityData -import de.bixilon.minosoft.data.registries.Motive +import de.bixilon.minosoft.data.registries.Motif import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.entities.EntityFactory import de.bixilon.minosoft.data.registries.entities.EntityType @@ -34,16 +34,16 @@ class Painting( data: EntityData, position: Vec3i, @get:SynchronizedEntityData val direction: Directions, - val fixedMotive: Motive?, + val fixedMotif: Motif?, ) : Entity(connection, entityType, data, position.entityPosition, EntityRotation(0.0f, 0.0f)) { @get:SynchronizedEntityData - val motive: Motive? - get() = fixedMotive ?: data.get(MOTIVE_DATA, null) + val motif: Motif? + get() = fixedMotif ?: data.get(MOTIF_DATA, null) companion object : EntityFactory { override val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("painting") - private val MOTIVE_DATA = EntityDataField("MOTIVE") + private val MOTIF_DATA = EntityDataField("MOTIF", "MOTIVE") override fun build(connection: PlayConnection, entityType: EntityType, data: EntityData, position: Vec3d, rotation: EntityRotation): Painting { return Painting(connection, entityType, data, position.toVec3i(), Directions.NORTH, null) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt b/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt index 7b3e539b4..902a85439 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt @@ -45,7 +45,7 @@ object DefaultRegistries { val ARMOR_EQUIPMENT_SLOTS_REGISTRY = PerVersionEnumRegistry(InventorySlots.EquipmentSlots) val ARMOR_STAND_EQUIPMENT_SLOTS_REGISTRY = PerVersionEnumRegistry(InventorySlots.EquipmentSlots) - val ENTITY_DATA_DATA_TYPES_REGISTRY = PerVersionEnumRegistry(EntityDataDataTypes) + val ENTITY_DATA_TYPES_REGISTRY = PerVersionEnumRegistry(EntityDataDataTypes) val TITLE_ACTIONS_REGISTRY = PerVersionEnumRegistry(TitleS2CF.TitleActions) @@ -77,7 +77,7 @@ object DefaultRegistries { ARMOR_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_equipment_slots")].asJsonObject()) ARMOR_STAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_stand_equipment_slots")].asJsonObject()) - ENTITY_DATA_DATA_TYPES_REGISTRY.initialize(enumJson[ResourceLocation("entity_data_data_types")].asJsonObject()) // ToDo + ENTITY_DATA_TYPES_REGISTRY.initialize(enumJson[ResourceLocation("entity_data_data_types")].asJsonObject()) // ToDo TITLE_ACTIONS_REGISTRY.initialize(enumJson[ResourceLocation("title_actions")].asJsonObject()) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/Motive.kt b/src/main/java/de/bixilon/minosoft/data/registries/Motif.kt similarity index 90% rename from src/main/java/de/bixilon/minosoft/data/registries/Motive.kt rename to src/main/java/de/bixilon/minosoft/data/registries/Motif.kt index 645513e28..b090a15ed 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/Motive.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/Motif.kt @@ -17,7 +17,7 @@ import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.registries.registries.registry.RegistryItem import de.bixilon.minosoft.data.registries.registries.registry.codec.ResourceLocationCodec -data class Motive( +data class Motif( override val resourceLocation: ResourceLocation, val width: Int, val height: Int, @@ -27,9 +27,9 @@ data class Motive( return resourceLocation.full } - companion object : ResourceLocationCodec { - override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map): Motive { - return Motive( + companion object : ResourceLocationCodec { + override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map): Motif { + return Motif( resourceLocation = resourceLocation, width = data["width"].unsafeCast(), height = data["height"].unsafeCast(), 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 88d0dead2..d6636f8d0 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 @@ -14,9 +14,13 @@ package de.bixilon.minosoft.data.registries.registries import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.kutil.concurrent.pool.DefaultThreadPool +import de.bixilon.kutil.concurrent.worker.TaskWorker +import de.bixilon.kutil.concurrent.worker.tasks.Task import de.bixilon.kutil.json.JsonObject import de.bixilon.kutil.json.JsonUtil.asJsonObject import de.bixilon.kutil.json.JsonUtil.toJsonObject +import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.minosoft.data.container.InventorySlots import de.bixilon.minosoft.data.entities.block.BlockDataDataType import de.bixilon.minosoft.data.entities.data.EntityDataField @@ -61,7 +65,7 @@ import java.lang.reflect.Field class Registries { val registries: MutableMap> = mutableMapOf() var shapes: MutableList = mutableListOf() - val motiveRegistry: Registry = register("motive", Registry(codec = Motive)) + val motifRegistry: Registry = register("motif", Registry(codec = Motif)) val blockRegistry: Registry = register("block", Registry(flattened = true, codec = Block, metaType = MetaTypes.BLOCKS)) val itemRegistry: ItemRegistry = register("item", ItemRegistry()) val enchantmentRegistry: Registry = register("enchantment", Registry(codec = Enchantment)) @@ -86,7 +90,7 @@ class Registries { val armorEquipmentSlotRegistry: EnumRegistry = EnumRegistry(values = InventorySlots.EquipmentSlots) val armorStandEquipmentSlotRegistry: EnumRegistry = EnumRegistry(values = InventorySlots.EquipmentSlots) - val entityDataDataDataTypesRegistry: EnumRegistry = EnumRegistry(values = EntityDataDataTypes) + val entityDataTypesRegistry: EnumRegistry = EnumRegistry(values = EntityDataDataTypes) val titleActionsRegistry: EnumRegistry = EnumRegistry(values = TitleS2CF.TitleActions) @@ -103,7 +107,7 @@ class Registries { val entityTypeRegistry: Registry = register("entity_type", Registry(codec = EntityType)) val blockEntityTypeRegistry = BlockEntityTypeRegistry() - val blockDataDataDataTypeRegistry: Registry = Registry(codec = BlockDataDataType) + val blockDataTypeRegistry: Registry = Registry(codec = BlockDataDataType) val containerTypeRegistry: Registry = Registry(codec = ContainerType) val gameEventRegistry: ResourceLocationRegistry = ResourceLocationRegistry() @@ -130,68 +134,84 @@ class Registries { return entityDataIndexMap[field] ?: parentRegistries?.getEntityDataIndex(field) } - fun load(version: Version, pixlyzerData: Map) { + fun load(version: Version, pixlyzerData: Map, latch: CountUpAndDownLatch) { isFlattened = version.flattened blockRegistry.flattened = isFlattened blockStateRegistry.flattened = isFlattened itemRegistry.flattened = isFlattened - // pre init stuff - loadShapes(pixlyzerData["shapes"]?.toJsonObject()) + var error: Throwable? = null + val worker = TaskWorker(errorHandler = { _, it -> if (error != null) error = it }, criticalErrorHandler = { _, it -> if (error != null) error = it }) // enums - equipmentSlotRegistry.initialize(pixlyzerData["equipment_slots"]) - handEquipmentSlotRegistry.initialize(pixlyzerData["hand_equipment_slots"]) - armorEquipmentSlotRegistry.initialize(pixlyzerData["armor_equipment_slots"]) - armorStandEquipmentSlotRegistry.initialize(pixlyzerData["armor_stand_equipment_slots"]) + worker += Task(shapes) { loadShapes(pixlyzerData["shapes"]?.toJsonObject()) } - entityDataDataDataTypesRegistry.initialize(pixlyzerData["entity_data_data_types"]) + worker += Task(equipmentSlotRegistry) { equipmentSlotRegistry.initialize(pixlyzerData["equipment_slots"]) } + worker += Task(handEquipmentSlotRegistry) { handEquipmentSlotRegistry.initialize(pixlyzerData["hand_equipment_slots"]) } + worker += Task(armorEquipmentSlotRegistry) { armorEquipmentSlotRegistry.initialize(pixlyzerData["armor_equipment_slots"]) } + worker += Task(armorStandEquipmentSlotRegistry) { armorStandEquipmentSlotRegistry.initialize(pixlyzerData["armor_stand_equipment_slots"]) } - titleActionsRegistry.initialize(pixlyzerData["title_actions"]) - entityAnimationRegistry.initialize(pixlyzerData["entity_animations"]) - entityActionsRegistry.initialize(pixlyzerData["entity_actions"]) + worker += Task(entityDataTypesRegistry) { entityDataTypesRegistry.initialize(pixlyzerData["entity_data_data_types"]) } + + worker += Task(titleActionsRegistry) { titleActionsRegistry.initialize(pixlyzerData["title_actions"]) } + worker += Task(entityAnimationRegistry) { entityAnimationRegistry.initialize(pixlyzerData["entity_animations"]) } + worker += Task(entityActionsRegistry) { entityActionsRegistry.initialize(pixlyzerData["entity_actions"]) } // id stuff - biomeCategoryRegistry.update(pixlyzerData["biome_categories"]?.unsafeCast(), this) - biomePrecipitationRegistry.update(pixlyzerData["biome_precipitations"]?.unsafeCast(), this) + worker += Task(biomeCategoryRegistry) { biomeCategoryRegistry.update(pixlyzerData["biome_categories"]?.unsafeCast(), this) } + worker += Task(biomePrecipitationRegistry) { biomePrecipitationRegistry.update(pixlyzerData["biome_precipitations"]?.unsafeCast(), this) } // id resource location stuff - containerTypeRegistry.rawUpdate(pixlyzerData["container_types"]?.toJsonObject(), this) - gameEventRegistry.rawUpdate(pixlyzerData["game_events"]?.toJsonObject(), this) - worldEventRegistry.rawUpdate(pixlyzerData["world_events"]?.toJsonObject(), this) - argumentTypeRegistry.rawUpdate(pixlyzerData["argument_type"]?.toJsonObject(), this) + worker += Task(containerTypeRegistry) { containerTypeRegistry.rawUpdate(pixlyzerData["container_types"]?.toJsonObject(), this) } + worker += Task(gameEventRegistry) { gameEventRegistry.rawUpdate(pixlyzerData["game_events"]?.toJsonObject(), this) } + worker += Task(worldEventRegistry) { worldEventRegistry.rawUpdate(pixlyzerData["world_events"]?.toJsonObject(), this) } + worker += Task(argumentTypeRegistry) { argumentTypeRegistry.rawUpdate(pixlyzerData["argument_type"]?.toJsonObject(), this) } - entityTypeRegistry.rawUpdate(pixlyzerData["entities"]?.toJsonObject(), this) + worker += Task(entityTypeRegistry) { entityTypeRegistry.rawUpdate(pixlyzerData["entities"]?.toJsonObject(), this) } - 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) - statusEffectRegistry.rawUpdate(pixlyzerData["status_effects"]?.toJsonObject(), this) - biomeRegistry.rawUpdate(pixlyzerData["biomes"]?.toJsonObject(), this) - dimensionRegistry.rawUpdate(pixlyzerData["dimensions"]?.toJsonObject(), this) - fluidRegistry.rawUpdate(pixlyzerData["fluids"]?.toJsonObject(), this) - blockRegistry.rawUpdate(pixlyzerData["blocks"]?.toJsonObject(), this) - itemRegistry.rawUpdate(pixlyzerData["items"]?.toJsonObject(), this) + worker += Task(motifRegistry) { motifRegistry.rawUpdate(pixlyzerData["motives"]?.toJsonObject(), this) } + worker += Task(soundEventRegistry) { soundEventRegistry.rawUpdate(pixlyzerData["sound_events"]?.toJsonObject(), null) } + worker += Task(soundGroupRegistry, dependencies = arrayOf(soundEventRegistry)) { soundGroupRegistry.update(pixlyzerData["sound_groups"]?.unsafeCast(), this) } + worker += Task(particleTypeRegistry) { particleTypeRegistry.rawUpdate(pixlyzerData["particles"]?.toJsonObject(), this) } + worker += Task(materialRegistry) { materialRegistry.rawUpdate(pixlyzerData["materials"]?.toJsonObject(), this) } + worker += Task(enchantmentRegistry) { enchantmentRegistry.rawUpdate(pixlyzerData["enchantments"]?.toJsonObject(), this) } + worker += Task(statusEffectRegistry) { statusEffectRegistry.rawUpdate(pixlyzerData["status_effects"]?.toJsonObject(), this) } + worker += Task(biomeRegistry, dependencies = arrayOf(biomeCategoryRegistry, biomePrecipitationRegistry)) { biomeRegistry.rawUpdate(pixlyzerData["biomes"]?.toJsonObject(), this) } + worker += Task(dimensionRegistry) { dimensionRegistry.rawUpdate(pixlyzerData["dimensions"]?.toJsonObject(), this) } + worker += Task(fluidRegistry) { fluidRegistry.rawUpdate(pixlyzerData["fluids"]?.toJsonObject(), this) } + worker += Task(blockRegistry, dependencies = arrayOf(fluidRegistry, shapes)) { blockRegistry.rawUpdate(pixlyzerData["blocks"]?.toJsonObject(), this) } + worker += Task(itemRegistry, dependencies = arrayOf(blockRegistry, entityTypeRegistry, fluidRegistry, statusEffectRegistry)) { itemRegistry.rawUpdate(pixlyzerData["items"]?.toJsonObject(), this) } - blockEntityTypeRegistry.rawUpdate(pixlyzerData["block_entities"]?.toJsonObject(), this) + worker += Task(blockEntityTypeRegistry, dependencies = arrayOf(blockRegistry)) { blockEntityTypeRegistry.rawUpdate(pixlyzerData["block_entities"]?.toJsonObject(), this) } - villagerProfessionRegistry.rawUpdate(pixlyzerData["villager_professions"]?.toJsonObject(), this) - villagerTypeRegistry.rawUpdate(pixlyzerData["villager_types"]?.toJsonObject(), null) + worker += Task(villagerProfessionRegistry) { villagerProfessionRegistry.rawUpdate(pixlyzerData["villager_professions"]?.toJsonObject(), this) } + worker += Task(villagerTypeRegistry) { villagerTypeRegistry.rawUpdate(pixlyzerData["villager_types"]?.toJsonObject(), null) } - blockDataDataDataTypeRegistry.rawUpdate(pixlyzerData["block_data_data_types"]?.toJsonObject(), this) + worker += Task(blockDataTypeRegistry) { blockDataTypeRegistry.rawUpdate(pixlyzerData["block_data_data_types"]?.toJsonObject(), this) } - catVariants.rawUpdate(pixlyzerData["variant/cat"]?.toJsonObject(), this) - frogVariants.rawUpdate(pixlyzerData["variant/frog"]?.toJsonObject(), this) + worker += Task(catVariants) { catVariants.rawUpdate(pixlyzerData["variant/cat"]?.toJsonObject(), this) } + worker += Task(frogVariants) { frogVariants.rawUpdate(pixlyzerData["variant/frog"]?.toJsonObject(), this) } + val inner = CountUpAndDownLatch(1, latch) + worker.work(inner) + inner.dec() + while (inner.count > 0) { + val error2 = error + if (error2 != null) { + throw error2 + } + inner.waitForChange() + } // post init + inner.inc() for (field in TYPE_MAP.values) { - field.get(this).unsafeCast>().postInit(this) + inner.inc() + DefaultThreadPool += { field.get(this).unsafeCast>().postInit(this); inner.dec() } } + inner.dec() + inner.await() isFullyLoaded = true shapes.clear() } 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 4d809c6e1..c5d196e7d 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 @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.registries.registries import de.bixilon.kutil.json.JsonUtil.toJsonObject +import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.string.StringUtil.formatPlaceholder import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties import de.bixilon.minosoft.assets.util.FileAssetsUtil @@ -27,24 +28,23 @@ import java.io.File object RegistriesLoader { - fun load(profile: ResourcesProfile, version: Version): Registries { + fun load(profile: ResourcesProfile, version: Version, latch: CountUpAndDownLatch): Registries { val registries = Registries() if (!version.flattened) { // ToDo: Pre flattening support - return registries throw PreFlatteningLoadingError() } val pixlyzerHash = AssetsVersionProperties[version]?.pixlyzerHash ?: throw IllegalStateException("$version has no pixlyzer data available!") val pixlyzerData = getPixlyzerData(profile.source.pixlyzer, pixlyzerHash) - registries.load(version, pixlyzerData) + registries.load(version, pixlyzerData, latch) registries.equipmentSlotRegistry.parent = DefaultRegistries.EQUIPMENT_SLOTS_REGISTRY.forVersion(version) registries.handEquipmentSlotRegistry.parent = DefaultRegistries.HAND_EQUIPMENT_SLOTS_REGISTRY.forVersion(version) registries.armorEquipmentSlotRegistry.parent = DefaultRegistries.ARMOR_EQUIPMENT_SLOTS_REGISTRY.forVersion(version) registries.armorStandEquipmentSlotRegistry.parent = DefaultRegistries.ARMOR_STAND_EQUIPMENT_SLOTS_REGISTRY.forVersion(version) - registries.entityDataDataDataTypesRegistry.parent = DefaultRegistries.ENTITY_DATA_DATA_TYPES_REGISTRY.forVersion(version) + registries.entityDataTypesRegistry.parent = DefaultRegistries.ENTITY_DATA_TYPES_REGISTRY.forVersion(version) registries.titleActionsRegistry.parent = DefaultRegistries.TITLE_ACTIONS_REGISTRY.forVersion(version) registries.entityAnimationRegistry.parent = DefaultRegistries.ENTITY_ANIMATION_REGISTRY.forVersion(version) registries.entityActionsRegistry.parent = DefaultRegistries.ENTITY_ACTIONS_REGISTRY.forVersion(version) @@ -52,7 +52,7 @@ object RegistriesLoader { registries.containerTypeRegistry.parent = DefaultRegistries.CONTAINER_TYPE_REGISTRY.forVersion(version) registries.gameEventRegistry.parent = DefaultRegistries.GAME_EVENT_REGISTRY.forVersion(version) registries.worldEventRegistry.parent = DefaultRegistries.WORLD_EVENT_REGISTRY.forVersion(version) - registries.blockDataDataDataTypeRegistry.parent = DefaultRegistries.BLOCK_DATA_TYPE_REGISTRY.forVersion(version) + registries.blockDataTypeRegistry.parent = DefaultRegistries.BLOCK_DATA_TYPE_REGISTRY.forVersion(version) registries.catVariants.parent = DefaultRegistries.CAT_VARIANT_REGISTRY.forVersion(version) return registries diff --git a/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt b/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt index 9f56d48d0..4babc4513 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.registries.versions import de.bixilon.kutil.collections.map.bi.AbstractBiMap +import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.primitive.BooleanUtil.decide import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile import de.bixilon.minosoft.data.registries.registries.Registries @@ -39,12 +40,12 @@ class Version( @Synchronized - fun load(profile: ResourcesProfile) { + fun load(profile: ResourcesProfile, latch: CountUpAndDownLatch) { if (registries != null) { // already loaded return } - registries = RegistriesLoader.load(profile, this) + registries = RegistriesLoader.load(profile, this, latch) } @Synchronized diff --git a/src/main/java/de/bixilon/minosoft/datafixer/RegistryFixer.kt b/src/main/java/de/bixilon/minosoft/datafixer/RegistryFixer.kt index 63733d413..164d320cd 100644 --- a/src/main/java/de/bixilon/minosoft/datafixer/RegistryFixer.kt +++ b/src/main/java/de/bixilon/minosoft/datafixer/RegistryFixer.kt @@ -19,6 +19,7 @@ import de.bixilon.minosoft.datafixer.DataFixerUtil.asResourceLocationMap object RegistryFixer { private val RENAMES: Map = mapOf( "dimension" to "dimension_type", + "motive" to "motif", ).asResourceLocationMap() fun ResourceLocation.fix(): ResourceLocation { diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt index ecd35d1d1..74bed1863 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt @@ -164,7 +164,7 @@ class PlayConnection( try { state = PlayConnectionStates.LOADING_ASSETS fireEvent(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.PRE)) - version.load(profiles.resources) + version.load(profiles.resources, latch) registries.parentRegistries = version.registries Log.log(LogMessageType.ASSETS, LogLevels.INFO) { "Downloading and verifying assets. This might take a while..." } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt index 292a33340..4ce1df728 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt @@ -35,7 +35,7 @@ class BlockDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { val type = if (buffer.versionId >= V_21W37A) { buffer.connection.registries.blockEntityTypeRegistry[buffer.readVarInt()].resourceLocation } else { - buffer.connection.registries.blockDataDataDataTypeRegistry[buffer.readUnsignedByte()].resourceLocation + buffer.connection.registries.blockDataTypeRegistry[buffer.readUnsignedByte()].resourceLocation } val nbt = buffer.readNBT().toJsonObject() diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/spawn/EntityPaintingS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/spawn/EntityPaintingS2CP.kt index bfd35b3c1..df5c89cd3 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/spawn/EntityPaintingS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/spawn/EntityPaintingS2CP.kt @@ -17,7 +17,7 @@ import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.direction.Directions.Companion.byId import de.bixilon.minosoft.data.entities.data.EntityData import de.bixilon.minosoft.data.entities.entities.decoration.Painting -import de.bixilon.minosoft.data.registries.Motive +import de.bixilon.minosoft.data.registries.Motif import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket @@ -41,10 +41,10 @@ class EntityPaintingS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { init { - val motive: Motive? = if (buffer.versionId < ProtocolVersions.V_18W02A) { - buffer.connection.registries.motiveRegistry[buffer.readResourceLocation()] + val motif: Motif? = if (buffer.versionId < ProtocolVersions.V_18W02A) { + buffer.connection.registries.motifRegistry[buffer.readResourceLocation()] } else { - buffer.connection.registries.motiveRegistry[buffer.readVarInt()] + buffer.connection.registries.motifRegistry[buffer.readVarInt()] } val position: Vec3i val direction: Directions @@ -55,7 +55,7 @@ class EntityPaintingS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { position = buffer.readBlockPosition() direction = byId(buffer.readUnsignedByte()) } - entity = Painting(buffer.connection, buffer.connection.registries.entityTypeRegistry[Painting.RESOURCE_LOCATION]!!, EntityData(buffer.connection), position, direction, motive!!) + entity = Painting(buffer.connection, buffer.connection.registries.entityTypeRegistry[Painting.RESOURCE_LOCATION]!!, EntityData(buffer.connection), position, direction, motif!!) } override fun handle(connection: PlayConnection) { @@ -65,6 +65,6 @@ class EntityPaintingS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { } override fun log(reducedLog: Boolean) { - Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Entity painting (entityId=$entityId, motive=${entity.motive}, direction=${entity.direction})" } + Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Entity painting (entityId=$entityId, motive=${entity.motif}, direction=${entity.direction})" } } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt index 89a51e59e..e12e189c8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt @@ -190,7 +190,7 @@ class PlayInByteBuffer : InByteBuffer { var item = readUnsignedByte() while (item != 0x7F) { val index = item and 0x1F - val type = connection.registries.entityDataDataDataTypesRegistry[item and 0xFF shr 5]!! + val type = connection.registries.entityDataTypesRegistry[item and 0xFF shr 5]!! data[index] = type.type.read(this) item = readUnsignedByte() } @@ -202,7 +202,7 @@ class PlayInByteBuffer : InByteBuffer { } else { readVarInt() } - val type = connection.registries.entityDataDataDataTypesRegistry[id] ?: throw IllegalArgumentException("Can not get entity data type (id=$id)") + val type = connection.registries.entityDataTypesRegistry[id] ?: throw IllegalArgumentException("Can not get entity data type (id=$id)") data[index] = type.type.read(this) index = readUnsignedByte() }