diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index 76b433271..a415d9d5d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -28,6 +28,8 @@ import ru.dbotthepony.mc.otm.datagen.models.MatteryBlockModelProvider import ru.dbotthepony.mc.otm.datagen.recipes.MatteryRecipeProvider import ru.dbotthepony.mc.otm.registry.* import ru.dbotthepony.mc.otm.core.registryName +import ru.dbotthepony.mc.otm.datagen.advancements.AdvancementProvider +import ru.dbotthepony.mc.otm.datagen.advancements.addAdvancements import ru.dbotthepony.mc.otm.datagen.blocks.addBlockStates import ru.dbotthepony.mc.otm.datagen.blocks.addComplexBlockStates import ru.dbotthepony.mc.otm.datagen.items.addItemModels @@ -308,6 +310,7 @@ object DataGen { this.languageProvider = languageProvider val tagsProvider = TagsProvider(event) + val advancementProvider = AdvancementProvider(event) addTags(tagsProvider) @@ -321,6 +324,7 @@ object DataGen { event.generator.addProvider(true, lootModifier) event.generator.addProvider(true, SoundDataProvider(event)) event.generator.addProvider(true, AndroidResearchDataProvider(event.generator).also { it.exec { addResearchData(it, languageProvider) } }) + event.generator.addProvider(true, advancementProvider) AddEnglishLanguage(languageProvider) @@ -342,6 +346,10 @@ object DataGen { addOreSmeltingRecipes(consumer) } + advancementProvider.exec { it, files -> + addAdvancements(it, files, languageProvider) + } + addPlatePressRecipes(recipeProvider) lootModifier.lambda { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt new file mode 100644 index 000000000..f3c90aeab --- /dev/null +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt @@ -0,0 +1,32 @@ +package ru.dbotthepony.mc.otm.datagen.advancements + +import net.minecraft.advancements.Advancement +import net.minecraft.advancements.RequirementsStrategy +import net.minecraft.advancements.critereon.InventoryChangeTrigger +import net.minecraft.world.item.ItemStack +import net.minecraftforge.common.data.ExistingFileHelper +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider +import ru.dbotthepony.mc.otm.datagen.modLocation +import ru.dbotthepony.mc.otm.registry.MItemTags +import ru.dbotthepony.mc.otm.registry.MItems +import java.util.function.Consumer + +fun addAdvancements(serializer: Consumer, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider) { + val translation = lang.english.Prepended("otm.advancements.regular") + + val root = AdvancementBuilder() + .requirements(RequirementsStrategy.OR) + .display( + itemStack = ItemStack(MItems.TRITANIUM_INGOT), + title = TranslatableComponent(translation.add("root", "Overdrive That Matters")), + description = TranslatableComponent(translation.add("root.desc", "Its all about things that matter")), + showToast = false, + announceChat = false, + background = modLocation("textures/block/decorative/tritanium_block_gray.png") + ) + .addCriterion("has_tritanium_ore", criterion(MItemTags.TRITANIUM_ORES)) + .addCriterion("has_tritanium_ore_clump", criterion(MItemTags.TRITANIUM_ORE_CLUMPS)) + .addCriterion("has_tritanium_ingot", InventoryChangeTrigger.TriggerInstance.hasItems(MItems.TRITANIUM_INGOT)) + .save(serializer, modLocation("regular/root"), existingFileHelper) +} diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementProvider.kt new file mode 100644 index 000000000..e2afbc95d --- /dev/null +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementProvider.kt @@ -0,0 +1,27 @@ +package ru.dbotthepony.mc.otm.datagen.advancements + +import net.minecraft.advancements.Advancement +import net.minecraftforge.common.data.ExistingFileHelper +import net.minecraftforge.data.event.GatherDataEvent +import java.util.LinkedList +import java.util.function.Consumer + +class AdvancementProvider(event: GatherDataEvent) : net.minecraft.data.advancements.AdvancementProvider(event.generator, event.existingFileHelper) { + private val callbacks = LinkedList<(Consumer, ExistingFileHelper) -> Unit>() + + fun exec(callback: (Consumer, ExistingFileHelper) -> Unit) { + callbacks.add(callback) + } + + fun exec(callback: (Consumer) -> Unit) { + callbacks.add { it, _ -> + callback.invoke(it) + } + } + + override fun registerAdvancements(consumer: Consumer, fileHelper: ExistingFileHelper) { + for (callback in callbacks) { + callback.invoke(consumer, fileHelper) + } + } +} diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/Helpers.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/Helpers.kt new file mode 100644 index 000000000..df01e8361 --- /dev/null +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/Helpers.kt @@ -0,0 +1,59 @@ +package ru.dbotthepony.mc.otm.datagen.advancements + +import net.minecraft.advancements.Advancement +import net.minecraft.advancements.CriterionTriggerInstance +import net.minecraft.advancements.DisplayInfo +import net.minecraft.advancements.FrameType +import net.minecraft.advancements.critereon.InventoryChangeTrigger +import net.minecraft.advancements.critereon.ItemPredicate +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.tags.TagKey +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import ru.dbotthepony.mc.otm.core.TextComponent + +fun AdvancementBuilder(): Advancement.Builder = Advancement.Builder.advancement() + +fun DisplayInfo( + itemStack: ItemStack, + title: Component = TextComponent("undefined"), + description: Component = TextComponent("undefined"), + background: ResourceLocation? = null, + frameType: FrameType = FrameType.TASK, + showToast: Boolean = true, + announceChat: Boolean = true, + hidden: Boolean = false, +): DisplayInfo { + return DisplayInfo( + itemStack, + title, + description, + background, + frameType, + showToast, + announceChat, + hidden + ) +} + +// compiler thinks it is shadowed - it is not +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") +fun Advancement.Builder.display( + itemStack: ItemStack, + title: Component = TextComponent("undefined"), + description: Component = TextComponent("undefined"), + background: ResourceLocation? = null, + frameType: FrameType = FrameType.TASK, + showToast: Boolean = true, + announceChat: Boolean = true, + hidden: Boolean = false, +) = display(itemStack, title, description, background, frameType, showToast, announceChat, hidden) + +fun predicate(tag: TagKey): ItemPredicate { + return ItemPredicate.Builder.item().of(tag).build() +} + +fun criterion(tag: TagKey): CriterionTriggerInstance { + return InventoryChangeTrigger.TriggerInstance.hasItems(predicate(tag)) +} diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt index f67305f70..2b84bf75b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt @@ -47,6 +47,7 @@ class MatteryLanguageProvider(private val gen: DataGenerator) { } } + @Suppress("unused") inner class Builder(language: String) { val slave: LanguageProvider by lazy { slaves.computeIfAbsent(language, ::Slave) } @@ -75,6 +76,17 @@ class MatteryLanguageProvider(private val gen: DataGenerator) { fun gui(key: String, value: String) = slave.add("otm.gui.$key", value) fun sound(key: String, value: String) = slave.add("otm.sound.$key", value) fun sound(key: SoundEvent, value: String) = slave.add("otm.sound.${key.location.path}", value) + + inner class Prepended(path: String) { + val path = "$path." + constructor(vararg path: String) : this(path.joinToString(".")) + constructor(path: Collection) : this(path.joinToString(".")) + + fun add(key: String, value: String): String { + slave.add(path + key, value) + return path + key + } + } } inner class Colors(