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 abef3d817..d822fca24 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 @@ -1,13 +1,14 @@ package ru.dbotthepony.mc.otm.datagen.loot import com.mojang.datafixers.util.Pair -import it.unimi.dsi.fastutil.objects.ObjectArraySet +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap +import it.unimi.dsi.fastutil.objects.Reference2ObjectFunction +import it.unimi.dsi.fastutil.objects.ReferenceArraySet import net.minecraft.advancements.critereon.StatePropertiesPredicate import net.minecraft.data.DataGenerator -import net.minecraft.data.loot.BlockLoot import net.minecraft.data.loot.LootTableProvider import net.minecraft.resources.ResourceLocation -import net.minecraft.util.valueproviders.UniformInt import net.minecraft.world.level.ItemLike import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.SlabBlock @@ -18,7 +19,6 @@ 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.LootItemFunctions 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 @@ -28,7 +28,7 @@ import net.minecraft.world.level.storage.loot.providers.number.ConstantValue import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity -import java.util.* +import ru.dbotthepony.mc.otm.core.registryName import java.util.function.BiConsumer import java.util.function.Consumer import java.util.function.Supplier @@ -38,11 +38,11 @@ private typealias LootTableCallback = Consumer private typealias LootTableCallbackProvider = Supplier private typealias LootTuple = Pair -fun singleLootPool(f: (LootPool.Builder) -> Unit): LootTable.Builder { +inline fun singleLootPool(f: (LootPool.Builder) -> Unit): LootTable.Builder { return LootTable.lootTable().withPool(LootPool.lootPool().also(f)) } -fun LootTable.Builder.lootPool(configurator: LootPool.Builder.() -> Unit): LootTable.Builder = withPool(LootPool.lootPool().also(configurator)) +inline fun LootTable.Builder.lootPool(configurator: LootPool.Builder.() -> Unit): LootTable.Builder = withPool(LootPool.lootPool().also(configurator)) fun > T.setCount(count: Int): T { apply(SetItemCountFunction.setCount(ConstantValue.exactly(count.toFloat()))) @@ -88,21 +88,37 @@ private val poweredMatterWorker = arrayOf( ) class LootTables(generator: DataGenerator) : LootTableProvider(generator) { - private val providers = LinkedList() + private val providersTable = Reference2ObjectArrayMap LootTable.Builder>>() + + fun builder(context: LootContextParamSet, id: ResourceLocation, provider: LootTable.Builder.() -> Unit) { + provider(context, id) { + LootTable.lootTable().also(provider) + } + } + + fun provider(context: LootContextParamSet, id: ResourceLocation, provider: () -> LootTable.Builder) { + check(providersTable + .computeIfAbsent(context, Reference2ObjectFunction { Object2ObjectArrayMap() }) + .put(id, provider) == null) { "Duplicate loot pool entry for $id" } + } override fun getTables(): List { - return providers + return providersTable.entries.stream().map { entry -> + Pair.of(LootTableCallbackProvider { + LootTableCallback { + for ((id, callback) in entry.value) { + it.accept(id, callback.invoke()) + } + } + }, entry.key) + }.toList() } override fun validate(map: MutableMap, validationtracker: ValidationContext) {} - fun block(provider: LootTableCallback) { - providers.add(Pair(Supplier { provider }, LootContextParamSets.BLOCK)) - } - fun createSlabItemTable(block: Block) { - provider(LootContextParamSets.BLOCK) { - it.accept(block.lootTable, LootTable.lootTable().withPool( + builder(LootContextParamSets.BLOCK, block.lootTable) { + withPool( LootPool.lootPool().setRolls(ConstantValue.exactly(1.0f)).add( LootItem.lootTableItem(block).apply( SetItemCountFunction.setCount( @@ -115,7 +131,7 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator) { ) ) ) - )) + ) } } @@ -123,48 +139,34 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator) { block.forEach(this::createSlabItemTable) } - fun blockSimple(block: Block, provider: (LootPool.Builder) -> Unit) { - block { - it.accept(block.lootTable, singleLootPool(provider::invoke)) + fun blockProvider(block: Block, provider: () -> LootTable.Builder) { + provider(LootContextParamSets.BLOCK, block.registryName!!, provider) + } + + fun block(block: Block, provider: LootPool.Builder.() -> Unit) { + builder(LootContextParamSets.BLOCK, block.registryName!!) { + lootPool(provider) } } - fun provider(context: LootContextParamSet, provider: LootTableCallback) { - providers.add(Pair(Supplier { provider }, context)) - } - - fun provider(context: LootContextParamSet, id: ResourceLocation, block: LootTable.Builder.() -> Unit) { - providers.add(Pair(Supplier { Consumer { it.accept(id, LootTable.lootTable().also(block)) } }, context)) - } - - private val seenStuff = ObjectArraySet() - - fun dropsSelf(block: Block) { - if (!seenStuff.add(block)) { - throw IllegalStateException("Already seen $block") - } - - block { - it.accept(block.lootTable, singleLootPool { - it.add(LootItem.lootTableItem(block)) - }) + fun singleLootPool(context: LootContextParamSet, id: ResourceLocation, block: LootPool.Builder.() -> Unit) { + builder(context, id) { + withPool(LootPool.lootPool().also(block)) } } fun dropsOther(block: Block, other: ItemLike) { - if (!seenStuff.add(block)) { - throw IllegalStateException("Already seen $block") - } - - block { - it.accept(block.lootTable, singleLootPool { - it.add(LootItem.lootTableItem(other)) - }) + singleLootPool(LootContextParamSets.BLOCK, block.lootTable) { + add(LootItem.lootTableItem(other)) } } fun dropsSelf(vararg blocks: Block) { - blocks.forEach(this::dropsSelf) + for (block in blocks) { + singleLootPool(LootContextParamSets.BLOCK, block.lootTable) { + add(LootItem.lootTableItem(block)) + } + } } fun dropsSelf(blocks: Collection) { @@ -172,17 +174,11 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator) { } fun tile(block: Block, f: (CopyNbtFunction.Builder) -> Unit = {}) { - if (!seenStuff.add(block)) { - throw IllegalStateException("Already seen $block") - } - - block { - it.accept(block.lootTable, singleLootPool { - it.add(LootItem.lootTableItem(block).also { - it.apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY).also { - it.copy("Name", "BlockEntityTag.Name") - f(it) - }) + singleLootPool(LootContextParamSets.BLOCK, block.lootTable) { + add(LootItem.lootTableItem(block).also { + it.apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY).also { + it.copy("Name", "BlockEntityTag.Name") + f(it) }) }) } 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 23d4b3174..ac7e928ec 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 @@ -8,7 +8,7 @@ import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MItems fun addChestLootTables(loot: LootTables) { - loot.provider(LootContextParamSets.CHEST, modLocation("food_box")) { + loot.builder(LootContextParamSets.CHEST, modLocation("food_box")) { lootPool { add(LootItem.lootTableItem(Items.PACKED_ICE).setCount(minimal = 1, maximal = 3)) add(LootItem.lootTableItem(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 f1eaa94a6..c728e0a1d 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 @@ -2,14 +2,10 @@ package ru.dbotthepony.mc.otm.datagen.loot import net.minecraft.advancements.critereon.StatePropertiesPredicate import net.minecraft.data.loot.BlockLoot -import net.minecraft.world.item.DyeColor -import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraft.world.level.block.state.properties.BlockStateProperties import net.minecraft.world.level.block.state.properties.DoubleBlockHalf -import net.minecraft.world.level.storage.loot.LootContext import net.minecraft.world.level.storage.loot.entries.LootItem -import net.minecraft.world.level.storage.loot.entries.LootPoolEntries import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition import ru.dbotthepony.mc.otm.block.entity.ChemicalGeneratorBlockEntity @@ -67,56 +63,56 @@ fun addLootTables(lootTables: LootTables) { lootTables.dropsSelf(MBlocks.TRITANIUM_TRAPDOOR) lootTables.dropsSelf(MRegistry.TRITANIUM_PRESSURE_PLATE.allBlocks.values) - lootTables.blockSimple(MBlocks.PHANTOM_ATTRACTOR) { - it.add(LootItem.lootTableItem(MBlocks.PHANTOM_ATTRACTOR) + lootTables.block(MBlocks.PHANTOM_ATTRACTOR) { + add(LootItem.lootTableItem(MBlocks.PHANTOM_ATTRACTOR) .`when`(LootItemBlockStatePropertyCondition .hasBlockStateProperties(MBlocks.PHANTOM_ATTRACTOR) .setProperties(StatePropertiesPredicate.Builder.properties() .hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER)))) } - lootTables.provider(LootContextParamSets.ADVANCEMENT_ENTITY) { - it.accept(modLocation("research_all_android"), singleLootPool { - it.add(LootItem.lootTableItem(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_HUGE)) - }) + lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("research_all_android")) { + lootPool { + add(LootItem.lootTableItem(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_HUGE)) + } + } - it.accept(modLocation("tritanium_block3"), singleLootPool { - it.add(LootItem.lootTableItem(Items.WHITE_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.ORANGE_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.MAGENTA_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.YELLOW_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.LIME_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.PINK_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.GRAY_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.CYAN_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.PURPLE_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.BLUE_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.BROWN_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.GREEN_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.RED_DYE).setQuality(8)) - it.add(LootItem.lootTableItem(Items.BLACK_DYE).setQuality(8)) - }) + lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("tritanium_block3")) { + lootPool { add(LootItem.lootTableItem(Items.WHITE_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.ORANGE_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.MAGENTA_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.YELLOW_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.LIME_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.PINK_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.GRAY_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.CYAN_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.PURPLE_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.BLUE_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.BROWN_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.GREEN_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.RED_DYE).setCount(8)) } + lootPool { add(LootItem.lootTableItem(Items.BLACK_DYE).setCount(8)) } + } - it.accept(modLocation("tritanium_block4"), singleLootPool { - it.add(LootItem.lootTableItem(Items.WHITE_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.ORANGE_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.MAGENTA_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.YELLOW_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.LIME_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.PINK_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.GRAY_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.CYAN_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.PURPLE_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.BLUE_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.BROWN_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.GREEN_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.RED_DYE).setQuality(64)) - it.add(LootItem.lootTableItem(Items.BLACK_DYE).setQuality(64)) - }) + lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("tritanium_block4")) { + lootPool { add(LootItem.lootTableItem(Items.WHITE_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.ORANGE_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.MAGENTA_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.YELLOW_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.LIME_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.PINK_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.GRAY_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.CYAN_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.PURPLE_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.BLUE_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.BROWN_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.GREEN_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.RED_DYE).setCount(64)) } + lootPool { add(LootItem.lootTableItem(Items.BLACK_DYE).setCount(64)) } } lootTables.tile(MBlocks.ENERGY_SERVO) @@ -156,7 +152,7 @@ fun addLootTables(lootTables: LootTables) { lootTables.poweredTile(MBlocks.MATTER_BOTTLER, TileNbtCopy(MATTER_STORAGE_KEY), TileNbtCopy(MatterBottlerBlockEntity.IS_BOTTLING_KEY)) - lootTables.block { - it.accept(MBlocks.TRITANIUM_DOOR.lootTable, BlockLoot.createDoorTable(MBlocks.TRITANIUM_DOOR)) + lootTables.blockProvider(MBlocks.TRITANIUM_DOOR) { + BlockLoot.createDoorTable(MBlocks.TRITANIUM_DOOR) } }