Search in sources :

Example 1 with Polygonal2DRegionSelector

use of com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector in project FastAsyncWorldEdit by IntellectualSites.

the class AbstractPlayerActor method setSelection.

@Override
public void setSelection(Region region) {
    RegionSelector selector;
    if (region instanceof ConvexPolyhedralRegion) {
        selector = new ConvexPolyhedralRegionSelector((ConvexPolyhedralRegion) region);
    } else if (region instanceof CylinderRegion) {
        selector = new CylinderRegionSelector((CylinderRegion) region);
    } else if (region instanceof Polygonal2DRegion) {
        selector = new Polygonal2DRegionSelector((Polygonal2DRegion) region);
    } else {
        selector = new CuboidRegionSelector(null, region.getMinimumPoint(), region.getMaximumPoint());
    }
    selector.setWorld(region.getWorld());
    getSession().setRegionSelector(getWorld(), selector);
}
Also used : CuboidRegionSelector(com.sk89q.worldedit.regions.selector.CuboidRegionSelector) CylinderRegionSelector(com.sk89q.worldedit.regions.selector.CylinderRegionSelector) Polygonal2DRegionSelector(com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector) ConvexPolyhedralRegionSelector(com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector) RegionSelector(com.sk89q.worldedit.regions.RegionSelector) ConvexPolyhedralRegionSelector(com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector) Polygonal2DRegion(com.sk89q.worldedit.regions.Polygonal2DRegion) Polygonal2DRegionSelector(com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector) ConvexPolyhedralRegion(com.sk89q.worldedit.regions.ConvexPolyhedralRegion) CylinderRegion(com.sk89q.worldedit.regions.CylinderRegion) CylinderRegionSelector(com.sk89q.worldedit.regions.selector.CylinderRegionSelector) CuboidRegionSelector(com.sk89q.worldedit.regions.selector.CuboidRegionSelector)

Example 2 with Polygonal2DRegionSelector

use of com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector in project FastAsyncWorldEdit by IntellectualSites.

the class SelectionCommands method select.

@Command(name = "/sel", aliases = { ";", "/desel", "/deselect" }, desc = "Choose a region selector")
// FAWE start
@CommandPermissions("worldedit.analysis.sel")
public // FAWE end
void select(Actor actor, World world, LocalSession session, @Arg(desc = "Selector to switch to", def = "") SelectorChoice selector, @Switch(name = 'd', desc = "Set default selector") boolean setDefaultSelector) throws WorldEditException {
    if (selector == null) {
        session.getRegionSelector(world).clear();
        session.dispatchCUISelection(actor);
        actor.print(Caption.of("worldedit.select.cleared"));
        return;
    }
    final RegionSelector oldSelector = session.getRegionSelector(world);
    final RegionSelector newSelector;
    switch(selector) {
        case CUBOID:
            newSelector = new CuboidRegionSelector(oldSelector);
            actor.print(Caption.of("worldedit.select.cuboid.message"));
            break;
        case EXTEND:
            newSelector = new ExtendingCuboidRegionSelector(oldSelector);
            actor.print(Caption.of("worldedit.select.extend.message"));
            break;
        case POLY:
            {
                newSelector = new Polygonal2DRegionSelector(oldSelector);
                actor.print(Caption.of("worldedit.select.poly.message"));
                Optional<Integer> limit = ActorSelectorLimits.forActor(actor).getPolygonVertexLimit();
                limit.ifPresent(integer -> actor.print(Caption.of("worldedit.select.poly.limit-message", TextComponent.of(integer))));
                break;
            }
        case ELLIPSOID:
            newSelector = new EllipsoidRegionSelector(oldSelector);
            actor.print(Caption.of("worldedit.select.ellipsoid.message"));
            break;
        case SPHERE:
            newSelector = new SphereRegionSelector(oldSelector);
            actor.print(Caption.of("worldedit.select.sphere.message"));
            break;
        case CYL:
            newSelector = new CylinderRegionSelector(oldSelector);
            actor.print(Caption.of("worldedit.select.cyl.message"));
            break;
        case CONVEX:
        case HULL:
        case POLYHEDRON:
            {
                newSelector = new ConvexPolyhedralRegionSelector(oldSelector);
                actor.print(Caption.of("worldedit.select.convex.message"));
                Optional<Integer> limit = ActorSelectorLimits.forActor(actor).getPolyhedronVertexLimit();
                limit.ifPresent(integer -> actor.print(Caption.of("worldedit.select.convex.limit-message", TextComponent.of(integer))));
                break;
            }
        // FAWE start
        case POLYHEDRAL:
            newSelector = new PolyhedralRegionSelector(world);
            actor.print(Caption.of("fawe.selection.sel.convex.polyhedral"));
            Optional<Integer> limit = ActorSelectorLimits.forActor(actor).getPolyhedronVertexLimit();
            limit.ifPresent(integer -> actor.print(Caption.of("fawe.selection.sel.max", integer)));
            actor.print(Caption.of("fawe.selection.sel.list"));
            break;
        case FUZZY:
        case MAGIC:
            Mask maskOpt = new IdMask(world);
            newSelector = new FuzzyRegionSelector(actor, world, maskOpt);
            actor.print(Caption.of("fawe.selection.sel.fuzzy"));
            actor.print(Caption.of("fawe.selection.sel.list"));
            break;
        // FAWE end
        case LIST:
        default:
            CommandListBox box = new CommandListBox("Selection modes", null, null);
            box.setHidingHelp(true);
            TextComponentProducer contents = box.getContents();
            contents.append(SubtleFormat.wrap("Select one of the modes below:")).newline();
            box.appendCommand("cuboid", Caption.of("worldedit.select.cuboid.description"), "//sel cuboid");
            box.appendCommand("extend", Caption.of("worldedit.select.extend.description"), "//sel extend");
            box.appendCommand("poly", Caption.of("worldedit.select.poly.description"), "//sel poly");
            box.appendCommand("ellipsoid", Caption.of("worldedit.select.ellipsoid.description"), "//sel ellipsoid");
            box.appendCommand("sphere", Caption.of("worldedit.select.sphere.description"), "//sel sphere");
            box.appendCommand("cyl", Caption.of("worldedit.select.cyl.description"), "//sel cyl");
            box.appendCommand("convex", Caption.of("worldedit.select.convex.description"), "//sel convex");
            // FAWE start
            box.appendCommand("polyhedral", Caption.of("fawe.selection.sel.polyhedral"), "//sel polyhedral");
            box.appendCommand("fuzzy[=<mask>]", Caption.of("fawe.selection.sel.fuzzy-instruction"), "//sel fuzzy[=<mask>]");
            box.setComponentsPerPage(box.getComponentsSize());
            // FAWE end
            actor.print(box.create(1));
            return;
    }
    if (setDefaultSelector) {
        RegionSelectorType found = null;
        for (RegionSelectorType type : RegionSelectorType.values()) {
            if (type.getSelectorClass() == newSelector.getClass()) {
                found = type;
                break;
            }
        }
        if (found != null) {
            session.setDefaultRegionSelector(found);
            actor.print(Caption.of("worldedit.select.default-set", TextComponent.of(found.name())));
        } else {
            throw new RuntimeException("Something unexpected happened. Please report this.");
        }
    }
    session.setRegionSelector(world, newSelector);
    session.dispatchCUISelection(actor);
}
Also used : EditSession(com.sk89q.worldedit.EditSession) ChunkStore(com.sk89q.worldedit.world.storage.ChunkStore) BlockVector3(com.sk89q.worldedit.math.BlockVector3) Player(com.sk89q.worldedit.entity.Player) World(com.sk89q.worldedit.world.World) Caption(com.fastasyncworldedit.core.configuration.Caption) BaseItemStack(com.sk89q.worldedit.blocks.BaseItemStack) Arg(org.enginehub.piston.annotation.param.Arg) MaskTraverser(com.fastasyncworldedit.core.util.MaskTraverser) ExtendingCuboidRegionSelector(com.sk89q.worldedit.regions.selector.ExtendingCuboidRegionSelector) Component(com.sk89q.worldedit.util.formatting.text.Component) RegionOperationException(com.sk89q.worldedit.regions.RegionOperationException) SelectionWand(com.sk89q.worldedit.command.tool.SelectionWand) CommandContainer(org.enginehub.piston.annotation.CommandContainer) TextColor(com.sk89q.worldedit.util.formatting.text.format.TextColor) NavigationWand(com.sk89q.worldedit.command.tool.NavigationWand) SelectorChoice(com.sk89q.worldedit.command.argument.SelectorChoice) Operations(com.sk89q.worldedit.function.operation.Operations) Location(com.sk89q.worldedit.util.Location) URI(java.net.URI) POSITION(com.sk89q.worldedit.command.util.Logging.LogMode.POSITION) MultiDirection(com.sk89q.worldedit.internal.annotation.MultiDirection) Polygonal2DRegionSelector(com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector) Clipboard(com.sk89q.worldedit.extent.clipboard.Clipboard) BlockType(com.sk89q.worldedit.world.block.BlockType) URIClipboardHolder(com.fastasyncworldedit.core.extent.clipboard.URIClipboardHolder) CommandPermissions(com.sk89q.worldedit.command.util.CommandPermissions) Locatable(com.sk89q.worldedit.extension.platform.Locatable) ConvexPolyhedralRegionSelector(com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector) SubtleFormat(com.sk89q.worldedit.util.formatting.component.SubtleFormat) CHUNK_SHIFTS_Y(com.sk89q.worldedit.world.storage.ChunkStore.CHUNK_SHIFTS_Y) InvalidComponentException(com.sk89q.worldedit.util.formatting.component.InvalidComponentException) ArgFlag(org.enginehub.piston.annotation.param.ArgFlag) TextComponentProducer(com.sk89q.worldedit.util.formatting.component.TextComponentProducer) CommandListBox(com.sk89q.worldedit.util.formatting.component.CommandListBox) List(java.util.List) Stream(java.util.stream.Stream) StopExecutionException(org.enginehub.piston.exception.StopExecutionException) CommandPermissionsConditionGenerator(com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator) PaginationBox(com.sk89q.worldedit.util.formatting.component.PaginationBox) ActorSelectorLimits(com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits) Optional(java.util.Optional) Countable(com.sk89q.worldedit.util.Countable) RegionSelector(com.sk89q.worldedit.regions.RegionSelector) BlockDistributionCounter(com.sk89q.worldedit.function.block.BlockDistributionCounter) CuboidRegionSelector(com.sk89q.worldedit.regions.selector.CuboidRegionSelector) ClipboardHolder(com.sk89q.worldedit.session.ClipboardHolder) Switch(org.enginehub.piston.annotation.param.Switch) Logging(com.sk89q.worldedit.command.util.Logging) HoverEvent(com.sk89q.worldedit.util.formatting.text.event.HoverEvent) CHUNK_SHIFTS(com.sk89q.worldedit.world.storage.ChunkStore.CHUNK_SHIFTS) EllipsoidRegionSelector(com.sk89q.worldedit.regions.selector.EllipsoidRegionSelector) Strings(com.google.common.base.Strings) WorldEditException(com.sk89q.worldedit.WorldEditException) RegionSelectorType(com.sk89q.worldedit.regions.selector.RegionSelectorType) PolyhedralRegionSelector(com.fastasyncworldedit.core.regions.selector.PolyhedralRegionSelector) ClickEvent(com.sk89q.worldedit.util.formatting.text.event.ClickEvent) CylinderRegionSelector(com.sk89q.worldedit.regions.selector.CylinderRegionSelector) WorldEdit(com.sk89q.worldedit.WorldEdit) Region(com.sk89q.worldedit.regions.Region) SphereRegionSelector(com.sk89q.worldedit.regions.selector.SphereRegionSelector) TextComponent(com.sk89q.worldedit.util.formatting.text.TextComponent) ItemTypes(com.sk89q.worldedit.world.item.ItemTypes) REGION(com.sk89q.worldedit.command.util.Logging.LogMode.REGION) RegionVisitor(com.sk89q.worldedit.function.visitor.RegionVisitor) File(java.io.File) Actor(com.sk89q.worldedit.extension.platform.Actor) Direction(com.sk89q.worldedit.internal.annotation.Direction) IdMask(com.fastasyncworldedit.core.function.mask.IdMask) FuzzyRegionSelector(com.fastasyncworldedit.core.regions.selector.FuzzyRegionSelector) Command(org.enginehub.piston.annotation.Command) LocalSession(com.sk89q.worldedit.LocalSession) Mask(com.sk89q.worldedit.function.mask.Mask) BlockState(com.sk89q.worldedit.world.block.BlockState) ItemType(com.sk89q.worldedit.world.item.ItemType) CommandListBox(com.sk89q.worldedit.util.formatting.component.CommandListBox) TextComponentProducer(com.sk89q.worldedit.util.formatting.component.TextComponentProducer) Optional(java.util.Optional) Polygonal2DRegionSelector(com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector) IdMask(com.fastasyncworldedit.core.function.mask.IdMask) Mask(com.sk89q.worldedit.function.mask.Mask) CylinderRegionSelector(com.sk89q.worldedit.regions.selector.CylinderRegionSelector) ExtendingCuboidRegionSelector(com.sk89q.worldedit.regions.selector.ExtendingCuboidRegionSelector) CuboidRegionSelector(com.sk89q.worldedit.regions.selector.CuboidRegionSelector) ExtendingCuboidRegionSelector(com.sk89q.worldedit.regions.selector.ExtendingCuboidRegionSelector) EllipsoidRegionSelector(com.sk89q.worldedit.regions.selector.EllipsoidRegionSelector) FuzzyRegionSelector(com.fastasyncworldedit.core.regions.selector.FuzzyRegionSelector) ExtendingCuboidRegionSelector(com.sk89q.worldedit.regions.selector.ExtendingCuboidRegionSelector) Polygonal2DRegionSelector(com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector) ConvexPolyhedralRegionSelector(com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector) RegionSelector(com.sk89q.worldedit.regions.RegionSelector) CuboidRegionSelector(com.sk89q.worldedit.regions.selector.CuboidRegionSelector) EllipsoidRegionSelector(com.sk89q.worldedit.regions.selector.EllipsoidRegionSelector) PolyhedralRegionSelector(com.fastasyncworldedit.core.regions.selector.PolyhedralRegionSelector) CylinderRegionSelector(com.sk89q.worldedit.regions.selector.CylinderRegionSelector) SphereRegionSelector(com.sk89q.worldedit.regions.selector.SphereRegionSelector) FuzzyRegionSelector(com.fastasyncworldedit.core.regions.selector.FuzzyRegionSelector) ConvexPolyhedralRegionSelector(com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector) IdMask(com.fastasyncworldedit.core.function.mask.IdMask) ConvexPolyhedralRegionSelector(com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector) PolyhedralRegionSelector(com.fastasyncworldedit.core.regions.selector.PolyhedralRegionSelector) SphereRegionSelector(com.sk89q.worldedit.regions.selector.SphereRegionSelector) RegionSelectorType(com.sk89q.worldedit.regions.selector.RegionSelectorType) Command(org.enginehub.piston.annotation.Command) CommandPermissions(com.sk89q.worldedit.command.util.CommandPermissions)

Example 3 with Polygonal2DRegionSelector

use of com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector in project bteConoSurCore by BTEConoSur.

the class ProjectsCommand method onCommand.

@Override
public boolean onCommand(CommandSender sender, org.bukkit.command.Command cmd, String label, String[] args) {
    if (!(sender instanceof Player)) {
        sender.sendMessage(projectsPrefix + "Este comando solo puede ser usado por jugadores.");
    }
    Player p = (Player) sender;
    ServerPlayer s = new ServerPlayer(p);
    ProjectsManager projectsManager = s.getProjectsManager();
    if (args.length == 0) {
        sender.sendMessage(projectsPrefix + "Debes introducir un subcomando.");
        return true;
    }
    if (args[0].equals("create") || args[0].equals("crear")) {
        // GET POINTS
        List<BlockVector2D> points;
        try {
            points = polyRegion(getSelection(p)).getPoints();
        } catch (IncompleteRegionException e) {
            p.sendMessage(projectsPrefix + "Selecciona un área primero.");
            return true;
        } catch (IllegalArgumentException e) {
            p.sendMessage(projectsPrefix + "Debes seleccionar una region cúbica o poligonal.");
            return true;
        }
        if (points.size() > maxProjectPoints) {
            p.sendMessage(projectsPrefix + "La selección no puede tener más de " + maxProjectPoints + " puntos.");
            return true;
        }
        OldCountry country = new OldCountry(points.get(0));
        if (country.getName().equals("global")) {
            p.sendMessage(projectsPrefix + "Los proyectos no funcionan aquí.");
            return true;
        }
        if (p.hasPermission("bteconosur.projects.manage.create")) {
            if (!s.getPermissionCountries().contains(country)) {
                p.sendMessage(projectsPrefix + "No puedes hacer esto aquí.");
                return true;
            }
            if (args.length < 2) {
                p.sendMessage(projectsPrefix + "Introduce una dificultad, puede ser §afacil§f, §aintermedio§f o §adificil§f.");
                return true;
            }
            if ((!(args[1].equals("facil"))) && (!(args[1].equals("intermedio"))) && (!(args[1].equals("dificil")))) {
                p.sendMessage(projectsPrefix + "Introduce una dificultad válida, puede ser §afacil§f, §aintermedio§f o §adificil§f.");
                return true;
            }
            Project project = new Project(new OldCountry(new Location(mainWorld, points.get(0).getX(), 100, points.get(0).getZ())), Project.Difficulty.valueOf(args[1]), points);
            project.save();
            // SEND MESSAGES
            p.sendMessage(projectsPrefix + "Proyecto con la ID §a" + project.getId() + "§f creado con la dificultad §a" + project.getDifficulty().toString().toUpperCase() + "§f.");
            StringBuilder dscMessage = new StringBuilder(":clipboard: **" + p.getName() + "** ha creado el proyecto `" + project.getId() + "` con dificultad `" + args[1].toUpperCase() + "` en las coordenadas: \n");
            for (BlockVector2D point : project.getPoints()) {
                dscMessage.append("> ").append(Math.floor(point.getX())).append(" ").append(Math.floor(p.getWorld().getHighestBlockAt(point.getBlockX(), point.getBlockZ()).getY())).append(" ").append(Math.floor(point.getZ())).append("\n");
            }
            dscMessage = new StringBuilder(dscMessage.toString().replace(".0", ""));
            project.getCountry().getLogs().sendMessage(dscMessage.toString()).queue();
            return true;
        } else if (p.hasPermission("bteconosur.projects.create")) {
            if (projectsManager.getProjects(country).size() < maxProjectsPerPlayer) {
                Project project = new Project(getCountryAtLocation(new Location(mainWorld, points.get(0).getX(), 100, points.get(0).getZ())), Project.Difficulty.FACIL, points);
                EmbedBuilder request = new EmbedBuilder();
                request.setColor(new Color(0, 255, 42));
                request.setTitle(new ServerPlayer(p).getName() + " quiere crear un proyecto.");
                List<String> coords = new ArrayList<>();
                for (BlockVector2D point : project.getPoints()) {
                    coords.add(("> " + point.getX() + " " + new Coords2D(point).getHighestY() + " " + point.getZ()).replace(".0", ""));
                }
                request.addField(":round_pushpin: Coordenadas:", String.join("\n", coords), false);
                // GMAPS
                BlockVector2D average = project.getAverageCoordinate();
                Coords2D geoCoord = new Coords2D(average);
                request.addField(":map: Google Maps:", "https://www.google.com/maps/@" + geoCoord.getLat() + "," + geoCoord.getLon() + ",19z", false);
                // IMAGE
                request.setImage(project.getImageUrl());
                ActionRow actionRow = ActionRow.of(Button.of(ButtonStyle.SECONDARY, "facil", "Fácil", Emoji.fromMarkdown("\uD83D\uDFE2")), Button.of(ButtonStyle.SECONDARY, "intermedio", "Intermedio", Emoji.fromMarkdown("\uD83D\uDFE1")), Button.of(ButtonStyle.SECONDARY, "dificil", "Difícil", Emoji.fromMarkdown("\uD83D\uDD34")), Button.of(ButtonStyle.DANGER, "rechazar", "Rechazar", Emoji.fromMarkdown("✖️")));
                MessageBuilder message = new MessageBuilder();
                message.setEmbeds(request.build());
                message.setActionRows(actionRow);
                country.getRequests().sendMessage(message.build()).queue();
                p.sendMessage(projectsPrefix + "Se ha enviado una solicitud para crear tu proyecto.");
            } else {
                p.sendMessage(projectsPrefix + "No puedes ser líder de más de 10 proyectos.");
            }
        } else {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
        }
    }
    if (args[0].equals("claim") || args[0].equals("reclamar")) {
        if (!(p.hasPermission("bteconosur.projects.claim"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            if (project.getOwner() != null) {
                if (project.getOwner() == p) {
                    p.sendMessage(projectsPrefix + "Ya eres dueñ@ de este proyecto.");
                } else if (project.getMembers().contains(p)) {
                    p.sendMessage("Alguien más ya es dueñ@ de este proyecto. Usa §a/p request §fpara solicitar unirte.");
                }
            } else if (projectsManager.getOwnedProjects().get(project.getCountry()).size() >= maxProjectsPerPlayer) {
                p.sendMessage(projectsPrefix + "No puedes ser líder de más de 10 proyectos al mismo tiempo.");
            } else {
                GroupsManager manager = s.getGroupsManager();
                if ((manager.getPrimaryGroup() == GroupsManager.PrimaryGroup.POSTULANTE || manager.getPrimaryGroup() == GroupsManager.PrimaryGroup.DEFAULT) && project.getDifficulty() != Project.Difficulty.FACIL) {
                    p.sendMessage(projectsPrefix + "En tu rango solo puedes reclamar proyectos fáciles.");
                    return true;
                }
                project.setOwner(p);
                project.save();
                p.sendMessage(projectsPrefix + "Ahora eres dueñ@ de este proyecto.");
                project.getCountry().getLogs().sendMessage(":inbox_tray: **" + s.getName() + "** ha reclamado el proyecto `" + project.getId() + "`.").queue();
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
            return true;
        }
        return true;
    }
    if (args[0].equals("delete") || args[0].equals("eliminar")) {
        if (p.hasPermission("bteconosur.projects.manage.delete")) {
            if (!(deleteConfirmation.contains(p))) {
                deleteConfirmation.add(p);
                p.sendMessage(projectsPrefix + "§cNo puedes deshacer esta acción. §fUsa el comando de nuevo para confirmar.");
                return true;
            }
            deleteConfirmation.remove(p);
            if (args.length >= 2) {
                try {
                    Project project = new Project(args[1]);
                    project.delete();
                    p.sendMessage(projectsPrefix + "Has eliminado el proyecto §a" + project.getId() + "§f.");
                    for (OfflinePlayer member : project.getAllMembers()) {
                        new ServerPlayer(member).sendNotification(projectsPrefix + "Tu proyecto **§a" + project.getName(true) + "§f** ha sido eliminado.");
                    }
                    project.getCountry().getLogs().sendMessage(":wastebasket: **" + s.getName() + "** ha eliminado el proyecto `" + project.getId() + "`.").queue();
                } catch (Exception e) {
                    p.sendMessage(projectsPrefix + "Este proyecto no existe.");
                    return true;
                }
            } else {
                try {
                    Project project = new Project(p.getLocation());
                    project.delete();
                    p.sendMessage(projectsPrefix + "Has eliminado el proyecto §a" + project.getId() + "§f.");
                    project.getCountry().getLogs().sendMessage(":wastebasket: **" + s.getName() + "** ha eliminado el proyecto `" + project.getId() + "`.").queue();
                } catch (Exception e) {
                    p.sendMessage(projectsPrefix + "No estás dentro de ningun proyecto.");
                }
            }
        } else {
            p.sendMessage(projectsPrefix + "§cNo puedes hacer esto.");
        }
        return true;
    }
    if (args[0].equals("add") || args[0].equals("agregar")) {
        if (!(p.hasPermission("bteconosur.projects.add"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        Project project;
        try {
            project = new Project(p.getLocation());
            if (project.getOwner() == p) {
                if (project.isPending()) {
                    p.sendMessage("No puedes hacer esto mientras el proyecto está pendiente de revisión.");
                    return true;
                }
                if (project.getAllMembers().size() < maxProjectMembers) {
                    if (args.length >= 2) {
                        if (Bukkit.getOfflinePlayer(args[1]).isOnline()) {
                            Player target = Bukkit.getPlayer(args[1]);
                            project.addMember(target);
                            project.save();
                            ServerPlayer sTarget = new ServerPlayer(target);
                            p.sendMessage(projectsPrefix + "Has agregado a §a" + sTarget.getName() + "§f al proyecto §a" + project.getName() + "§f.");
                            target.sendMessage(projectsPrefix + "Has sido añadido al proyecto §a" + project.getName() + "§f.");
                            project.getCountry().getLogs().sendMessage(":pencil: **" + s.getName() + "** ha agregado a **" + sTarget.getName() + "** al proyecto `" + project.getId() + "`.").queue();
                        } else {
                            p.sendMessage(projectsPrefix + "El jugador introducido no existe o no se encuentra online.");
                        }
                    } else {
                        p.sendMessage(projectsPrefix + "Introduce un jugador.");
                    }
                } else {
                    p.sendMessage(projectsPrefix + "El proyecto ya alcanzó la capacidad máxima de miembros.");
                }
            } else {
                p.sendMessage(projectsPrefix + "No eres el líder de este proyecto.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
        return true;
    }
    if (args[0].equals("remove") || args[0].equals("remover") || args[0].equals("quitar")) {
        if (!(p.hasPermission("bteconosur.projects.remove"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        Project project;
        try {
            project = new Project(p.getLocation());
            if (project.getOwner() == p) {
                if (project.isPending()) {
                    p.sendMessage("No puedes hacer esto mientras el proyecto está pendiente de revisión.");
                    return true;
                }
                if (!project.getMembers().isEmpty()) {
                    if (args.length >= 2) {
                        OfflinePlayer target = Bukkit.getOfflinePlayer(args[1]);
                        ServerPlayer sTarget = new ServerPlayer(target);
                        if (project.getMembers().contains(target)) {
                            project.removeMember(target);
                            project.save();
                            p.sendMessage(projectsPrefix + "Has removido a §a" + sTarget.getName() + "§f del proyecto §a" + project.getName() + "§f.");
                            sTarget.sendNotification(projectsPrefix + "Has sido removido del proyecto **§a" + project.getName(true) + "§f**.");
                            project.getCountry().getLogs().sendMessage(":pencil: **" + s.getName() + "** ha removido a **" + sTarget.getName() + "** del proyecto `" + project.getId() + "`.").queue();
                        } else {
                            p.sendMessage(projectsPrefix + "El jugador introducido no es parte del proyecto.");
                        }
                    } else {
                        p.sendMessage(projectsPrefix + "Introduce un jugador.");
                    }
                } else {
                    p.sendMessage(projectsPrefix + "El proyecto no tiene miembros.");
                }
            } else {
                p.sendMessage(projectsPrefix + "No eres el líder de este proyecto.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
        return true;
    }
    if (args[0].equals("transfer") || args[0].equals("transferir")) {
        if (!(p.hasPermission("bteconosur.projects.transfer"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            if (project.getOwner() == p) {
                if (project.isPending()) {
                    p.sendMessage("No puedes hacer esto mientras el proyecto está pendiente de revisión.");
                    return true;
                }
                if (args.length >= 2) {
                    if (project.getMembers().contains(Bukkit.getOfflinePlayer(args[1]))) {
                        if (Bukkit.getOfflinePlayer(args[1]).isOnline()) {
                            if (transferConfirmation.contains(p)) {
                                transferConfirmation.remove(p);
                                Player target = Bukkit.getPlayer(args[1]);
                                if (new ServerPlayer(target).getProjectsManager().getOwnedProjects().get(project.getCountry()).size() > maxProjectsPerPlayer) {
                                    p.sendMessage(projectsPrefix + "El jugador introducido ya alcanzó su límite de proyectos en este país.");
                                    return true;
                                }
                                project.transfer(target);
                                project.save();
                                p.sendMessage(projectsPrefix + "Has transferido el proyecto §a" + project.getName() + " §fa §a" + target.getName() + "§f.");
                                target.sendMessage(projectsPrefix + "§a" + p.getName() + " §fte ha transferido el proyecto §a" + project.getName() + "§f.");
                            } else {
                                transferConfirmation.add(p);
                                p.sendMessage(projectsPrefix + "§cNo puedes deshacer esta acción. §fUsa el comando de nuevo para confirmar.");
                            }
                        } else {
                            p.sendMessage(projectsPrefix + "El jugador no se encuentra online.");
                        }
                    } else {
                        p.sendMessage(projectsPrefix + "El jugador no es un miembro de tu proyecto.");
                    }
                } else {
                    p.sendMessage(projectsPrefix + "Introduce un jugador.");
                }
            } else {
                p.sendMessage(projectsPrefix + "No eres el líder de este proyecto.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
    }
    if (args[0].equals("leave") || args[0].equals("abandonar")) {
        if (!(p.hasPermission("bteconosur.projects.leave"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            TextChannel logs = project.getCountry().getLogs();
            if (project.isPending()) {
                p.sendMessage("No puedes hacer esto mientras el proyecto está pendiente de revisión.");
                return true;
            }
            if (project.getOwner() == p) {
                if (leaveConfirmation.contains(p)) {
                    leaveConfirmation.remove(p);
                    p.sendMessage(projectsPrefix + "Has abandonado el proyecto §a" + project.getName(true) + "§f.");
                    logs.sendMessage(":outbox_tray: **" + s.getName() + "** ha abandonado el proyecto `" + project.getId() + "`.").queue();
                    for (OfflinePlayer member : project.getMembers()) {
                        ServerPlayer sMember = new ServerPlayer(member);
                        sMember.sendNotification("El líder de tu proyecto **§a" + project.getName(true) + "§f** ha abandonado el proyecto, por lo que tú también has salido.");
                        logs.sendMessage(":outbox_tray: **" + sMember.getName() + "** ha abandonado el proyecto `" + project.getId() + "`.").queue();
                    }
                    logs.sendMessage(":flag_white: El proyecto `" + project.getId() + "` está disponible de nuevo.").queue();
                    project.empty();
                    project.setName(null);
                    project.save();
                } else {
                    leaveConfirmation.add(p);
                    p.sendMessage(projectsPrefix + "§cEl proyecto quedará vacío si el líder abandonda el proyecto. Esta acción no se puede deshacer. §fUsa el comando de nuevo para confirmar.");
                }
            } else if (project.getMembers().contains(p)) {
                project.removeMember(p);
                project.save();
                p.sendMessage(projectsPrefix + "Has abandonado el proyecto §a" + project.getName() + "§f.");
                new ServerPlayer(project.getOwner()).sendNotification(projectsPrefix + "**§a" + new ServerPlayer(p).getName() + "§f** ha abandonado tu proyecto **§a" + project.getName(true) + "§f**.");
                logs.sendMessage(":outbox_tray: **" + s.getName() + "** ha abandonado el proyecto `" + project.getId() + "`.").queue();
            } else {
                p.sendMessage(projectsPrefix + "No eres miembro de este proyecto.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
            e.printStackTrace();
        }
    }
    if (args[0].equals("borders") || args[0].equals("bordes")) {
        if (!(p.hasPermission("bteconosur.projects.showborder"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            int maxY = p.getLocation().getBlockY() + 10;
            int minY = p.getLocation().getBlockY() - 10;
            Polygonal2DRegionSelector selector = new Polygonal2DRegionSelector((World) new BukkitWorld(mainWorld), project.getPoints(), minY, maxY);
            Methods.setSelection(p, selector);
            p.sendMessage(BookUtil.TextBuilder.of(projectsPrefix + "Mostrando los bordes del proyecto §a" + project.getName() + "§f. §eRequiere ").build(), BookUtil.TextBuilder.of("§e§nWorldEdit CUI").onClick(BookUtil.ClickAction.openUrl("https://www.curseforge.com/minecraft/mc-mods/worldeditcui-forge-edition-2/download/2629418")).build(), BookUtil.TextBuilder.of(".").color(ChatColor.YELLOW).build());
        } catch (Exception e) {
            e.printStackTrace();
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
    }
    if (args[0].equals("review") || args[0].equals("revisar")) {
        if (!(p.hasPermission("bteconosur.projects.manage.review"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            OldCountry country = project.getCountry();
            if (s.getPermissionCountries().contains(project.getCountry())) {
                if (project.isPending()) {
                    if (args.length > 1) {
                        if (args[1].equals("accept") || args[1].equals("aceptar")) {
                            // ADD POINTS
                            int amount = project.getDifficulty().getPoints();
                            country.getLogs().sendMessage(":mag: **" + s.getName() + "** ha aprobado el proyecto `" + project.getId() + "`.").queue();
                            p.sendMessage(projectsPrefix + "Has aceptado el proyecto §a" + project.getId() + "§f.");
                            ServerPlayer owner = new ServerPlayer(project.getOwner());
                            ProjectsManager ownerProjectsManager = owner.getProjectsManager();
                            PointsManager ownerPointsManager = owner.getPointsManager();
                            owner.getPointsManager().addPoints(country, amount);
                            ownerProjectsManager.addFinishedProject(country);
                            owner.sendNotification(projectsPrefix + "Tu proyecto **§a" + project.getName(true) + "§f** ha sido aceptado.");
                            owner.sendNotification(pointsPrefix + "Has conseguido **§a" + amount + "§f** puntos. §7Total: " + ownerPointsManager.getPoints(country));
                            for (OfflinePlayer member : project.getMembers()) {
                                ServerPlayer m = new ServerPlayer(member);
                                PointsManager mPointsManager = m.getPointsManager();
                                mPointsManager.addPoints(country, amount);
                                projectsManager.addFinishedProject(country);
                                m.sendNotification(projectsPrefix + "Tu proyecto **§a" + project.getName(true) + "§f** ha sido aceptado.");
                                m.sendNotification(pointsPrefix + "Has conseguido **§a" + amount + "§f** puntos. §7Total: " + mPointsManager.getPoints(country));
                            }
                            project.delete();
                        }
                        if (args[1].equals("continue") || args[1].equals("continuar")) {
                            project.setPending(false);
                            project.save();
                            p.sendMessage(projectsPrefix + "Has continuado el proyecto §a" + project.getId() + "§f.");
                            for (OfflinePlayer member : project.getAllMembers()) {
                                new ServerPlayer(member).sendNotification(projectsPrefix + "Tu proyecto **§a" + project.getName() + "§f** ha sido continuado.");
                            }
                            country.getLogs().sendMessage(":mag: **" + s.getName() + "** ha continuado el proyecto `" + project.getId() + "`.").queue();
                        }
                        if (args[1].equals("deny") || args[1].equals("denegar") || args[1].equals("rechazar")) {
                            project.setPending(false);
                            project.empty();
                            project.setName(null);
                            project.save();
                            p.sendMessage(projectsPrefix + "Has rechazado el proyecto §a" + project.getId() + "§f.");
                            for (OfflinePlayer member : project.getAllMembers()) {
                                new ServerPlayer(member).sendNotification(projectsPrefix + "Tu proyecto **§a" + project.getName(true) + "§f** ha sido rechazado.");
                            }
                            country.getLogs().sendMessage(":mag: **" + s.getName() + "** ha rechazado el proyecto `" + project.getId() + "`.").queue();
                        }
                    } else {
                        p.sendMessage(projectsPrefix + "Introduce una acción.");
                    }
                } else {
                    p.sendMessage(projectsPrefix + "Este proyecto no esta pendiente de revisión.");
                }
            } else {
                p.sendMessage(projectsPrefix + "No puedes hacer esto.");
            }
        } catch (Exception e) {
            e.printStackTrace();
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
    }
    if (args[0].equals("name") || args[0].equals("nombre")) {
        if (!(p.hasPermission("bteconosur.projects.name"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            if (project.getOwner() == p) {
                if (!(project.isPending())) {
                    if (args.length > 1 && args[1].matches("[a-zA-Z0-9_-]{1,32}")) {
                        project.setName(args[1]);
                        project.save();
                        p.sendMessage(projectsPrefix + "Has cambiado el nombre del proyecto a §a" + project.getName() + "§f.");
                    } else {
                        p.sendMessage(projectsPrefix + "Introduce un nombre válido.");
                    }
                } else {
                    p.sendMessage(projectsPrefix + "No puedes administrar tu proyecto mientras está pendiente.");
                }
            } else {
                p.sendMessage(projectsPrefix + "No eres el líder de este proyecto.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de nigún proyecto.");
        }
    }
    if (args[0].equals("pending") || args[0].equals("pendientes")) {
        if (!(p.hasPermission("bteconosur.projects.manage.pending"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        Configuration pendingConfig = new Configuration(Bukkit.getPluginManager().getPlugin("bteConoSur"), "pending_projects/pending");
        List<String> pending = pendingConfig.getStringList(new OldCountry(p.getLocation()).getName());
        if (!pending.isEmpty()) {
            BookUtil.BookBuilder book = BookUtil.writtenBook();
            List<BaseComponent[]> pages = new ArrayList<>();
            List<List<String>> subLists = Lists.partition(pending, 12);
            for (List<String> subList : subLists) {
                BookUtil.PageBuilder page = new BookUtil.PageBuilder();
                page.add("§7---[ §rPENDIENTES §7]---");
                page.newLine();
                for (String str : subList) {
                    try {
                        Project project = new Project(str);
                        String coord = project.getAverageCoordinate().getBlockX() + " " + new Coords2D(project.getAverageCoordinate()).getHighestY() + " " + project.getAverageCoordinate().getBlockZ();
                        page.add("- ");
                        page.add(BookUtil.TextBuilder.of(str).onHover(BookUtil.HoverAction.showText("Click para ir")).onClick(BookUtil.ClickAction.runCommand("/tp " + coord)).build());
                        page.newLine();
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }
                pages.add(page.build());
            }
            book.pages(pages);
            BookUtil.openPlayer(p, book.build());
        } else {
            p.sendMessage(projectsPrefix + "No hay proyectos pendientes de revisión en este país.");
        }
    }
    if (args[0].equals("finish") || args[0].equals("terminar") || args[0].equals("finalizar")) {
        if (!(p.hasPermission("bteconosur.projects.finish"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            if (project.getOwner() == p) {
                if (!(project.isPending())) {
                    if (finishConfirmation.contains(p)) {
                        finishConfirmation.remove(p);
                        project.setPending(true);
                        project.save();
                        p.sendMessage(projectsPrefix + "Has marcado el proyecto §a" + project.getName() + "§f como terminado.");
                        for (OfflinePlayer member : project.getMembers()) {
                            new ServerPlayer(member).sendNotification(projectsPrefix + "**§a" + new ServerPlayer(project.getOwner()).getName() + "§f** ha marcado el proyecto **§a" + project.getName(true) + "§f** como terminado.");
                        }
                        project.getCountry().getLogs().sendMessage(":lock: **" + s.getName() + "** ha marcado el proyecto `" + project.getId() + "` como terminado.").queue();
                    } else {
                        finishConfirmation.add(p);
                        p.sendMessage(projectsPrefix + "§cNo podrás construir ni administrar tu proyecto mientras está en revisión. §fUsa el comando de nuevo para confirmar.");
                    }
                } else {
                    p.sendMessage("Este proyecto ya está marcado como terminado.");
                }
            } else {
                p.sendMessage(projectsPrefix + " No eres el líder de este proyecto.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
    }
    if (args[0].equals("info") || args[0].equals("informacion")) {
        if (!(p.hasPermission("bteconosur.projects.info"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            // --------------------------------
            BookUtil.BookBuilder builder = BookUtil.writtenBook();
            BookUtil.PageBuilder page = new BookUtil.PageBuilder();
            page.add("----[ PROYECTO ]----");
            page.newLine();
            if (!Objects.equals(project.getName(), project.getId())) {
                page.add(BookUtil.TextBuilder.of("Nombre: ").color(ChatColor.GREEN).style(ChatColor.BOLD).build());
                page.add(project.getName());
                page.newLine();
            }
            page.add(BookUtil.TextBuilder.of("ID: ").color(ChatColor.GREEN).style(ChatColor.BOLD).build());
            page.add(project.getId());
            page.newLine();
            page.add(BookUtil.TextBuilder.of("Dificultad: ").color(ChatColor.GREEN).style(ChatColor.BOLD).build());
            page.add(project.getDifficulty().toString().toLowerCase().replace("facil", "Fácil").replace("intermedio", "Intermedio").replace("dificil", "Difícil"));
            page.newLine();
            page.add(BookUtil.TextBuilder.of("País: ").color(ChatColor.GREEN).style(ChatColor.BOLD).build());
            page.add(StringUtils.capitalize(project.getCountry().getName().replace("peru", "perú")));
            page.newLine();
            if (project.getTag() != null) {
                page.add(BookUtil.TextBuilder.of("Tipo: ").color(ChatColor.GREEN).style(ChatColor.BOLD).build());
                page.add(StringUtils.capitalize(project.getTag().toString().toLowerCase().replace("_", " ")));
                page.newLine();
            }
            // GMAPS
            Coords2D gMaps = new Coords2D(project.getAverageCoordinate());
            page.add(BookUtil.TextBuilder.of("GoogleMaps: ").color(ChatColor.GREEN).style(ChatColor.BOLD).build());
            page.add(BookUtil.TextBuilder.of("ENLACE").color(ChatColor.BLACK).style(ChatColor.UNDERLINE).onHover(BookUtil.HoverAction.showText("Haz click para abrir el enlace.")).onClick(BookUtil.ClickAction.openUrl("https://www.google.com/maps/@" + gMaps.getLat() + "," + gMaps.getLon() + ",19z")).build());
            page.newLine();
            if (project.getOwner() != null) {
                page.add(BookUtil.TextBuilder.of("Líder: ").color(ChatColor.GREEN).style(ChatColor.BOLD).build());
                page.add(BookUtil.TextBuilder.of(new ServerPlayer(project.getOwner()).getName()).onHover(BookUtil.HoverAction.showText(new ServerPlayer(project.getOwner()).getLore())).build());
                page.newLine();
            }
            int i = 1;
            if (!project.getMembers().isEmpty()) {
                page.add("§a§lMiembro(s): §r");
                for (OfflinePlayer member : project.getMembers()) {
                    page.add(BookUtil.TextBuilder.of(new ServerPlayer(member).getName()).onHover(BookUtil.HoverAction.showText(new ServerPlayer(member).getLore())).build());
                    if (i < project.getMembers().size()) {
                        page.add(", ");
                    }
                    i++;
                }
            }
            builder.pages(page.build());
            BookUtil.openPlayer(p, builder.build());
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
    }
    if (args[0].equals("list") || args[0].equals("lista")) {
        if (!(p.hasPermission("bteconosur.projects.list"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        if (projectsManager.getAllProjects().size() != 0) {
            BookUtil.BookBuilder book = BookUtil.writtenBook();
            List<BaseComponent[]> pages = new ArrayList<>();
            for (String id : projectsManager.getAllProjects()) {
                Project project = new Project(id);
                BookUtil.PageBuilder page = new BookUtil.PageBuilder();
                if (!Objects.equals(project.getName(), project.getId())) {
                    page.add("§a§lNombre: §r" + project.getName());
                    page.newLine();
                }
                page.add("§a§lID: §r" + project.getId());
                page.newLine();
                page.add("§a§lDificultad: §r" + project.getDifficulty().toString().toUpperCase());
                page.newLine();
                page.add("§a§lPaís: §r" + StringUtils.capitalize(project.getCountry().getName().replace("peru", "perú")));
                page.newLine();
                page.add("§a§lCoordenadas: §r\n");
                page.add(BookUtil.TextBuilder.of(project.getAverageCoordinate().getBlockX() + " " + new Coords2D(project.getAverageCoordinate()).getHighestY() + " " + project.getAverageCoordinate().getBlockZ()).onHover(BookUtil.HoverAction.showText("Click para ir")).onClick(BookUtil.ClickAction.runCommand("/tp " + project.getAverageCoordinate().getBlockX() + " " + new Coords2D(project.getAverageCoordinate()).getHighestY() + " " + project.getAverageCoordinate().getBlockZ())).build());
                page.newLine();
                page.add("§a§lLíder: §r");
                ServerPlayer sOwner = new ServerPlayer(project.getOwner());
                page.add(BookUtil.TextBuilder.of(sOwner.getName()).onHover(BookUtil.HoverAction.showText(sOwner.getLore())).build());
                page.newLine();
                int i = 1;
                List<OfflinePlayer> members = project.getMembers();
                if (!members.isEmpty()) {
                    page.add("§a§lMiembro(s): §r");
                    for (OfflinePlayer member : members) {
                        ServerPlayer sMember = new ServerPlayer(member);
                        page.add(BookUtil.TextBuilder.of(sMember.getName()).onHover(BookUtil.HoverAction.showText(sMember.getLore())).build());
                        if (i < members.size()) {
                            page.add(", ");
                        }
                        i++;
                    }
                }
                pages.add(page.build());
            }
            book.pages(pages);
            BookUtil.openPlayer(p, book.build());
        } else {
            p.sendMessage(projectsPrefix + "No tienes proyectos activos.");
        }
    }
    if (args[0].equals("manage") || args[0].equals("manejar")) {
        if (!(p.hasPermission("bteconosur.projects.members"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            if (project.getOwner() == p) {
                Inventory gui = Bukkit.createInventory(null, 53, "Proyecto " + project.getName(true));
                List<Integer> membersSlots = Arrays.asList(28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43);
                for (int i = 0; i < 53; i++) {
                    if (!membersSlots.contains(i)) {
                        gui.setItem(i, background);
                    }
                }
                p.openInventory(gui);
            } else {
                p.sendMessage(projectsPrefix + "No eres el líder de este proyecto.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
    }
    if (args[0].equals("request") || args[0].equals("solicitar")) {
        if (!(p.hasPermission("bteconosur.projects.request"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            if (project.getOwner() != null) {
                if (!(project.getAllMembers().contains(p))) {
                    new ServerPlayer(project.getOwner()).sendNotification(projectsPrefix + "**§a" + s.getName() + "§f** ha solicitado unirse a tu proyecto **§a" + project.getName(true) + "§f**.");
                } else {
                    p.sendMessage(projectsPrefix + "Ya eres parte de este proyecto.");
                }
            } else {
                p.sendMessage(projectsPrefix + "Este proyecto no está reclamado aún.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningun proyecto.");
        }
    }
    if (args[0].equals("tutorial")) {
        if (!(p.hasPermission("bteconosur.projects.tutorial"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
    }
    if (args[0].equals("redefine") || args[0].equals("redefinir")) {
        if (!(p.hasPermission("bteconosur.projects.redefine"))) {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            return true;
        }
        try {
            Project project = new Project(p.getLocation());
            // GET POINTS
            List<BlockVector2D> points;
            try {
                points = polyRegion(getSelection(p)).getPoints();
            } catch (IncompleteRegionException e) {
                p.sendMessage(projectsPrefix + "Selecciona un área primero.");
                return true;
            } catch (IllegalArgumentException e) {
                p.sendMessage(projectsPrefix + "Debes seleccionar una region cúbica o poligonal.");
                return true;
            }
            if (points.size() > maxProjectPoints) {
                p.sendMessage(projectsPrefix + "La selección no puede tener más de " + maxProjectPoints + " puntos.");
                return true;
            }
            if (p.hasPermission("bteconosur.projects.manage.redefine")) {
                if (!s.getPermissionCountries().contains(project.getCountry())) {
                    p.sendMessage(projectsPrefix + "No puedes hacer esto aquí.");
                    return true;
                }
                if (project.isPending()) {
                    p.sendMessage("No puedes hacer esto mientras el proyecto está pendiente de revisión.");
                    return true;
                }
                if (args.length < 2) {
                    p.sendMessage(projectsPrefix + "Introduce una dificultad, puede ser §afacil§f, §aintermedio§f o §adificil§f.");
                    return true;
                }
                if ((!(args[1].equals("facil"))) && (!(args[1].equals("intermedio"))) && (!(args[1].equals("dificil")))) {
                    p.sendMessage(projectsPrefix + "Introduce una dificultad válida, puede ser §afacil§f, §aintermedio§f o §adificil§f.");
                    return true;
                }
                project.setDifficulty(Project.Difficulty.valueOf(args[1]));
                project.setPoints(points);
                project.save();
                // SEND MESSAGES
                p.sendMessage(projectsPrefix + "Proyecto con la ID §a" + project.getId() + "§f redefinido con dificultad §a" + project.getDifficulty().toString().toUpperCase() + "§f.");
                StringBuilder dscMessage = new StringBuilder(":clipboard: **" + p.getName() + "** ha redefinido el proyecto `" + project.getId() + "` con dificultad `" + args[1].toUpperCase() + "` en las coordenadas: \n");
                for (BlockVector2D point : project.getPoints()) {
                    dscMessage.append("> ").append(Math.floor(point.getX())).append(" ").append(Math.floor(p.getWorld().getHighestBlockAt(point.getBlockX(), point.getBlockZ()).getY())).append(" ").append(Math.floor(point.getZ())).append("\n");
                }
                dscMessage = new StringBuilder(dscMessage.toString().replace(".0", ""));
                StringBuilder notif = new StringBuilder("Tu proyecto **§a" + project.getName(true) + "§f** ha sido redefinido con dificultad **§a" + project.getDifficulty().toString().toUpperCase() + "§f** en las coordenadas: \n");
                for (BlockVector2D point : project.getPoints()) {
                    notif.append("> ").append(Math.floor(point.getX())).append(" ").append(Math.floor(p.getWorld().getHighestBlockAt(point.getBlockX(), point.getBlockZ()).getY())).append(" ").append(Math.floor(point.getZ())).append("\n");
                }
                if (project.getOwner() != null) {
                    new ServerPlayer(project.getOwner()).sendNotification(notif.toString());
                }
                project.getCountry().getLogs().sendMessage(dscMessage.toString()).queue();
                return true;
            } else if (p.hasPermission("bteconosur.projects.redefine")) {
                if (project.getOwner() != p) {
                    p.sendMessage(projectsPrefix + "No eres el líder de este proyecto.");
                    return true;
                }
                if (project.isPending()) {
                    p.sendMessage("No puedes hacer esto mientras el proyecto está pendiente de revisión.");
                    return true;
                }
                EmbedBuilder request = new EmbedBuilder();
                request.setColor(new Color(0, 255, 42));
                request.setTitle(new ServerPlayer(p).getName() + " quiere redefinir el proyecto " + project.getId().toUpperCase() + ".");
                List<String> oldCoords = new ArrayList<>();
                for (BlockVector2D point : project.getPoints()) {
                    oldCoords.add(("> " + point.getX() + " " + new Coords2D(point).getHighestY() + " " + point.getZ()).replace(".0", ""));
                }
                request.addField(":blue_circle: Coordenadas antiguas:", String.join("\n", oldCoords), false);
                List<String> newCoords = new ArrayList<>();
                for (BlockVector2D point : points) {
                    newCoords.add(("> " + point.getX() + " " + new Coords2D(point).getHighestY() + " " + point.getZ()).replace(".0", ""));
                }
                request.addField(":red_circle: Coordenadas nuevas:", String.join("\n", newCoords), false);
                // GMAPS
                BlockVector2D average = project.getAverageCoordinate();
                Coords2D geoCoord = new Coords2D(average);
                request.addField(":map: Google Maps:", "https://www.google.com/maps/@" + geoCoord.getLat() + "," + geoCoord.getLon() + ",19z", false);
                // IMAGE
                String url;
                List<String> coordsOld = new ArrayList<>();
                for (BlockVector2D point : project.getPoints()) {
                    coordsOld.add(new Coords2D(point).getLat() + "," + new Coords2D(point).getLon());
                }
                coordsOld.add(new Coords2D(project.getPoints().get(0)).getLat() + "," + new Coords2D(project.getPoints().get(0)).getLon());
                List<String> coordsNew = new ArrayList<>();
                for (BlockVector2D point : points) {
                    coordsNew.add(new Coords2D(point).getLat() + "," + new Coords2D(point).getLon());
                }
                coordsNew.add(new Coords2D(points.get(0)).getLat() + "," + new Coords2D(points.get(0)).getLon());
                url = "https://open.mapquestapi.com/staticmap/v5/map?key=" + key + "&type=sat&shape=" + String.join("|", coordsOld) + "|fill:6382DC50&shape=" + String.join("|", coordsNew) + "|fill:ff000050|border:ff0000&size=1280,720&imagetype=png";
                request.setImage(url);
                ActionRow actionRow = ActionRow.of(Button.of(ButtonStyle.SECONDARY, "facil", "Fácil", Emoji.fromMarkdown("\uD83D\uDFE2")), Button.of(ButtonStyle.SECONDARY, "intermedio", "Intermedio", Emoji.fromMarkdown("\uD83D\uDFE1")), Button.of(ButtonStyle.SECONDARY, "dificil", "Difícil", Emoji.fromMarkdown("\uD83D\uDD34")), Button.of(ButtonStyle.DANGER, "rechazar", "Rechazar", Emoji.fromMarkdown("✖️")));
                MessageBuilder message = new MessageBuilder();
                message.setEmbeds(request.build());
                message.setActionRows(actionRow);
                project.getCountry().getRequests().sendMessage(message.build()).queue();
                p.sendMessage(projectsPrefix + "Se ha enviado una solicitud para redefinir tu proyecto.");
            } else {
                p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
            }
        } catch (Exception e) {
            p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
        }
    }
    if (args[0].equals("tag") || args[0].equals("etiqueta")) {
        if (p.hasPermission("bteconosur.projects.manage.tag")) {
            try {
                Project project = new Project(p.getLocation());
                if (!(s.getPermissionCountries().contains(project.getCountry()))) {
                    p.sendMessage(projectsPrefix + "No puedes hacer esto aquí.");
                }
                if (args.length > 1) {
                    if (args[1].equals("edificios") || args[1].equals("departamentos") || args[1].equals("casas") || args[1].equals("parques") || args[1].equals("establecimientos") || args[1].equals("carreteras") || args[1].equals("centros_comerciales")) {
                        project.setTag(Project.Tag.valueOf(args[1]));
                        project.save();
                        project.getCountry().getLogs().sendMessage(":label: **" + s.getName() + "** ha establecido la etiqueta del proyecto `" + project.getId() + "` en **" + args[1].replace("_", " ").toUpperCase() + "**.").queue();
                        p.sendMessage(projectsPrefix + "Has establecido la etiquteda del proyecto §a" + project.getId() + "§f en §a" + args[1].replace("_", " ").toUpperCase() + "§f.");
                    } else if (args[1].equals("delete")) {
                        project.setTag(null);
                        project.save();
                        project.getCountry().getLogs().sendMessage(":label: **" + s.getName() + "** ha eliminado la etiqueta del proyecto `" + project.getId() + "`.").queue();
                        p.sendMessage(projectsPrefix + "Has eliminado la etiqueta del proyecto §a" + project.getId() + "§f.");
                    } else {
                        p.sendMessage(projectsPrefix + "Introduce una etiqueta válida.");
                    }
                } else {
                    p.sendMessage(projectsPrefix + "Introduce una etiqueta.");
                }
            } catch (Exception e) {
                e.printStackTrace();
                p.sendMessage(projectsPrefix + "No estás dentro de ningún proyecto.");
            }
        } else {
            p.sendMessage(projectsPrefix + "§cNo tienes permiso para hacer eso.");
        }
    }
    if (args[0].equals("find") || args[0].equals("encontrar")) {
        Inventory pRandomGui = Bukkit.createInventory(null, 27, "1. Elige una dificultad");
        ItemStack glass = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 15);
        ItemMeta gMeta = glass.getItemMeta();
        gMeta.setDisplayName(" ");
        glass.setItemMeta(gMeta);
        for (int i = 0; i < 27; i++) {
            pRandomGui.setItem(i, background);
        }
        pRandomGui.setItem(11, getCustomHead("§aFácil §f- 15 puntos", "§fProyectos de un área pequeña, con construcciones simples y rápidas.", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmFlMTE5YTIzODJlZGE4NjRiMjQ0ZmE4YzUzYWMzZTU0NDE2MzEwM2VlNjY3OTVmMGNkNmM2NGY3YWJiOGNmMSJ9fX0="));
        pRandomGui.setItem(13, getCustomHead("§eIntermedio §f- 50 puntos", "§fProyectos con una dificultad intermedia, que requieren un cierto nivel de planeación y dedicación.", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjIxOTk5NDM3YjFkZTJjNDcyMGFhZDQzMmIyZWE1MzgyZTE1NDgyNzc1MjNmMjViMGY1NWMzOWEwMWMyYTljMCJ9fX0="));
        pRandomGui.setItem(15, getCustomHead("§cDifícil §f- 100 puntos", "§fProyectos de gran tamaño y/o dificultad, que requieren gran detalle y planificación previa.", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQ1ZTg1ZWRkYTFhODFkMjI0YWRiNzEzYjEzYjcwMzhkNWNjNmJlY2Q5OGE3MTZiOGEzZGVjN2UzYTBmOTgxNyJ9fX0="));
        p.openInventory(pRandomGui);
    }
    return true;
}
Also used : OldCountry(pizzaaxx.bteconosur.country.OldCountry) Configuration(pizzaaxx.bteconosur.yaml.Configuration) Polygonal2DRegionSelector(com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector) BlockVector2D(com.sk89q.worldedit.BlockVector2D) IncompleteRegionException(com.sk89q.worldedit.IncompleteRegionException) ProjectsManager(pizzaaxx.bteconosur.serverPlayer.ProjectsManager) TextChannel(net.dv8tion.jda.api.entities.TextChannel) MessageBuilder(net.dv8tion.jda.api.MessageBuilder) PointsManager(pizzaaxx.bteconosur.serverPlayer.PointsManager) List(java.util.List) ItemMeta(org.bukkit.inventory.meta.ItemMeta) GroupsManager(pizzaaxx.bteconosur.serverPlayer.GroupsManager) Player(org.bukkit.entity.Player) ServerPlayer(pizzaaxx.bteconosur.serverPlayer.ServerPlayer) Color(java.awt.Color) ActionRow(net.dv8tion.jda.api.interactions.components.ActionRow) BukkitWorld(com.sk89q.worldedit.bukkit.BukkitWorld) IncompleteRegionException(com.sk89q.worldedit.IncompleteRegionException) Coords2D(pizzaaxx.bteconosur.coords.Coords2D) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) ServerPlayer(pizzaaxx.bteconosur.serverPlayer.ServerPlayer) BookUtil(xyz.upperlevel.spigot.book.BookUtil) ItemStack(org.bukkit.inventory.ItemStack) Inventory(org.bukkit.inventory.Inventory) Misc.getCountryAtLocation(pizzaaxx.bteconosur.misc.Misc.getCountryAtLocation)

Aggregations

Polygonal2DRegionSelector (com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector)3 RegionSelector (com.sk89q.worldedit.regions.RegionSelector)2 ConvexPolyhedralRegionSelector (com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector)2 CuboidRegionSelector (com.sk89q.worldedit.regions.selector.CuboidRegionSelector)2 CylinderRegionSelector (com.sk89q.worldedit.regions.selector.CylinderRegionSelector)2 Caption (com.fastasyncworldedit.core.configuration.Caption)1 URIClipboardHolder (com.fastasyncworldedit.core.extent.clipboard.URIClipboardHolder)1 IdMask (com.fastasyncworldedit.core.function.mask.IdMask)1 FuzzyRegionSelector (com.fastasyncworldedit.core.regions.selector.FuzzyRegionSelector)1 PolyhedralRegionSelector (com.fastasyncworldedit.core.regions.selector.PolyhedralRegionSelector)1 MaskTraverser (com.fastasyncworldedit.core.util.MaskTraverser)1 Strings (com.google.common.base.Strings)1 BlockVector2D (com.sk89q.worldedit.BlockVector2D)1 EditSession (com.sk89q.worldedit.EditSession)1 IncompleteRegionException (com.sk89q.worldedit.IncompleteRegionException)1 LocalSession (com.sk89q.worldedit.LocalSession)1 WorldEdit (com.sk89q.worldedit.WorldEdit)1 WorldEditException (com.sk89q.worldedit.WorldEditException)1 BaseItemStack (com.sk89q.worldedit.blocks.BaseItemStack)1 BukkitWorld (com.sk89q.worldedit.bukkit.BukkitWorld)1