diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DamageTypes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DamageTypes.kt index 525fbf309..fdd7fb5d2 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DamageTypes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DamageTypes.kt @@ -1,17 +1,13 @@ package ru.dbotthepony.mc.otm.datagen -import net.minecraft.core.RegistrySetBuilder -import net.minecraft.core.registries.Registries -import net.minecraft.data.worldgen.BootstapContext +import net.minecraft.data.worldgen.BootstrapContext import net.minecraft.tags.DamageTypeTags import net.minecraft.world.damagesource.DamageScaling 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.registry.MDamageTypes -fun registerDamageTypes(context: BootstapContext) { +fun registerDamageTypes(context: BootstrapContext) { 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_HUMANE, DamageType("otm_become_humane", DamageScaling.NEVER, 0f)) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index 356d1a4b9..9e101a00d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.datagen import net.minecraft.core.RegistrySetBuilder import net.minecraft.core.registries.Registries +import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.DyeColor 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.DoubleBlockHalf import net.minecraft.world.level.block.state.properties.Half -import net.minecraftforge.client.model.generators.ModelFile -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.bus.api.SubscribeEvent 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.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.util.WriteOnce 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.datagen.advancements.addAdvancements 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.addBlockStates import ru.dbotthepony.mc.otm.datagen.blocks.addComplexBlockStates @@ -56,6 +55,7 @@ import ru.dbotthepony.mc.otm.registry.objects.DecorativeBlock import kotlin.properties.Delegates 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) object DataGen { @@ -488,9 +488,9 @@ object DataGen { val blockModelProvider = MatteryBlockModelProvider(event) val blockStateProvider = MatteryBlockStateProvider(event) val itemModelProvider = MatteryItemModelProvider(event) - val lootTableProvider = LootTables(event.generator) - val recipeProvider = MatteryRecipeProvider(event.generator) - val lootModifier = LootModifiers(event.generator) + val lootTableProvider = LootTables(event) + val recipeProvider = MatteryRecipeProvider(event) + val lootModifier = LootModifiers(event) val languageProvider = MatteryLanguageProvider(event.generator) val matterData = MatterDataProvider(event) val researchProvider = AndroidResearchDataProvider(event).also { it.exec { addResearchData(it, languageProvider) } } @@ -506,7 +506,7 @@ object DataGen { this.matterData = matterData 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 -> addAdvancements(saver, languageProvider) addAndroidAdvancements(saver, languageProvider) @@ -534,7 +534,7 @@ object DataGen { .add(Registries.DAMAGE_TYPE, ::registerDamageTypes) .add(Registries.CONFIGURED_FEATURE, ::registerConfiguredFeatures) .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))) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt index fd50bef53..14d98ff60 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt @@ -5,9 +5,9 @@ import net.minecraft.world.level.block.SlabBlock import net.minecraft.world.level.block.StairBlock import net.minecraft.world.level.block.WallBlock import net.minecraft.world.level.block.state.properties.BlockStateProperties -import net.minecraftforge.client.model.generators.BlockModelBuilder -import net.minecraftforge.client.model.generators.ConfiguredModel -import net.minecraftforge.client.model.generators.ModelFile +import net.neoforged.neoforge.client.model.generators.BlockModelBuilder +import net.neoforged.neoforge.client.model.generators.ConfiguredModel +import net.neoforged.neoforge.client.model.generators.ModelFile import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateNorth diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/MatterData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/MatterData.kt index 65c2e3396..689660765 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/MatterData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/MatterData.kt @@ -3,9 +3,8 @@ package ru.dbotthepony.mc.otm.datagen import net.minecraft.tags.ItemTags import net.minecraft.world.item.Item 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.matter.ComputeAction import ru.dbotthepony.mc.otm.matter.MatterDataProvider import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems @@ -152,12 +151,12 @@ fun addMatterData(provider: MatterDataProvider) { relative(Items.PACKED_ICE, 1.5, 1) // rocks - scope(Tags.Items.STONE, 1.1, 1.1) { - equal(Tags.Items.COBBLESTONE) - equal(Tags.Items.GRAVEL) + scope(Tags.Items.STONES, 1.1, 1.1) { + equal(Tags.Items.COBBLESTONES) + equal(Tags.Items.GRAVELS) equal(Items.FLINT) - equal(Tags.Items.SAND) - equal(Tags.Items.NETHERRACK) + equal(Tags.Items.SANDS) + equal(Tags.Items.NETHERRACKS) scope(1.4, 1.5) { equal(Items.BASALT) @@ -185,7 +184,7 @@ fun addMatterData(provider: MatterDataProvider) { 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) } @@ -221,7 +220,7 @@ fun addMatterData(provider: MatterDataProvider) { // drops from mobs scope(Items.ROTTEN_FLESH, 8, 1.5) { equal(Items.INK_SAC) - equal(Tags.Items.LEATHER) + equal(Tags.Items.LEATHERS) equal(Items.LEATHER) 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.STRING, 0.8, 0.75) + relative(Tags.Items.STRINGS, 0.8, 0.75) relative(Items.COBWEB, 0.8, 0.75) relative(Items.SPIDER_EYE, 0.8, 1.8) - relative(Tags.Items.SLIMEBALLS, 1, 1.4) - relative(Tags.Items.GUNPOWDER, 0.85, 1.15) + relative(Tags.Items.SLIME_BALLS, 1, 1.4) + 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.EGG, 1.25, 4) @@ -261,7 +261,7 @@ fun addMatterData(provider: MatterDataProvider) { relative(Items.SCULK_VEIN, 2.5, 24) // planty - scope(Items.GRASS, 1.5, 2.5) { + scope(Items.SHORT_GRASS, 1.5, 2.5) { equal(Items.SUNFLOWER) equal(Items.LILAC) equal(Items.ROSE_BUSH) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/OreGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/OreGen.kt index f438c84d7..42c075079 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/OreGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/OreGen.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen import net.minecraft.core.HolderSet import net.minecraft.core.RegistrySetBuilder 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.tags.BiomeTags 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.PlacedFeature import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest -import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider -import net.minecraftforge.common.world.BiomeModifier -import net.minecraftforge.common.world.ForgeBiomeModifiers -import net.minecraftforge.data.event.GatherDataEvent -import net.minecraftforge.registries.ForgeRegistries +import net.neoforged.neoforge.common.world.BiomeModifier +import net.neoforged.neoforge.registries.NeoForgeRegistries import ru.dbotthepony.mc.otm.registry.MBlocks private object ConfiguredFeatures { @@ -32,7 +29,7 @@ private object ConfiguredFeatures { } } -fun registerConfiguredFeatures(context: BootstapContext>) { +fun registerConfiguredFeatures(context: BootstrapContext>) { val stone = TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES) val deepslate = TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES) @@ -53,7 +50,7 @@ private object PlacedFeatures { } } -fun registerPlacedFeatures(context: BootstapContext) { +fun registerPlacedFeatures(context: BootstrapContext) { val configured = context.lookup(Registries.CONFIGURED_FEATURE) val ore = configured.getOrThrow(ConfiguredFeatures.TRITANIUM_ORE) @@ -80,17 +77,17 @@ private object BiomeModifiers { val TRITANIUM_ORE = key("tritanium_ore") private fun key(name: String): ResourceKey { - return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, modLocation(name)) + return ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, modLocation(name)) } } -fun registerBiomeModifiers(context: BootstapContext) { +fun registerBiomeModifiers(context: BootstrapContext) { val placed = context.lookup(Registries.PLACED_FEATURE) val biomes = context.lookup(Registries.BIOME) context.register( BiomeModifiers.TRITANIUM_ORE, - ForgeBiomeModifiers.AddFeaturesBiomeModifier( + net.neoforged.neoforge.common.world.BiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_OVERWORLD), HolderSet.direct( placed.getOrThrow(PlacedFeatures.NORMAL_TRITANIUM), diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt index c2e1a2448..dd5834e13 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen import net.minecraft.tags.ItemTags 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.android.AndroidResearchDescriptions import ru.dbotthepony.mc.otm.android.AndroidResearchResults diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt index 79e01991e..dd1de0d6a 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt @@ -1,10 +1,9 @@ package ru.dbotthepony.mc.otm.datagen -import net.minecraft.resources.ResourceLocation import net.minecraft.sounds.SoundEvent -import net.minecraftforge.common.data.SoundDefinition -import net.minecraftforge.common.data.SoundDefinitionsProvider -import net.minecraftforge.data.event.GatherDataEvent +import net.neoforged.neoforge.common.data.SoundDefinition +import net.neoforged.neoforge.common.data.SoundDefinitionsProvider +import net.neoforged.neoforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.registry.MSoundEvents fun SoundDefinition.subtitle(value: SoundEvent): SoundDefinition { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt index b6c2d0b13..32ecd25a1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt @@ -2,8 +2,8 @@ package ru.dbotthepony.mc.otm.datagen.advancements import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.AdvancementRewards -import net.minecraft.advancements.FrameType import net.minecraft.advancements.AdvancementRequirements.Strategy +import net.minecraft.advancements.AdvancementType import net.minecraft.advancements.critereon.InventoryChangeTrigger import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack @@ -105,7 +105,7 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("energy_sword.desc", "Wield a High-Frequency Blade, a melee weapon intended to slice Creepers into creep-cakes") { russian("Получите высокочастотный клинок, оружие ближнего боя предназначенное для нарезания Криперов на крипо-тортики") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("has_item", criterion(MItems.ENERGY_SWORD)) .save(serializer, modLocation("regular/energy_sword")) @@ -120,7 +120,7 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("quantum_battery.desc", "Put together a Quantum Battery, powered by Ender technologies") { russian("Создайте квантовый аккумулятор, пропитанную технологиями Края") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .rewards(AdvancementRewards.Builder.experience(50)) .requirements(Strategy.OR) @@ -138,7 +138,7 @@ fun addAdvancements(serializer: Consumer, 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") { russian("Найдите модуль нулевой точки, вещь из другой мультивселенной, созданная с использованием технологий, потерянных во времени во всех возможных мультивслеленных") }, - frameType = FrameType.CHALLENGE, + frameType = AdvancementType.CHALLENGE, hidden = true ) .rewards(AdvancementRewards.Builder.experience(800)) @@ -346,7 +346,7 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("industrial_glass2.desc", "Paint Industrial Glass all possible colors") { russian("Покрасьте промышленное стекло во все возможные цвета") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .requirements(Strategy.AND) .also { advancement -> @@ -398,7 +398,7 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("cargo_crate_minecart2.desc", "Have all color variants of Minecarts with Cargo Crates") { russian("Создайте все варианты покрасок вагонеток с грузовыми Ящиками") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .requirements(Strategy.AND) .also { advancement -> @@ -416,7 +416,7 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("cargo_crate2.desc", "Craft all color variants of Cargo Crates") { russian("Покрасьте грузовые ящики во все возможные цвета") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .requirements(Strategy.AND) .also { advancement -> @@ -496,9 +496,9 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("tritanium_block3.desc", "Craft all color variants of Tritanium Blocks") { 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) .also { advancement -> MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } @@ -515,9 +515,9 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("tritanium_block4.desc", "Craft ALL color variants of Tritanium Blocks including striped ones") { 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) .also { advancement -> MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } @@ -554,7 +554,7 @@ fun addAdvancements(serializer: Consumer, lang: MatteryLangua description = translation.add("all_pills.desc", "Find all possible pill types") { russian("Найдите всевозможные варианты пилюль") }, - frameType = FrameType.CHALLENGE, + frameType = AdvancementType.CHALLENGE, hidden = true ) .rewards(AdvancementRewards.Builder.experience(200)) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt index b9e4a4e01..e20d60046 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.advancements import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.AdvancementRequirements.Strategy 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.ItemPredicate import net.minecraft.advancements.critereon.MinMaxBounds.Doubles @@ -62,7 +62,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter russian("Используйте модуль нулевой точки как внутренний источник питания. Теперь только вечность будет вашим злейшим врагом") }, hidden = true, - frameType = FrameType.CHALLENGE + frameType = AdvancementType.CHALLENGE ) .addCriterion("item", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build()).criterion()) .save(serializer, modLocation("android/zpm")) @@ -78,7 +78,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter russian("Используйте Квантовый Аккумулятор как внутренний источник питания, можно даже подключить другой конец к Реактору Распада") }, hidden = true, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .requirements(Strategy.OR) .addCriterion("item0", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.QUANTUM_BATTERY).build()).criterion()) @@ -126,7 +126,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter russian("Вновь обретите плоть после своей жизни как набор гаек и болтов, но вот чего-то всё равно не хватает, что было при вас с самого начала...") }, hidden = true, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("become_humane", BecomeHumaneTrigger.criterion) .save(serializer, modLocation("android/become_humane")) @@ -213,7 +213,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter russian("Дайте наноботам поглотить 5 сердец урона, не отключившись насовсем") }, hidden = true, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(10.0)).criterion()) .save(serializer, modLocation("android/nanobots_armor_deflect")) @@ -229,7 +229,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter russian("Дайте наноботам поглотить 10 сердец урона, не отключившись насовсем") }, hidden = true, - frameType = FrameType.CHALLENGE + frameType = AdvancementType.CHALLENGE ) .addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(20.0)).criterion()) .save(serializer, modLocation("android/nanobots_armor_deflect2")) @@ -244,7 +244,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter description = translation.add("fall_dampeners_save.desc", "Survive fall that would have otherwise be fatal without Fall Dampeners") { russian("Выживите после падения, которое было бы фатальным без поглотителей инерции") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("saved", FallDampenersSaveTrigger.criterion) .save(serializer, modLocation("android/fall_dampeners_save")) @@ -259,7 +259,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter description = translation.add("ender_teleport_fall_death.desc", "Fall to your demise moments after Teleporting as Android") { russian("Разбейтесь насмерть через мгновения после телепортации за андроида") }, - frameType = FrameType.GOAL, + frameType = AdvancementType.GOAL, hidden = true ) .addCriterion("death", EnderTeleporterFallDeathTrigger.criterion) @@ -289,7 +289,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter description = translation.add("regen_all.desc", "Max out Nanobots Regeneration research") { russian("Полностью исследуйте регенерацию наноботов за андроида") }, - frameType = FrameType.GOAL, + frameType = AdvancementType.GOAL, ) .addCriterion("regen0", AndroidResearchTrigger.Instance(modLocation(MNames.NANOBOTS_REGENERATION_1)).criterion()) .addCriterion("regen1", AndroidResearchTrigger.Instance(modLocation(MNames.NANOBOTS_REGENERATION_2)).criterion()) @@ -307,7 +307,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter description = translation.add("research_all.desc", "Research everything as Android (that don't block or get blocked by any other research)") { russian("Исследуйте все технологии за андроида (которые не блокируют и не блокируются другими технологиями)") }, - frameType = FrameType.CHALLENGE + frameType = AdvancementType.CHALLENGE ) .rewards(AdvancementRewards.Builder.experience(400).addLootTable(modLocation("research_all_android"))) .also { advancement -> @@ -343,7 +343,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter description = translation.add("shockwave_warden.desc", "Hurt Warden using Shockwave ability") { russian("Нанесите хранителю урон используя ударную волну") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("shockwave_warden", ShockwaveDamageMobTrigger.Instance(Optional.of(EntityPredicate.Builder.entity().of(EntityType.WARDEN).build().wrap())).criterion()) .save(serializer, modLocation("android/shockwave_warden")) @@ -358,7 +358,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter description = translation.add("wither.desc", "Defeat The Wither as Android. The Wither was surely confused over kind of thing you are") { russian("Победите Иссушителя будучи андроидом. Наверняка Иссушитель был ошеломлён таким раскладом дел") }, - frameType = FrameType.GOAL, + frameType = AdvancementType.GOAL, hidden = true ) .addCriterion("kill_wither", KillAsAndroidTrigger.Instance( @@ -376,7 +376,7 @@ fun addAndroidAdvancements(serializer: Consumer, 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...") { russian("Преодолейте как минимум 200 метров под водой будучи андроидом без исследования воздушных мешков. Кого-то это нам напоминает...") }, - frameType = FrameType.GOAL, + frameType = AdvancementType.GOAL, hidden = true ) .addCriterion("travel", AndroidTravelUnderwater.Instance(200.0).criterion()) @@ -392,7 +392,7 @@ fun addAndroidAdvancements(serializer: Consumer, 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") { russian("Преодолейте как минимум 1046 метров под водой будучи андроидом без исследования воздушных мешков, прям как тот, кто так однажды так и сделал") }, - frameType = FrameType.CHALLENGE, + frameType = AdvancementType.CHALLENGE, hidden = true ) .addCriterion("travel", AndroidTravelUnderwater.Instance(1046.0).criterion()) @@ -408,7 +408,7 @@ fun addAndroidAdvancements(serializer: Consumer, lang: Matter description = translation.add("elder_guardian.desc", "Slay Elder Guardian as Android without Air Bags researched") { russian("Победите Древнего стража будучи андроидом без исследования воздушных мешков") }, - frameType = FrameType.CHALLENGE, + frameType = AdvancementType.CHALLENGE, hidden = true ) .addCriterion("kill_elder_guardian", KillAsAndroidTrigger.Instance( diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/ExopackAdvancementsData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/ExopackAdvancementsData.kt index 5e15965ce..fa702670e 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/ExopackAdvancementsData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/ExopackAdvancementsData.kt @@ -1,12 +1,10 @@ package ru.dbotthepony.mc.otm.datagen.advancements -import net.minecraft.advancements.Advancement import net.minecraft.advancements.AdvancementHolder -import net.minecraft.advancements.FrameType +import net.minecraft.advancements.AdvancementType import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.world.item.ItemStack 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.modLocation import ru.dbotthepony.mc.otm.registry.MItems @@ -32,7 +30,7 @@ fun addExopackAdvancements(serializer: Consumer, lang: Matter description = translation.add("zpm_battery.desc", "Use Zero Point Module as power source in Exopack") { russian("Используйте модуль нулевой точки как источник питания в Экзопаке") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("zpm_battery", ExopackBatterySlotTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build()).criterion()) .save(serializer, modLocation("exopack/zpm_battery")) @@ -47,7 +45,7 @@ fun addExopackAdvancements(serializer: Consumer, lang: Matter description = translation.add("obtained.desc", "Obtain an Exopack, a mysterious, semi-present, light as a feather, stuff storage on your back") { russian("Получите Экзопак, загадочное, полу-присутствующее, лёгкое как пёрышко, хранилище штуковин на вашей спине") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("obtained", ExopackObtainedTrigger.criterion) .save(serializer, modLocation("exopack/obtained")) @@ -150,7 +148,7 @@ fun addExopackAdvancements(serializer: Consumer, lang: Matter description = translation.add("size3.desc", "Reach 108 slots in your Exopack storage") { russian("Достигните 108 слотов хранилища Экзопака") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("size3", ExopackSlotsExpandedTrigger.Instance(minTotal = 108).criterion()) .save(serializer, modLocation("exopack/size3")) @@ -166,7 +164,7 @@ fun addExopackAdvancements(serializer: Consumer, lang: Matter description = translation.add("size4.desc", "Reach 432 slots in your Exopack storage. You could fit a house in there") { russian("Достигните 432 слотов хранилища Экзопака. Туда можно уже впихнуть целый дом") }, - frameType = FrameType.CHALLENGE + frameType = AdvancementType.CHALLENGE ) .addCriterion("size4", ExopackSlotsExpandedTrigger.Instance(minTotal = 432).criterion()) .save(serializer, modLocation("exopack/size4")) @@ -182,7 +180,7 @@ fun addExopackAdvancements(serializer: Consumer, lang: Matter description = translation.add("size5.desc", "Reach 1728 slots in your Exopack storage. Why would you need to go any bigger?!") { russian("Достигните 1728 слотов хранилища Экзопака. Куда вам столько?!") }, - frameType = FrameType.CHALLENGE + frameType = AdvancementType.CHALLENGE ) .addCriterion("size5", ExopackSlotsExpandedTrigger.Instance(minTotal = 1728).criterion()) .save(serializer, modLocation("exopack/size5")) @@ -226,7 +224,7 @@ fun addExopackAdvancements(serializer: Consumer, lang: Matter description = translation.add("once2.desc", "Upgrade your Exopack storage with 54 slots using one module") { russian("Улучшите хранилище Экзопака модулем на 54 слотов") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("once2", ExopackSlotsExpandedTrigger.Instance(minGained = 54).criterion()) .save(serializer, modLocation("exopack/once2")) @@ -242,7 +240,7 @@ fun addExopackAdvancements(serializer: Consumer, lang: Matter description = translation.add("once3.desc", "Upgrade your Exopack storage with 90 slots using one module") { russian("Улучшите хранилище Экзопака модулем на 90 слотов") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("once3", ExopackSlotsExpandedTrigger.Instance(minGained = 90).criterion()) .save(serializer, modLocation("exopack/once3")) @@ -258,7 +256,7 @@ fun addExopackAdvancements(serializer: Consumer, 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!") { russian("Улучшите хранилище Экзопака модулем на 150 слотов. Открой один - и покатились стеллажи на десятки метров!") }, - frameType = FrameType.CHALLENGE + frameType = AdvancementType.CHALLENGE ) .addCriterion("once4", ExopackSlotsExpandedTrigger.Instance(minGained = 150).criterion()) .save(serializer, modLocation("exopack/once4")) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/Helpers.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/Helpers.kt index 83a4eef59..d68c23aae 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/Helpers.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/Helpers.kt @@ -1,30 +1,53 @@ package ru.dbotthepony.mc.otm.datagen.advancements 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.CriterionTriggerInstance import net.minecraft.advancements.DisplayInfo -import net.minecraft.advancements.FrameType import net.minecraft.advancements.critereon.ContextAwarePredicate import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.InventoryChangeTrigger import net.minecraft.advancements.critereon.ItemPredicate +import net.minecraft.core.registries.Registries import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.level.ItemLike 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 Advancement.Builder.save(serializer: Consumer, 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( itemStack: ItemStack, title: Component = TextComponent("undefined"), description: Component = TextComponent("undefined"), background: ResourceLocation? = null, - frameType: FrameType = FrameType.TASK, + frameType: AdvancementType = AdvancementType.TASK, showToast: Boolean = true, announceChat: Boolean = true, hidden: Boolean = false, @@ -48,7 +71,7 @@ fun Advancement.Builder.display( title: Component = TextComponent("undefined"), description: Component = TextComponent("undefined"), background: ResourceLocation? = null, - frameType: FrameType = FrameType.TASK, + frameType: AdvancementType = AdvancementType.TASK, showToast: Boolean = true, announceChat: Boolean = true, hidden: Boolean = false, diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt index 78dfd97df..0bfc69121 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.advancements import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.AdvancementRequirements -import net.minecraft.advancements.FrameType +import net.minecraft.advancements.AdvancementType import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack @@ -148,7 +148,7 @@ fun addMachineAdvancements(serializer: Consumer, 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") { russian("Среплицируйте что либо используя репликатор материи. Если это еда, то не стесняйтесь быть первым, кто попробует её на вкус среди вашей компании") }, - frameType = FrameType.GOAL + frameType = AdvancementType.GOAL ) .addCriterion("replicate_something", TakeItemOutOfReplicatorTrigger.Instance(ItemPredicate.Builder.item().of(MItems.MATTER_DUST).build(), true).criterion()) .save(serializer, modLocation("machines/replicate_something")) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt index acc27d924..d07aee31d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt @@ -2,9 +2,9 @@ package ru.dbotthepony.mc.otm.datagen.blocks import net.minecraft.world.item.DyeColor import net.minecraft.world.level.block.Block -import net.minecraftforge.client.model.generators.BlockStateProvider -import net.minecraftforge.client.model.generators.ConfiguredModel -import net.minecraftforge.data.event.GatherDataEvent +import net.neoforged.neoforge.client.model.generators.BlockStateProvider +import net.neoforged.neoforge.client.model.generators.ConfiguredModel +import net.neoforged.neoforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.yRotationBlockstateNorth diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt index 8cf6bd9b6..5c0048427 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt @@ -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.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.decorative.CargoCrateBlock import ru.dbotthepony.mc.otm.block.entity.WorkerState diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt index fa5038372..434aa56ed 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt @@ -5,9 +5,9 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.RotatedPillarBlock import net.minecraft.world.level.block.state.BlockState -import net.minecraftforge.client.model.generators.BlockStateProvider -import net.minecraftforge.client.model.generators.ConfiguredModel -import net.minecraftforge.data.event.GatherDataEvent +import net.neoforged.neoforge.client.model.generators.BlockStateProvider +import net.neoforged.neoforge.client.model.generators.ConfiguredModel +import net.neoforged.neoforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.core.getValueNullable import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt index 52586634c..ef82ab0ec 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt @@ -6,9 +6,10 @@ import net.minecraft.server.packs.PackType import net.minecraft.world.item.ArmorItem import net.minecraft.world.item.DyeColor import net.minecraft.world.item.Item -import net.minecraftforge.client.model.generators.ItemModelProvider -import net.minecraftforge.data.event.GatherDataEvent +import net.neoforged.neoforge.client.model.generators.ItemModelProvider +import net.neoforged.neoforge.data.event.GatherDataEvent 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.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.modLocation @@ -104,7 +105,7 @@ class MatteryItemModelProvider(event: GatherDataEvent) : ItemModelProvider(event if (item is ArmorItem) { 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") val overrideModel = withExistingParent("${item.registryName!!.path}_${material}_trim", GENERATED) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 6cecd4098..91a4f0163 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -722,7 +722,6 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable 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.PATTERN_DRIVE_NORMAL, "Pattern Drive") add(MItems.PATTERN_DRIVE_CREATIVE, "Creative Pattern Drive") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt index d87e5d4b1..211b18965 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt @@ -15,10 +15,9 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.enchantment.Enchantment 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.android.AndroidFeatureType -import ru.dbotthepony.mc.otm.android.AndroidResearch import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.datagen.DataGen @@ -88,7 +87,6 @@ class MatteryLanguageProvider(private val gen: DataGenerator) { fun addItem(key: Collection, value: String) = key.forEach { add(it, 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: Enchantment, 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) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 14b5a1c73..4b21207ca 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -727,7 +727,6 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive") add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive") - add(MItems.PLASMA_RIFLE, "Плазменная винтовка") add(MItems.TRITANIUM_ORE_CLUMP, "Рудный тритан") add(MItems.PATTERN_DRIVE_NORMAL, "Диск шаблонов") add(MItems.PATTERN_DRIVE_CREATIVE, "Творческий диск шаблонов") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiers.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiers.kt index af9dc0737..4b737138d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiers.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiers.kt @@ -1,9 +1,9 @@ package ru.dbotthepony.mc.otm.datagen.loot -import net.minecraft.data.DataGenerator import net.minecraft.world.item.ItemStack 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.datagen.DataGen import java.util.Arrays @@ -51,7 +51,7 @@ fun PlainLootAppender( vararg items: Pair ) = 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>() fun lambda(lambda: (LootModifiers) -> Unit) { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt index 3131627ab..e3312fe82 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt @@ -1,12 +1,15 @@ package ru.dbotthepony.mc.otm.datagen.loot +import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation import net.minecraft.util.valueproviders.UniformInt import net.minecraft.world.entity.EntityType import net.minecraft.world.item.ItemStack 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.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.data.UniformDecimal import ru.dbotthepony.mc.otm.data.condition.ChanceWithPlaytimeCondition @@ -28,6 +31,11 @@ fun LootTableIdCondition(location: ResourceLocation): LootItemCondition { return LootTableIdCondition.Builder(location).build() } +@Suppress("FunctionName") +fun LootTableIdCondition(location: ResourceKey): LootItemCondition { + return LootTableIdCondition.Builder(location.location()).build() +} + fun addLootModifiers(it: LootModifiers) { it.add("dungeon_exopack", LootPoolAppender( arrayOf(LootTableIdCondition(BuiltInLootTables.SIMPLE_DUNGEON)), diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt index 8b9c8dea4..9618d6fa9 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt @@ -6,10 +6,12 @@ package ru.dbotthepony.mc.otm.datagen.loot import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap import it.unimi.dsi.fastutil.objects.Reference2ObjectFunction import net.minecraft.advancements.critereon.StatePropertiesPredicate +import net.minecraft.core.WritableRegistry import net.minecraft.data.DataGenerator import net.minecraft.data.loot.LootTableProvider 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.block.Block 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.entries.LootItem 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.parameters.LootContextParamSet 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.providers.number.ConstantValue -import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity -import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity +import net.neoforged.neoforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.core.stream 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, () -> LootTable.Builder>>() -fun TileNbtCopy(source: String, strategy: CopyNbtFunction.MergeStrategy = CopyNbtFunction.MergeStrategy.REPLACE): NbtCopy { - 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 LootTable.Builder>>() - - fun builder(context: LootContextParamSet, id: ResourceLocation, provider: LootTable.Builder.() -> Unit) { + fun builder(context: LootContextParamSet, id: ResourceKey, provider: LootTable.Builder.() -> Unit) { provider(context, id) { LootTable.lootTable().also(provider) } } - fun provider(context: LootContextParamSet, id: ResourceLocation, provider: () -> LootTable.Builder) { + fun provider(context: LootContextParamSet, id: ResourceKey, provider: () -> LootTable.Builder) { check(providersTable .computeIfAbsent(context, Reference2ObjectFunction { HashMap() }) .put(id, provider) == null) { "Duplicate loot pool entry for $id" } @@ -63,7 +57,11 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator.packOut }.toList() } - override fun validate(map: MutableMap, validationtracker: ValidationContext) {} + override fun validate( + writableregistry: WritableRegistry, + validationtracker: ValidationContext, + `problemreporter$collector`: ProblemReporter.Collector + ) {} fun createSlabItemTable(block: Block, configurator: LootPoolSingletonContainer.Builder<*>.() -> Unit = {}) { 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, block: LootPool.Builder.() -> Unit) { builder(context, id) { withPool(LootPool.lootPool().also(block)) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesChests.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesChests.kt index 423fc171d..41b3b1e1b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesChests.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesChests.kt @@ -1,14 +1,12 @@ package ru.dbotthepony.mc.otm.datagen.loot 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.providers.number.ConstantValue -import ru.dbotthepony.mc.otm.datagen.modLocation +import ru.dbotthepony.mc.otm.datagen.modLootTable import ru.dbotthepony.mc.otm.registry.MItems fun addChestLootTables(loot: LootTables) { - loot.builder(LootContextParamSets.CHEST, modLocation("food_box")) { + loot.builder(LootContextParamSets.CHEST, modLootTable("food_box")) { lootPool { item(Items.PACKED_ICE) { setCount(minimal = 1, maximal = 3) } item(MItems.NUTRIENT_PASTE) { setCount(minimal = 1, maximal = 2) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt index 279e8de01..80b488c51 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt @@ -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.predicates.ExplosionCondition 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.MItems 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 { 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.ORANGE_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) } } } - 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.ORANGE_DYE) { setCount(64) } } lootPool { item(Items.MAGENTA_DYE) { setCount(64) } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt index 63ec5c1f1..fb3880106 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt @@ -2,8 +2,8 @@ package ru.dbotthepony.mc.otm.datagen.models import net.minecraft.world.item.DyeColor import net.minecraft.world.level.block.Block -import net.minecraftforge.client.model.generators.BlockModelProvider -import net.minecraftforge.data.event.GatherDataEvent +import net.neoforged.neoforge.client.model.generators.BlockModelProvider +import net.neoforged.neoforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.datagen.modLocation diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ComponentRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ComponentRecipes.kt index 391ce59bc..590504417 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ComponentRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ComponentRecipes.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes import net.minecraft.data.recipes.RecipeCategory import net.minecraft.data.recipes.RecipeOutput 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.MItems diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt index 0d917f911..a53f8da2b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt @@ -1,6 +1,6 @@ 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.RecipeOutput 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.Items 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.registry.MBlocks 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.datagen.modLocation import ru.dbotthepony.mc.otm.recipe.UpgradeRecipe -import java.util.function.Consumer fun addCraftingTableRecipes(consumer: RecipeOutput) { val machinesCategory = RecipeCategory.DECORATIONS @@ -75,7 +74,7 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { for ((color, item) in MItems.PLATE_PRESS) { MatteryRecipe(MBlocks.TWIN_PLATE_PRESS[color]!!, category = machinesCategory) .setUpgradeSource(item) - .addUpgradeOps(UpgradeRecipe.All) + .addUpgradeOps(UpgradeRecipe.CopyAllComponents) .rowA(item) .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) - .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(MItems.MATTER_CABLE, MItems.MATTER_IO_PORT, MItems.MATTER_CABLE) .unlockedBy(MItems.MATTER_CABLE) .build(consumer) 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(MItems.ELECTRIC_PARTS, MItems.ENERGY_BUS, MItems.ELECTRIC_PARTS) .unlockedBy(MItems.ENERGY_BUS) @@ -156,7 +155,7 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { .build(consumer) 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, ItemTags.BEDS, MItemTags.TRITANIUM_PLATES) .unlockedBy(MItems.QUANTUM_TRANSCEIVER) @@ -216,10 +215,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { // броня MatteryRecipe(MItems.TRITANIUM_HELMET, category = RecipeCategory.COMBAT) .setUpgradeSource(Items.LEATHER_HELMET) - .addUpgradeOps( - UpgradeRecipe.Direct("display"), - UpgradeRecipe.Direct("Enchantments"), - ) + .addUpgradeOps(UpgradeRecipe.CopyEnchantments) + .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME)) .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) .unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES) @@ -227,10 +224,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { MatteryRecipe(MItems.TRITANIUM_PANTS, category = RecipeCategory.COMBAT) .setUpgradeSource(Items.LEATHER_LEGGINGS) - .addUpgradeOps( - UpgradeRecipe.Direct("display"), - UpgradeRecipe.Direct("Enchantments"), - ) + .addUpgradeOps(UpgradeRecipe.CopyEnchantments) + .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME)) .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) .rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) @@ -239,10 +234,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { MatteryRecipe(MItems.TRITANIUM_CHESTPLATE, category = RecipeCategory.COMBAT) .setUpgradeSource(Items.LEATHER_CHESTPLATE) - .addUpgradeOps( - UpgradeRecipe.Direct("display"), - UpgradeRecipe.Direct("Enchantments"), - ) + .addUpgradeOps(UpgradeRecipe.CopyEnchantments) + .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME)) .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) @@ -251,10 +244,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { MatteryRecipe(MItems.TRITANIUM_BOOTS, category = RecipeCategory.COMBAT) .setUpgradeSource(Items.LEATHER_BOOTS) - .addUpgradeOps( - UpgradeRecipe.Direct("display"), - UpgradeRecipe.Direct("Enchantments"), - ) + .addUpgradeOps(UpgradeRecipe.CopyEnchantments) + .addUpgradeOps(UpgradeRecipe.CopyComponent(DataComponents.CUSTOM_NAME)) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_BOOTS, MItemTags.REINFORCED_TRITANIUM_PLATES) .rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES) @@ -368,8 +359,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { MatteryRecipe(MItems.MATTER_RECONSTRUCTOR[dye]!!, category = machinesCategory) .setUpgradeSource(item) .addUpgradeOps( - UpgradeRecipe.Indirect("BlockEntityTag.${MatteryBlockEntity.ENERGY_KEY}", "BlockEntityTag.energy"), - UpgradeRecipe.Indirect("BlockEntityTag.${MatteryBlockEntity.MATTER_STORAGE_KEY}", "BlockEntityTag.matter"), + UpgradeRecipe.CopyTileComponent(MatteryBlockEntity.ENERGY_KEY, "energy"), + UpgradeRecipe.CopyTileComponent(MatteryBlockEntity.MATTER_STORAGE_KEY, "matter"), ) .row(MItemTags.ADVANCED_CIRCUIT, Tags.Items.GEMS_EMERALD, MItemTags.ADVANCED_CIRCUIT) .row(MItems.ELECTRIC_PARTS, item, MItems.ELECTRIC_PARTS) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt index 522c48dbc..3a5b31178 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt @@ -6,14 +6,13 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.Ingredient 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.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry -import java.util.function.Consumer private fun stairs(base: ItemLike, result: ItemLike, consumer: RecipeOutput) { 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) .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) .unlockedBy(Tags.Items.INGOTS_IRON) .unlockedBy(Tags.Items.DYES_BLACK) @@ -142,7 +141,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu MatteryRecipe(MItems.METAL_BEAM, 24, category = RecipeCategory.BUILDING_BLOCKS) .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) .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) .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) .unlockedBy(Tags.Items.INGOTS_IRON) .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) .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) .unlockedBy(MItemTags.TRITANIUM_INGOTS) .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) .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) .unlockedBy(MItemTags.TRITANIUM_INGOTS) .build(consumer, modLocation("decorative/blocks/default")) @@ -298,7 +297,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu .unlockedBy(MItemTags.TRITANIUM_INGOTS) .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) .requires(Ingredient.of(MItems.TRITANIUM_DOOR.entries.stream().filter { it.key != color }.map { ItemStack(it.value) })) .requires(color.tag) @@ -312,7 +311,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu .unlockedBy(MItemTags.TRITANIUM_INGOTS) .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) .requires(Ingredient.of(MItems.TRITANIUM_TRAPDOOR.entries.stream().filter { it.key != color }.map { ItemStack(it.value) })) .requires(color.tag) @@ -325,7 +324,7 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu .unlockedBy(MItemTags.TRITANIUM_PLATES) .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) .requires(Ingredient.of(MRegistry.TRITANIUM_PRESSURE_PLATE.allItems.entries.stream().filter { it.key != dye }.map { ItemStack(it.value) })) .requires(dye.tag) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MachineUpgradeRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MachineUpgradeRecipes.kt index f11d03911..d8bb39d84 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MachineUpgradeRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MachineUpgradeRecipes.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes import net.minecraft.data.recipes.RecipeOutput 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.MItems @@ -65,8 +65,8 @@ fun addMachineUpgradeRecipes(consumer: RecipeOutput) { .build(consumer) MatteryRecipe(tier.MATTER_STORAGE, 1) - .rowB(Tags.Items.GLASS) - .row(Tags.Items.GLASS, MItems.MATTER_CAPACITOR_PARTS, Tags.Items.GLASS) + .rowB(Tags.Items.GLASS_BLOCKS) + .row(Tags.Items.GLASS_BLOCKS, MItems.MATTER_CAPACITOR_PARTS, Tags.Items.GLASS_BLOCKS) .rowB(tier.BLANK) .unlockedBy(tier.BLANK) .unlockedBy(MItems.MATTER_CAPACITOR_PARTS) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatterEntanglerRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatterEntanglerRecipes.kt index 19378ec84..3f7a4c7a1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatterEntanglerRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatterEntanglerRecipes.kt @@ -1,42 +1,70 @@ package ru.dbotthepony.mc.otm.datagen.recipes +import net.minecraft.core.NonNullList import net.minecraft.data.recipes.RecipeOutput import net.minecraft.world.item.ItemStack 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.datagen.modLocation -import ru.dbotthepony.mc.otm.recipe.IngredientMatrix import ru.dbotthepony.mc.otm.recipe.MatterEntanglerRecipe import ru.dbotthepony.mc.otm.registry.MItemTags 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) { consumer.accept( + modLocation("quantum_capacitor"), MatterEntanglerRecipe( - IngredientMatrix.of( - listOf(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)), - listOf(Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES)), + pattern( + Ingredient.of(MItems.ELECTRIC_PARTS), Ingredient.of(MItemTags.GOLD_WIRES), Ingredient.of(MItems.ELECTRIC_PARTS), + Ingredient.of(MItems.BATTERY_CAPACITOR), Ingredient.of(MItems.QUANTUM_TRANSCEIVER), Ingredient.of(MItems.BATTERY_CAPACITOR), + Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), ), Decimal(40), 400.0, ItemStack(MItems.QUANTUM_CAPACITOR, 2), experience = 15f - ).energetic().toFinished(modLocation("quantum_capacitor")) + ).energetic() ) consumer.accept( + modLocation("quantum_battery"), MatterEntanglerRecipe( - IngredientMatrix.of( - listOf(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)), - listOf(Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES)), + pattern( + Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE), Ingredient.of(MItemTags.GOLD_WIRES), Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE), + Ingredient.of(MItems.BATTERY_DENSE), Ingredient.of(MItems.QUANTUM_TRANSCEIVER), Ingredient.of(MItems.BATTERY_DENSE), + Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), Ingredient.of(MItemTags.TRITANIUM_PLATES), ), Decimal(120), 600.0, ItemStack(MItems.QUANTUM_BATTERY, 2), experience = 20f - ).energetic().toFinished(modLocation("quantum_battery")) + ).energetic() ) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt index 027df49bb..890d8364c 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt @@ -1,10 +1,9 @@ package ru.dbotthepony.mc.otm.datagen.recipes -import com.google.gson.JsonObject import net.minecraft.advancements.Advancement +import net.minecraft.advancements.AdvancementHolder import net.minecraft.advancements.Criterion -import net.minecraft.data.recipes.FinishedRecipe import net.minecraft.data.recipes.RecipeCategory import net.minecraft.data.recipes.RecipeOutput import net.minecraft.data.recipes.ShapedRecipeBuilder @@ -12,12 +11,13 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.tags.TagKey import net.minecraft.world.item.Item 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.ShapedRecipe import net.minecraft.world.level.ItemLike +import net.neoforged.neoforge.common.conditions.ICondition import ru.dbotthepony.mc.otm.OverdriveThatMatters 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.recipe.UpgradeRecipe @@ -54,18 +54,6 @@ private data class RecipeRow( 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 */ @@ -180,22 +168,12 @@ class MatteryRecipe(val result: ItemLike, val count: Int = 1, val category: Reci return this } - private fun filter(): (FinishedRecipe) -> FinishedRecipe { + private fun filter(): (ShapedRecipe) -> ShapedRecipe { if (upgradeSource != null) { check(copyPaths.isNotEmpty()) { "Defined upgrade recipe without nbt migration operations" } return { - object : FinishedRecipe by 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 - } - } + UpgradeRecipe(it, copyPaths.map { upgradeSource!! to it }) } } @@ -222,13 +200,8 @@ class MatteryRecipe(val result: ItemLike, val count: Int = 1, val category: Reci } fun buildEnergetic(consumer: RecipeOutput, name: String? = null) { - build(consumer.map { - object : FinishedRecipe by it { - override fun type(): RecipeSerializer<*> { - return EnergyContainerRecipe.Companion - } - } - }, name) + addUpgradeOps(UpgradeRecipe.CopyEnergyCharge) + build(consumer, name) } fun row(): MatteryRecipe { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipeProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipeProvider.kt index 6e36513b1..c0d019828 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipeProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipeProvider.kt @@ -1,15 +1,13 @@ package ru.dbotthepony.mc.otm.datagen.recipes 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.Criterion -import net.minecraft.advancements.critereon.ContextAwarePredicate -import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.InventoryChangeTrigger import net.minecraft.advancements.critereon.ItemPredicate 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.RecipeOutput 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.ItemStack 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.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.datagen.modLocation import ru.dbotthepony.mc.otm.recipe.MicrowaveRecipe import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe import java.util.* -import java.util.function.Consumer import java.util.stream.Stream private typealias RecipeBuilderCallback = (MatteryRecipeProvider, consumer: RecipeOutput) -> Unit @@ -47,9 +49,7 @@ fun has(p_125976_: TagKey): Criterion { return CriteriaTriggers.INVENTORY_CHANGED.createCriterion(InventoryChangeTrigger.TriggerInstance( Optional.empty(), - MinMaxBounds.Ints.ANY, - MinMaxBounds.Ints.ANY, - MinMaxBounds.Ints.ANY, + InventoryChangeTrigger.TriggerInstance.Slots.ANY, ImmutableList.copyOf(p_126012_) )) } @@ -87,7 +87,28 @@ fun T.unlockedBy(item: TagKey): T { return this } -class MatteryRecipeProvider(generatorIn: DataGenerator) : RecipeProvider(generatorIn.packOutput) { +fun > 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() 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) { exec { _, consumer -> - consumer.accept(PlatePressRecipe( - Ingredient.of(ItemTags.create(ResourceLocation("forge", "ingots/$id"))), - Ingredient.of(ItemTags.create(ResourceLocation("forge", "plates/$id"))), + consumer.accept(modLocation("plates/$id"), PlatePressRecipe( + Ingredient.of(ItemTags.create(ResourceLocation("c", "ingots/$id"))), + Ingredient.of(ItemTags.create(ResourceLocation("c", "plates/$id"))), count, workTicks, experience = experience - ).toFinished(modLocation("plates/$id"))) + )) } } fun plate(id: String, ingredient: Ingredient, result: Ingredient, count: Int = 1, workTicks: Int = 200, experience: FloatProvider = ConstantFloat.ZERO) { 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) { 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)) } } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt index b0a82581f..5fc86899f 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt @@ -1,6 +1,5 @@ package ru.dbotthepony.mc.otm.datagen.recipes -import net.minecraft.data.recipes.FinishedRecipe import net.minecraft.data.recipes.RecipeOutput import net.minecraft.world.item.DyeColor 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.crafting.Ingredient 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.recipe.PainterArmorDyeRecipe import ru.dbotthepony.mc.otm.recipe.PainterRecipe import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry -import java.util.function.Consumer private val Item.recipeName get() = registryName!!.namespace + "/" + registryName!!.path @@ -22,11 +19,11 @@ private fun generate(consumer: RecipeOutput, items: Map, am for ((targetColor, targetItem) in items) { 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) }), ItemStack(targetItem), mapOf(targetColor to amount) - ).toFinished(modLocation("painter/" + targetItem.recipeName))) + )) } } @@ -39,31 +36,31 @@ private fun generate(consumer: RecipeOutput, default: Item, items: Map) { - consumer.accept(PainterRecipe( + consumer.accept(modLocation("painter/cleaning/" + to.recipeName), PainterRecipe( Ingredient.of(from.entries.stream().filter { it.key != null }.map { ItemStack(it.value) }), ItemStack(to), mapOf(null to 15) - ).toFinished(modLocation("painter/cleaning/" + to.recipeName))) + )) } private fun striped(consumer: RecipeOutput, name: String, items: List>>, base: Map) { for ((stripeItem, colors) in items) { val (baseColor, stripe) = colors - consumer.accept(PainterRecipe( + consumer.accept(modLocation("painter/stripes_$name/${baseColor.getName()}/${stripe.getName()}"), PainterRecipe( Ingredient.of(base[baseColor]), ItemStack(stripeItem), 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) 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), ItemStack(MItems.TRITANIUM_STRIPED_BLOCK), 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), ItemStack(MItems.TRITANIUM_STRIPED_STAIRS), 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), ItemStack(MItems.TRITANIUM_STRIPED_SLAB), 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), ItemStack(MItems.TRITANIUM_STRIPED_WALL), mapOf(DyeColor.YELLOW to 1) - ).toFinished(modLocation("painter/tritanium_yellow_stripe_wall"))) + )) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressRecipes.kt index c8c9bfffe..d76bce930 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressRecipes.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes import net.minecraft.util.valueproviders.ConstantFloat import net.minecraft.world.item.Items 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.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("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)) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt index 4926b477a..a3459b6f7 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt @@ -10,7 +10,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.Ingredient 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.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MItemTags diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/StorageItemRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/StorageItemRecipes.kt index 2b393dc78..d54c98d69 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/StorageItemRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/StorageItemRecipes.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes import net.minecraft.data.recipes.RecipeCategory 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.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems @@ -26,7 +26,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) { MatteryRecipe(MItems.BATTERY_NORMAL, category = RecipeCategory.MISC) .setUpgradeSource(MItems.BATTERY_BASIC) - .addUpgradeOps(UpgradeRecipe.All) + .addUpgradeOps(UpgradeRecipe.CopyAllComponents) .rowB(MItems.ELECTRIC_PARTS) .row(MItemTags.COPPER_WIRES, MItems.BATTERY_BASIC, MItemTags.COPPER_WIRES) .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) .setUpgradeSource(MItems.BATTERY_NORMAL) - .addUpgradeOps(UpgradeRecipe.All) + .addUpgradeOps(UpgradeRecipe.CopyAllComponents) .row(Tags.Items.DUSTS_REDSTONE, MItems.ENERGY_BUS, Tags.Items.DUSTS_REDSTONE) .row(MItemTags.GOLD_WIRES, MItems.BATTERY_NORMAL, MItemTags.GOLD_WIRES) .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) .setUpgradeSource(MItems.BATTERY_NORMAL) - .addUpgradeOps(UpgradeRecipe.All) + .addUpgradeOps(UpgradeRecipe.CopyAllComponents) .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, Tags.Items.DUSTS_REDSTONE, MItemTags.GOLD_WIRES) @@ -56,7 +56,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) { MatteryRecipe(MItems.MATTER_CAPACITOR_NORMAL, category = RecipeCategory.MISC) .setUpgradeSource(MItems.MATTER_CAPACITOR_BASIC) - .addUpgradeOps(UpgradeRecipe.All) + .addUpgradeOps(UpgradeRecipe.CopyAllComponents) .rowB(MItems.MATTER_CAPACITOR_PARTS) .row(MItemTags.TRITANIUM_PLATES, MItems.MATTER_CAPACITOR_BASIC, MItemTags.TRITANIUM_PLATES) .rowB(Tags.Items.GEMS_DIAMOND) @@ -65,7 +65,7 @@ fun addStorageItemRecipes(consumer: RecipeOutput) { MatteryRecipe(MItems.MATTER_CAPACITOR_DENSE, category = RecipeCategory.MISC) .setUpgradeSource(MItems.MATTER_CAPACITOR_NORMAL) - .addUpgradeOps(UpgradeRecipe.All) + .addUpgradeOps(UpgradeRecipe.CopyAllComponents) .row(MItems.MATTER_CAPACITOR_PARTS, MItemTags.HARDENED_GLASS, MItems.MATTER_CAPACITOR_PARTS) .row(MItemTags.TRITANIUM_PLATES, MItems.MATTER_CAPACITOR_NORMAL, MItemTags.TRITANIUM_PLATES) .rowAC(Tags.Items.ENDER_PEARLS, Tags.Items.ENDER_PEARLS) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ToolsRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ToolsRecipes.kt index 1ef382d59..65ad4c579 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ToolsRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ToolsRecipes.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.datagen.recipes import net.minecraft.data.recipes.RecipeCategory 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.MItems diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt index 4bda0864d..c4dc04568 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt @@ -8,7 +8,8 @@ import net.minecraft.world.item.Items import net.minecraft.world.item.Tiers import net.minecraft.world.level.block.Block 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.MBlocks 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.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) - tagsProvider.items.Appender(Tags.Items.ARMORS_CHESTPLATES) .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) - tagsProvider.items.Appender(Tags.Items.ARMORS_BOOTS) .add(MItems.TRITANIUM_BOOTS, MItems.SIMPLE_TRITANIUM_BOOTS) 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.SHOVELS).add(MItems.TRITANIUM_SHOVEL) 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_SHIELDS).add(MItems.TRITANIUM_SHIELD) + tagsProvider.items.Appender(Tags.Items.TOOLS_SHEAR).add(MItems.TRITANIUM_SHEARS) + tagsProvider.items.Appender(Tags.Items.TOOLS_SHIELD).add(MItems.TRITANIUM_SHIELD) tagsProvider.items.Appender(MItemTags.TOOLS_HAMMERS).add(MItems.EXPLOSIVE_HAMMER) tagsProvider.items.forge("tools").add(MItemTags.TOOLS_HAMMERS) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt index fc80ba9a7..dd57976e5 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt @@ -1,6 +1,7 @@ package ru.dbotthepony.mc.otm.datagen.tags import it.unimi.dsi.fastutil.objects.ObjectArraySet +import net.minecraft.core.Holder import net.minecraft.core.HolderLookup import net.minecraft.core.Registry 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.Tiers import net.minecraft.world.level.block.Block -import net.minecraftforge.common.Tags -import net.minecraftforge.data.event.GatherDataEvent -import net.minecraftforge.registries.ForgeRegistries -import net.minecraftforge.registries.IForgeRegistry +import net.neoforged.neoforge.common.Tags +import net.neoforged.neoforge.data.event.GatherDataEvent +import net.neoforged.neoforge.registries.NeoForgeRegistries import ru.dbotthepony.mc.otm.capability.MatteryPlayer +import ru.dbotthepony.mc.otm.core.ResourceLocation import ru.dbotthepony.mc.otm.datagen.DataGen import java.util.stream.Stream import net.minecraft.data.tags.TagsProvider as MinecraftTagsProvider @@ -30,7 +31,7 @@ private fun vanillaLookup(key: ResourceKey>): (T) -> Resou class TagsProvider(private val event: GatherDataEvent) { inner class Delegate private constructor(key: ResourceKey>, val lookup: (T) -> ResourceLocation) : MinecraftTagsProvider(event.generator.packOutput, key, event.lookupProvider, DataGen.MOD_ID, event.existingFileHelper) { - constructor(registry: IForgeRegistry) : this(registry.registryKey, { registry.getKey(it) ?: throw NoSuchElementException("Registry $registry does not contain $it") }) + constructor(registry: Registry) : this(registry.key() as ResourceKey>, { registry.getKey(it) ?: throw NoSuchElementException("$it is not registered in $registry") }) constructor(key: ResourceKey>) : this(key, vanillaLookup(key)) init { @@ -92,6 +93,11 @@ class TagsProvider(private val event: GatherDataEvent) { return this } + fun add(vararg values: Holder): Appender { + for (value in values) add(value.key ?: throw IllegalArgumentException("Intrusive holder")) + return this + } + fun add(vararg values: TagKey): Appender { for (value in values) add(value) return this @@ -165,11 +171,11 @@ class TagsProvider(private val event: GatherDataEvent) { } } - val blocks = Delegate(ForgeRegistries.BLOCKS) - val items = Delegate(ForgeRegistries.ITEMS) - val fluids = Delegate(ForgeRegistries.FLUIDS) - val fluidTypes = Delegate(ForgeRegistries.Keys.FLUID_TYPES) - val mobEffects = Delegate(ForgeRegistries.MOB_EFFECTS) + val blocks = Delegate(BuiltInRegistries.BLOCK) + val items = Delegate(BuiltInRegistries.ITEM) + val fluids = Delegate(BuiltInRegistries.FLUID) + val fluidTypes = Delegate(NeoForgeRegistries.Keys.FLUID_TYPES) + val mobEffects = Delegate(BuiltInRegistries.MOB_EFFECT) val damageTypes = Delegate(Registries.DAMAGE_TYPE) val androidImmuneEffects = mobEffects.Appender(MatteryPlayer.ANDROID_IMMUNE_EFFECTS) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/UpgradeRecipe.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/UpgradeRecipe.kt index 2c825aa55..f73766320 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/UpgradeRecipe.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/UpgradeRecipe.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.recipe +import com.mojang.serialization.Codec import com.mojang.serialization.MapCodec import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.core.HolderLookup @@ -11,6 +12,7 @@ import net.minecraft.network.codec.StreamCodec import net.minecraft.resources.ResourceLocation import net.minecraft.util.StringRepresentable 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.CraftingInput 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.level.Level import ru.dbotthepony.mc.otm.capability.MatteryCapability +import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.core.registryName +import java.util.Optional class UpgradeRecipe( group: String, @@ -39,6 +43,14 @@ class UpgradeRecipe( ).apply(it) { CopyComponent(it) } } }, + COPY_TILE_COMPONENT { + override val codec: MapCodec = 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 { override val codec: MapCodec = 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() { override val type: OpType get() = OpType.COPY_ALL_COMPONENTS