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() .addModel()
.condition(RotatableMatteryBlock.FACING_FULL, dir) .condition(RotatableMatteryBlock.FACING_FULL, dir)
.end() .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"))) part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_core")))
@ -249,6 +256,13 @@ object DataGen {
.addModel() .addModel()
.condition(RotatableMatteryBlock.FACING_FULL, dir) .condition(RotatableMatteryBlock.FACING_FULL, dir)
.end() .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"))) part().modelFile(models().getExistingFile(ResourceLocation(OverdriveThatMatters.MOD_ID, "storage_cable_core")))
@ -263,6 +277,13 @@ object DataGen {
.addModel() .addModel()
.condition(RotatableMatteryBlock.FACING_FULL, dir) .condition(RotatableMatteryBlock.FACING_FULL, dir)
.end() .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"))) 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 { fun Direction.toXRotBlockstate(): Int {
return when (this) { return when (this) {
Direction.DOWN -> 90 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? { fun <T : Comparable<T>> BlockState.getValueNullable(prop: Property<T>): T? {
if (hasProperty(prop)) { if (hasProperty(prop)) {
return getValue(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.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.world.level.block.state.BlockState 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.addPreWorldTickerOnce
import ru.dbotthepony.mc.otm.block.entity.StorageBusBlockEntity import ru.dbotthepony.mc.otm.block.entity.StorageBusBlockEntity
import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -17,6 +18,16 @@ import ru.dbotthepony.mc.otm.unaryMinus
class StorageBusBlock : RotatableMatteryBlock(), EntityBlock { class StorageBusBlock : RotatableMatteryBlock(), EntityBlock {
override val hasFreeRotation: Boolean get() = true 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 { override fun newBlockEntity(p_153215_: BlockPos, p_153216_: BlockState): BlockEntity {
return StorageBusBlockEntity(p_153215_, p_153216_) return StorageBusBlockEntity(p_153215_, p_153216_)
} }
@ -25,6 +36,17 @@ class StorageBusBlock : RotatableMatteryBlock(), EntityBlock {
return super.getStateForPlacement(context)?.setValue(FACING_FULL, -context.clickedFace) 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( override fun <T : BlockEntity?> getTicker(
p_153212_: Level, p_153212_: Level,
p_153213_: BlockState, 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.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.world.level.block.state.BlockState 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.addPreWorldTickerOnce
import ru.dbotthepony.mc.otm.block.entity.StorageExporterBlockEntity import ru.dbotthepony.mc.otm.block.entity.StorageExporterBlockEntity
import ru.dbotthepony.mc.otm.block.entity.StorageImporterBlockEntity import ru.dbotthepony.mc.otm.block.entity.StorageImporterBlockEntity
@ -22,6 +23,27 @@ class StorageImporterBlock : RotatableMatteryBlock(), EntityBlock {
return StorageImporterBlockEntity(p_153215_, p_153216_) 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( override fun <T : BlockEntity?> getTicker(
p_153212_: Level, p_153212_: Level,
p_153213_: BlockState, p_153213_: BlockState,
@ -66,6 +88,27 @@ class StorageExporterBlock : RotatableMatteryBlock(), EntityBlock {
return StorageExporterBlockEntity(p_153215_, p_153216_) 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( override fun <T : BlockEntity?> getTicker(
p_153212_: Level, p_153212_: Level,
p_153213_: BlockState, 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) val newState = blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], true)
if (newState !== blockState && !SERVER_IS_DYING) 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) { override fun onUnNeighbour(node: Graph6Node<*>, direction: Direction) {
val newState = blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], false) val newState = blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[direction.ordinal], false)
if (newState !== blockState && !SERVER_IS_DYING) if (newState !== blockState && !SERVER_IS_DYING)
level!!.setBlock(blockPos, newState, Block.UPDATE_CLIENTS) level?.setBlock(blockPos, newState, Block.UPDATE_CLIENTS)
} }
override fun setRemoved() { 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.inventory.AbstractContainerMenu
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
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.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.Capability
import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.common.util.LazyOptional
import net.minecraftforge.items.CapabilityItemHandler import net.minecraftforge.items.CapabilityItemHandler
import net.minecraftforge.items.IItemHandler import net.minecraftforge.items.IItemHandler
import ru.dbotthepony.mc.otm.* 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.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.container.ItemFilter import ru.dbotthepony.mc.otm.container.ItemFilter
import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ImpreciseFraction
import ru.dbotthepony.mc.otm.core.plus 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.BasicStorageGraphNode
import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph
import ru.dbotthepony.mc.otm.menu.StorageBusMenu 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) 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) { _, _, _ -> val filter = ItemFilter(MAX_FILTERS) { _, _, _ ->
component?.scan() component?.scan()
@ -82,7 +101,7 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
private var valid = true private var valid = true
override fun <T> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> { 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() cell.get().cast()
} else super.getCapability(cap, side) } 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.inventory.AbstractContainerMenu
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level 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.entity.BlockEntityType
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import net.minecraftforge.common.capabilities.Capability 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.CapabilityItemHandler
import net.minecraftforge.items.IItemHandler import net.minecraftforge.items.IItemHandler
import ru.dbotthepony.mc.otm.* 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.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.capability.*
import ru.dbotthepony.mc.otm.container.ItemFilter import ru.dbotthepony.mc.otm.container.ItemFilter
import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ImpreciseFraction
import ru.dbotthepony.mc.otm.core.plus import ru.dbotthepony.mc.otm.core.plus
import ru.dbotthepony.mc.otm.core.toImpreciseFraction 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.BasicStorageGraphNode
import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph
import ru.dbotthepony.mc.otm.menu.StorageExporterMenu import ru.dbotthepony.mc.otm.menu.StorageExporterMenu
@ -46,12 +50,27 @@ abstract class AbstractStorageImportExport<T>(
maxOutput: ImpreciseFraction? = maxInput maxOutput: ImpreciseFraction? = maxInput
) : MatteryPoweredBlockEntity(blockType, blockPos, blockState) { ) : MatteryPoweredBlockEntity(blockType, blockPos, blockState) {
final override val energy = WorkerEnergyStorage(this, maxBatteryLevel, maxInput, maxOutput) 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 private var valid = true
override fun <T> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> { 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() cell.get().cast()
} else super.getCapability(cap, side) } else super.getCapability(cap, side)
} }