package com.bergerkiller.bukkit.common.internal; import java.util.logging.Level; import org.bukkit.entity.Player; import com.bergerkiller.bukkit.common.protocol.CommonPacket; import com.bergerkiller.bukkit.common.protocol.PacketMonitor; import com.bergerkiller.bukkit.common.protocol.PacketType; /** * Packet listener of BKCommonLib to keep track of send chunks. * This is used to keep the 'chunks a player can see' up-to-date. */ class CommonPacketMonitor implements PacketMonitor { public static final PacketType[] TYPES = {PacketType.OUT_MAP_CHUNK, PacketType.OUT_MAP_CHUNK_BULK, PacketType.OUT_RESPAWN}; private boolean listenError = false; @Override public void onMonitorPacketReceive(CommonPacket packet, Player player) { } @Override public void onMonitorPacketSend(CommonPacket packet, Player player) { // Keep track of chunk loading and unloading at clients CommonPlayerMeta meta = CommonPlugin.getInstance().getPlayerMeta(player); if (packet.getType() == PacketType.OUT_MAP_CHUNK) { // Update it for a single chunk boolean visible = packet.read(PacketType.OUT_MAP_CHUNK.chunkDataBitMap) != 0; int chunkX = packet.read(PacketType.OUT_MAP_CHUNK.x); int chunkZ = packet.read(PacketType.OUT_MAP_CHUNK.z); meta.setChunkVisible(chunkX, chunkZ, visible); } else if (packet.getType() == PacketType.OUT_MAP_CHUNK_BULK) { // Update it for multiple chunks at once // This type of packet only makes new chunks visible - it never unloads int[] chunkX = packet.read(PacketType.OUT_MAP_CHUNK_BULK.bulk_x); int[] chunkZ = packet.read(PacketType.OUT_MAP_CHUNK_BULK.bulk_z); meta.setChunksAsVisible(chunkX, chunkZ); } else if (packet.getType() == PacketType.OUT_RESPAWN) { // Clear all known chunks meta.clearVisibleChunks(); } else if (!listenError) { listenError = true; CommonPlugin.LOGGER_NETWORK.log(Level.WARNING, "Packet entered listener that the listener was not registered for: type=" + packet.getType()); } } }