Update tags datagen

This commit is contained in:
DBotThePony 2023-04-26 07:41:32 +07:00
parent 3722d896f6
commit e60dda4810
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 160 additions and 169 deletions

View File

@ -47,10 +47,10 @@ fun addTags(tagsProvider: TagsProvider) {
MBlocks.STORAGE_CABLE MBlocks.STORAGE_CABLE
) )
tagsProvider.items.appender(MItemTags.CRAFTING_TABLES).add(Items.CRAFTING_TABLE) tagsProvider.items.Appender(MItemTags.CRAFTING_TABLES).add(Items.CRAFTING_TABLE)
tagsProvider.blocks.appender(MBlockTags.CRAFTING_TABLES).add(Blocks.CRAFTING_TABLE) tagsProvider.blocks.Appender(MBlockTags.CRAFTING_TABLES).add(Blocks.CRAFTING_TABLE)
tagsProvider.items.appender(MItemTags.MINECART_CARGO_CRATES).add(MItems.CARGO_CRATE_MINECARTS.values) tagsProvider.items.Appender(MItemTags.MINECART_CARGO_CRATES).add(MItems.CARGO_CRATE_MINECARTS.values)
tagsProvider.items.forge("hardened_glass").add(MRegistry.INDUSTRIAL_GLASS.allItems.values) tagsProvider.items.forge("hardened_glass").add(MRegistry.INDUSTRIAL_GLASS.allItems.values)
tagsProvider.items.forge("hardened_glass/colorless").add(MRegistry.INDUSTRIAL_GLASS.item) tagsProvider.items.forge("hardened_glass/colorless").add(MRegistry.INDUSTRIAL_GLASS.item)
@ -74,25 +74,25 @@ fun addTags(tagsProvider: TagsProvider) {
MRegistry.INDUSTRIAL_GLASS.forEachBlock { s, _, block -> tagsProvider.blocks.forge("hardened_glass/$s").add(block) } MRegistry.INDUSTRIAL_GLASS.forEachBlock { s, _, block -> tagsProvider.blocks.forge("hardened_glass/$s").add(block) }
MRegistry.INDUSTRIAL_GLASS_PANE.forEachBlock { s, _, block -> tagsProvider.blocks.forge("hardened_glass_panes/$s").add(block) } MRegistry.INDUSTRIAL_GLASS_PANE.forEachBlock { s, _, block -> tagsProvider.blocks.forge("hardened_glass_panes/$s").add(block) }
tagsProvider.items.appender(MItemTags.INDUSTRIAL_GLASS).add(MRegistry.INDUSTRIAL_GLASS.allItems.values) tagsProvider.items.Appender(MItemTags.INDUSTRIAL_GLASS).add(MRegistry.INDUSTRIAL_GLASS.allItems.values)
tagsProvider.blocks.appender(MBlockTags.INDUSTRIAL_GLASS).add(MRegistry.INDUSTRIAL_GLASS.allBlocks.values) tagsProvider.blocks.Appender(MBlockTags.INDUSTRIAL_GLASS).add(MRegistry.INDUSTRIAL_GLASS.allBlocks.values)
tagsProvider.blocks.appender(MBlockTags.CARGO_CRATES).add(MRegistry.CARGO_CRATES.allBlocks.values) tagsProvider.blocks.Appender(MBlockTags.CARGO_CRATES).add(MRegistry.CARGO_CRATES.allBlocks.values)
tagsProvider.items.appender(ItemTags.DOORS).add(MItems.TRITANIUM_DOOR.values) tagsProvider.items.Appender(ItemTags.DOORS).add(MItems.TRITANIUM_DOOR.values)
tagsProvider.blocks.appender(BlockTags.DOORS).add(MBlocks.TRITANIUM_DOOR.values) tagsProvider.blocks.Appender(BlockTags.DOORS).add(MBlocks.TRITANIUM_DOOR.values)
tagsProvider.items.appender(ItemTags.TRAPDOORS).add(MItems.TRITANIUM_TRAPDOOR.values) tagsProvider.items.Appender(ItemTags.TRAPDOORS).add(MItems.TRITANIUM_TRAPDOOR.values)
tagsProvider.blocks.appender(BlockTags.TRAPDOORS).add(MBlocks.TRITANIUM_TRAPDOOR.values) tagsProvider.blocks.Appender(BlockTags.TRAPDOORS).add(MBlocks.TRITANIUM_TRAPDOOR.values)
tagsProvider.blocks.appender(BlockTags.PRESSURE_PLATES).add(MRegistry.TRITANIUM_PRESSURE_PLATE.allBlocks.values) tagsProvider.blocks.Appender(BlockTags.PRESSURE_PLATES).add(MRegistry.TRITANIUM_PRESSURE_PLATE.allBlocks.values)
tagsProvider.items.appender(MItemTags.MACHINES).add(MItems.MACHINES) tagsProvider.items.Appender(MItemTags.MACHINES).add(MItems.MACHINES)
tagsProvider.blocks.appender(MBlockTags.MACHINES).add(MItems.MACHINES.stream().map { it!!.block }) tagsProvider.blocks.Appender(MBlockTags.MACHINES).add(MItems.MACHINES.stream().map { it!!.block })
tagsProvider.blocks.appender(BlockTags.ANVIL).add(MBlocks.TRITANIUM_ANVIL) tagsProvider.blocks.Appender(BlockTags.ANVIL).add(MBlocks.TRITANIUM_ANVIL)
tagsProvider.items.appender(MItemTags.TRITANIUM_NUGGETS).add(MItems.TRITANIUM_NUGGET) tagsProvider.items.Appender(MItemTags.TRITANIUM_NUGGETS).add(MItems.TRITANIUM_NUGGET)
tagsProvider.items.appender(MItemTags.NUGGETS).add(MItems.TRITANIUM_NUGGET) tagsProvider.items.Appender(MItemTags.NUGGETS).add(MItems.TRITANIUM_NUGGET)
tagsProvider.items.forge("armors") tagsProvider.items.forge("armors")
.add("helmets", MItems.TRITANIUM_HELMET) .add("helmets", MItems.TRITANIUM_HELMET)
@ -113,30 +113,30 @@ fun addTags(tagsProvider: TagsProvider) {
.add("shields", MItems.TRITANIUM_SHIELD) .add("shields", MItems.TRITANIUM_SHIELD)
tagsProvider.items.forge("shears").add(MItems.TRITANIUM_SHEARS) tagsProvider.items.forge("shears").add(MItems.TRITANIUM_SHEARS)
tagsProvider.blocks.appender(BlockTags.STAIRS) tagsProvider.blocks.Appender(BlockTags.STAIRS)
.add(MRegistry.FLOOR_TILES_STAIRS.blocks.values) .add(MRegistry.FLOOR_TILES_STAIRS.blocks.values)
.add(MRegistry.TRITANIUM_STAIRS.allBlocks.values) .add(MRegistry.TRITANIUM_STAIRS.allBlocks.values)
.add(MRegistry.TRITANIUM_STRIPED_STAIRS.flatBlocks) .add(MRegistry.TRITANIUM_STRIPED_STAIRS.flatBlocks)
.add(MBlocks.TRITANIUM_STRIPED_STAIRS) .add(MBlocks.TRITANIUM_STRIPED_STAIRS)
tagsProvider.blocks.appender(BlockTags.SLABS) tagsProvider.blocks.Appender(BlockTags.SLABS)
.add(MRegistry.TRITANIUM_SLAB.allBlocks.values) .add(MRegistry.TRITANIUM_SLAB.allBlocks.values)
.add(MRegistry.TRITANIUM_STRIPED_SLAB.flatBlocks) .add(MRegistry.TRITANIUM_STRIPED_SLAB.flatBlocks)
.add(MRegistry.FLOOR_TILES_SLAB.blocks.values) .add(MRegistry.FLOOR_TILES_SLAB.blocks.values)
.add(MBlocks.TRITANIUM_STRIPED_SLAB) .add(MBlocks.TRITANIUM_STRIPED_SLAB)
tagsProvider.blocks.appender(BlockTags.WALLS) tagsProvider.blocks.Appender(BlockTags.WALLS)
.add(MRegistry.TRITANIUM_WALL.allBlocks.values) .add(MRegistry.TRITANIUM_WALL.allBlocks.values)
.add(MRegistry.TRITANIUM_STRIPED_WALL.flatBlocks) .add(MRegistry.TRITANIUM_STRIPED_WALL.flatBlocks)
.add(MBlocks.TRITANIUM_STRIPED_WALL) .add(MBlocks.TRITANIUM_STRIPED_WALL)
tagsProvider.items.appender(ItemTags.SLABS) tagsProvider.items.Appender(ItemTags.SLABS)
.add(MRegistry.TRITANIUM_SLAB.allItems.values) .add(MRegistry.TRITANIUM_SLAB.allItems.values)
.add(MRegistry.TRITANIUM_STRIPED_SLAB.flatItems) .add(MRegistry.TRITANIUM_STRIPED_SLAB.flatItems)
.add(MRegistry.FLOOR_TILES_SLAB.items.values) .add(MRegistry.FLOOR_TILES_SLAB.items.values)
.add(MItems.TRITANIUM_STRIPED_SLAB) .add(MItems.TRITANIUM_STRIPED_SLAB)
tagsProvider.items.appender(ItemTags.WALLS) tagsProvider.items.Appender(ItemTags.WALLS)
.add(MRegistry.TRITANIUM_WALL.allItems.values) .add(MRegistry.TRITANIUM_WALL.allItems.values)
.add(MRegistry.TRITANIUM_STRIPED_WALL.flatItems) .add(MRegistry.TRITANIUM_STRIPED_WALL.flatItems)
.add(MItems.TRITANIUM_STRIPED_WALL) .add(MItems.TRITANIUM_STRIPED_WALL)

View File

@ -22,62 +22,110 @@ import ru.dbotthepony.mc.otm.datagen.DataGen
import java.util.stream.Stream import java.util.stream.Stream
import net.minecraft.data.tags.TagsProvider as MinecraftTagsProvider import net.minecraft.data.tags.TagsProvider as MinecraftTagsProvider
interface MTagAppender<T> { private fun <T : Any> vanillaLookup(key: ResourceKey<Registry<T>>): (T) -> ResourceLocation {
fun add(value: T): MTagAppender<T>
fun addSafe(value: T): Boolean
fun add(vararg values: T): MTagAppender<T>
fun addSafe(vararg values: T): Boolean {
var any = false
for (value in values) any = addSafe(value)
return any
}
fun add(values: Collection<T>): MTagAppender<T>
fun add(values: Stream<out T>): MTagAppender<T> = add(values.toList())
fun addSafe(values: Collection<T>): Boolean {
var any = false
for (value in values) any = addSafe(value)
return any
}
}
interface ForgeTagAppender<T> : MTagAppender<T> {
fun add(key: String, value: T): ForgeTagAppender<T>
fun addSafe(key: String, value: T): Boolean
fun add(key: String, vararg values: T): ForgeTagAppender<T>
fun addSafe(key: String, vararg values: T): Boolean {
var any = false
for (value in values) any = addSafe(key, value)
return any
}
fun add(key: String, values: Collection<T>): ForgeTagAppender<T>
fun addSafe(key: String, values: Collection<T>): Boolean {
var any = false
for (value in values) any = addSafe(key, value)
return any
}
}
private fun <T> vanillaLookup(key: ResourceKey<Registry<T>>): (T) -> ResourceLocation? {
val registry by lazy { (BuiltInRegistries.REGISTRY.get(key.location()) ?: throw NoSuchElementException("No such registry $key")) as Registry<T> } val registry by lazy { (BuiltInRegistries.REGISTRY.get(key.location()) ?: throw NoSuchElementException("No such registry $key")) as Registry<T> }
return { registry.getKey(it) } return { registry.getKey(it) ?: throw NoSuchElementException("Registry $key does not contain $it") }
} }
class TagsProvider( class TagsProvider(private val event: GatherDataEvent) {
private val event: GatherDataEvent inner class Delegate<T : Any> private constructor(key: ResourceKey<Registry<T>>, val lookup: (T) -> ResourceLocation) : MinecraftTagsProvider<T>(event.generator.packOutput, key, event.lookupProvider, DataGen.MOD_ID, event.existingFileHelper) {
) { constructor(registry: IForgeRegistry<T>) : this(registry.registryKey, { registry.getKey(it) ?: throw NoSuchElementException("Registry $registry does not contain $it") })
inner class Delegate<T> private constructor(key: ResourceKey<Registry<T>>, val lookup: (T) -> ResourceLocation?) : MinecraftTagsProvider<T>(event.generator.packOutput, key, event.lookupProvider, DataGen.MOD_ID, event.existingFileHelper) {
constructor(registry: IForgeRegistry<T>) : this(registry.registryKey, registry::getKey)
constructor(key: ResourceKey<Registry<T>>) : this(key, vanillaLookup(key)) constructor(key: ResourceKey<Registry<T>>) : this(key, vanillaLookup(key))
init { init {
event.generator.addProvider(true, this) if (isRegistered)
event.generator.addProvider(event.includeServer(), this)
else
delegates.add(this)
} }
private val tags = HashMap<TagKey<T>, ObjectArraySet<T>>() private val tags = HashMap<TagKey<T>, ObjectArraySet<ResourceLocation>>()
private val rigidTags = HashMap<TagKey<T>, ObjectArraySet<ResourceKey<T>>>()
private val tagInTag = HashMap<TagKey<T>, ObjectArraySet<TagKey<T>>>()
inner class Appender(val tag: TagKey<T>) {
constructor(tag: ResourceLocation) : this(TagKey.create(registryKey, tag))
private val locations by lazy { tags.computeIfAbsent(tag) { ObjectArraySet() } }
private val rigidLocations by lazy { rigidTags.computeIfAbsent(tag) { ObjectArraySet() } }
private val tagsInTags by lazy { tagInTag.computeIfAbsent(tag) { ObjectArraySet() } }
fun add(value: ResourceLocation): Appender {
if (!locations.add(value)) {
throw IllegalStateException("Tag $tag of registry $registryKey already contains $value")
}
return this
}
fun add(value: ResourceKey<T>): Appender {
require(value.registry() == registryKey) { "Invalid registry in provided ResourceKey: ${value.registry()} (this tag appender is for $registryKey)" }
if (!rigidLocations.add(value)) {
throw IllegalStateException("Tag $tag of registry $registryKey already contains $value")
}
return this
}
fun add(value: TagKey<T>): Appender {
require(value.registry() == registryKey) { "Invalid registry in provided ResourceKey: ${value.registry()} (this tag appender is for $registryKey)" }
if (!tagsInTags.add(value)) {
throw IllegalStateException("Tag $tag of registry $registryKey already contains $value")
}
return this
}
fun add(value: T): Appender {
return add(ResourceKey.create(registryKey, lookup.invoke(value)))
}
fun add(values: Collection<T>): Appender {
for (value in values) add(value)
return this
}
fun add(vararg values: T): Appender {
for (value in values) add(value)
return this
}
fun add(vararg values: ResourceKey<T>): Appender {
for (value in values) add(value)
return this
}
fun add(vararg values: TagKey<T>): Appender {
for (value in values) add(value)
return this
}
fun add(vararg values: ResourceLocation): Appender {
for (value in values) add(value)
return this
}
fun add(values: Stream<T>): Appender {
values.forEach { add(it) }
return this
}
fun leaf(name: String) = Appender(TagKey.create(tag.registry, ResourceLocation(tag.location.namespace, tag.location.path + "/$name")))
fun add(leaf: String, value: T) = also { leaf(leaf).add(value) }
fun add(leaf: String, value: TagKey<T>) = also { leaf(leaf).add(value) }
fun add(leaf: String, vararg value: T) = also { leaf(leaf).add(*value) }
fun add(leaf: String, vararg value: TagKey<T>) = also { leaf(leaf).add(*value) }
fun add(leaf: String, value: Stream<T>) = also { leaf(leaf).add(value) }
fun add(leaf: String, value: ResourceKey<T>) = also { leaf(leaf).add(value) }
fun add(leaf: String, vararg value: ResourceKey<T>) = also { leaf(leaf).add(*value) }
fun add(leaf: String, value: ResourceLocation) = also { leaf(leaf).add(value) }
fun add(leaf: String, vararg value: ResourceLocation) = also { leaf(leaf).add(*value) }
}
fun forge(path: String) = Appender(ResourceLocation("forge", path))
override fun addTags(provider: HolderLookup.Provider) { override fun addTags(provider: HolderLookup.Provider) {
if (tags.isEmpty()) { if (tags.isEmpty()) {
@ -85,121 +133,64 @@ class TagsProvider(
} }
for ((tag, values) in tags) { for ((tag, values) in tags) {
tag(tag).also { val appender = tag(tag)
for (value in values) {
it.add(ResourceKey.create(registryKey, lookup(value) ?: throw NoSuchElementException("$value is missing from $registryKey"))) for (value in values) {
} appender.addOptional(value)
}
}
for ((tag, values) in rigidTags) {
val appender = tag(tag)
for (value in values) {
appender.add(value)
}
}
for ((tag, values) in tagInTag) {
val appender = tag(tag)
for (value in values) {
appender.addTag(value)
} }
} }
} }
}
fun getSet(tag: TagKey<T>): MutableSet<T> { private val delegates = ArrayList<Delegate<*>>()
return tags.computeIfAbsent(tag) { ObjectArraySet() } private var isRegistered = false
}
fun getSet(location: ResourceLocation) = getSet(TagKey.create(registryKey, location)) fun register() {
if (!isRegistered) {
isRegistered = true
fun appender(tag: TagKey<T>, message: ((T) -> Any) = { "$it is already in $tag" }): MTagAppender<T> { for (value in delegates) {
val list = getSet(tag) event.generator.addProvider(event.includeServer(), value)
return object : MTagAppender<T> {
override fun add(value: T): MTagAppender<T> {
if (!list.add(value)) {
throw IllegalStateException(message.invoke(value).toString())
}
return this
}
override fun add(values: Collection<T>): MTagAppender<T> {
for (value in values) add(value)
return this
}
override fun addSafe(value: T): Boolean {
return list.add(value)
}
override fun add(vararg values: T): MTagAppender<T> {
values.forEach(this::add)
return this
}
} }
}
fun forge(path: String): ForgeTagAppender<T> { delegates.clear()
val parent by lazy { appender(ResourceLocation("forge", path)) }
return object : ForgeTagAppender<T> {
override fun add(key: String, value: T): ForgeTagAppender<T> {
val tag = TagKey.create(registryKey, ResourceLocation("forge", "$path/$key"))
if (!getSet(tag).add(value)) {
throw IllegalStateException("$value is already in $tag")
}
return this
}
override fun addSafe(key: String, value: T): Boolean {
val tag = TagKey.create(registryKey, ResourceLocation("forge", "$path/$key"))
return getSet(tag).add(value)
}
override fun add(key: String, vararg values: T): ForgeTagAppender<T> {
for (value in values) add(key, value)
return this
}
override fun add(key: String, values: Collection<T>): ForgeTagAppender<T> {
for (value in values) add(key, value)
return this
}
override fun add(value: T): MTagAppender<T> {
return parent.add(value)
}
override fun addSafe(value: T): Boolean {
return parent.addSafe(value)
}
override fun add(vararg values: T): MTagAppender<T> {
return parent.add(*values)
}
override fun add(values: Collection<T>): MTagAppender<T> {
return parent.add(values)
}
}
}
fun appender(location: ResourceLocation): MTagAppender<T> {
return appender(TagKey.create(registryKey, location))
}
fun appender(location: ResourceLocation, message: (T) -> Any): MTagAppender<T> {
return appender(TagKey.create(registryKey, location), message)
} }
} }
val blocks = Delegate(ForgeRegistries.BLOCKS) val blocks = Delegate(ForgeRegistries.BLOCKS)
val items = Delegate(ForgeRegistries.ITEMS) val items = Delegate(ForgeRegistries.ITEMS)
val mobEffects = Delegate(ForgeRegistries.MOB_EFFECTS) val mobEffects = Delegate(ForgeRegistries.MOB_EFFECTS)
val damageTypes = Delegate(Registries.DAMAGE_TYPE)
val androidImmuneEffects = mobEffects.appender(MatteryPlayerCapability.ANDROID_IMMUNE_EFFECTS) val androidImmuneEffects = mobEffects.Appender(MatteryPlayerCapability.ANDROID_IMMUNE_EFFECTS)
val requiresShovel = blocks.appender(BlockTags.MINEABLE_WITH_SHOVEL) val requiresShovel = blocks.Appender(BlockTags.MINEABLE_WITH_SHOVEL)
val requiresAxe = blocks.appender(BlockTags.MINEABLE_WITH_AXE) val requiresAxe = blocks.Appender(BlockTags.MINEABLE_WITH_AXE)
val requiresHoe = blocks.appender(BlockTags.MINEABLE_WITH_HOE) val requiresHoe = blocks.Appender(BlockTags.MINEABLE_WITH_HOE)
val requiresPickaxe = blocks.appender(BlockTags.MINEABLE_WITH_PICKAXE) val requiresPickaxe = blocks.Appender(BlockTags.MINEABLE_WITH_PICKAXE)
val requiresStoneTool = blocks.appender(BlockTags.NEEDS_STONE_TOOL) val requiresStoneTool = blocks.Appender(BlockTags.NEEDS_STONE_TOOL)
val requiresIronTool = blocks.appender(BlockTags.NEEDS_IRON_TOOL) val requiresIronTool = blocks.Appender(BlockTags.NEEDS_IRON_TOOL)
val requiresDiamondTool = blocks.appender(BlockTags.NEEDS_DIAMOND_TOOL) val requiresDiamondTool = blocks.Appender(BlockTags.NEEDS_DIAMOND_TOOL)
val witherImmune = blocks.appender(BlockTags.WITHER_IMMUNE) val witherImmune = blocks.Appender(BlockTags.WITHER_IMMUNE)
val dragonImmune = blocks.appender(BlockTags.DRAGON_IMMUNE) val dragonImmune = blocks.Appender(BlockTags.DRAGON_IMMUNE)
fun stoneOre(key: String, block: Block): TagsProvider { fun stoneOre(key: String, block: Block): TagsProvider {
ore(key, block) ore(key, block)
@ -233,9 +224,9 @@ class TagsProvider(
val b = TagKey.create(Registries.BLOCK, forgeKey) val b = TagKey.create(Registries.BLOCK, forgeKey)
val i = TagKey.create(Registries.ITEM, forgeKey) val i = TagKey.create(Registries.ITEM, forgeKey)
items.getSet(i).add(block.asItem()) items.Appender(i).add(block.asItem())
itemOres.add(block.asItem()) itemOres.add(block.asItem())
blocks.getSet(b).add(block) blocks.Appender(b).add(block)
blockOres.add(block) blockOres.add(block)
return this return this
@ -286,7 +277,7 @@ class TagsProvider(
// val itemOreRatesDense = items.forge("ore_rates/dense") // val itemOreRatesDense = items.forge("ore_rates/dense")
val gameEvents = Delegate(Registries.GAME_EVENT) val gameEvents = Delegate(Registries.GAME_EVENT)
val vibrations = gameEvents.appender(GameEventTags.VIBRATIONS) val vibrations = gameEvents.Appender(GameEventTags.VIBRATIONS)
fun requiresPickaxe(block: Block, tier: Tier? = null): TagsProvider { fun requiresPickaxe(block: Block, tier: Tier? = null): TagsProvider {
requiresPickaxe.add(block) requiresPickaxe.add(block)