Exopack charger slots
This commit is contained in:
parent
2e4cb8b3f9
commit
024a25f72a
@ -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) {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user