Added CommandTreeBase (#3193)

This commit is contained in:
LatvianModder 2016-09-13 10:36:51 +03:00 committed by LexManos
parent cac55abec2
commit 4e3b6b0f15
3 changed files with 272 additions and 0 deletions

View File

@ -0,0 +1,138 @@
/*
* Minecraft Forge
* Copyright (c) 2016.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.server.command;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
/**
* Base class for commands that has subcommands.
* <p>
* E.g. /team settings set [value]
* settings is subcommand of team and set is subcommand of settings
*/
public abstract class CommandTreeBase extends CommandBase
{
private final HashMap<String, ICommand> commandMap = new HashMap<String, ICommand>();
public void addSubcommand(ICommand c)
{
commandMap.put(c.getCommandName(), c);
}
public Collection<ICommand> getSubCommands()
{
return Collections.unmodifiableCollection(commandMap.values());
}
private static String[] shiftArgs(String[] s)
{
if(s == null || s.length == 0)
{
return new String[0];
}
String[] s1 = new String[s.length - 1];
System.arraycopy(s, 1, s1, 0, s1.length);
return s1;
}
@Override
public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos pos)
{
if(args.length == 1)
{
List<String> keys = new ArrayList<String>();
for(ICommand c : commandMap.values())
{
if(c.checkPermission(server, sender))
{
keys.add(c.getCommandName());
}
}
Collections.sort(keys, null);
return getListOfStringsMatchingLastWord(args, keys);
}
ICommand cmd = commandMap.get(args[0]);
if(cmd != null)
{
return cmd.getTabCompletionOptions(server, sender, shiftArgs(args), pos);
}
return super.getTabCompletionOptions(server, sender, args, pos);
}
@Override
public boolean isUsernameIndex(String[] args, int index)
{
if(index > 0 && args.length > 1)
{
ICommand cmd = commandMap.get(args[0]);
if(cmd != null)
{
return cmd.isUsernameIndex(shiftArgs(args), index - 1);
}
}
return false;
}
@Override
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException
{
if(args.length < 1)
{
sender.addChatMessage(new TextComponentString(CommandBase.joinNiceStringFromCollection(commandMap.keySet())));
}
else
{
ICommand cmd = commandMap.get(args[0]);
if(cmd == null)
{
throw new CommandException("commands.tree_base.invalid_cmd", args[0]);
}
else if(!cmd.checkPermission(server, sender))
{
throw new CommandException("commands.generic.permission");
}
else
{
cmd.execute(server, sender, shiftArgs(args));
}
}
}
}

View File

@ -3,6 +3,7 @@ commands.forge.usage.tracking=Use /forge track <type> <duration>. Valid types ar
commands.forge.tps.summary=%s : Mean tick time: %d ms. Mean TPS: %d
commands.forge.tracking.te.enabled=Tile Entity tracking enabled for %d seconds.
commands.tree_base.invalid_cmd=Invalid subcommand '%s'!
forge.texture.preload.warning=Warning: Texture %s not preloaded, will cause render glitches!
forge.client.shutdown.internal=Shutting down internal server...
forge.update.newversion=New Forge version available: %s

View File

@ -0,0 +1,133 @@
package net.minecraftforge.test;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.server.command.CommandTreeBase;
@Mod(modid = CommandTreeBaseTest.MOD_ID, name = "CommandTreeBaseTest", version = "1.0.0")
public class CommandTreeBaseTest
{
public static final String MOD_ID = "CommandTreeBaseTest";
@Mod.Instance(CommandTreeBaseTest.MOD_ID)
public static CommandTreeBaseTest inst;
@Mod.EventHandler
public void onServerStarted(FMLServerStartingEvent event)
{
event.registerServerCommand(new CommandTreeTest());
}
public static class CommandTreeTest extends CommandTreeBase
{
public CommandTreeTest()
{
addSubcommand(new CommandPing());
addSubcommand(new CommandValue());
}
@Override
public String getCommandName()
{
return "treecommand_test";
}
@Override
public String getCommandUsage(ICommandSender sender)
{
return "commands.treecommand_test.usage";
}
public static class CommandPing extends CommandBase
{
@Override
public String getCommandName()
{
return "ping";
}
@Override
public String getCommandUsage(ICommandSender sender)
{
return "commands.treecommand_test.ping.usage";
}
@Override
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException
{
sender.addChatMessage(new TextComponentString("Pong!"));
}
}
public static class CommandValue extends CommandTreeBase
{
private static int value = 0;
public CommandValue()
{
addSubcommand(new CommandSet());
addSubcommand(new CommandGet());
}
@Override
public String getCommandName()
{
return "value";
}
@Override
public String getCommandUsage(ICommandSender sender)
{
return "commands.treecommand_test.value.usage";
}
public static class CommandSet extends CommandBase
{
@Override
public String getCommandName()
{
return "set";
}
@Override
public String getCommandUsage(ICommandSender sender)
{
return "commands.treecommand_test.value.set.usage";
}
@Override
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException
{
value = CommandTreeTest.parseInt(args[0]);
sender.addChatMessage(new TextComponentString("Test value set to: " + value));
}
}
public static class CommandGet extends CommandBase
{
@Override
public String getCommandName()
{
return "get";
}
@Override
public String getCommandUsage(ICommandSender sender)
{
return "commands.treecommand_test.value.get.usage";
}
@Override
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException
{
sender.addChatMessage(new TextComponentString("Test value: " + value));
}
}
}
}
}