Update loot tables api

This commit is contained in:
DBotThePony 2022-10-13 19:54:59 +07:00
parent 78211dce2b
commit 0b3a9221f7
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 99 additions and 107 deletions

View File

@ -1,13 +1,14 @@
package ru.dbotthepony.mc.otm.datagen.loot package ru.dbotthepony.mc.otm.datagen.loot
import com.mojang.datafixers.util.Pair 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.advancements.critereon.StatePropertiesPredicate
import net.minecraft.data.DataGenerator import net.minecraft.data.DataGenerator
import net.minecraft.data.loot.BlockLoot
import net.minecraft.data.loot.LootTableProvider import net.minecraft.data.loot.LootTableProvider
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.util.valueproviders.UniformInt
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.SlabBlock import net.minecraft.world.level.block.SlabBlock
@ -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.LootItem
import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer
import net.minecraft.world.level.storage.loot.functions.CopyNbtFunction import net.minecraft.world.level.storage.loot.functions.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.functions.SetItemCountFunction
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
@ -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 net.minecraft.world.level.storage.loot.providers.number.UniformGenerator
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity 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.BiConsumer
import java.util.function.Consumer import java.util.function.Consumer
import java.util.function.Supplier import java.util.function.Supplier
@ -38,11 +38,11 @@ private typealias LootTableCallback = Consumer<LootTableSaver>
private typealias LootTableCallbackProvider = Supplier<LootTableCallback> private typealias LootTableCallbackProvider = Supplier<LootTableCallback>
private typealias LootTuple = Pair<LootTableCallbackProvider, LootContextParamSet> private typealias LootTuple = Pair<LootTableCallbackProvider, LootContextParamSet>
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)) 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 : LootPoolSingletonContainer.Builder<*>> T.setCount(count: Int): T { fun <T : LootPoolSingletonContainer.Builder<*>> T.setCount(count: Int): T {
apply(SetItemCountFunction.setCount(ConstantValue.exactly(count.toFloat()))) apply(SetItemCountFunction.setCount(ConstantValue.exactly(count.toFloat())))
@ -88,21 +88,37 @@ private val poweredMatterWorker = arrayOf(
) )
class LootTables(generator: DataGenerator) : LootTableProvider(generator) { class LootTables(generator: DataGenerator) : LootTableProvider(generator) {
private val providers = LinkedList<LootTuple>() private val providersTable = Reference2ObjectArrayMap<LootContextParamSet, Object2ObjectArrayMap<ResourceLocation, () -> 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<LootTuple> { override fun getTables(): List<LootTuple> {
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<ResourceLocation, LootTable>, validationtracker: ValidationContext) {} override fun validate(map: MutableMap<ResourceLocation, LootTable>, validationtracker: ValidationContext) {}
fun block(provider: LootTableCallback) {
providers.add(Pair(Supplier { provider }, LootContextParamSets.BLOCK))
}
fun createSlabItemTable(block: Block) { fun createSlabItemTable(block: Block) {
provider(LootContextParamSets.BLOCK) { builder(LootContextParamSets.BLOCK, block.lootTable) {
it.accept(block.lootTable, LootTable.lootTable().withPool( withPool(
LootPool.lootPool().setRolls(ConstantValue.exactly(1.0f)).add( LootPool.lootPool().setRolls(ConstantValue.exactly(1.0f)).add(
LootItem.lootTableItem(block).apply( LootItem.lootTableItem(block).apply(
SetItemCountFunction.setCount( 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) block.forEach(this::createSlabItemTable)
} }
fun blockSimple(block: Block, provider: (LootPool.Builder) -> Unit) { fun blockProvider(block: Block, provider: () -> LootTable.Builder) {
block { provider(LootContextParamSets.BLOCK, block.registryName!!, provider)
it.accept(block.lootTable, singleLootPool(provider::invoke)) }
fun block(block: Block, provider: LootPool.Builder.() -> Unit) {
builder(LootContextParamSets.BLOCK, block.registryName!!) {
lootPool(provider)
} }
} }
fun provider(context: LootContextParamSet, provider: LootTableCallback) { fun singleLootPool(context: LootContextParamSet, id: ResourceLocation, block: LootPool.Builder.() -> Unit) {
providers.add(Pair(Supplier { provider }, context)) builder(context, id) {
} withPool(LootPool.lootPool().also(block))
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<Any>()
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 dropsOther(block: Block, other: ItemLike) { fun dropsOther(block: Block, other: ItemLike) {
if (!seenStuff.add(block)) { singleLootPool(LootContextParamSets.BLOCK, block.lootTable) {
throw IllegalStateException("Already seen $block") add(LootItem.lootTableItem(other))
}
block {
it.accept(block.lootTable, singleLootPool {
it.add(LootItem.lootTableItem(other))
})
} }
} }
fun dropsSelf(vararg blocks: Block) { 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<Block>) { fun dropsSelf(blocks: Collection<Block>) {
@ -172,17 +174,11 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator) {
} }
fun tile(block: Block, f: (CopyNbtFunction.Builder) -> Unit = {}) { fun tile(block: Block, f: (CopyNbtFunction.Builder) -> Unit = {}) {
if (!seenStuff.add(block)) { singleLootPool(LootContextParamSets.BLOCK, block.lootTable) {
throw IllegalStateException("Already seen $block") add(LootItem.lootTableItem(block).also {
} it.apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY).also {
it.copy("Name", "BlockEntityTag.Name")
block { f(it)
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)
})
}) })
}) })
} }

View File

@ -8,7 +8,7 @@ import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
fun addChestLootTables(loot: LootTables) { fun addChestLootTables(loot: LootTables) {
loot.provider(LootContextParamSets.CHEST, modLocation("food_box")) { loot.builder(LootContextParamSets.CHEST, modLocation("food_box")) {
lootPool { lootPool {
add(LootItem.lootTableItem(Items.PACKED_ICE).setCount(minimal = 1, maximal = 3)) add(LootItem.lootTableItem(Items.PACKED_ICE).setCount(minimal = 1, maximal = 3))
add(LootItem.lootTableItem(MItems.NUTRIENT_PASTE).setCount(minimal = 1, maximal = 2)) add(LootItem.lootTableItem(MItems.NUTRIENT_PASTE).setCount(minimal = 1, maximal = 2))

View File

@ -2,14 +2,10 @@ package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.advancements.critereon.StatePropertiesPredicate import net.minecraft.advancements.critereon.StatePropertiesPredicate
import net.minecraft.data.loot.BlockLoot 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.item.Items
import net.minecraft.world.level.block.state.properties.BlockStateProperties import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
import net.minecraft.world.level.storage.loot.LootContext
import net.minecraft.world.level.storage.loot.entries.LootItem import net.minecraft.world.level.storage.loot.entries.LootItem
import net.minecraft.world.level.storage.loot.entries.LootPoolEntries
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition
import ru.dbotthepony.mc.otm.block.entity.ChemicalGeneratorBlockEntity import ru.dbotthepony.mc.otm.block.entity.ChemicalGeneratorBlockEntity
@ -67,56 +63,56 @@ fun addLootTables(lootTables: LootTables) {
lootTables.dropsSelf(MBlocks.TRITANIUM_TRAPDOOR) lootTables.dropsSelf(MBlocks.TRITANIUM_TRAPDOOR)
lootTables.dropsSelf(MRegistry.TRITANIUM_PRESSURE_PLATE.allBlocks.values) lootTables.dropsSelf(MRegistry.TRITANIUM_PRESSURE_PLATE.allBlocks.values)
lootTables.blockSimple(MBlocks.PHANTOM_ATTRACTOR) { lootTables.block(MBlocks.PHANTOM_ATTRACTOR) {
it.add(LootItem.lootTableItem(MBlocks.PHANTOM_ATTRACTOR) add(LootItem.lootTableItem(MBlocks.PHANTOM_ATTRACTOR)
.`when`(LootItemBlockStatePropertyCondition .`when`(LootItemBlockStatePropertyCondition
.hasBlockStateProperties(MBlocks.PHANTOM_ATTRACTOR) .hasBlockStateProperties(MBlocks.PHANTOM_ATTRACTOR)
.setProperties(StatePropertiesPredicate.Builder.properties() .setProperties(StatePropertiesPredicate.Builder.properties()
.hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER)))) .hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER))))
} }
lootTables.provider(LootContextParamSets.ADVANCEMENT_ENTITY) { lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("research_all_android")) {
it.accept(modLocation("research_all_android"), singleLootPool { lootPool {
it.add(LootItem.lootTableItem(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_HUGE)) add(LootItem.lootTableItem(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_HUGE))
}) }
}
it.accept(modLocation("tritanium_block3"), singleLootPool { lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("tritanium_block3")) {
it.add(LootItem.lootTableItem(Items.WHITE_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.WHITE_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.ORANGE_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.ORANGE_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.MAGENTA_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.MAGENTA_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.YELLOW_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.YELLOW_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.LIME_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.LIME_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.PINK_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.PINK_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.GRAY_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.GRAY_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.CYAN_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.CYAN_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.PURPLE_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.PURPLE_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.BLUE_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.BLUE_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.BROWN_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.BROWN_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.GREEN_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.GREEN_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.RED_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.RED_DYE).setCount(8)) }
it.add(LootItem.lootTableItem(Items.BLACK_DYE).setQuality(8)) lootPool { add(LootItem.lootTableItem(Items.BLACK_DYE).setCount(8)) }
}) }
it.accept(modLocation("tritanium_block4"), singleLootPool { lootTables.builder(LootContextParamSets.ADVANCEMENT_ENTITY, modLocation("tritanium_block4")) {
it.add(LootItem.lootTableItem(Items.WHITE_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.WHITE_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.ORANGE_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.ORANGE_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.MAGENTA_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.MAGENTA_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.YELLOW_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.YELLOW_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.LIME_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.LIME_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.PINK_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.PINK_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.GRAY_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.GRAY_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.CYAN_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.CYAN_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.PURPLE_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.PURPLE_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.BLUE_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.BLUE_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.BROWN_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.BROWN_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.GREEN_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.GREEN_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.RED_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.RED_DYE).setCount(64)) }
it.add(LootItem.lootTableItem(Items.BLACK_DYE).setQuality(64)) lootPool { add(LootItem.lootTableItem(Items.BLACK_DYE).setCount(64)) }
})
} }
lootTables.tile(MBlocks.ENERGY_SERVO) lootTables.tile(MBlocks.ENERGY_SERVO)
@ -156,7 +152,7 @@ fun addLootTables(lootTables: LootTables) {
lootTables.poweredTile(MBlocks.MATTER_BOTTLER, lootTables.poweredTile(MBlocks.MATTER_BOTTLER,
TileNbtCopy(MATTER_STORAGE_KEY), TileNbtCopy(MatterBottlerBlockEntity.IS_BOTTLING_KEY)) TileNbtCopy(MATTER_STORAGE_KEY), TileNbtCopy(MatterBottlerBlockEntity.IS_BOTTLING_KEY))
lootTables.block { lootTables.blockProvider(MBlocks.TRITANIUM_DOOR) {
it.accept(MBlocks.TRITANIUM_DOOR.lootTable, BlockLoot.createDoorTable(MBlocks.TRITANIUM_DOOR)) BlockLoot.createDoorTable(MBlocks.TRITANIUM_DOOR)
} }
} }