Storage bus/i/o blockstates

This commit is contained in:
DBotThePony 2022-05-16 15:42:23 +07:00
parent de1eb1af19
commit 8cabf8d295
Signed by: DBot
GPG Key ID: DCC23B5715498507
7 changed files with 152 additions and 6 deletions

View File

@ -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")))

View File

@ -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 <T : Comparable<T>> BlockState.getValueNullable(prop: Property<T>): T? {
if (hasProperty(prop)) {
return getValue(prop)

View File

@ -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<Block, BlockState>) {
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 <T : BlockEntity?> getTicker(
p_153212_: Level,
p_153213_: BlockState,

View File

@ -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<Block, BlockState>) {
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 <T : BlockEntity?> 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<Block, BlockState>) {
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 <T : BlockEntity?> getTicker(
p_153212_: Level,
p_153213_: BlockState,

View File

@ -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() {

View File

@ -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 <T> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> {
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)
}

View File

@ -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<T>(
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 <T> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> {
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)
}