Documentation and some refactoring related to matter capability
This commit is contained in:
parent
16ea829514
commit
f68ce78bf9
@ -7,7 +7,6 @@ import net.minecraftforge.event.entity.living.LivingHurtEvent
|
|||||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||||
import ru.dbotthepony.mc.otm.core.set
|
import ru.dbotthepony.mc.otm.core.set
|
||||||
import ru.dbotthepony.mc.otm.network.FieldSynchronizer
|
import ru.dbotthepony.mc.otm.network.FieldSynchronizer
|
||||||
import java.io.DataInputStream
|
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
|
||||||
abstract class AndroidFeature(val type: AndroidFeatureType<*>, val android: MatteryPlayerCapability) : INBTSerializable<CompoundTag> {
|
abstract class AndroidFeature(val type: AndroidFeatureType<*>, val android: MatteryPlayerCapability) : INBTSerializable<CompoundTag> {
|
||||||
|
@ -22,11 +22,11 @@ import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
|||||||
import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock
|
import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock
|
||||||
import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity
|
import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity
|
||||||
import ru.dbotthepony.mc.otm.block.entity.WorkerState
|
import ru.dbotthepony.mc.otm.block.entity.WorkerState
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterDirection
|
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl
|
import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainerHooks
|
import ru.dbotthepony.mc.otm.container.MatteryContainerHooks
|
||||||
@ -114,9 +114,9 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
val matter: MatterHandlerImpl = object : MatterHandlerImpl(this::setChangedLight, MatterDirection.BIDIRECTIONAL, ::CAPACITY) {
|
val matter: MatterHandlerImpl = object : MatterHandlerImpl(this::setChangedLight, FlowDirection.BI_DIRECTIONAL, ::CAPACITY) {
|
||||||
override val direction: MatterDirection get() {
|
override val matterDirection: FlowDirection get() {
|
||||||
return if (this@MatterBottlerBlockEntity.isBottling) MatterDirection.RECEIVE else MatterDirection.EXTRACT
|
return if (this@MatterBottlerBlockEntity.isBottling) FlowDirection.INPUT else FlowDirection.OUTPUT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,7 +233,7 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
|
|||||||
var capability: IMatterHandler? = null
|
var capability: IMatterHandler? = null
|
||||||
val align = if (isBottling) 0 else 3
|
val align = if (isBottling) 0 else 3
|
||||||
var work_slot = -1
|
var work_slot = -1
|
||||||
val unexpectedDirection = if (isBottling) MatterDirection.EXTRACT else MatterDirection.RECEIVE
|
val unexpectedDirection = if (isBottling) FlowDirection.OUTPUT else FlowDirection.INPUT
|
||||||
|
|
||||||
for (i in align until align + 3) {
|
for (i in align until align + 3) {
|
||||||
val itemStack = container.getItem(i)
|
val itemStack = container.getItem(i)
|
||||||
@ -241,7 +241,7 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
|
|||||||
if (!itemStack.isEmpty) {
|
if (!itemStack.isEmpty) {
|
||||||
val cap = itemStack.getCapability(MatteryCapability.MATTER).orNull() ?: continue
|
val cap = itemStack.getCapability(MatteryCapability.MATTER).orNull() ?: continue
|
||||||
|
|
||||||
if (cap.direction !== unexpectedDirection) {
|
if (cap.matterDirection != unexpectedDirection) {
|
||||||
if (this.isBottling && cap.missingMatter > Decimal.ZERO || !this.isBottling && cap.storedMatter > Decimal.ZERO) {
|
if (this.isBottling && cap.missingMatter > Decimal.ZERO || !this.isBottling && cap.storedMatter > Decimal.ZERO) {
|
||||||
work_stack = itemStack
|
work_stack = itemStack
|
||||||
capability = cap
|
capability = cap
|
||||||
|
@ -19,9 +19,9 @@ import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
|||||||
import ru.dbotthepony.mc.otm.block.BatteryBankBlock
|
import ru.dbotthepony.mc.otm.block.BatteryBankBlock
|
||||||
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
||||||
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
|
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterDirection
|
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||||
import ru.dbotthepony.mc.otm.core.Decimal
|
import ru.dbotthepony.mc.otm.core.Decimal
|
||||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||||
@ -136,9 +136,8 @@ class MatterCapacitorBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState)
|
|||||||
return summ
|
return summ
|
||||||
}
|
}
|
||||||
|
|
||||||
override val direction: MatterDirection get() {
|
override val matterDirection: FlowDirection
|
||||||
return MatterDirection.BIDIRECTIONAL
|
get() = FlowDirection.BI_DIRECTIONAL
|
||||||
}
|
|
||||||
|
|
||||||
private var resolver = LazyOptional.of { this }
|
private var resolver = LazyOptional.of { this }
|
||||||
|
|
||||||
|
@ -20,11 +20,11 @@ import net.minecraftforge.items.IItemHandler
|
|||||||
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
||||||
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
||||||
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
|
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterDirection
|
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl
|
import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainerHooks
|
import ru.dbotthepony.mc.otm.container.MatteryContainerHooks
|
||||||
@ -128,7 +128,7 @@ class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState)
|
|||||||
private var valid = true
|
private var valid = true
|
||||||
override val matterNode = Graph6Node<IMatterGraphNode>(this)
|
override val matterNode = Graph6Node<IMatterGraphNode>(this)
|
||||||
|
|
||||||
val matter = MatterHandlerImpl(this::setChangedLight, MatterDirection.EXTRACT, ::CAPACITY)
|
val matter = MatterHandlerImpl(this::setChangedLight, FlowDirection.OUTPUT, ::CAPACITY)
|
||||||
|
|
||||||
private var resolverMatter = LazyOptional.of { matter }
|
private var resolverMatter = LazyOptional.of { matter }
|
||||||
private var resolverNode = LazyOptional.of { this }
|
private var resolverNode = LazyOptional.of { this }
|
||||||
|
@ -20,11 +20,11 @@ import net.minecraftforge.common.util.LazyOptional
|
|||||||
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
||||||
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
||||||
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
|
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterDirection
|
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl
|
import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainerHooks
|
import ru.dbotthepony.mc.otm.container.MatteryContainerHooks
|
||||||
@ -75,7 +75,7 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
|
|
||||||
val matter = MatterHandlerImpl(
|
val matter = MatterHandlerImpl(
|
||||||
this::matterLevelUpdated,
|
this::matterLevelUpdated,
|
||||||
MatterDirection.EXTRACT,
|
FlowDirection.OUTPUT,
|
||||||
::CAPACITY
|
::CAPACITY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ import net.minecraftforge.common.util.LazyOptional
|
|||||||
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
||||||
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
import ru.dbotthepony.mc.otm.block.IDroppableContainer
|
||||||
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
|
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
|
||||||
@ -104,7 +105,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
|
|||||||
|
|
||||||
val matter = MatterHandlerImpl(
|
val matter = MatterHandlerImpl(
|
||||||
this::matterLevelUpdated,
|
this::matterLevelUpdated,
|
||||||
MatterDirection.RECEIVE,
|
FlowDirection.INPUT,
|
||||||
::MATTER_CAPACITY
|
::MATTER_CAPACITY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,5 +1,32 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability
|
package ru.dbotthepony.mc.otm.capability
|
||||||
|
|
||||||
enum class FlowDirection {
|
import java.util.function.Predicate
|
||||||
INPUT, OUTPUT, BI_DIRECTIONAL
|
|
||||||
|
/**
|
||||||
|
* Represents possible flow direction, both for matter and for energy
|
||||||
|
*/
|
||||||
|
enum class FlowDirection(val input: Boolean, val output: Boolean) : Predicate<FlowDirection> {
|
||||||
|
/**
|
||||||
|
* Can only be inputted (consumer)
|
||||||
|
*/
|
||||||
|
INPUT(true, false),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can only be outputted/transmitted (producer)
|
||||||
|
*/
|
||||||
|
OUTPUT(false, true),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can both consume and produce (capacitor)
|
||||||
|
*/
|
||||||
|
BI_DIRECTIONAL(true, true),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Why would you want to use this
|
||||||
|
*/
|
||||||
|
NONE(false, false);
|
||||||
|
|
||||||
|
override fun test(t: FlowDirection): Boolean {
|
||||||
|
return t === this || (!input || t.input) && (!output || t.output)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android
|
package ru.dbotthepony.mc.otm.capability
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
|
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
|
||||||
import net.minecraft.ChatFormatting
|
import net.minecraft.ChatFormatting
|
||||||
@ -44,9 +44,7 @@ import ru.dbotthepony.mc.otm.android.AndroidResearch
|
|||||||
import ru.dbotthepony.mc.otm.android.AndroidResearchManager
|
import ru.dbotthepony.mc.otm.android.AndroidResearchManager
|
||||||
import ru.dbotthepony.mc.otm.android.AndroidResearchType
|
import ru.dbotthepony.mc.otm.android.AndroidResearchType
|
||||||
import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature
|
import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.energy.AndroidPowerSource
|
||||||
import ru.dbotthepony.mc.otm.capability.UUIDIntModifiersMap
|
|
||||||
import ru.dbotthepony.mc.otm.capability.matteryPlayer
|
|
||||||
import ru.dbotthepony.mc.otm.client.minecraft
|
import ru.dbotthepony.mc.otm.client.minecraft
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||||
import ru.dbotthepony.mc.otm.container.stream
|
import ru.dbotthepony.mc.otm.container.stream
|
@ -1,4 +1,4 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android
|
package ru.dbotthepony.mc.otm.capability.energy
|
||||||
|
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
@ -6,7 +6,6 @@ import net.minecraft.world.entity.player.Player
|
|||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||||
import net.minecraftforge.common.util.INBTSerializable
|
import net.minecraftforge.common.util.INBTSerializable
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.IMatteryEnergyStorage
|
|
||||||
import ru.dbotthepony.mc.otm.capability.extractEnergy
|
import ru.dbotthepony.mc.otm.capability.extractEnergy
|
||||||
import ru.dbotthepony.mc.otm.capability.receiveEnergy
|
import ru.dbotthepony.mc.otm.capability.receiveEnergy
|
||||||
import ru.dbotthepony.mc.otm.core.Decimal
|
import ru.dbotthepony.mc.otm.core.Decimal
|
@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.capability.matter
|
|||||||
|
|
||||||
import net.minecraftforge.common.capabilities.ICapabilityProvider
|
import net.minecraftforge.common.capabilities.ICapabilityProvider
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.core.Decimal
|
import ru.dbotthepony.mc.otm.core.Decimal
|
||||||
import ru.dbotthepony.mc.otm.core.RGBAColor
|
import ru.dbotthepony.mc.otm.core.RGBAColor
|
||||||
import ru.dbotthepony.mc.otm.core.orNull
|
import ru.dbotthepony.mc.otm.core.orNull
|
||||||
@ -14,12 +15,20 @@ interface IMatterHandler {
|
|||||||
val canSetMatterLevel: Boolean get() = true
|
val canSetMatterLevel: Boolean get() = true
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* How much matter (estimated) is stored in this object. Why estimated? Because some objects can be bottomless.
|
||||||
|
*
|
||||||
* Implementations are free to throw [UnsupportedOperationException] if setting battery level is not supported
|
* Implementations are free to throw [UnsupportedOperationException] if setting battery level is not supported
|
||||||
* due to technical complications (in this case, [canSetMatterLevel] MUST be false)
|
* due to technical complications (in this case, [canSetMatterLevel] MUST be false)
|
||||||
*
|
*
|
||||||
* @throws [UnsupportedOperationException]
|
* @throws [UnsupportedOperationException]
|
||||||
*/
|
*/
|
||||||
var storedMatter: Decimal
|
var storedMatter: Decimal
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How much matter (estimated) can this object hold. Why estimated? Because some objects can be bottomless.
|
||||||
|
*
|
||||||
|
* **DO NOT use this to determine "how much stuff is missing", use [missingMatter] instead!**
|
||||||
|
*/
|
||||||
val maxStoredMatter: Decimal
|
val maxStoredMatter: Decimal
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,22 +51,71 @@ interface IMatterHandler {
|
|||||||
storedMatter = maxStoredMatter
|
storedMatter = maxStoredMatter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make this object receive matter, from outside world.
|
||||||
|
*
|
||||||
|
* Call this if you don't own the object in question.
|
||||||
|
*
|
||||||
|
* @return matter accepted
|
||||||
|
*/
|
||||||
fun receiveMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal
|
fun receiveMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make this object receive matter, from inside world.
|
||||||
|
*
|
||||||
|
* Call this if you DO own the object in question.
|
||||||
|
*
|
||||||
|
* Nothing stops you from calling this from outside world, however, this will most likely
|
||||||
|
* lead to bugs, use [receiveMatterOuter] in this case instead. Methods were separated (and inside interface) for ease of use.
|
||||||
|
*
|
||||||
|
* Don't try to hammer nails with a screwdriver.
|
||||||
|
*
|
||||||
|
* @return matter accepted
|
||||||
|
*/
|
||||||
fun receiveMatterInner(howMuch: Decimal, simulate: Boolean): Decimal
|
fun receiveMatterInner(howMuch: Decimal, simulate: Boolean): Decimal
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make this object extract matter from itself, from outside world.
|
||||||
|
*
|
||||||
|
* Call this if you don't own the object in question.
|
||||||
|
*
|
||||||
|
* @return matter extracted
|
||||||
|
*/
|
||||||
fun extractMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal
|
fun extractMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make this object extract matter from itself, from inside world.
|
||||||
|
*
|
||||||
|
* Call this if you DO own the object in question.
|
||||||
|
*
|
||||||
|
* Nothing stops you from calling this from outside world, however, this will most likely
|
||||||
|
* lead to bugs, use [extractMatterOuter] in this case instead. Methods were separated (and inside interface) for ease of use.
|
||||||
|
*
|
||||||
|
* Don't try to hammer nails with a screwdriver.
|
||||||
|
*
|
||||||
|
* @return matter extracted
|
||||||
|
*/
|
||||||
fun extractMatterInner(howMuch: Decimal, simulate: Boolean): Decimal
|
fun extractMatterInner(howMuch: Decimal, simulate: Boolean): Decimal
|
||||||
|
|
||||||
val direction: MatterDirection
|
/**
|
||||||
|
* How much matter (estimated) is missing in this object. Why estimated? Because some objects can be bottomless.
|
||||||
|
*
|
||||||
|
* Use this to determine whenever you need an estimate on how much matter this object can accept, **and do not implement [maxStoredMatter] - [storedMatter] logic by yourself**.
|
||||||
|
*/
|
||||||
val missingMatter: Decimal
|
val missingMatter: Decimal
|
||||||
get() = maxStoredMatter.minus(storedMatter).moreThanZero()
|
get() = maxStoredMatter.minus(storedMatter).moreThanZero()
|
||||||
|
|
||||||
val allowsExtract: Boolean
|
/**
|
||||||
get() = direction != MatterDirection.RECEIVE
|
* Which direction does matter flows
|
||||||
|
*/
|
||||||
val allowsReceive: Boolean
|
val matterDirection: FlowDirection
|
||||||
get() = direction != MatterDirection.EXTRACT
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline val IMatterHandler.canExtractMatter: Boolean
|
||||||
|
get() = matterDirection.output
|
||||||
|
inline val IMatterHandler.canReceiveMatter: Boolean
|
||||||
|
get() = matterDirection.input
|
||||||
|
|
||||||
fun IMatterHandler.getBarWidth(): Int {
|
fun IMatterHandler.getBarWidth(): Int {
|
||||||
return ((storedMatter / maxStoredMatter).toFloat().coerceAtLeast(0f).coerceAtMost(1f) * 13f).roundToInt()
|
return ((storedMatter / maxStoredMatter).toFloat().coerceAtLeast(0f).coerceAtMost(1f) * 13f).roundToInt()
|
||||||
}
|
}
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.matter
|
|
||||||
|
|
||||||
enum class MatterDirection { RECEIVE, EXTRACT, BIDIRECTIONAL }
|
|
@ -5,19 +5,20 @@ import net.minecraftforge.common.util.INBTSerializable
|
|||||||
import net.minecraftforge.common.util.LazyOptional
|
import net.minecraftforge.common.util.LazyOptional
|
||||||
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
import ru.dbotthepony.mc.otm.ConciseBalanceValues
|
||||||
import ru.dbotthepony.mc.otm.VerboseBalanceValues
|
import ru.dbotthepony.mc.otm.VerboseBalanceValues
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.core.Decimal
|
import ru.dbotthepony.mc.otm.core.Decimal
|
||||||
import ru.dbotthepony.mc.otm.core.set
|
import ru.dbotthepony.mc.otm.core.set
|
||||||
|
|
||||||
open class MatterHandlerImpl @JvmOverloads constructor(
|
open class MatterHandlerImpl @JvmOverloads constructor(
|
||||||
protected val listener: Runnable?,
|
protected val listener: Runnable?,
|
||||||
override val direction: MatterDirection,
|
override val matterDirection: FlowDirection,
|
||||||
protected val maxStoredMatterSupplier: () -> Decimal,
|
protected val maxStoredMatterSupplier: () -> Decimal,
|
||||||
protected val maxReceiveSupplier: () -> Decimal? = { null },
|
protected val maxReceiveSupplier: () -> Decimal? = { null },
|
||||||
protected val maxExtractSupplier: () -> Decimal? = maxReceiveSupplier
|
protected val maxExtractSupplier: () -> Decimal? = maxReceiveSupplier
|
||||||
) : IMatterHandler, INBTSerializable<CompoundTag> {
|
) : IMatterHandler, INBTSerializable<CompoundTag> {
|
||||||
constructor(
|
constructor(
|
||||||
listener: Runnable?,
|
listener: Runnable?,
|
||||||
direction: MatterDirection,
|
direction: FlowDirection,
|
||||||
maxStoredMatter: Decimal,
|
maxStoredMatter: Decimal,
|
||||||
maxReceive: Decimal? = null,
|
maxReceive: Decimal? = null,
|
||||||
maxExtract: Decimal? = null,
|
maxExtract: Decimal? = null,
|
||||||
@ -25,13 +26,13 @@ open class MatterHandlerImpl @JvmOverloads constructor(
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
listener: Runnable?,
|
listener: Runnable?,
|
||||||
direction: MatterDirection,
|
direction: FlowDirection,
|
||||||
values: ConciseBalanceValues
|
values: ConciseBalanceValues
|
||||||
) : this(listener, direction, values::capacity, values::throughput, values::throughput)
|
) : this(listener, direction, values::capacity, values::throughput, values::throughput)
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
listener: Runnable?,
|
listener: Runnable?,
|
||||||
direction: MatterDirection,
|
direction: FlowDirection,
|
||||||
values: VerboseBalanceValues
|
values: VerboseBalanceValues
|
||||||
) : this(listener, direction, values::capacity, values::receive, values::extract)
|
) : this(listener, direction, values::capacity, values::receive, values::extract)
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ open class MatterHandlerImpl @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun receiveMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal {
|
override fun receiveMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal {
|
||||||
if (direction === MatterDirection.EXTRACT)
|
if (!canReceiveMatter)
|
||||||
return Decimal.ZERO
|
return Decimal.ZERO
|
||||||
|
|
||||||
return receiveMatterInner(howMuch, simulate)
|
return receiveMatterInner(howMuch, simulate)
|
||||||
@ -88,7 +89,7 @@ open class MatterHandlerImpl @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun extractMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal {
|
override fun extractMatterOuter(howMuch: Decimal, simulate: Boolean): Decimal {
|
||||||
if (direction === MatterDirection.RECEIVE)
|
if (canExtractMatter)
|
||||||
return Decimal.ZERO
|
return Decimal.ZERO
|
||||||
|
|
||||||
return extractMatterInner(howMuch, simulate)
|
return extractMatterInner(howMuch, simulate)
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability
|
package ru.dbotthepony.mc.otm.core
|
||||||
|
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.nbt.ListTag
|
import net.minecraft.nbt.ListTag
|
||||||
import net.minecraft.nbt.Tag
|
|
||||||
import net.minecraftforge.common.util.INBTSerializable
|
import net.minecraftforge.common.util.INBTSerializable
|
||||||
import ru.dbotthepony.mc.otm.core.contains
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
/**
|
/**
|
@ -4,6 +4,7 @@ import com.google.common.collect.Streams
|
|||||||
import net.minecraft.server.level.ServerLevel
|
import net.minecraft.server.level.ServerLevel
|
||||||
import net.minecraft.world.item.Item
|
import net.minecraft.world.item.Item
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity
|
import net.minecraft.world.level.block.entity.BlockEntity
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.*
|
import ru.dbotthepony.mc.otm.capability.matter.*
|
||||||
import ru.dbotthepony.mc.otm.core.Decimal
|
import ru.dbotthepony.mc.otm.core.Decimal
|
||||||
@ -79,7 +80,7 @@ class MatterNetworkGraph : Abstract6Graph<IMatterGraphNode>(), IMatterGraphListe
|
|||||||
for (node in nodes) {
|
for (node in nodes) {
|
||||||
val matter = node.value.getMatterHandler()
|
val matter = node.value.getMatterHandler()
|
||||||
|
|
||||||
if (matter != null && matter.direction == MatterDirection.BIDIRECTIONAL) {
|
if (matter != null && matter.matterDirection == FlowDirection.BI_DIRECTIONAL) {
|
||||||
level += matter.storedMatter
|
level += matter.storedMatter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,7 +94,7 @@ class MatterNetworkGraph : Abstract6Graph<IMatterGraphNode>(), IMatterGraphListe
|
|||||||
for (node in nodes) {
|
for (node in nodes) {
|
||||||
val matter = node.value.getMatterHandler()
|
val matter = node.value.getMatterHandler()
|
||||||
|
|
||||||
if (matter != null && matter.direction == MatterDirection.BIDIRECTIONAL) {
|
if (matter != null && matter.matterDirection == FlowDirection.BI_DIRECTIONAL) {
|
||||||
level += matter.maxStoredMatter
|
level += matter.maxStoredMatter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -136,7 +137,7 @@ class MatterNetworkGraph : Abstract6Graph<IMatterGraphNode>(), IMatterGraphListe
|
|||||||
for (node in nodes) {
|
for (node in nodes) {
|
||||||
val matter = node.value.getMatterHandler()
|
val matter = node.value.getMatterHandler()
|
||||||
|
|
||||||
if (matter != null && matter.direction == MatterDirection.BIDIRECTIONAL) {
|
if (matter != null && matter.matterDirection == FlowDirection.BI_DIRECTIONAL) {
|
||||||
val value = matter.receiveMatterOuter(howMuch, simulate)
|
val value = matter.receiveMatterOuter(howMuch, simulate)
|
||||||
howMuch -= value
|
howMuch -= value
|
||||||
received += value
|
received += value
|
||||||
@ -160,7 +161,7 @@ class MatterNetworkGraph : Abstract6Graph<IMatterGraphNode>(), IMatterGraphListe
|
|||||||
for (node in nodes) {
|
for (node in nodes) {
|
||||||
val matter = node.value.getMatterHandler()
|
val matter = node.value.getMatterHandler()
|
||||||
|
|
||||||
if (matter != null && matter.direction != MatterDirection.EXTRACT) {
|
if (matter != null && matter.matterDirection != FlowDirection.OUTPUT) {
|
||||||
val value = matter.receiveMatterOuter(howMuch, simulate)
|
val value = matter.receiveMatterOuter(howMuch, simulate)
|
||||||
howMuch -= value
|
howMuch -= value
|
||||||
received += value
|
received += value
|
||||||
|
@ -3,10 +3,8 @@ package ru.dbotthepony.mc.otm.item
|
|||||||
import net.minecraft.ChatFormatting
|
import net.minecraft.ChatFormatting
|
||||||
import net.minecraft.MethodsReturnNonnullByDefault
|
import net.minecraft.MethodsReturnNonnullByDefault
|
||||||
import net.minecraft.core.Direction
|
import net.minecraft.core.Direction
|
||||||
import net.minecraft.core.NonNullList
|
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
import net.minecraft.world.item.CreativeModeTab
|
|
||||||
import net.minecraft.world.item.Item
|
import net.minecraft.world.item.Item
|
||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraft.world.item.Rarity
|
import net.minecraft.world.item.Rarity
|
||||||
@ -15,7 +13,7 @@ import net.minecraft.world.level.Level
|
|||||||
import net.minecraftforge.common.capabilities.Capability
|
import net.minecraftforge.common.capabilities.Capability
|
||||||
import net.minecraftforge.common.capabilities.ICapabilityProvider
|
import net.minecraftforge.common.capabilities.ICapabilityProvider
|
||||||
import net.minecraftforge.common.util.LazyOptional
|
import net.minecraftforge.common.util.LazyOptional
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.*
|
import ru.dbotthepony.mc.otm.capability.matter.*
|
||||||
@ -86,7 +84,7 @@ class MatterCapacitorItem : Item {
|
|||||||
return diff
|
return diff
|
||||||
}
|
}
|
||||||
|
|
||||||
override val direction = MatterDirection.BIDIRECTIONAL
|
override val matterDirection = FlowDirection.BI_DIRECTIONAL
|
||||||
}
|
}
|
||||||
|
|
||||||
private val _capacity: () -> Decimal
|
private val _capacity: () -> Decimal
|
||||||
|
@ -6,6 +6,8 @@ import net.minecraft.world.item.ItemStack
|
|||||||
import ru.dbotthepony.mc.otm.core.ImmutableList
|
import ru.dbotthepony.mc.otm.core.ImmutableList
|
||||||
import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity
|
import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
|
import ru.dbotthepony.mc.otm.capability.matter.canExtractMatter
|
||||||
|
import ru.dbotthepony.mc.otm.capability.matter.canReceiveMatter
|
||||||
import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputWidget
|
import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputWidget
|
||||||
import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget
|
import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget
|
||||||
import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget
|
import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget
|
||||||
@ -45,9 +47,9 @@ class MatterBottlerMenu @JvmOverloads constructor(
|
|||||||
val cap = p_40231_.getCapability(MatteryCapability.MATTER).orNull() ?: return false
|
val cap = p_40231_.getCapability(MatteryCapability.MATTER).orNull() ?: return false
|
||||||
|
|
||||||
if (workFlow.value) {
|
if (workFlow.value) {
|
||||||
return index < 3 && cap.allowsReceive
|
return index < 3 && cap.canReceiveMatter
|
||||||
} else {
|
} else {
|
||||||
return index >= 3 && cap.allowsExtract
|
return index >= 3 && cap.canExtractMatter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,9 @@ import net.minecraft.world.Container
|
|||||||
import net.minecraft.world.entity.player.Player
|
import net.minecraft.world.entity.player.Player
|
||||||
import net.minecraft.world.inventory.Slot
|
import net.minecraft.world.inventory.Slot
|
||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
|
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.energy
|
import ru.dbotthepony.mc.otm.capability.energy
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterDirection
|
|
||||||
import ru.dbotthepony.mc.otm.client.minecraft
|
import ru.dbotthepony.mc.otm.client.minecraft
|
||||||
import ru.dbotthepony.mc.otm.runOnClient
|
import ru.dbotthepony.mc.otm.runOnClient
|
||||||
|
|
||||||
@ -43,13 +43,12 @@ open class MatterContainerInputSlot @JvmOverloads constructor(
|
|||||||
index: Int,
|
index: Int,
|
||||||
x: Int = 0,
|
x: Int = 0,
|
||||||
y: Int = 0,
|
y: Int = 0,
|
||||||
val direction: MatterDirection = MatterDirection.BIDIRECTIONAL
|
val direction: FlowDirection = FlowDirection.BI_DIRECTIONAL
|
||||||
) : MatterySlot(container, index, x, y) {
|
) : MatterySlot(container, index, x, y) {
|
||||||
override fun mayPlace(itemStack: ItemStack): Boolean {
|
override fun mayPlace(itemStack: ItemStack): Boolean {
|
||||||
val handler = itemStack.getCapability(MatteryCapability.MATTER).resolve()
|
val handler = itemStack.getCapability(MatteryCapability.MATTER).resolve()
|
||||||
if (handler.isEmpty) return false
|
if (handler.isEmpty) return false
|
||||||
val direction = handler.get().direction
|
return super.mayPlace(itemStack) && this.direction.test(handler.get().matterDirection)
|
||||||
return super.mayPlace(itemStack) && (direction == MatterDirection.BIDIRECTIONAL || this.direction == direction)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user