re-re-re-redo datagen providers

This commit is contained in:
DBotThePony 2023-01-13 17:52:32 +07:00
parent afcbaf75ae
commit a8a01702ca
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 50 additions and 14 deletions

View File

@ -4,14 +4,29 @@ import it.unimi.dsi.fastutil.objects.ObjectArraySet
import net.minecraft.data.CachedOutput import net.minecraft.data.CachedOutput
import net.minecraft.data.DataGenerator import net.minecraft.data.DataGenerator
import net.minecraft.data.DataProvider import net.minecraft.data.DataProvider
import net.minecraft.data.PackOutput
import net.minecraft.resources.ResourceLocation 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.Collections
import java.util.LinkedList import java.util.LinkedList
import java.util.concurrent.CompletableFuture
import java.util.function.Consumer import java.util.function.Consumer
@Suppress("unused") @Suppress("unused")
open class AndroidResearchDataProvider(protected val dataGenerator: DataGenerator) : DataProvider { open class AndroidResearchDataProvider() : DataProvider {
protected val pathProvider: DataGenerator.PathProvider = dataGenerator.createPathProvider(DataGenerator.Target.DATA_PACK, AndroidResearchManager.DIRECTORY) 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<AndroidResearchType>) -> Unit>() protected val callbacks = LinkedList<(Consumer<AndroidResearchType>) -> Unit>()
@ -35,15 +50,16 @@ open class AndroidResearchDataProvider(protected val dataGenerator: DataGenerato
return this return this
} }
final override fun run(output: CachedOutput) { final override fun run(output: CachedOutput): CompletableFuture<*> {
AndroidResearchManager.fireRegistrationEvent() AndroidResearchManager.fireRegistrationEvent()
val set = ObjectArraySet<ResourceLocation>() val set = ObjectArraySet<ResourceLocation>()
val added = LinkedList<AndroidResearchType>() val added = LinkedList<AndroidResearchType>()
val futures = ArrayList<CompletableFuture<*>>()
addEverything { addEverything {
if (set.add(it.id)) { 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) AndroidResearchManager.put(it)
added.add(it) added.add(it)
} else { } else {
@ -55,6 +71,8 @@ open class AndroidResearchDataProvider(protected val dataGenerator: DataGenerato
value.validate() value.validate()
generated.add(value) generated.add(value)
} }
return CompletableFuture.allOf(*futures.toTypedArray())
} }
override fun getName(): String { override fun getName(): String {

View File

@ -3,11 +3,11 @@ package ru.dbotthepony.mc.otm.core
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
class WriteOnce<V> : ReadWriteProperty<Any?, V> { class WriteOnce<V>(private val customMessage: String? = null) : ReadWriteProperty<Any?, V> {
private var value: V? = null private var value: V? = null
override fun getValue(thisRef: Any?, property: KProperty<*>): V { 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) { override fun setValue(thisRef: Any?, property: KProperty<*>, value: V) {

View File

@ -3,21 +3,35 @@ package ru.dbotthepony.mc.otm.matter
import net.minecraft.data.CachedOutput import net.minecraft.data.CachedOutput
import net.minecraft.data.DataGenerator import net.minecraft.data.DataGenerator
import net.minecraft.data.DataProvider import net.minecraft.data.DataProvider
import net.minecraft.data.PackOutput
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.tags.TagKey import net.minecraft.tags.TagKey
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.minecraftforge.data.event.GatherDataEvent 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.Decimal
import ru.dbotthepony.mc.otm.core.WriteOnce
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import java.util.Collections import java.util.Collections
import java.util.concurrent.CompletableFuture
import java.util.function.Consumer import java.util.function.Consumer
@Suppress("FunctionName", "unused") @Suppress("FunctionName", "unused")
open class MatterDataProvider(protected val dataGenerator: DataGenerator, val namespace: String?) : DataProvider { open class MatterDataProvider(val modid: String? = null) : DataProvider {
constructor(event: GatherDataEvent) : this(event.generator, event.modContainer.namespace) 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<ResourceLocation, AbstractRegistryAction>() protected val actions = LinkedHashMap<ResourceLocation, AbstractRegistryAction>()
sealed class Configuration(val name: ResourceLocation) { 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 { protected fun updateLocation(input: ResourceLocation, prefix: String): ResourceLocation {
if (namespace != null) { if (modid != null) {
if (input.namespace == namespace) { if (input.namespace == modid) {
return ResourceLocation(input.namespace, prefix + input.path) return ResourceLocation(input.namespace, prefix + input.path)
} else { } else {
return ResourceLocation(namespace, prefix + input.namespace + "/" + input.path) return ResourceLocation(modid, prefix + input.namespace + "/" + input.path)
} }
} else { } else {
return ResourceLocation(input.namespace, prefix + input.path) return ResourceLocation(input.namespace, prefix + input.path)
@ -1204,13 +1218,17 @@ open class MatterDataProvider(protected val dataGenerator: DataGenerator, val na
protected val added = ArrayList<AbstractRegistryAction>() protected val added = ArrayList<AbstractRegistryAction>()
val addedView: List<AbstractRegistryAction> = Collections.unmodifiableList(added) val addedView: List<AbstractRegistryAction> = Collections.unmodifiableList(added)
final override fun run(output: CachedOutput) { final override fun run(output: CachedOutput): CompletableFuture<*> {
addActions() addActions()
val promises = ArrayList<CompletableFuture<*>>()
for ((key, value) in actions) { 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) added.add(value)
} }
return CompletableFuture.allOf(*promises.toTypedArray())
} }
override fun getName(): String { override fun getName(): String {