From 63a651ff07c8fc033961b8310c9876595bb9c7c3 Mon Sep 17 00:00:00 2001 From: minenash Date: Sun, 23 Sep 2018 17:47:58 -0400 Subject: [PATCH] Removed useless/abandoned Modules, AdminNotes and Scoreboard Project Manager. --- .../modules/adminnotes/AdminNotes.java | 216 ----------- .../redstoner/modules/scoreboard/Project.java | 334 ------------------ .../modules/scoreboard/ProjectManager.java | 53 --- .../modules/scoreboard/Scoreboards.java | 147 -------- .../modules/scoreboard/scoreboards.cmd | 51 --- 5 files changed, 801 deletions(-) delete mode 100644 src/com/redstoner/modules/adminnotes/AdminNotes.java delete mode 100644 src/com/redstoner/modules/scoreboard/Project.java delete mode 100644 src/com/redstoner/modules/scoreboard/ProjectManager.java delete mode 100644 src/com/redstoner/modules/scoreboard/Scoreboards.java delete mode 100644 src/com/redstoner/modules/scoreboard/scoreboards.cmd diff --git a/src/com/redstoner/modules/adminnotes/AdminNotes.java b/src/com/redstoner/modules/adminnotes/AdminNotes.java deleted file mode 100644 index 8676182..0000000 --- a/src/com/redstoner/modules/adminnotes/AdminNotes.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.redstoner.modules.adminnotes; - -import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Arrays; - -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.json.simple.JSONArray; - -import com.nemez.cmdmgr.Command; -import com.redstoner.annotations.AutoRegisterListener; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.JsonManager; -import com.redstoner.misc.Main; -import com.redstoner.modules.Module; - -import de.pepich.chestapi.CallbackHandler; -import de.pepich.chestapi.ClickableInventory; -import de.pepich.chestapi.DefaultSize; -import net.nemez.chatapi.click.ClickCallback; -import net.nemez.chatapi.click.Message; - -@Commands(CommandHolderType.String) -@AutoRegisterListener -@Version(major = 4, minor = 0, revision = 0, compatible = 4) -public class AdminNotes implements Module, Listener -{ - JSONArray notes; - File saveFile = new File(Main.plugin.getDataFolder(), "adminnotes.json"); - - @Override - public boolean onEnable() - { - notes = JsonManager.getArray(saveFile); - if (notes == null) - notes = new JSONArray(); - return true; - } - - @EventHandler - public void onJoin(PlayerJoinEvent e) - { - if (e.getPlayer().hasPermission("utils.adminnotes")) - if (notes.size() > 0) - { - Message m = new Message(e.getPlayer(), null); - m.appendSendChat(getLogger().getPrefix(), "/an list"); - m.appendSendChat("&cThere are " + notes.size() + " open notes!", "/an list"); - m.send(); - } - } - - @Override - public void onDisable() - { - saveNotes(); - } - - @SuppressWarnings("unchecked") - @Command(hook = "an_create") - public void createNote(CommandSender sender, String note) - { - JSONArray temp = new JSONArray(); - temp.add(sender.getName()); - temp.add(note); - temp.add((double) System.currentTimeMillis() / 1000); - notes.add(temp); - getLogger().message(sender, "&aNote added!"); - saveNotes(); - } - - @Command(hook = "an_del") - public void delNote(CommandSender sender, int id) - { - if (id < notes.size() && id >= 0 && notes.get(id) != null) - { - notes.remove(id); - getLogger().message(sender, "&aNote " + id + " has been removed!"); - saveNotes(); - } - else - { - getLogger().message(sender, "&cThat note does not exist!"); - } - } - - @Command(hook = "an_list") - public void list(CommandSender sender) - { - Message m = new Message(sender, null); - m.appendText(getLogger().getHeader()); - for (Object note : notes) - { - String string = ChatColor.YELLOW + "" + notes.indexOf(note) + ": "; - string += "§a" + ((JSONArray) note).get(1); - string += "\n§e - " + ((JSONArray) note).get(0) + ", §6"; - SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy HH:mm"); - string += format.format((double) ((JSONArray) note).get(2) * 1000); - m.appendCallbackHover(string, new ClickCallback(true, true, null) - { - @Override - public void run(CommandSender sender) - { - if (notes.contains(note)) - showMenu((Player) sender, notes.indexOf(note)); - else - getLogger().message(sender, true, "That note no longer exists!"); - } - }, "Click to show note options."); - m.appendText("\n"); - } - m.send(); - } - - public void showMenu(Player player, int index) - { - String note_text = ((String) ((JSONArray) notes.get(index)).get(1)); - if (note_text.length() > 15) - note_text = note_text.substring(0, 15) + "..."; - ClickableInventory inv = new ClickableInventory("Note " + index + ": " + note_text, DefaultSize.FINAL_FIXED(9)); - - ItemStack addItem = new ItemStack(Material.BOOK_AND_QUILL); - ItemMeta addMeta = addItem.getItemMeta(); - addMeta.setDisplayName("§aAdd note!"); - addItem.setItemMeta(addMeta); - inv.set(1, addItem, new CallbackHandler() - { - @Override - public void run(Player player, ClickType type) - { - Message m = new Message(player, null); - m.appendSuggest(getLogger().getPrefix(), "/an add "); - m.appendSuggest("Click me to add a note!", "/an add "); - m.send(); - player.closeInventory(); - } - }); - - ItemStack deleteItem = new ItemStack(Material.WOOL, 1, (short) 14); - ItemMeta deleteMeta = deleteItem.getItemMeta(); - deleteMeta.setDisplayName("§cDelete note!"); - deleteMeta.setLore(Arrays.asList(new String[] {"Shift click to execute!"})); - deleteItem.setItemMeta(deleteMeta); - inv.set(3, deleteItem, new CallbackHandler() - { - @Override - public void run(Player player, ClickType type) - { - if (type == ClickType.SHIFT_LEFT) - { - delNote(player, index); - player.closeInventory(); - } - else - getLogger().message(player, true, "You need to shift click to execute this!"); - } - }); - - ItemStack closeItem = new ItemStack(Material.BARRIER); - ItemMeta closeMeta = closeItem.getItemMeta(); - closeMeta.setDisplayName("§eClose menu"); - closeItem.setItemMeta(closeMeta); - inv.set(9, closeItem, new CallbackHandler() - { - @Override - public void run(Player player, ClickType type) - { - player.closeInventory(); - } - }); - inv.show(player); - } - - public void saveNotes() - { - JsonManager.save(notes, saveFile); - } - - // @noformat - @Override - public String getCommandString() - { - return "command an {\n" + - " \n" + - " add [string:note...] {\n" + - " help Creates a new admin note;\n" + - " run an_create note;\n" + - " perm utils.an;" + - " }\n" + - " \n" + - " del [int:id] {\n" + - " help Deletes an admin note;\n" + - " run an_del id;\n" + - " perm utils.an;" + - " }\n" + - " \n" + - " list {\n" + - " help Lists all notes;\n" + - " run an_list;\n" + - " perm utils.an;" + - " }\n" + - "}"; - } - // @format -} diff --git a/src/com/redstoner/modules/scoreboard/Project.java b/src/com/redstoner/modules/scoreboard/Project.java deleted file mode 100644 index dbdc9fb..0000000 --- a/src/com/redstoner/modules/scoreboard/Project.java +++ /dev/null @@ -1,334 +0,0 @@ -package com.redstoner.modules.scoreboard; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import com.redstoner.misc.JsonManager; -import com.redstoner.misc.Main; -import com.redstoner.misc.Utils; - -public class Project -{ - private int progress; - private Project parent; - private final String projectID; - private String projectName; - private String displayName; - private UUID owner; - private JSONArray admins, members; - private int localID; - private Location location; - private Scoreboard scoreboard; - ArrayList subs = new ArrayList(); - - private Project(String projectID, Project parent, String name, String displayName, UUID owner, int localID, - Location location, JSONArray admins, JSONArray members) - { - this.parent = parent; - this.projectID = projectID; - this.progress = 0; - this.owner = owner; - this.location = location; - this.projectName = name; - this.localID = localID; - this.displayName = displayName; - this.admins = admins; - this.members = members; - scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); - updateScoreboard(); - } - - private Project(String projectID, Project parent, String name, String displayName, UUID owner, int localID, - Location location) - { - this(projectID, null, name, displayName, owner, localID, location, new JSONArray(), new JSONArray()); - } - - private Project(Project parent, String name, String displayName, UUID owner, int localID, Location location) - { - this(ProjectManager.getNextID(name), null, name, displayName, owner, localID, location); - } - - public Project(String name, String displayName, UUID owner, int localID, Location location) - { - this(null, name, displayName, owner, localID, location); - } - - /** This method returns the progress of this project. - * - * @return the progress in percent, as an integer between 0 and 100 (inclusive). */ - public int getProgress() - { - return progress; - } - - /** This method sets the progress to the given parameter. The value must be between 0 and 100 (inclusive).
- * If this project is not a leaf, then only 0 and 100 can be set, recursively overriding the progress of all sub-projects.
- * This method will invoke updateProgress(). - * - * @param sender The CommandSender responsible for updating the progress. - * @param progress the new progress, 0 ≤ progress ≤ 100. */ - public void setProgress(CommandSender sender, int progress) - { - if (progress < 0 || progress > 100) - { - if (sender != null) - Utils.sendErrorMessage(sender, null, "Progress must be between 0% and 100%!"); - return; - } - if (subs.size() == 0) - { - if (sender != null) - Utils.sendMessage(sender, null, "Updated the project's progress to &e" + progress + "%&7.", '&'); - this.progress = progress; - updateProgress(); - } - else - { - if (progress == 100) - { - for (Project project : subs) - { - project.setProgress(sender, progress); - } - updateProgress(); - if (sender != null) - Utils.sendMessage(sender, null, "Set the entire branch to done!"); - } - if (progress == 0) - { - for (Project project : subs) - { - project.setProgress(null, progress); - } - updateProgress(); - if (sender != null) - Utils.sendMessage(sender, null, "Set the entire branch to not done!"); - } - else - { - if (sender != null) - { - Utils.sendErrorMessage(sender, null, - "Can not set progress of a non-end project node to anything but 100 or 0!"); - Utils.sendErrorMessage(sender, null, "Please update the corresponding sub-project!"); - } - } - } - } - - /** This method updates the progress on the project, calculating it from the sub-projects if exists and updating the parent as well.
- * This will also update the scoreboard. */ - public void updateProgress() - { - if (subs.size() != 0) - {} - if (parent != null) - { - parent.updateProgress(); - } - updateScoreboard(); - } - - /** This returns the unique project identifier of this project, consisting of [name]#[ID]. - * - * @return the unique identifier. */ - public String getUUID() - { - return projectID; - } - - /** This method allows access to the parent project. - * - * @return the parent project, or null if this is the root project. */ - public Project getParent() - { - return parent; - } - - /** Teleports a player to the location assigned with this project. If no location can be found, the parent project's location will be used.
- * If at the root Project no valid location was found, the player will not be teleported and an error message will be sent. - * - * @param player the player to be teleported. - * @return true if the teleport was successfull. */ - public boolean tp(Player player) - { - if (location == null) - { - if (parent != null) - { - return parent.tp(player); - } - else - { - if (player.getUniqueId().equals(owner)) - Utils.sendErrorMessage(player, null, - "No location was assigned with this project! Use &e/project option location set &7(or one of the interactive menus )to define a location!"); - else - Utils.sendErrorMessage(player, null, - "No location was assigned with this project! Ask a project administrator to define one!"); - return false; - } - } - else - { - player.teleport(location); - Utils.sendMessage(player, null, "Teleported you to the projects location!"); - return true; - } - } - - /** This method converts a JSONObject representation of a Project back into the original project.
- * It will also load all sub-projects recursively, and load complex types back from Strings. - * - * @param project The JSONObject containing the Project. - * @return the project that was represented by the JSONObject. */ - public static Project getProject(JSONObject project) - { - ArrayList subs = new ArrayList(); - for (Object obj : (JSONArray) project.get("subs")) - { - subs.add(Project.getProject((JSONObject) obj)); - } - String projectName = (String) project.get("projectName"); - String displayName = (String) project.get("displayName"); - String projectID = (String) project.get("projectID"); - UUID owner = UUID.fromString((String) project.get("owner")); - JSONArray admins = (JSONArray) project.get("admins"); - JSONArray members = (JSONArray) project.get("members"); - int localID = (int) project.get("localID"); - int progress = (int) project.get("progress"); - Location location = getStringLocation((String) project.get("location")); - Project result = new Project(projectID, null, projectName, displayName, owner, localID, location, admins, - members); - for (Project sub : subs) - sub.parent = result; - result.progress = progress; - return result; - } - - /** This method turns the project into a JSONObject for storing on the file system. It will recursively turn all sub-projects into JSONObjects
- * and it will also convert all complex types into Strings. - * - * @return A JSONObject representing the project. */ - @SuppressWarnings("unchecked") - public JSONObject toJSONObject() - { - JSONObject project = new JSONObject(); - JSONArray subProjects = new JSONArray(); - for (Project subProject : subs) - { - subProjects.add(subProject.toJSONObject()); - } - project.put("subs", subProjects); - project.put("projectName", this.projectName); - project.put("displayName", this.displayName); - project.put("projectID", this.projectID); - project.put("owner", owner.toString()); - project.put("admins", admins); - project.put("members", members); - project.put("localID", localID); - project.put("progress", progress); - project.put("parent", parent.toString()); - project.put("location", getLocationString(location)); - return project; - } - - /** This method converts a location into a String representation ready for storing on the file system. - * - * @param location The location to be turned into a String. - * @return The String representation of the location. */ - public static String getLocationString(Location location) - { - UUID worldID = location.getWorld().getUID(); - return worldID + ";" + location.getX() + ";" + location.getY() + ";" + location.getZ() + ";" + location.getYaw() - + ";" + location.getPitch(); - } - - /** This method converts a String representation of a location back into its original location. - * - * @param location The String representation of the location. - * @return the location described by the String given, or null if the world containing it is gone. - * @throws NumberFormatException when the floats given as coordinates are invalid. - * @throws NumberFormatException when the UUID given as world descriptor is invalid. */ - public static Location getStringLocation(String location) throws NumberFormatException, IllegalArgumentException - { - String[] params = location.split(";"); - return new Location(Bukkit.getWorld(UUID.fromString(params[0])), Float.parseFloat(params[1]), - Float.parseFloat(params[2]), Float.parseFloat(params[3]), Float.parseFloat(params[4]), - Float.parseFloat(params[5])); - } - - /** This method refreshes the scoreboard assigned with the project and will be called internally when any value changes.
- * You can call this method at any time before displaying the scoreboard to make sure that the displayed values are accurate. */ - public void updateScoreboard() - { - Objective project = scoreboard.registerNewObjective("Project", "dummy"); - project.setDisplaySlot(DisplaySlot.SIDEBAR); - if (displayName != null) - project.setDisplayName(displayName); - else - project.setDisplayName(projectName); - Score progress = project.getScore("§aProgress"); - progress.setScore(this.progress); - save(); - } - - private void save() - { - if (parent == null) - JsonManager.save(toJSONObject(), - new File(Main.plugin.getDataFolder(), "scoreboards/projects/" + projectID + ".json")); - else - parent.save(); - } - - /** This method returns the UUID of the owner of this project. - * - * @return the UUID of the owner, null if the owner is console. */ - public UUID getOwner() - { - return owner; - } - - /** This method returns how many sub-projects can be created within this project, depending on the permissions of the project owner.
- *
- * Please note that as of Version 3.0.x, this value is always 5 and not respecting permissions. - * - * @return The maximum amount of sub-projects this project can have. */ - public int getMaxSubprojects() - { - return 5; - } - - /** This method returns an unmodifiable copy of the sub-projects. If you want to modify the list, use the corresponding add/delete/clear methods
- * of the project holding the list. You can still perform actions on all sub-projects as usual. - * - * @return An unmodifiable copy of the sub-projects list. */ - public synchronized List getSubProjects() - { - return Collections.unmodifiableList(subs); - } - - /** This method returns the scoreboard generated by the project status. - * - * @return the scoreboard object. */ - public Scoreboard getScoreboard() - { - return scoreboard; - } -} diff --git a/src/com/redstoner/modules/scoreboard/ProjectManager.java b/src/com/redstoner/modules/scoreboard/ProjectManager.java deleted file mode 100644 index b246737..0000000 --- a/src/com/redstoner/modules/scoreboard/ProjectManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.redstoner.modules.scoreboard; - -import java.io.File; - -import org.bukkit.command.CommandSender; -import org.json.simple.JSONObject; - -import com.redstoner.misc.JsonManager; -import com.redstoner.misc.Main; - -public class ProjectManager -{ - private static File dataFile = new File(Main.plugin.getDataFolder(), "projectIDs.json"); - private static JSONObject IDs; - - static - { - IDs = JsonManager.getObject(dataFile); - if (IDs == null) - IDs = new JSONObject(); - } - - /** This method generates a unique identifier for a project by name. - * - * @param name The name of the project. - * @return The project identifier, as [name]#[ID]. */ - @SuppressWarnings("unchecked") - public static String getNextID(String name) - { - Object raw = IDs.get(name); - int i = 1; - if (raw != null) - i = (int) raw + 1; - IDs.put(name, i); - save(); - return name + "#" + i; - } - - /** Saves the current state into a file. */ - private static void save() - { - JsonManager.save(IDs, dataFile); - } - - /** This method finds the currently active project by a CommandSender and will return it as part of the tree. - * - * @param sender The sender of whom the project is to be found. - * @return the currently active project of the sender or null, if none are active. */ - public static Project getCurrentProject(CommandSender sender) - { - return null; - } -} diff --git a/src/com/redstoner/modules/scoreboard/Scoreboards.java b/src/com/redstoner/modules/scoreboard/Scoreboards.java deleted file mode 100644 index 8a03ebb..0000000 --- a/src/com/redstoner/modules/scoreboard/Scoreboards.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.redstoner.modules.scoreboard; - -import java.io.File; -import java.util.HashMap; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.permissions.PermissionAttachmentInfo; -import org.json.simple.JSONObject; - -import com.nemez.cmdmgr.Command; -import com.nemez.cmdmgr.CommandManager; -import com.redstoner.annotations.AutoRegisterListener; -import com.redstoner.annotations.Version; -import com.redstoner.exceptions.MissingVersionException; -import com.redstoner.misc.JsonManager; -import com.redstoner.misc.Main; -import com.redstoner.misc.Utils; -import com.redstoner.misc.VersionHelper; -import com.redstoner.modules.Module; - -@AutoRegisterListener -@Version(major = 3, minor = 0, revision = 0, compatible = 3) -public class Scoreboards implements Module, Listener -{ - final File cmdFile = new File( - new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile()).getParentFile(), - "Scoreboard.cmd"); - final File scoreboardsFolder = new File(Main.plugin.getDataFolder(), "scoreboards"); - HashMap playerData = new HashMap(); - - @Override - public boolean onEnable() - { - if (!scoreboardsFolder.exists()) - scoreboardsFolder.mkdirs(); - playerData.put(Bukkit.getConsoleSender(), - JsonManager.getObject(new File(scoreboardsFolder, "scoreboards/players/console.json"))); - return true; - } - - @Override - public void postEnable() - { - CommandManager.registerCommand(cmdFile, this, Main.plugin); - } - - @Override - public void onDisable() - { - save(); - for (Player p : Bukkit.getOnlinePlayers()) - { - p.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); - } - playerData.remove(Bukkit.getConsoleSender()); - } - - private void save() - { - JsonManager.save(playerData.get(Bukkit.getConsoleSender()), - new File(scoreboardsFolder, "scoreboards/players/console.json")); - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) - { - Player player = event.getPlayer(); - JSONObject data = JsonManager.getObject( - new File(scoreboardsFolder, "scoreboards/players/" + player.getUniqueId().toString() + ".json")); - if (data == null) - data = new JSONObject(); - playerData.put(player, data); - Project currentProject = ProjectManager.getCurrentProject(player); - if (currentProject == null) - return; - else - player.setScoreboard(currentProject.getScoreboard()); - } - - @EventHandler - public void onPlayerLeave(PlayerQuitEvent event) - { - Player player = event.getPlayer(); - player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); - JsonManager.save(playerData.remove(player), - new File(scoreboardsFolder, "scoreboards/players/" + player.getUniqueId().toString() + ".json")); - } - - @Command(hook = "project") - public boolean project(CommandSender sender) throws MissingVersionException - { - Utils.sendMessage(sender, null, "This server is running version" + VersionHelper.getVersion(this.getClass())); - return true; - } - - @Command(hook = "create") - public boolean createProject(CommandSender sender, boolean sub, String name) - { - JSONObject data = playerData.get(sender); - if (!sub) - { - int max = Integer.parseInt(getPermissionContent(sender, "utils.scoreboards.projects.amount.")); - int amount = 0; - Object raw = data.get("amount"); - if (raw != null) - amount = (int) raw; - if (amount >= max) - { - Utils.sendErrorMessage(sender, null, "You have already reached the maximum amount of " + max - + " projects! Delete an old project before you create a new one!"); - return true; - } - } - else - { - Project currentProject = ProjectManager.getCurrentProject(sender); - int max = currentProject.getMaxSubprojects(); - int amount = currentProject.getSubProjects().size(); - Object raw = data.get("amount"); - if (raw != null) - amount = (int) raw; - if (amount >= max) - { - Utils.sendErrorMessage(sender, null, "You have already reached the maximum amount of " + max - + " projects! Delete an old project before you create a new one!"); - return true; - } - } - return true; - } - - private static String getPermissionContent(CommandSender sender, String permnode) - { - Set perms = sender.getEffectivePermissions(); - for (PermissionAttachmentInfo perm : perms) - if (perm.getPermission().toString().startsWith(permnode)) - return perm.getPermission().replace(permnode, ""); - return null; - } -} diff --git a/src/com/redstoner/modules/scoreboard/scoreboards.cmd b/src/com/redstoner/modules/scoreboard/scoreboards.cmd deleted file mode 100644 index e6fd956..0000000 --- a/src/com/redstoner/modules/scoreboard/scoreboards.cmd +++ /dev/null @@ -1,51 +0,0 @@ -command project { - [empty] { - help Prints version info.; - run project; - perm utils.scoreboards; - } - create [flag:-s] [string:name] { - help Creates a new Project. The -s flag indicates that you are trying to create a new sub-project instead.; - run create -s name; - perm utils.scoreboards.use; - } - delete { - help Deletes the current project. This will also delete the entire branch attached to it, but no parents.; - run delete; - perm utils.scoreboards.use; - } - explore [string:name] { - help Switches to the specified project. If you have multiple projects with the same name reachable in one step (example: you are in 5x5_top and want to go to 5x5_top_trigger, but you also have a project called trigger) then you need to specify the full path like this: 5x5_top_trigger; - run explore name; - perm utils.scoreboards.use; - } - hide { - help Deselects the current project. Use the &e/project explore &7command to view it again!; - run hide; - } - option { - help Opens an interactive option menu to let you change the projects settings.; - run optionMenu; - perm utils.scoreboards.use; - } - option [string:option] { - help Opens an interactive option menu to let you change the specified setting.; - run optionName name; - perm utils.scoreboards.use; - } - option [string:option] [string:value...] { - help Lets you directly modify the options of a project. If no value is specified, an interactive menu opens.; - run option name value; - perm utils.scoreboards.use; - } - manage { - help Opns an interactive menu that lets you manage the project in its entirety.; - run manage; - perm utils.scoreboards.use; - } - invite [flag:-e] [string:name] { - help Invites a player to the current project and all sub projects. If the -e is set, subprojects will be excluded.; - run invite e name; - perm utils.scoreboards.use; - } -} \ No newline at end of file