/** * bFundamentalsBuild 1.2-SNAPSHOT * Copyright (C) 2013 CodingBadgers <plugins@mcbadgercraft.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package uk.codingbadgers.bportalshelper; import java.util.ArrayList; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import com.sk89q.worldedit.bukkit.selections.Selection; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.regions.ProtectedRegion; public class PortalPlayer { /** The bukkit player object. */ private final Player m_player; /** The portals being linked. */ private Portal[] m_portals = new Portal[2]; /** The current portal being set, either 1 or 2. */ private int m_activePortal = 1; /** * Create a new portal player, storing the bukkit player object * * @param player The bukkit player this portal player represents */ public PortalPlayer(Player player) { m_player = player; m_portals[0] = null; m_portals[1] = null; } /** * Compare a player and a portal player to see if they are equal * * @param obj An object to compare */ public boolean equals(Object obj) { if (!(obj instanceof Player)) return false; Player player = (Player)obj; if (m_player.getName().equalsIgnoreCase(player.getName())) return true; return false; } /** * Adds a portal. * * @param portalSelection The portal selection * @param direction The direction */ public void addPortal(Selection portalSelection) { final ProtectedRegion region = getChildRegionFromLocation(m_player); if (region == null) { bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Please region this area before creating a portal too it."); return; } m_portals[m_activePortal - 1] = new Portal(m_player, region.getId(), portalSelection); bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Selected Portal " + m_activePortal + "."); // change to the other portal if (m_activePortal == 1) m_activePortal = 2; else m_activePortal = 1; // see if we have two portals set if (m_portals[0] == null || m_portals[1] == null) return; // link the two portals final String portalOneName = m_portals[0].getWorld() + "_" + m_portals[0].getRegionName() + "_" + m_portals[1].getRegionName(); final String portalTwoName = m_portals[1].getWorld() + "_" + m_portals[1].getRegionName() + "_" + m_portals[0].getRegionName(); bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Creating portals..."); if (!m_portals[0].createPortal(portalOneName)) { bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Failed to create portal " + portalOneName + "."); m_portals[0] = null; m_portals[1] = null; return; } bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Created first portal..."); if (!m_portals[1].createPortal(portalTwoName)) { bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Failed to create portal " + portalTwoName + "."); m_portals[0] = null; m_portals[1] = null; return; } bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Created second portal..."); bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Linking portals..."); m_portals[0].setDestination(m_portals[1]); m_portals[1].setDestination(m_portals[0]); bPortalsHelper.sendMessage("bPortalsHelper", m_player, "Portals created and linked!"); m_portals[0] = null; m_portals[1] = null; } private ProtectedRegion getChildRegionFromLocation(Player player) { final Location location = player.getLocation(); final World world = player.getWorld(); WorldGuardPlugin wg = bPortalsHelper.getWorldGuard(); ArrayList<ProtectedRegion> possibleRegions = new ArrayList<ProtectedRegion>(); // loop through every region for (String regionName : wg.getRegionManager(world).getRegions().keySet()) { // get the region from its name ProtectedRegion currentRegion = wg.getRegionManager(world).getRegion(regionName); // create a world edit vector for the signs position com.sk89q.worldedit.Vector v = new com.sk89q.worldedit.Vector( location.getX(), location.getY(), location.getZ() ); // if the current region contains the sign, add it to the list of possible regions if (currentRegion.contains(v)) { possibleRegions.add(currentRegion); } } // if we didnt get any regions, bail. if (possibleRegions.size() == 0) return null; // if we only got one region, it has to be the region we use if (possibleRegions.size() == 1) return possibleRegions.get(0); // work out the lowest child of the regions int childLevel = 0; ProtectedRegion lowestChild = null; for (int i = 0; i < possibleRegions.size(); ++i) { if (possibleRegions.get(i).getParent() != null) { ProtectedRegion tempRegion = possibleRegions.get(i); int tempChildLevel = 0; while(tempRegion.getParent() != null) { tempRegion = tempRegion.getParent(); tempChildLevel++; } if (tempChildLevel > childLevel) { childLevel = tempChildLevel; lowestChild = possibleRegions.get(i); } } } // if we found the lowest child return that if (lowestChild != null) return lowestChild; // if we didn't find the lowest child, but found some regions, return the first region if (possibleRegions.size() > 0) return possibleRegions.get(0); // something went very wrong return null; } }