Add filled matter capacitors in inventory tab

This commit is contained in:
DBotThePony 2022-10-02 23:13:24 +07:00
parent bbadfe8fb1
commit 13453511c6
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -3,8 +3,10 @@ package ru.dbotthepony.mc.otm.item
import net.minecraft.ChatFormatting
import net.minecraft.MethodsReturnNonnullByDefault
import net.minecraft.core.Direction
import net.minecraft.core.NonNullList
import net.minecraft.nbt.CompoundTag
import net.minecraft.network.chat.Component
import net.minecraft.world.item.CreativeModeTab
import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Rarity
@ -20,32 +22,29 @@ import ru.dbotthepony.mc.otm.capability.matter.*
import ru.dbotthepony.mc.otm.core.ImpreciseFraction
import ru.dbotthepony.mc.otm.core.formatMatter
import ru.dbotthepony.mc.otm.core.ifPresentK
import ru.dbotthepony.mc.otm.core.tagNotNull
import javax.annotation.ParametersAreNonnullByDefault
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
class MatterCapacitorItem : Item {
private inner class ItemMatterCapacitorCapability(private val stack: ItemStack) : ICapabilityProvider, IMatterHandler {
private inner class Matter(private val stack: ItemStack) : ICapabilityProvider, IMatterHandler {
private val resolver = LazyOptional.of<IMatterHandler> { this }
override fun <T> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> {
return if (cap === MatteryCapability.MATTER) resolver.cast() else LazyOptional.empty()
}
private fun matter(): ImpreciseFraction {
val tag = stack.orCreateTag
return if (tag.contains("matter")) {
ImpreciseFraction.deserializeNBT(tag["matter"])
} else ImpreciseFraction.ZERO
}
private fun matter(value: ImpreciseFraction) {
stack.getOrCreateTag().put("matter", value.serializeNBT())
}
override val storedMatter: ImpreciseFraction get() {
return if (isCreative) ImpreciseFraction.LONG_MAX_VALUE else matter()
}
override var storedMatter: ImpreciseFraction
get() {
val tag = stack.orCreateTag
return if (tag.contains("matter")) {
ImpreciseFraction.deserializeNBT(tag["matter"])
} else ImpreciseFraction.ZERO
}
set(value) {
stack.tagNotNull.put("matter", value.serializeNBT())
}
override val maxStoredMatter: ImpreciseFraction get() {
return capacity
@ -61,11 +60,11 @@ class MatterCapacitorItem : Item {
override fun receiveMatterInner(howMuch: ImpreciseFraction, simulate: Boolean): ImpreciseFraction {
if (isCreative) return howMuch
val new = matter().plus(howMuch.coerceAtMost(maxInput)).coerceAtMost(capacity)
val diff = new.minus(matter())
val new = storedMatter.plus(howMuch.coerceAtMost(maxInput)).coerceAtMost(capacity)
val diff = new.minus(storedMatter)
if (!simulate) {
matter(new)
storedMatter = new
}
return diff
@ -77,11 +76,11 @@ class MatterCapacitorItem : Item {
override fun extractMatterInner(howMuch: ImpreciseFraction, simulate: Boolean): ImpreciseFraction {
if (isCreative) return howMuch
val new = matter().minus(howMuch.coerceAtMost(maxOutput)).moreThanZero()
val diff = matter().minus(new)
val new = storedMatter.minus(howMuch.coerceAtMost(maxOutput)).moreThanZero()
val diff = storedMatter.minus(new)
if (!simulate) {
matter(new)
storedMatter = new
}
return diff
@ -110,6 +109,20 @@ class MatterCapacitorItem : Item {
_capacity = { ImpreciseFraction.LONG_MAX_VALUE }
}
override fun fillItemCategory(p_41391_: CreativeModeTab, p_41392_: NonNullList<ItemStack>) {
super.fillItemCategory(p_41391_, p_41392_)
if (!isCreative && allowedIn(p_41391_)) {
p_41392_.add(ItemStack(this).also {
it.getCapability(MatteryCapability.MATTER).ifPresentK {
if (it is Matter) {
it.storedMatter = it.maxStoredMatter
}
}
})
}
}
override fun isBarVisible(p_150899_: ItemStack): Boolean {
if (isCreative)
return false
@ -154,7 +167,7 @@ class MatterCapacitorItem : Item {
}
override fun initCapabilities(stack: ItemStack, nbt: CompoundTag?): ICapabilityProvider {
return ItemMatterCapacitorCapability(stack)
return Matter(stack)
}
companion object {
@ -164,4 +177,4 @@ class MatterCapacitorItem : Item {
private val INFINITE_STORAGE: Component =
TranslatableComponent("otm.item.matter.infinite").withStyle(ChatFormatting.GRAY)
}
}
}