4b0bc74c90
When ChunkAccess was converted to an abstract class some versions ago, the code to initialise nibble arrays should have been moved. However, the code was not moved and so now mods constructing their own implementations of ChunkAccess would not have the nibble arrays initialised. This is ported to Paper from Starlight to keep the code base in sync, not because it fixes anything known.
62 Zeilen
3.0 KiB
Diff
62 Zeilen
3.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Tue, 14 Jan 2020 14:59:08 -0800
|
|
Subject: [PATCH] Optimise Chunk#getFluid
|
|
|
|
Removing the try catch and generally reducing ops should make it
|
|
faster on its own, however removing the try catch makes it
|
|
easier to inline due to code size
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
|
index 44ef27e5c297055f7a2512ae49d68d50cfcde72a..78004403ca444b2880a663b72c9e15c5b57faedd 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
|
@@ -377,18 +377,20 @@ public class LevelChunk extends ChunkAccess {
|
|
}
|
|
|
|
public FluidState getFluidState(int x, int y, int z) {
|
|
- try {
|
|
- int l = this.getSectionIndex(y);
|
|
-
|
|
- if (l >= 0 && l < this.sections.length) {
|
|
- LevelChunkSection chunksection = this.sections[l];
|
|
+ // try { // Paper - remove try catch
|
|
+ // Paper start - reduce the number of ops in this call
|
|
+ int index = this.getSectionIndex(y);
|
|
+ if (index >= 0 && index < this.sections.length) {
|
|
+ LevelChunkSection chunksection = this.sections[index];
|
|
|
|
if (!chunksection.hasOnlyAir()) {
|
|
- return chunksection.getFluidState(x & 15, y & 15, z & 15);
|
|
+ return chunksection.states.get((y & 15) << 8 | (z & 15) << 4 | x & 15).getFluidState();
|
|
+ // Paper end
|
|
}
|
|
}
|
|
|
|
return Fluids.EMPTY.defaultFluidState();
|
|
+ /* // Paper - remove try catch
|
|
} catch (Throwable throwable) {
|
|
CrashReport crashreport = CrashReport.forThrowable(throwable, "Getting fluid state");
|
|
CrashReportCategory crashreportsystemdetails = crashreport.addCategory("Block being got");
|
|
@@ -398,6 +400,7 @@ public class LevelChunk extends ChunkAccess {
|
|
});
|
|
throw new ReportedException(crashreport);
|
|
}
|
|
+ */ // Paper - remove try catch
|
|
}
|
|
|
|
// CraftBukkit start
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
|
|
index 4eeb719b40ff1c18a7cdda7ecc6b135dbedd626e..b8fee4f8a0cfe32b9ef7f3f3cf818cbaec0d3fca 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
|
|
@@ -46,7 +46,7 @@ public class LevelChunkSection {
|
|
}
|
|
|
|
public FluidState getFluidState(int x, int y, int z) {
|
|
- return ((BlockState) this.states.get(x, y, z)).getFluidState();
|
|
+ return this.states.get(x, y, z).getFluidState(); // Paper - diff on change - we expect this to be effectively just getType(x, y, z).getFluid(). If this changes we need to check other patches that use IBlockData#getFluid.
|
|
}
|
|
|
|
public void acquire() {
|