package tv.mineinthebox.essentials.events.portals; import java.util.Arrays; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockRedstoneEvent; import tv.mineinthebox.essentials.xEssentials; import tv.mineinthebox.essentials.instances.Portal; import tv.mineinthebox.essentials.interfaces.EventTemplate; public class PortalActivateEvent extends EventTemplate implements Listener { public PortalActivateEvent(xEssentials pl) { super(pl, "Portal"); } @EventHandler public void onPowered(BlockRedstoneEvent e) { if(e.getNewCurrent() > 0) { if(e.getBlock().getType() == Material.REDSTONE_WIRE || e.getBlock().getType() == Material.DIODE_BLOCK_OFF || e.getBlock().getType() == Material.DIODE_BLOCK_ON) { return; } for(Portal portal : pl.getConfiguration().getPortalConfig().getPortals().values()) { if(doesMatch(e.getBlock(), portal)) { if(portal.isClosed()) { portal.setClosed(false); if(portal.isLinked()) { Portal linked = portal.getLinkedPortal(); linked.setClosed(false); } } else { portal.setClosed(true); if(portal.isLinked()) { Portal linked = portal.getLinkedPortal(); linked.setClosed(true); } } break; } } } } @EventHandler public void psycic(BlockPhysicsEvent e) { if(e.isCancelled()) { return; } if(e.getBlock().getType() == Material.PORTAL) { for(Portal portal : pl.getConfiguration().getPortalConfig().getPortals().values()) { if(portal.getInnerBlocks().contains(e.getBlock())) { e.setCancelled(true); } } } } @EventHandler public void onBreak(BlockBreakEvent e) { if(e.isCancelled()) { return; } if(e.getBlock().getType() == Material.PORTAL) { for(Portal portal : pl.getConfiguration().getPortalConfig().getPortals().values()) { if(portal.getInnerBlocks().contains(e.getBlock())) { if(e.getPlayer().getGameMode() == GameMode.CREATIVE) { sendMessage(e.getPlayer(), ChatColor.RED + "you can only break this portal, if you remove this portal."); } e.setCancelled(true); break; } } } } private boolean doesMatch(Block block, Portal portal) { BlockFace[] faces = {BlockFace.SELF, BlockFace.UP, BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST}; for(BlockFace face : faces) { Block newblock = block.getRelative(face); List<Block> blocks = Arrays.asList(portal.getBlocks()); if(blocks.contains(newblock)) { return true; } } return false; } }