Paper/Spigot-Server-Patches/0092-Add-World-Util-Methods.patch
Byteflux 3fd3544a36 Add Lighting Queue
The lighting queue spreads out the processing of light updates across
multiple ticks based on how much free time the server has left at the end
of the tick.
2016-03-24 23:38:38 -07:00

98 lines
3.8 KiB
Diff

From 5eafc0a2293770a3558d1e30c46f72f8a20d4e78 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 614cabe..2283536 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -152,6 +152,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);
}
@@ -634,6 +640,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);
}
@@ -748,6 +789,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.7.1.windows.2