package net.aufdemrand.denizen.nms.abstracts;
import net.aufdemrand.denizen.nms.NMSHandler;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class BlockLight {
protected static final Map<Location, BlockLight> lightsByLocation = new HashMap<Location, BlockLight>();
protected static final Map<Chunk, List<BlockLight>> lightsByChunk = new HashMap<Chunk, List<BlockLight>>();
protected static final BlockFace[] adjacentFaces = new BlockFace[]{
BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN
};
protected final Block block;
public final Chunk chunk;
protected final int originalLight;
protected int currentLight;
public int cachedLight;
public BukkitTask removeTask;
protected BlockLight(Location location, long ticks) {
this.block = location.getBlock();
this.chunk = location.getChunk();
this.originalLight = block.getLightLevel();
this.currentLight = originalLight;
this.cachedLight = originalLight;
this.removeLater(ticks);
}
public void removeLater(long ticks) {
if (ticks > 0) {
this.removeTask = new BukkitRunnable() {
@Override
public void run() {
removeTask = null;
removeLight(block.getLocation());
}
}.runTaskLater(NMSHandler.getJavaPlugin(), ticks);
}
}
public static void removeLight(Location location) {
location = location.getBlock().getLocation();
if (lightsByLocation.containsKey(location)) {
BlockLight blockLight = lightsByLocation.get(location);
blockLight.reset(true);
if (blockLight.removeTask != null) {
blockLight.removeTask.cancel();
}
lightsByLocation.remove(location);
lightsByChunk.get(blockLight.chunk).remove(blockLight);
if (lightsByChunk.get(blockLight.chunk).isEmpty()) {
lightsByChunk.remove(blockLight.chunk);
}
}
}
public void reset(boolean updateChunk) {
this.update(originalLight, updateChunk);
}
public abstract void update(int lightLevel, boolean updateChunk);
}