Update loot tables api
This commit is contained in:
parent
78211dce2b
commit
0b3a9221f7
@ -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)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user