From e58b5b725e88881330c41cda63a5f9635002cc79 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 23 Dec 2021 23:38:09 +0700 Subject: [PATCH] Fix compact minus of fractions were actually adding --- .../entity/BlockEntityMatterDecomposer.java | 2 +- .../worker/BlockEntityMatteryWorker.java | 1 + .../otm/block/entity/worker/MachineJob.java | 2 +- .../ru/dbotthepony/mc/otm/core/Fraction.kt | 2 +- .../dbotthepony/mc/otm/tests/FractionTests.kt | 34 +++++++++++++++++++ 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java index baa2c4af4..0163bccec 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java @@ -147,7 +147,7 @@ public class BlockEntityMatterDecomposer extends BlockEntityMatteryWorker implem if (MatterRegistry.canDecompose(copy)) { var matter_value = MatterRegistry.getMatterValue(copy); - if (!matter_value.equals(BigDecimal.ZERO) && matter.canReceiveAll(matter_value)) { + if (!matter_value.equals(Fraction.ZERO) && matter.canReceiveAll(matter_value)) { stack.shrink(1); return new MachineJob(copy, matter_value.toDouble() * 12_500d); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java index e15d66c3f..f6d16a83d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered; import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.core.Fraction; diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java index 3d8278387..da86f3f3f 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java @@ -30,7 +30,7 @@ public record MachineJob(ItemStack stack, double ticks_processing_time, Fraction store_job.put("data", data); store_job.put("stack", stack.serializeNBT()); store_job.putDouble("ticks_processing_time", ticks_processing_time); - store_job.putString("power_consumption_multiplier", power_consumption_multiplier.toString()); + store_job.put("power_consumption_multiplier", power_consumption_multiplier.serializeNBT()); return store_job; } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Fraction.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Fraction.kt index 8240ef093..62d714e8a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Fraction.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Fraction.kt @@ -190,7 +190,7 @@ data class Fraction @JvmOverloads constructor(@JvmField val value: BigInteger, @ fun minusCompact(other: Fraction): Fraction { if (divisor == other.divisor) { if (divisor == BigInteger.ONE) - return Fraction(value + other.value) + return Fraction(value - other.value) val new = value - other.value val mod = new % divisor diff --git a/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FractionTests.kt b/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FractionTests.kt index 5d9715c69..0377bc603 100644 --- a/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FractionTests.kt +++ b/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FractionTests.kt @@ -118,4 +118,38 @@ object FractionTests { assert(value.compareTo(Fraction.deserializeNBT(serialized)) == 0) } + + @Test + @DisplayName("Fraction inaccurate representation") + fun inaccurate() { + var value = 1.1 + var frac = Fraction(value) + + assert(frac.toDouble() == value) { "$value != $frac as (${frac.toDouble()})" } + + value = 1.45 + frac = Fraction(value) + + assert(frac.toDouble() == value) { "$value != $frac as (${frac.toDouble()})" } + + value = -1.0 + frac = Fraction(value) + + assert(frac.toDouble() == value) { "$value != $frac as (${frac.toDouble()})" } + + value = -254.66 + frac = Fraction(value) + + assert(frac.toDouble() == value) { "$value != $frac as (${frac.toDouble()})" } + + value = 94.949494 + frac = Fraction(value) + + assert(frac.toDouble() == value) { "$value != $frac as (${frac.toDouble()})" } + + value = 1.0 / 3 + frac = Fraction(value) + + assert(frac.toDouble() == value) { "$value != $frac as (${frac.toDouble()})" } + } }