87 lines
2.4 KiB
Java
87 lines
2.4 KiB
Java
package net.minecraft.world.level.levelgen;
|
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.util.RandomSource;
|
|
import net.minecraft.util.ThreadingDetector;
|
|
|
|
public class LegacyRandomSource implements BitRandomSource {
|
|
private static final int MODULUS_BITS = 48;
|
|
private static final long MODULUS_MASK = 281474976710655L;
|
|
private static final long MULTIPLIER = 25214903917L;
|
|
private static final long INCREMENT = 11L;
|
|
private final AtomicLong seed = new AtomicLong();
|
|
private final MarsagliaPolarGaussian gaussianSource = new MarsagliaPolarGaussian(this);
|
|
|
|
public LegacyRandomSource(long seed) {
|
|
this.setSeed(seed);
|
|
}
|
|
|
|
@Override
|
|
public RandomSource fork() {
|
|
return new LegacyRandomSource(this.nextLong());
|
|
}
|
|
|
|
@Override
|
|
public PositionalRandomFactory forkPositional() {
|
|
return new LegacyRandomSource.LegacyPositionalRandomFactory(this.nextLong());
|
|
}
|
|
|
|
@Override
|
|
public void setSeed(long seed) {
|
|
if (!this.seed.compareAndSet(this.seed.get(), (seed ^ 25214903917L) & 281474976710655L)) {
|
|
throw ThreadingDetector.makeThreadingException("LegacyRandomSource", null);
|
|
} else {
|
|
this.gaussianSource.reset();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int next(int size) {
|
|
long l = this.seed.get();
|
|
long m = l * 25214903917L + 11L & 281474976710655L;
|
|
if (!this.seed.compareAndSet(l, m)) {
|
|
throw ThreadingDetector.makeThreadingException("LegacyRandomSource", null);
|
|
} else {
|
|
return (int)(m >> 48 - size);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public double nextGaussian() {
|
|
return this.gaussianSource.nextGaussian();
|
|
}
|
|
|
|
public static class LegacyPositionalRandomFactory implements PositionalRandomFactory {
|
|
private final long seed;
|
|
|
|
public LegacyPositionalRandomFactory(long seed) {
|
|
this.seed = seed;
|
|
}
|
|
|
|
@Override
|
|
public RandomSource at(int x, int y, int z) {
|
|
long l = Mth.getSeed(x, y, z);
|
|
long m = l ^ this.seed;
|
|
return new LegacyRandomSource(m);
|
|
}
|
|
|
|
@Override
|
|
public RandomSource fromHashOf(String name) {
|
|
int i = name.hashCode();
|
|
return new LegacyRandomSource(i ^ this.seed);
|
|
}
|
|
|
|
@Override
|
|
public RandomSource fromSeed(long seed) {
|
|
return new LegacyRandomSource(seed);
|
|
}
|
|
|
|
@VisibleForTesting
|
|
@Override
|
|
public void parityConfigString(StringBuilder builder) {
|
|
builder.append("LegacyPositionalRandomFactory{").append(this.seed).append("}");
|
|
}
|
|
}
|
|
}
|