Exopack charger slots

This commit is contained in:
DBotThePony 2023-07-08 23:58:41 +07:00
parent 2e4cb8b3f9
commit 024a25f72a
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 52 additions and 9 deletions

View File

@ -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
}
}
}
}
}

View File

@ -191,10 +191,12 @@ class ExoPackInventoryScreen(menu: ExoPackInventoryMenu) : MatteryScreen<ExoPack
}
}
val chargeWidth = HorizontalPowerGaugePanel.GAUGE_BACKGROUND_TALL.width + AbstractSlotPanel.SIZE + 4f + ProgressGaugePanel.GAUGE_BACKGROUND.width
val chargeStrip = BackgroundPanel.paddedCenter(this, frame, frame.width / 2f - chargeWidth / 2f, frame.height + 2f, chargeWidth, AbstractSlotPanel.SIZE)
val chargeWidth = HorizontalPowerGaugePanel.GAUGE_BACKGROUND_TALL.width + AbstractSlotPanel.SIZE + 6f + ProgressGaugePanel.GAUGE_BACKGROUND.width * 2f
val chargeStrip = BackgroundPanel.paddedCenter(this, frame, frame.width - chargeWidth - 6f, frame.height + 2f, chargeWidth, AbstractSlotPanel.SIZE)
val chargeStrip2 = BackgroundPanel.paddedCenter(this, frame, frame.width + 2f, frame.height - AbstractSlotPanel.SIZE * 3f + 2f, AbstractSlotPanel.SIZE, AbstractSlotPanel.SIZE * 4f)
chargeStrip.customDock { chargeStrip.setPos(frame.width / 2f - chargeWidth / 2f, frame.height + 2f) }
chargeStrip.customDock { chargeStrip.setPos(frame.width - chargeWidth - 6f, frame.height + 2f) }
chargeStrip2.customDock { chargeStrip2.setPos(frame.width + 2f, frame.height - AbstractSlotPanel.SIZE * 3f + 2f) }
BatterySlotPanel(this, chargeStrip, menu.exoPackPowerSlot).also {
it.dock = Dock.LEFT
@ -211,6 +213,16 @@ class ExoPackInventoryScreen(menu: ExoPackInventoryMenu) : MatteryScreen<ExoPack
it.dockLeft = 2f
}
SpritePanel(this, chargeStrip, ProgressGaugePanel.GAUGE_BACKGROUND).also {
it.dock = Dock.LEFT
it.dockLeft = 2f
it.dockResize = DockResizeMode.NONE
}
for (slot in menu.exoPackChargeSlots) {
SlotPanel(this, chargeStrip2, slot).dock = Dock.BOTTOM
}
scrollPanel.dock = Dock.RIGHT
scrollPanel.setDockMargin(right = 3f)

View File

@ -137,10 +137,16 @@ class ExoPackInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen
val furnaceMenuOpenState = InstantBooleanInput(this)
val exoPackChargeSlots = makeSlots(capability.exoPackChargeSlots, ::ChargeSlot)
init {
addStorageSlot(furnaceInputs, condition = furnaceMenuOpenState)
addStorageSlot(furnaceOutputs, condition = furnaceMenuOpenState)
addSlot(exoPackPowerSlot)
mapQuickMoveToInventory(exoPackPowerSlot)
exoPackChargeSlots.forEach { addSlot(it); mapQuickMoveToInventory(it) }
}
private var isRemoved = false

View File

@ -19,7 +19,7 @@ inline fun <C : Container, S : Slot> 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,