package com.bergerkiller.bukkit.common.internal;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.entity.Player;
import com.bergerkiller.bukkit.common.Common;
import com.bergerkiller.bukkit.common.server.SportBukkitServer;
import com.bergerkiller.bukkit.common.utils.LogicUtil;
import com.bergerkiller.bukkit.common.wrappers.LongHashSet;
/**
* An instance of Player metadata stored by BKCommonLib
*/
public class CommonPlayerMeta {
private final LongHashSet visibleChunks = new LongHashSet(441);
private final WeakReference<Player> playerRef;
private final List<Integer> removeQueue;
@SuppressWarnings("unchecked")
protected CommonPlayerMeta(Player player) {
this.playerRef = new WeakReference<Player>(player);
if (Common.SERVER instanceof SportBukkitServer) {
removeQueue = new ArrayList<Integer>();
} else {
removeQueue = CommonNMS.getNative(player).removeQueue;
}
}
public List<Integer> getRemoveQueue() {
return removeQueue;
}
public void setQueueForRemoval(int entityId, boolean remove) {
LogicUtil.addOrRemove(removeQueue, entityId, remove);
}
public Player getPlayer() {
return playerRef.get();
}
public void clearVisibleChunks() {
synchronized (visibleChunks) {
visibleChunks.clear();
}
}
public boolean isChunkVisible(int chunkX, int chunkZ) {
synchronized (visibleChunks) {
return visibleChunks.contains(chunkX, chunkZ);
}
}
public void setChunksAsVisible(int[] chunkX, int[] chunkZ) {
if (chunkX.length != chunkZ.length) {
throw new IllegalArgumentException("Chunk X and Z coordinate count is not the same");
}
synchronized (visibleChunks) {
for (int i = 0; i < chunkX.length; i++) {
visibleChunks.add(chunkX[i], chunkZ[i]);
}
}
}
public void setChunkVisible(int chunkX, int chunkZ, boolean visible) {
synchronized (visibleChunks) {
if (visible) {
visibleChunks.add(chunkX, chunkZ);
} else {
visibleChunks.remove(chunkX, chunkZ);
}
}
}
}