From a8a01702ca9e44186a8c211987cfd53250278657 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 13 Jan 2023 17:52:32 +0700 Subject: [PATCH] re-re-re-redo datagen providers --- .../android/AndroidResearchDataProvider.kt | 26 +++++++++++--- .../ru/dbotthepony/mc/otm/core/WriteOnce.kt | 4 +-- .../mc/otm/matter/MatterDataProvider.kt | 34 ++++++++++++++----- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDataProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDataProvider.kt index 550c2a973..ad2635fa8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDataProvider.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDataProvider.kt @@ -4,14 +4,29 @@ import it.unimi.dsi.fastutil.objects.ObjectArraySet import net.minecraft.data.CachedOutput import net.minecraft.data.DataGenerator import net.minecraft.data.DataProvider +import net.minecraft.data.PackOutput import net.minecraft.resources.ResourceLocation +import net.minecraftforge.data.event.GatherDataEvent +import ru.dbotthepony.mc.otm.core.WriteOnce import java.util.Collections import java.util.LinkedList +import java.util.concurrent.CompletableFuture import java.util.function.Consumer @Suppress("unused") -open class AndroidResearchDataProvider(protected val dataGenerator: DataGenerator) : DataProvider { - protected val pathProvider: DataGenerator.PathProvider = dataGenerator.createPathProvider(DataGenerator.Target.DATA_PACK, AndroidResearchManager.DIRECTORY) +open class AndroidResearchDataProvider() : DataProvider { + var pathProvider: PackOutput.PathProvider by WriteOnce("You need to call bindPackOutput before registering this data provider") + private set + + constructor(output: PackOutput) : this() { + bindPackOutput(output) + } + + constructor(event: GatherDataEvent) : this(event.generator.packOutput) + + fun bindPackOutput(output: PackOutput) { + pathProvider = output.createPathProvider(PackOutput.Target.DATA_PACK, AndroidResearchManager.DIRECTORY) + } protected val callbacks = LinkedList<(Consumer) -> Unit>() @@ -35,15 +50,16 @@ open class AndroidResearchDataProvider(protected val dataGenerator: DataGenerato return this } - final override fun run(output: CachedOutput) { + final override fun run(output: CachedOutput): CompletableFuture<*> { AndroidResearchManager.fireRegistrationEvent() val set = ObjectArraySet() val added = LinkedList() + val futures = ArrayList>() addEverything { if (set.add(it.id)) { - DataProvider.saveStable(output, it.toJson(), pathProvider.json(it.id)) + futures.add(DataProvider.saveStable(output, it.toJson(), pathProvider.json(it.id))) AndroidResearchManager.put(it) added.add(it) } else { @@ -55,6 +71,8 @@ open class AndroidResearchDataProvider(protected val dataGenerator: DataGenerato value.validate() generated.add(value) } + + return CompletableFuture.allOf(*futures.toTypedArray()) } override fun getName(): String { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/WriteOnce.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/WriteOnce.kt index 2cd7c6c41..a4c8b047e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/WriteOnce.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/WriteOnce.kt @@ -3,11 +3,11 @@ package ru.dbotthepony.mc.otm.core import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty -class WriteOnce : ReadWriteProperty { +class WriteOnce(private val customMessage: String? = null) : ReadWriteProperty { private var value: V? = null override fun getValue(thisRef: Any?, property: KProperty<*>): V { - return checkNotNull(value) { "Property ${property.name} is not initialized" } + return checkNotNull(value) { customMessage ?: "Property ${property.name} is not initialized" } } override fun setValue(thisRef: Any?, property: KProperty<*>, value: V) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterDataProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterDataProvider.kt index e2a37e01d..3dc8a157b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterDataProvider.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterDataProvider.kt @@ -3,21 +3,35 @@ package ru.dbotthepony.mc.otm.matter import net.minecraft.data.CachedOutput import net.minecraft.data.DataGenerator import net.minecraft.data.DataProvider +import net.minecraft.data.PackOutput import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.level.ItemLike import net.minecraftforge.data.event.GatherDataEvent +import ru.dbotthepony.mc.otm.android.AndroidResearchManager import ru.dbotthepony.mc.otm.core.Decimal +import ru.dbotthepony.mc.otm.core.WriteOnce import ru.dbotthepony.mc.otm.core.registryName import java.util.Collections +import java.util.concurrent.CompletableFuture import java.util.function.Consumer @Suppress("FunctionName", "unused") -open class MatterDataProvider(protected val dataGenerator: DataGenerator, val namespace: String?) : DataProvider { - constructor(event: GatherDataEvent) : this(event.generator, event.modContainer.namespace) +open class MatterDataProvider(val modid: String? = null) : DataProvider { + var pathProvider: PackOutput.PathProvider by WriteOnce("You need to call bindPackOutput before registering this data provider") + private set + + constructor(output: PackOutput, modid: String? = null) : this(modid) { + bindPackOutput(output) + } + + constructor(event: GatherDataEvent) : this(event.generator.packOutput, event.modContainer.namespace) + + fun bindPackOutput(output: PackOutput) { + pathProvider = output.createPathProvider(PackOutput.Target.DATA_PACK, AndroidResearchManager.DIRECTORY) + } - protected val pathProvider: DataGenerator.PathProvider = dataGenerator.createPathProvider(DataGenerator.Target.DATA_PACK, MatterManager.MATTER_DIRECTORY) protected val actions = LinkedHashMap() sealed class Configuration(val name: ResourceLocation) { @@ -911,11 +925,11 @@ open class MatterDataProvider(protected val dataGenerator: DataGenerator, val na } protected fun updateLocation(input: ResourceLocation, prefix: String): ResourceLocation { - if (namespace != null) { - if (input.namespace == namespace) { + if (modid != null) { + if (input.namespace == modid) { return ResourceLocation(input.namespace, prefix + input.path) } else { - return ResourceLocation(namespace, prefix + input.namespace + "/" + input.path) + return ResourceLocation(modid, prefix + input.namespace + "/" + input.path) } } else { return ResourceLocation(input.namespace, prefix + input.path) @@ -1204,13 +1218,17 @@ open class MatterDataProvider(protected val dataGenerator: DataGenerator, val na protected val added = ArrayList() val addedView: List = Collections.unmodifiableList(added) - final override fun run(output: CachedOutput) { + final override fun run(output: CachedOutput): CompletableFuture<*> { addActions() + val promises = ArrayList>() + for ((key, value) in actions) { - DataProvider.saveStable(output, value.toJson(), pathProvider.json(key)) + promises.add(DataProvider.saveStable(output, value.toJson(), pathProvider.json(key))) added.add(value) } + + return CompletableFuture.allOf(*promises.toTypedArray()) } override fun getName(): String {