Add battery slot to generator for charging
This commit is contained in:
parent
2d51a5e2c5
commit
8384cb1306
@ -44,7 +44,7 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti
|
|||||||
private var resolver = LazyOptional.of {energy}
|
private var resolver = LazyOptional.of {energy}
|
||||||
|
|
||||||
override fun <T : Any?> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> {
|
override fun <T : Any?> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> {
|
||||||
if (valid && (cap == MatteryCapability.ENERGY || cap == CapabilityEnergy.ENERGY))
|
if (valid && (cap == MatteryCapability.ENERGY || cap == CapabilityEnergy.ENERGY) && side != blockState.getValue(BlockMatteryRotatable.FACING))
|
||||||
return resolver.cast()
|
return resolver.cast()
|
||||||
|
|
||||||
if (valid && cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
|
if (valid && cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
|
||||||
@ -123,8 +123,6 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti
|
|||||||
consumers.clear()
|
consumers.clear()
|
||||||
val level = level ?: return
|
val level = level ?: return
|
||||||
|
|
||||||
OverdriveThatMatters.LOGGER.info("IM CALLED WOOO {}", level)
|
|
||||||
|
|
||||||
for (direction in Direction.values()) {
|
for (direction in Direction.values()) {
|
||||||
// нельзя выталкивать энергию через перед
|
// нельзя выталкивать энергию через перед
|
||||||
if (direction == blockState.getValue(BlockMatteryRotatable.FACING))
|
if (direction == blockState.getValue(BlockMatteryRotatable.FACING))
|
||||||
@ -149,12 +147,16 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti
|
|||||||
val container = MatteryContainer({
|
val container = MatteryContainer({
|
||||||
setChangedLight()
|
setChangedLight()
|
||||||
check = true
|
check = true
|
||||||
}, 1)
|
}, 2)
|
||||||
|
|
||||||
val container_handler = container.handler(fun (slot, stack): Boolean {
|
val container_handler = container.handler(fun (slot, stack): Boolean {
|
||||||
|
if (slot == 0)
|
||||||
return ForgeHooks.getBurnTime(stack, null) > 0
|
return ForgeHooks.getBurnTime(stack, null) > 0
|
||||||
|
|
||||||
|
return stack.getCapability(CapabilityEnergy.ENERGY).isPresent
|
||||||
}, fun (slot, amount, stack): Boolean {
|
}, 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) {
|
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 {
|
val energy = object : IMatteryEnergyStorage {
|
||||||
override fun extractEnergyOuter(howMuch: Fraction, simulate: Boolean): Fraction {
|
override fun extractEnergyOuter(howMuch: Fraction, simulate: Boolean): Fraction {
|
||||||
@ -178,6 +180,7 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti
|
|||||||
if (!simulate && !extracted.isZero()) {
|
if (!simulate && !extracted.isZero()) {
|
||||||
power -= extracted
|
power -= extracted
|
||||||
check = true
|
check = true
|
||||||
|
setChangedLight()
|
||||||
}
|
}
|
||||||
|
|
||||||
return extracted
|
return extracted
|
||||||
@ -191,8 +194,10 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti
|
|||||||
val new_energy = (howMuch + power).min(MAX_ENERGY)
|
val new_energy = (howMuch + power).min(MAX_ENERGY)
|
||||||
val diff = new_energy - power
|
val diff = new_energy - power
|
||||||
|
|
||||||
if (!simulate)
|
if (!simulate) {
|
||||||
power = new_energy
|
power = new_energy
|
||||||
|
setChangedLight()
|
||||||
|
}
|
||||||
|
|
||||||
return diff
|
return diff
|
||||||
}
|
}
|
||||||
@ -210,6 +215,26 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti
|
|||||||
|
|
||||||
private var check = false
|
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() {
|
fun tick() {
|
||||||
if (working_ticks > 0 && !isBlockedByRedstone) {
|
if (working_ticks > 0 && !isBlockedByRedstone) {
|
||||||
working_ticks--
|
working_ticks--
|
||||||
@ -237,26 +262,15 @@ class BlockEntityChemicalGenerator(pos: BlockPos, state: BlockState) : BlockEnti
|
|||||||
|
|
||||||
if (power.isZero()) return
|
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) {
|
for (consumer in consumers) {
|
||||||
consumer.ifPresent {
|
consumer.ifPresent(this::workWithPower)
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,20 +15,11 @@ class ChemicalGeneratorScreen(menu: ChemicalGeneratorMenu, inventory: Inventory,
|
|||||||
override fun makeMainFrame(): FramePanel? {
|
override fun makeMainFrame(): FramePanel? {
|
||||||
val frame = super.makeMainFrame()
|
val frame = super.makeMainFrame()
|
||||||
|
|
||||||
val battery = PowerGaugePanel(this, frame, menu.energy)
|
PowerGaugePanel(this, frame, menu.energy, LEFT_MARGIN, GAUGE_TOP_WITH_SLOT)
|
||||||
battery.dock = Dock.LEFT
|
SlotPanel(this, frame, menu.batterySlot, LEFT_MARGIN, SLOT_TOP_UNDER_GAUGE)
|
||||||
burn_time.parent = frame
|
|
||||||
burn_time.dock = Dock.TOP
|
|
||||||
|
|
||||||
battery.setDockMargin(0f, 0f, 2f, 0f)
|
ProgressGaugePanel(this, frame, menu.progress, 63f, PROGRESS_ARROW_TOP)
|
||||||
|
SlotPanel(this, frame, menu.fuelSlot, 93f, PROGRESS_SLOT_TOP)
|
||||||
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)
|
|
||||||
|
|
||||||
return frame
|
return frame
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import net.minecraft.world.SimpleContainer
|
|||||||
import net.minecraft.world.entity.player.Inventory
|
import net.minecraft.world.entity.player.Inventory
|
||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraftforge.common.ForgeHooks
|
import net.minecraftforge.common.ForgeHooks
|
||||||
|
import net.minecraftforge.energy.CapabilityEnergy
|
||||||
import ru.dbotthepony.mc.otm.Registry
|
import ru.dbotthepony.mc.otm.Registry
|
||||||
import ru.dbotthepony.mc.otm.block.entity.BlockEntityChemicalGenerator
|
import ru.dbotthepony.mc.otm.block.entity.BlockEntityChemicalGenerator
|
||||||
import ru.dbotthepony.mc.otm.menu.data.IntDataContainer
|
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)
|
class ChemicalGeneratorMenu @JvmOverloads constructor(id: Int, inv: Inventory, tile: BlockEntityChemicalGenerator? = null)
|
||||||
: MatteryMenu(Registry.Menus.CHEMICAL_GENERATOR, id, inv, tile) {
|
: MatteryMenu(Registry.Menus.CHEMICAL_GENERATOR, id, inv, tile) {
|
||||||
|
|
||||||
val container = tile?.container ?: SimpleContainer(1)
|
val container = tile?.container ?: SimpleContainer(2)
|
||||||
val fuel_slot = object : MatterySlot(container, 0) {
|
|
||||||
|
val fuelSlot = object : MatterySlot(container, 0) {
|
||||||
override fun mayPlace(p_40231_: ItemStack): Boolean {
|
override fun mayPlace(p_40231_: ItemStack): Boolean {
|
||||||
return ForgeHooks.getBurnTime(p_40231_, null) > 0
|
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 progress = ProgressGaugeWidget(this) { 1f - tile!!.working_ticks.toFloat() / tile.working_ticks_total }
|
||||||
val energy = LevelGaugeWidget(this, tile?.energy)
|
val energy = LevelGaugeWidget(this, tile?.energy)
|
||||||
val burn_time = IntDataContainer()
|
val burn_time = IntDataContainer()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
addSlot(fuel_slot)
|
addSlot(fuelSlot)
|
||||||
|
addSlot(batterySlot)
|
||||||
addDataSlots(burn_time)
|
addDataSlots(burn_time)
|
||||||
addInventorySlots()
|
addInventorySlots()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user