Stitch up quantum battery code
This commit is contained in:
parent
de7f89186d
commit
d53e2286b5
@ -24,7 +24,7 @@ import ru.dbotthepony.mc.otm.saveddata.SavedCountingMap
|
|||||||
import ru.dbotthepony.mc.otm.saveddata.SavedMapDelegate
|
import ru.dbotthepony.mc.otm.saveddata.SavedMapDelegate
|
||||||
|
|
||||||
class QuantumBatteryItem : Item {
|
class QuantumBatteryItem : Item {
|
||||||
private inner class Power : IMatteryEnergyStorage, ICapabilityProvider, INBTSerializable<IntTag> {
|
private inner class Power(private val stack: ItemStack) : IMatteryEnergyStorage, ICapabilityProvider {
|
||||||
private val resolver = LazyOptional.of { this }
|
private val resolver = LazyOptional.of { this }
|
||||||
var delegate = SavedMapDelegate(ImpreciseFraction.ZERO)
|
var delegate = SavedMapDelegate(ImpreciseFraction.ZERO)
|
||||||
|
|
||||||
@ -45,23 +45,33 @@ class QuantumBatteryItem : Item {
|
|||||||
return ImpreciseFraction.ZERO
|
return ImpreciseFraction.ZERO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (delegate.parent == null && isServerThread()) {
|
||||||
|
determineQuantumLink()
|
||||||
|
|
||||||
|
if (delegate.parent == null) {
|
||||||
|
return ImpreciseFraction.ZERO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isCreative) {
|
if (isCreative) {
|
||||||
val newEnergy = (delegate.value - howMuch).moreThanZero()
|
val newEnergy = (delegate.value - howMuch).moreThanZero()
|
||||||
|
val diff = delegate.value - newEnergy
|
||||||
|
|
||||||
if (!simulate) {
|
if (!simulate) {
|
||||||
delegate.value = newEnergy
|
delegate.value = newEnergy
|
||||||
}
|
}
|
||||||
|
|
||||||
return delegate.value - newEnergy
|
return diff
|
||||||
}
|
}
|
||||||
|
|
||||||
val newEnergy = (delegate.value - howMuch.coerceAtMost(throughput!!)).moreThanZero()
|
val newEnergy = (delegate.value - howMuch.coerceAtMost(throughput!!)).moreThanZero()
|
||||||
|
val diff = delegate.value - newEnergy
|
||||||
|
|
||||||
if (!simulate) {
|
if (!simulate) {
|
||||||
delegate.value = newEnergy
|
delegate.value = newEnergy
|
||||||
}
|
}
|
||||||
|
|
||||||
return delegate.value - newEnergy
|
return diff
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun receiveEnergyOuter(howMuch: ImpreciseFraction, simulate: Boolean): ImpreciseFraction {
|
override fun receiveEnergyOuter(howMuch: ImpreciseFraction, simulate: Boolean): ImpreciseFraction {
|
||||||
@ -73,6 +83,14 @@ class QuantumBatteryItem : Item {
|
|||||||
return ImpreciseFraction.ZERO
|
return ImpreciseFraction.ZERO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (delegate.parent == null && isServerThread()) {
|
||||||
|
determineQuantumLink()
|
||||||
|
|
||||||
|
if (delegate.parent == null) {
|
||||||
|
return ImpreciseFraction.ZERO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isCreative) {
|
if (isCreative) {
|
||||||
if (!simulate) {
|
if (!simulate) {
|
||||||
delegate.value += howMuch
|
delegate.value += howMuch
|
||||||
@ -82,16 +100,23 @@ class QuantumBatteryItem : Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val newEnergy = (delegate.value + howMuch.coerceAtMost(throughput!!)).coerceAtMost(capacity!!)
|
val newEnergy = (delegate.value + howMuch.coerceAtMost(throughput!!)).coerceAtMost(capacity!!)
|
||||||
|
val diff = newEnergy - delegate.value
|
||||||
|
|
||||||
if (!simulate) {
|
if (!simulate) {
|
||||||
delegate.value = newEnergy
|
delegate.value = newEnergy
|
||||||
}
|
}
|
||||||
|
|
||||||
return newEnergy - delegate.value
|
return diff
|
||||||
}
|
}
|
||||||
|
|
||||||
override val batteryLevel: ImpreciseFraction
|
override val batteryLevel: ImpreciseFraction
|
||||||
get() = delegate.value
|
get() {
|
||||||
|
if (delegate.parent == null) {
|
||||||
|
determineQuantumLink()
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.value
|
||||||
|
}
|
||||||
|
|
||||||
override val maxBatteryLevel: ImpreciseFraction
|
override val maxBatteryLevel: ImpreciseFraction
|
||||||
get() = capacity ?: (batteryLevel + ImpreciseFraction.LONG_MAX_VALUE)
|
get() = capacity ?: (batteryLevel + ImpreciseFraction.LONG_MAX_VALUE)
|
||||||
@ -107,23 +132,26 @@ class QuantumBatteryItem : Item {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun serializeNBT(): IntTag {
|
private fun determineQuantumLink() {
|
||||||
if (isServerThread() && delegate.parent == null) {
|
if (delegate.parent == null && isServerThread()) {
|
||||||
val old = delegate
|
val existing = stack.tag?.getInt("link_id")
|
||||||
delegate = saveData!!.factorize()
|
|
||||||
delegate.value = old.value
|
if (existing == null) {
|
||||||
|
val old = delegate
|
||||||
|
delegate = saveData!!.factorize()
|
||||||
|
delegate.value = old.value
|
||||||
|
stack.tagNotNull["link_id"] = delegate.index
|
||||||
|
} else {
|
||||||
|
delegate = saveData?.computeIfAbsent(existing) ?: SavedMapDelegate(null, existing, delegate.value)
|
||||||
|
}
|
||||||
|
} else if (!isServerThread()) {
|
||||||
|
// client
|
||||||
|
val existing = stack.tag?.getInt("link_id") ?: return
|
||||||
|
|
||||||
|
if (existing != delegate.index) {
|
||||||
|
delegate = SavedMapDelegate(delegate.parent, existing, delegate.value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return IntTag.valueOf(if (delegate.parent == null) Int.MIN_VALUE else delegate.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun deserializeNBT(nbt: IntTag) {
|
|
||||||
if (nbt.asInt == Int.MIN_VALUE) {
|
|
||||||
delegate = SavedMapDelegate(ImpreciseFraction.ZERO)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate = saveData?.computeIfAbsent(nbt.asInt) ?: SavedMapDelegate(null, nbt.asInt, delegate.value)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +188,7 @@ class QuantumBatteryItem : Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun initCapabilities(stack: ItemStack, nbt: CompoundTag?): ICapabilityProvider {
|
override fun initCapabilities(stack: ItemStack, nbt: CompoundTag?): ICapabilityProvider {
|
||||||
return Power()
|
return Power(stack)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun appendHoverText(
|
override fun appendHoverText(
|
||||||
|
Loading…
Reference in New Issue
Block a user