From 024a25f72a9468b1cd8213dbe72dcbd4cd7ae65a Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 8 Jul 2023 23:58:41 +0700 Subject: [PATCH] Exopack charger slots --- .../otm/capability/MatteryPlayerCapability.kt | 23 +++++++++++++++++-- .../client/screen/ExoPackInventoryScreen.kt | 18 ++++++++++++--- .../mc/otm/menu/ExoPackInventoryMenu.kt | 6 +++++ .../ru/dbotthepony/mc/otm/menu/Slots.kt | 14 +++++++---- 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index e76eba2fc..0f35c3dac 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -35,6 +35,7 @@ import net.minecraft.world.phys.Vec3 import net.minecraftforge.common.ForgeHooks import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional @@ -411,6 +412,8 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial */ val exoPackEnergy = ProfiledEnergyStorage(BatteryBackedEnergyStorage(ply, synchronizer, Decimal.ZERO, ExopackConfig.ENERGY_CAPACITY, false)) + val exoPackChargeSlots = MatteryContainer(4) + init { savetables.int(::ticksIExist) savetables.int(::iteration) @@ -432,6 +435,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial savetables.stateful(::exoPackContainer, "exoSuitContainer") savetables.stateful(::androidEnergy) savetables.stateful(::exoPackEnergy) + savetables.stateful(::exoPackChargeSlots) savetables.float(::exoPackSmelterExperience) savetables.bool(::isExoPackSmeltingInstalled) } @@ -944,8 +948,23 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial if (hasExoPack) { exoPackEnergy.parent.tick() - if (!ply.isSpectator && isExoPackSmeltingInstalled) { - smelters.forEach { it.think() } + if (!ply.isSpectator) { + if (isExoPackSmeltingInstalled) + smelters.forEach { it.think() } + + if (!exoPackChargeSlots.isEmpty && exoPackEnergy.batteryLevel.isPositive) { + var available = exoPackEnergy.extractEnergy(exoPackEnergy.batteryLevel, true) + + for (item in exoPackChargeSlots) { + if (item.isNotEmpty) { + item.energy?.let { + available -= exoPackEnergy.extractEnergy(it.receiveEnergy(available, false), false) + } + + if (!available.isPositive) break + } + } + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt index ae6778d90..2c2a19585 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt @@ -191,10 +191,12 @@ class ExoPackInventoryScreen(menu: ExoPackInventoryMenu) : MatteryScreen makeSlots(container: C, initializer: (C, In return immutableList(container.containerSize) { initializer.invoke(container, it) } } -open class MatterySlot @JvmOverloads constructor(container: Container, index: Int, x: Int = 0, y: Int = 0) : Slot(container, index, x, y) { +open class MatterySlot(container: Container, index: Int, x: Int = 0, y: Int = 0) : Slot(container, index, x, y) { var ignoreSpectators = true override fun mayPickup(player: Player): Boolean { @@ -64,7 +64,7 @@ open class UserFilteredSlot(container: Container, index: Int, x: Int = 0, y: Int } } -open class MachineOutputSlot @JvmOverloads constructor(container: Container, index: Int, x: Int = 0, y: Int = 0, val onTake: () -> Unit = {}) : MatterySlot(container, index, x, y) { +open class MachineOutputSlot(container: Container, index: Int, x: Int = 0, y: Int = 0, val onTake: () -> Unit = {}) : MatterySlot(container, index, x, y) { override fun mayPlace(itemStack: ItemStack): Boolean { return false } @@ -80,13 +80,19 @@ open class MachineOutputSlot @JvmOverloads constructor(container: Container, ind } } -open class BatterySlot @JvmOverloads constructor(container: Container, index: Int, x: Int = 0, y: Int = 0) : MatterySlot(container, index, x, y) { +open class BatterySlot(container: Container, index: Int, x: Int = 0, y: Int = 0) : MatterySlot(container, index, x, y) { override fun mayPlace(itemStack: ItemStack): Boolean { return super.mayPlace(itemStack) && (itemStack.energy?.canExtract() ?: false) } } -open class MatterContainerInputSlot @JvmOverloads constructor( +open class ChargeSlot(container: Container, index: Int, x: Int = 0, y: Int = 0) : MatterySlot(container, index, x, y) { + override fun mayPlace(itemStack: ItemStack): Boolean { + return super.mayPlace(itemStack) && (itemStack.energy?.canReceive() ?: false) + } +} + +open class MatterContainerInputSlot( container: Container, index: Int, x: Int = 0,