diff --git a/src/main/scala/resonantinduction/core/ArgumentData.java b/src/main/scala/resonantinduction/core/ArgumentData.java index 653532e35..95c5aa065 100644 --- a/src/main/scala/resonantinduction/core/ArgumentData.java +++ b/src/main/scala/resonantinduction/core/ArgumentData.java @@ -4,77 +4,74 @@ import net.minecraft.nbt.NBTTagCompound; import resonant.lib.utility.nbt.ISaveObj; import resonant.lib.utility.nbt.NBTUtility; -/** - * Used to store arguments in a way that can be easier to read, limit, and understand +/** Used to store arguments in a way that can be easier to loaded, saved, and limited without knowing + * what the data contains. * - * @author DarkGuardsman - */ + * @author DarkGuardsman */ public class ArgumentData implements ISaveObj { - protected String name; - protected Object currentValue; - protected final Object defaultValue; + protected String name; + protected Object currentValue; + protected final Object defaultValue; - public ArgumentData(String name, Object defaultValue) - { - this.name = name; - this.defaultValue = defaultValue; - this.currentValue = defaultValue; - } + public ArgumentData(String name, Object defaultValue) + { + this.name = name; + this.defaultValue = defaultValue; + this.currentValue = defaultValue; + } - /** - * Sets the value - * - * @return true if the value was accepted - */ - public boolean setData(Object object) - { - if (this.isValid(object)) - { - this.currentValue = object; - return true; - } - return false; - } + /** Sets the value + * + * @return true if the value was accepted */ + public boolean setData(Object object) + { + if (this.isValid(object)) + { + this.currentValue = object; + return true; + } + return false; + } - /** Gets the value of the stored data */ - public Object getData() - { - return this.currentValue; - } + /** Gets the value of the stored data */ + public Object getData() + { + return this.currentValue; + } - public String getName() - { - return this.name; - } + public String getName() + { + return this.name; + } - public boolean isValid(Object object) - { - return object != null; - } + public boolean isValid(Object object) + { + return object != null; + } - /** Is this argument valid. */ - public boolean isValid() - { - return true; - } + /** Is this argument valid. */ + public boolean isValid() + { + return true; + } - /** Used by things like a gui to give a warning such as limits of data this can accept */ - public String warning() - { - return ""; - } + /** Used by things like a gui to give a warning such as limits of data this can accept */ + public String warning() + { + return ""; + } - @Override - public void save(NBTTagCompound nbt) - { - NBTUtility.saveObject(nbt, "ObjectData", this.currentValue); - } + @Override + public void save(NBTTagCompound nbt) + { + NBTUtility.saveObject(nbt, "ObjectData", this.currentValue); + } - @Override - public void load(NBTTagCompound nbt) - { - this.currentValue = NBTUtility.loadObject(nbt, "ObjectData"); + @Override + public void load(NBTTagCompound nbt) + { + this.currentValue = NBTUtility.loadObject(nbt, "ObjectData"); - } + } } diff --git a/src/main/scala/resonantinduction/core/CommandMachine.java b/src/main/scala/resonantinduction/core/CommandMachine.java new file mode 100644 index 000000000..e15b9122b --- /dev/null +++ b/src/main/scala/resonantinduction/core/CommandMachine.java @@ -0,0 +1,156 @@ +package resonantinduction.core; + +import java.util.HashMap; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatMessageComponent; +import net.minecraftforge.common.ForgeDirection; +import resonantinduction.core.interfaces.ICmdMachine; +import universalelectricity.api.CompatibilityModule; +import universalelectricity.api.vector.VectorWorld; + +/** Command that allows interaction with machines using chat commands + * + * @author Darkguardsman */ +public class CommandMachine extends CommandBase +{ + public static HashMap selection = new HashMap(); + + @Override + public String getCommandName() + { + return "machine"; + } + + @Override + public String getCommandUsage(ICommandSender user) + { + return "/machine ?"; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) + { + if (args != null && args.length > 0 && args[0] != null) + { + if (args[0].equalsIgnoreCase("?")) + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("/machine ")); + sender.sendChatToPlayer(ChatMessageComponent.createFromText("Each machine has unique commands")); + } + else if (sender instanceof EntityPlayer) + { + if (args.length > 1 && args[1] != null) + { + final String command = args[1]; + final boolean c = args.length > 2 && args[2] != null; + final boolean c2 = args.length > 3 && args[3] != null; + final boolean c3 = args.length > 3 && args[3] != null; + final String subCommand = c ? args[2] : null; + final String subCommand2 = c2 ? args[3] : null; + final String subCommand3 = c3 ? args[4] : null; + + if (selection.containsKey(((EntityPlayer) sender).username) && selection.get(((EntityPlayer) sender).username) != null) + { + VectorWorld pos = selection.get(((EntityPlayer) sender).username); + TileEntity tile = pos.getTileEntity(); + if (tile instanceof ICmdMachine) + { + if (((ICmdMachine) tile).canTakeCommand(sender, args)) + { + ((ICmdMachine) tile).processCommand(sender, args); + } + else + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("Machine refuses the command")); + } + } + else if (CompatibilityModule.isHandler(tile)) + { + if (command.equalsIgnoreCase("energy")) + { + if (!c) + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("/Machine energy set ")); + sender.sendChatToPlayer(ChatMessageComponent.createFromText("/Machine energy get ")); + } + else if (c2) + { + ForgeDirection direction = getDirection(subCommand3); + if (subCommand2.equalsIgnoreCase("get")) + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("Energy: " + CompatibilityModule.getEnergy(tile, direction) + "/" + CompatibilityModule.getMaxEnergy(tile, direction))); + } + else if (subCommand2.equalsIgnoreCase("set")) + { + + } + } + } + } + else + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("Invalid machine selected!")); + selection.remove(((EntityPlayer) sender).username); + } + } + else + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("Please supply some arguments")); + } + } + else + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("Please select the machine first")); + } + } + else + { + sender.sendChatToPlayer(ChatMessageComponent.createFromText("Console access not supported")); + } + } + } + + public ForgeDirection getDirection(String str) + { + if (str != null && !str.isEmpty()) + { + //Get side from work input + if (str.equalsIgnoreCase("north") || str.equalsIgnoreCase("n")) + { + return ForgeDirection.NORTH; + } + else if (str.equalsIgnoreCase("south") || str.equalsIgnoreCase("s")) + { + return ForgeDirection.SOUTH; + } + else if (str.equalsIgnoreCase("east") || str.equalsIgnoreCase("e")) + { + return ForgeDirection.EAST; + } + else if (str.equalsIgnoreCase("west") || str.equalsIgnoreCase("w")) + { + return ForgeDirection.WEST; + } + else if (str.equalsIgnoreCase("up") || str.equalsIgnoreCase("u")) + { + return ForgeDirection.UP; + } + else if (str.equalsIgnoreCase("down") || str.equalsIgnoreCase("d")) + { + return ForgeDirection.DOWN; + } + + //Get side from number input + int side = Integer.getInteger(str, -3); + if (side >= 0 && side < 6) + { + return ForgeDirection.getOrientation(side); + } + } + return null; + } +} diff --git a/src/main/scala/resonantinduction/core/interfaces/ICmdMachine.java b/src/main/scala/resonantinduction/core/interfaces/ICmdMachine.java new file mode 100644 index 000000000..364851116 --- /dev/null +++ b/src/main/scala/resonantinduction/core/interfaces/ICmdMachine.java @@ -0,0 +1,15 @@ +package resonantinduction.core.interfaces; + +import net.minecraft.command.ICommandSender; + +/** Used by machines that can be control by chat commands. Mainly for dev debug of the machine. + * + * @author robert */ +public interface ICmdMachine +{ + /** Pre-check too see if this machine can even process the command */ + public boolean canTakeCommand(ICommandSender sender, String[] args); + + /** Processing of the command */ + public void processCommand(ICommandSender sender, String[] args); +}