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);