mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 15:49:00 +01:00
Add API to get Tile Entities in a Chunk by Predicate
This commit is contained in:
parent
5583c8c007
commit
cfd2fcf443
2 changed files with 67 additions and 11 deletions
|
@ -8,30 +8,49 @@ diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chun
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/org/bukkit/Chunk.java
|
--- a/src/main/java/org/bukkit/Chunk.java
|
||||||
+++ b/src/main/java/org/bukkit/Chunk.java
|
+++ b/src/main/java/org/bukkit/Chunk.java
|
||||||
|
@@ -0,0 +0,0 @@
|
||||||
|
package org.bukkit;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
+import java.util.function.Predicate;
|
||||||
|
+
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
@@ -0,0 +0,0 @@ public interface Chunk extends PersistentDataHolder {
|
@@ -0,0 +0,0 @@ public interface Chunk extends PersistentDataHolder {
|
||||||
@NotNull
|
@NotNull
|
||||||
Entity[] getEntities();
|
Entity[] getEntities();
|
||||||
|
|
||||||
+ // Paper start
|
+ // Paper start
|
||||||
+ /**
|
|
||||||
+ * Get a list of all tile entities in the chunk.
|
|
||||||
+ *
|
|
||||||
+ * @return The tile entities.
|
|
||||||
+ */
|
|
||||||
+ @NotNull
|
|
||||||
+ default BlockState[] getTileEntities() {
|
|
||||||
+ return getTileEntities(true);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/**
|
/**
|
||||||
* Get a list of all tile entities in the chunk.
|
* Get a list of all tile entities in the chunk.
|
||||||
*
|
*
|
||||||
+ * @param useSnapshot Take snapshots or direct references
|
|
||||||
* @return The tile entities.
|
* @return The tile entities.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
- BlockState[] getTileEntities();
|
- BlockState[] getTileEntities();
|
||||||
|
+ default BlockState[] getTileEntities() {
|
||||||
|
+ return getTileEntities(true);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Get a list of all tile entities in the chunk.
|
||||||
|
+ *
|
||||||
|
+ * @param useSnapshot Take snapshots or direct references
|
||||||
|
+ * @return The tile entities.
|
||||||
|
+ */
|
||||||
|
+ @NotNull
|
||||||
+ BlockState[] getTileEntities(boolean useSnapshot);
|
+ BlockState[] getTileEntities(boolean useSnapshot);
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Get a list of all tile entities that match a given predicate in the chunk.
|
||||||
|
+ *
|
||||||
|
+ * @param blockPredicate The predicate of blocks to return tile entities for
|
||||||
|
+ * @param useSnapshot Take snapshots or direct references
|
||||||
|
+ * @return The tile entities.
|
||||||
|
+ */
|
||||||
|
+ @NotNull
|
||||||
|
+ Collection<BlockState> getTileEntities(@NotNull Predicate<Block> blockPredicate, boolean useSnapshot);
|
||||||
+ // Paper end
|
+ // Paper end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,6 +8,17 @@ diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/jav
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||||||
|
@@ -0,0 +0,0 @@ package org.bukkit.craftbukkit;
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
+import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
+import java.util.List;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import net.minecraft.server.BiomeStorage;
|
||||||
|
import net.minecraft.server.BlockPosition;
|
||||||
@@ -0,0 +0,0 @@ public class CraftChunk implements Chunk {
|
@@ -0,0 +0,0 @@ public class CraftChunk implements Chunk {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -31,6 +42,32 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
BlockPosition position = (BlockPosition) obj;
|
BlockPosition position = (BlockPosition) obj;
|
||||||
- entities[index++] = worldServer.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState();
|
- entities[index++] = worldServer.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState();
|
||||||
+ entities[index++] = worldServer.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState(useSnapshot); // Paper
|
+ entities[index++] = worldServer.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState(useSnapshot); // Paper
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return entities;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // Paper start
|
||||||
|
+ @Override
|
||||||
|
+ public Collection<BlockState> getTileEntities(Predicate<Block> blockPredicate, boolean useSnapshot) {
|
||||||
|
+ Preconditions.checkNotNull(blockPredicate, "blockPredicate");
|
||||||
|
+ if (!isLoaded()) {
|
||||||
|
+ getWorld().getChunkAt(x, z); // Transient load for this tick
|
||||||
|
+ }
|
||||||
|
+ net.minecraft.server.Chunk chunk = getHandle();
|
||||||
|
+
|
||||||
|
+ List<BlockState> entities = new ArrayList<>();
|
||||||
|
+
|
||||||
|
+ for (BlockPosition position : chunk.tileEntities.keySet()) {
|
||||||
|
+ Block block = worldServer.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ());
|
||||||
|
+ if (blockPredicate.test(block)) {
|
||||||
|
+ entities.add(block.getState(useSnapshot));
|
||||||
|
+ }
|
||||||
}
|
}
|
||||||
|
|
||||||
return entities;
|
return entities;
|
||||||
|
}
|
||||||
|
+ // Paper end
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLoaded() {
|
||||||
|
|
Loading…
Reference in a new issue