package net.diamonddominion.esaych.survival;
import java.util.ArrayList;
import net.diamonddominion.esaych.CustomPlugin;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.EnderCrystal;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityCreatePortalEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
public class EndDragonRespawn {
private CustomPlugin plugin;
public EndDragonRespawn(CustomPlugin plugin) {
this.plugin = plugin;
}
private World End;
private ArrayList<String> crystalLocations = new ArrayList<String>();
@SuppressWarnings("deprecation")
public void enable() {
log("Enabling...");
// plugin.getServer().getPluginManager().registerEvents(this, plugin);
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
End = Bukkit.getWorld("End");
if (End == null) {
plugin.getLogger().warning("No End world found!");
}
}
}, 5 * 20);
plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
@Override
public void run() {
scanEnd(false);
}
}, 20 * 6, 20 * 60);
log("Searching for End shortly.");
crystalLocations.add("-8,70,15");
crystalLocations.add("-26,75,20");
crystalLocations.add("-26,93,31");
crystalLocations.add("-66,77,62");
crystalLocations.add("-43,81,69");
crystalLocations.add("-42,74,114");
crystalLocations.add("-30,72,96");
crystalLocations.add("-11,82,119");
crystalLocations.add("-2,83,80");
crystalLocations.add("29,94,65");
crystalLocations.add("58,85,50");
crystalLocations.add("50,78,13");
crystalLocations.add("60,89,-2");
crystalLocations.add("92,79,5");
crystalLocations.add("72,97,-6");
crystalLocations.add("75,74,-38");
crystalLocations.add("32,82,-83");
crystalLocations.add("6,76,-37");
crystalLocations.add("-11,81,-82");
crystalLocations.add("-46,91,-66");
crystalLocations.add("-53,88,-30");
crystalLocations.add("-41,71,-20");
crystalLocations.add("-101,82,-8");
log("Enabled");
}
public void scanEnd(final boolean spawnNew) {
if (End == null) {
End = Bukkit.getWorld("End");
} else {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
boolean found = false;
ArrayList<Location> foundCrystals = new ArrayList<Location>();
for (Chunk chunk : End.getLoadedChunks()) {
for (Entity e : chunk.getEntities()) {
if (e instanceof EnderDragon) {
if (found)
e.remove();
found = true;
}
if (e instanceof EnderCrystal) {
boolean cfound = false;
for (Location l : foundCrystals) {
if (e.getLocation().distance(l) < 3) {
e.remove();
cfound = true;
continue;
}
}
if (!cfound) {
foundCrystals.add(e.getLocation());
}
}
}
}
if (!found && spawnNew) {
Location loc = new Location(End, 0, 85, -1.5);
End.spawnEntity(loc, EntityType.ENDER_DRAGON);
respawnEnderCrystals();
plugin.getServer().broadcastMessage(ChatColor.BLACK + "[" + ChatColor.DARK_RED + "EndDragonRespawn" + ChatColor.BLACK + "]" + ChatColor.RED + " The dragon has resurrected!");
log("EnderDragon Respawned!");
} else {
if (spawnNew)
log("Dragon found. No need to respawn.");
}
}
}, 200L);
}
}
public void respawnEnderCrystals() {
for (String strLoc : crystalLocations) {
String[] strL = strLoc.split(",");
Location loc = new Location(End, Integer.parseInt(strL[0]) + .5, Integer.parseInt(strL[1]), Integer.parseInt(strL[2]) + .5);
boolean pre = false;
for (Entity e : End.getEntities()) {
if (e instanceof EnderCrystal) {
if (e.getLocation().distance(loc) < 3) {
pre = true;
break;
}
}
}
if (pre)
continue;
loc.getBlock().setType(Material.BEDROCK);
End.spawnEntity(loc, EntityType.ENDER_CRYSTAL);
Location search = loc.clone();
search.add(0, -1, 0);
while (!End.getBlockAt(search).getType().equals(Material.BEDROCK)) {
search.add(0, -1, 0);
// log(search.getBlock().getType().toString());
if (search.getBlockY() <= 1) {
log("ERROR! SPAWN CRYSTAL AT: " + strLoc + " DOES NOT HAVE BEDROCK.");
break;
}
}
if (search.getBlockY() <= 1) {
continue;
}
ArrayList<Location> bedrockLayer = new ArrayList<Location>();
for (int x = search.getBlockX() - 3; x <= search.getBlockX() + 3; x++) {
for (int z = search.getBlockZ() - 3; z <= search.getBlockZ() + 3; z++) {
Location l = new Location(End, x, search.getY(), z);
if (l.getBlock().getType().equals(Material.BEDROCK)) {
bedrockLayer.add(l);
}
}
}
for (Location l : bedrockLayer) {
for (int y = l.getBlockY() + 1; y < loc.getBlockY(); y++) {
Block b = End.getBlockAt(l.getBlockX(), y, l.getBlockZ());
if (!b.getType().equals(Material.OBSIDIAN))
b.setType(Material.OBSIDIAN);
}
}
}
}
// @EventHandler
public void onPlayerGoesToEnd(PlayerChangedWorldEvent event) {
Player player = event.getPlayer();
if (!player.getWorld().getEnvironment().equals(World.Environment.THE_END))
return;
scanEnd(true);
}
// @EventHandler
@SuppressWarnings("deprecation")
public void onDragonCreatesPortal(EntityCreatePortalEvent event)
{
if (event.isCancelled())
return;
Entity entity = event.getEntity();
if (!(entity instanceof EnderDragon))
return;
log("The dragon has been killed!");
Location enderEggLoc = entity.getLocation();
if (enderEggLoc != null) {
End.getBlockAt(enderEggLoc).setTypeId(122);
} else {
log("Failed to process portal, cancelling event anyway!");
}
event.setCancelled(true);
}
public void log(String info) {
plugin.getLogger().info("<EndDragonRespawn> " + info);
}
}