2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
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
|
|
|
|
|
|
|
|
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/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
2022-03-01 06:43:03 +01:00
|
|
|
index 32a2fbf4a11a84d5a55e02d3ba21e6f4430379c0..a69bbc11b9e003aed1630a6f5cdbca521deb6ff5 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
2021-11-23 15:03:50 +01:00
|
|
|
@@ -45,6 +45,7 @@ public abstract class BlockEntity implements io.papermc.paper.util.KeyedObject {
|
2021-06-11 14:02:28 +02:00
|
|
|
this.type = type;
|
2021-06-12 17:06:20 +02:00
|
|
|
this.worldPosition = pos.immutable();
|
|
|
|
this.blockState = state;
|
2021-10-02 19:21:49 +02:00
|
|
|
+ this.persistentDataContainer = new CraftPersistentDataContainer(DATA_TYPE_REGISTRY); // Paper - always init
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
2021-11-23 15:03:50 +01:00
|
|
|
public static BlockPos getPosFromTag(CompoundTag nbt) {
|
|
|
|
@@ -86,7 +87,7 @@ public abstract class BlockEntity implements io.papermc.paper.util.KeyedObject {
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2021-06-12 17:06:20 +02:00
|
|
|
// CraftBukkit start - read container
|
|
|
|
public void load(CompoundTag nbt) {
|
|
|
|
- this.persistentDataContainer = new CraftPersistentDataContainer(BlockEntity.DATA_TYPE_REGISTRY);
|
2021-10-02 19:21:49 +02:00
|
|
|
+ this.persistentDataContainer.clear(); // Paper - clear instead of init
|
2021-06-12 17:06:20 +02:00
|
|
|
|
|
|
|
net.minecraft.nbt.Tag persistentDataTag = nbt.get("PublicBukkitValues");
|
2021-06-11 14:02:28 +02:00
|
|
|
if (persistentDataTag instanceof CompoundTag) {
|
2021-11-29 13:15:54 +01:00
|
|
|
@@ -260,8 +261,15 @@ public abstract class BlockEntity implements io.papermc.paper.util.KeyedObject {
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
// CraftBukkit start - add method
|
|
|
|
public InventoryHolder getOwner() {
|
2021-10-02 19:21:49 +02:00
|
|
|
+ // Paper start
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return getOwner(true);
|
|
|
|
+ }
|
|
|
|
+ public InventoryHolder getOwner(boolean useSnapshot) {
|
|
|
|
+ // Paper end
|
2021-10-02 19:21:49 +02:00
|
|
|
if (this.level == null) return null;
|
2021-11-29 13:15:54 +01:00
|
|
|
- org.bukkit.block.BlockState state = this.level.getWorld().getBlockAt(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ()).getState();
|
|
|
|
+ org.bukkit.block.Block block = this.level.getWorld().getBlockAt(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ());
|
|
|
|
+ if (block.getType() == org.bukkit.Material.AIR) return null;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ 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
|
2022-03-13 08:47:54 +01:00
|
|
|
index 52fc42050d5df0882586c8f4bb4890ef1dbf979e..ba8f9ffed49bf377be8b37532d4f2bdcb8c44d82 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
|
2022-03-13 08:47:54 +01:00
|
|
|
@@ -329,6 +329,13 @@ public class CraftBlock implements Block {
|
2021-10-02 19:21:49 +02:00
|
|
|
return CraftBlockStates.getBlockState(this);
|
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2022-01-13 20:31:48 +01:00
|
|
|
+ // Paper start
|
|
|
|
+ @Override
|
|
|
|
+ public BlockState getState(boolean useSnapshot) {
|
|
|
|
+ return CraftBlockStates.getBlockState(this, useSnapshot);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+
|
2021-10-02 19:21:49 +02:00
|
|
|
@Override
|
2022-01-13 20:31:48 +01:00
|
|
|
public Biome getBiome() {
|
|
|
|
return this.getWorld().getBiome(this.getX(), this.getY(), this.getZ());
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
|
2022-03-17 02:28:06 +01:00
|
|
|
index 7629a51ec284cab0db7e9238027d6acfa4f3083c..a76cce199acdcecfdd8b998ec08974c2ed0751cf 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
|
2022-01-13 20:31:48 +01:00
|
|
|
@@ -10,15 +10,26 @@ public class CraftBlockEntityState<T extends BlockEntity> extends CraftBlockStat
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2021-10-02 19:21:49 +02:00
|
|
|
private final T tileEntity;
|
|
|
|
private final T snapshot;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ public final boolean snapshotDisabled; // Paper
|
|
|
|
+ public static boolean DISABLE_SNAPSHOT = false; // Paper
|
|
|
|
|
2021-10-02 19:21:49 +02:00
|
|
|
public CraftBlockEntityState(World world, T tileEntity) {
|
|
|
|
super(world, tileEntity.getBlockPos(), tileEntity.getBlockState());
|
|
|
|
|
2021-06-11 14:02:28 +02:00
|
|
|
this.tileEntity = tileEntity;
|
2021-10-02 19:21:49 +02:00
|
|
|
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start
|
|
|
|
+ this.snapshotDisabled = DISABLE_SNAPSHOT;
|
|
|
|
+ if (DISABLE_SNAPSHOT) {
|
|
|
|
+ this.snapshot = this.tileEntity;
|
|
|
|
+ } else {
|
2021-10-02 19:21:49 +02:00
|
|
|
+ this.snapshot = this.createSnapshot(tileEntity);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
// copy tile entity data:
|
|
|
|
- this.snapshot = this.createSnapshot(tileEntity);
|
|
|
|
- this.load(snapshot);
|
2021-10-02 19:21:49 +02:00
|
|
|
+ if (this.snapshot != null) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ this.load(this.snapshot);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
|
2021-08-25 09:59:26 +02:00
|
|
|
public void refreshSnapshot() {
|
2022-03-17 02:28:06 +01:00
|
|
|
@@ -105,4 +116,11 @@ public class CraftBlockEntityState<T extends BlockEntity> extends CraftBlockStat
|
|
|
|
public PersistentDataContainer getPersistentDataContainer() {
|
|
|
|
return this.getSnapshot().persistentDataContainer;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ // Paper start
|
|
|
|
+ @Override
|
|
|
|
+ public boolean isSnapshot() {
|
|
|
|
+ return !this.snapshotDisabled;
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
}
|
2021-11-29 13:15:54 +01:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
|
2022-01-13 20:31:48 +01:00
|
|
|
index 51ea68c433c4d530f8404d3174c5a121ce808a96..93a8aeb5545c794ac425c35f8af52a443cd060ca 100644
|
2021-11-29 13:15:54 +01:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
|
2022-01-13 20:31:48 +01:00
|
|
|
@@ -324,15 +324,30 @@ public final class CraftBlockStates {
|
|
|
|
}
|
|
|
|
|
|
|
|
public static BlockState getBlockState(Block block) {
|
|
|
|
+ // Paper start
|
|
|
|
+ return CraftBlockStates.getBlockState(block, true);
|
|
|
|
+ }
|
|
|
|
+ public static BlockState getBlockState(Block block, boolean useSnapshot) {
|
|
|
|
+ // Paper end
|
|
|
|
Preconditions.checkNotNull(block, "block is null");
|
|
|
|
CraftBlock craftBlock = (CraftBlock) block;
|
|
|
|
CraftWorld world = (CraftWorld) block.getWorld();
|
|
|
|
BlockPos blockPosition = craftBlock.getPosition();
|
|
|
|
net.minecraft.world.level.block.state.BlockState blockData = craftBlock.getNMS();
|
|
|
|
BlockEntity tileEntity = craftBlock.getHandle().getBlockEntity(blockPosition);
|
|
|
|
+ // Paper start - block state snapshots
|
|
|
|
+ boolean prev = CraftBlockEntityState.DISABLE_SNAPSHOT;
|
|
|
|
+ CraftBlockEntityState.DISABLE_SNAPSHOT = !useSnapshot;
|
|
|
|
+ try {
|
|
|
|
+ // Paper end
|
|
|
|
CraftBlockState blockState = CraftBlockStates.getBlockState(world, blockPosition, blockData, tileEntity);
|
|
|
|
blockState.setWorldHandle(craftBlock.getHandle()); // Inject the block's generator access
|
|
|
|
return blockState;
|
|
|
|
+ // Paper start
|
|
|
|
+ } finally {
|
|
|
|
+ CraftBlockEntityState.DISABLE_SNAPSHOT = prev;
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
|
|
|
|
public static BlockState getBlockState(Material material, @Nullable CompoundTag blockEntityTag) {
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
|
2021-12-05 08:11:59 +01:00
|
|
|
index 3fc3907172f12ee24ea70bd6a1ffbbc6084ed971..2c59f09a9261a1690951161fd856a5848d9885b7 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
|
2021-12-05 08:11:59 +01:00
|
|
|
@@ -156,4 +156,10 @@ public class CraftPersistentDataContainer implements PersistentDataContainer {
|
|
|
|
public Map<String, Object> serialize() {
|
2021-06-12 17:06:20 +02:00
|
|
|
return (Map<String, Object>) CraftNBTTagConfigSerializer.serialize(this.toTagCompound());
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
2021-12-05 08:11:59 +01:00
|
|
|
+
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start
|
|
|
|
+ public void clear() {
|
|
|
|
+ this.customDataTags.clear();
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
2021-12-05 08:11:59 +01:00
|
|
|
}
|