Make mod compile against 1.21

This commit is contained in:
DBotThePony 2024-08-27 21:15:47 +07:00
parent 21f285ca0f
commit 657707409d
Signed by: DBot
GPG Key ID: DCC23B5715498507
40 changed files with 355 additions and 291 deletions

View File

@ -1,17 +1,13 @@
package ru.dbotthepony.mc.otm.datagen package ru.dbotthepony.mc.otm.datagen
import net.minecraft.core.RegistrySetBuilder import net.minecraft.data.worldgen.BootstrapContext
import net.minecraft.core.registries.Registries
import net.minecraft.data.worldgen.BootstapContext
import net.minecraft.tags.DamageTypeTags import net.minecraft.tags.DamageTypeTags
import net.minecraft.world.damagesource.DamageScaling import net.minecraft.world.damagesource.DamageScaling
import net.minecraft.world.damagesource.DamageType import net.minecraft.world.damagesource.DamageType
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider
import net.minecraftforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.datagen.tags.TagsProvider import ru.dbotthepony.mc.otm.datagen.tags.TagsProvider
import ru.dbotthepony.mc.otm.registry.MDamageTypes import ru.dbotthepony.mc.otm.registry.MDamageTypes
fun registerDamageTypes(context: BootstapContext<DamageType>) { fun registerDamageTypes(context: BootstrapContext<DamageType>) {
context.register(MDamageTypes.EXOPACK_PROBE, DamageType("otm_exopack_probe", DamageScaling.NEVER, 4.0f)) context.register(MDamageTypes.EXOPACK_PROBE, DamageType("otm_exopack_probe", DamageScaling.NEVER, 4.0f))
context.register(MDamageTypes.BECOME_ANDROID, DamageType("otm_become_android", DamageScaling.NEVER, 0f)) context.register(MDamageTypes.BECOME_ANDROID, DamageType("otm_become_android", DamageScaling.NEVER, 0f))
context.register(MDamageTypes.BECOME_HUMANE, DamageType("otm_become_humane", DamageScaling.NEVER, 0f)) context.register(MDamageTypes.BECOME_HUMANE, DamageType("otm_become_humane", DamageScaling.NEVER, 0f))

View File

@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.datagen
import net.minecraft.core.RegistrySetBuilder import net.minecraft.core.RegistrySetBuilder
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
@ -14,18 +15,17 @@ import net.minecraft.world.level.block.TrapDoorBlock
import net.minecraft.world.level.block.state.properties.DoorHingeSide import net.minecraft.world.level.block.state.properties.DoorHingeSide
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
import net.minecraft.world.level.block.state.properties.Half import net.minecraft.world.level.block.state.properties.Half
import net.minecraftforge.client.model.generators.ModelFile import net.neoforged.bus.api.SubscribeEvent
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider
import net.minecraftforge.common.data.ForgeAdvancementProvider
import net.minecraftforge.eventbus.api.SubscribeEvent
import net.minecraftforge.fml.common.Mod
import net.minecraftforge.data.event.GatherDataEvent
import net.minecraftforge.registries.ForgeRegistries
import net.neoforged.fml.common.EventBusSubscriber import net.neoforged.fml.common.EventBusSubscriber
import net.neoforged.fml.common.Mod import net.neoforged.neoforge.client.model.generators.ModelFile
import net.neoforged.neoforge.common.data.AdvancementProvider
import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider
import net.neoforged.neoforge.common.data.internal.NeoForgeAdvancementProvider
import net.neoforged.neoforge.data.event.GatherDataEvent
import net.neoforged.neoforge.registries.NeoForgeRegistries
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.android.AndroidResearchDataProvider import ru.dbotthepony.mc.otm.android.AndroidResearchDataProvider
import ru.dbotthepony.mc.otm.block.* import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.math.yRotationBlockstateNorth import ru.dbotthepony.mc.otm.core.math.yRotationBlockstateNorth
import ru.dbotthepony.mc.otm.core.util.WriteOnce import ru.dbotthepony.mc.otm.core.util.WriteOnce
import ru.dbotthepony.mc.otm.datagen.blocks.BatteryBankProvider import ru.dbotthepony.mc.otm.datagen.blocks.BatteryBankProvider
@ -38,7 +38,6 @@ import ru.dbotthepony.mc.otm.registry.*
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.advancements.addAdvancements import ru.dbotthepony.mc.otm.datagen.advancements.addAdvancements
import ru.dbotthepony.mc.otm.datagen.advancements.addAndroidAdvancements import ru.dbotthepony.mc.otm.datagen.advancements.addAndroidAdvancements
import ru.dbotthepony.mc.otm.datagen.advancements.addMachineAdvancements
import ru.dbotthepony.mc.otm.datagen.blocks.addBlockModels import ru.dbotthepony.mc.otm.datagen.blocks.addBlockModels
import ru.dbotthepony.mc.otm.datagen.blocks.addBlockStates import ru.dbotthepony.mc.otm.datagen.blocks.addBlockStates
import ru.dbotthepony.mc.otm.datagen.blocks.addComplexBlockStates import ru.dbotthepony.mc.otm.datagen.blocks.addComplexBlockStates
@ -56,6 +55,7 @@ import ru.dbotthepony.mc.otm.registry.objects.DecorativeBlock
import kotlin.properties.Delegates import kotlin.properties.Delegates
internal fun modLocation(string: String) = ResourceLocation(DataGen.MOD_ID, string) internal fun modLocation(string: String) = ResourceLocation(DataGen.MOD_ID, string)
internal fun modLootTable(string: String) = ResourceKey.create(Registries.LOOT_TABLE, ResourceLocation(DataGen.MOD_ID, string))
@EventBusSubscriber(modid = DataGen.MOD_ID, bus = EventBusSubscriber.Bus.MOD) @EventBusSubscriber(modid = DataGen.MOD_ID, bus = EventBusSubscriber.Bus.MOD)
object DataGen { object DataGen {
@ -488,9 +488,9 @@ object DataGen {
val blockModelProvider = MatteryBlockModelProvider(event) val blockModelProvider = MatteryBlockModelProvider(event)
val blockStateProvider = MatteryBlockStateProvider(event) val blockStateProvider = MatteryBlockStateProvider(event)
val itemModelProvider = MatteryItemModelProvider(event) val itemModelProvider = MatteryItemModelProvider(event)
val lootTableProvider = LootTables(event.generator) val lootTableProvider = LootTables(event)
val recipeProvider = MatteryRecipeProvider(event.generator) val recipeProvider = MatteryRecipeProvider(event)
val lootModifier = LootModifiers(event.generator) val lootModifier = LootModifiers(event)
val languageProvider = MatteryLanguageProvider(event.generator) val languageProvider = MatteryLanguageProvider(event.generator)
val matterData = MatterDataProvider(event) val matterData = MatterDataProvider(event)
val researchProvider = AndroidResearchDataProvider(event).also { it.exec { addResearchData(it, languageProvider) } } val researchProvider = AndroidResearchDataProvider(event).also { it.exec { addResearchData(it, languageProvider) } }
@ -506,7 +506,7 @@ object DataGen {
this.matterData = matterData this.matterData = matterData
val tagsProvider = TagsProvider(event) val tagsProvider = TagsProvider(event)
val advancementProvider = object : ForgeAdvancementProvider(event.generator.packOutput, event.lookupProvider, event.existingFileHelper, listOf( val advancementProvider = object : AdvancementProvider(event.generator.packOutput, event.lookupProvider, event.existingFileHelper, listOf(
AdvancementGenerator { registries, saver, existingFileHelper -> AdvancementGenerator { registries, saver, existingFileHelper ->
addAdvancements(saver, languageProvider) addAdvancements(saver, languageProvider)
addAndroidAdvancements(saver, languageProvider) addAndroidAdvancements(saver, languageProvider)
@ -534,7 +534,7 @@ object DataGen {
.add(Registries.DAMAGE_TYPE, ::registerDamageTypes) .add(Registries.DAMAGE_TYPE, ::registerDamageTypes)
.add(Registries.CONFIGURED_FEATURE, ::registerConfiguredFeatures) .add(Registries.CONFIGURED_FEATURE, ::registerConfiguredFeatures)
.add(Registries.PLACED_FEATURE, ::registerPlacedFeatures) .add(Registries.PLACED_FEATURE, ::registerPlacedFeatures)
.add(ForgeRegistries.Keys.BIOME_MODIFIERS, ::registerBiomeModifiers) .add(NeoForgeRegistries.Keys.BIOME_MODIFIERS, ::registerBiomeModifiers)
event.generator.addProvider(event.includeServer(), DatapackBuiltinEntriesProvider(event.generator.packOutput, event.lookupProvider, registrySetBuilder, setOf(MOD_ID))) event.generator.addProvider(event.includeServer(), DatapackBuiltinEntriesProvider(event.generator.packOutput, event.lookupProvider, registrySetBuilder, setOf(MOD_ID)))

View File

@ -5,9 +5,9 @@ import net.minecraft.world.level.block.SlabBlock
import net.minecraft.world.level.block.StairBlock import net.minecraft.world.level.block.StairBlock
import net.minecraft.world.level.block.WallBlock import net.minecraft.world.level.block.WallBlock
import net.minecraft.world.level.block.state.properties.BlockStateProperties import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraftforge.client.model.generators.BlockModelBuilder import net.neoforged.neoforge.client.model.generators.BlockModelBuilder
import net.minecraftforge.client.model.generators.ConfiguredModel import net.neoforged.neoforge.client.model.generators.ConfiguredModel
import net.minecraftforge.client.model.generators.ModelFile import net.neoforged.neoforge.client.model.generators.ModelFile
import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom
import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateNorth import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateNorth

View File

@ -3,9 +3,8 @@ package ru.dbotthepony.mc.otm.datagen
import net.minecraft.tags.ItemTags import net.minecraft.tags.ItemTags
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.matter.ComputeAction
import ru.dbotthepony.mc.otm.matter.MatterDataProvider import ru.dbotthepony.mc.otm.matter.MatterDataProvider
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
@ -152,12 +151,12 @@ fun addMatterData(provider: MatterDataProvider) {
relative(Items.PACKED_ICE, 1.5, 1) relative(Items.PACKED_ICE, 1.5, 1)
// rocks // rocks
scope(Tags.Items.STONE, 1.1, 1.1) { scope(Tags.Items.STONES, 1.1, 1.1) {
equal(Tags.Items.COBBLESTONE) equal(Tags.Items.COBBLESTONES)
equal(Tags.Items.GRAVEL) equal(Tags.Items.GRAVELS)
equal(Items.FLINT) equal(Items.FLINT)
equal(Tags.Items.SAND) equal(Tags.Items.SANDS)
equal(Tags.Items.NETHERRACK) equal(Tags.Items.NETHERRACKS)
scope(1.4, 1.5) { scope(1.4, 1.5) {
equal(Items.BASALT) equal(Items.BASALT)
@ -185,7 +184,7 @@ fun addMatterData(provider: MatterDataProvider) {
relative(Items.REINFORCED_DEEPSLATE, 3, 1.4) relative(Items.REINFORCED_DEEPSLATE, 3, 1.4)
} }
relative(Tags.Items.OBSIDIAN, 10, 1.5) relative(Tags.Items.OBSIDIANS, 10, 1.5)
relative(Items.CRYING_OBSIDIAN, 14, 3) relative(Items.CRYING_OBSIDIAN, 14, 3)
} }
@ -221,7 +220,7 @@ fun addMatterData(provider: MatterDataProvider) {
// drops from mobs // drops from mobs
scope(Items.ROTTEN_FLESH, 8, 1.5) { scope(Items.ROTTEN_FLESH, 8, 1.5) {
equal(Items.INK_SAC) equal(Items.INK_SAC)
equal(Tags.Items.LEATHER) equal(Tags.Items.LEATHERS)
equal(Items.LEATHER) equal(Items.LEATHER)
relative(Items.RABBIT_FOOT, 1.1, 1.5) relative(Items.RABBIT_FOOT, 1.1, 1.5)
@ -231,14 +230,15 @@ fun addMatterData(provider: MatterDataProvider) {
relative(Tags.Items.BONES, 1, 1.25) relative(Tags.Items.BONES, 1, 1.25)
relative(Tags.Items.STRING, 0.8, 0.75) relative(Tags.Items.STRINGS, 0.8, 0.75)
relative(Items.COBWEB, 0.8, 0.75) relative(Items.COBWEB, 0.8, 0.75)
relative(Items.SPIDER_EYE, 0.8, 1.8) relative(Items.SPIDER_EYE, 0.8, 1.8)
relative(Tags.Items.SLIMEBALLS, 1, 1.4) relative(Tags.Items.SLIME_BALLS, 1, 1.4)
relative(Tags.Items.GUNPOWDER, 0.85, 1.15) relative(Tags.Items.GUNPOWDERS, 0.85, 1.15)
relative(Items.SCUTE, 1, 1.5) relative(Items.TURTLE_SCUTE, 1, 1.5)
relative(Items.ARMADILLO_SCUTE, 1, 1.8)
relative(Items.FEATHER, 0.7, 1.25) relative(Items.FEATHER, 0.7, 1.25)
relative(Items.EGG, 1.25, 4) relative(Items.EGG, 1.25, 4)
@ -261,7 +261,7 @@ fun addMatterData(provider: MatterDataProvider) {
relative(Items.SCULK_VEIN, 2.5, 24) relative(Items.SCULK_VEIN, 2.5, 24)
// planty // planty
scope(Items.GRASS, 1.5, 2.5) { scope(Items.SHORT_GRASS, 1.5, 2.5) {
equal(Items.SUNFLOWER) equal(Items.SUNFLOWER)
equal(Items.LILAC) equal(Items.LILAC)
equal(Items.ROSE_BUSH) equal(Items.ROSE_BUSH)

View File

@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen
import net.minecraft.core.HolderSet import net.minecraft.core.HolderSet
import net.minecraft.core.RegistrySetBuilder import net.minecraft.core.RegistrySetBuilder
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
import net.minecraft.data.worldgen.BootstapContext import net.minecraft.data.worldgen.BootstrapContext
import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceKey
import net.minecraft.tags.BiomeTags import net.minecraft.tags.BiomeTags
import net.minecraft.tags.BlockTags import net.minecraft.tags.BlockTags
@ -17,11 +17,8 @@ import net.minecraft.world.level.levelgen.placement.HeightRangePlacement
import net.minecraft.world.level.levelgen.placement.InSquarePlacement import net.minecraft.world.level.levelgen.placement.InSquarePlacement
import net.minecraft.world.level.levelgen.placement.PlacedFeature import net.minecraft.world.level.levelgen.placement.PlacedFeature
import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider import net.neoforged.neoforge.common.world.BiomeModifier
import net.minecraftforge.common.world.BiomeModifier import net.neoforged.neoforge.registries.NeoForgeRegistries
import net.minecraftforge.common.world.ForgeBiomeModifiers
import net.minecraftforge.data.event.GatherDataEvent
import net.minecraftforge.registries.ForgeRegistries
import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MBlocks
private object ConfiguredFeatures { private object ConfiguredFeatures {
@ -32,7 +29,7 @@ private object ConfiguredFeatures {
} }
} }
fun registerConfiguredFeatures(context: BootstapContext<ConfiguredFeature<*, *>>) { fun registerConfiguredFeatures(context: BootstrapContext<ConfiguredFeature<*, *>>) {
val stone = TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES) val stone = TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES)
val deepslate = TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES) val deepslate = TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES)
@ -53,7 +50,7 @@ private object PlacedFeatures {
} }
} }
fun registerPlacedFeatures(context: BootstapContext<PlacedFeature>) { fun registerPlacedFeatures(context: BootstrapContext<PlacedFeature>) {
val configured = context.lookup(Registries.CONFIGURED_FEATURE) val configured = context.lookup(Registries.CONFIGURED_FEATURE)
val ore = configured.getOrThrow(ConfiguredFeatures.TRITANIUM_ORE) val ore = configured.getOrThrow(ConfiguredFeatures.TRITANIUM_ORE)
@ -80,17 +77,17 @@ private object BiomeModifiers {
val TRITANIUM_ORE = key("tritanium_ore") val TRITANIUM_ORE = key("tritanium_ore")
private fun key(name: String): ResourceKey<BiomeModifier> { private fun key(name: String): ResourceKey<BiomeModifier> {
return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, modLocation(name)) return ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, modLocation(name))
} }
} }
fun registerBiomeModifiers(context: BootstapContext<BiomeModifier>) { fun registerBiomeModifiers(context: BootstrapContext<BiomeModifier>) {
val placed = context.lookup(Registries.PLACED_FEATURE) val placed = context.lookup(Registries.PLACED_FEATURE)
val biomes = context.lookup(Registries.BIOME) val biomes = context.lookup(Registries.BIOME)
context.register( context.register(
BiomeModifiers.TRITANIUM_ORE, BiomeModifiers.TRITANIUM_ORE,
ForgeBiomeModifiers.AddFeaturesBiomeModifier( net.neoforged.neoforge.common.world.BiomeModifiers.AddFeaturesBiomeModifier(
biomes.getOrThrow(BiomeTags.IS_OVERWORLD), biomes.getOrThrow(BiomeTags.IS_OVERWORLD),
HolderSet.direct( HolderSet.direct(
placed.getOrThrow(PlacedFeatures.NORMAL_TRITANIUM), placed.getOrThrow(PlacedFeatures.NORMAL_TRITANIUM),

View File

@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen
import net.minecraft.tags.ItemTags import net.minecraft.tags.ItemTags
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.android.AndroidResearchDescriptions import ru.dbotthepony.mc.otm.android.AndroidResearchDescriptions
import ru.dbotthepony.mc.otm.android.AndroidResearchResults import ru.dbotthepony.mc.otm.android.AndroidResearchResults

View File

@ -1,10 +1,9 @@
package ru.dbotthepony.mc.otm.datagen package ru.dbotthepony.mc.otm.datagen
import net.minecraft.resources.ResourceLocation
import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvent
import net.minecraftforge.common.data.SoundDefinition import net.neoforged.neoforge.common.data.SoundDefinition
import net.minecraftforge.common.data.SoundDefinitionsProvider import net.neoforged.neoforge.common.data.SoundDefinitionsProvider
import net.minecraftforge.data.event.GatherDataEvent import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.registry.MSoundEvents import ru.dbotthepony.mc.otm.registry.MSoundEvents
fun SoundDefinition.subtitle(value: SoundEvent): SoundDefinition { fun SoundDefinition.subtitle(value: SoundEvent): SoundDefinition {

View File

@ -2,8 +2,8 @@ package ru.dbotthepony.mc.otm.datagen.advancements
import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.AdvancementHolder
import net.minecraft.advancements.AdvancementRewards import net.minecraft.advancements.AdvancementRewards
import net.minecraft.advancements.FrameType
import net.minecraft.advancements.AdvancementRequirements.Strategy import net.minecraft.advancements.AdvancementRequirements.Strategy
import net.minecraft.advancements.AdvancementType
import net.minecraft.advancements.critereon.InventoryChangeTrigger import net.minecraft.advancements.critereon.InventoryChangeTrigger
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
@ -105,7 +105,7 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("energy_sword.desc", "Wield a High-Frequency Blade, a melee weapon intended to slice Creepers into creep-cakes") { description = translation.add("energy_sword.desc", "Wield a High-Frequency Blade, a melee weapon intended to slice Creepers into creep-cakes") {
russian("Получите высокочастотный клинок, оружие ближнего боя предназначенное для нарезания Криперов на крипо-тортики") russian("Получите высокочастотный клинок, оружие ближнего боя предназначенное для нарезания Криперов на крипо-тортики")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("has_item", criterion(MItems.ENERGY_SWORD)) .addCriterion("has_item", criterion(MItems.ENERGY_SWORD))
.save(serializer, modLocation("regular/energy_sword")) .save(serializer, modLocation("regular/energy_sword"))
@ -120,7 +120,7 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("quantum_battery.desc", "Put together a Quantum Battery, powered by Ender technologies") { description = translation.add("quantum_battery.desc", "Put together a Quantum Battery, powered by Ender technologies") {
russian("Создайте квантовый аккумулятор, пропитанную технологиями Края") russian("Создайте квантовый аккумулятор, пропитанную технологиями Края")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.rewards(AdvancementRewards.Builder.experience(50)) .rewards(AdvancementRewards.Builder.experience(50))
.requirements(Strategy.OR) .requirements(Strategy.OR)
@ -138,7 +138,7 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("zpm_battery.desc", "Find Zero Point Module, something from different multiverse of ours, created using technologies lost in time in all possible multiverses") { description = translation.add("zpm_battery.desc", "Find Zero Point Module, something from different multiverse of ours, created using technologies lost in time in all possible multiverses") {
russian("Найдите модуль нулевой точки, вещь из другой мультивселенной, созданная с использованием технологий, потерянных во времени во всех возможных мультивслеленных") russian("Найдите модуль нулевой точки, вещь из другой мультивселенной, созданная с использованием технологий, потерянных во времени во всех возможных мультивслеленных")
}, },
frameType = FrameType.CHALLENGE, frameType = AdvancementType.CHALLENGE,
hidden = true hidden = true
) )
.rewards(AdvancementRewards.Builder.experience(800)) .rewards(AdvancementRewards.Builder.experience(800))
@ -346,7 +346,7 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("industrial_glass2.desc", "Paint Industrial Glass all possible colors") { description = translation.add("industrial_glass2.desc", "Paint Industrial Glass all possible colors") {
russian("Покрасьте промышленное стекло во все возможные цвета") russian("Покрасьте промышленное стекло во все возможные цвета")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.requirements(Strategy.AND) .requirements(Strategy.AND)
.also { advancement -> .also { advancement ->
@ -398,7 +398,7 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("cargo_crate_minecart2.desc", "Have all color variants of Minecarts with Cargo Crates") { description = translation.add("cargo_crate_minecart2.desc", "Have all color variants of Minecarts with Cargo Crates") {
russian("Создайте все варианты покрасок вагонеток с грузовыми Ящиками") russian("Создайте все варианты покрасок вагонеток с грузовыми Ящиками")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.requirements(Strategy.AND) .requirements(Strategy.AND)
.also { advancement -> .also { advancement ->
@ -416,7 +416,7 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("cargo_crate2.desc", "Craft all color variants of Cargo Crates") { description = translation.add("cargo_crate2.desc", "Craft all color variants of Cargo Crates") {
russian("Покрасьте грузовые ящики во все возможные цвета") russian("Покрасьте грузовые ящики во все возможные цвета")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.requirements(Strategy.AND) .requirements(Strategy.AND)
.also { advancement -> .also { advancement ->
@ -496,9 +496,9 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("tritanium_block3.desc", "Craft all color variants of Tritanium Blocks") { description = translation.add("tritanium_block3.desc", "Craft all color variants of Tritanium Blocks") {
russian("Создайте все варианты покрасок тритановых Блоков") russian("Создайте все варианты покрасок тритановых Блоков")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.rewards(AdvancementRewards.Builder.loot(modLocation("tritanium_block3")).addExperience(100)) .rewards(advancementLoot("tritanium_block3").addExperience(100))
.requirements(Strategy.AND) .requirements(Strategy.AND)
.also { advancement -> .also { advancement ->
MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
@ -515,9 +515,9 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("tritanium_block4.desc", "Craft ALL color variants of Tritanium Blocks including striped ones") { description = translation.add("tritanium_block4.desc", "Craft ALL color variants of Tritanium Blocks including striped ones") {
russian("Создайте АБСОЛЮТНО ВСЕ варианты покрасок тритановых блоков, включая с полосками") russian("Создайте АБСОЛЮТНО ВСЕ варианты покрасок тритановых блоков, включая с полосками")
}, },
frameType = FrameType.CHALLENGE frameType = AdvancementType.CHALLENGE
) )
.rewards(AdvancementRewards.Builder.loot(modLocation("tritanium_block4")).addExperience(400)) .rewards(advancementLoot("tritanium_block4").addExperience(400))
.requirements(Strategy.AND) .requirements(Strategy.AND)
.also { advancement -> .also { advancement ->
MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
@ -554,7 +554,7 @@ fun addAdvancements(serializer: Consumer<AdvancementHolder>, lang: MatteryLangua
description = translation.add("all_pills.desc", "Find all possible pill types") { description = translation.add("all_pills.desc", "Find all possible pill types") {
russian("Найдите всевозможные варианты пилюль") russian("Найдите всевозможные варианты пилюль")
}, },
frameType = FrameType.CHALLENGE, frameType = AdvancementType.CHALLENGE,
hidden = true hidden = true
) )
.rewards(AdvancementRewards.Builder.experience(200)) .rewards(AdvancementRewards.Builder.experience(200))

View File

@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.advancements
import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.AdvancementHolder
import net.minecraft.advancements.AdvancementRequirements.Strategy import net.minecraft.advancements.AdvancementRequirements.Strategy
import net.minecraft.advancements.AdvancementRewards import net.minecraft.advancements.AdvancementRewards
import net.minecraft.advancements.FrameType import net.minecraft.advancements.AdvancementType
import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.EntityPredicate
import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.advancements.critereon.MinMaxBounds.Doubles import net.minecraft.advancements.critereon.MinMaxBounds.Doubles
@ -62,7 +62,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
russian("Используйте модуль нулевой точки как внутренний источник питания. Теперь только вечность будет вашим злейшим врагом") russian("Используйте модуль нулевой точки как внутренний источник питания. Теперь только вечность будет вашим злейшим врагом")
}, },
hidden = true, hidden = true,
frameType = FrameType.CHALLENGE frameType = AdvancementType.CHALLENGE
) )
.addCriterion("item", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build()).criterion()) .addCriterion("item", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build()).criterion())
.save(serializer, modLocation("android/zpm")) .save(serializer, modLocation("android/zpm"))
@ -78,7 +78,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
russian("Используйте Квантовый Аккумулятор как внутренний источник питания, можно даже подключить другой конец к Реактору Распада") russian("Используйте Квантовый Аккумулятор как внутренний источник питания, можно даже подключить другой конец к Реактору Распада")
}, },
hidden = true, hidden = true,
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.requirements(Strategy.OR) .requirements(Strategy.OR)
.addCriterion("item0", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.QUANTUM_BATTERY).build()).criterion()) .addCriterion("item0", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.QUANTUM_BATTERY).build()).criterion())
@ -126,7 +126,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
russian("Вновь обретите плоть после своей жизни как набор гаек и болтов, но вот чего-то всё равно не хватает, что было при вас с самого начала...") russian("Вновь обретите плоть после своей жизни как набор гаек и болтов, но вот чего-то всё равно не хватает, что было при вас с самого начала...")
}, },
hidden = true, hidden = true,
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("become_humane", BecomeHumaneTrigger.criterion) .addCriterion("become_humane", BecomeHumaneTrigger.criterion)
.save(serializer, modLocation("android/become_humane")) .save(serializer, modLocation("android/become_humane"))
@ -213,7 +213,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
russian("Дайте наноботам поглотить 5 сердец урона, не отключившись насовсем") russian("Дайте наноботам поглотить 5 сердец урона, не отключившись насовсем")
}, },
hidden = true, hidden = true,
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(10.0)).criterion()) .addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(10.0)).criterion())
.save(serializer, modLocation("android/nanobots_armor_deflect")) .save(serializer, modLocation("android/nanobots_armor_deflect"))
@ -229,7 +229,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
russian("Дайте наноботам поглотить 10 сердец урона, не отключившись насовсем") russian("Дайте наноботам поглотить 10 сердец урона, не отключившись насовсем")
}, },
hidden = true, hidden = true,
frameType = FrameType.CHALLENGE frameType = AdvancementType.CHALLENGE
) )
.addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(20.0)).criterion()) .addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(20.0)).criterion())
.save(serializer, modLocation("android/nanobots_armor_deflect2")) .save(serializer, modLocation("android/nanobots_armor_deflect2"))
@ -244,7 +244,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("fall_dampeners_save.desc", "Survive fall that would have otherwise be fatal without Fall Dampeners") { description = translation.add("fall_dampeners_save.desc", "Survive fall that would have otherwise be fatal without Fall Dampeners") {
russian("Выживите после падения, которое было бы фатальным без поглотителей инерции") russian("Выживите после падения, которое было бы фатальным без поглотителей инерции")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("saved", FallDampenersSaveTrigger.criterion) .addCriterion("saved", FallDampenersSaveTrigger.criterion)
.save(serializer, modLocation("android/fall_dampeners_save")) .save(serializer, modLocation("android/fall_dampeners_save"))
@ -259,7 +259,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("ender_teleport_fall_death.desc", "Fall to your demise moments after Teleporting as Android") { description = translation.add("ender_teleport_fall_death.desc", "Fall to your demise moments after Teleporting as Android") {
russian("Разбейтесь насмерть через мгновения после телепортации за андроида") russian("Разбейтесь насмерть через мгновения после телепортации за андроида")
}, },
frameType = FrameType.GOAL, frameType = AdvancementType.GOAL,
hidden = true hidden = true
) )
.addCriterion("death", EnderTeleporterFallDeathTrigger.criterion) .addCriterion("death", EnderTeleporterFallDeathTrigger.criterion)
@ -289,7 +289,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("regen_all.desc", "Max out Nanobots Regeneration research") { description = translation.add("regen_all.desc", "Max out Nanobots Regeneration research") {
russian("Полностью исследуйте регенерацию наноботов за андроида") russian("Полностью исследуйте регенерацию наноботов за андроида")
}, },
frameType = FrameType.GOAL, frameType = AdvancementType.GOAL,
) )
.addCriterion("regen0", AndroidResearchTrigger.Instance(modLocation(MNames.NANOBOTS_REGENERATION_1)).criterion()) .addCriterion("regen0", AndroidResearchTrigger.Instance(modLocation(MNames.NANOBOTS_REGENERATION_1)).criterion())
.addCriterion("regen1", AndroidResearchTrigger.Instance(modLocation(MNames.NANOBOTS_REGENERATION_2)).criterion()) .addCriterion("regen1", AndroidResearchTrigger.Instance(modLocation(MNames.NANOBOTS_REGENERATION_2)).criterion())
@ -307,7 +307,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("research_all.desc", "Research everything as Android (that don't block or get blocked by any other research)") { description = translation.add("research_all.desc", "Research everything as Android (that don't block or get blocked by any other research)") {
russian("Исследуйте все технологии за андроида (которые не блокируют и не блокируются другими технологиями)") russian("Исследуйте все технологии за андроида (которые не блокируют и не блокируются другими технологиями)")
}, },
frameType = FrameType.CHALLENGE frameType = AdvancementType.CHALLENGE
) )
.rewards(AdvancementRewards.Builder.experience(400).addLootTable(modLocation("research_all_android"))) .rewards(AdvancementRewards.Builder.experience(400).addLootTable(modLocation("research_all_android")))
.also { advancement -> .also { advancement ->
@ -343,7 +343,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("shockwave_warden.desc", "Hurt Warden using Shockwave ability") { description = translation.add("shockwave_warden.desc", "Hurt Warden using Shockwave ability") {
russian("Нанесите хранителю урон используя ударную волну") russian("Нанесите хранителю урон используя ударную волну")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("shockwave_warden", ShockwaveDamageMobTrigger.Instance(Optional.of(EntityPredicate.Builder.entity().of(EntityType.WARDEN).build().wrap())).criterion()) .addCriterion("shockwave_warden", ShockwaveDamageMobTrigger.Instance(Optional.of(EntityPredicate.Builder.entity().of(EntityType.WARDEN).build().wrap())).criterion())
.save(serializer, modLocation("android/shockwave_warden")) .save(serializer, modLocation("android/shockwave_warden"))
@ -358,7 +358,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("wither.desc", "Defeat The Wither as Android. The Wither was surely confused over kind of thing you are") { description = translation.add("wither.desc", "Defeat The Wither as Android. The Wither was surely confused over kind of thing you are") {
russian("Победите Иссушителя будучи андроидом. Наверняка Иссушитель был ошеломлён таким раскладом дел") russian("Победите Иссушителя будучи андроидом. Наверняка Иссушитель был ошеломлён таким раскладом дел")
}, },
frameType = FrameType.GOAL, frameType = AdvancementType.GOAL,
hidden = true hidden = true
) )
.addCriterion("kill_wither", KillAsAndroidTrigger.Instance( .addCriterion("kill_wither", KillAsAndroidTrigger.Instance(
@ -376,7 +376,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("travel_underwater.desc", "Travel at least 200 meters underwater as Android without Air Bags research. This reminds us of someone...") { description = translation.add("travel_underwater.desc", "Travel at least 200 meters underwater as Android without Air Bags research. This reminds us of someone...") {
russian("Преодолейте как минимум 200 метров под водой будучи андроидом без исследования воздушных мешков. Кого-то это нам напоминает...") russian("Преодолейте как минимум 200 метров под водой будучи андроидом без исследования воздушных мешков. Кого-то это нам напоминает...")
}, },
frameType = FrameType.GOAL, frameType = AdvancementType.GOAL,
hidden = true hidden = true
) )
.addCriterion("travel", AndroidTravelUnderwater.Instance(200.0).criterion()) .addCriterion("travel", AndroidTravelUnderwater.Instance(200.0).criterion())
@ -392,7 +392,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("travel_underwater2.desc", "Travel at least 1046 meters underwater as Android without Air Bags research, like someone else did so") { description = translation.add("travel_underwater2.desc", "Travel at least 1046 meters underwater as Android without Air Bags research, like someone else did so") {
russian("Преодолейте как минимум 1046 метров под водой будучи андроидом без исследования воздушных мешков, прям как тот, кто так однажды так и сделал") russian("Преодолейте как минимум 1046 метров под водой будучи андроидом без исследования воздушных мешков, прям как тот, кто так однажды так и сделал")
}, },
frameType = FrameType.CHALLENGE, frameType = AdvancementType.CHALLENGE,
hidden = true hidden = true
) )
.addCriterion("travel", AndroidTravelUnderwater.Instance(1046.0).criterion()) .addCriterion("travel", AndroidTravelUnderwater.Instance(1046.0).criterion())
@ -408,7 +408,7 @@ fun addAndroidAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("elder_guardian.desc", "Slay Elder Guardian as Android without Air Bags researched") { description = translation.add("elder_guardian.desc", "Slay Elder Guardian as Android without Air Bags researched") {
russian("Победите Древнего стража будучи андроидом без исследования воздушных мешков") russian("Победите Древнего стража будучи андроидом без исследования воздушных мешков")
}, },
frameType = FrameType.CHALLENGE, frameType = AdvancementType.CHALLENGE,
hidden = true hidden = true
) )
.addCriterion("kill_elder_guardian", KillAsAndroidTrigger.Instance( .addCriterion("kill_elder_guardian", KillAsAndroidTrigger.Instance(

View File

@ -1,12 +1,10 @@
package ru.dbotthepony.mc.otm.datagen.advancements package ru.dbotthepony.mc.otm.datagen.advancements
import net.minecraft.advancements.Advancement
import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.AdvancementHolder
import net.minecraft.advancements.FrameType import net.minecraft.advancements.AdvancementType
import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraftforge.common.data.ExistingFileHelper
import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
@ -32,7 +30,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("zpm_battery.desc", "Use Zero Point Module as power source in Exopack") { description = translation.add("zpm_battery.desc", "Use Zero Point Module as power source in Exopack") {
russian("Используйте модуль нулевой точки как источник питания в Экзопаке") russian("Используйте модуль нулевой точки как источник питания в Экзопаке")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("zpm_battery", ExopackBatterySlotTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build()).criterion()) .addCriterion("zpm_battery", ExopackBatterySlotTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build()).criterion())
.save(serializer, modLocation("exopack/zpm_battery")) .save(serializer, modLocation("exopack/zpm_battery"))
@ -47,7 +45,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("obtained.desc", "Obtain an Exopack, a mysterious, semi-present, light as a feather, stuff storage on your back") { description = translation.add("obtained.desc", "Obtain an Exopack, a mysterious, semi-present, light as a feather, stuff storage on your back") {
russian("Получите Экзопак, загадочное, полу-присутствующее, лёгкое как пёрышко, хранилище штуковин на вашей спине") russian("Получите Экзопак, загадочное, полу-присутствующее, лёгкое как пёрышко, хранилище штуковин на вашей спине")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("obtained", ExopackObtainedTrigger.criterion) .addCriterion("obtained", ExopackObtainedTrigger.criterion)
.save(serializer, modLocation("exopack/obtained")) .save(serializer, modLocation("exopack/obtained"))
@ -150,7 +148,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("size3.desc", "Reach 108 slots in your Exopack storage") { description = translation.add("size3.desc", "Reach 108 slots in your Exopack storage") {
russian("Достигните 108 слотов хранилища Экзопака") russian("Достигните 108 слотов хранилища Экзопака")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("size3", ExopackSlotsExpandedTrigger.Instance(minTotal = 108).criterion()) .addCriterion("size3", ExopackSlotsExpandedTrigger.Instance(minTotal = 108).criterion())
.save(serializer, modLocation("exopack/size3")) .save(serializer, modLocation("exopack/size3"))
@ -166,7 +164,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("size4.desc", "Reach 432 slots in your Exopack storage. You could fit a house in there") { description = translation.add("size4.desc", "Reach 432 slots in your Exopack storage. You could fit a house in there") {
russian("Достигните 432 слотов хранилища Экзопака. Туда можно уже впихнуть целый дом") russian("Достигните 432 слотов хранилища Экзопака. Туда можно уже впихнуть целый дом")
}, },
frameType = FrameType.CHALLENGE frameType = AdvancementType.CHALLENGE
) )
.addCriterion("size4", ExopackSlotsExpandedTrigger.Instance(minTotal = 432).criterion()) .addCriterion("size4", ExopackSlotsExpandedTrigger.Instance(minTotal = 432).criterion())
.save(serializer, modLocation("exopack/size4")) .save(serializer, modLocation("exopack/size4"))
@ -182,7 +180,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("size5.desc", "Reach 1728 slots in your Exopack storage. Why would you need to go any bigger?!") { description = translation.add("size5.desc", "Reach 1728 slots in your Exopack storage. Why would you need to go any bigger?!") {
russian("Достигните 1728 слотов хранилища Экзопака. Куда вам столько?!") russian("Достигните 1728 слотов хранилища Экзопака. Куда вам столько?!")
}, },
frameType = FrameType.CHALLENGE frameType = AdvancementType.CHALLENGE
) )
.addCriterion("size5", ExopackSlotsExpandedTrigger.Instance(minTotal = 1728).criterion()) .addCriterion("size5", ExopackSlotsExpandedTrigger.Instance(minTotal = 1728).criterion())
.save(serializer, modLocation("exopack/size5")) .save(serializer, modLocation("exopack/size5"))
@ -226,7 +224,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("once2.desc", "Upgrade your Exopack storage with 54 slots using one module") { description = translation.add("once2.desc", "Upgrade your Exopack storage with 54 slots using one module") {
russian("Улучшите хранилище Экзопака модулем на 54 слотов") russian("Улучшите хранилище Экзопака модулем на 54 слотов")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("once2", ExopackSlotsExpandedTrigger.Instance(minGained = 54).criterion()) .addCriterion("once2", ExopackSlotsExpandedTrigger.Instance(minGained = 54).criterion())
.save(serializer, modLocation("exopack/once2")) .save(serializer, modLocation("exopack/once2"))
@ -242,7 +240,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("once3.desc", "Upgrade your Exopack storage with 90 slots using one module") { description = translation.add("once3.desc", "Upgrade your Exopack storage with 90 slots using one module") {
russian("Улучшите хранилище Экзопака модулем на 90 слотов") russian("Улучшите хранилище Экзопака модулем на 90 слотов")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("once3", ExopackSlotsExpandedTrigger.Instance(minGained = 90).criterion()) .addCriterion("once3", ExopackSlotsExpandedTrigger.Instance(minGained = 90).criterion())
.save(serializer, modLocation("exopack/once3")) .save(serializer, modLocation("exopack/once3"))
@ -258,7 +256,7 @@ fun addExopackAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("once4.desc", "Upgrade your Exopack storage with 150 slots using one module. After you open one, tens meters long racks roll out of it!") { description = translation.add("once4.desc", "Upgrade your Exopack storage with 150 slots using one module. After you open one, tens meters long racks roll out of it!") {
russian("Улучшите хранилище Экзопака модулем на 150 слотов. Открой один - и покатились стеллажи на десятки метров!") russian("Улучшите хранилище Экзопака модулем на 150 слотов. Открой один - и покатились стеллажи на десятки метров!")
}, },
frameType = FrameType.CHALLENGE frameType = AdvancementType.CHALLENGE
) )
.addCriterion("once4", ExopackSlotsExpandedTrigger.Instance(minGained = 150).criterion()) .addCriterion("once4", ExopackSlotsExpandedTrigger.Instance(minGained = 150).criterion())
.save(serializer, modLocation("exopack/once4")) .save(serializer, modLocation("exopack/once4"))

View File

@ -1,30 +1,53 @@
package ru.dbotthepony.mc.otm.datagen.advancements package ru.dbotthepony.mc.otm.datagen.advancements
import net.minecraft.advancements.Advancement import net.minecraft.advancements.Advancement
import net.minecraft.advancements.AdvancementHolder
import net.minecraft.advancements.AdvancementRewards
import net.minecraft.advancements.AdvancementType
import net.minecraft.advancements.Criterion import net.minecraft.advancements.Criterion
import net.minecraft.advancements.CriterionTriggerInstance
import net.minecraft.advancements.DisplayInfo import net.minecraft.advancements.DisplayInfo
import net.minecraft.advancements.FrameType
import net.minecraft.advancements.critereon.ContextAwarePredicate import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.EntityPredicate
import net.minecraft.advancements.critereon.InventoryChangeTrigger import net.minecraft.advancements.critereon.InventoryChangeTrigger
import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.core.registries.Registries
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceKey
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.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.datagen.modLocation
import java.util.function.Consumer
fun AdvancementBuilder(): Advancement.Builder = Advancement.Builder.advancement() fun AdvancementBuilder(): Advancement.Builder = Advancement.Builder.advancement()
fun Advancement.Builder.save(serializer: Consumer<AdvancementHolder>, name: ResourceLocation): AdvancementHolder {
val built = build(name)
serializer.accept(built)
return built
}
fun advancementLoot(location: ResourceLocation): AdvancementRewards.Builder {
return AdvancementRewards.Builder.loot(ResourceKey.create(Registries.LOOT_TABLE, location))
}
fun advancementLoot(location: String): AdvancementRewards.Builder {
return advancementLoot(modLocation(location))
}
fun AdvancementRewards.Builder.addLootTable(location: ResourceLocation): AdvancementRewards.Builder {
return addLootTable(ResourceKey.create(Registries.LOOT_TABLE, location))
}
fun DisplayInfo( fun DisplayInfo(
itemStack: ItemStack, itemStack: ItemStack,
title: Component = TextComponent("undefined"), title: Component = TextComponent("undefined"),
description: Component = TextComponent("undefined"), description: Component = TextComponent("undefined"),
background: ResourceLocation? = null, background: ResourceLocation? = null,
frameType: FrameType = FrameType.TASK, frameType: AdvancementType = AdvancementType.TASK,
showToast: Boolean = true, showToast: Boolean = true,
announceChat: Boolean = true, announceChat: Boolean = true,
hidden: Boolean = false, hidden: Boolean = false,
@ -48,7 +71,7 @@ fun Advancement.Builder.display(
title: Component = TextComponent("undefined"), title: Component = TextComponent("undefined"),
description: Component = TextComponent("undefined"), description: Component = TextComponent("undefined"),
background: ResourceLocation? = null, background: ResourceLocation? = null,
frameType: FrameType = FrameType.TASK, frameType: AdvancementType = AdvancementType.TASK,
showToast: Boolean = true, showToast: Boolean = true,
announceChat: Boolean = true, announceChat: Boolean = true,
hidden: Boolean = false, hidden: Boolean = false,

View File

@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.advancements
import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.AdvancementHolder
import net.minecraft.advancements.AdvancementRequirements import net.minecraft.advancements.AdvancementRequirements
import net.minecraft.advancements.FrameType import net.minecraft.advancements.AdvancementType
import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
@ -148,7 +148,7 @@ fun addMachineAdvancements(serializer: Consumer<AdvancementHolder>, lang: Matter
description = translation.add("replicate_something.desc", "Replicate something using Matter Replicator. If you replicated some food, be first to taste it among your company") { description = translation.add("replicate_something.desc", "Replicate something using Matter Replicator. If you replicated some food, be first to taste it among your company") {
russian("Среплицируйте что либо используя репликатор материи. Если это еда, то не стесняйтесь быть первым, кто попробует её на вкус среди вашей компании") russian("Среплицируйте что либо используя репликатор материи. Если это еда, то не стесняйтесь быть первым, кто попробует её на вкус среди вашей компании")
}, },
frameType = FrameType.GOAL frameType = AdvancementType.GOAL
) )
.addCriterion("replicate_something", TakeItemOutOfReplicatorTrigger.Instance(ItemPredicate.Builder.item().of(MItems.MATTER_DUST).build(), true).criterion()) .addCriterion("replicate_something", TakeItemOutOfReplicatorTrigger.Instance(ItemPredicate.Builder.item().of(MItems.MATTER_DUST).build(), true).criterion())
.save(serializer, modLocation("machines/replicate_something")) .save(serializer, modLocation("machines/replicate_something"))

View File

@ -2,9 +2,9 @@ package ru.dbotthepony.mc.otm.datagen.blocks
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraftforge.client.model.generators.BlockStateProvider import net.neoforged.neoforge.client.model.generators.BlockStateProvider
import net.minecraftforge.client.model.generators.ConfiguredModel import net.neoforged.neoforge.client.model.generators.ConfiguredModel
import net.minecraftforge.data.event.GatherDataEvent import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom
import ru.dbotthepony.mc.otm.core.math.yRotationBlockstateNorth import ru.dbotthepony.mc.otm.core.math.yRotationBlockstateNorth

View File

@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.blocks
import net.minecraft.world.level.block.state.properties.BlockStateProperties import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
import net.minecraftforge.client.model.generators.ConfiguredModel import net.neoforged.neoforge.client.model.generators.ConfiguredModel
import ru.dbotthepony.mc.otm.block.CableBlock import ru.dbotthepony.mc.otm.block.CableBlock
import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock
import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.entity.WorkerState

View File

@ -5,9 +5,9 @@ import net.minecraft.resources.ResourceLocation
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.RotatedPillarBlock import net.minecraft.world.level.block.RotatedPillarBlock
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import net.minecraftforge.client.model.generators.BlockStateProvider import net.neoforged.neoforge.client.model.generators.BlockStateProvider
import net.minecraftforge.client.model.generators.ConfiguredModel import net.neoforged.neoforge.client.model.generators.ConfiguredModel
import net.minecraftforge.data.event.GatherDataEvent import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.core.getValueNullable import ru.dbotthepony.mc.otm.core.getValueNullable
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom

View File

@ -6,9 +6,10 @@ import net.minecraft.server.packs.PackType
import net.minecraft.world.item.ArmorItem import net.minecraft.world.item.ArmorItem
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraftforge.client.model.generators.ItemModelProvider import net.neoforged.neoforge.client.model.generators.ItemModelProvider
import net.minecraftforge.data.event.GatherDataEvent import net.neoforged.neoforge.data.event.GatherDataEvent
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.DataGen
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
@ -104,7 +105,7 @@ class MatteryItemModelProvider(event: GatherDataEvent) : ItemModelProvider(event
if (item is ArmorItem) { if (item is ArmorItem) {
for ((i, material) in ARMOR_TRIM_MATERIALS.withIndex()) { for ((i, material) in ARMOR_TRIM_MATERIALS.withIndex()) {
val trimLocation = ResourceLocation("trims/items/${item.type.getName()}_trim_${material}") val trimLocation = ResourceLocation.withDefaultNamespace("trims/items/${item.type.getName()}_trim_${material}")
existingFileHelper.trackGenerated(trimLocation, PackType.CLIENT_RESOURCES, ".png", "textures") existingFileHelper.trackGenerated(trimLocation, PackType.CLIENT_RESOURCES, ".png", "textures")
val overrideModel = withExistingParent("${item.registryName!!.path}_${material}_trim", GENERATED) val overrideModel = withExistingParent("${item.registryName!!.path}_${material}_trim", GENERATED)

View File

@ -722,7 +722,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive") add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive")
add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive") add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive")
add(MItems.PLASMA_RIFLE, "Plasma Repeater")
add(MItems.TRITANIUM_ORE_CLUMP, "Raw Tritanium") add(MItems.TRITANIUM_ORE_CLUMP, "Raw Tritanium")
add(MItems.PATTERN_DRIVE_NORMAL, "Pattern Drive") add(MItems.PATTERN_DRIVE_NORMAL, "Pattern Drive")
add(MItems.PATTERN_DRIVE_CREATIVE, "Creative Pattern Drive") add(MItems.PATTERN_DRIVE_CREATIVE, "Creative Pattern Drive")

View File

@ -15,10 +15,9 @@ import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.item.enchantment.Enchantment
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraftforge.common.data.LanguageProvider import net.neoforged.neoforge.common.data.LanguageProvider
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.android.AndroidFeatureType import ru.dbotthepony.mc.otm.android.AndroidFeatureType
import ru.dbotthepony.mc.otm.android.AndroidResearch
import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.android.AndroidResearchType
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.DataGen
@ -88,7 +87,6 @@ class MatteryLanguageProvider(private val gen: DataGenerator) {
fun addItem(key: Collection<Item>, value: String) = key.forEach { add(it, value) } fun addItem(key: Collection<Item>, value: String) = key.forEach { add(it, value) }
fun add(key: Item, suffix: String, value: String) = slave.add("${key.descriptionId}.${suffix}", value) fun add(key: Item, suffix: String, value: String) = slave.add("${key.descriptionId}.${suffix}", value)
fun add(key: ItemStack, value: String) = slave.add(key, value) fun add(key: ItemStack, value: String) = slave.add(key, value)
fun add(key: Enchantment, value: String) = slave.add(key, value)
fun add(key: MobEffect, value: String) = slave.add(key, value) fun add(key: MobEffect, value: String) = slave.add(key, value)
fun add(key: EntityType<*>, value: String) = slave.add(key, value) fun add(key: EntityType<*>, value: String) = slave.add(key, value)

View File

@ -727,7 +727,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive") add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive")
add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive") add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive")
add(MItems.PLASMA_RIFLE, "Плазменная винтовка")
add(MItems.TRITANIUM_ORE_CLUMP, "Рудный тритан") add(MItems.TRITANIUM_ORE_CLUMP, "Рудный тритан")
add(MItems.PATTERN_DRIVE_NORMAL, "Диск шаблонов") add(MItems.PATTERN_DRIVE_NORMAL, "Диск шаблонов")
add(MItems.PATTERN_DRIVE_CREATIVE, "Творческий диск шаблонов") add(MItems.PATTERN_DRIVE_CREATIVE, "Творческий диск шаблонов")

View File

@ -1,9 +1,9 @@
package ru.dbotthepony.mc.otm.datagen.loot package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.data.DataGenerator
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraftforge.common.data.GlobalLootModifierProvider import net.neoforged.neoforge.common.data.GlobalLootModifierProvider
import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.data.loot.LootPoolAppender import ru.dbotthepony.mc.otm.data.loot.LootPoolAppender
import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.DataGen
import java.util.Arrays import java.util.Arrays
@ -51,7 +51,7 @@ fun PlainLootAppender(
vararg items: Pair<ItemStack, Double> vararg items: Pair<ItemStack, Double>
) = PlainLootAppender(conditions, Arrays.stream(items)) ) = PlainLootAppender(conditions, Arrays.stream(items))
class LootModifiers(generator: DataGenerator) : GlobalLootModifierProvider(generator.packOutput, DataGen.MOD_ID) { class LootModifiers(generator: GatherDataEvent) : GlobalLootModifierProvider(generator.generator.packOutput, generator.lookupProvider, DataGen.MOD_ID) {
private val lambdas = ArrayList<(LootModifiers) -> Unit>() private val lambdas = ArrayList<(LootModifiers) -> Unit>()
fun lambda(lambda: (LootModifiers) -> Unit) { fun lambda(lambda: (LootModifiers) -> Unit) {

View File

@ -1,12 +1,15 @@
package ru.dbotthepony.mc.otm.datagen.loot package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.util.valueproviders.UniformInt import net.minecraft.util.valueproviders.UniformInt
import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.EntityType
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.storage.loot.BuiltInLootTables import net.minecraft.world.level.storage.loot.BuiltInLootTables
import net.minecraft.world.level.storage.loot.LootTable
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraftforge.common.loot.LootTableIdCondition import net.neoforged.neoforge.common.loot.LootTableIdCondition
import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.data.UniformDecimal import ru.dbotthepony.mc.otm.data.UniformDecimal
import ru.dbotthepony.mc.otm.data.condition.ChanceWithPlaytimeCondition import ru.dbotthepony.mc.otm.data.condition.ChanceWithPlaytimeCondition
@ -28,6 +31,11 @@ fun LootTableIdCondition(location: ResourceLocation): LootItemCondition {
return LootTableIdCondition.Builder(location).build() return LootTableIdCondition.Builder(location).build()
} }
@Suppress("FunctionName")
fun LootTableIdCondition(location: ResourceKey<LootTable>): LootItemCondition {
return LootTableIdCondition.Builder(location.location()).build()
}
fun addLootModifiers(it: LootModifiers) { fun addLootModifiers(it: LootModifiers) {
it.add("dungeon_exopack", LootPoolAppender( it.add("dungeon_exopack", LootPoolAppender(
arrayOf(LootTableIdCondition(BuiltInLootTables.SIMPLE_DUNGEON)), arrayOf(LootTableIdCondition(BuiltInLootTables.SIMPLE_DUNGEON)),

View File

@ -6,10 +6,12 @@ package ru.dbotthepony.mc.otm.datagen.loot
import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap
import it.unimi.dsi.fastutil.objects.Reference2ObjectFunction import it.unimi.dsi.fastutil.objects.Reference2ObjectFunction
import net.minecraft.advancements.critereon.StatePropertiesPredicate import net.minecraft.advancements.critereon.StatePropertiesPredicate
import net.minecraft.core.WritableRegistry
import net.minecraft.data.DataGenerator import net.minecraft.data.DataGenerator
import net.minecraft.data.loot.LootTableProvider import net.minecraft.data.loot.LootTableProvider
import net.minecraft.data.loot.LootTableSubProvider import net.minecraft.data.loot.LootTableSubProvider
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceKey
import net.minecraft.util.ProblemReporter
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.SlabBlock import net.minecraft.world.level.block.SlabBlock
@ -19,33 +21,25 @@ import net.minecraft.world.level.storage.loot.LootTable
import net.minecraft.world.level.storage.loot.ValidationContext import net.minecraft.world.level.storage.loot.ValidationContext
import net.minecraft.world.level.storage.loot.entries.LootItem import net.minecraft.world.level.storage.loot.entries.LootItem
import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer
import net.minecraft.world.level.storage.loot.functions.CopyNbtFunction
import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue import net.minecraft.world.level.storage.loot.providers.number.ConstantValue
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
import ru.dbotthepony.mc.otm.core.stream import ru.dbotthepony.mc.otm.core.stream
import ru.dbotthepony.mc.otm.data.loot.CopyTileNbtFunction import ru.dbotthepony.mc.otm.data.loot.CopyTileNbtFunction
data class NbtCopy(val source: String, val destination: String, val strategy: CopyNbtFunction.MergeStrategy = CopyNbtFunction.MergeStrategy.REPLACE) class LootTables(generator: GatherDataEvent) : LootTableProvider(generator.generator.packOutput, setOf() /* because we don't fucking validate you fuck */, listOf() /* because we attach everything after class is constructed duh */, generator.lookupProvider) {
private val providersTable = Reference2ObjectArrayMap<LootContextParamSet, HashMap<ResourceKey<LootTable>, () -> LootTable.Builder>>()
fun TileNbtCopy(source: String, strategy: CopyNbtFunction.MergeStrategy = CopyNbtFunction.MergeStrategy.REPLACE): NbtCopy { fun builder(context: LootContextParamSet, id: ResourceKey<LootTable>, provider: LootTable.Builder.() -> Unit) {
return NbtCopy(source, "BlockEntityTag.$source", strategy)
}
class LootTables(generator: DataGenerator) : LootTableProvider(generator.packOutput, setOf() /* because we don't fucking validate you fuck */, listOf() /* because we attach everything after class is constructed duh */) {
private val providersTable = Reference2ObjectArrayMap<LootContextParamSet, HashMap<ResourceLocation, () -> LootTable.Builder>>()
fun builder(context: LootContextParamSet, id: ResourceLocation, provider: LootTable.Builder.() -> Unit) {
provider(context, id) { provider(context, id) {
LootTable.lootTable().also(provider) LootTable.lootTable().also(provider)
} }
} }
fun provider(context: LootContextParamSet, id: ResourceLocation, provider: () -> LootTable.Builder) { fun provider(context: LootContextParamSet, id: ResourceKey<LootTable>, provider: () -> LootTable.Builder) {
check(providersTable check(providersTable
.computeIfAbsent(context, Reference2ObjectFunction { HashMap() }) .computeIfAbsent(context, Reference2ObjectFunction { HashMap() })
.put(id, provider) == null) { "Duplicate loot pool entry for $id" } .put(id, provider) == null) { "Duplicate loot pool entry for $id" }
@ -63,7 +57,11 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator.packOut
}.toList() }.toList()
} }
override fun validate(map: MutableMap<ResourceLocation, LootTable>, validationtracker: ValidationContext) {} override fun validate(
writableregistry: WritableRegistry<LootTable>,
validationtracker: ValidationContext,
`problemreporter$collector`: ProblemReporter.Collector
) {}
fun createSlabItemTable(block: Block, configurator: LootPoolSingletonContainer.Builder<*>.() -> Unit = {}) { fun createSlabItemTable(block: Block, configurator: LootPoolSingletonContainer.Builder<*>.() -> Unit = {}) {
builder(LootContextParamSets.BLOCK, block.lootTable) { builder(LootContextParamSets.BLOCK, block.lootTable) {
@ -100,7 +98,7 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator.packOut
} }
} }
fun singleLootPool(context: LootContextParamSet, id: ResourceLocation, block: LootPool.Builder.() -> Unit) { fun singleLootPool(context: LootContextParamSet, id: ResourceKey<LootTable>, block: LootPool.Builder.() -> Unit) {
builder(context, id) { builder(context, id) {
withPool(LootPool.lootPool().also(block)) withPool(LootPool.lootPool().also(block))
} }

View File

@ -1,14 +1,12 @@
package ru.dbotthepony.mc.otm.datagen.loot package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.level.storage.loot.entries.LootItem
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue import ru.dbotthepony.mc.otm.datagen.modLootTable
import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
fun addChestLootTables(loot: LootTables) { fun addChestLootTables(loot: LootTables) {
loot.builder(LootContextParamSets.CHEST, modLocation("food_box")) { loot.builder(LootContextParamSets.CHEST, modLootTable("food_box")) {
lootPool { lootPool {
item(Items.PACKED_ICE) { setCount(minimal = 1, maximal = 3) } item(Items.PACKED_ICE) { setCount(minimal = 1, maximal = 3) }
item(MItems.NUTRIENT_PASTE) { setCount(minimal = 1, maximal = 2) } item(MItems.NUTRIENT_PASTE) { setCount(minimal = 1, maximal = 2) }

View File

@ -7,6 +7,7 @@ import net.minecraft.world.level.storage.loot.entries.LootItem
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.datagen.modLootTable
import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
@ -87,13 +88,13 @@ fun addLootTables(lootTables: LootTables) {
} }
} }
lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("research_all_android")) { lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLootTable("research_all_android")) {
lootPool { lootPool {
add(LootItem.lootTableItem(MItems.ExopackUpgrades.INVENTORY_UPGRADE_HUGE)) add(LootItem.lootTableItem(MItems.ExopackUpgrades.INVENTORY_UPGRADE_HUGE))
} }
} }
lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("tritanium_block3")) { lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLootTable("tritanium_block3")) {
lootPool { item(Items.WHITE_DYE) { setCount(8) } } lootPool { item(Items.WHITE_DYE) { setCount(8) } }
lootPool { item(Items.ORANGE_DYE) { setCount(8) } } lootPool { item(Items.ORANGE_DYE) { setCount(8) } }
lootPool { item(Items.MAGENTA_DYE) { setCount(8) } } lootPool { item(Items.MAGENTA_DYE) { setCount(8) } }
@ -112,7 +113,7 @@ fun addLootTables(lootTables: LootTables) {
lootPool { item(Items.BLACK_DYE) { setCount(8) } } lootPool { item(Items.BLACK_DYE) { setCount(8) } }
} }
lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("tritanium_block4")) { lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLootTable("tritanium_block4")) {
lootPool { item(Items.WHITE_DYE) { setCount(64) } } lootPool { item(Items.WHITE_DYE) { setCount(64) } }
lootPool { item(Items.ORANGE_DYE) { setCount(64) } } lootPool { item(Items.ORANGE_DYE) { setCount(64) } }
lootPool { item(Items.MAGENTA_DYE) { setCount(64) } } lootPool { item(Items.MAGENTA_DYE) { setCount(64) } }

View File

@ -2,8 +2,8 @@ package ru.dbotthepony.mc.otm.datagen.models
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraftforge.client.model.generators.BlockModelProvider import net.neoforged.neoforge.client.model.generators.BlockModelProvider
import net.minecraftforge.data.event.GatherDataEvent import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.DataGen
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation

View File

@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.data.recipes.RecipeCategory import net.minecraft.data.recipes.RecipeCategory
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraft.tags.ItemTags import net.minecraft.tags.ItemTags
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems

View File

@ -1,6 +1,6 @@
package ru.dbotthepony.mc.otm.datagen.recipes package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.data.recipes.FinishedRecipe import net.minecraft.core.component.DataComponents
import net.minecraft.data.recipes.RecipeCategory import net.minecraft.data.recipes.RecipeCategory
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraft.data.recipes.ShapelessRecipeBuilder import net.minecraft.data.recipes.ShapelessRecipeBuilder
@ -8,7 +8,7 @@ import net.minecraft.tags.ItemTags
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
@ -17,7 +17,6 @@ import ru.dbotthepony.mc.otm.registry.MRegistry
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.recipe.UpgradeRecipe import ru.dbotthepony.mc.otm.recipe.UpgradeRecipe
import java.util.function.Consumer
fun addCraftingTableRecipes(consumer: RecipeOutput) { fun addCraftingTableRecipes(consumer: RecipeOutput) {
val machinesCategory = RecipeCategory.DECORATIONS val machinesCategory = RecipeCategory.DECORATIONS
@ -75,7 +74,7 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
for ((color, item) in MItems.PLATE_PRESS) { for ((color, item) in MItems.PLATE_PRESS) {
MatteryRecipe(MBlocks.TWIN_PLATE_PRESS[color]!!, category = machinesCategory) MatteryRecipe(MBlocks.TWIN_PLATE_PRESS[color]!!, category = machinesCategory)
.setUpgradeSource(item) .setUpgradeSource(item)
.addUpgradeOps(UpgradeRecipe.All) .addUpgradeOps(UpgradeRecipe.CopyAllComponents)
.rowA(item) .rowA(item)
.build(consumer, "plate_press_migration/${color?.name?.lowercase() ?: "default"}") .build(consumer, "plate_press_migration/${color?.name?.lowercase() ?: "default"}")
} }
@ -105,14 +104,14 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
// Блоки // Блоки
MatteryRecipe(MItems.MATTER_CAPACITOR_BANK[null]!!, category = machinesCategory) MatteryRecipe(MItems.MATTER_CAPACITOR_BANK[null]!!, category = machinesCategory)
.row(Tags.Items.GLASS, MItemTags.IRON_PLATES, Tags.Items.GLASS) .row(Tags.Items.GLASS_BLOCKS, MItemTags.IRON_PLATES, Tags.Items.GLASS_BLOCKS)
.row(MItemTags.IRON_PLATES, MItems.MACHINE_FRAME, MItemTags.IRON_PLATES) .row(MItemTags.IRON_PLATES, MItems.MACHINE_FRAME, MItemTags.IRON_PLATES)
.row(MItems.MATTER_CABLE, MItems.MATTER_IO_PORT, MItems.MATTER_CABLE) .row(MItems.MATTER_CABLE, MItems.MATTER_IO_PORT, MItems.MATTER_CABLE)
.unlockedBy(MItems.MATTER_CABLE) .unlockedBy(MItems.MATTER_CABLE)
.build(consumer) .build(consumer)
MatteryRecipe(MItems.BATTERY_BANK[null]!!, category = machinesCategory) MatteryRecipe(MItems.BATTERY_BANK[null]!!, category = machinesCategory)
.row(Tags.Items.GLASS, MItemTags.IRON_PLATES, Tags.Items.GLASS) .row(Tags.Items.GLASS_BLOCKS, MItemTags.IRON_PLATES, Tags.Items.GLASS_BLOCKS)
.row(MItemTags.IRON_PLATES, MItems.MACHINE_FRAME, MItemTags.IRON_PLATES) .row(MItemTags.IRON_PLATES, MItems.MACHINE_FRAME, MItemTags.IRON_PLATES)
.row(MItems.ELECTRIC_PARTS, MItems.ENERGY_BUS, MItems.ELECTRIC_PARTS) .row(MItems.ELECTRIC_PARTS, MItems.ENERGY_BUS, MItems.ELECTRIC_PARTS)
.unlockedBy(MItems.ENERGY_BUS) .unlockedBy(MItems.ENERGY_BUS)
@ -156,7 +155,7 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
.build(consumer) .build(consumer)
MatteryRecipe(MItems.PHANTOM_ATTRACTOR, category = machinesCategory) MatteryRecipe(MItems.PHANTOM_ATTRACTOR, category = machinesCategory)
.row(Tags.Items.DUSTS_REDSTONE, Tags.Items.GLASS_COLORLESS, Tags.Items.DUSTS_REDSTONE) .row(Tags.Items.DUSTS_REDSTONE, Tags.Items.GLASS_BLOCKS_COLORLESS, Tags.Items.DUSTS_REDSTONE)
.row(MItemTags.TRITANIUM_PLATES, MItems.QUANTUM_TRANSCEIVER, MItemTags.TRITANIUM_PLATES) .row(MItemTags.TRITANIUM_PLATES, MItems.QUANTUM_TRANSCEIVER, MItemTags.TRITANIUM_PLATES)
.row(MItemTags.TRITANIUM_PLATES, ItemTags.BEDS, MItemTags.TRITANIUM_PLATES) .row(MItemTags.TRITANIUM_PLATES, ItemTags.BEDS, MItemTags.TRITANIUM_PLATES)
.unlockedBy(MItems.QUANTUM_TRANSCEIVER) .unlockedBy(MItems.QUANTUM_TRANSCEIVER)
@ -216,10 +215,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
// броня // броня
MatteryRecipe(MItems.TRITANIUM_HELMET, category = RecipeCategory.COMBAT) MatteryRecipe(MItems.TRITANIUM_HELMET, category = RecipeCategory.COMBAT)
.setUpgradeSource(Items.LEATHER_HELMET) .setUpgradeSource(Items.LEATHER_HELMET)
.addUpgradeOps( .addUpgradeOps(UpgradeRecipe.CopyEnchantments)
UpgradeRecipe.Direct("display"), .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME))
UpgradeRecipe.Direct("Enchantments"),
)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_HELMET, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_HELMET, MItemTags.REINFORCED_TRITANIUM_PLATES)
.unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES) .unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES)
@ -227,10 +224,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.TRITANIUM_PANTS, category = RecipeCategory.COMBAT) MatteryRecipe(MItems.TRITANIUM_PANTS, category = RecipeCategory.COMBAT)
.setUpgradeSource(Items.LEATHER_LEGGINGS) .setUpgradeSource(Items.LEATHER_LEGGINGS)
.addUpgradeOps( .addUpgradeOps(UpgradeRecipe.CopyEnchantments)
UpgradeRecipe.Direct("display"), .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME))
UpgradeRecipe.Direct("Enchantments"),
)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_LEGGINGS, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_LEGGINGS, MItemTags.REINFORCED_TRITANIUM_PLATES)
.rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES)
@ -239,10 +234,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.TRITANIUM_CHESTPLATE, category = RecipeCategory.COMBAT) MatteryRecipe(MItems.TRITANIUM_CHESTPLATE, category = RecipeCategory.COMBAT)
.setUpgradeSource(Items.LEATHER_CHESTPLATE) .setUpgradeSource(Items.LEATHER_CHESTPLATE)
.addUpgradeOps( .addUpgradeOps(UpgradeRecipe.CopyEnchantments)
UpgradeRecipe.Direct("display"), .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME))
UpgradeRecipe.Direct("Enchantments"),
)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_CHESTPLATE, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_CHESTPLATE, MItemTags.REINFORCED_TRITANIUM_PLATES)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES)
@ -251,10 +244,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.TRITANIUM_BOOTS, category = RecipeCategory.COMBAT) MatteryRecipe(MItems.TRITANIUM_BOOTS, category = RecipeCategory.COMBAT)
.setUpgradeSource(Items.LEATHER_BOOTS) .setUpgradeSource(Items.LEATHER_BOOTS)
.addUpgradeOps( .addUpgradeOps(UpgradeRecipe.CopyEnchantments)
UpgradeRecipe.Direct("display"), .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME))
UpgradeRecipe.Direct("Enchantments"),
)
.row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_BOOTS, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_BOOTS, MItemTags.REINFORCED_TRITANIUM_PLATES)
.rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES)
.unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES) .unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES)
@ -368,8 +359,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.MATTER_RECONSTRUCTOR[dye]!!, category = machinesCategory) MatteryRecipe(MItems.MATTER_RECONSTRUCTOR[dye]!!, category = machinesCategory)
.setUpgradeSource(item) .setUpgradeSource(item)
.addUpgradeOps( .addUpgradeOps(
UpgradeRecipe.Indirect("BlockEntityTag.${MatteryBlockEntity.ENERGY_KEY}", "BlockEntityTag.energy"), UpgradeRecipe.CopyTileComponent(MatteryBlockEntity.ENERGY_KEY, "energy"),
UpgradeRecipe.Indirect("BlockEntityTag.${MatteryBlockEntity.MATTER_STORAGE_KEY}", "BlockEntityTag.matter"), UpgradeRecipe.CopyTileComponent(MatteryBlockEntity.MATTER_STORAGE_KEY, "matter"),
) )
.row(MItemTags.ADVANCED_CIRCUIT, Tags.Items.GEMS_EMERALD, MItemTags.ADVANCED_CIRCUIT) .row(MItemTags.ADVANCED_CIRCUIT, Tags.Items.GEMS_EMERALD, MItemTags.ADVANCED_CIRCUIT)
.row(MItems.ELECTRIC_PARTS, item, MItems.ELECTRIC_PARTS) .row(MItems.ELECTRIC_PARTS, item, MItems.ELECTRIC_PARTS)

View File

@ -6,14 +6,13 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
import java.util.function.Consumer
private fun stairs(base: ItemLike, result: ItemLike, consumer: RecipeOutput) { private fun stairs(base: ItemLike, result: ItemLike, consumer: RecipeOutput) {
MatteryRecipe(result, 4, category = RecipeCategory.BUILDING_BLOCKS) MatteryRecipe(result, 4, category = RecipeCategory.BUILDING_BLOCKS)
@ -134,7 +133,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
MatteryRecipe(MItems.DANGER_STRIPE_BLOCK, 24, category = RecipeCategory.BUILDING_BLOCKS) MatteryRecipe(MItems.DANGER_STRIPE_BLOCK, 24, category = RecipeCategory.BUILDING_BLOCKS)
.rowAB(Tags.Items.DYES_YELLOW, Tags.Items.INGOTS_IRON) .rowAB(Tags.Items.DYES_YELLOW, Tags.Items.INGOTS_IRON)
.row(Tags.Items.INGOTS_IRON, Tags.Items.COBBLESTONE, Tags.Items.INGOTS_IRON) .row(Tags.Items.INGOTS_IRON, Tags.Items.COBBLESTONES, Tags.Items.INGOTS_IRON)
.rowBC(Tags.Items.INGOTS_IRON, Tags.Items.DYES_BLACK) .rowBC(Tags.Items.INGOTS_IRON, Tags.Items.DYES_BLACK)
.unlockedBy(Tags.Items.INGOTS_IRON) .unlockedBy(Tags.Items.INGOTS_IRON)
.unlockedBy(Tags.Items.DYES_BLACK) .unlockedBy(Tags.Items.DYES_BLACK)
@ -142,7 +141,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
MatteryRecipe(MItems.METAL_BEAM, 24, category = RecipeCategory.BUILDING_BLOCKS) MatteryRecipe(MItems.METAL_BEAM, 24, category = RecipeCategory.BUILDING_BLOCKS)
.rowB(Tags.Items.INGOTS_IRON) .rowB(Tags.Items.INGOTS_IRON)
.row(MItemTags.TRITANIUM_INGOTS, Tags.Items.COBBLESTONE, MItemTags.TRITANIUM_INGOTS) .row(MItemTags.TRITANIUM_INGOTS, Tags.Items.COBBLESTONES, MItemTags.TRITANIUM_INGOTS)
.rowB(Tags.Items.INGOTS_IRON) .rowB(Tags.Items.INGOTS_IRON)
.build(consumer, modLocation("decorative/metal_beam")) .build(consumer, modLocation("decorative/metal_beam"))
@ -177,7 +176,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
MatteryRecipe(MRegistry.DECORATIVE_CRATE.item, 24, category = RecipeCategory.BUILDING_BLOCKS) MatteryRecipe(MRegistry.DECORATIVE_CRATE.item, 24, category = RecipeCategory.BUILDING_BLOCKS)
.rowB(Tags.Items.INGOTS_IRON) .rowB(Tags.Items.INGOTS_IRON)
.row(Tags.Items.INGOTS_IRON, Tags.Items.COBBLESTONE, Tags.Items.INGOTS_IRON) .row(Tags.Items.INGOTS_IRON, Tags.Items.COBBLESTONES, Tags.Items.INGOTS_IRON)
.rowB(Tags.Items.INGOTS_IRON) .rowB(Tags.Items.INGOTS_IRON)
.unlockedBy(Tags.Items.INGOTS_IRON) .unlockedBy(Tags.Items.INGOTS_IRON)
.build(consumer, modLocation("decorative/crate/rusty")) .build(consumer, modLocation("decorative/crate/rusty"))
@ -278,7 +277,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
MatteryRecipe(MBlocks.TRITANIUM_STRIPED_BLOCK, 24, category = RecipeCategory.BUILDING_BLOCKS) MatteryRecipe(MBlocks.TRITANIUM_STRIPED_BLOCK, 24, category = RecipeCategory.BUILDING_BLOCKS)
.rowB(MItemTags.TRITANIUM_INGOTS) .rowB(MItemTags.TRITANIUM_INGOTS)
.row(MItemTags.TRITANIUM_INGOTS, Tags.Items.COBBLESTONE, MItemTags.TRITANIUM_INGOTS) .row(MItemTags.TRITANIUM_INGOTS, Tags.Items.COBBLESTONES, MItemTags.TRITANIUM_INGOTS)
.rowAB(Tags.Items.DYES_YELLOW, MItemTags.TRITANIUM_INGOTS) .rowAB(Tags.Items.DYES_YELLOW, MItemTags.TRITANIUM_INGOTS)
.unlockedBy(MItemTags.TRITANIUM_INGOTS) .unlockedBy(MItemTags.TRITANIUM_INGOTS)
.unlockedBy(Tags.Items.DYES_YELLOW) .unlockedBy(Tags.Items.DYES_YELLOW)
@ -286,7 +285,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
MatteryRecipe(MRegistry.TRITANIUM_BLOCK.item, 24, category = RecipeCategory.BUILDING_BLOCKS) MatteryRecipe(MRegistry.TRITANIUM_BLOCK.item, 24, category = RecipeCategory.BUILDING_BLOCKS)
.rowB(MItemTags.TRITANIUM_INGOTS) .rowB(MItemTags.TRITANIUM_INGOTS)
.row(MItemTags.TRITANIUM_INGOTS, Tags.Items.COBBLESTONE, MItemTags.TRITANIUM_INGOTS) .row(MItemTags.TRITANIUM_INGOTS, Tags.Items.COBBLESTONES, MItemTags.TRITANIUM_INGOTS)
.rowB(MItemTags.TRITANIUM_INGOTS) .rowB(MItemTags.TRITANIUM_INGOTS)
.unlockedBy(MItemTags.TRITANIUM_INGOTS) .unlockedBy(MItemTags.TRITANIUM_INGOTS)
.build(consumer, modLocation("decorative/blocks/default")) .build(consumer, modLocation("decorative/blocks/default"))
@ -298,7 +297,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
.unlockedBy(MItemTags.TRITANIUM_INGOTS) .unlockedBy(MItemTags.TRITANIUM_INGOTS)
.build(consumer, modLocation("decorative/doors/default")) .build(consumer, modLocation("decorative/doors/default"))
for (color in DyeColor.values()) { for (color in DyeColor.entries) {
ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, MItems.TRITANIUM_DOOR[color]!!, 1) ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, MItems.TRITANIUM_DOOR[color]!!, 1)
.requires(Ingredient.of(MItems.TRITANIUM_DOOR.entries.stream().filter { it.key != color }.map { ItemStack(it.value) })) .requires(Ingredient.of(MItems.TRITANIUM_DOOR.entries.stream().filter { it.key != color }.map { ItemStack(it.value) }))
.requires(color.tag) .requires(color.tag)
@ -312,7 +311,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
.unlockedBy(MItemTags.TRITANIUM_INGOTS) .unlockedBy(MItemTags.TRITANIUM_INGOTS)
.build(consumer, modLocation("decorative/trapdoors/default")) .build(consumer, modLocation("decorative/trapdoors/default"))
for (color in DyeColor.values()) { for (color in DyeColor.entries) {
ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, MItems.TRITANIUM_TRAPDOOR[color]!!, 1) ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, MItems.TRITANIUM_TRAPDOOR[color]!!, 1)
.requires(Ingredient.of(MItems.TRITANIUM_TRAPDOOR.entries.stream().filter { it.key != color }.map { ItemStack(it.value) })) .requires(Ingredient.of(MItems.TRITANIUM_TRAPDOOR.entries.stream().filter { it.key != color }.map { ItemStack(it.value) }))
.requires(color.tag) .requires(color.tag)
@ -325,7 +324,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
.unlockedBy(MItemTags.TRITANIUM_PLATES) .unlockedBy(MItemTags.TRITANIUM_PLATES)
.build(consumer, modLocation("pressure_plates/default")) .build(consumer, modLocation("pressure_plates/default"))
for (dye in DyeColor.values()) { for (dye in DyeColor.entries) {
ShapelessRecipeBuilder(RecipeCategory.REDSTONE, MRegistry.TRITANIUM_PRESSURE_PLATE.getItem(dye), 1) ShapelessRecipeBuilder(RecipeCategory.REDSTONE, MRegistry.TRITANIUM_PRESSURE_PLATE.getItem(dye), 1)
.requires(Ingredient.of(MRegistry.TRITANIUM_PRESSURE_PLATE.allItems.entries.stream().filter { it.key != dye }.map { ItemStack(it.value) })) .requires(Ingredient.of(MRegistry.TRITANIUM_PRESSURE_PLATE.allItems.entries.stream().filter { it.key != dye }.map { ItemStack(it.value) }))
.requires(dye.tag) .requires(dye.tag)

View File

@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
@ -65,8 +65,8 @@ fun addMachineUpgradeRecipes(consumer: RecipeOutput) {
.build(consumer) .build(consumer)
MatteryRecipe(tier.MATTER_STORAGE, 1) MatteryRecipe(tier.MATTER_STORAGE, 1)
.rowB(Tags.Items.GLASS) .rowB(Tags.Items.GLASS_BLOCKS)
.row(Tags.Items.GLASS, MItems.MATTER_CAPACITOR_PARTS, Tags.Items.GLASS) .row(Tags.Items.GLASS_BLOCKS, MItems.MATTER_CAPACITOR_PARTS, Tags.Items.GLASS_BLOCKS)
.rowB(tier.BLANK) .rowB(tier.BLANK)
.unlockedBy(tier.BLANK) .unlockedBy(tier.BLANK)
.unlockedBy(MItems.MATTER_CAPACITOR_PARTS) .unlockedBy(MItems.MATTER_CAPACITOR_PARTS)

View File

@ -1,42 +1,70 @@
package ru.dbotthepony.mc.otm.datagen.recipes package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.core.NonNullList
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraftforge.common.Tags import net.minecraft.world.item.crafting.ShapedRecipePattern
import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.recipe.IngredientMatrix
import ru.dbotthepony.mc.otm.recipe.MatterEntanglerRecipe import ru.dbotthepony.mc.otm.recipe.MatterEntanglerRecipe
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
import java.util.*
private fun pattern(
c00: Ingredient, c10: Ingredient, c20: Ingredient,
c01: Ingredient, c11: Ingredient, c21: Ingredient,
c02: Ingredient, c12: Ingredient, c22: Ingredient,
): ShapedRecipePattern {
val patternMap = linkedMapOf(
'A' to c00, 'B' to c10, 'C' to c20,
'D' to c01, 'E' to c11, 'F' to c21,
'G' to c02, 'K' to c12, 'M' to c22,
)
val pattern = listOf(
"ABC",
"DEF",
"GKM",
)
return ShapedRecipePattern(
3, 3,
NonNullList.copyOf(patternMap.values),
Optional.of(ShapedRecipePattern.Data(patternMap, pattern))
)
}
fun addMatterEntanglerRecipes(consumer: RecipeOutput) { fun addMatterEntanglerRecipes(consumer: RecipeOutput) {
consumer.accept( consumer.accept(
modLocation("quantum_capacitor"),
MatterEntanglerRecipe( MatterEntanglerRecipe(
IngredientMatrix.of( pattern(
listOf(Ingredient.of(MItems.ELECTRIC_PARTS), Ingredient.of(MItemTags.GOLD_WIRES), Ingredient.of(MItems.ELECTRIC_PARTS)), Ingredient.of(MItems.ELECTRIC_PARTS), Ingredient.of(MItemTags.GOLD_WIRES), Ingredient.of(MItems.ELECTRIC_PARTS),
listOf(Ingredient.of(MItems.BATTERY_CAPACITOR), Ingredient.of(MItems.QUANTUM_TRANSCEIVER), Ingredient.of(MItems.BATTERY_CAPACITOR)), Ingredient.of(MItems.BATTERY_CAPACITOR), Ingredient.of(MItems.QUANTUM_TRANSCEIVER), Ingredient.of(MItems.BATTERY_CAPACITOR),
listOf(Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES)), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES),
), ),
Decimal(40), Decimal(40),
400.0, 400.0,
ItemStack(MItems.QUANTUM_CAPACITOR, 2), ItemStack(MItems.QUANTUM_CAPACITOR, 2),
experience = 15f experience = 15f
).energetic().toFinished(modLocation("quantum_capacitor")) ).energetic()
) )
consumer.accept( consumer.accept(
modLocation("quantum_battery"),
MatterEntanglerRecipe( MatterEntanglerRecipe(
IngredientMatrix.of( pattern(
listOf(Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE), Ingredient.of(MItemTags.GOLD_WIRES), Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE)), Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE), Ingredient.of(MItemTags.GOLD_WIRES), Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE),
listOf(Ingredient.of(MItems.BATTERY_DENSE), Ingredient.of(MItems.QUANTUM_TRANSCEIVER), Ingredient.of(MItems.BATTERY_DENSE)), Ingredient.of(MItems.BATTERY_DENSE), Ingredient.of(MItems.QUANTUM_TRANSCEIVER), Ingredient.of(MItems.BATTERY_DENSE),
listOf(Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES)), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES),
), ),
Decimal(120), Decimal(120),
600.0, 600.0,
ItemStack(MItems.QUANTUM_BATTERY, 2), ItemStack(MItems.QUANTUM_BATTERY, 2),
experience = 20f experience = 20f
).energetic().toFinished(modLocation("quantum_battery")) ).energetic()
) )
} }

View File

@ -1,10 +1,9 @@
package ru.dbotthepony.mc.otm.datagen.recipes package ru.dbotthepony.mc.otm.datagen.recipes
import com.google.gson.JsonObject
import net.minecraft.advancements.Advancement import net.minecraft.advancements.Advancement
import net.minecraft.advancements.AdvancementHolder
import net.minecraft.advancements.Criterion import net.minecraft.advancements.Criterion
import net.minecraft.data.recipes.FinishedRecipe
import net.minecraft.data.recipes.RecipeCategory import net.minecraft.data.recipes.RecipeCategory
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraft.data.recipes.ShapedRecipeBuilder import net.minecraft.data.recipes.ShapedRecipeBuilder
@ -12,12 +11,13 @@ 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.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.item.crafting.Recipe
import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeSerializer
import net.minecraft.world.item.crafting.ShapedRecipe
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.neoforged.neoforge.common.conditions.ICondition
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.core.toJsonStrict
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.recipe.UpgradeRecipe import ru.dbotthepony.mc.otm.recipe.UpgradeRecipe
@ -54,18 +54,6 @@ private data class RecipeRow(
val c: RecipeCell?, val c: RecipeCell?,
) )
private fun RecipeOutput.map(mapper: (FinishedRecipe) -> FinishedRecipe): RecipeOutput {
return object : RecipeOutput {
override fun accept(recipe: FinishedRecipe) {
this@map.accept(mapper(recipe))
}
override fun advancement(): Advancement.Builder {
return this@map.advancement()
}
}
}
/** /**
* [ShapedRecipeBuilder] that doesn't suck * [ShapedRecipeBuilder] that doesn't suck
*/ */
@ -180,22 +168,12 @@ class MatteryRecipe(val result: ItemLike, val count: Int = 1, val category: Reci
return this return this
} }
private fun filter(): (FinishedRecipe) -> FinishedRecipe { private fun filter(): (ShapedRecipe) -> ShapedRecipe {
if (upgradeSource != null) { if (upgradeSource != null) {
check(copyPaths.isNotEmpty()) { "Defined upgrade recipe without nbt migration operations" } check(copyPaths.isNotEmpty()) { "Defined upgrade recipe without nbt migration operations" }
return { return {
object : FinishedRecipe by it { UpgradeRecipe(it, copyPaths.map { upgradeSource!! to it })
override fun serializeRecipeData(pJson: JsonObject) {
pJson["parent"] = it.serializeRecipe()
pJson["copyPaths"] = UpgradeRecipe.OPERATION_CODEC.toJsonStrict(copyPaths)
pJson["source"] = upgradeSource!!.toString()
}
override fun type(): RecipeSerializer<*> {
return UpgradeRecipe.CODEC
}
}
} }
} }
@ -222,13 +200,8 @@ class MatteryRecipe(val result: ItemLike, val count: Int = 1, val category: Reci
} }
fun buildEnergetic(consumer: RecipeOutput, name: String? = null) { fun buildEnergetic(consumer: RecipeOutput, name: String? = null) {
build(consumer.map { addUpgradeOps(UpgradeRecipe.CopyEnergyCharge)
object : FinishedRecipe by it { build(consumer, name)
override fun type(): RecipeSerializer<*> {
return EnergyContainerRecipe.Companion
}
}
}, name)
} }
fun row(): MatteryRecipe { fun row(): MatteryRecipe {

View File

@ -1,15 +1,13 @@
package ru.dbotthepony.mc.otm.datagen.recipes package ru.dbotthepony.mc.otm.datagen.recipes
import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableList
import net.minecraft.advancements.Advancement
import net.minecraft.advancements.AdvancementHolder
import net.minecraft.advancements.CriteriaTriggers import net.minecraft.advancements.CriteriaTriggers
import net.minecraft.advancements.Criterion import net.minecraft.advancements.Criterion
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.EntityPredicate
import net.minecraft.advancements.critereon.InventoryChangeTrigger import net.minecraft.advancements.critereon.InventoryChangeTrigger
import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.advancements.critereon.MinMaxBounds import net.minecraft.advancements.critereon.MinMaxBounds
import net.minecraft.data.DataGenerator
import net.minecraft.data.recipes.FinishedRecipe
import net.minecraft.data.recipes.RecipeBuilder import net.minecraft.data.recipes.RecipeBuilder
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraft.data.recipes.RecipeProvider import net.minecraft.data.recipes.RecipeProvider
@ -21,13 +19,17 @@ import net.minecraft.util.valueproviders.FloatProvider
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.item.crafting.Recipe
import net.minecraft.world.item.crafting.ShapedRecipePattern
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.neoforged.neoforge.common.conditions.ICondition
import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.recipe.MicrowaveRecipe import ru.dbotthepony.mc.otm.recipe.MicrowaveRecipe
import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe
import java.util.* import java.util.*
import java.util.function.Consumer
import java.util.stream.Stream import java.util.stream.Stream
private typealias RecipeBuilderCallback = (MatteryRecipeProvider, consumer: RecipeOutput) -> Unit private typealias RecipeBuilderCallback = (MatteryRecipeProvider, consumer: RecipeOutput) -> Unit
@ -47,9 +49,7 @@ fun has(p_125976_: TagKey<Item>): Criterion<InventoryChangeTrigger.TriggerInstan
fun inventoryTrigger(vararg p_126012_: ItemPredicate): Criterion<InventoryChangeTrigger.TriggerInstance> { fun inventoryTrigger(vararg p_126012_: ItemPredicate): Criterion<InventoryChangeTrigger.TriggerInstance> {
return CriteriaTriggers.INVENTORY_CHANGED.createCriterion(InventoryChangeTrigger.TriggerInstance( return CriteriaTriggers.INVENTORY_CHANGED.createCriterion(InventoryChangeTrigger.TriggerInstance(
Optional.empty(), Optional.empty(),
MinMaxBounds.Ints.ANY, InventoryChangeTrigger.TriggerInstance.Slots.ANY,
MinMaxBounds.Ints.ANY,
MinMaxBounds.Ints.ANY,
ImmutableList.copyOf(p_126012_) ImmutableList.copyOf(p_126012_)
)) ))
} }
@ -87,7 +87,28 @@ fun <T : RecipeBuilder> T.unlockedBy(item: TagKey<Item>): T {
return this return this
} }
class MatteryRecipeProvider(generatorIn: DataGenerator) : RecipeProvider(generatorIn.packOutput) { fun <IN : Recipe<*>> RecipeOutput.map(mapper: (IN) -> Recipe<*>): RecipeOutput {
return object : RecipeOutput {
override fun advancement(): Advancement.Builder {
return this@map.advancement()
}
override fun accept(
id: ResourceLocation,
recipe: Recipe<*>,
advancement: AdvancementHolder?,
vararg conditions: ICondition?
) {
this@map.accept(id, mapper(recipe as IN), advancement, *conditions)
}
}
}
fun RecipeOutput.accept(id: ResourceLocation, recipe: Recipe<*>) {
accept(id, recipe, null)
}
class MatteryRecipeProvider(generatorIn: GatherDataEvent) : RecipeProvider(generatorIn.generator.packOutput, generatorIn.lookupProvider) {
private val callbacks = LinkedList<RecipeBuilderCallback>() private val callbacks = LinkedList<RecipeBuilderCallback>()
fun exec(callback: RecipeBuilderCallback): MatteryRecipeProvider { fun exec(callback: RecipeBuilderCallback): MatteryRecipeProvider {
@ -103,25 +124,25 @@ class MatteryRecipeProvider(generatorIn: DataGenerator) : RecipeProvider(generat
fun plate(id: String, count: Int = 1, workTicks: Int = 200, experience: FloatProvider = ConstantFloat.ZERO) { fun plate(id: String, count: Int = 1, workTicks: Int = 200, experience: FloatProvider = ConstantFloat.ZERO) {
exec { _, consumer -> exec { _, consumer ->
consumer.accept(PlatePressRecipe( consumer.accept(modLocation("plates/$id"), PlatePressRecipe(
Ingredient.of(ItemTags.create(ResourceLocation("forge", "ingots/$id"))), Ingredient.of(ItemTags.create(ResourceLocation("c", "ingots/$id"))),
Ingredient.of(ItemTags.create(ResourceLocation("forge", "plates/$id"))), Ingredient.of(ItemTags.create(ResourceLocation("c", "plates/$id"))),
count, count,
workTicks, workTicks,
experience = experience experience = experience
).toFinished(modLocation("plates/$id"))) ))
} }
} }
fun plate(id: String, ingredient: Ingredient, result: Ingredient, count: Int = 1, workTicks: Int = 200, experience: FloatProvider = ConstantFloat.ZERO) { fun plate(id: String, ingredient: Ingredient, result: Ingredient, count: Int = 1, workTicks: Int = 200, experience: FloatProvider = ConstantFloat.ZERO) {
exec { it, callback -> exec { it, callback ->
callback.accept(PlatePressRecipe(ingredient, result, count, workTicks, experience = experience).toFinished(modLocation("plate_$id"))) callback.accept(modLocation("plate_$id"), PlatePressRecipe(ingredient, result, count, workTicks, experience = experience))
} }
} }
fun microwave(id: String, ingredient: Ingredient, result: Ingredient, count: Int = 1, workTicks: Int = 200, experience: FloatProvider = ConstantFloat.ZERO) { fun microwave(id: String, ingredient: Ingredient, result: Ingredient, count: Int = 1, workTicks: Int = 200, experience: FloatProvider = ConstantFloat.ZERO) {
exec { it, callback -> exec { it, callback ->
callback.accept(MicrowaveRecipe(ingredient, result, count, workTicks, experience = experience).toFinished(modLocation("microwave/$id"))) callback.accept(modLocation("microwave/$id"), MicrowaveRecipe(ingredient, result, count, workTicks, experience = experience))
} }
} }
} }

View File

@ -1,6 +1,5 @@
package ru.dbotthepony.mc.otm.datagen.recipes package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.data.recipes.FinishedRecipe
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
@ -8,13 +7,11 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.stream
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.recipe.PainterArmorDyeRecipe import ru.dbotthepony.mc.otm.recipe.PainterArmorDyeRecipe
import ru.dbotthepony.mc.otm.recipe.PainterRecipe import ru.dbotthepony.mc.otm.recipe.PainterRecipe
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
import java.util.function.Consumer
private val Item.recipeName get() = registryName!!.namespace + "/" + registryName!!.path private val Item.recipeName get() = registryName!!.namespace + "/" + registryName!!.path
@ -22,11 +19,11 @@ private fun generate(consumer: RecipeOutput, items: Map<out DyeColor?, Item>, am
for ((targetColor, targetItem) in items) { for ((targetColor, targetItem) in items) {
if (targetColor == null) continue if (targetColor == null) continue
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/" + targetItem.recipeName), PainterRecipe(
Ingredient.of(items.entries.stream().filter { it.key != null && it.key != targetColor }.map { ItemStack(it.value) }), Ingredient.of(items.entries.stream().filter { it.key != null && it.key != targetColor }.map { ItemStack(it.value) }),
ItemStack(targetItem), ItemStack(targetItem),
mapOf(targetColor to amount) mapOf(targetColor to amount)
).toFinished(modLocation("painter/" + targetItem.recipeName))) ))
} }
} }
@ -39,31 +36,31 @@ private fun generate(consumer: RecipeOutput, default: Item, items: Map<out DyeCo
for ((k1, v1) in items) { for ((k1, v1) in items) {
if (k1 == null) continue if (k1 == null) continue
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/" + default.recipeName + "/" + v1.recipeName), PainterRecipe(
Ingredient.of(default), Ingredient.of(default),
ItemStack(v1), ItemStack(v1),
mapOf(k1 to amount) mapOf(k1 to amount)
).toFinished(modLocation("painter/" + default.recipeName + "/" + v1.recipeName))) ))
} }
} }
private fun cleaning(consumer: RecipeOutput, to: Item, from: Map<out DyeColor?, Item>) { private fun cleaning(consumer: RecipeOutput, to: Item, from: Map<out DyeColor?, Item>) {
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/cleaning/" + to.recipeName), PainterRecipe(
Ingredient.of(from.entries.stream().filter { it.key != null }.map { ItemStack(it.value) }), Ingredient.of(from.entries.stream().filter { it.key != null }.map { ItemStack(it.value) }),
ItemStack(to), ItemStack(to),
mapOf(null to 15) mapOf(null to 15)
).toFinished(modLocation("painter/cleaning/" + to.recipeName))) ))
} }
private fun striped(consumer: RecipeOutput, name: String, items: List<Pair<Item, Pair<DyeColor, DyeColor>>>, base: Map<DyeColor, Item>) { private fun striped(consumer: RecipeOutput, name: String, items: List<Pair<Item, Pair<DyeColor, DyeColor>>>, base: Map<DyeColor, Item>) {
for ((stripeItem, colors) in items) { for ((stripeItem, colors) in items) {
val (baseColor, stripe) = colors val (baseColor, stripe) = colors
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/stripes_$name/${baseColor.getName()}/${stripe.getName()}"), PainterRecipe(
Ingredient.of(base[baseColor]), Ingredient.of(base[baseColor]),
ItemStack(stripeItem), ItemStack(stripeItem),
setOf(stripe) setOf(stripe)
).toFinished(modLocation("painter/stripes_$name/${baseColor.getName()}/${stripe.getName()}"))) ))
} }
} }
@ -318,32 +315,32 @@ fun addPainterRecipes(consumer: RecipeOutput) {
striped(consumer, "slabs", MRegistry.TRITANIUM_STRIPED_SLAB.itemsWithColor, MRegistry.TRITANIUM_SLAB.items) striped(consumer, "slabs", MRegistry.TRITANIUM_STRIPED_SLAB.itemsWithColor, MRegistry.TRITANIUM_SLAB.items)
for (color in DyeColor.entries) { for (color in DyeColor.entries) {
consumer.accept(PainterArmorDyeRecipe(mapOf(color to 1)).toFinished(modLocation("painter/armor_dye_" + color.getName().lowercase()))) consumer.accept(modLocation("painter/armor_dye_" + color.getName().lowercase()), PainterArmorDyeRecipe(mapOf(color to 1)))
} }
consumer.accept(PainterArmorDyeRecipe(mapOf(null to 15)).toFinished(modLocation("painter/armor_clear_dye"))) consumer.accept(modLocation("painter/armor_clear_dye"), PainterArmorDyeRecipe(mapOf(null to 15)))
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/tritanium_yellow_stripe"), PainterRecipe(
Ingredient.of(MRegistry.TRITANIUM_BLOCK.item), Ingredient.of(MRegistry.TRITANIUM_BLOCK.item),
ItemStack(MItems.TRITANIUM_STRIPED_BLOCK), ItemStack(MItems.TRITANIUM_STRIPED_BLOCK),
mapOf(DyeColor.YELLOW to 1) mapOf(DyeColor.YELLOW to 1)
).toFinished(modLocation("painter/tritanium_yellow_stripe"))) ))
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/tritanium_yellow_stripe_stairs"), PainterRecipe(
Ingredient.of(MRegistry.TRITANIUM_STAIRS.item), Ingredient.of(MRegistry.TRITANIUM_STAIRS.item),
ItemStack(MItems.TRITANIUM_STRIPED_STAIRS), ItemStack(MItems.TRITANIUM_STRIPED_STAIRS),
mapOf(DyeColor.YELLOW to 1) mapOf(DyeColor.YELLOW to 1)
).toFinished(modLocation("painter/tritanium_yellow_stripe_stairs"))) ))
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/tritanium_yellow_stripe_slab"), PainterRecipe(
Ingredient.of(MRegistry.TRITANIUM_SLAB.item), Ingredient.of(MRegistry.TRITANIUM_SLAB.item),
ItemStack(MItems.TRITANIUM_STRIPED_SLAB), ItemStack(MItems.TRITANIUM_STRIPED_SLAB),
mapOf(DyeColor.YELLOW to 1) mapOf(DyeColor.YELLOW to 1)
).toFinished(modLocation("painter/tritanium_yellow_stripe_slab"))) ))
consumer.accept(PainterRecipe( consumer.accept(modLocation("painter/tritanium_yellow_stripe_wall"), PainterRecipe(
Ingredient.of(MRegistry.TRITANIUM_WALL.item), Ingredient.of(MRegistry.TRITANIUM_WALL.item),
ItemStack(MItems.TRITANIUM_STRIPED_WALL), ItemStack(MItems.TRITANIUM_STRIPED_WALL),
mapOf(DyeColor.YELLOW to 1) mapOf(DyeColor.YELLOW to 1)
).toFinished(modLocation("painter/tritanium_yellow_stripe_wall"))) ))
} }

View File

@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.util.valueproviders.ConstantFloat import net.minecraft.util.valueproviders.ConstantFloat
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
@ -25,5 +25,5 @@ fun addPlatePressRecipes(provider: MatteryRecipeProvider) {
} }
provider.plate("carbon", result = Ingredient.of(MItemTags.CARBON_PLATES), ingredient = Ingredient.of(Items.COAL), workTicks = 140, experience = ConstantFloat.of(0.3f)) provider.plate("carbon", result = Ingredient.of(MItemTags.CARBON_PLATES), ingredient = Ingredient.of(Items.COAL), workTicks = 140, experience = ConstantFloat.of(0.3f))
provider.plate("circuit_plating", result = Ingredient.of(MItems.CIRCUIT_PLATING), ingredient = Ingredient.of(Tags.Items.SAND), workTicks = 120, experience = ConstantFloat.of(0.2f)) provider.plate("circuit_plating", result = Ingredient.of(MItems.CIRCUIT_PLATING), ingredient = Ingredient.of(Tags.Items.SANDS), workTicks = 120, experience = ConstantFloat.of(0.2f))
} }

View File

@ -10,7 +10,7 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags

View File

@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.data.recipes.RecipeCategory import net.minecraft.data.recipes.RecipeCategory
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.recipe.UpgradeRecipe import ru.dbotthepony.mc.otm.recipe.UpgradeRecipe
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
@ -26,7 +26,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.BATTERY_NORMAL, category = RecipeCategory.MISC) MatteryRecipe(MItems.BATTERY_NORMAL, category = RecipeCategory.MISC)
.setUpgradeSource(MItems.BATTERY_BASIC) .setUpgradeSource(MItems.BATTERY_BASIC)
.addUpgradeOps(UpgradeRecipe.All) .addUpgradeOps(UpgradeRecipe.CopyAllComponents)
.rowB(MItems.ELECTRIC_PARTS) .rowB(MItems.ELECTRIC_PARTS)
.row(MItemTags.COPPER_WIRES, MItems.BATTERY_BASIC, MItemTags.COPPER_WIRES) .row(MItemTags.COPPER_WIRES, MItems.BATTERY_BASIC, MItemTags.COPPER_WIRES)
.row(Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE) .row(Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE)
@ -34,7 +34,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.BATTERY_DENSE, category = RecipeCategory.MISC) MatteryRecipe(MItems.BATTERY_DENSE, category = RecipeCategory.MISC)
.setUpgradeSource(MItems.BATTERY_NORMAL) .setUpgradeSource(MItems.BATTERY_NORMAL)
.addUpgradeOps(UpgradeRecipe.All) .addUpgradeOps(UpgradeRecipe.CopyAllComponents)
.row(Tags.Items.DUSTS_REDSTONE, MItems.ENERGY_BUS, Tags.Items.DUSTS_REDSTONE) .row(Tags.Items.DUSTS_REDSTONE, MItems.ENERGY_BUS, Tags.Items.DUSTS_REDSTONE)
.row(MItemTags.GOLD_WIRES, MItems.BATTERY_NORMAL, MItemTags.GOLD_WIRES) .row(MItemTags.GOLD_WIRES, MItems.BATTERY_NORMAL, MItemTags.GOLD_WIRES)
.row(Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE) .row(Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE, Tags.Items.DUSTS_REDSTONE)
@ -42,7 +42,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.BATTERY_CAPACITOR, category = RecipeCategory.MISC) MatteryRecipe(MItems.BATTERY_CAPACITOR, category = RecipeCategory.MISC)
.setUpgradeSource(MItems.BATTERY_NORMAL) .setUpgradeSource(MItems.BATTERY_NORMAL)
.addUpgradeOps(UpgradeRecipe.All) .addUpgradeOps(UpgradeRecipe.CopyAllComponents)
.row(Tags.Items.DUSTS_REDSTONE, MItems.ENERGY_BUS, Tags.Items.DUSTS_REDSTONE) .row(Tags.Items.DUSTS_REDSTONE, MItems.ENERGY_BUS, Tags.Items.DUSTS_REDSTONE)
.row(MItemTags.GOLD_WIRES, MItems.BATTERY_NORMAL, MItemTags.GOLD_WIRES) .row(MItemTags.GOLD_WIRES, MItems.BATTERY_NORMAL, MItemTags.GOLD_WIRES)
.row(MItemTags.GOLD_WIRES, Tags.Items.DUSTS_REDSTONE, MItemTags.GOLD_WIRES) .row(MItemTags.GOLD_WIRES, Tags.Items.DUSTS_REDSTONE, MItemTags.GOLD_WIRES)
@ -56,7 +56,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.MATTER_CAPACITOR_NORMAL, category = RecipeCategory.MISC) MatteryRecipe(MItems.MATTER_CAPACITOR_NORMAL, category = RecipeCategory.MISC)
.setUpgradeSource(MItems.MATTER_CAPACITOR_BASIC) .setUpgradeSource(MItems.MATTER_CAPACITOR_BASIC)
.addUpgradeOps(UpgradeRecipe.All) .addUpgradeOps(UpgradeRecipe.CopyAllComponents)
.rowB(MItems.MATTER_CAPACITOR_PARTS) .rowB(MItems.MATTER_CAPACITOR_PARTS)
.row(MItemTags.TRITANIUM_PLATES, MItems.MATTER_CAPACITOR_BASIC, MItemTags.TRITANIUM_PLATES) .row(MItemTags.TRITANIUM_PLATES, MItems.MATTER_CAPACITOR_BASIC, MItemTags.TRITANIUM_PLATES)
.rowB(Tags.Items.GEMS_DIAMOND) .rowB(Tags.Items.GEMS_DIAMOND)
@ -65,7 +65,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) {
MatteryRecipe(MItems.MATTER_CAPACITOR_DENSE, category = RecipeCategory.MISC) MatteryRecipe(MItems.MATTER_CAPACITOR_DENSE, category = RecipeCategory.MISC)
.setUpgradeSource(MItems.MATTER_CAPACITOR_NORMAL) .setUpgradeSource(MItems.MATTER_CAPACITOR_NORMAL)
.addUpgradeOps(UpgradeRecipe.All) .addUpgradeOps(UpgradeRecipe.CopyAllComponents)
.row(MItems.MATTER_CAPACITOR_PARTS, MItemTags.HARDENED_GLASS, MItems.MATTER_CAPACITOR_PARTS) .row(MItems.MATTER_CAPACITOR_PARTS, MItemTags.HARDENED_GLASS, MItems.MATTER_CAPACITOR_PARTS)
.row(MItemTags.TRITANIUM_PLATES, MItems.MATTER_CAPACITOR_NORMAL, MItemTags.TRITANIUM_PLATES) .row(MItemTags.TRITANIUM_PLATES, MItems.MATTER_CAPACITOR_NORMAL, MItemTags.TRITANIUM_PLATES)
.rowAC(Tags.Items.ENDER_PEARLS, Tags.Items.ENDER_PEARLS) .rowAC(Tags.Items.ENDER_PEARLS, Tags.Items.ENDER_PEARLS)

View File

@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.data.recipes.RecipeCategory import net.minecraft.data.recipes.RecipeCategory
import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.RecipeOutput
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems

View File

@ -8,7 +8,8 @@ import net.minecraft.world.item.Items
import net.minecraft.world.item.Tiers import net.minecraft.world.item.Tiers
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.Blocks
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.registry.MBlockTags import ru.dbotthepony.mc.otm.registry.MBlockTags
import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.registry.MFluids import ru.dbotthepony.mc.otm.registry.MFluids
@ -118,13 +119,11 @@ fun addTags(tagsProvider: TagsProvider) {
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.Appender(Tags.Items.ARMORS_HELMETS) // TODO: is new tag appropriate for modded armors?
tagsProvider.items.Appender(Tags.Items.ARMORS)
.add(MItems.TRITANIUM_HELMET, MItems.SIMPLE_TRITANIUM_HELMET) .add(MItems.TRITANIUM_HELMET, MItems.SIMPLE_TRITANIUM_HELMET)
tagsProvider.items.Appender(Tags.Items.ARMORS_CHESTPLATES)
.add(MItems.TRITANIUM_CHESTPLATE, MItems.SIMPLE_TRITANIUM_CHESTPLATE, MItems.PORTABLE_GRAVITATION_STABILIZER) .add(MItems.TRITANIUM_CHESTPLATE, MItems.SIMPLE_TRITANIUM_CHESTPLATE, MItems.PORTABLE_GRAVITATION_STABILIZER)
tagsProvider.items.Appender(Tags.Items.ARMORS_LEGGINGS)
.add(MItems.TRITANIUM_PANTS, MItems.SIMPLE_TRITANIUM_PANTS) .add(MItems.TRITANIUM_PANTS, MItems.SIMPLE_TRITANIUM_PANTS)
tagsProvider.items.Appender(Tags.Items.ARMORS_BOOTS)
.add(MItems.TRITANIUM_BOOTS, MItems.SIMPLE_TRITANIUM_BOOTS) .add(MItems.TRITANIUM_BOOTS, MItems.SIMPLE_TRITANIUM_BOOTS)
tagsProvider.items.Appender(ItemTags.TRIMMABLE_ARMOR).add(MItems.SIMPLE_TRITANIUM_ARMOR) tagsProvider.items.Appender(ItemTags.TRIMMABLE_ARMOR).add(MItems.SIMPLE_TRITANIUM_ARMOR)
@ -135,8 +134,8 @@ fun addTags(tagsProvider: TagsProvider) {
tagsProvider.items.Appender(ItemTags.PICKAXES).add(MItems.TRITANIUM_PICKAXE) tagsProvider.items.Appender(ItemTags.PICKAXES).add(MItems.TRITANIUM_PICKAXE)
tagsProvider.items.Appender(ItemTags.SHOVELS).add(MItems.TRITANIUM_SHOVEL) tagsProvider.items.Appender(ItemTags.SHOVELS).add(MItems.TRITANIUM_SHOVEL)
tagsProvider.items.Appender(ItemTags.SHOVELS).add(MItems.TRITANIUM_HOE) tagsProvider.items.Appender(ItemTags.SHOVELS).add(MItems.TRITANIUM_HOE)
tagsProvider.items.Appender(Tags.Items.SHEARS).add(MItems.TRITANIUM_SHEARS) tagsProvider.items.Appender(Tags.Items.TOOLS_SHEAR).add(MItems.TRITANIUM_SHEARS)
tagsProvider.items.Appender(Tags.Items.TOOLS_SHIELDS).add(MItems.TRITANIUM_SHIELD) tagsProvider.items.Appender(Tags.Items.TOOLS_SHIELD).add(MItems.TRITANIUM_SHIELD)
tagsProvider.items.Appender(MItemTags.TOOLS_HAMMERS).add(MItems.EXPLOSIVE_HAMMER) tagsProvider.items.Appender(MItemTags.TOOLS_HAMMERS).add(MItems.EXPLOSIVE_HAMMER)
tagsProvider.items.forge("tools").add(MItemTags.TOOLS_HAMMERS) tagsProvider.items.forge("tools").add(MItemTags.TOOLS_HAMMERS)

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.datagen.tags package ru.dbotthepony.mc.otm.datagen.tags
import it.unimi.dsi.fastutil.objects.ObjectArraySet import it.unimi.dsi.fastutil.objects.ObjectArraySet
import net.minecraft.core.Holder
import net.minecraft.core.HolderLookup import net.minecraft.core.HolderLookup
import net.minecraft.core.Registry import net.minecraft.core.Registry
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
@ -14,11 +15,11 @@ import net.minecraft.world.item.Item
import net.minecraft.world.item.Tier import net.minecraft.world.item.Tier
import net.minecraft.world.item.Tiers import net.minecraft.world.item.Tiers
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraftforge.common.Tags import net.neoforged.neoforge.common.Tags
import net.minecraftforge.data.event.GatherDataEvent import net.neoforged.neoforge.data.event.GatherDataEvent
import net.minecraftforge.registries.ForgeRegistries import net.neoforged.neoforge.registries.NeoForgeRegistries
import net.minecraftforge.registries.IForgeRegistry
import ru.dbotthepony.mc.otm.capability.MatteryPlayer import ru.dbotthepony.mc.otm.capability.MatteryPlayer
import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.datagen.DataGen 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
@ -30,7 +31,7 @@ private fun <T : Any> vanillaLookup(key: ResourceKey<Registry<T>>): (T) -> Resou
class TagsProvider(private val event: GatherDataEvent) { class TagsProvider(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) { 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") }) constructor(registry: Registry<T>) : this(registry.key() as ResourceKey<Registry<T>>, { registry.getKey(it) ?: throw NoSuchElementException("$it is not registered in $registry") })
constructor(key: ResourceKey<Registry<T>>) : this(key, vanillaLookup(key)) constructor(key: ResourceKey<Registry<T>>) : this(key, vanillaLookup(key))
init { init {
@ -92,6 +93,11 @@ class TagsProvider(private val event: GatherDataEvent) {
return this return this
} }
fun add(vararg values: Holder<T>): Appender {
for (value in values) add(value.key ?: throw IllegalArgumentException("Intrusive holder"))
return this
}
fun add(vararg values: TagKey<T>): Appender { fun add(vararg values: TagKey<T>): Appender {
for (value in values) add(value) for (value in values) add(value)
return this return this
@ -165,11 +171,11 @@ class TagsProvider(private val event: GatherDataEvent) {
} }
} }
val blocks = Delegate(ForgeRegistries.BLOCKS) val blocks = Delegate(BuiltInRegistries.BLOCK)
val items = Delegate(ForgeRegistries.ITEMS) val items = Delegate(BuiltInRegistries.ITEM)
val fluids = Delegate(ForgeRegistries.FLUIDS) val fluids = Delegate(BuiltInRegistries.FLUID)
val fluidTypes = Delegate(ForgeRegistries.Keys.FLUID_TYPES) val fluidTypes = Delegate(NeoForgeRegistries.Keys.FLUID_TYPES)
val mobEffects = Delegate(ForgeRegistries.MOB_EFFECTS) val mobEffects = Delegate(BuiltInRegistries.MOB_EFFECT)
val damageTypes = Delegate(Registries.DAMAGE_TYPE) val damageTypes = Delegate(Registries.DAMAGE_TYPE)
val androidImmuneEffects = mobEffects.Appender(MatteryPlayer.ANDROID_IMMUNE_EFFECTS) val androidImmuneEffects = mobEffects.Appender(MatteryPlayer.ANDROID_IMMUNE_EFFECTS)

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.recipe package ru.dbotthepony.mc.otm.recipe
import com.mojang.serialization.Codec
import com.mojang.serialization.MapCodec import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.HolderLookup import net.minecraft.core.HolderLookup
@ -11,6 +12,7 @@ import net.minecraft.network.codec.StreamCodec
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.util.StringRepresentable import net.minecraft.util.StringRepresentable
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.component.CustomData
import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.item.crafting.CraftingBookCategory
import net.minecraft.world.item.crafting.CraftingInput import net.minecraft.world.item.crafting.CraftingInput
import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeSerializer
@ -19,7 +21,9 @@ import net.minecraft.world.item.crafting.ShapedRecipePattern
import net.minecraft.world.item.enchantment.ItemEnchantments import net.minecraft.world.item.enchantment.ItemEnchantments
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import java.util.Optional
class UpgradeRecipe( class UpgradeRecipe(
group: String, group: String,
@ -39,6 +43,14 @@ class UpgradeRecipe(
).apply(it) { CopyComponent(it) } ).apply(it) { CopyComponent(it) }
} }
}, },
COPY_TILE_COMPONENT {
override val codec: MapCodec<CopyTileComponent> = RecordCodecBuilder.mapCodec {
it.group(
Codec.STRING.fieldOf("source").forGetter(CopyTileComponent::source),
Codec.STRING.optionalFieldOf("destination").forGetter { if (it.source == it.destination) Optional.empty() else Optional.of(it.destination) },
).apply(it) { a, b -> CopyTileComponent(a, b.orElse(a)) }
}
},
COPY_ALL_COMPONENTS { COPY_ALL_COMPONENTS {
override val codec: MapCodec<CopyAllComponents> = MapCodec.unit(CopyAllComponents) override val codec: MapCodec<CopyAllComponents> = MapCodec.unit(CopyAllComponents)
}, },
@ -81,6 +93,29 @@ class UpgradeRecipe(
} }
} }
data class CopyTileComponent(val source: String, val destination: String = source) : Op() {
override val type: OpType
get() = OpType.COPY_TILE_COMPONENT
override fun apply(
source: ItemStack,
container: CraftingInput,
registry: HolderLookup.Provider,
destination: ItemStack
) {
if (!source.has(DataComponents.BLOCK_ENTITY_DATA))
return
val sourceTag = source[DataComponents.BLOCK_ENTITY_DATA]!!.unsafe[this.source]?.copy() ?: return
destination[DataComponents.BLOCK_ENTITY_DATA] = destination.getOrDefault(DataComponents.BLOCK_ENTITY_DATA, CustomData.EMPTY).let {
val copy = it.copyTag()
copy[this.destination] = sourceTag
CustomData.of(copy)
}
}
}
object CopyAllComponents : Op() { object CopyAllComponents : Op() {
override val type: OpType override val type: OpType
get() = OpType.COPY_ALL_COMPONENTS get() = OpType.COPY_ALL_COMPONENTS