mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-24 01:47:42 +01:00
3faaaab75d
Some pretty micro optimizations, but this is the hottest method in the server.... This will drastically reduce number of operations to perform getType the 2 previous patches was squashed into 1
98 lines
3.8 KiB
Diff
98 lines
3.8 KiB
Diff
From c4a425cbbbb658a9efb4969c4b959e700379fdf5 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Fri, 18 Mar 2016 20:16:03 -0400
|
|
Subject: [PATCH] Add World Util Methods
|
|
|
|
Methods that can be used for other patches to help improve logic.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index d54ff64..12f6761 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -153,6 +153,12 @@ public abstract class World implements IBlockAccess {
|
|
return (CraftServer) Bukkit.getServer();
|
|
}
|
|
|
|
+ // Paper start
|
|
+ public Chunk getChunkIfLoaded(BlockPosition blockposition) {
|
|
+ return this.chunkProvider.getLoadedChunkAt(blockposition.getX() >> 4, blockposition.getZ() >> 4);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public Chunk getChunkIfLoaded(int x, int z) {
|
|
return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x, z);
|
|
}
|
|
@@ -630,6 +636,41 @@ public abstract class World implements IBlockAccess {
|
|
}
|
|
}
|
|
|
|
+ // Paper start - test if meets light level, return faster
|
|
+ // logic copied from below
|
|
+ public boolean isLightLevel(BlockPosition blockposition, int level) {
|
|
+ if (isValidLocation(blockposition)) {
|
|
+ if (this.getType(blockposition).f()) {
|
|
+ if (this.c(blockposition.up(), false) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.c(blockposition.east(), false) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.c(blockposition.west(), false) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.c(blockposition.south(), false) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.c(blockposition.north(), false) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ return false;
|
|
+ } else {
|
|
+ if (blockposition.getY() >= 256) {
|
|
+ blockposition = new BlockPosition(blockposition.getX(), 255, blockposition.getZ());
|
|
+ }
|
|
+
|
|
+ Chunk chunk = this.getChunkAtWorldCoords(blockposition);
|
|
+ return chunk.a(blockposition, this.J) >= level;
|
|
+ }
|
|
+ } else {
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public int getLightLevel(BlockPosition blockposition) {
|
|
return this.c(blockposition, true);
|
|
}
|
|
@@ -749,6 +790,27 @@ public abstract class World implements IBlockAccess {
|
|
return this.worldProvider.n()[this.getLightLevel(blockposition)];
|
|
}
|
|
|
|
+ // Paper start - reduces need to do isLoaded before getType
|
|
+ public IBlockData getTypeIfLoaded(BlockPosition blockposition) {
|
|
+ // CraftBukkit start - tree generation
|
|
+ if (captureTreeGeneration) {
|
|
+ Iterator<BlockState> it = capturedBlockStates.iterator();
|
|
+ while (it.hasNext()) {
|
|
+ BlockState previous = it.next();
|
|
+ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) {
|
|
+ return CraftMagicNumbers.getBlock(previous.getTypeId()).fromLegacyData(previous.getRawData());
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+ Chunk chunk = this.getChunkIfLoaded(blockposition);
|
|
+ if (chunk != null) {
|
|
+ return this.isValidLocation(blockposition) ? chunk.getBlockData(blockposition) : Blocks.AIR.getBlockData();
|
|
+ }
|
|
+ return null;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public IBlockData getType(BlockPosition blockposition) {
|
|
// CraftBukkit start - tree generation
|
|
if (captureTreeGeneration) {
|
|
--
|
|
2.9.0
|
|
|