From 8384cb1306113c25c3830825b1d78720dd7f3eeb Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 28 Dec 2021 22:37:22 +0700 Subject: [PATCH] Add battery slot to generator for charging --- .../entity/BlockEntityChemicalGenerator.kt | 68 +++++++++++-------- .../client/screen/ChemicalGeneratorScreen.kt | 17 ++--- .../mc/otm/menu/ChemicalGeneratorMenu.kt | 15 +++- 3 files changed, 57 insertions(+), 43 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityChemicalGenerator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityChemicalGenerator.kt index b9de3fe88..faab45d21 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityChemicalGenerator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityChemicalGenerator.kt @@ -44,7 +44,7 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti private var resolver = LazyOptional.of {energy} override fun getCapability(cap: Capability, side: Direction?): LazyOptional { - if (valid && (cap == MatteryCapability.ENERGY || cap == CapabilityEnergy.ENERGY)) + if (valid && (cap == MatteryCapability.ENERGY || cap == CapabilityEnergy.ENERGY) && side != blockState.getValue(BlockMatteryRotatable.FACING)) return resolver.cast() if (valid && cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) @@ -123,8 +123,6 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti consumers.clear() val level = level ?: return - OverdriveThatMatters.LOGGER.info("IM CALLED WOOO {}", level) - for (direction in Direction.values()) { // нельзя выталкивать энергию через перед if (direction == blockState.getValue(BlockMatteryRotatable.FACING)) @@ -149,12 +147,16 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti val container = MatteryContainer({ setChangedLight() check = true - }, 1) + }, 2) val container_handler = container.handler(fun (slot, stack): Boolean { - return ForgeHooks.getBurnTime(stack, null) > 0 + if (slot == 0) + return ForgeHooks.getBurnTime(stack, null) > 0 + + return stack.getCapability(CapabilityEnergy.ENERGY).isPresent }, fun (slot, amount, stack): Boolean { - return false + return slot == 1 && + (!stack.getCapability(CapabilityEnergy.ENERGY).isPresent || stack.getCapability(CapabilityEnergy.ENERGY).resolve().get().receiveEnergy(Int.MAX_VALUE, true) <= 0) }) override fun setBlockState(p_155251_: BlockState) { @@ -165,7 +167,7 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti } } - var power = Fraction.ZERO + private var power = Fraction.ZERO val energy = object : IMatteryEnergyStorage { override fun extractEnergyOuter(howMuch: Fraction, simulate: Boolean): Fraction { @@ -178,6 +180,7 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti if (!simulate && !extracted.isZero()) { power -= extracted check = true + setChangedLight() } return extracted @@ -191,8 +194,10 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti val new_energy = (howMuch + power).min(MAX_ENERGY) val diff = new_energy - power - if (!simulate) + if (!simulate) { power = new_energy + setChangedLight() + } return diff } @@ -210,6 +215,26 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti private var check = false + fun workWithPower(it: IEnergyStorage) { + if (it is IMatteryEnergyStorage) { + val demand = it.missingPower + val extracted = energy.extractEnergyInner(demand, true) + val received = it.receiveEnergyOuter(extracted, false) + + if (!received.isZero()) { + energy.extractEnergyInner(received, false) + } + } else { + val demand = it.receiveEnergy(Int.MAX_VALUE, true) + val extracted = energy.extractEnergyInner(demand, true) + val received = it.receiveEnergy(extracted, false) + + if (received != 0) { + energy.extractEnergyInner(received, false) + } + } + } + fun tick() { if (working_ticks > 0 && !isBlockedByRedstone) { working_ticks-- @@ -237,26 +262,15 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti if (power.isZero()) return + val item = container.getItem(1) + + if (!item.isEmpty) { + item.getCapability(CapabilityEnergy.ENERGY).ifPresent(this::workWithPower) + if (power.isZero()) return + } + for (consumer in consumers) { - consumer.ifPresent { - if (it is IMatteryEnergyStorage) { - val demand = it.missingPower - val extracted = energy.extractEnergyInner(demand, true) - val received = it.receiveEnergyOuter(extracted, false) - - if (!received.isZero()) { - energy.extractEnergyInner(received, false) - } - } else { - val demand = it.receiveEnergy(Int.MAX_VALUE, true) - val extracted = energy.extractEnergyInner(demand, true) - val received = it.receiveEnergy(extracted, false) - - if (received != 0) { - energy.extractEnergyInner(received, false) - } - } - } + consumer.ifPresent(this::workWithPower) } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt index 0d2448e24..1dd3d88a8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt @@ -15,20 +15,11 @@ class ChemicalGeneratorScreen(menu: ChemicalGeneratorMenu, inventory: Inventory, override fun makeMainFrame(): FramePanel? { val frame = super.makeMainFrame() - val battery = PowerGaugePanel(this, frame, menu.energy) - battery.dock = Dock.LEFT - burn_time.parent = frame - burn_time.dock = Dock.TOP + PowerGaugePanel(this, frame, menu.energy, LEFT_MARGIN, GAUGE_TOP_WITH_SLOT) + SlotPanel(this, frame, menu.batterySlot, LEFT_MARGIN, SLOT_TOP_UNDER_GAUGE) - battery.setDockMargin(0f, 0f, 2f, 0f) - - val grid = FlexGridPanel(this, frame) - - SlotPanel(this, grid, menu.fuel_slot) - ProgressGaugePanel(this, grid, menu.progress) - - grid.dock = Dock.FILL - grid.setDockMargin(0f, 2f, 0f, 0f) + ProgressGaugePanel(this, frame, menu.progress, 63f, PROGRESS_ARROW_TOP) + SlotPanel(this, frame, menu.fuelSlot, 93f, PROGRESS_SLOT_TOP) return frame } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ChemicalGeneratorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ChemicalGeneratorMenu.kt index fe2cf55e6..dcf4e9226 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ChemicalGeneratorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ChemicalGeneratorMenu.kt @@ -4,6 +4,7 @@ import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.ItemStack import net.minecraftforge.common.ForgeHooks +import net.minecraftforge.energy.CapabilityEnergy import ru.dbotthepony.mc.otm.Registry import ru.dbotthepony.mc.otm.block.entity.BlockEntityChemicalGenerator import ru.dbotthepony.mc.otm.menu.data.IntDataContainer @@ -14,19 +15,27 @@ import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget class ChemicalGeneratorMenu @JvmOverloads constructor(id: Int, inv: Inventory, tile: BlockEntityChemicalGenerator? = null) : MatteryMenu(Registry.Menus.CHEMICAL_GENERATOR, id, inv, tile) { - val container = tile?.container ?: SimpleContainer(1) - val fuel_slot = object : MatterySlot(container, 0) { + val container = tile?.container ?: SimpleContainer(2) + + val fuelSlot = object : MatterySlot(container, 0) { override fun mayPlace(p_40231_: ItemStack): Boolean { return ForgeHooks.getBurnTime(p_40231_, null) > 0 } } + val batterySlot = object : MatterySlot(container, 1) { + override fun mayPlace(p_40231_: ItemStack): Boolean { + return p_40231_.getCapability(CapabilityEnergy.ENERGY).isPresent + } + } + val progress = ProgressGaugeWidget(this) { 1f - tile!!.working_ticks.toFloat() / tile.working_ticks_total } val energy = LevelGaugeWidget(this, tile?.energy) val burn_time = IntDataContainer() init { - addSlot(fuel_slot) + addSlot(fuelSlot) + addSlot(batterySlot) addDataSlots(burn_time) addInventorySlots() }