diff --git a/lib/.gitignore b/lib/.gitignore
new file mode 100644
index 0000000..0794c18
--- /dev/null
+++ b/lib/.gitignore
@@ -0,0 +1,8 @@
+# Maven
+target/
+
+# Java
+*.class
+*.jar
+*.war
+*.ear
diff --git a/lib/LICENSE.txt b/lib/LICENSE.txt
new file mode 100644
index 0000000..be7c930
--- /dev/null
+++ b/lib/LICENSE.txt
@@ -0,0 +1,227 @@
+WorldEdit License
+-----------------
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+
+JNBT License
+------------
+
+Copyright (c) 2010 Graham Edgecombe
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the JNBT team nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
+JChronic License
+----------------
+
+The MIT License
+
+Copyright (c) 2009 Mike Schrag, Sam Tingleff
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/lib/NOTICE.txt b/lib/NOTICE.txt
new file mode 100644
index 0000000..4c14f12
--- /dev/null
+++ b/lib/NOTICE.txt
@@ -0,0 +1,10 @@
+This product includes software from JNBT (http://jnbt.sourceforge.net/).
+
+This product includes software from WorldEdit
+(http://www.sk89q.com), under GNU Lesser General Public License, version 3.
+
+This product includes software from JOpt Simple, under the MIT license.
+
+This product includes software by toi.
+
+This product includes software from JChronic, under the MIT license.
\ No newline at end of file
diff --git a/lib/README.md b/lib/README.md
new file mode 100644
index 0000000..99274a2
--- /dev/null
+++ b/lib/README.md
@@ -0,0 +1,18 @@
+sk89q-command-framework
+=======================
+
+sk89q-command-framework is the command framework from sk89q's WorldEdit. It has been factored out so it may be used in other projects without having to include WorldEdit as a dependency.
+
+Compiling
+---------
+
+You need to have Maven installed (http://maven.apache.org). Once installed, simply run:
+
+ mvn clean install
+
+Maven will automatically download dependencies for you. Note: For that to work, be sure to add Maven to your "PATH".
+
+Contributing
+------------
+
+Your submissions have to be licensed under the GNU General Public License v3.
diff --git a/lib/bukkit/pom.xml b/lib/bukkit/pom.xml
new file mode 100644
index 0000000..97201bf
--- /dev/null
+++ b/lib/bukkit/pom.xml
@@ -0,0 +1,58 @@
+
+ 4.0.0
+
+ com.sk89q
+ command-framework-parent
+ 0.5-SNAPSHOT
+
+ command-framework-bukkit
+ jar
+ 0.5-SNAPSHOT
+ Sk89q Command Framework for Bukkit
+ Supporting classes for running the command framework on Bukkit servers.
+
+
+
+ bukkit-repo
+ http://repo.bukkit.org/content/groups/public
+
+
+
+
+
+ com.sk89q
+ command-framework-core
+ 0.5-SNAPSHOT
+
+
+ org.bukkit
+ bukkit
+ 1.4.7-R1.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 2.1
+
+
+
+ com.sk89q:command-framework-core
+
+
+
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
diff --git a/lib/bukkit/src/main/java/com/sk89q/bukkit/util/BukkitCommandsManager.java b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/BukkitCommandsManager.java
new file mode 100644
index 0000000..41ee940
--- /dev/null
+++ b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/BukkitCommandsManager.java
@@ -0,0 +1,12 @@
+package com.sk89q.bukkit.util;
+
+import org.bukkit.command.CommandSender;
+
+import com.sk89q.minecraft.util.commands.CommandsManager;
+
+public class BukkitCommandsManager extends CommandsManager {
+ @Override
+ public boolean hasPermission(CommandSender player, String perm) {
+ return player.hasPermission(perm);
+ }
+}
diff --git a/lib/bukkit/src/main/java/com/sk89q/bukkit/util/BukkitWrappedCommandSender.java b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/BukkitWrappedCommandSender.java
new file mode 100644
index 0000000..e68d0d6
--- /dev/null
+++ b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/BukkitWrappedCommandSender.java
@@ -0,0 +1,54 @@
+package com.sk89q.bukkit.util;
+
+import org.bukkit.command.BlockCommandSender;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.ConsoleCommandSender;
+import org.bukkit.entity.Player;
+
+import com.sk89q.minecraft.util.commands.WrappedCommandSender;
+
+public class BukkitWrappedCommandSender implements WrappedCommandSender {
+ public BukkitWrappedCommandSender(CommandSender wrapped) {
+ this.wrapped = wrapped;
+ }
+
+ @Override
+ public String getName() {
+ return this.getName();
+ }
+
+ @Override
+ public void sendMessage(String message) {
+ this.wrapped.sendMessage(message);
+ }
+
+ @Override
+ public void sendMessage(String[] messages) {
+ this.wrapped.sendMessage(messages);
+ }
+
+ @Override
+ public boolean hasPermission(String permission) {
+ return this.wrapped.hasPermission(permission);
+ }
+
+ @Override
+ public Type getType() {
+ if (this.wrapped instanceof ConsoleCommandSender) {
+ return Type.CONSOLE;
+ } else if (this.wrapped instanceof Player) {
+ return Type.PLAYER;
+ } else if (this.wrapped instanceof BlockCommandSender) {
+ return Type.BLOCK;
+ } else {
+ return Type.UNKNOWN;
+ }
+ }
+
+ @Override
+ public Object getCommandSender() {
+ return this.wrapped;
+ }
+
+ private final CommandSender wrapped;
+}
diff --git a/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandInfo.java b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandInfo.java
new file mode 100644
index 0000000..6bcdd75
--- /dev/null
+++ b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandInfo.java
@@ -0,0 +1,65 @@
+/*
+ * WorldEdit
+ * Copyright (C) 2012 sk89q
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.bukkit.util;
+
+/**
+ * @author zml2008
+ */
+public class CommandInfo {
+ private final String[] aliases;
+ private final Object registeredWith;
+ private final String usage, desc;
+ private final String[] permissions;
+
+ public CommandInfo(String usage, String desc, String[] aliases, Object registeredWith) {
+ this(usage, desc, aliases, registeredWith, null);
+ }
+
+ public CommandInfo(String usage, String desc, String[] aliases, Object registeredWith, String[] permissions) {
+ this.usage = usage;
+ this.desc = desc;
+ this.aliases = aliases;
+ this.permissions = permissions;
+ this.registeredWith = registeredWith;
+ }
+
+ public String[] getAliases() {
+ return aliases;
+ }
+
+ public String getName() {
+ return aliases[0];
+ }
+
+ public String getUsage() {
+ return usage;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public String[] getPermissions() {
+ return permissions;
+ }
+
+ public Object getRegisteredWith() {
+ return registeredWith;
+ }
+}
diff --git a/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandRegistration.java b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandRegistration.java
new file mode 100644
index 0000000..8c5b5f8
--- /dev/null
+++ b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandRegistration.java
@@ -0,0 +1,112 @@
+// $Id$
+/*
+ * WorldEdit
+ * Copyright (C) 2011 sk89q and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.bukkit.util;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.sk89q.util.ReflectionUtil;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandMap;
+import org.bukkit.command.SimpleCommandMap;
+import org.bukkit.plugin.Plugin;
+
+/**
+ * @author zml2008
+ */
+public class CommandRegistration {
+
+ static {
+ Bukkit.getServer().getHelpMap().registerHelpTopicFactory(DynamicPluginCommand.class, new DynamicPluginCommandHelpTopic.Factory());
+ }
+
+ protected final Plugin plugin;
+ protected final CommandExecutor executor;
+ private CommandMap fallbackCommands;
+
+ public CommandRegistration(Plugin plugin) {
+ this(plugin, plugin);
+ }
+
+ public CommandRegistration(Plugin plugin, CommandExecutor executor) {
+ this.plugin = plugin;
+ this.executor = executor;
+ }
+
+ public boolean register(List registered) {
+ CommandMap commandMap = getCommandMap();
+ if (registered == null || commandMap == null) {
+ return false;
+ }
+ for (CommandInfo command : registered) {
+ DynamicPluginCommand cmd = new DynamicPluginCommand(command.getAliases(),
+ command.getDesc(), "/" + command.getAliases()[0] + " " + command.getUsage(), executor, command.getRegisteredWith(), plugin);
+ cmd.setPermissions(command.getPermissions());
+ commandMap.register(plugin.getDescription().getName(), cmd);
+ }
+ return true;
+ }
+
+ public CommandMap getCommandMap() {
+ CommandMap commandMap = ReflectionUtil.getField(plugin.getServer().getPluginManager(), "commandMap");
+ if (commandMap == null) {
+ if (fallbackCommands != null) {
+ commandMap = fallbackCommands;
+ } else {
+ Bukkit.getServer().getLogger().severe(plugin.getDescription().getName() +
+ ": Could not retrieve server CommandMap, using fallback instead! Please report to http://redmine.sk89q.com");
+ fallbackCommands = commandMap = new SimpleCommandMap(Bukkit.getServer());
+ Bukkit.getServer().getPluginManager().registerEvents(new FallbackRegistrationListener(fallbackCommands), plugin);
+ }
+ }
+ return commandMap;
+ }
+
+ public boolean unregisterCommands() {
+ CommandMap commandMap = getCommandMap();
+ List toRemove = new ArrayList();
+ Map knownCommands = ReflectionUtil.getField(commandMap, "knownCommands");
+ Set aliases = ReflectionUtil.getField(commandMap, "aliases");
+ if (knownCommands == null || aliases == null) {
+ return false;
+ }
+ for (Iterator i = knownCommands.values().iterator(); i.hasNext();) {
+ org.bukkit.command.Command cmd = i.next();
+ if (cmd instanceof DynamicPluginCommand && ((DynamicPluginCommand) cmd).getOwner().equals(executor)) {
+ i.remove();
+ for (String alias : cmd.getAliases()) {
+ org.bukkit.command.Command aliasCmd = knownCommands.get(alias);
+ if (cmd.equals(aliasCmd)) {
+ aliases.remove(alias);
+ toRemove.add(alias);
+ }
+ }
+ }
+ }
+ for (String string : toRemove) {
+ knownCommands.remove(string);
+ }
+ return true;
+ }
+}
diff --git a/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandsManagerRegistration.java b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandsManagerRegistration.java
new file mode 100644
index 0000000..57862ed
--- /dev/null
+++ b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/CommandsManagerRegistration.java
@@ -0,0 +1,66 @@
+// $Id$
+/*
+ * WorldEdit
+ * Copyright (C) 2011 sk89q and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.bukkit.util;
+
+import com.sk89q.minecraft.util.commands.Command;
+import com.sk89q.minecraft.util.commands.CommandPermissions;
+import com.sk89q.minecraft.util.commands.CommandsManager;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.plugin.Plugin;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author zml2008
+ */
+public class CommandsManagerRegistration extends CommandRegistration {
+ protected CommandsManager> commands;
+
+ public CommandsManagerRegistration(Plugin plugin, CommandsManager> commands) {
+ super(plugin);
+ this.commands = commands;
+ }
+
+ public CommandsManagerRegistration(Plugin plugin, CommandExecutor executor, CommandsManager> commands) {
+ super(plugin, executor);
+ this.commands = commands;
+ }
+
+ public boolean register(Class> clazz) {
+ return registerAll(commands.registerAndReturn(clazz));
+ }
+
+ public boolean registerAll(List registered) {
+ List toRegister = new ArrayList();
+ for (Command command : registered) {
+ String[] permissions = null;
+ Method cmdMethod = commands.getMethods().get(null).get(command.aliases()[0]);
+ if (cmdMethod != null && cmdMethod.isAnnotationPresent(CommandPermissions.class)) {
+ permissions = cmdMethod.getAnnotation(CommandPermissions.class).value();
+ }
+
+ toRegister.add(new CommandInfo(command.usage(), command.desc(), command.aliases(), commands, permissions));
+ }
+
+ return register(toRegister);
+ }
+}
diff --git a/lib/bukkit/src/main/java/com/sk89q/bukkit/util/DynamicPluginCommand.java b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/DynamicPluginCommand.java
new file mode 100644
index 0000000..e4ef24e
--- /dev/null
+++ b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/DynamicPluginCommand.java
@@ -0,0 +1,98 @@
+// $Id$
+/*
+ * WorldEdit
+ * Copyright (C) 2011 sk89q and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.bukkit.util;
+
+import com.sk89q.minecraft.util.commands.CommandsManager;
+import com.sk89q.util.StringUtil;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.PluginIdentifiableCommand;
+import org.bukkit.plugin.Plugin;
+
+import java.util.Arrays;
+
+/**
+* @author zml2008
+*/
+public class DynamicPluginCommand extends org.bukkit.command.Command implements PluginIdentifiableCommand {
+
+ protected final CommandExecutor owner;
+ protected final Object registeredWith;
+ protected final Plugin owningPlugin;
+ protected String[] permissions = new String[0];
+
+ public DynamicPluginCommand(String[] aliases, String desc, String usage, CommandExecutor owner, Object registeredWith, Plugin plugin) {
+ super(aliases[0], desc, usage, Arrays.asList(aliases));
+ this.owner = owner;
+ this.owningPlugin = plugin;
+ this.registeredWith = registeredWith;
+ }
+
+ @Override
+ public boolean execute(CommandSender sender, String label, String[] args) {
+ return owner.onCommand(sender, this, label, args);
+ }
+
+ public Object getOwner() {
+ return owner;
+ }
+
+ public Object getRegisteredWith() {
+ return registeredWith;
+ }
+
+ public void setPermissions(String[] permissions) {
+ this.permissions = permissions;
+ if (permissions != null) {
+ super.setPermission(StringUtil.joinString(permissions, ";"));
+ }
+ }
+
+ public String[] getPermissions() {
+ return permissions;
+ }
+
+ @Override
+ public Plugin getPlugin() {
+ return owningPlugin;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public boolean testPermissionSilent(CommandSender sender) {
+ if (permissions == null || permissions.length == 0) {
+ return true;
+ }
+
+ if (registeredWith instanceof CommandsManager>) {
+ try {
+ for (String permission : permissions) {
+ if (((CommandsManager) registeredWith).hasPermission(sender, permission)) {
+ return true;
+ }
+ }
+ return false;
+ } catch (Throwable ignore) {
+ }
+ }
+ return super.testPermissionSilent(sender);
+ }
+}
diff --git a/lib/bukkit/src/main/java/com/sk89q/bukkit/util/DynamicPluginCommandHelpTopic.java b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/DynamicPluginCommandHelpTopic.java
new file mode 100644
index 0000000..4b4d409
--- /dev/null
+++ b/lib/bukkit/src/main/java/com/sk89q/bukkit/util/DynamicPluginCommandHelpTopic.java
@@ -0,0 +1,126 @@
+/*
+ * WorldEdit
+ * Copyright (C) 2012 sk89q
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.bukkit.util;
+
+import com.sk89q.minecraft.util.commands.CommandsManager;
+import org.bukkit.ChatColor;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.command.CommandSender;
+import org.bukkit.help.HelpTopic;
+import org.bukkit.help.HelpTopicFactory;
+
+import java.util.Map;
+
+/**
+ * @author zml2008
+ */
+public class DynamicPluginCommandHelpTopic extends HelpTopic {
+ private final DynamicPluginCommand cmd;
+
+ public DynamicPluginCommandHelpTopic(DynamicPluginCommand cmd) {
+ this.cmd = cmd;
+ this.name = "/" + cmd.getName();
+
+ String fullTextTemp = null;
+ StringBuilder fullText = new StringBuilder();
+
+ if (cmd.getRegisteredWith() instanceof CommandsManager) {
+ Map helpText = ((CommandsManager>) cmd.getRegisteredWith()).getHelpMessages();
+ final String lookupName = cmd.getName().replaceAll("/", "");
+ if (helpText.containsKey(lookupName)) { // We have full help text for this command
+ fullTextTemp = helpText.get(lookupName);
+ }
+ // No full help text, assemble help text from info
+ helpText = ((CommandsManager>) cmd.getRegisteredWith()).getCommands();
+ if (helpText.containsKey(cmd.getName())) {
+ final String shortText = helpText.get(cmd.getName());
+ if (fullTextTemp == null) {
+ fullTextTemp = this.name + " " + shortText;
+ }
+ this.shortText = shortText;
+ }
+ } else {
+ this.shortText = cmd.getDescription();
+ }
+
+ // Put the usage in the format: Usage string (newline) Aliases (newline) Help text
+ String[] split = fullTextTemp == null ? new String[2] : fullTextTemp.split("\n", 2);
+ fullText.append(ChatColor.BOLD).append(ChatColor.GOLD).append("Usage: ").append(ChatColor.WHITE);
+ fullText.append(split[0]).append("\n");
+
+ if (cmd.getAliases().size() > 0) {
+ fullText.append(ChatColor.BOLD).append(ChatColor.GOLD).append("Aliases: ").append(ChatColor.WHITE);
+ boolean first = true;
+ for (String alias : cmd.getAliases()) {
+ if (!first) {
+ fullText.append(", ");
+ }
+ fullText.append(alias);
+ first = false;
+ }
+ fullText.append("\n");
+ }
+ if (split.length > 1) {
+ fullText.append(split[1]);
+ }
+ this.fullText = fullText.toString();
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public boolean canSee(CommandSender player) {
+ if (cmd.getPermissions() != null && cmd.getPermissions().length > 0) {
+ if (cmd.getRegisteredWith() instanceof CommandsManager) {
+ try {
+ for (String perm : cmd.getPermissions()) {
+ if (((CommandsManager