package net.minecraft.world.level.levelgen; import com.mojang.serialization.Codec; import java.util.stream.LongStream; import net.minecraft.Util; public class Xoroshiro128PlusPlus { private long seedLo; private long seedHi; public static final Codec CODEC = Codec.LONG_STREAM .comapFlatMap( longStream -> Util.fixedSize(longStream, 2).map(ls -> new Xoroshiro128PlusPlus(ls[0], ls[1])), xoroshiro128PlusPlus -> LongStream.of(new long[]{xoroshiro128PlusPlus.seedLo, xoroshiro128PlusPlus.seedHi}) ); public Xoroshiro128PlusPlus(RandomSupport.Seed128bit seed) { this(seed.seedLo(), seed.seedHi()); } public Xoroshiro128PlusPlus(long seedLo, long seedHi) { this.seedLo = seedLo; this.seedHi = seedHi; if ((this.seedLo | this.seedHi) == 0L) { this.seedLo = -7046029254386353131L; this.seedHi = 7640891576956012809L; } } public long nextLong() { long l = this.seedLo; long m = this.seedHi; long n = Long.rotateLeft(l + m, 17) + l; m ^= l; this.seedLo = Long.rotateLeft(l, 49) ^ m ^ m << 21; this.seedHi = Long.rotateLeft(m, 28); return n; } }