From 58c41cebbcc3885bf43e66804edf4b715fd9d262 Mon Sep 17 00:00:00 2001 From: MetallicGoat Date: Sat, 8 Jun 2024 09:03:44 +1000 Subject: [PATCH] #1409: Add methods to get players seeing specific chunks --- .../org/bukkit/craftbukkit/CraftChunk.java | 6 +++++ .../org/bukkit/craftbukkit/CraftWorld.java | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index fb388e33a..9cada3b58 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -48,6 +48,7 @@ import org.bukkit.craftbukkit.block.CraftBiome; import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import org.bukkit.generator.structure.GeneratedStructure; import org.bukkit.generator.structure.Structure; import org.bukkit.persistence.PersistentDataContainer; @@ -376,6 +377,11 @@ public class CraftChunk implements Chunk { return getCraftWorld().getStructures(getX(), getZ(), structure); } + @Override + public Collection getPlayersSeeingChunk() { + return getWorld().getPlayersSeeingChunk(this); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index fe3252ea2..4f3a11b47 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -350,6 +350,31 @@ public class CraftWorld extends CraftRegionAccessor implements World { return true; } + @Override + public Collection getPlayersSeeingChunk(Chunk chunk) { + Preconditions.checkArgument(chunk != null, "chunk cannot be null"); + + return getPlayersSeeingChunk(chunk.getX(), chunk.getZ()); + } + + @Override + public Collection getPlayersSeeingChunk(int x, int z) { + if (!isChunkLoaded(x, z)) { + return Collections.emptySet(); + } + + List players = world.getChunkSource().chunkMap.getPlayers(new ChunkCoordIntPair(x, z), false); + + if (players.isEmpty()) { + return Collections.emptySet(); + } + + return players.stream() + .filter(Objects::nonNull) + .map(EntityPlayer::getBukkitEntity) + .collect(Collectors.toUnmodifiableSet()); + } + @Override public boolean isChunkInUse(int x, int z) { return isChunkLoaded(x, z);