899bc53b79
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: f47abd88 SPIGOT-6242: Fix some file line endings de96535b SPIGOT-6234: enum classes don't serialize properly when implementing ConfigurationSerializable CraftBukkit Changes: 4475707d SPIGOT-6244: /spawnpoint ignores angle 8b3b096d SPIGOT-6242: Fix some file line endings 4b33c749 SPIGOT-6186: Canceling a CreatureSpawnEvent results in a "Unable to summon entity due to duplicate UUIDs" error 2b3ca726 SPIGOT-6236: Vehicle passenger portal cooldown does not change
206 lines
9.9 KiB
Diff
206 lines
9.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Thu, 3 Mar 2016 02:07:55 -0600
|
|
Subject: [PATCH] Optimize isValidLocation, getType and getBlockData for
|
|
inlining
|
|
|
|
Hot methods, so reduce # of instructions for the method.
|
|
|
|
Move is valid location test to the BlockPosition class so that it can access local variables.
|
|
|
|
Replace all calls to the new place to the unnecessary forward.
|
|
|
|
Optimize getType and getBlockData to manually inline and optimize the calls
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/BaseBlockPosition.java b/src/main/java/net/minecraft/server/BaseBlockPosition.java
|
|
index f6a5ebd4c7ec045c8dd6841831f8fcc0b32d964e..63a9ce32fb8b98695e104f7d820cd9b1a8f230b1 100644
|
|
--- a/src/main/java/net/minecraft/server/BaseBlockPosition.java
|
|
+++ b/src/main/java/net/minecraft/server/BaseBlockPosition.java
|
|
@@ -20,6 +20,15 @@ public class BaseBlockPosition implements Comparable<BaseBlockPosition> {
|
|
private int b;public final void setY(final int y) { this.b = y; } // Paper - OBFHELPER
|
|
private int e;public final void setZ(final int z) { this.e = z; } // Paper - OBFHELPER
|
|
|
|
+ // Paper start
|
|
+ public boolean isValidLocation() {
|
|
+ return getX() >= -30000000 && getZ() >= -30000000 && getX() < 30000000 && getZ() < 30000000 && getY() >= 0 && getY() < 256;
|
|
+ }
|
|
+ public boolean isInvalidYLocation() {
|
|
+ return b < 0 || b >= 256;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public BaseBlockPosition(int i, int j, int k) {
|
|
this.a = i;
|
|
this.b = j;
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index 399641433a874cb6426a6092722036446df32eb6..560d61183f28b0271739548e8b784fdaf97e8a11 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -311,12 +311,27 @@ public class Chunk implements IChunkAccess {
|
|
return this.sections;
|
|
}
|
|
|
|
- @Override
|
|
+ // Paper start - Optimize getBlockData to reduce instructions
|
|
+ public final IBlockData getBlockData(BlockPosition pos) { return getBlockData(pos.getX(), pos.getY(), pos.getZ()); } // Paper
|
|
public IBlockData getType(BlockPosition blockposition) {
|
|
- int i = blockposition.getX();
|
|
- int j = blockposition.getY();
|
|
- int k = blockposition.getZ();
|
|
+ return this.getBlockData(blockposition.getX(), blockposition.getY(), blockposition.getZ());
|
|
+ }
|
|
+
|
|
+ public IBlockData getType(final int x, final int y, final int z) {
|
|
+ return getBlockData(x, y, z);
|
|
+ }
|
|
+ public final IBlockData getBlockData(final int x, final int y, final int z) {
|
|
+ // Method body / logic copied from below
|
|
+ final int i = y >> 4;
|
|
+ if (y < 0 || i >= this.sections.length || this.sections[i] == null || this.sections[i].nonEmptyBlockCount == 0) {
|
|
+ return Blocks.AIR.getBlockData();
|
|
+ }
|
|
+ // Inlined ChunkSection.getType() and DataPaletteBlock.a(int,int,int)
|
|
+ return this.sections[i].blockIds.a((y & 15) << 8 | (z & 15) << 4 | x & 15);
|
|
+ }
|
|
|
|
+ public IBlockData getBlockData_unused(int i, int j, int k) {
|
|
+ // Paper end
|
|
if (this.world.isDebugWorld()) {
|
|
IBlockData iblockdata = null;
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkEmpty.java b/src/main/java/net/minecraft/server/ChunkEmpty.java
|
|
index 84207e7da6df97246f756940142a2af9eb9ca815..ed22ff28ea6c0978ec0d9d1ecf7baa3f422ed677 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkEmpty.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkEmpty.java
|
|
@@ -7,7 +7,7 @@ import javax.annotation.Nullable;
|
|
|
|
public class ChunkEmpty extends Chunk {
|
|
|
|
- private static final BiomeBase[] b = (BiomeBase[]) SystemUtils.a((Object) (new BiomeBase[BiomeStorage.a]), (abiomebase) -> {
|
|
+ private static final BiomeBase[] b = SystemUtils.a((new BiomeBase[BiomeStorage.a]), (abiomebase) -> { // Paper - decompile error
|
|
Arrays.fill(abiomebase, BiomeRegistry.a);
|
|
});
|
|
|
|
@@ -15,6 +15,11 @@ public class ChunkEmpty extends Chunk {
|
|
super(world, chunkcoordintpair, new BiomeStorage(world.r().b(IRegistry.ay), ChunkEmpty.b));
|
|
}
|
|
|
|
+ // Paper start
|
|
+ @Override public IBlockData getType(int x, int y, int z) {
|
|
+ return Blocks.VOID_AIR.getBlockData();
|
|
+ }
|
|
+ // Paper end
|
|
@Override
|
|
public IBlockData getType(BlockPosition blockposition) {
|
|
return Blocks.VOID_AIR.getBlockData();
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java
|
|
index 882c2733beaff1df68b892d44fc77cacf4364ff4..5c7068cd93806d67c643ed6aabdfcab8888ed94e 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkSection.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkSection.java
|
|
@@ -7,10 +7,10 @@ public class ChunkSection {
|
|
|
|
public static final DataPalette<IBlockData> GLOBAL_PALETTE = new DataPaletteGlobal<>(Block.REGISTRY_ID, Blocks.AIR.getBlockData());
|
|
private final int yPos;
|
|
- private short nonEmptyBlockCount;
|
|
+ short nonEmptyBlockCount; // Paper - package-private
|
|
private short tickingBlockCount;
|
|
private short e;
|
|
- private final DataPaletteBlock<IBlockData> blockIds;
|
|
+ final DataPaletteBlock<IBlockData> blockIds; // Paper - package-private
|
|
|
|
public ChunkSection(int i) {
|
|
this(i, (short) 0, (short) 0, (short) 0);
|
|
@@ -24,8 +24,8 @@ public class ChunkSection {
|
|
this.blockIds = new DataPaletteBlock<>(ChunkSection.GLOBAL_PALETTE, Block.REGISTRY_ID, GameProfileSerializer::c, GameProfileSerializer::a, Blocks.AIR.getBlockData());
|
|
}
|
|
|
|
- public IBlockData getType(int i, int j, int k) {
|
|
- return (IBlockData) this.blockIds.a(i, j, k);
|
|
+ public final IBlockData getType(int i, int j, int k) { // Paper
|
|
+ return this.blockIds.a(j << 8 | k << 4 | i); // Paper - inline
|
|
}
|
|
|
|
public Fluid b(int i, int j, int k) {
|
|
diff --git a/src/main/java/net/minecraft/server/DataPaletteBlock.java b/src/main/java/net/minecraft/server/DataPaletteBlock.java
|
|
index 32849e360a396128bd228db269ad1a8f7c6583a8..eabc9d7b934f27c823e012f3f10fffc23b461292 100644
|
|
--- a/src/main/java/net/minecraft/server/DataPaletteBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/DataPaletteBlock.java
|
|
@@ -124,7 +124,7 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
|
}
|
|
|
|
public T a(int i, int j, int k) {
|
|
- return this.a(b(i, j, k));
|
|
+ return this.a(j << 8 | k << 4 | i); // Paper - inline
|
|
}
|
|
|
|
protected T a(int i) {
|
|
diff --git a/src/main/java/net/minecraft/server/IChunkAccess.java b/src/main/java/net/minecraft/server/IChunkAccess.java
|
|
index e0672c3c0bf30d88ea1cc609459050499a7271f3..887366f4c2ab608974113e75760b58c47f2afa00 100644
|
|
--- a/src/main/java/net/minecraft/server/IChunkAccess.java
|
|
+++ b/src/main/java/net/minecraft/server/IChunkAccess.java
|
|
@@ -12,6 +12,7 @@ import org.apache.logging.log4j.LogManager;
|
|
|
|
public interface IChunkAccess extends IBlockAccess, IStructureAccess {
|
|
|
|
+ IBlockData getType(final int x, final int y, final int z); // Paper
|
|
@Nullable
|
|
IBlockData setType(BlockPosition blockposition, IBlockData iblockdata, boolean flag);
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ProtoChunk.java b/src/main/java/net/minecraft/server/ProtoChunk.java
|
|
index e356bd73901ac7f230492e654af579d21c8fc086..2bcd26ccccf4503241c6b77600ed6ce1d94ccfcc 100644
|
|
--- a/src/main/java/net/minecraft/server/ProtoChunk.java
|
|
+++ b/src/main/java/net/minecraft/server/ProtoChunk.java
|
|
@@ -95,16 +95,18 @@ public class ProtoChunk implements IChunkAccess {
|
|
|
|
@Override
|
|
public IBlockData getType(BlockPosition blockposition) {
|
|
- int i = blockposition.getY();
|
|
-
|
|
- if (World.b(i)) {
|
|
+ return getType(blockposition.getX(), blockposition.getY(), blockposition.getZ());
|
|
+ }
|
|
+ // Paper start
|
|
+ public IBlockData getType(final int x, final int y, final int z) {
|
|
+ if (y < 0 || y >= 256) {
|
|
return Blocks.VOID_AIR.getBlockData();
|
|
} else {
|
|
- ChunkSection chunksection = this.getSections()[i >> 4];
|
|
-
|
|
- return ChunkSection.a(chunksection) ? Blocks.AIR.getBlockData() : chunksection.getType(blockposition.getX() & 15, i & 15, blockposition.getZ() & 15);
|
|
+ ChunkSection chunksection = this.getSections()[y >> 4];
|
|
+ return chunksection == Chunk.EMPTY_CHUNK_SECTION || chunksection.c() ? Blocks.AIR.getBlockData() : chunksection.getType(x & 15, y & 15, z & 15);
|
|
}
|
|
}
|
|
+ // Paper end
|
|
|
|
@Override
|
|
public Fluid getFluid(BlockPosition blockposition) {
|
|
diff --git a/src/main/java/net/minecraft/server/ProtoChunkExtension.java b/src/main/java/net/minecraft/server/ProtoChunkExtension.java
|
|
index 5cfddbfe0bd84c994ed7fa4968bcf4fc13381001..420bf7116def909d3dd7dc9a799723446ddf8f7f 100644
|
|
--- a/src/main/java/net/minecraft/server/ProtoChunkExtension.java
|
|
+++ b/src/main/java/net/minecraft/server/ProtoChunkExtension.java
|
|
@@ -26,6 +26,11 @@ public class ProtoChunkExtension extends ProtoChunk {
|
|
public IBlockData getType(BlockPosition blockposition) {
|
|
return this.a.getType(blockposition);
|
|
}
|
|
+ // Paper start
|
|
+ public final IBlockData getType(final int x, final int y, final int z) {
|
|
+ return this.a.getBlockData(x, y, z);
|
|
+ }
|
|
+ // Paper end
|
|
|
|
@Override
|
|
public Fluid getFluid(BlockPosition blockposition) {
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index c1d3dd294049c93beddaf5e4d513913cebb639df..92785a80bae6b5c88285536f74f23e0609d793ac 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -187,7 +187,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
|
}
|
|
|
|
public static boolean isValidLocation(BlockPosition blockposition) {
|
|
- return !isOutsideWorld(blockposition) && D(blockposition);
|
|
+ return blockposition.isValidLocation(); // Paper - use better/optimized check
|
|
}
|
|
|
|
public static boolean l(BlockPosition blockposition) {
|