From 8cabf8d295238892b0d7ce9fb4cb0b4e1592dadb Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 16 May 2022 15:42:23 +0700 Subject: [PATCH] Storage bus/i/o blockstates --- .../ru/dbotthepony/mc/otm/datagen/DataGen.kt | 21 +++++++++ .../ru/dbotthepony/mc/otm/datagen/Ext.kt | 22 ++++++++++ .../mc/otm/block/StorageBusBlock.kt | 22 ++++++++++ .../mc/otm/block/StorageInterfaces.kt | 43 +++++++++++++++++++ .../dbotthepony/mc/otm/block/entity/Cables.kt | 4 +- .../otm/block/entity/StorageBusBlockEntity.kt | 23 +++++++++- .../mc/otm/block/entity/StorageInterfaces.kt | 23 +++++++++- 7 files changed, 152 insertions(+), 6 deletions(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index c034d0c84..dd815a3ca 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -235,6 +235,13 @@ object DataGen { .addModel() .condition(RotatableMatteryBlock.FACING_FULL, dir) .end() + + part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_connection"))) + .rotationX(dir.toXRotBlockstateInv()) + .rotationY(dir.toYRotBlockstateInv()) + .addModel() + .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.ordinal], true) + .end() } part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_core"))) @@ -249,6 +256,13 @@ object DataGen { .addModel() .condition(RotatableMatteryBlock.FACING_FULL, dir) .end() + + part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_connection"))) + .rotationX(dir.toXRotBlockstateInv()) + .rotationY(dir.toYRotBlockstateInv()) + .addModel() + .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.ordinal], true) + .end() } part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_core"))) @@ -263,6 +277,13 @@ object DataGen { .addModel() .condition(RotatableMatteryBlock.FACING_FULL, dir) .end() + + part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_connection"))) + .rotationX(dir.toXRotBlockstateInv()) + .rotationY(dir.toYRotBlockstateInv()) + .addModel() + .condition(CableBlock.MAPPING_CONNECTION_PROP[dir.ordinal], true) + .end() } part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_core"))) 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 681c5dc7f..38dc866bb 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/Ext.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/Ext.kt @@ -18,6 +18,17 @@ fun Direction.toYRotBlockstate(): Int { } } +fun Direction.toYRotBlockstateInv(): Int { + return when (this) { + Direction.DOWN -> 0 + Direction.UP -> 0 + Direction.NORTH -> 180 + Direction.SOUTH -> 0 + Direction.WEST -> 90 + Direction.EAST -> -90 + } +} + fun Direction.toXRotBlockstate(): Int { return when (this) { Direction.DOWN -> 90 @@ -29,6 +40,17 @@ fun Direction.toXRotBlockstate(): Int { } } +fun Direction.toXRotBlockstateInv(): Int { + return when (this) { + Direction.DOWN -> -90 + Direction.UP -> 90 + Direction.NORTH -> 0 + Direction.SOUTH -> 0 + Direction.WEST -> 0 + Direction.EAST -> 0 + } +} + fun > BlockState.getValueNullable(prop: Property): T? { if (hasProperty(prop)) { return getValue(prop) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageBusBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageBusBlock.kt index 07ec88c29..094eb8d2c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageBusBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageBusBlock.kt @@ -9,6 +9,7 @@ import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.entity.BlockEntityTicker import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.block.state.StateDefinition import ru.dbotthepony.mc.otm.addPreWorldTickerOnce import ru.dbotthepony.mc.otm.block.entity.StorageBusBlockEntity import ru.dbotthepony.mc.otm.registry.MBlockEntities @@ -17,6 +18,16 @@ import ru.dbotthepony.mc.otm.unaryMinus class StorageBusBlock : RotatableMatteryBlock(), EntityBlock { override val hasFreeRotation: Boolean get() = true + init { + registerDefaultState(defaultBlockState() + .setValue(CableBlock.CONNECTION_SOUTH, false) + .setValue(CableBlock.CONNECTION_WEST, false) + .setValue(CableBlock.CONNECTION_EAST, false) + .setValue(CableBlock.CONNECTION_NORTH, false) + .setValue(CableBlock.CONNECTION_UP, false) + .setValue(CableBlock.CONNECTION_DOWN, false)) + } + override fun newBlockEntity(p_153215_: BlockPos, p_153216_: BlockState): BlockEntity { return StorageBusBlockEntity(p_153215_, p_153216_) } @@ -25,6 +36,17 @@ class StorageBusBlock : RotatableMatteryBlock(), EntityBlock { return super.getStateForPlacement(context)?.setValue(FACING_FULL, -context.clickedFace) } + override fun createBlockStateDefinition(builder: StateDefinition.Builder) { + super.createBlockStateDefinition(builder) + + builder.add(CableBlock.CONNECTION_SOUTH, + CableBlock.CONNECTION_WEST, + CableBlock.CONNECTION_EAST, + CableBlock.CONNECTION_NORTH, + CableBlock.CONNECTION_UP, + CableBlock.CONNECTION_DOWN) + } + override fun getTicker( p_153212_: Level, p_153213_: BlockState, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageInterfaces.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageInterfaces.kt index a4ee0cc68..ddba587e8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageInterfaces.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/StorageInterfaces.kt @@ -9,6 +9,7 @@ import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.entity.BlockEntityTicker import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.block.state.StateDefinition import ru.dbotthepony.mc.otm.addPreWorldTickerOnce import ru.dbotthepony.mc.otm.block.entity.StorageExporterBlockEntity import ru.dbotthepony.mc.otm.block.entity.StorageImporterBlockEntity @@ -22,6 +23,27 @@ class StorageImporterBlock : RotatableMatteryBlock(), EntityBlock { return StorageImporterBlockEntity(p_153215_, p_153216_) } + init { + registerDefaultState(defaultBlockState() + .setValue(CableBlock.CONNECTION_SOUTH, false) + .setValue(CableBlock.CONNECTION_WEST, false) + .setValue(CableBlock.CONNECTION_EAST, false) + .setValue(CableBlock.CONNECTION_NORTH, false) + .setValue(CableBlock.CONNECTION_UP, false) + .setValue(CableBlock.CONNECTION_DOWN, false)) + } + + override fun createBlockStateDefinition(builder: StateDefinition.Builder) { + super.createBlockStateDefinition(builder) + + builder.add(CableBlock.CONNECTION_SOUTH, + CableBlock.CONNECTION_WEST, + CableBlock.CONNECTION_EAST, + CableBlock.CONNECTION_NORTH, + CableBlock.CONNECTION_UP, + CableBlock.CONNECTION_DOWN) + } + override fun getTicker( p_153212_: Level, p_153213_: BlockState, @@ -66,6 +88,27 @@ class StorageExporterBlock : RotatableMatteryBlock(), EntityBlock { return StorageExporterBlockEntity(p_153215_, p_153216_) } + init { + registerDefaultState(defaultBlockState() + .setValue(CableBlock.CONNECTION_SOUTH, false) + .setValue(CableBlock.CONNECTION_WEST, false) + .setValue(CableBlock.CONNECTION_EAST, false) + .setValue(CableBlock.CONNECTION_NORTH, false) + .setValue(CableBlock.CONNECTION_UP, false) + .setValue(CableBlock.CONNECTION_DOWN, false)) + } + + override fun createBlockStateDefinition(builder: StateDefinition.Builder) { + super.createBlockStateDefinition(builder) + + builder.add(CableBlock.CONNECTION_SOUTH, + CableBlock.CONNECTION_WEST, + CableBlock.CONNECTION_EAST, + CableBlock.CONNECTION_NORTH, + CableBlock.CONNECTION_UP, + CableBlock.CONNECTION_DOWN) + } + override fun getTicker( p_153212_: Level, p_153213_: BlockState, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/Cables.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/Cables.kt index ec09011a8..edbb8fb03 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/Cables.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/Cables.kt @@ -57,14 +57,14 @@ class MatterCableBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : val newState = blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], true) if (newState !== blockState && !SERVER_IS_DYING) - level!!.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) + level?.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) } override fun onUnNeighbour(node: Graph6Node<*>, direction: Direction) { val newState = blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], false) if (newState !== blockState && !SERVER_IS_DYING) - level!!.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) + level?.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) } override fun setRemoved() { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageBusBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageBusBlockEntity.kt index 2189e13b6..153b8ef01 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageBusBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageBusBlockEntity.kt @@ -13,18 +13,22 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.CapabilityItemHandler 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.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.ItemFilter import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.plus +import ru.dbotthepony.mc.otm.graph.Graph6Node +import ru.dbotthepony.mc.otm.graph.GraphNodeListener import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.menu.StorageBusMenu @@ -62,7 +66,22 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter } override val energy = WorkerEnergyStorage(this, maxBatteryLevel = MAX_POWER) - val cell = BasicStorageGraphNode(energy) + + val cell: BasicStorageGraphNode = object : BasicStorageGraphNode(energy), GraphNodeListener { + override fun onNeighbour(node: Graph6Node<*>, direction: Direction) { + val newState = this@StorageBusBlockEntity.blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], true) + + if (newState !== this@StorageBusBlockEntity.blockState && !SERVER_IS_DYING) + level?.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) + } + + override fun onUnNeighbour(node: Graph6Node<*>, direction: Direction) { + val newState = this@StorageBusBlockEntity.blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], false) + + if (newState !== this@StorageBusBlockEntity.blockState && !SERVER_IS_DYING) + level?.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) + } + } val filter = ItemFilter(MAX_FILTERS) { _, _, _ -> component?.scan() @@ -82,7 +101,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) { + return if (valid && cap === MatteryCapability.STORAGE_NODE && side != blockState.getValue(RotatableMatteryBlock.FACING_FULL)) { cell.get().cast() } else super.getCapability(cap, side) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageInterfaces.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageInterfaces.kt index 262f2bfa7..231f0d7a6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageInterfaces.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/StorageInterfaces.kt @@ -12,6 +12,7 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability @@ -19,12 +20,15 @@ import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.CapabilityItemHandler 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.capability.* import ru.dbotthepony.mc.otm.container.ItemFilter import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.plus import ru.dbotthepony.mc.otm.core.toImpreciseFraction +import ru.dbotthepony.mc.otm.graph.Graph6Node +import ru.dbotthepony.mc.otm.graph.GraphNodeListener import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.menu.StorageExporterMenu @@ -46,12 +50,27 @@ abstract class AbstractStorageImportExport( maxOutput: ImpreciseFraction? = maxInput ) : MatteryPoweredBlockEntity(blockType, blockPos, blockState) { final override val energy = WorkerEnergyStorage(this, maxBatteryLevel, maxInput, maxOutput) - val cell = BasicStorageGraphNode(energy) + + val cell: BasicStorageGraphNode = object : BasicStorageGraphNode(energy), GraphNodeListener { + override fun onNeighbour(node: Graph6Node<*>, direction: Direction) { + val newState = this@AbstractStorageImportExport.blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], true) + + if (newState !== this@AbstractStorageImportExport.blockState && !SERVER_IS_DYING) + level?.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) + } + + override fun onUnNeighbour(node: Graph6Node<*>, direction: Direction) { + val newState = this@AbstractStorageImportExport.blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], false) + + if (newState !== this@AbstractStorageImportExport.blockState && !SERVER_IS_DYING) + level?.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) + } + } private var valid = true override fun getCapability(cap: Capability, side: Direction?): LazyOptional { - return if (valid && cap === MatteryCapability.STORAGE_NODE) { + return if (valid && cap === MatteryCapability.STORAGE_NODE && side != blockState.getValue(RotatableMatteryBlock.FACING_FULL)) { cell.get().cast() } else super.getCapability(cap, side) }