From f319bd9287c45af466c7a7d03c51aa7d9b9ec44f Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 27 Oct 2022 14:22:13 +0700 Subject: [PATCH] Split kotlin dsl extensions from loottables file --- .../ru/dbotthepony/mc/otm/datagen/loot/DSL.kt | 91 +++++++++++++++++++ .../mc/otm/datagen/loot/LootTables.kt | 74 --------------- 2 files changed, 91 insertions(+), 74 deletions(-) create mode 100644 src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DSL.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DSL.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DSL.kt new file mode 100644 index 000000000..a1877e520 --- /dev/null +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DSL.kt @@ -0,0 +1,91 @@ +package ru.dbotthepony.mc.otm.datagen.loot + +import net.minecraft.advancements.critereon.StatePropertiesPredicate +import net.minecraft.util.StringRepresentable +import net.minecraft.world.level.ItemLike +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.state.properties.Property +import net.minecraft.world.level.storage.loot.LootPool +import net.minecraft.world.level.storage.loot.LootTable +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.LootItemConditionalFunction +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction +import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition +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.data.condition.ChanceCondition + +inline fun LootTable.Builder.lootPool(configurator: LootPool.Builder.() -> Unit): LootTable.Builder = withPool( + LootPool.lootPool().also(configurator)) +inline fun lootPool(configurator: LootPool.Builder.() -> Unit): LootPool.Builder = LootPool.lootPool().also(configurator) +inline fun LootPool.Builder.item(item: ItemLike, configurator: LootPoolSingletonContainer.Builder<*>.() -> Unit) { + add(LootItem.lootTableItem(item).also(configurator)) +} + +fun LootPool.Builder.setRolls(count: Int): LootPool.Builder = setRolls(ConstantValue.exactly(count.toFloat())) +fun LootPool.Builder.setRolls(count: Float): LootPool.Builder = setRolls(ConstantValue.exactly(count)) +fun LootPool.Builder.setRolls(min: Int, max: Int): LootPool.Builder = setRolls( + UniformGenerator.between( + min.toFloat(), + max.toFloat() + ) +) +fun LootPool.Builder.setRolls(min: Float, max: Float): LootPool.Builder = setRolls(UniformGenerator.between(min, max)) +fun LootPool.Builder.condition(value: LootItemCondition.Builder): LootPool.Builder = `when`(value) +fun LootPool.Builder.chanceCondition(chance: Double): LootPool.Builder = condition(ChanceCondition(chance)) +fun > T.setCount(count: Int, configurator: LootItemConditionalFunction.Builder<*>.() -> Unit = {}): T { + apply(SetItemCountFunction.setCount(ConstantValue.exactly(count.toFloat())).also(configurator)) + return this +} + +fun > T.setCount(minimal: Int, maximal: Int, configurator: LootItemConditionalFunction.Builder<*>.() -> Unit = {}): T { + apply(SetItemCountFunction.setCount(UniformGenerator.between(minimal.toFloat(), maximal.toFloat())).also(configurator)) + return this +} + +fun > T.setCount(minimal: Float, maximal: Float, configurator: LootItemConditionalFunction.Builder<*>.() -> Unit = {}): T { + apply(SetItemCountFunction.setCount(UniformGenerator.between(minimal, maximal)).also(configurator)) + return this +} + +fun > T.condition(condition: LootItemCondition.Builder): T { + `when`(condition) + return this +} + +fun > T.condition(condition: LootItemCondition.Builder): T { + `when`(condition) + return this +} + +inline fun > T.blockStateCondition(block: Block, configurator: StatePropertiesPredicate.Builder.() -> Unit): T { + condition( + LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties().also(configurator))) + return this +} + +inline fun > T.blockStateCondition(block: Block, configurator: StatePropertiesPredicate.Builder.() -> Unit): T { + condition( + LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties().also(configurator))) + return this +} + +fun > T.chanceCondition(chance: Double): T { + condition(ChanceCondition(chance)) + return this +} + +operator fun StatePropertiesPredicate.Builder.set(property: Property<*>, value: String): StatePropertiesPredicate.Builder = hasProperty(property, value) +operator fun StatePropertiesPredicate.Builder.set(property: Property, value: Int): StatePropertiesPredicate.Builder = hasProperty(property, value) +operator fun StatePropertiesPredicate.Builder.set(property: Property, value: Boolean): StatePropertiesPredicate.Builder = hasProperty(property, value) +operator fun > StatePropertiesPredicate.Builder.set(property: Property, value: T): StatePropertiesPredicate.Builder { + if (value !is StringRepresentable) { + throw ClassCastException("Provided type ${value::class.qualifiedName} is not a subtype of ${StringRepresentable::class.qualifiedName}") + } + + return hasProperty(property, value.serializedName) +} 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 9802d961f..a88abc8cb 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 @@ -10,30 +10,23 @@ import net.minecraft.advancements.critereon.StatePropertiesPredicate import net.minecraft.data.DataGenerator import net.minecraft.data.loot.LootTableProvider import net.minecraft.resources.ResourceLocation -import net.minecraft.util.StringRepresentable import net.minecraft.world.level.ItemLike import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.SlabBlock -import net.minecraft.world.level.block.state.properties.Property import net.minecraft.world.level.block.state.properties.SlabType import net.minecraft.world.level.storage.loot.LootPool 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.LootItemConditionalFunction 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.predicates.LootItemCondition import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider 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 ru.dbotthepony.mc.otm.data.condition.ChanceCondition import java.util.function.BiConsumer import java.util.function.Consumer import java.util.function.Supplier @@ -43,73 +36,6 @@ private typealias LootTableCallback = Consumer private typealias LootTableCallbackProvider = Supplier private typealias LootTuple = Pair -inline fun LootTable.Builder.lootPool(configurator: LootPool.Builder.() -> Unit): LootTable.Builder = withPool(LootPool.lootPool().also(configurator)) -inline fun lootPool(configurator: LootPool.Builder.() -> Unit): LootPool.Builder = LootPool.lootPool().also(configurator) - -inline fun LootPool.Builder.item(item: ItemLike, configurator: LootPoolSingletonContainer.Builder<*>.() -> Unit) { - add(LootItem.lootTableItem(item).also(configurator)) -} - -fun LootPool.Builder.setRolls(count: Int): LootPool.Builder = setRolls(ConstantValue.exactly(count.toFloat())) -fun LootPool.Builder.setRolls(count: Float): LootPool.Builder = setRolls(ConstantValue.exactly(count)) - -fun LootPool.Builder.setRolls(min: Int, max: Int): LootPool.Builder = setRolls(UniformGenerator.between(min.toFloat(), max.toFloat())) -fun LootPool.Builder.setRolls(min: Float, max: Float): LootPool.Builder = setRolls(UniformGenerator.between(min, max)) - -fun LootPool.Builder.condition(value: LootItemCondition.Builder): LootPool.Builder = `when`(value) -fun LootPool.Builder.chanceCondition(chance: Double): LootPool.Builder = condition(ChanceCondition(chance)) - -fun > T.setCount(count: Int, configurator: LootItemConditionalFunction.Builder<*>.() -> Unit = {}): T { - apply(SetItemCountFunction.setCount(ConstantValue.exactly(count.toFloat())).also(configurator)) - return this -} - -fun > T.setCount(minimal: Int, maximal: Int, configurator: LootItemConditionalFunction.Builder<*>.() -> Unit = {}): T { - apply(SetItemCountFunction.setCount(UniformGenerator.between(minimal.toFloat(), maximal.toFloat())).also(configurator)) - return this -} - -fun > T.setCount(minimal: Float, maximal: Float, configurator: LootItemConditionalFunction.Builder<*>.() -> Unit = {}): T { - apply(SetItemCountFunction.setCount(UniformGenerator.between(minimal, maximal)).also(configurator)) - return this -} - -fun > T.condition(condition: LootItemCondition.Builder): T { - `when`(condition) - return this -} - -fun > T.condition(condition: LootItemCondition.Builder): T { - `when`(condition) - return this -} - -inline fun > T.blockStateCondition(block: Block, configurator: StatePropertiesPredicate.Builder.() -> Unit): T { - condition(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block).setProperties(StatePropertiesPredicate.Builder.properties().also(configurator))) - return this -} - -inline fun > T.blockStateCondition(block: Block, configurator: StatePropertiesPredicate.Builder.() -> Unit): T { - condition(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block).setProperties(StatePropertiesPredicate.Builder.properties().also(configurator))) - return this -} - -fun > T.chanceCondition(chance: Double): T { - condition(ChanceCondition(chance)) - return this -} - -operator fun StatePropertiesPredicate.Builder.set(property: Property<*>, value: String): StatePropertiesPredicate.Builder = hasProperty(property, value) -operator fun StatePropertiesPredicate.Builder.set(property: Property, value: Int): StatePropertiesPredicate.Builder = hasProperty(property, value) -operator fun StatePropertiesPredicate.Builder.set(property: Property, value: Boolean): StatePropertiesPredicate.Builder = hasProperty(property, value) -operator fun > StatePropertiesPredicate.Builder.set(property: Property, value: T): StatePropertiesPredicate.Builder { - if (value !is StringRepresentable) { - throw ClassCastException("Provided type ${value::class.qualifiedName} is not a subtype of ${StringRepresentable::class.qualifiedName}") - } - - return hasProperty(property, value.serializedName) -} - data class NbtCopy(val source: String, val destination: String, val strategy: CopyNbtFunction.MergeStrategy = CopyNbtFunction.MergeStrategy.REPLACE) fun TileNbtCopy(source: String, strategy: CopyNbtFunction.MergeStrategy = CopyNbtFunction.MergeStrategy.REPLACE): NbtCopy {