From 25630a7924ae19b018e430083d4ab250a08c5ad7 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 30 Jan 2023 15:36:25 +0700 Subject: [PATCH] Actual block rotation enum impl, with left/right and front/back --- .../mc/otm/datagen/DecorativeData.kt | 9 +- .../ru/dbotthepony/mc/otm/datagen/Ext.kt | 7 +- .../mc/otm/datagen/blocks/Banks.kt | 5 +- .../mc/otm/datagen/blocks/BlockStates.kt | 41 +++-- .../otm/datagen/blocks/ComplexBlockStates.kt | 9 +- .../blocks/MatteryBlockStateProvider.kt | 11 +- .../dbotthepony/mc/otm/block/MatteryBlock.kt | 2 +- .../mc/otm/block/RotatableMatteryBlock.kt | 8 +- .../mc/otm/block/decorative/EngineBlock.kt | 2 +- .../mc/otm/block/decorative/HoloSignBlock.kt | 2 +- .../entity/storage/StorageBusBlockEntity.kt | 4 +- .../block/entity/storage/StorageInterfaces.kt | 7 +- .../mc/otm/block/matter/MatterPanelBlock.kt | 6 +- .../block/tech/GravitationStabilizerBlock.kt | 2 +- .../mc/otm/core/math/BlockRotation.kt | 141 ++++++++---------- .../mc/otm/core/math/BlockRotationFreedom.kt | 56 ++++++- .../mc/otm/core/math/EuclidMath.kt | 2 +- 17 files changed, 170 insertions(+), 144 deletions(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt index fe4d252be..30a5aee55 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt @@ -9,7 +9,6 @@ import net.minecraftforge.client.model.generators.BlockModelBuilder import net.minecraftforge.client.model.generators.ConfiguredModel import net.minecraftforge.client.model.generators.ModelFile import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.registryName @@ -217,16 +216,16 @@ fun addDecorativeData(blockStateProvider: MatteryBlockStateProvider, itemModelPr blockStateProvider.getVariantBuilder(MBlocks.LABORATORY_LAMP).forAllStates { return@forAllStates ConfiguredModel.builder() .modelFile(if (it[BlockStateProperties.LIT]) labLampOn!! else labLampOff!!) - .rotationX(it[BlockRotationFreedom.TWO.property].primary.toXRotBlockstate()) - .rotationY(it[BlockRotationFreedom.TWO.property].primary.toYRotBlockstate()) + .rotationX(it[BlockRotationFreedom.TWO.property].front.toXRotBlockstate()) + .rotationY(it[BlockRotationFreedom.TWO.property].front.toYRotBlockstate()) .build() } blockStateProvider.getVariantBuilder(MBlocks.LABORATORY_LAMP_INVERTED).forAllStates { return@forAllStates ConfiguredModel.builder() .modelFile(if (it[BlockStateProperties.LIT]) labLampOn!! else labLampOff!!) - .rotationX(it[BlockRotationFreedom.TWO.property].primary.toXRotBlockstate()) - .rotationY(it[BlockRotationFreedom.TWO.property].primary.toYRotBlockstate()) + .rotationX(it[BlockRotationFreedom.TWO.property].front.toXRotBlockstate()) + .rotationY(it[BlockRotationFreedom.TWO.property].front.toYRotBlockstate()) .build() } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/Ext.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/Ext.kt index 4878ae37e..d4f102c3f 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/Ext.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/Ext.kt @@ -6,9 +6,7 @@ import net.minecraft.world.level.block.state.properties.Property fun Direction.toYRotBlockstate(): Int { return when (this) { - Direction.DOWN -> 0 - Direction.UP -> 0 - Direction.NORTH -> 0 + Direction.DOWN, Direction.UP, Direction.NORTH -> 0 Direction.SOUTH -> 180 Direction.WEST -> -90 Direction.EAST -> 90 @@ -17,8 +15,7 @@ fun Direction.toYRotBlockstate(): Int { fun Direction.toYRotBlockstateInv(): Int { return when (this) { - Direction.DOWN -> 0 - Direction.UP -> 0 + Direction.DOWN, Direction.UP -> 0 Direction.NORTH -> 180 Direction.SOUTH -> 0 Direction.WEST -> 90 diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt index 8fe6a9ede..5e145d39b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/Banks.kt @@ -5,7 +5,6 @@ import net.minecraft.world.level.block.Block import net.minecraftforge.client.model.generators.BlockStateProvider import net.minecraftforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.block.tech.BatteryBankBlock -import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.toYRotBlockstate @@ -28,13 +27,13 @@ open class BatteryBankProvider(event: GatherDataEvent) : BlockStateProvider(even val battery_bank = models().getExistingFile(ResourceLocation("overdrive_that_matters:block/$block")) BlockRotationFreedom.ONE.possibleValues.forEach { - part().modelFile(battery_bank).rotationY(it.primary.toYRotBlockstate()).addModel().condition( + part().modelFile(battery_bank).rotationY(it.front.toYRotBlockstate()).addModel().condition( BlockRotationFreedom.ONE.property, it) for (i in 0 .. 11) { part().modelFile( models().getExistingFile(ResourceLocation("overdrive_that_matters:$batteryPath$i")) - ).rotationY(it.primary.toYRotBlockstate()).addModel() + ).rotationY(it.front.toYRotBlockstate()).addModel() .condition(BlockRotationFreedom.ONE.property, it) .condition(BatteryBankBlock.BATTERY_SLOTS_PROPS[i], true) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt index e83b8671b..10ce4ef91 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt @@ -7,7 +7,6 @@ import net.minecraftforge.client.model.generators.ConfiguredModel import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.block.CableBlock import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock -import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom @@ -39,7 +38,7 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { with(provider.getMultipartBuilder(MBlocks.PHANTOM_ATTRACTOR)) { for (dir in BlockRotationFreedom.ONE.possibleValues) { part().modelFile(provider.models().getExistingFile(modLocation("block/${MNames.PHANTOM_ATTRACTOR}"))) - .rotationY(dir.primary.toYRotBlockstate()) + .rotationY(dir.front.toYRotBlockstate()) .addModel() .condition(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER) .condition(BlockRotationFreedom.ONE.property, dir) @@ -51,7 +50,7 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { for (dir in BlockRotationFreedom.ONE.possibleValues) { for (enum in WorkerState.SEMI_WORKER_STATE.possibleValues) { part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "matter_bottler_${enum.name.lowercase()}"))) - .rotationY(dir.primary.toYRotBlockstate()) + .rotationY(dir.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.ONE.property, dir) .condition(WorkerState.WORKER_STATE, enum) @@ -62,14 +61,14 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { for (dir in BlockRotationFreedom.ONE.possibleValues) { for (enum in MatterBottlerBlock.SLOT_PROPERTIES) { part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "matter_bottler_${enum.name}_open"))) - .rotationY(dir.primary.toYRotBlockstate()) + .rotationY(dir.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.ONE.property, dir) .condition(enum, false) .end() part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "matter_bottler_${enum.name}_closed"))) - .rotationY(dir.primary.toYRotBlockstate()) + .rotationY(dir.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.ONE.property, dir) .condition(enum, true) @@ -99,7 +98,7 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { OverdriveThatMatters.MOD_ID, "${crate.registryName!!.path}_${if (it.getValue( CargoCrateBlock.IS_OPEN)) "open" else "closed"}") )) - .rotationY(it.getValue(BlockRotationFreedom.ONE.property).primary.toYRotBlockstate()) + .rotationY(it.getValue(BlockRotationFreedom.ONE.property).front.toYRotBlockstate()) .buildLast() ) } @@ -108,17 +107,17 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { with(provider.getMultipartBuilder(MBlocks.STORAGE_BUS)) { for (dir in BlockRotationFreedom.TWO.possibleValues) { part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_bus"))) - .rotationX(dir.primary.toXRotBlockstate()) - .rotationY(dir.primary.toYRotBlockstate()) + .rotationX(dir.front.toXRotBlockstate()) + .rotationY(dir.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.TWO.property, dir) .end() part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_connection"))) - .rotationX(dir.primary.toXRotBlockstateInv()) - .rotationY(dir.primary.toYRotBlockstateInv()) + .rotationX(dir.front.toXRotBlockstateInv()) + .rotationY(dir.front.toYRotBlockstateInv()) .addModel() - .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.primary]!!, true) + .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.front]!!, true) .end() } @@ -129,17 +128,17 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { with(provider.getMultipartBuilder(MBlocks.STORAGE_IMPORTER)) { for (dir in BlockRotationFreedom.TWO.possibleValues) { part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_importer"))) - .rotationX(dir.primary.toXRotBlockstate()) - .rotationY(dir.primary.toYRotBlockstate()) + .rotationX(dir.front.toXRotBlockstate()) + .rotationY(dir.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.TWO.property, dir) .end() part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_connection"))) - .rotationX(dir.primary.toXRotBlockstateInv()) - .rotationY(dir.primary.toYRotBlockstateInv()) + .rotationX(dir.front.toXRotBlockstateInv()) + .rotationY(dir.front.toYRotBlockstateInv()) .addModel() - .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.primary]!!, true) + .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.front]!!, true) .end() } @@ -150,17 +149,17 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { with(provider.getMultipartBuilder(MBlocks.STORAGE_EXPORTER)) { for (dir in BlockRotationFreedom.TWO.possibleValues) { part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_exporter"))) - .rotationX(dir.primary.toXRotBlockstate()) - .rotationY(dir.primary.toYRotBlockstate()) + .rotationX(dir.front.toXRotBlockstate()) + .rotationY(dir.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.TWO.property, dir) .end() part().modelFile(provider.models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_connection"))) - .rotationX(dir.primary.toXRotBlockstateInv()) - .rotationY(dir.primary.toYRotBlockstateInv()) + .rotationX(dir.front.toXRotBlockstateInv()) + .rotationY(dir.front.toYRotBlockstateInv()) .addModel() - .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.primary]!!, true) + .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.front]!!, true) .end() } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt index 4deeb9760..714934982 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt @@ -3,7 +3,6 @@ package ru.dbotthepony.mc.otm.datagen.blocks import net.minecraft.core.Direction import net.minecraft.resources.ResourceLocation import ru.dbotthepony.mc.otm.block.tech.EnergyCounterBlock -import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.matter.PatternStorageBlock import ru.dbotthepony.mc.otm.block.storage.DriveViewerBlock @@ -17,7 +16,7 @@ fun addComplexBlockStates(provider: MatteryBlockStateProvider) { for (facing in BlockRotationFreedom.ONE.possibleValues) { part() .modelFile(provider.models().getExistingFile(ResourceLocation(MOD_ID, "block/drive_viewer_drive_part"))) - .rotationY(facing.primary.toYRotBlockstate()) + .rotationY(facing.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.ONE.property, facing) .condition(DriveViewerBlock.DRIVE_PRESENT, true) @@ -25,7 +24,7 @@ fun addComplexBlockStates(provider: MatteryBlockStateProvider) { for (workState in WorkerState.SEMI_WORKER_STATE.possibleValues) { part() .modelFile(provider.models().getExistingFile(ResourceLocation(MOD_ID, "block/drive_viewer_${workState.name.lowercase()}"))) - .rotationY(facing.primary.toYRotBlockstate()) + .rotationY(facing.front.toYRotBlockstate()) .addModel() .condition(WorkerState.SEMI_WORKER_STATE, workState) .condition(BlockRotationFreedom.ONE.property, facing) @@ -37,14 +36,14 @@ fun addComplexBlockStates(provider: MatteryBlockStateProvider) { for (facing in BlockRotationFreedom.ONE.possibleValues) { part() .modelFile(provider.models().getExistingFile(ResourceLocation(MOD_ID, "block/pattern_storage"))) - .rotationY(facing.primary.toYRotBlockstate()) + .rotationY(facing.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.ONE.property, facing) for (i in 0 .. 7) { part() .modelFile(provider.models().getExistingFile(ResourceLocation(MOD_ID, "block/pattern/model$i"))) - .rotationY(facing.primary.toYRotBlockstate()) + .rotationY(facing.front.toYRotBlockstate()) .addModel() .condition(BlockRotationFreedom.ONE.property, facing) .condition(PatternStorageBlock.PATTERN_STORAGE_DISKS_PROPS[i], true) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt index ed3aba803..01a084807 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt @@ -6,7 +6,6 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.client.model.generators.BlockStateProvider import net.minecraftforge.client.model.generators.ConfiguredModel import net.minecraftforge.data.event.GatherDataEvent -import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.datagen.DataGen @@ -23,17 +22,17 @@ private fun initialTransform(it: BlockState, modelPath: String, builder: Configu @Suppress("NAME_SHADOWING") var modelPath = modelPath it.getValueNullable(BlockRotationFreedom.ONE.property)?.let { - builder.rotationY(it.primary.toYRotBlockstate()) + builder.rotationY(it.front.toYRotBlockstate()) } it.getValueNullable(BlockRotationFreedom.TWO.property)?.let { - builder.rotationY(it.primary.toYRotBlockstate()) - builder.rotationX(it.primary.toXRotBlockstate()) + builder.rotationY(it.front.toYRotBlockstate()) + builder.rotationX(it.front.toXRotBlockstate()) } it.getValueNullable(BlockRotationFreedom.THREE.property)?.let { - builder.rotationY(it.primary.toYRotBlockstate() + (it.secondary?.toYRotBlockstate() ?: 0)) - builder.rotationX(it.primary.toXRotBlockstate()) + builder.rotationY(it.front.toYRotBlockstate() + it.top.toYRotBlockstate()) + builder.rotationX(it.front.toXRotBlockstate()) } it.getValueNullable(WorkerState.WORKER_STATE)?.let { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt index 892393764..0fa3772af 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt @@ -92,7 +92,7 @@ abstract class MatteryBlock @JvmOverloads constructor( yd += ny * 0.5 zd += nz * 0.5 - when (direction.primary) { + when (direction.front) { Direction.DOWN, Direction.UP -> { xd += random.nextDouble() - 0.5 zd += random.nextDouble() - 0.5 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/RotatableMatteryBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/RotatableMatteryBlock.kt index fa7689090..401853578 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/RotatableMatteryBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/RotatableMatteryBlock.kt @@ -24,12 +24,12 @@ abstract class RotatableMatteryBlock @JvmOverloads constructor(properties: Prope return when (val freedom = rotationFreedom()) { BlockRotationFreedom.ONE -> defaultBlockState().setValue( freedom.property, - BlockRotation.of(if (faceToPlayer(context)) context.horizontalDirection.opposite else context.horizontalDirection) + freedom.of(if (faceToPlayer(context)) context.horizontalDirection.opposite else context.horizontalDirection) ) BlockRotationFreedom.TWO -> defaultBlockState().setValue( freedom.property, - BlockRotation.of(if (faceToPlayer(context)) context.nearestLookingDirection.opposite else context.nearestLookingDirection) + freedom.of(if (faceToPlayer(context)) context.nearestLookingDirection.opposite else context.nearestLookingDirection) ) BlockRotationFreedom.THREE -> { @@ -42,9 +42,11 @@ abstract class RotatableMatteryBlock @JvmOverloads constructor(properties: Prope defaultBlockState().setValue( freedom.property, - BlockRotation.ofSafe(primary, secondary) + freedom.of(primary, secondary) ) } + + BlockRotationFreedom.FOUR -> TODO("Can't rotate with four rotation freedom yet") } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/EngineBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/EngineBlock.kt index c3103284c..43b24a62e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/EngineBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/EngineBlock.kt @@ -18,7 +18,7 @@ class EngineBlock : RotatableMatteryBlock(Properties.of(Material.METAL, DyeColor } private val shapes = getShapeForEachState { - BlockShapes.ENGINE.rotateInv(it[rotationProperty].primary).computeShape() + BlockShapes.ENGINE.rotateInv(it[rotationProperty].front).computeShape() } override fun getShape( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/HoloSignBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/HoloSignBlock.kt index 92f861ff4..124c10eb1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/HoloSignBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/HoloSignBlock.kt @@ -23,7 +23,7 @@ class HoloSignBlock : RotatableMatteryBlock(), EntityBlock { } private val shapes = getShapeForEachState { - BlockShapes.HOLO_SIGN.rotateInv(it[rotationProperty].primary).computeShape() + BlockShapes.HOLO_SIGN.rotateInv(it[rotationProperty].front).computeShape() } override fun getShape( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt index 4ac58d7b3..b03a534fc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt @@ -20,7 +20,6 @@ import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.IItemHandler import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.block.CableBlock -import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.block.entity.storage.AbstractStorageImportExport.Companion.FILTER_KEY import ru.dbotthepony.mc.otm.capability.MatteryCapability @@ -32,7 +31,6 @@ import ru.dbotthepony.mc.otm.core.math.getCapability import ru.dbotthepony.mc.otm.core.math.isPositive import ru.dbotthepony.mc.otm.core.math.isZero import ru.dbotthepony.mc.otm.core.math.plus -import ru.dbotthepony.mc.otm.core.math.unaryMinus import ru.dbotthepony.mc.otm.core.nbt.map import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.graph.Graph6Node @@ -113,7 +111,7 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter private var valid = true override fun getCapability(cap: Capability, side: Direction?): LazyOptional { - return if (valid && cap === MatteryCapability.STORAGE_NODE && side != blockState.getValue(BlockRotationFreedom.TWO.property).primary) { + return if (valid && cap === MatteryCapability.STORAGE_NODE && side != blockState.getValue(BlockRotationFreedom.TWO.property).front) { cell.get().cast() } else super.getCapability(cap, side) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt index c06fda606..3b1762b84 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt @@ -19,7 +19,6 @@ import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.IItemHandler import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.block.CableBlock -import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage @@ -75,7 +74,7 @@ abstract class AbstractStorageImportExport( private var valid = true override fun getCapability(cap: Capability, side: Direction?): LazyOptional { - return if (valid && cap === MatteryCapability.STORAGE_NODE && side != blockState.getValue(BlockRotationFreedom.TWO.property).primary) { + return if (valid && cap === MatteryCapability.STORAGE_NODE && side != blockState.getValue(BlockRotationFreedom.TWO.property).front) { cell.get().cast() } else super.getCapability(cap, side) } @@ -114,7 +113,7 @@ abstract class AbstractStorageImportExport( protected val target by lazy { object : BESubscribeList(this@AbstractStorageImportExport, targetCapability) { override fun test(t: Direction): Boolean { - return t == -this@AbstractStorageImportExport.blockState.getValue(BlockRotationFreedom.TWO.property).primary + return t == -this@AbstractStorageImportExport.blockState.getValue(BlockRotationFreedom.TWO.property).front } } } @@ -179,7 +178,7 @@ class StorageImporterBlockEntity(blockPos: BlockPos, blockState: BlockState) } override fun getCapability(cap: Capability, side: Direction?): LazyOptional { - if (valid && cap == ForgeCapabilities.ITEM_HANDLER && side == blockState.rotationTwo.primary) { + if (valid && cap == ForgeCapabilities.ITEM_HANDLER && side == blockState.rotationTwo.front) { return resolverItemHandler.cast() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt index 4a8076269..0b593d258 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt @@ -11,11 +11,7 @@ import net.minecraft.world.phys.shapes.VoxelShape import net.minecraft.world.phys.shapes.Shapes import net.minecraft.world.level.BlockGetter import net.minecraft.world.phys.shapes.CollisionContext -import net.minecraft.world.level.block.state.StateDefinition import net.minecraft.world.item.context.BlockPlaceContext -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.properties.EnumProperty -import ru.dbotthepony.mc.otm.block.MatteryBlock import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.core.math.BlockRotation import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom @@ -32,7 +28,7 @@ class MatterPanelBlock : RotatableMatteryBlock(), EntityBlock { registerDefaultState(getStateDefinition().any().setValue(BlockRotationFreedom.TWO.property, BlockRotation.SOUTH)) shapes = getShapeForEachState { - when (it.rotationTwo.primary) { + when (it.rotationTwo.front) { Direction.NORTH -> Shapes.box( 0.0, 0.0, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/GravitationStabilizerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/GravitationStabilizerBlock.kt index f7a82cbd6..b178aba8b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/GravitationStabilizerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/GravitationStabilizerBlock.kt @@ -213,7 +213,7 @@ class BlockGravitationStabilizerLens : RotatableMatteryBlock(props) { } fun getBoundingBlockPos(blockState: BlockState, blockPos: BlockPos): BlockPos { - return blockPos + blockState.getValue(BlockRotationFreedom.TWO.property).opposite.normal + return blockPos + blockState.getValue(BlockRotationFreedom.TWO.property).front.opposite.normal } private val SHAPES = arrayOf( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotation.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotation.kt index b77eec949..c484b2441 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotation.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotation.kt @@ -8,12 +8,13 @@ import net.minecraft.world.level.block.Rotation import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.LazyOptional +import java.util.EnumMap internal inline val Direction.blockRotation get() = BlockRotation.of(this) fun ICapabilityProvider.getCapability(capability: Capability, side: BlockRotation?): LazyOptional { - return getCapability(capability, side?.primary) + return getCapability(capability, side?.front) } operator fun Vec3i.plus(other: BlockRotation): Vec3i { @@ -25,15 +26,18 @@ operator fun BlockPos.plus(other: BlockRotation): BlockPos { } /** - * [secondary] clarifies about block's top facing direction, NOT bottom + * [top] clarifies about block's top facing direction, NOT bottom */ -enum class BlockRotation(val primary: Direction, val secondary: Direction?) : StringRepresentable { +enum class BlockRotation( + val front: Direction, + val top: Direction, +) : StringRepresentable { DOWN(Direction.DOWN, Direction.NORTH), UP(Direction.UP, Direction.NORTH), - NORTH(Direction.NORTH, null), - SOUTH(Direction.SOUTH, null), - WEST(Direction.WEST, null), - EAST(Direction.EAST, null), + NORTH(Direction.NORTH, Direction.UP), + SOUTH(Direction.SOUTH, Direction.UP), + WEST(Direction.WEST, Direction.UP), + EAST(Direction.EAST, Direction.UP), DOWN_SOUTH(Direction.DOWN, Direction.SOUTH), DOWN_WEST(Direction.DOWN, Direction.WEST), @@ -41,7 +45,43 @@ enum class BlockRotation(val primary: Direction, val secondary: Direction?) : St UP_SOUTH(Direction.UP, Direction.SOUTH), UP_WEST(Direction.UP, Direction.WEST), - UP_EAST(Direction.UP, Direction.EAST); + UP_EAST(Direction.UP, Direction.EAST), + + /** + * This rotation is impossible to achieve using blockstates because blockstate def can't rotate models in XY plane (z axis) + */ + NORTH_DOWN(Direction.NORTH, Direction.DOWN), + + /** + * This rotation is impossible to achieve using blockstates because blockstate def can't rotate models in XY plane (z axis) + */ + SOUTH_DOWN(Direction.SOUTH, Direction.DOWN), + + /** + * This rotation is impossible to achieve using blockstates because blockstate def can't rotate models in XY plane (z axis) + */ + WEST_DOWN(Direction.WEST, Direction.DOWN), + + /** + * This rotation is impossible to achieve using blockstates because blockstate def can't rotate models in XY plane (z axis) + */ + EAST_DOWN(Direction.EAST, Direction.DOWN), + ; + + val right: Direction + + init { + val crossproduct = front.normal.cross(top.normal) + right = Direction.values().first { it.normal == crossproduct } + } + + val left: Direction = right.opposite + val bottom: Direction = top.opposite + val back: Direction = front.opposite + + operator fun component1() = front + operator fun component2() = top + operator fun component3() = left val lowercaseName = name.lowercase() @@ -50,7 +90,7 @@ enum class BlockRotation(val primary: Direction, val secondary: Direction?) : St } fun rotate(by: Rotation): BlockRotation { - return of(by.rotate(primary), secondary) + return of(by.rotate(front), top) } operator fun times(other: Int): Vec3i { @@ -72,8 +112,8 @@ enum class BlockRotation(val primary: Direction, val secondary: Direction?) : St operator fun unaryMinus() = opposite // more performant - val opposite by lazy { of(primary.opposite, secondary?.opposite) } - val normal: Vec3i get() = primary.normal + val opposite by lazy { of(front.opposite, top.opposite) } + val normal: Vec3i get() = front.normal companion object { @JvmStatic @@ -88,77 +128,26 @@ enum class BlockRotation(val primary: Direction, val secondary: Direction?) : St } } - @JvmStatic - fun of(primary: Direction, secondary: Direction?): BlockRotation { - return when (primary) { - Direction.NORTH -> { - require(secondary == null) { "Impossible direction: $primary - $secondary" } - NORTH - } + private val mapped = EnumMap>(Direction::class.java) - Direction.SOUTH -> { - require(secondary == null) { "Impossible direction: $primary - $secondary" } - SOUTH - } - - Direction.WEST -> { - require(secondary == null) { "Impossible direction: $primary - $secondary" } - WEST - } - - Direction.EAST -> { - require(secondary == null) { "Impossible direction: $primary - $secondary" } - EAST - } - - Direction.UP -> { - when (secondary) { - null -> UP - Direction.SOUTH -> UP_SOUTH - Direction.WEST -> UP_WEST - Direction.EAST -> UP_EAST - else -> throw IllegalArgumentException("Impossible direction: $primary - $secondary") - } - } - - Direction.DOWN -> { - when (secondary) { - null -> DOWN - Direction.SOUTH -> DOWN_SOUTH - Direction.WEST -> DOWN_WEST - Direction.EAST -> DOWN_EAST - else -> throw IllegalArgumentException("Impossible direction: $primary - $secondary") - } - } + init { + for (value in values()) { + val (front, top) = value + mapped.computeIfAbsent(front) { EnumMap(Direction::class.java) }.put(top, value) } } @JvmStatic - fun ofSafe(primary: Direction, secondary: Direction?): BlockRotation { - return when (primary) { - Direction.NORTH -> NORTH - Direction.SOUTH -> SOUTH - Direction.WEST -> WEST - Direction.EAST -> EAST + fun of(front: Direction, top: Direction?): BlockRotation { + val f = mapped[front]!! + return f[top ?: (if (front == Direction.DOWN || front == Direction.UP) Direction.NORTH else Direction.UP)] ?: throw IllegalArgumentException("Impossible block rotation: $front - $top") + } - Direction.UP -> { - when (secondary) { - Direction.SOUTH -> UP_SOUTH - Direction.WEST -> UP_WEST - Direction.EAST -> UP_EAST - else -> UP - } - } - - Direction.DOWN -> { - when (secondary) { - Direction.SOUTH -> DOWN_SOUTH - Direction.WEST -> DOWN_WEST - Direction.EAST -> DOWN_EAST - else -> DOWN - } - } - } + @JvmStatic + fun ofSafe(front: Direction, top: Direction?): BlockRotation { + val f = mapped[front]!! + val computeTop = if (front == Direction.DOWN || front == Direction.UP) Direction.NORTH else Direction.UP + return f[top ?: computeTop] ?: f[computeTop] ?: f.values.first() } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotationFreedom.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotationFreedom.kt index 2f131ba8e..cb479a34d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotationFreedom.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/BlockRotationFreedom.kt @@ -4,14 +4,15 @@ import net.minecraft.core.Direction import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.properties.EnumProperty import ru.dbotthepony.mc.otm.core.get +import java.util.EnumMap internal inline val BlockState.rotationOne: BlockRotation get() = this[BlockRotationFreedom.ONE.property] internal inline val BlockState.rotationTwo: BlockRotation get() = this[BlockRotationFreedom.TWO.property] internal inline val BlockState.rotationThree: BlockRotation get() = this[BlockRotationFreedom.THREE.property] -internal inline val BlockState.facingOne: Direction get() = this[BlockRotationFreedom.ONE.property].primary -internal inline val BlockState.facingTwo: Direction get() = this[BlockRotationFreedom.TWO.property].primary -internal inline val BlockState.facingThree: Direction get() = this[BlockRotationFreedom.THREE.property].primary +internal inline val BlockState.facingOne: Direction get() = this[BlockRotationFreedom.ONE.property].front +internal inline val BlockState.facingTwo: Direction get() = this[BlockRotationFreedom.TWO.property].front +internal inline val BlockState.facingThree: Direction get() = this[BlockRotationFreedom.THREE.property].front enum class BlockRotationFreedom(vararg values: BlockRotation) { ONE( @@ -41,8 +42,57 @@ enum class BlockRotationFreedom(vararg values: BlockRotation) { BlockRotation.UP_SOUTH, BlockRotation.UP_WEST, BlockRotation.UP_EAST, + ), + + /** + * These rotations are impossible to achieve using blockstates because blockstate def can't rotate models in XY plane (z axis) + */ + FOUR( + BlockRotation.DOWN, + BlockRotation.UP, + BlockRotation.NORTH, + BlockRotation.SOUTH, + BlockRotation.WEST, + BlockRotation.EAST, + BlockRotation.DOWN_SOUTH, + BlockRotation.DOWN_WEST, + BlockRotation.DOWN_EAST, + BlockRotation.UP_SOUTH, + BlockRotation.UP_WEST, + BlockRotation.UP_EAST, + BlockRotation.NORTH_DOWN, + BlockRotation.SOUTH_DOWN, + BlockRotation.WEST_DOWN, + BlockRotation.EAST_DOWN, ); val possibleValues: Collection get() = property.possibleValues val property: EnumProperty = EnumProperty.create("facing", BlockRotation::class.java, *values) + + private val oneDirection = EnumMap(Direction::class.java) + private val twoDirection = EnumMap>(Direction::class.java) + + init { + for (direction in Direction.values()) { + oneDirection[direction] = possibleValues.firstOrNull { it.front == direction } + ?: possibleValues.first() + + val second = EnumMap(Direction::class.java) + twoDirection[direction] = second + + for (direction2 in Direction.values()) { + second[direction2] = possibleValues.firstOrNull { it.front == direction && it.top == direction2 } + ?: possibleValues.firstOrNull { it.front == direction } + ?: possibleValues.first() + } + } + } + + fun of(front: Direction): BlockRotation { + return oneDirection[front]!! + } + + fun of(front: Direction, top: Direction = Direction.UP): BlockRotation { + return twoDirection[front]!![top]!! + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/EuclidMath.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/EuclidMath.kt index 3b8c60b5f..86045f6f4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/EuclidMath.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/math/EuclidMath.kt @@ -648,7 +648,7 @@ fun PoseStack.rotateWithBlockFacing(rotation: Direction, clarifyingAxis: Directi } fun PoseStack.rotateWithBlockFacing(rotation: BlockRotation): PoseStack { - return rotateWithBlockFacing(rotation = rotation.primary, clarifyingAxis = rotation.secondary) + return rotateWithBlockFacing(rotation = rotation.front, clarifyingAxis = rotation.top) } fun PoseStack.rotateYDegrees(rotation: Float): PoseStack {