package tv.mineinthebox.essentials.events.portals; import java.util.Date; import java.util.HashMap; import java.util.concurrent.TimeUnit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerQuitEvent; import tv.mineinthebox.essentials.xEssentials; import tv.mineinthebox.essentials.instances.Portal; import tv.mineinthebox.essentials.interfaces.EventTemplate; public class PortalEvent extends EventTemplate implements Listener { private final HashMap<String, Long> time = new HashMap<String, Long>(); public PortalEvent(xEssentials pl) { super(pl, "Portal"); } @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.LOWEST) public void onEnter(PlayerPortalEvent e) { if(e.isCancelled()) { return; } e.setCancelled(true); Block block = getPortalNearby(e.getPlayer().getLocation().getBlock()); if(!(block instanceof Block)) { return; } for(Portal portal : pl.getConfiguration().getPortalConfig().getPortals().values()) { if(portal.getInnerBlocks().contains(block)) { if(pl.getConfiguration().getPortalConfig().getCooldown() > 0) { if(time.containsKey(e.getPlayer().getName())) { if(time.get(e.getPlayer().getName()) < System.currentTimeMillis()) { time.remove(e.getPlayer().getName()); } else { e.setCancelled(true); Long millis = (time.get(e.getPlayer().getName())-System.currentTimeMillis()); String msg = String.format("%d:%s", TimeUnit.MILLISECONDS.toMinutes(millis), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))); sendMessage(e.getPlayer(), ChatColor.GRAY + "cooldown please wait: " + ChatColor.GREEN + msg + ChatColor.GRAY + " minutes"); return; } } else { Date date = new Date(System.currentTimeMillis()); date.setSeconds(date.getSeconds()+pl.getConfiguration().getPortalConfig().getCooldown()); time.put(e.getPlayer().getName(), date.getTime()); } } e.useTravelAgent(false); if(portal.isLinked()) { Portal linked = portal.getLinkedPortal(); if(!(linked instanceof Portal)) { e.setCancelled(true); return; } //e.setTo(linked.getInnerBlocks()[(linked.getInnerBlocks().length-1)].getLocation()); e.setTo(linked.getExitLocation()); e.setCancelled(false); } else { e.setCancelled(true); } break; } } e.setCancelled(false); } @EventHandler public void onEntityPortal(EntityPortalEvent e) { if(e.isCancelled()) { return; } e.setCancelled(true); Block block = getPortalNearby(e.getEntity().getLocation().getBlock()); if(!(block instanceof Block)) { return; } for(Portal portal : pl.getConfiguration().getPortalConfig().getPortals().values()) { if(portal.getInnerBlocks().contains(block)) { if(e.getEntity() instanceof Item) { e.setCancelled(true); return; } e.useTravelAgent(false); if(portal.isLinked()) { Portal linked = portal.getLinkedPortal(); if(!(linked instanceof Portal)) { e.setCancelled(true); return; } e.setTo(linked.getInnerBlocks().get(linked.getInnerBlocks().size()-1).getLocation()); e.setCancelled(false); } else { e.setCancelled(true); } break; } } e.setCancelled(false); } public Block getPortalNearby(Block block) { BlockFace[] faces = {BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, BlockFace.SELF}; for(BlockFace face : faces) { if(block.getRelative(face).getType() == Material.PORTAL) { return block.getRelative(face); } } return null; } @EventHandler public void onQuit(PlayerQuitEvent e) { if(time.containsKey(e.getPlayer().getName())) { time.remove(e.getPlayer().getName()); } } @EventHandler public void onQuit(PlayerKickEvent e) { if(time.containsKey(e.getPlayer().getName())) { time.remove(e.getPlayer().getName()); } } }