Rework commands to be sub commands of /bloodmagic

This commit is contained in:
Nick 2015-10-08 23:56:00 -07:00
parent fa78706fca
commit 731f92a7fd
7 changed files with 461 additions and 3 deletions

View file

@ -11,6 +11,7 @@ import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import WayofTime.alchemicalWizardry.common.commands.CommandBloodMagic;
import WayofTime.alchemicalWizardry.common.thread.CommandDownloadGAPI;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
@ -1911,9 +1912,10 @@ public class AlchemicalWizardry
@Mod.EventHandler
public void initCommands(FMLServerStartingEvent event)
{
event.registerServerCommand(new CommandBind());
event.registerServerCommand(new CommandUnbind());
event.registerServerCommand(new CommandSN());
// event.registerServerCommand(new CommandBind());
// event.registerServerCommand(new CommandUnbind());
// event.registerServerCommand(new CommandSN());
event.registerServerCommand(new CommandDownloadGAPI());
event.registerServerCommand(new CommandBloodMagic());
}
}

View file

@ -0,0 +1,21 @@
package WayofTime.alchemicalWizardry.api.command;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
public interface ISubCommand {
String getSubCommandName();
ICommand getParentCommand();
String getArgUsage(ICommandSender commandSender);
String getHelpText();
int getRequiredPermissionLevel();
boolean canSenderUseSubCommand(ICommandSender commandSender);
void processSubCommand(ICommandSender commandSender, String[] args);
}

View file

@ -0,0 +1,87 @@
package WayofTime.alchemicalWizardry.api.command;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.PlayerNotFoundException;
import net.minecraft.command.PlayerSelector;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatStyle;
import net.minecraft.util.EnumChatFormatting;
import java.util.Locale;
public abstract class SubCommandBase implements ISubCommand {
private ICommand parent;
private String name;
public SubCommandBase(ICommand parent, String name) {
this.parent = parent;
this.name = name;
}
@Override
public String getSubCommandName() {
return name;
}
@Override
public ICommand getParentCommand() {
return parent;
}
@Override
public boolean canSenderUseSubCommand(ICommandSender commandSender) {
return commandSender.canCommandSenderUseCommand(getRequiredPermissionLevel(), "op");
}
@Override
public void processSubCommand(ICommandSender commandSender, String[] args) {
if (args.length == 0 && !getSubCommandName().equals("help"))
displayErrorString(commandSender, String.format("%s - %s", capitalizeFirstLetter(getSubCommandName()), getArgUsage(commandSender)));
if (isBounded(0, 2, args.length) && args[0].equals("help"))
displayHelpString(commandSender, String.format("%s - %s", capitalizeFirstLetter(getSubCommandName()), getHelpText()));
}
protected EntityPlayerMP getCommandSenderAsPlayer(ICommandSender commandSender) {
if (commandSender instanceof EntityPlayerMP)
return (EntityPlayerMP)commandSender;
else
throw new PlayerNotFoundException("You must specify which player you wish to perform this action on.");
}
protected EntityPlayerMP getPlayer(ICommandSender commandSender, String playerName) {
EntityPlayerMP entityplayermp = PlayerSelector.matchOnePlayer(commandSender, playerName);
if (entityplayermp != null)
return entityplayermp;
else {
entityplayermp = MinecraftServer.getServer().getConfigurationManager().func_152612_a(playerName);
if (entityplayermp == null)
throw new PlayerNotFoundException();
else
return entityplayermp;
}
}
protected String capitalizeFirstLetter(String toCapital) {
return String.valueOf(toCapital.charAt(0)).toUpperCase(Locale.ENGLISH) + toCapital.substring(1);
}
protected boolean isBounded(int low, int high, int given) {
return given > low && given < high;
}
protected void displayHelpString(ICommandSender commandSender, String display) {
commandSender.addChatMessage(new ChatComponentText(display).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GREEN)));
}
protected void displayErrorString(ICommandSender commandSender, String display) {
commandSender.addChatMessage(new ChatComponentText(display).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED)));
}
}

View file

@ -0,0 +1,71 @@
package WayofTime.alchemicalWizardry.common.commands;
import WayofTime.alchemicalWizardry.api.command.ISubCommand;
import WayofTime.alchemicalWizardry.common.commands.sub.SubCommandBind;
import WayofTime.alchemicalWizardry.common.commands.sub.SubCommandHelp;
import WayofTime.alchemicalWizardry.common.commands.sub.SubCommandNetwork;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatStyle;
import net.minecraft.util.EnumChatFormatting;
import java.util.*;
public class CommandBloodMagic extends CommandBase {
private final List aliases = new ArrayList();
private final Map<String, ISubCommand> subCommands = new HashMap<String, ISubCommand>();
@SuppressWarnings("unchecked")
public CommandBloodMagic() {
aliases.add("BloodMagic");
aliases.add("bloodmagic");
aliases.add("bloodMagic");
aliases.add("bm");
subCommands.put("help", new SubCommandHelp(this));
subCommands.put("network", new SubCommandNetwork(this));
subCommands.put("bind", new SubCommandBind(this));
}
@Override
public String getCommandName() {
return "/bloodmagic";
}
@Override
public int getRequiredPermissionLevel() {
return 3;
}
@Override
public String getCommandUsage(ICommandSender commandSender) {
return getCommandName() + " help";
}
@Override
public List getCommandAliases() {
return aliases;
}
@Override
public void processCommand(ICommandSender commandSender, String[] args) {
if (args.length > 0 && subCommands.containsKey(args[0])) {
ISubCommand subCommand = subCommands.get(args[0]);
String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
if (subCommand.canSenderUseSubCommand(commandSender))
subCommand.processSubCommand(commandSender, subArgs);
else
commandSender.addChatMessage(new ChatComponentText("You do not have permission to use this command.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED)));
} else {
commandSender.addChatMessage(new ChatComponentText("Unknown command!").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED)));
}
}
public Map<String, ISubCommand> getSubCommands() {
return subCommands;
}
}

View file

@ -0,0 +1,73 @@
package WayofTime.alchemicalWizardry.common.commands.sub;
import WayofTime.alchemicalWizardry.api.command.SubCommandBase;
import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable;
import WayofTime.alchemicalWizardry.common.items.EnergyItems;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatComponentText;
public class SubCommandBind extends SubCommandBase {
public SubCommandBind(ICommand parent) {
super(parent, "bind");
}
@Override
public String getArgUsage(ICommandSender commandSender) {
return "/bloodmagic bind [true|false] [player]";
}
@Override
public String getHelpText() {
return "Attempts to (un)bind the currently held item.";
}
@Override
public int getRequiredPermissionLevel() {
return 0;
}
@Override
public void processSubCommand(ICommandSender commandSender, String[] args) {
super.processSubCommand(commandSender, args);
EntityPlayer player = getCommandSenderAsPlayer(commandSender);
String playerName = player.getCommandSenderName();
ItemStack held = player.getHeldItem();
boolean bind = true;
if (held != null && held.getItem() instanceof IBindable) {
if (args.length > 0) {
if (args[0].equalsIgnoreCase("help"))
return;
if (isBoolean(args[0])) {
bind = Boolean.parseBoolean(args[0]);
if (args.length > 2)
playerName = args[1];
} else {
playerName = args[0];
}
}
if (bind) {
EnergyItems.setItemOwner(held, playerName);
commandSender.addChatMessage(new ChatComponentText("Binding successful"));
} else {
if (!EnergyItems.getOwnerName(held).isEmpty()) {
held.stackTagCompound.removeTag("ownerName");
commandSender.addChatMessage(new ChatComponentText("Unbinding successful"));
}
}
}
}
private boolean isBoolean(String string) {
return string.equalsIgnoreCase("true") || string.equalsIgnoreCase("false");
}
}

View file

@ -0,0 +1,43 @@
package WayofTime.alchemicalWizardry.common.commands.sub;
import WayofTime.alchemicalWizardry.api.command.ISubCommand;
import WayofTime.alchemicalWizardry.api.command.SubCommandBase;
import WayofTime.alchemicalWizardry.common.commands.CommandBloodMagic;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatStyle;
import net.minecraft.util.EnumChatFormatting;
public class SubCommandHelp extends SubCommandBase {
public SubCommandHelp(ICommand parent) {
super(parent, "help");
}
@Override
public String getArgUsage(ICommandSender commandSender) {
return "/bloodmagic help";
}
@Override
public String getHelpText() {
return "Displays the help information for the \"/bloodmagic\" command.";
}
@Override
public int getRequiredPermissionLevel() {
return 0;
}
@Override
public void processSubCommand(ICommandSender commandSender, String[] args) {
super.processSubCommand(commandSender, args);
if (args.length > 0)
return;
for (ISubCommand subCommand : ((CommandBloodMagic)getParentCommand()).getSubCommands().values())
commandSender.addChatMessage(new ChatComponentText(String.format("%s - %s", capitalizeFirstLetter(subCommand.getSubCommandName()), subCommand.getArgUsage(commandSender))).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GREEN)));
}
}

View file

@ -0,0 +1,161 @@
package WayofTime.alchemicalWizardry.common.commands.sub;
import WayofTime.alchemicalWizardry.api.command.SubCommandBase;
import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ChatComponentText;
import java.util.Locale;
public class SubCommandNetwork extends SubCommandBase {
public SubCommandNetwork(ICommand parent) {
super(parent, "network");
}
@Override
public String getArgUsage(ICommandSender commandSender) {
return "/bloodmagic network [syphon|add|get|fill|cap] player [amount]";
}
@Override
public String getHelpText() {
return "LP network utilities";
}
@Override
public int getRequiredPermissionLevel() {
return 0;
}
@Override
public void processSubCommand(ICommandSender commandSender, String[] args) {
super.processSubCommand(commandSender, args);
if (args.length > 0) {
if (args[0].equalsIgnoreCase("help"))
return;
String givenName = commandSender.getCommandSenderName();
EntityPlayer player = getPlayer(commandSender, givenName);
if (args.length > 1) {
givenName = args[1];
player = getPlayer(commandSender, givenName);
}
boolean displayHelp = isBounded(0, 2, args.length);
try {
switch (ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH))) {
case SYPHON: {
if (displayHelp) {
displayHelpString(commandSender, ValidCommands.SYPHON.help);
break;
}
if (args.length == 3) {
if (isInteger(args[2])) {
int amount = Integer.parseInt(args[2]);
SoulNetworkHandler.syphonAndDamageFromNetwork(givenName, player, amount);
} else {
displayErrorString(commandSender, "Invalid arguments");
}
} else {
displayErrorString(commandSender, "Not enough arguments");
}
break;
}
case ADD: {
if (displayHelp) {
displayHelpString(commandSender, ValidCommands.ADD.help);
break;
}
if (args.length == 3) {
if (isInteger(args[2])) {
int amount = Integer.parseInt(args[2]);
int maxOrb = SoulNetworkHandler.getMaximumForOrbTier(SoulNetworkHandler.getCurrentMaxOrb(givenName));
SoulNetworkHandler.addCurrentEssenceToMaximum(givenName, amount, maxOrb);
} else {
displayErrorString(commandSender, "Invalid arguments");
}
} else {
displayErrorString(commandSender, "Not enough arguments");
}
break;
}
case GET: {
if (displayHelp) {
displayHelpString(commandSender, ValidCommands.GET.help);
break;
}
if (args.length > 1)
commandSender.addChatMessage(new ChatComponentText("Current Essence: " + SoulNetworkHandler.getCurrentEssence(givenName)));
break;
}
case FILL: {
if (displayHelp) {
displayHelpString(commandSender, ValidCommands.FILL.help);
break;
}
if (args.length > 1)
SoulNetworkHandler.setCurrentEssence(givenName, Integer.MAX_VALUE);
break;
}
case CAP: {
if (displayHelp) {
displayHelpString(commandSender, ValidCommands.CAP.help);
break;
}
if (args.length > 1) {
int maxOrb = SoulNetworkHandler.getMaximumForOrbTier(SoulNetworkHandler.getCurrentMaxOrb(givenName));
SoulNetworkHandler.setCurrentEssence(givenName, maxOrb);
}
break;
}
}
} catch (IllegalArgumentException e) {
displayErrorString(commandSender, "Command not found!");
}
}
}
private enum ValidCommands {
SYPHON("Removes the given amount of LP from the given player's LP network."),
ADD("Adds the given amount of LP to the given player's LP network."),
GET("Returns the amount of LP in the given player's LP network."),
FILL(String.format("Fills the given player's LP network to %d", Integer.MAX_VALUE)),
CAP("Fills the given player's LP network to the max that their highest Blood Orb can store.");
public String help;
ValidCommands(String help) {
this.help = help;
}
}
@SuppressWarnings("ResultOfMethodCallIgnored")
private static boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch(NumberFormatException e) {
return false;
} catch(NullPointerException e) {
return false;
}
// only got here if we didn't return false
return true;
}
}