Combine blockstate providers

This commit is contained in:
DBotThePony 2022-01-08 20:11:21 +07:00
parent 26df2ea5b2
commit 0c20bce816
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 94 additions and 107 deletions

View File

@ -24,9 +24,8 @@ object DataGen {
const val MOD_ID = OverdriveThatMatters.MOD_ID const val MOD_ID = OverdriveThatMatters.MOD_ID
private lateinit var blockModelProvider: BlockMatteryModelProvider private lateinit var blockModelProvider: BlockMatteryModelProvider
private lateinit var blockStateProvider: SimpleBlockStateProvider
private lateinit var itemModelProvider: SimpleItemModelProvider private lateinit var itemModelProvider: SimpleItemModelProvider
private lateinit var advancedBlockStateProvider: AdvancedBlockStateProvider private lateinit var blockStateProvider: MatteryBlockStateProvider
private lateinit var lootTableProvider: MatteryLootTableProvider private lateinit var lootTableProvider: MatteryLootTableProvider
private fun decorativeCubeAll(vararg blocks: Block) { private fun decorativeCubeAll(vararg blocks: Block) {
@ -49,15 +48,14 @@ object DataGen {
@Suppress("unused") @Suppress("unused")
fun onGatherData(event: GatherDataEvent) { fun onGatherData(event: GatherDataEvent) {
blockModelProvider = BlockMatteryModelProvider(event) blockModelProvider = BlockMatteryModelProvider(event)
blockStateProvider = SimpleBlockStateProvider(event) blockStateProvider = MatteryBlockStateProvider(event)
itemModelProvider = SimpleItemModelProvider(event) itemModelProvider = SimpleItemModelProvider(event)
advancedBlockStateProvider = AdvancedBlockStateProvider(event)
lootTableProvider = MatteryLootTableProvider(event.generator) lootTableProvider = MatteryLootTableProvider(event.generator)
event.generator.addProvider(blockModelProvider) event.generator.addProvider(blockModelProvider)
event.generator.addProvider(itemModelProvider) event.generator.addProvider(itemModelProvider)
event.generator.addProvider(blockStateProvider) event.generator.addProvider(blockStateProvider)
event.generator.addProvider(advancedBlockStateProvider) event.generator.addProvider(blockStateProvider)
decorativeCubeAll(*Blocks.CRATES) decorativeCubeAll(*Blocks.CRATES)
decorativeCubeAll(Blocks.CARBON_FIBRE_BLOCK) decorativeCubeAll(Blocks.CARBON_FIBRE_BLOCK)
@ -110,7 +108,7 @@ object DataGen {
event.generator.addProvider(lootTableProvider) event.generator.addProvider(lootTableProvider)
with(advancedBlockStateProvider) { with(blockStateProvider) {
block(Blocks.CHEMICAL_GENERATOR) block(Blocks.CHEMICAL_GENERATOR)
block(Blocks.MATTER_SCANNER) block(Blocks.MATTER_SCANNER)
block(Blocks.ITEM_MONITOR) block(Blocks.ITEM_MONITOR)
@ -160,12 +158,11 @@ object DataGen {
block(Items.MATTER_DECOMPOSER, "matter_decomposer_working") block(Items.MATTER_DECOMPOSER, "matter_decomposer_working")
} }
event.generator.addProvider(object : BlockStateProvider(event.generator, MOD_ID, event.existingFileHelper) { blockStateProvider.lambda {
override fun registerStatesAndModels() { with(it.getMultipartBuilder(Blocks.DRIVE_VIEWER)) {
with(getMultipartBuilder(Blocks.DRIVE_VIEWER)) {
for (facing in BlockMatteryRotatable.FACING.possibleValues) { for (facing in BlockMatteryRotatable.FACING.possibleValues) {
part() part()
.modelFile(models().getExistingFile(ResourceLocation(MOD_ID, "block/drive_viewer_drive_part"))) .modelFile(it.models().getExistingFile(ResourceLocation(MOD_ID, "block/drive_viewer_drive_part")))
.rotationY(facing.toYRotBlockstate()) .rotationY(facing.toYRotBlockstate())
.addModel() .addModel()
.condition(BlockMatteryRotatable.FACING, facing) .condition(BlockMatteryRotatable.FACING, facing)
@ -173,7 +170,7 @@ object DataGen {
for (workState in WorkerState.SEMI_WORKER_STATE.possibleValues) { for (workState in WorkerState.SEMI_WORKER_STATE.possibleValues) {
part() part()
.modelFile(models().getExistingFile(ResourceLocation(MOD_ID, "block/drive_viewer_${workState.name.lowercase()}"))) .modelFile(it.models().getExistingFile(ResourceLocation(MOD_ID, "block/drive_viewer_${workState.name.lowercase()}")))
.rotationY(facing.toYRotBlockstate()) .rotationY(facing.toYRotBlockstate())
.addModel() .addModel()
.condition(WorkerState.SEMI_WORKER_STATE, workState) .condition(WorkerState.SEMI_WORKER_STATE, workState)
@ -182,11 +179,11 @@ object DataGen {
} }
} }
with(getMultipartBuilder(Blocks.PATTERN_STORAGE)) { with(it.getMultipartBuilder(Blocks.PATTERN_STORAGE)) {
for (facing in BlockMatteryRotatable.FACING.possibleValues) { for (facing in BlockMatteryRotatable.FACING.possibleValues) {
for (i in 0 .. 7) { for (i in 0 .. 7) {
part() part()
.modelFile(models().getExistingFile(ResourceLocation(MOD_ID, "block/pattern/model$i"))) .modelFile(it.models().getExistingFile(ResourceLocation(MOD_ID, "block/pattern/model$i")))
.rotationY(facing.toYRotBlockstate()) .rotationY(facing.toYRotBlockstate())
.addModel() .addModel()
.condition(BlockMatteryRotatable.FACING, facing) .condition(BlockMatteryRotatable.FACING, facing)
@ -194,14 +191,13 @@ object DataGen {
} }
part() part()
.modelFile(models().getExistingFile(ResourceLocation(MOD_ID, "block/pattern_storage"))) .modelFile(it.models().getExistingFile(ResourceLocation(MOD_ID, "block/pattern_storage")))
.rotationY(facing.toYRotBlockstate()) .rotationY(facing.toYRotBlockstate())
.addModel() .addModel()
.condition(BlockMatteryRotatable.FACING, facing) .condition(BlockMatteryRotatable.FACING, facing)
} }
} }
} }
})
val workerTags = arrayOf( val workerTags = arrayOf(
TileNbtCopy("work_ticks"), TileNbtCopy("work_ticks"),

View File

@ -1,8 +1,8 @@
package ru.dbotthepony.mc.otm.datagen.blocks package ru.dbotthepony.mc.otm.datagen.blocks
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.properties.Property
import net.minecraftforge.client.model.generators.BlockStateProvider import net.minecraftforge.client.model.generators.BlockStateProvider
import net.minecraftforge.client.model.generators.ConfiguredModel import net.minecraftforge.client.model.generators.ConfiguredModel
import net.minecraftforge.forge.event.lifecycle.GatherDataEvent import net.minecraftforge.forge.event.lifecycle.GatherDataEvent
@ -14,11 +14,7 @@ import ru.dbotthepony.mc.otm.datagen.getValueNullable
import ru.dbotthepony.mc.otm.datagen.toYRotBlockstate import ru.dbotthepony.mc.otm.datagen.toYRotBlockstate
typealias AdvancedBlockStateFunction = (BlockState, ConfiguredModel.Builder<*>, String) -> String? typealias AdvancedBlockStateFunction = (BlockState, ConfiguredModel.Builder<*>, String) -> String?
//typealias AdvancedBlockStateBoolFunction = (BlockState, ConfiguredModel.Builder<*>) -> String
private data class AdvancedBlockStateEntry(val block: BlockMattery, val func: AdvancedBlockStateFunction) private data class AdvancedBlockStateEntry(val block: BlockMattery, val func: AdvancedBlockStateFunction)
//data class BooleanPropertyMapping(val property: Property<Boolean>, val func: AdvancedBlockStateBoolFunction)
//private data class AdvancedBlockStateBooleanMapped(val block: BlockMattery, val mapping: Array<out BooleanPropertyMapping>)
private fun initialTransform(it: BlockState, modelPath: String, builder: ConfiguredModel.Builder<*>): String { private fun initialTransform(it: BlockState, modelPath: String, builder: ConfiguredModel.Builder<*>): String {
var modelPath = modelPath var modelPath = modelPath
@ -38,18 +34,65 @@ private fun initialTransform(it: BlockState, modelPath: String, builder: Configu
return modelPath return modelPath
} }
class AdvancedBlockStateProvider(event: GatherDataEvent) : BlockStateProvider(event.generator, DataGen.MOD_ID, event.existingFileHelper) { private typealias Lambda = (MatteryBlockStateProvider) -> Unit
class MatteryBlockStateProvider(event: GatherDataEvent) : BlockStateProvider(event.generator, DataGen.MOD_ID, event.existingFileHelper) {
private val blocks = ArrayList<AdvancedBlockStateEntry>() private val blocks = ArrayList<AdvancedBlockStateEntry>()
//private val boolMapped = ArrayList<AdvancedBlockStateBooleanMapped>()
fun block(block: BlockMattery) = blocks.add(AdvancedBlockStateEntry(block) { _, _, _ -> null }) fun block(block: BlockMattery) = blocks.add(AdvancedBlockStateEntry(block) { _, _, _ -> null })
fun block(block: BlockMattery, func: AdvancedBlockStateFunction) = blocks.add(AdvancedBlockStateEntry(block, func)) fun block(block: BlockMattery, func: AdvancedBlockStateFunction) = blocks.add(AdvancedBlockStateEntry(block, func))
//fun multipartBoolBlock(block: BlockMattery, vararg props: BooleanPropertyMapping) { private val simpleBlocks = ArrayList<Block>()
// boolMapped.add(AdvancedBlockStateBooleanMapped(block, props)) private val ores = ArrayList<Block>()
//} private val lambdas = ArrayList<Lambda>()
fun block(vararg blocks: Block) {
this.simpleBlocks.addAll(blocks)
}
fun ore(vararg blocks: Block) {
ores.addAll(blocks)
}
fun lambda(lambda: Lambda) {
lambdas.add(lambda)
}
override fun registerStatesAndModels() { override fun registerStatesAndModels() {
for (block in simpleBlocks) {
getVariantBuilder(block).forAllStates {
check(block.registryName != null) {"$block registry name is null!"}
return@forAllStates arrayOf(ConfiguredModel(models().getExistingFile(block.registryName)))
}
}
for (block in ores) {
var first = true
getVariantBuilder(block).forAllStates {
check(first) {"$block has more than one BlockState"}
first = false
check(block.registryName != null) {"$block registry name is null!"}
val localModel = models().getExistingFile(block.registryName)
val generated = ArrayList<ConfiguredModel>()
for (x in arrayOf(0, 90, 180)) {
for (y in arrayOf(0, 90, 180, 270)) {
generated.add(with(ConfiguredModel.builder()) {
rotationX(x)
rotationY(y)
modelFile(localModel)
return@with buildLast()
})
}
}
return@forAllStates generated.toTypedArray()
}
}
for ((block, func) in blocks) { for ((block, func) in blocks) {
getVariantBuilder(block).forAllStates { getVariantBuilder(block).forAllStates {
val builder = ConfiguredModel.builder() val builder = ConfiguredModel.builder()
@ -61,5 +104,9 @@ class AdvancedBlockStateProvider(event: GatherDataEvent) : BlockStateProvider(ev
return@forAllStates arrayOf(builder.buildLast()) return@forAllStates arrayOf(builder.buildLast())
} }
} }
for (lambda in lambdas) {
lambda(this)
}
} }
} }

View File

@ -1,56 +0,0 @@
package ru.dbotthepony.mc.otm.datagen.blocks
import net.minecraft.world.level.block.Block
import net.minecraftforge.client.model.generators.BlockStateProvider
import net.minecraftforge.client.model.generators.ConfiguredModel
import net.minecraftforge.forge.event.lifecycle.GatherDataEvent
import ru.dbotthepony.mc.otm.datagen.DataGen
class SimpleBlockStateProvider(event: GatherDataEvent) : BlockStateProvider(event.generator, DataGen.MOD_ID, event.existingFileHelper) {
private val blocks = ArrayList<Block>()
private val ores = ArrayList<Block>()
fun block(vararg blocks: Block) {
this.blocks.addAll(blocks)
}
fun ore(vararg blocks: Block) {
ores.addAll(blocks)
}
override fun registerStatesAndModels() {
for (block in blocks) {
getVariantBuilder(block).forAllStates {
check(block.registryName != null) {"$block registry name is null!"}
return@forAllStates arrayOf(ConfiguredModel(models().getExistingFile(block.registryName)))
}
}
for (block in ores) {
var first = true
getVariantBuilder(block).forAllStates {
check(first) {"$block has more than one BlockState"}
first = false
check(block.registryName != null) {"$block registry name is null!"}
val localModel = models().getExistingFile(block.registryName)
val generated = ArrayList<ConfiguredModel>()
for (x in arrayOf(0, 90, 180)) {
for (y in arrayOf(0, 90, 180, 270)) {
generated.add(with(ConfiguredModel.builder()) {
rotationX(x)
rotationY(y)
modelFile(localModel)
return@with buildLast()
})
}
}
return@forAllStates generated.toTypedArray()
}
}
}
}