From bc2c531e1fa970f5a4cfb14f58da2cc055357b02 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 3 Mar 2025 12:20:29 +0700 Subject: [PATCH] Attach CMWC random to Level class, as alternative random to be used in OTM --- .../dbotthepony/mc/otm/mixin/LevelMixin.java | 18 ++++++++++++++++++ .../dbotthepony/mc/otm/core/IMatteryWorld.kt | 16 ++++++++++++++++ .../overdrive_that_matters.mixins.json | 3 ++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java new file mode 100644 index 000000000..cee3aabab --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java @@ -0,0 +1,18 @@ +package ru.dbotthepony.mc.otm.mixin; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import ru.dbotthepony.mc.otm.core.IMatteryWorld; +import ru.dbotthepony.mc.otm.core.util.CMWCRandom; + +@Mixin(Level.class) +public abstract class LevelMixin implements IMatteryWorld { + public final RandomSource otm_random = new CMWCRandom(); + + @Override + public @NotNull RandomSource getOtmRandom() { + return otm_random; + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt new file mode 100644 index 000000000..137f222e2 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt @@ -0,0 +1,16 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.util.RandomSource +import net.minecraft.world.level.Level + +interface IMatteryWorld { + /** + * OTM provided [RandomSource], which has better statistical parameters + * + * Original Minecraft use LCG, which may show bad behavior when repeatedly sampled *a lot*, + * which is what [Level]'s random is used for. OTM provided PRNG should behave better in this scenario. + */ + val otmRandom: RandomSource +} + +val Level.otmRandom: RandomSource get() = (this as IMatteryWorld).otmRandom diff --git a/src/main/resources/overdrive_that_matters.mixins.json b/src/main/resources/overdrive_that_matters.mixins.json index 934ead87e..f317fa83a 100644 --- a/src/main/resources/overdrive_that_matters.mixins.json +++ b/src/main/resources/overdrive_that_matters.mixins.json @@ -18,7 +18,8 @@ "HopperBlockEntityMixin", "DispenserBlockEntityMixin", "GuiGraphicsMixin", - "BlockStateBaseMixin" + "BlockStateBaseMixin", + "LevelMixin" ], "client": [ "MixinGameRenderer",