geforkt von Mirrors/Paper
3fd3544a36
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.
98 Zeilen
3.8 KiB
Diff
98 Zeilen
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
|
|
|