geforkt von Mirrors/Paper
abba3d113b
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: bb813f6f SPIGOT-4605: Warn against hacking physics CraftBukkit Changes:2ced0233
Don't handle sync packets for kicked playersd5e96882
SPIGOT-4602: Cache reflection in decompile error workaround Spigot Changes: b0f4c22b SPIGOT-4605: Catch more physics problems
147 Zeilen
6.1 KiB
Diff
147 Zeilen
6.1 KiB
Diff
From e2a551344ce5dcc96e50b8aaeb3ff58ab247b2ac 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/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index 446e464b7..dcb036f31 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -637,6 +637,7 @@ public class Chunk implements IChunkAccess {
|
|
}
|
|
}
|
|
|
|
+ public final int getLightSubtracted(BlockPosition blockposition, int i) { return this.a(blockposition, i); } // Paper - OBFHELPER
|
|
public int a(BlockPosition blockposition, int i) {
|
|
return this.a(blockposition, i, this.world.o().g());
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/IWorldReader.java b/src/main/java/net/minecraft/server/IWorldReader.java
|
|
index 237a34082..cf53118cc 100644
|
|
--- a/src/main/java/net/minecraft/server/IWorldReader.java
|
|
+++ b/src/main/java/net/minecraft/server/IWorldReader.java
|
|
@@ -38,6 +38,22 @@ public interface IWorldReader extends IBlockAccess {
|
|
}
|
|
|
|
int getLightLevel(BlockPosition blockposition, int i);
|
|
+ // Paper start
|
|
+ default @Nullable
|
|
+ IBlockData getTypeIfLoaded(BlockPosition var1) {
|
|
+ return isLoaded(var1) ? getType(var1) : null;
|
|
+ }
|
|
+
|
|
+ default @Nullable
|
|
+ Block getBlockIfLoaded(BlockPosition var1) {
|
|
+ return isLoaded(var1) ? getType(var1).getBlock() : null;
|
|
+ }
|
|
+
|
|
+ default @Nullable
|
|
+ Material getMaterialIfLoaded(BlockPosition var1) {
|
|
+ return isLoaded(var1) ? getType(var1).getMaterial() : null;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
boolean isChunkLoaded(int i, int j, boolean flag);
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index 0684d85be..7e35cc36b 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -79,7 +79,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
public final List<Entity> k = Lists.newArrayList();
|
|
protected final IntHashMap<Entity> entitiesById = new IntHashMap<>();
|
|
private final long F = 16777215L;
|
|
- private int G;
|
|
+ private int G; public int getSkylightSubtracted() { return this.G; } public void setSkylightSubtracted(int value) { this.G = value;} // Paper - OBFHELPER
|
|
protected int m = (new Random()).nextInt();
|
|
protected final int n = 1013904223;
|
|
protected float o;
|
|
@@ -268,6 +268,83 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
return this.getType(blockposition).isAir();
|
|
}
|
|
|
|
+ // Paper start
|
|
+ public boolean isLoadedAndInBounds(BlockPosition blockposition) {
|
|
+ return getWorldBorder().isInBounds(blockposition) && getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4) != null;
|
|
+ }
|
|
+ public Chunk getChunkIfLoaded(BlockPosition blockposition) {
|
|
+ return getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4);
|
|
+ }
|
|
+ // 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).c(this, blockposition)) {
|
|
+ int sky = getSkylightSubtracted();
|
|
+ if (this.getLightLevel(blockposition.up(), sky) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.getLightLevel(blockposition.east(), sky) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.getLightLevel(blockposition.west(), sky) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.getLightLevel(blockposition.south(), sky) >= level) {
|
|
+ return true;
|
|
+ }
|
|
+ if (this.getLightLevel(blockposition.north(), sky) >= 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.getLightSubtracted(blockposition, this.getSkylightSubtracted()) >= level;
|
|
+ }
|
|
+ } else {
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+ // reduces need to do isLoaded before getType
|
|
+ public IBlockData getTypeIfLoadedAndInBounds(BlockPosition blockposition) {
|
|
+ return getWorldBorder().isInBounds(blockposition) ? getTypeIfLoaded(blockposition) : null;
|
|
+ }
|
|
+ public IBlockData getTypeIfLoaded(BlockPosition blockposition) {
|
|
+ // CraftBukkit start - tree generation
|
|
+ if (captureTreeGeneration) {
|
|
+ for (CraftBlockState previous : capturedBlockStates) {
|
|
+ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) {
|
|
+ return previous.getHandle();
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+ Chunk chunk = this.getChunkIfLoaded(blockposition);
|
|
+ if (chunk != null) {
|
|
+ return isValidLocation(blockposition) ? chunk.getBlockData(blockposition) : Blocks.AIR.getBlockData();
|
|
+ }
|
|
+ return null;
|
|
+ }
|
|
+ public Block getBlockIfLoaded(BlockPosition blockposition) {
|
|
+ IBlockData type = getTypeIfLoaded(blockposition);
|
|
+ if (type == null) {
|
|
+ return null;
|
|
+ }
|
|
+ return type.getBlock();
|
|
+ }
|
|
+ public Material getMaterialIfLoaded(BlockPosition blockposition) {
|
|
+ IBlockData type = getTypeIfLoaded(blockposition);
|
|
+ if (type == null) {
|
|
+ return null;
|
|
+ }
|
|
+ return type.getBlock().material;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public Chunk getChunkAtWorldCoords(BlockPosition blockposition) {
|
|
return this.getChunkAt(blockposition.getX() >> 4, blockposition.getZ() >> 4);
|
|
}
|
|
--
|
|
2.20.1
|
|
|