package tv.mineinthebox.essentials.events.bridges;
import java.io.File;
import java.util.LinkedList;
import java.util.UUID;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.SignChangeEvent;
import tv.mineinthebox.essentials.xEssentials;
import tv.mineinthebox.essentials.instances.Bridge;
import tv.mineinthebox.essentials.interfaces.EventTemplate;
public class BridgeCreateEvent extends EventTemplate implements Listener {
public BridgeCreateEvent(xEssentials pl) {
super(pl, "Bridge");
}
@EventHandler
public void onCreate(SignChangeEvent e) {
if(e.getLine(0).equalsIgnoreCase("[bridge]")) {
if(hasSignOnOtherSide(e.getBlock())) {
Block sign1 = e.getBlock();
Block sign2 = getOtherSignBlock(sign1);
LinkedList<String> locs = new LinkedList<String>();
int xmin = Math.min(sign1.getX(), sign2.getX());
int xmax = Math.max(sign1.getX(), sign2.getX());
int zmin = Math.min(sign1.getZ(), sign2.getZ());
int zmax = Math.max(sign1.getZ(), sign2.getZ());
if(xmin == xmax) {
//z-index
for(int z = zmin; z < zmax; z++) {
Location loc = new Location(sign1.getWorld(),sign1.getX(), (sign1.getY()-1), z);
Location loc2 = new Location(sign1.getWorld(),(sign1.getX()+1), (sign1.getY()-1), z);
Location loc3 = new Location(sign1.getWorld(),(sign1.getX()-1), (sign1.getY()-1), z);
if(loc.getBlock().getType() == Material.AIR) {
String serialized = loc.getWorld().getName()+":"+loc.getBlockX()+":"+loc.getBlockY()+":"+loc.getBlockZ();
locs.add(serialized);
}
if(loc2.getBlock().getType() == Material.AIR) {
String serialized = loc2.getWorld().getName()+":"+loc2.getBlockX()+":"+loc2.getBlockY()+":"+loc2.getBlockZ();
locs.add(serialized);
}
if(loc3.getBlock().getType() == Material.AIR) {
String serialized = loc3.getWorld().getName()+":"+loc3.getBlockX()+":"+loc3.getBlockY()+":"+loc3.getBlockZ();
locs.add(serialized);
}
}
} else if(zmin == zmax) {
//x-index
for(int x = xmin; x < xmax; x++) {
Location loc = new Location(sign1.getWorld(),x, (sign1.getY()-1), sign1.getZ());
Location loc2 = new Location(sign1.getWorld(),x, (sign1.getY()-1), (sign1.getZ()+1));
Location loc3 = new Location(sign1.getWorld(),x, (sign1.getY()-1), (sign1.getZ()-1));
if(loc.getBlock().getType() == Material.AIR) {
String serialized = loc.getWorld().getName()+":"+loc.getBlockX()+":"+loc.getBlockY()+":"+loc.getBlockZ();
locs.add(serialized);
}
if(loc2.getBlock().getType() == Material.AIR) {
String serialized = loc2.getWorld().getName()+":"+loc2.getBlockX()+":"+loc2.getBlockY()+":"+loc2.getBlockZ();
locs.add(serialized);
}
if(loc3.getBlock().getType() == Material.AIR) {
String serialized = loc3.getWorld().getName()+":"+loc3.getBlockX()+":"+loc3.getBlockY()+":"+loc3.getBlockZ();
locs.add(serialized);
}
}
}
try {
File f = new File(pl.getDataFolder() + File.separator + "misc" + File.separator + "bridges" + File.separator + UUID.randomUUID().toString() + ".yml");
FileConfiguration con = YamlConfiguration.loadConfiguration(f);
con.set("signBlock1", sign1.getWorld().getName()+":"+sign1.getX()+":"+sign1.getY()+":"+sign1.getZ());
con.set("signBlock2", sign2.getWorld().getName()+":"+sign2.getX()+":"+sign2.getY()+":"+sign2.getZ());
con.set("blocks", locs);
con.save(f);
Bridge bridge = new Bridge(f, con, pl);
pl.getManagers().getBridgeManager().addBridge(bridge);
e.setLine(0, ChatColor.DARK_PURPLE + "[Bridge]");
sendMessage(e.getPlayer(), ChatColor.GREEN + "you have successfully created a bridge!, and connected them.");
} catch(Exception r) {
r.printStackTrace();
}
} else {
sendMessage(e.getPlayer(), ChatColor.GREEN + "you have successfully placed a bridge sign, but the sign is not connected yet.");
e.setLine(0, ChatColor.DARK_PURPLE + "[Bridge]");
}
}
}
private boolean hasSignOnOtherSide(Block block) {
for(int x = block.getX(); x < (block.getX()+pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); x++) {
Block blocksign = block.getWorld().getBlockAt(x, block.getY(), block.getZ());
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return true;
}
}
}
for(int x = block.getX(); x > (block.getX() - pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); x--) {
Block blocksign = block.getWorld().getBlockAt(x, block.getY(), block.getZ());
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return true;
}
}
}
for(int z = block.getZ(); z < (block.getZ()+pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); z++) {
Block blocksign = block.getWorld().getBlockAt(block.getX(), block.getY(), z);
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return true;
}
}
}
for(int z = block.getZ(); z > (block.getZ() - pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); z--) {
Block blocksign = block.getWorld().getBlockAt(block.getX(), block.getY(), z);
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return true;
}
}
}
return false;
}
private Block getOtherSignBlock(Block block) {
for(int x = block.getX(); x < (block.getX()+pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); x++) {
Block blocksign = block.getWorld().getBlockAt(x, block.getY(), block.getZ());
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return sign.getBlock();
}
}
}
for(int x = block.getX(); x > (block.getX()-pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); x--) {
Block blocksign = block.getWorld().getBlockAt(x, block.getY(), block.getZ());
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return sign.getBlock();
}
}
}
for(int z = block.getZ(); z < (block.getZ()+pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); z++) {
Block blocksign = block.getWorld().getBlockAt(block.getX(), block.getY(), z);
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return sign.getBlock();
}
}
}
for(int z = block.getZ(); z > (block.getZ()-pl.getConfiguration().getMiscConfig().getMaxBridgeSize()); z--) {
Block blocksign = block.getWorld().getBlockAt(block.getX(), block.getY(), z);
if(blocksign.getType() == Material.SIGN_POST) {
Sign sign = (Sign) blocksign.getState();
if(sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_PURPLE + "[Bridge]")) {
return sign.getBlock();
}
}
}
return null;
}
}