#1409: Add methods to get players seeing specific chunks

This commit is contained in:
MetallicGoat 2024-06-08 09:03:44 +10:00 committed by md_5
parent 16c9767978
commit 58c41cebbc
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
2 changed files with 31 additions and 0 deletions

View File

@ -48,6 +48,7 @@ import org.bukkit.craftbukkit.block.CraftBiome;
import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.generator.structure.GeneratedStructure; import org.bukkit.generator.structure.GeneratedStructure;
import org.bukkit.generator.structure.Structure; import org.bukkit.generator.structure.Structure;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
@ -376,6 +377,11 @@ public class CraftChunk implements Chunk {
return getCraftWorld().getStructures(getX(), getZ(), structure); return getCraftWorld().getStructures(getX(), getZ(), structure);
} }
@Override
public Collection<Player> getPlayersSeeingChunk() {
return getWorld().getPlayersSeeingChunk(this);
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;

View File

@ -350,6 +350,31 @@ public class CraftWorld extends CraftRegionAccessor implements World {
return true; return true;
} }
@Override
public Collection<Player> getPlayersSeeingChunk(Chunk chunk) {
Preconditions.checkArgument(chunk != null, "chunk cannot be null");
return getPlayersSeeingChunk(chunk.getX(), chunk.getZ());
}
@Override
public Collection<Player> getPlayersSeeingChunk(int x, int z) {
if (!isChunkLoaded(x, z)) {
return Collections.emptySet();
}
List<EntityPlayer> 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 @Override
public boolean isChunkInUse(int x, int z) { public boolean isChunkInUse(int x, int z) {
return isChunkLoaded(x, z); return isChunkLoaded(x, z);