Update storage interface and bus
This commit is contained in:
parent
93d4329acd
commit
a86d30dae4
@ -65,6 +65,7 @@ import ru.dbotthepony.mc.otm.onceServer
|
|||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
|
import java.util.function.Predicate
|
||||||
import java.util.function.Supplier
|
import java.util.function.Supplier
|
||||||
import java.util.stream.Stream
|
import java.util.stream.Stream
|
||||||
import kotlin.NoSuchElementException
|
import kotlin.NoSuchElementException
|
||||||
@ -134,43 +135,23 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
|||||||
setChanged()
|
setChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun <T : Any> exposeAllSidesExcept(side: RelativeSide, capability: Capability<T>, value: T) {
|
|
||||||
for ((k, v) in _sides) {
|
|
||||||
if (k != side) {
|
|
||||||
v.Cap(capability, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun isSidelessExposed(capability: Capability<*>): Boolean {
|
|
||||||
return sidelessCaps.containsKey(capability)
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun removeSideless(capability: Capability<*>): Boolean {
|
|
||||||
if (sidelessCaps.remove(capability) != null) {
|
|
||||||
setChanged()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exposes capability unconditionally, on all sides and sideless
|
* Exposes capability unconditionally, on all sides and sideless
|
||||||
*/
|
*/
|
||||||
protected fun <T : Any> exposeGlobally(capability: Capability<T>, value: T) {
|
protected fun <T : Any> exposeGlobally(capability: Capability<T>, value: T, predicate: Predicate<RelativeSide> = Predicate { true }) {
|
||||||
exposeSideless(capability, value)
|
exposeSideless(capability, value)
|
||||||
|
|
||||||
for (side in _sides.values)
|
for (side in _sides.values)
|
||||||
side.Cap(capability, value)
|
if (predicate.test(side.side))
|
||||||
|
side.Cap(capability, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun exposeEnergyGlobally(value: IMatteryEnergyStorage) {
|
protected fun exposeEnergyGlobally(value: IMatteryEnergyStorage, predicate: Predicate<RelativeSide> = Predicate { true }) {
|
||||||
exposeGlobally(ForgeCapabilities.ENERGY, value)
|
exposeGlobally(ForgeCapabilities.ENERGY, value, predicate)
|
||||||
exposeGlobally(MatteryCapability.ENERGY, value)
|
exposeGlobally(MatteryCapability.ENERGY, value, predicate)
|
||||||
|
|
||||||
if (isMekanismLoaded) {
|
if (isMekanismLoaded) {
|
||||||
exposeGlobally(MatteryCapability.MEKANISM_ENERGY, Mattery2MekanismEnergyWrapper(value))
|
exposeGlobally(MatteryCapability.MEKANISM_ENERGY, Mattery2MekanismEnergyWrapper(value), predicate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,12 +62,6 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
|||||||
}
|
}
|
||||||
|
|
||||||
val energy = WorkerEnergyStorage(this::setChangedLight, MachinesConfig.STORAGE_INTERFACES)
|
val energy = WorkerEnergyStorage(this::setChangedLight, MachinesConfig.STORAGE_INTERFACES)
|
||||||
|
|
||||||
init {
|
|
||||||
exposeEnergyGlobally(energy)
|
|
||||||
savetable(::energy, ENERGY_KEY)
|
|
||||||
}
|
|
||||||
|
|
||||||
val cell: StorageNode = object : StorageNode(energy) {
|
val cell: StorageNode = object : StorageNode(energy) {
|
||||||
override fun onNeighbour(link: Link) {
|
override fun onNeighbour(link: Link) {
|
||||||
if (link is DirectionLink) {
|
if (link is DirectionLink) {
|
||||||
@ -88,9 +82,21 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var component: ItemHandlerComponent? = null
|
||||||
|
|
||||||
init {
|
init {
|
||||||
exposeSideless(MatteryCapability.STORAGE_NODE, cell)
|
exposeEnergyGlobally(energy)
|
||||||
exposeAllSidesExcept(RelativeSide.FRONT, MatteryCapability.STORAGE_NODE, cell)
|
savetable(::energy, ENERGY_KEY)
|
||||||
|
exposeGlobally(MatteryCapability.STORAGE_NODE, cell) { it != RelativeSide.FRONT }
|
||||||
|
|
||||||
|
side(RelativeSide.FRONT).track(ForgeCapabilities.ITEM_HANDLER).addListener {
|
||||||
|
component?.let(cell::removeStorageComponent)
|
||||||
|
component = if (it.isPresent) {
|
||||||
|
ItemHandlerComponent(it.orThrow()).also(cell::addStorageComponent)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val filter = ItemFilter(MAX_FILTERS) { _, _, _ ->
|
val filter = ItemFilter(MAX_FILTERS) { _, _, _ ->
|
||||||
@ -105,12 +111,8 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
|||||||
override fun setLevel(level: Level) {
|
override fun setLevel(level: Level) {
|
||||||
super.setLevel(level)
|
super.setLevel(level)
|
||||||
cell.discover(this)
|
cell.discover(this)
|
||||||
tickList.once(this::checkSurroundings)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private var neighbour: LazyOptional<IItemHandler>? = null
|
|
||||||
private var component: ItemHandlerComponent? = null
|
|
||||||
|
|
||||||
override fun tick() {
|
override fun tick() {
|
||||||
super.tick()
|
super.tick()
|
||||||
component?.scan()
|
component?.scan()
|
||||||
@ -122,37 +124,6 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
|||||||
cell.isValid = false
|
cell.isValid = false
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkSurroundings() {
|
|
||||||
if (isRemoved)
|
|
||||||
return
|
|
||||||
|
|
||||||
val front = blockPos + blockState.getValue(BlockRotationFreedom.XZ_XY.property)
|
|
||||||
val storage = level?.getBlockEntity(front)?.getCapability(ForgeCapabilities.ITEM_HANDLER, -blockState.getValue(BlockRotationFreedom.XZ_XY.property))?.let { if (it.isPresent) it else null }
|
|
||||||
|
|
||||||
if (neighbour != storage) {
|
|
||||||
neighbour = storage
|
|
||||||
|
|
||||||
if (storage != null) {
|
|
||||||
val ref = WeakReference(this)
|
|
||||||
|
|
||||||
storage.addListener {
|
|
||||||
val self = ref.get() ?: return@addListener
|
|
||||||
|
|
||||||
if (self.neighbour === it && SERVER_IS_LIVE) {
|
|
||||||
self.checkSurroundings()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
component?.let(cell::removeStorageComponent)
|
|
||||||
component = ItemHandlerComponent(storage.orThrow())
|
|
||||||
component!!.let(cell::addStorageComponent)
|
|
||||||
} else {
|
|
||||||
component?.let(cell::removeStorageComponent)
|
|
||||||
component = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val MAX_FILTERS = 6 * 3
|
const val MAX_FILTERS = 6 * 3
|
||||||
}
|
}
|
||||||
|
@ -51,12 +51,6 @@ abstract class AbstractStorageImportExport<T>(
|
|||||||
energyValues: EnergyBalanceValues = MachinesConfig.STORAGE_INTERFACES
|
energyValues: EnergyBalanceValues = MachinesConfig.STORAGE_INTERFACES
|
||||||
) : MatteryPoweredBlockEntity(blockType, blockPos, blockState) {
|
) : MatteryPoweredBlockEntity(blockType, blockPos, blockState) {
|
||||||
val energy = WorkerEnergyStorage(::setChangedLight, energyValues)
|
val energy = WorkerEnergyStorage(::setChangedLight, energyValues)
|
||||||
|
|
||||||
init {
|
|
||||||
exposeEnergyGlobally(energy)
|
|
||||||
savetable(::energy, ENERGY_KEY)
|
|
||||||
}
|
|
||||||
|
|
||||||
val cell: StorageNode = object : StorageNode(energy) {
|
val cell: StorageNode = object : StorageNode(energy) {
|
||||||
override fun onNeighbour(link: Link) {
|
override fun onNeighbour(link: Link) {
|
||||||
if (link is DirectionLink) {
|
if (link is DirectionLink) {
|
||||||
@ -86,8 +80,9 @@ abstract class AbstractStorageImportExport<T>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
exposeSideless(MatteryCapability.STORAGE_NODE, cell)
|
exposeEnergyGlobally(energy)
|
||||||
exposeAllSidesExcept(RelativeSide.FRONT, MatteryCapability.STORAGE_NODE, cell)
|
savetable(::energy, ENERGY_KEY)
|
||||||
|
exposeGlobally(MatteryCapability.STORAGE_NODE, cell) { it != RelativeSide.FRONT }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setRemoved() {
|
override fun setRemoved() {
|
||||||
|
@ -112,26 +112,4 @@ class StorageBusBlock : RotatableMatteryBlock(), EntityBlock {
|
|||||||
): VoxelShape {
|
): VoxelShape {
|
||||||
return shapes[p_60555_]!!
|
return shapes[p_60555_]!!
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("OVERRIDE_DEPRECATION")
|
|
||||||
override fun neighborChanged(
|
|
||||||
state: BlockState,
|
|
||||||
level: Level,
|
|
||||||
pos: BlockPos,
|
|
||||||
neighbour: Block,
|
|
||||||
neighbourPos: BlockPos,
|
|
||||||
movedByPiston: Boolean
|
|
||||||
) {
|
|
||||||
super.neighborChanged(state, level, pos, neighbour, neighbourPos, movedByPiston)
|
|
||||||
|
|
||||||
if (!level.isClientSide) {
|
|
||||||
val tile = level.getBlockEntity(pos)
|
|
||||||
|
|
||||||
if (tile is StorageBusBlockEntity) {
|
|
||||||
level.oncePre {
|
|
||||||
tile.checkSurroundings()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user