diff options
Diffstat (limited to 'Spigot-Server-Patches/0214-API-to-get-a-BlockState-without-a-snapshot.patch')
-rw-r--r-- | Spigot-Server-Patches/0214-API-to-get-a-BlockState-without-a-snapshot.patch | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0214-API-to-get-a-BlockState-without-a-snapshot.patch b/Spigot-Server-Patches/0214-API-to-get-a-BlockState-without-a-snapshot.patch new file mode 100644 index 0000000000..f95b101366 --- /dev/null +++ b/Spigot-Server-Patches/0214-API-to-get-a-BlockState-without-a-snapshot.patch @@ -0,0 +1,135 @@ +From a6c89447b205715e04b8a8e86ad3f7af4733cdc9 Mon Sep 17 00:00:00 2001 +From: Aikar <[email protected]> +Date: Mon, 6 Nov 2017 21:08:22 -0500 +Subject: [PATCH] API to get a BlockState without a snapshot + +This allows you to get a BlockState without creating a snapshot, operating +on the real tile entity. + +This is useful for where performance is needed + +also Avoid NPE during CraftBlockEntityState load if could not get TE + +If Tile Entity was null, correct Sign to return empty lines instead of null + +diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java +index b3c5766a27..29fe031d85 100644 +--- a/src/main/java/net/minecraft/server/TileEntity.java ++++ b/src/main/java/net/minecraft/server/TileEntity.java +@@ -206,7 +206,12 @@ public abstract class TileEntity implements KeyedObject { // Paper + } + + // CraftBukkit start - add method ++ // Paper start + public InventoryHolder getOwner() { ++ return getOwner(true); ++ } ++ public InventoryHolder getOwner(boolean useSnapshot) { ++ // Paper end + if (world == null) return null; + // Spigot start + org.bukkit.block.Block block = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); +@@ -215,7 +220,7 @@ public abstract class TileEntity implements KeyedObject { // Paper + return null; + } + // Spigot end +- org.bukkit.block.BlockState state = block.getState(); ++ org.bukkit.block.BlockState state = block.getState(useSnapshot); // Paper + if (state instanceof InventoryHolder) return (InventoryHolder) state; + return null; + } +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +index 4b4fdf93f6..7ae4b7952f 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +@@ -275,6 +275,20 @@ public class CraftBlock implements Block { + } + + public BlockState getState() { ++ // Paper start - allow disabling the use of snapshots ++ return getState(true); ++ } ++ public BlockState getState(boolean useSnapshot) { ++ boolean prev = CraftBlockEntityState.DISABLE_SNAPSHOT; ++ CraftBlockEntityState.DISABLE_SNAPSHOT = !useSnapshot; ++ try { ++ return getState0(); ++ } finally { ++ CraftBlockEntityState.DISABLE_SNAPSHOT = prev; ++ } ++ } ++ public BlockState getState0() { ++ // Paper end + Material material = getType(); + + switch (material) { +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +index 4f4121adca..082a1b6e20 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +@@ -23,20 +23,40 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState + CraftWorld world = (CraftWorld) this.getWorld(); + this.tileEntity = tileEntityClass.cast(world.getHandle().getTileEntity(this.getPosition())); + ++ // Paper start ++ this.snapshotDisabled = DISABLE_SNAPSHOT; ++ if (DISABLE_SNAPSHOT) { ++ this.snapshot = this.tileEntity; ++ } else { ++ this.snapshot = this.createSnapshot(this.tileEntity, world.getHandle()); ++ } + // copy tile entity data: +- this.snapshot = this.createSnapshot(tileEntity, world.getHandle()); +- this.load(snapshot); ++ if(this.snapshot != null) { ++ this.load(this.snapshot); ++ } ++ // Paper end + } + ++ public final boolean snapshotDisabled; // Paper ++ public static boolean DISABLE_SNAPSHOT = false; // Paper ++ + public CraftBlockEntityState(Material material, T tileEntity) { + super(material); + + this.tileEntityClass = (Class<T>) tileEntity.getClass(); + this.tileEntity = tileEntity; +- ++ // Paper start ++ this.snapshotDisabled = DISABLE_SNAPSHOT; ++ if (DISABLE_SNAPSHOT) { ++ this.snapshot = this.tileEntity; ++ } else { ++ this.snapshot = this.createSnapshot(this.tileEntity, null); ++ } + // copy tile entity data: +- this.snapshot = this.createSnapshot(tileEntity, null); +- this.load(snapshot); ++ if(this.snapshot != null) { ++ this.load(this.snapshot); ++ } ++ // Paper end + } + + private T createSnapshot(T tileEntity, World world) { +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +index e6f86cc4b1..3a8f643609 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +@@ -15,10 +15,12 @@ public class CraftSign extends CraftBlockEntityState<TileEntitySign> implements + + public CraftSign(final Block block) { + super(block, TileEntitySign.class); ++ if (lines == null) { lines = new String[]{"", "", "", ""}; } // Paper + } + + public CraftSign(final Material material, final TileEntitySign te) { + super(material, te); ++ if (lines == null) { lines = new String[]{"", "", "", ""}; } // Paper + } + + @Override +-- +2.21.0 + |