package org.arkham.cs.cosmetics;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.UUID;
import org.arkham.cs.CosmeticSuite;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.metadata.FixedMetadataValue;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
public class Portal implements Listener {
private Location loc;
private Player player;
public static ArrayList<Location> portals = new ArrayList<>();
private static HashMap<UUID, Entry<Portal, Portal>> madePortals = new HashMap<>();
public Portal(Location loc, Player player) {
if(!checkPerms(player)){
player.sendMessage(CosmeticSuite.PREFIX + "You cannot place a portal here");
return;
}
Bukkit.getPluginManager().registerEvents(this, CosmeticSuite.getInstance());
this.loc = loc;
portals.add(loc);
loc = loc.clone().add(0, 1, 0);
this.player = player;
portals.add(loc);
Entry<Portal, Portal> ps = madePortals.get(player.getUniqueId());
if(ps == null){
ps = new SimpleEntry<>(this, null);
madePortals.put(player.getUniqueId(), ps);
return;
}
Portal portal1 = madePortals.get(player.getUniqueId()).getKey();
if(portal1 == null){
ps.setValue(this);
madePortals.put(player.getUniqueId(), ps);
return;
}
Portal portal2 = madePortals.get(player.getUniqueId()).getValue();
if(portal2 != null){
portal1.getLocation().getBlock().setType(Material.AIR);
Location p1n = portal1.getLocation().clone().add(0, 1, 0);
p1n.getBlock().setType(Material.AIR);
portals.remove(p1n);
portals.remove(loc);
portal2.getLocation().getBlock().setType(Material.AIR);
Location p2n = portal2.getLocation().clone().add(0, 1, 0);
p2n.getBlock().setType(Material.AIR);
madePortals.remove(player.getUniqueId());
portals.remove(loc);
portals.remove(p2n);
}
}
public Portal(Player player) {
this(player.getLocation(), player);
}
public Player getPlayer() {
return player;
}
public Location getLocation() {
return loc;
}
public boolean checkPerms(Player player) {
WorldGuardPlugin api = (WorldGuardPlugin) Bukkit.getPluginManager().getPlugin("WorldGuard");
ApplicableRegionSet regions = api.getRegionManager(player.getLocation().getWorld()).getApplicableRegions(player.getLocation());
LocalPlayer lPlayer = api.wrapPlayer(player);
if (regions.size() == 0) {
return true;
}
return regions.canBuild(lPlayer);
}
public void spark(boolean second) {
if (!checkPerms(player)) {
return;
}
Material portal = Material.STATIONARY_WATER;
Location above = loc.clone().add(0, 1, 0);
if(second){
loc.getBlock().setMetadata("portal-2", new FixedMetadataValue(CosmeticSuite.getInstance(), ""));
above.getBlock().setMetadata("portal-2", new FixedMetadataValue(CosmeticSuite.getInstance(), ""));
} else {
loc.getBlock().setMetadata("portal", new FixedMetadataValue(CosmeticSuite.getInstance(), ""));
above.getBlock().setMetadata("portal", new FixedMetadataValue(CosmeticSuite.getInstance(), ""));
}
above.getBlock().setType(portal);
portals.add(above);
loc.getBlock().setType(portal);
}
@EventHandler
public void physics(BlockPhysicsEvent event){
Block block = event.getBlock();
if(block.hasMetadata("portal")){
event.setCancelled(true);
}
if(block.hasMetadata("portal-2")){
event.setCancelled(true);
}
}
}