2020-05-06 11:48:49 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2017-11-24 08:28:57 +01:00
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
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
|
|
|
|
|
2018-06-30 07:40:52 +02:00
|
|
|
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
|
|
|
|
|
2017-11-24 08:28:57 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index 630b279158f26902ebdcc6e5c810b189ce49c910..958279249fdadfe5c2808d2a046636f06c3bd500 100644
|
2017-11-24 08:28:57 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/TileEntity.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/TileEntity.java
|
2019-12-12 00:43:22 +01:00
|
|
|
@@ -231,7 +231,12 @@ public abstract class TileEntity implements KeyedObject { // Paper
|
2017-11-24 08:28:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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());
|
2019-12-12 00:43:22 +01:00
|
|
|
@@ -240,7 +245,7 @@ public abstract class TileEntity implements KeyedObject { // Paper
|
2017-11-24 08:28:57 +01:00
|
|
|
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
|
2020-06-25 03:10:30 +02:00
|
|
|
index 5a1629a19f082235f91913736d78509d44f8fd67..dd0bccd6995a79c52ec20cf45df27bb7ed06a5e6 100644
|
2017-11-24 08:28:57 +01:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
|
2020-04-27 09:34:45 +02:00
|
|
|
@@ -308,6 +308,20 @@ public class CraftBlock implements Block {
|
2017-11-24 08:28:57 +01:00
|
|
|
|
2019-05-06 04:58:04 +02:00
|
|
|
@Override
|
2017-11-24 08:28:57 +01:00
|
|
|
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
|
2020-05-06 11:48:49 +02:00
|
|
|
index 17d80b5c6e512e0c582b05c92bb795b004ba27c2..f6401e2cde9d56547cee7f8d9e4b2a58764ee895 100644
|
2017-11-24 08:28:57 +01:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
|
2019-07-05 04:13:38 +02:00
|
|
|
@@ -26,20 +26,40 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
|
2018-12-23 18:04:13 +01:00
|
|
|
this.tileEntity = tileEntityClass.cast(world.getHandle().getTileEntity(this.getPosition()));
|
2019-05-06 04:58:04 +02:00
|
|
|
Preconditions.checkState(this.tileEntity != null, "Tile is null, asynchronous access? " + block);
|
2017-11-24 08:28:57 +01:00
|
|
|
|
|
|
|
+ // Paper start
|
|
|
|
+ this.snapshotDisabled = DISABLE_SNAPSHOT;
|
|
|
|
+ if (DISABLE_SNAPSHOT) {
|
2018-06-30 07:40:52 +02:00
|
|
|
+ this.snapshot = this.tileEntity;
|
|
|
|
+ } else {
|
2019-07-05 04:13:38 +02:00
|
|
|
+ this.snapshot = this.createSnapshot(this.tileEntity);
|
2017-11-24 08:28:57 +01:00
|
|
|
+ }
|
|
|
|
// copy tile entity data:
|
2019-07-05 04:13:38 +02:00
|
|
|
- this.snapshot = this.createSnapshot(tileEntity);
|
2018-06-30 07:40:52 +02:00
|
|
|
- this.load(snapshot);
|
|
|
|
+ if(this.snapshot != null) {
|
|
|
|
+ this.load(this.snapshot);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
2017-11-24 08:28:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
+ 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;
|
2018-06-30 07:40:52 +02:00
|
|
|
-
|
2017-11-24 08:28:57 +01:00
|
|
|
+ // Paper start
|
|
|
|
+ this.snapshotDisabled = DISABLE_SNAPSHOT;
|
|
|
|
+ if (DISABLE_SNAPSHOT) {
|
2018-06-30 07:40:52 +02:00
|
|
|
+ this.snapshot = this.tileEntity;
|
|
|
|
+ } else {
|
2019-07-05 04:13:38 +02:00
|
|
|
+ this.snapshot = this.createSnapshot(this.tileEntity);
|
2018-06-30 07:40:52 +02:00
|
|
|
+ }
|
|
|
|
// copy tile entity data:
|
2019-07-05 04:13:38 +02:00
|
|
|
- this.snapshot = this.createSnapshot(tileEntity);
|
2018-06-30 07:40:52 +02:00
|
|
|
- this.load(snapshot);
|
|
|
|
+ if(this.snapshot != null) {
|
|
|
|
+ this.load(this.snapshot);
|
2017-11-24 08:28:57 +01:00
|
|
|
+ }
|
|
|
|
+ // Paper end
|
2018-06-30 07:40:52 +02:00
|
|
|
}
|
2017-11-24 08:28:57 +01:00
|
|
|
|
2019-07-05 04:13:38 +02:00
|
|
|
private T createSnapshot(T tileEntity) {
|
2018-06-30 07:40:52 +02:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index 15022ada0c2fd0f4302b45c55f46d0fdd3bfd57f..af15656cc4b4c1e9da4fc8a5bfffa95eb6caf903 100644
|
2018-06-30 07:40:52 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java
|
2019-05-06 04:58:04 +02:00
|
|
|
@@ -17,10 +17,12 @@ public class CraftSign extends CraftBlockEntityState<TileEntitySign> implements
|
2018-06-30 07:40:52 +02:00
|
|
|
|
|
|
|
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
|