diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index df10bdd9b..1d3924337 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -30,9 +30,7 @@ import ru.dbotthepony.mc.otm.matter.MatterDataKt; import ru.dbotthepony.mc.otm.matter.MatterRegistryKt; import ru.dbotthepony.mc.otm.network.MatteryNetworking; import ru.dbotthepony.mc.otm.registry.*; -import ru.dbotthepony.mc.otm.storage.ItemStackWrapper; -import ru.dbotthepony.mc.otm.storage.StorageRegistry; -import ru.dbotthepony.mc.otm.storage.StorageStackType; +import ru.dbotthepony.mc.otm.storage.*; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/DriveRackBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/DriveRackBlockEntity.kt index a8aff8b56..f98f10760 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/DriveRackBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/DriveRackBlockEntity.kt @@ -24,10 +24,7 @@ import ru.dbotthepony.mc.otm.menu.DriveRackMenu import ru.dbotthepony.mc.otm.set import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.storage.IStorageStack -import ru.dbotthepony.mc.otm.storage.ItemStackWrapper -import ru.dbotthepony.mc.otm.storage.PoweredVirtualComponent -import ru.dbotthepony.mc.otm.storage.StorageStackType +import ru.dbotthepony.mc.otm.storage.* class DriveRackBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.DRIVE_RACK, p_155229_, p_155230_) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt index 33202da11..ae4b7ad11 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt @@ -35,7 +35,7 @@ class DriveViewerMenu @JvmOverloads constructor( override fun getNetworkedItemView() = view init { - val container = if (tile != null) tile.container else SimpleContainer(1) + val container = tile?.container ?: SimpleContainer(1) driveSlot = object : MatterySlot(container, 0) { override fun mayPlace(stack: ItemStack): Boolean { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/storage/API.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/storage/API.kt index e73b9ec8e..b2a6644ed 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/storage/API.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/storage/API.kt @@ -196,3 +196,12 @@ interface IStorageTuple { class StorageTuple(override val id: UUID, override val stack: T) : IStorageTuple interface IStorageComponent : IStorageView, IStorageConsumer + +/** + * Component which (most time) proxy other components (combine their contents into single view) + */ +interface IVirtualStorageComponent : IStorageComponent, IStorageListener { + fun add(identity: IStorage) + fun remove(identity: IStorage) + fun contains(identity: IStorage): Boolean +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/storage/VirtualComponent.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/storage/VirtualComponent.kt index 4a2e09f2d..9dce73241 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/storage/VirtualComponent.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/storage/VirtualComponent.kt @@ -28,7 +28,7 @@ class RemoteTuple(val obj: T, val remote_id: UUID, val provid class LocalTuple(override val stack: T, override val id: UUID, val tuples: ArrayList>) : IStorageTuple -open class VirtualComponent(type: StorageStackType) : IStorageComponent, IStorageListener { +open class VirtualComponent(type: StorageStackType) : IVirtualStorageComponent { constructor(type: Class) : this(StorageRegistry.get(type)) override val storageType: StorageStackType = type @@ -55,7 +55,7 @@ open class VirtualComponent(type: StorageStackType) : ISto } - fun add(identity: IStorage) { + override fun add(identity: IStorage) { if (set.add(identity)) { if (identity is IStorageView) { identity.addListenerAuto(this) @@ -71,7 +71,7 @@ open class VirtualComponent(type: StorageStackType) : ISto } } - fun remove(identity: IStorage) { + override fun remove(identity: IStorage) { if (set.remove(identity)) { if (identity is IStorageView) { identity.removeListenerAuto(this) @@ -87,7 +87,7 @@ open class VirtualComponent(type: StorageStackType) : ISto } } - fun contains(identity: IStorage): Boolean { + override fun contains(identity: IStorage): Boolean { return set.contains(identity) } @@ -245,12 +245,15 @@ open class VirtualComponent(type: StorageStackType) : ISto } } -open class PoweredVirtualComponent(type: StorageStackType, val energyProvider: () -> IMatteryEnergyStorage) : VirtualComponent(type) { - constructor(type: Class, energyStorage: IMatteryEnergyStorage) : this(StorageRegistry.get(type), {energyStorage}) - constructor(type: StorageStackType, energyStorage: IMatteryEnergyStorage) : this(type, {energyStorage}) - constructor(other: IStorage, energyStorage: IMatteryEnergyStorage) : this(other.storageType.identity, energyStorage) { - add(other) - } +/** + * Adds energy demand to operations over [parent] + */ +open class PoweredComponent(open val parent: IStorageComponent, val energyProvider: () -> IMatteryEnergyStorage) : IStorageComponent { + override val storageType: StorageStackType + get() = parent.storageType + + override fun addListener(listener: IStorageListener) = parent.addListener(listener) + override fun removeListener(listener: IStorageListener) = parent.removeListener(listener) @Suppress("unchecked_cast") override fun insertStack(stack: T, simulate: Boolean): T { @@ -263,7 +266,7 @@ open class PoweredVirtualComponent(type: StorageStackType, } if (extracted == required) { - val leftover = super.insertStack(stack, simulate) + val leftover = parent.insertStack(stack, simulate) if (leftover.isEmpty) { if (!simulate) { @@ -290,7 +293,7 @@ open class PoweredVirtualComponent(type: StorageStackType, val newExtracted = energy.extractEnergyInner(newRequired, true) if (newExtracted == newRequired) { - val leftover = super.insertStack(stack, simulate) + val leftover = parent.insertStack(stack, simulate) if (leftover.isEmpty) { if (!simulate) { @@ -313,6 +316,8 @@ open class PoweredVirtualComponent(type: StorageStackType, return stack } + override fun getStack(id: UUID) = parent.getStack(id) + override fun extractStack(id: UUID, amount: ImpreciseFraction, simulate: Boolean): T { val required = storageType.energyPerOperation * amount val energy = energyProvider.invoke() @@ -323,7 +328,7 @@ open class PoweredVirtualComponent(type: StorageStackType, } if (extracted == required) { - val extractedStack = super.extractStack(id, amount, simulate) + val extractedStack = parent.extractStack(id, amount, simulate) if (extractedStack.isEmpty) { return extractedStack @@ -342,7 +347,7 @@ open class PoweredVirtualComponent(type: StorageStackType, @Suppress("name_shadowing") val amount = required / storageType.energyPerOperation - val extractedStack = super.extractStack(id, amount, simulate) + val extractedStack = parent.extractStack(id, amount, simulate) if (extractedStack.isEmpty) { return extractedStack @@ -354,4 +359,24 @@ open class PoweredVirtualComponent(type: StorageStackType, return extractedStack } + + override fun getStacks() = parent.getStacks() +} + +/** + * Adds energy demand to virtual component [parent] + */ +open class PoweredVirtualComponent(override val parent: IVirtualStorageComponent, energyProvider: () -> IMatteryEnergyStorage) + : PoweredComponent(parent, energyProvider), IVirtualStorageComponent { + constructor(parent: IVirtualStorageComponent, energy: IMatteryEnergyStorage) : this(parent, { energy }) + constructor(parent: Class, energy: IMatteryEnergyStorage) : this(VirtualComponent(parent), { energy }) + constructor(parent: StorageStackType, energy: IMatteryEnergyStorage) : this(VirtualComponent(parent), { energy }) + + override fun addStack(stack: T, id: UUID, provider: IStorageView) = parent.addStack(stack, id, provider) + override fun changeStack(stack: T, id: UUID, oldCount: ImpreciseFraction) = parent.changeStack(stack, id, oldCount) + override fun removeStack(stack: T, id: UUID) = parent.removeStack(stack, id) + + override fun add(identity: IStorage) = parent.add(identity) + override fun remove(identity: IStorage) = parent.remove(identity) + override fun contains(identity: IStorage) = parent.contains(identity) }