mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 15:49:00 +01:00
Replace SimpleRandom with (Simple)ThreadUnsafeRandom
ThreadUnsafeRandom is a random implementation that is identical to LegacyRandomSource behaviourally, but without the thread checks. SimpleThreadUnsafeRandom is ThreadUnsafeRandom except with its nextInt(int) function replaced with a faster but more biased implementation when bound is very large. Additionally, replace Level/Entity randoms with ThreadUnsafeRandom. This avoids the expensive CAS logic at the expense of losing the thread check.
This commit is contained in:
parent
0cfa6aa89a
commit
f9b1c374e4
2 changed files with 294 additions and 36 deletions
|
@ -4037,36 +4037,41 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ private MoonriseConstants() {}
|
+ private MoonriseConstants() {}
|
||||||
+
|
+
|
||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleRandom.java
|
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleThreadUnsafeRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleThreadUnsafeRandom.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleRandom.java
|
+++ b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleThreadUnsafeRandom.java
|
||||||
@@ -0,0 +0,0 @@
|
@@ -0,0 +0,0 @@
|
||||||
+package ca.spottedleaf.moonrise.common.util;
|
+package ca.spottedleaf.moonrise.common.util;
|
||||||
+
|
+
|
||||||
+import net.minecraft.world.level.levelgen.LegacyRandomSource;
|
+import net.minecraft.util.Mth;
|
||||||
|
+import net.minecraft.util.RandomSource;
|
||||||
|
+import net.minecraft.world.level.levelgen.BitRandomSource;
|
||||||
|
+import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian;
|
||||||
|
+import net.minecraft.world.level.levelgen.PositionalRandomFactory;
|
||||||
+
|
+
|
||||||
+/**
|
+/**
|
||||||
+ * Avoid costly CAS of superclass
|
+ * Avoid costly CAS of superclass + division in nextInt
|
||||||
+ */
|
+ */
|
||||||
+public final class SimpleRandom extends LegacyRandomSource {
|
+public final class SimpleThreadUnsafeRandom implements BitRandomSource {
|
||||||
+
|
+
|
||||||
+ private static final long MULTIPLIER = 25214903917L;
|
+ private static final long MULTIPLIER = 25214903917L;
|
||||||
+ private static final long ADDEND = 11L;
|
+ private static final long ADDEND = 11L;
|
||||||
+ private static final int BITS = 48;
|
+ private static final int BITS = 48;
|
||||||
+ private static final long MASK = (1L << BITS) - 1;
|
+ private static final long MASK = (1L << BITS) - 1L;
|
||||||
+
|
+
|
||||||
+ private long value;
|
+ private long value;
|
||||||
|
+ private final MarsagliaPolarGaussian gaussianSource = new MarsagliaPolarGaussian(this);
|
||||||
+
|
+
|
||||||
+ public SimpleRandom(final long seed) {
|
+ public SimpleThreadUnsafeRandom(final long seed) {
|
||||||
+ super(0L);
|
+ this.setSeed(seed);
|
||||||
+ this.value = seed;
|
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ @Override
|
+ @Override
|
||||||
+ public void setSeed(final long seed) {
|
+ public void setSeed(final long seed) {
|
||||||
+ this.value = (seed ^ MULTIPLIER) & MASK;
|
+ this.value = (seed ^ MULTIPLIER) & MASK;
|
||||||
|
+ this.gaussianSource.reset();
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ private long advanceSeed() {
|
+ private long advanceSeed() {
|
||||||
|
@ -4094,6 +4099,154 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ final long value = this.advanceSeed() >>> (BITS - Integer.SIZE);
|
+ final long value = this.advanceSeed() >>> (BITS - Integer.SIZE);
|
||||||
+ return (int)((value * (long)bound) >>> Integer.SIZE);
|
+ return (int)((value * (long)bound) >>> Integer.SIZE);
|
||||||
+ }
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public double nextGaussian() {
|
||||||
|
+ return this.gaussianSource.nextGaussian();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource fork() {
|
||||||
|
+ return new SimpleThreadUnsafeRandom(this.nextLong());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public PositionalRandomFactory forkPositional() {
|
||||||
|
+ return new SimpleRandomPositionalFactory(this.nextLong());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public static final class SimpleRandomPositionalFactory implements PositionalRandomFactory {
|
||||||
|
+
|
||||||
|
+ private final long seed;
|
||||||
|
+
|
||||||
|
+ public SimpleRandomPositionalFactory(final long seed) {
|
||||||
|
+ this.seed = seed;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public long getSeed() {
|
||||||
|
+ return this.seed;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource fromHashOf(final String string) {
|
||||||
|
+ return new SimpleThreadUnsafeRandom((long)string.hashCode() ^ this.seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource fromSeed(final long seed) {
|
||||||
|
+ return new SimpleThreadUnsafeRandom(seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource at(final int x, final int y, final int z) {
|
||||||
|
+ return new SimpleThreadUnsafeRandom(Mth.getSeed(x, y, z) ^ this.seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void parityConfigString(final StringBuilder stringBuilder) {
|
||||||
|
+ stringBuilder.append("SimpleRandomPositionalFactory{").append(this.seed).append('}');
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java
|
||||||
|
@@ -0,0 +0,0 @@
|
||||||
|
+package ca.spottedleaf.moonrise.common.util;
|
||||||
|
+
|
||||||
|
+import net.minecraft.util.Mth;
|
||||||
|
+import net.minecraft.util.RandomSource;
|
||||||
|
+import net.minecraft.world.level.levelgen.BitRandomSource;
|
||||||
|
+import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian;
|
||||||
|
+import net.minecraft.world.level.levelgen.PositionalRandomFactory;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Avoid costly CAS of superclass
|
||||||
|
+ */
|
||||||
|
+public final class ThreadUnsafeRandom implements BitRandomSource {
|
||||||
|
+
|
||||||
|
+ private static final long MULTIPLIER = 25214903917L;
|
||||||
|
+ private static final long ADDEND = 11L;
|
||||||
|
+ private static final int BITS = 48;
|
||||||
|
+ private static final long MASK = (1L << BITS) - 1L;
|
||||||
|
+
|
||||||
|
+ private long value;
|
||||||
|
+ private final MarsagliaPolarGaussian gaussianSource = new MarsagliaPolarGaussian(this);
|
||||||
|
+
|
||||||
|
+ public ThreadUnsafeRandom(final long seed) {
|
||||||
|
+ this.setSeed(seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void setSeed(final long seed) {
|
||||||
|
+ this.value = (seed ^ MULTIPLIER) & MASK;
|
||||||
|
+ this.gaussianSource.reset();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ private long advanceSeed() {
|
||||||
|
+ return this.value = ((this.value * MULTIPLIER) + ADDEND) & MASK;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public int next(final int bits) {
|
||||||
|
+ return (int)(this.advanceSeed() >>> (BITS - bits));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public int nextInt() {
|
||||||
|
+ final long seed = this.advanceSeed();
|
||||||
|
+ return (int)(seed >>> (BITS - Integer.SIZE));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public double nextGaussian() {
|
||||||
|
+ return this.gaussianSource.nextGaussian();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource fork() {
|
||||||
|
+ return new ThreadUnsafeRandom(this.nextLong());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public PositionalRandomFactory forkPositional() {
|
||||||
|
+ return new ThreadUnsafeRandomPositionalFactory(this.nextLong());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public static final class ThreadUnsafeRandomPositionalFactory implements PositionalRandomFactory {
|
||||||
|
+
|
||||||
|
+ private final long seed;
|
||||||
|
+
|
||||||
|
+ public ThreadUnsafeRandomPositionalFactory(final long seed) {
|
||||||
|
+ this.seed = seed;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public long getSeed() {
|
||||||
|
+ return this.seed;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource fromHashOf(final String string) {
|
||||||
|
+ return new ThreadUnsafeRandom((long)string.hashCode() ^ this.seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource fromSeed(final long seed) {
|
||||||
|
+ return new ThreadUnsafeRandom(seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public RandomSource at(final int x, final int y, final int z) {
|
||||||
|
+ return new ThreadUnsafeRandom(Mth.getSeed(x, y, z) ^ this.seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void parityConfigString(final StringBuilder stringBuilder) {
|
||||||
|
+ stringBuilder.append("ThreadUnsafeRandomPositionalFactory{").append(this.seed).append('}');
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java b/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java
|
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java b/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
|
|
|
@ -13,6 +13,7 @@ Currently includes:
|
||||||
- Block/Biome Palette read optimisations
|
- Block/Biome Palette read optimisations
|
||||||
- StateHolder (BlockState/FluidState) property access optimisations
|
- StateHolder (BlockState/FluidState) property access optimisations
|
||||||
- Basic Fluid property read optimisations
|
- Basic Fluid property read optimisations
|
||||||
|
- Entity/Level random replacement
|
||||||
|
|
||||||
See https://github.com/Tuinity/Moonrise
|
See https://github.com/Tuinity/Moonrise
|
||||||
|
|
||||||
|
@ -364,6 +365,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChunkSystem() {}
|
private ChunkSystem() {}
|
||||||
|
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java
|
||||||
|
+++ b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java
|
||||||
|
@@ -0,0 +0,0 @@ import net.minecraft.world.level.levelgen.PositionalRandomFactory;
|
||||||
|
/**
|
||||||
|
* Avoid costly CAS of superclass
|
||||||
|
*/
|
||||||
|
-public final class ThreadUnsafeRandom implements BitRandomSource {
|
||||||
|
+public class ThreadUnsafeRandom implements BitRandomSource { // Paper - replace random
|
||||||
|
|
||||||
|
private static final long MULTIPLIER = 25214903917L;
|
||||||
|
private static final long ADDEND = 11L;
|
||||||
diff --git a/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java b/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java
|
diff --git a/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java b/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java
|
--- a/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java
|
||||||
|
@ -26366,7 +26380,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end - rewrite chunk system
|
+ // Paper end - rewrite chunk system
|
||||||
+ // Paper start - chunk tick iteration optimisations
|
+ // Paper start - chunk tick iteration optimisations
|
||||||
+ private final ca.spottedleaf.moonrise.common.util.SimpleRandom shuffleRandom = new ca.spottedleaf.moonrise.common.util.SimpleRandom(0L);
|
+ private final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom shuffleRandom = new ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom(0L);
|
||||||
+ private boolean isChunkNearPlayer(final ChunkMap chunkMap, final ChunkPos chunkPos, final LevelChunk levelChunk) {
|
+ private boolean isChunkNearPlayer(final ChunkMap chunkMap, final ChunkPos chunkPos, final LevelChunk levelChunk) {
|
||||||
+ final ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkData chunkData = ((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemChunkHolder)((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemLevelChunk)levelChunk).moonrise$getChunkAndHolder().holder())
|
+ final ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkData chunkData = ((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemChunkHolder)((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemLevelChunk)levelChunk).moonrise$getChunkAndHolder().holder())
|
||||||
+ .moonrise$getRealChunkHolder().holderData;
|
+ .moonrise$getRealChunkHolder().holderData;
|
||||||
|
@ -27232,12 +27246,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
}
|
}
|
||||||
|
|
||||||
+ // Paper start - optimise random ticking
|
+ // Paper start - optimise random ticking
|
||||||
+ private final ca.spottedleaf.moonrise.common.util.SimpleRandom simpleRandom = new ca.spottedleaf.moonrise.common.util.SimpleRandom(0L);
|
+ private final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = new ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom(net.minecraft.world.level.levelgen.RandomSupport.generateUniqueSeed());
|
||||||
+
|
+
|
||||||
+ private void optimiseRandomTick(final LevelChunk chunk, final int tickSpeed) {
|
+ private void optimiseRandomTick(final LevelChunk chunk, final int tickSpeed) {
|
||||||
+ final LevelChunkSection[] sections = chunk.getSections();
|
+ final LevelChunkSection[] sections = chunk.getSections();
|
||||||
+ final int minSection = ca.spottedleaf.moonrise.common.util.WorldUtil.getMinSection((ServerLevel)(Object)this);
|
+ final int minSection = ca.spottedleaf.moonrise.common.util.WorldUtil.getMinSection((ServerLevel)(Object)this);
|
||||||
+ final ca.spottedleaf.moonrise.common.util.SimpleRandom simpleRandom = this.simpleRandom;
|
+ final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = this.simpleRandom;
|
||||||
+ final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294();
|
+ final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294();
|
||||||
+
|
+
|
||||||
+ final ChunkPos cpos = chunk.getPos();
|
+ final ChunkPos cpos = chunk.getPos();
|
||||||
|
@ -27284,7 +27298,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ // Paper end - optimise random ticking
|
+ // Paper end - optimise random ticking
|
||||||
+
|
+
|
||||||
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
|
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
|
||||||
+ final ca.spottedleaf.moonrise.common.util.SimpleRandom simpleRandom = this.simpleRandom; // Paper - optimise random ticking
|
+ final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = this.simpleRandom; // Paper - optimise random ticking
|
||||||
ChunkPos chunkcoordintpair = chunk.getPos();
|
ChunkPos chunkcoordintpair = chunk.getPos();
|
||||||
boolean flag = this.isRaining();
|
boolean flag = this.isRaining();
|
||||||
int j = chunkcoordintpair.getMinBlockX();
|
int j = chunkcoordintpair.getMinBlockX();
|
||||||
|
@ -28450,6 +28464,88 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
private static final int CURRENT_LEVEL = 2;
|
private static final int CURRENT_LEVEL = 2;
|
||||||
@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||||
|
|
||||||
|
// Paper start - Share random for entities to make them more random
|
||||||
|
public static RandomSource SHARED_RANDOM = new RandomRandomSource();
|
||||||
|
- private static final class RandomRandomSource extends java.util.Random implements net.minecraft.world.level.levelgen.BitRandomSource {
|
||||||
|
+ // Paper start - replace random
|
||||||
|
+ private static final class RandomRandomSource extends ca.spottedleaf.moonrise.common.util.ThreadUnsafeRandom {
|
||||||
|
+ public RandomRandomSource() {
|
||||||
|
+ this(net.minecraft.world.level.levelgen.RandomSupport.generateUniqueSeed());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public RandomRandomSource(long seed) {
|
||||||
|
+ super(seed);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // Paper end - replace random
|
||||||
|
private boolean locked = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- @Override
|
||||||
|
- public RandomSource fork() {
|
||||||
|
- return new net.minecraft.world.level.levelgen.LegacyRandomSource(this.nextLong());
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public net.minecraft.world.level.levelgen.PositionalRandomFactory forkPositional() {
|
||||||
|
- return new net.minecraft.world.level.levelgen.LegacyRandomSource.LegacyPositionalRandomFactory(this.nextLong());
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // these below are added to fix reobf issues that I don't wanna deal with right now
|
||||||
|
- @Override
|
||||||
|
- public int next(int bits) {
|
||||||
|
- return super.next(bits);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public int nextInt(int origin, int bound) {
|
||||||
|
- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(origin, bound);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public long nextLong() {
|
||||||
|
- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextLong();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public int nextInt() {
|
||||||
|
- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public int nextInt(int bound) {
|
||||||
|
- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(bound);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public boolean nextBoolean() {
|
||||||
|
- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextBoolean();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public float nextFloat() {
|
||||||
|
- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextFloat();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public double nextDouble() {
|
||||||
|
- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextDouble();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public double nextGaussian() {
|
||||||
|
- return super.nextGaussian();
|
||||||
|
- }
|
||||||
|
+ // Paper - replace random
|
||||||
|
}
|
||||||
|
// Paper end - Share random for entities to make them more random
|
||||||
|
public org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason; // Paper - Entity#getEntitySpawnReason
|
||||||
|
@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||||
return this.dimensions.makeBoundingBox(x, y, z);
|
return this.dimensions.makeBoundingBox(x, y, z);
|
||||||
}
|
}
|
||||||
// Paper end
|
// Paper end
|
||||||
|
@ -28632,22 +28728,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ if (xZero & yZero & zZero) {
|
+ if (xZero & yZero & zZero) {
|
||||||
+ return movement;
|
+ return movement;
|
||||||
+ }
|
+ }
|
||||||
|
+
|
||||||
|
+ final AABB currentBox = this.getBoundingBox();
|
||||||
|
+
|
||||||
|
+ final List<VoxelShape> potentialCollisionsVoxel = new ArrayList<>();
|
||||||
|
+ final List<AABB> potentialCollisionsBB = new ArrayList<>();
|
||||||
|
|
||||||
- List<VoxelShape> list1 = Entity.collectColliders(this, this.level, list, axisalignedbb2);
|
- List<VoxelShape> list1 = Entity.collectColliders(this, this.level, list, axisalignedbb2);
|
||||||
- float f = (float) vec3d1.y;
|
- float f = (float) vec3d1.y;
|
||||||
- float[] afloat = Entity.collectCandidateStepUpHeights(axisalignedbb1, list1, this.maxUpStep(), f);
|
- float[] afloat = Entity.collectCandidateStepUpHeights(axisalignedbb1, list1, this.maxUpStep(), f);
|
||||||
- float[] afloat1 = afloat;
|
- float[] afloat1 = afloat;
|
||||||
- int i = afloat.length;
|
- int i = afloat.length;
|
||||||
+ final AABB currentBox = this.getBoundingBox();
|
|
||||||
|
|
||||||
- for (int j = 0; j < i; ++j) {
|
|
||||||
- float f1 = afloat1[j];
|
|
||||||
- Vec3 vec3d2 = Entity.collideWithShapes(new Vec3(movement.x, (double) f1, movement.z), axisalignedbb1, list1);
|
|
||||||
+ final List<VoxelShape> potentialCollisionsVoxel = new ArrayList<>();
|
|
||||||
+ final List<AABB> potentialCollisionsBB = new ArrayList<>();
|
|
||||||
|
|
||||||
- if (vec3d2.horizontalDistanceSqr() > vec3d1.horizontalDistanceSqr()) {
|
|
||||||
- double d0 = axisalignedbb.minY - axisalignedbb1.minY;
|
|
||||||
+ final AABB initialCollisionBox;
|
+ final AABB initialCollisionBox;
|
||||||
+ if (xZero & zZero) {
|
+ if (xZero & zZero) {
|
||||||
+ // note: xZero & zZero -> collision on x/z == 0 -> no step height calculation
|
+ // note: xZero & zZero -> collision on x/z == 0 -> no step height calculation
|
||||||
|
@ -28658,20 +28749,25 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ initialCollisionBox = currentBox.expandTowards(movement);
|
+ initialCollisionBox = currentBox.expandTowards(movement);
|
||||||
+ }
|
+ }
|
||||||
|
|
||||||
- return vec3d2.add(0.0D, -d0, 0.0D);
|
- for (int j = 0; j < i; ++j) {
|
||||||
- }
|
- float f1 = afloat1[j];
|
||||||
|
- Vec3 vec3d2 = Entity.collideWithShapes(new Vec3(movement.x, (double) f1, movement.z), axisalignedbb1, list1);
|
||||||
+ final List<AABB> entityAABBs = new ArrayList<>();
|
+ final List<AABB> entityAABBs = new ArrayList<>();
|
||||||
+ ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getEntityHardCollisions(
|
+ ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getEntityHardCollisions(
|
||||||
+ this.level, (Entity)(Object)this, initialCollisionBox, entityAABBs, 0, null
|
+ this.level, (Entity)(Object)this, initialCollisionBox, entityAABBs, 0, null
|
||||||
+ );
|
+ );
|
||||||
+
|
|
||||||
|
- if (vec3d2.horizontalDistanceSqr() > vec3d1.horizontalDistanceSqr()) {
|
||||||
|
- double d0 = axisalignedbb.minY - axisalignedbb1.minY;
|
||||||
+ ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getCollisionsForBlocksOrWorldBorder(
|
+ ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getCollisionsForBlocksOrWorldBorder(
|
||||||
+ this.level, (Entity)(Object)this, initialCollisionBox, potentialCollisionsVoxel, potentialCollisionsBB,
|
+ this.level, (Entity)(Object)this, initialCollisionBox, potentialCollisionsVoxel, potentialCollisionsBB,
|
||||||
+ ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_CHECK_BORDER, null
|
+ ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_CHECK_BORDER, null
|
||||||
+ );
|
+ );
|
||||||
+ potentialCollisionsBB.addAll(entityAABBs);
|
+ potentialCollisionsBB.addAll(entityAABBs);
|
||||||
+ final Vec3 collided = ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.performCollisions(movement, currentBox, potentialCollisionsVoxel, potentialCollisionsBB);
|
+ final Vec3 collided = ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.performCollisions(movement, currentBox, potentialCollisionsVoxel, potentialCollisionsBB);
|
||||||
+
|
|
||||||
|
- return vec3d2.add(0.0D, -d0, 0.0D);
|
||||||
|
- }
|
||||||
+ final boolean collidedX = collided.x != movement.x;
|
+ final boolean collidedX = collided.x != movement.x;
|
||||||
+ final boolean collidedY = collided.y != movement.y;
|
+ final boolean collidedY = collided.y != movement.y;
|
||||||
+ final boolean collidedZ = collided.z != movement.z;
|
+ final boolean collidedZ = collided.z != movement.z;
|
||||||
|
@ -28955,7 +29051,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ final int maxZIterate = currChunkZ == maxChunkZ ? (maxBlockZ & 15) : 15;
|
+ final int maxZIterate = currChunkZ == maxChunkZ ? (maxBlockZ & 15) : 15;
|
||||||
+ final int minYIterate = currChunkY == minChunkY ? (minBlockY & 15) : 0;
|
+ final int minYIterate = currChunkY == minChunkY ? (minBlockY & 15) : 0;
|
||||||
+ final int maxYIterate = currChunkY == maxChunkY ? (maxBlockY & 15) : 15;
|
+ final int maxYIterate = currChunkY == maxChunkY ? (maxBlockY & 15) : 15;
|
||||||
+
|
|
||||||
|
- vec3d = vec3d.add(vec3d1);
|
||||||
|
- ++k1;
|
||||||
+ for (int currY = minYIterate; currY <= maxYIterate; ++currY) {
|
+ for (int currY = minYIterate; currY <= maxYIterate; ++currY) {
|
||||||
+ for (int currZ = minZIterate; currZ <= maxZIterate; ++currZ) {
|
+ for (int currZ = minZIterate; currZ <= maxZIterate; ++currZ) {
|
||||||
+ for (int currX = minXIterate; currX <= maxXIterate; ++currX) {
|
+ for (int currX = minXIterate; currX <= maxXIterate; ++currX) {
|
||||||
|
@ -28963,21 +29061,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+
|
+
|
||||||
+ if (fluidState.isEmpty() || !fluidState.is(fluid)) {
|
+ if (fluidState.isEmpty() || !fluidState.is(fluid)) {
|
||||||
+ continue;
|
+ continue;
|
||||||
+ }
|
}
|
||||||
|
- // CraftBukkit start - store last lava contact location
|
||||||
|
- if (tag == FluidTags.LAVA) {
|
||||||
|
- this.lastLavaContact = blockposition_mutableblockposition.immutable();
|
||||||
+
|
+
|
||||||
+ mutablePos.set(currX | (currChunkX << 4), currY | (currChunkY << 4), currZ | (currChunkZ << 4));
|
+ mutablePos.set(currX | (currChunkX << 4), currY | (currChunkY << 4), currZ | (currChunkZ << 4));
|
||||||
|
+
|
||||||
- vec3d = vec3d.add(vec3d1);
|
|
||||||
- ++k1;
|
|
||||||
+ final double height = (double)((float)mutablePos.getY() + fluidState.getHeight(world, mutablePos));
|
+ final double height = (double)((float)mutablePos.getY() + fluidState.getHeight(world, mutablePos));
|
||||||
+ final double diff = height - boundingBox.minY;
|
+ final double diff = height - boundingBox.minY;
|
||||||
+
|
+
|
||||||
+ if (diff < 0.0) {
|
+ if (diff < 0.0) {
|
||||||
+ continue;
|
+ continue;
|
||||||
}
|
+ }
|
||||||
- // CraftBukkit start - store last lava contact location
|
|
||||||
- if (tag == FluidTags.LAVA) {
|
|
||||||
- this.lastLavaContact = blockposition_mutableblockposition.immutable();
|
|
||||||
+
|
+
|
||||||
+ inFluid = true;
|
+ inFluid = true;
|
||||||
+ maxHeightDiff = Math.max(maxHeightDiff, diff);
|
+ maxHeightDiff = Math.max(maxHeightDiff, diff);
|
||||||
|
@ -29507,6 +29603,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
public static final Codec<ResourceKey<Level>> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION);
|
public static final Codec<ResourceKey<Level>> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION);
|
||||||
public static final ResourceKey<Level> OVERWORLD = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("overworld"));
|
public static final ResourceKey<Level> OVERWORLD = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("overworld"));
|
||||||
@@ -0,0 +0,0 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
@@ -0,0 +0,0 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||||
|
public float rainLevel;
|
||||||
|
protected float oThunderLevel;
|
||||||
|
public float thunderLevel;
|
||||||
|
- public final RandomSource random = RandomSource.create();
|
||||||
|
+ public final RandomSource random = new ca.spottedleaf.moonrise.common.util.ThreadUnsafeRandom(net.minecraft.world.level.levelgen.RandomSupport.generateUniqueSeed()); // Paper - replace random
|
||||||
|
/** @deprecated */
|
||||||
|
@Deprecated
|
||||||
|
private final RandomSource threadSafeRandom = RandomSource.createThreadSafe();
|
||||||
|
@@ -0,0 +0,0 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||||
|
|
||||||
public abstract ResourceKey<LevelStem> getTypeKey();
|
public abstract ResourceKey<LevelStem> getTypeKey();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue