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
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<LootTableSaver>
private typealias LootTableCallbackProvider = Supplier<LootTableCallback>
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))
}
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 {
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<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> {
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) {}
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<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 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<Block>) {
@ -172,19 +174,13 @@ 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 {
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)
})
})
})
}
}

View File

@ -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))

View File

@ -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)
}
}