Command rework (#1434)

* Network part finished.

* Should be more reasonable now

* This should be good enough.

* Orb finished, needs strings

* Bind finished. Needs strings.

* Reformat & Help subcommand

* Cleanup, strings, no negative amounts

* Removed TODOs

* Added missing MaxTier check for Blood Orbs.
Added TODO: Test with custom Blood Orbs.

* Ritual commands finished.
Check for valid placement might be optimized. (TODO)

* Access modifiers, moved TODO

* Added TODOs for localized strings

* DrainUtils postponed until the necessary functionality is available with SoulTickets (telling SoulTicket network from soul ticket, a list of all registered soul tickets per network)

* Replaced all occurrences of TextHelper with TextComponentTranslation in the commands section

* - Moved Teleports.java to teleport package
- added teleposer command
- added missing strings
- cleanup

* Fixed spelling of "Successful(ly)"

* getUsage() now returns translation keys.
getInfo() is now an explicit String

ritual creation command now has proper tab completions

help is an additional argument with "-h" or "?"

cleanup

* teleposerSet final
cleanup.

* Removed ritual removal command

Signed-off-by: tobias <angryaeon@icloud.com>

* Check if the tile has a ritual first

Signed-off-by: tobias <angryaeon@icloud.com>

* A bit more optimisation

Signed-off-by: tobias <angryaeon@icloud.com>

* Cleanup part 1

Signed-off-by: tobias <angryaeon@icloud.com>

* Cleanup part 2

Signed-off-by: tobias <angryaeon@icloud.com>

* Part 3

Signed-off-by: tobias <angryaeon@icloud.com>

* Part 4

Signed-off-by: tobias <angryaeon@icloud.com>

* Updated language file to reflect cleanup & continuity changes.

Signed-off-by: tobias <angryaeon@icloud.com>

* Change to use an abstract class that gets called instead of calling super on overriden execute() for commands

Signed-off-by: tobias <angryaeon@icloud.com>

* Use player facing for ritual creation.

Signed-off-by: tobias <angryaeon@icloud.com>
This commit is contained in:
Tobias Gremeyer 2019-02-01 01:46:02 +01:00 committed by Nick Ignoffo
parent 2a8e1f1271
commit 95d99c0a01
13 changed files with 990 additions and 323 deletions

View file

@ -2,21 +2,33 @@ package WayofTime.bloodmagic.command.sub;
import WayofTime.bloodmagic.core.data.SoulNetwork;
import WayofTime.bloodmagic.core.data.SoulTicket;
import WayofTime.bloodmagic.util.helper.NetworkHelper;
import WayofTime.bloodmagic.command.CommandBloodMagic;
import WayofTime.bloodmagic.util.Utils;
import WayofTime.bloodmagic.util.helper.TextHelper;
import net.minecraft.command.CommandBase;
import WayofTime.bloodmagic.util.helper.NetworkHelper;
import WayofTime.bloodmagic.util.helper.PlayerHelper;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.PlayerNotFoundException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.server.command.CommandTreeBase;
import net.minecraftforge.server.command.CommandTreeHelp;
import java.util.Locale;
import java.util.List;
public class SubCommandNetwork extends CommandTreeBase {
public SubCommandNetwork() {
addSubcommand(new Syphon());
addSubcommand(new Add());
addSubcommand(new Set());
addSubcommand(new Get());
addSubcommand(new Cap());
addSubcommand(new Fill());
addSubcommand(new Tickets());
addSubcommand(new CommandTreeHelp(this));
}
public class SubCommandNetwork extends CommandBase {
@Override
public String getName() {
return "network";
@ -24,160 +36,190 @@ public class SubCommandNetwork extends CommandBase {
@Override
public String getUsage(ICommandSender commandSender) {
return TextHelper.localizeEffect("commands.bloodmagic.network.usage");
return "commands.bloodmagic.network.usage";
}
@Override
public int getRequiredPermissionLevel() {
return 2;
return 0;
}
@Override
public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException {
if (args.length > 1) {
if (args[0].equalsIgnoreCase("help"))
abstract class NetworkCommand extends CommandTreeBase {
public EntityPlayerMP player;
public SoulNetwork network;
public String uuid;
public Integer commandHelperAmount(MinecraftServer server, ICommandSender sender, String[] args) {
int amount;
if (args.length == 0)
amount = 1000;
else if (Utils.isInteger(args[0]))
amount = Integer.parseInt(args[0]);
else if (args.length > 1 && Utils.isInteger(args[1]))
amount = Integer.parseInt(args[1]);
else {
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.arg.invalid"));
sender.sendMessage(new TextComponentTranslation(this.getUsage(sender)));
return null;
}
if (amount < 0) {
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.negative"));
return null;
}
return amount;
}
@Override
public String getUsage(ICommandSender sender) {
return "commands.bloodmagic.network." + getName() + ".usage";
}
public String getHelp() {
return "commands.bloodmagic.network." + getName() + ".help";
}
public String getInfo() {
return "";
}
@Override
public final void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
if (!getName().equals("get")) {
if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) {
sender.sendMessage(new TextComponentTranslation(getHelp()));
return;
}
this.player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]);
this.uuid = PlayerHelper.getUUIDFromPlayer(player).toString();
this.network = NetworkHelper.getSoulNetwork(uuid);
}
subExecute(server, sender, args);
}
protected abstract void subExecute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException;
}
class Syphon extends NetworkCommand {
@Override
public String getName() {
return "syphon";
}
@Override
public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
Integer amount = commandHelperAmount(server, sender, args);
if (amount == null)
return;
try {
EntityPlayer player = CommandBase.getPlayer(server, commandSender, args[1]);
try {
ValidCommands command = ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH));
command.run(player, commandSender, args.length > 0 && args.length < 2, args);
} catch (IllegalArgumentException e) {
}
} catch (PlayerNotFoundException e) {
CommandBloodMagic.displayErrorString(commandSender, e.getLocalizedMessage());
int currE = network.getCurrentEssence();
if (amount > currE) {
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.syphon.amountTooHigh"));
if (currE == 0)
return;
amount = Math.min(amount, currE);
}
} else {
CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.missing");
network.syphonAndDamage(player, SoulTicket.command(sender, this.getName(), amount));
int newE = network.getCurrentEssence();
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.syphon.success", currE - newE, player.getDisplayName().getFormattedText()));
}
}
private enum ValidCommands {
SYPHON("commands.bloodmagic.network.syphon.help") {
@Override
public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) {
if (displayHelp) {
CommandBloodMagic.displayHelpString(sender, this.help);
return;
}
if (args.length == 3) {
if (Utils.isInteger(args[2])) {
int amount = Integer.parseInt(args[2]);
NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.command(sender, "syphon", amount));
CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.syphon.success", amount, player.getDisplayName().getFormattedText());
} else {
CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid");
}
} else {
CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing");
}
}
},
ADD("commands.bloodmagic.network.add.help") {
@Override
public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) {
if (displayHelp) {
CommandBloodMagic.displayHelpString(sender, this.help);
return;
}
SoulNetwork network = NetworkHelper.getSoulNetwork(player);
if (args.length == 3) {
if (Utils.isInteger(args[2])) {
int amount = Integer.parseInt(args[2]);
int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier());
CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.add.success", network.add(SoulTicket.command(sender, "add", amount), maxOrb), player.getDisplayName().getFormattedText());
} else {
CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid");
}
} else {
CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing");
}
}
},
SET("commands.bloodmagic.network.set.help") {
@Override
public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) {
if (displayHelp) {
CommandBloodMagic.displayHelpString(sender, this.help);
return;
}
SoulNetwork network = NetworkHelper.getSoulNetwork(player);
if (args.length == 3) {
if (Utils.isInteger(args[2])) {
int amount = Integer.parseInt(args[2]);
network.setCurrentEssence(amount);
CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.set.success", player.getDisplayName().getFormattedText(), amount);
} else {
CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid");
}
} else {
CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing");
}
}
},
GET("commands.bloodmagic.network.get.help") {
@Override
public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) {
if (displayHelp) {
CommandBloodMagic.displayHelpString(sender, this.help);
return;
}
SoulNetwork network = NetworkHelper.getSoulNetwork(player);
if (args.length > 1)
sender.sendMessage(new TextComponentString(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence())));
}
},
FILL("commands.bloodmagic.network.fill.help") {
@Override
public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) {
if (displayHelp) {
CommandBloodMagic.displayHelpString(sender, this.help, Integer.MAX_VALUE);
return;
}
SoulNetwork network = NetworkHelper.getSoulNetwork(player);
if (args.length > 1) {
network.setCurrentEssence(Integer.MAX_VALUE);
CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.fill.success", player.getDisplayName().getFormattedText());
}
}
},
CAP("commands.bloodmagic.network.cap.help") {
@Override
public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) {
if (displayHelp) {
CommandBloodMagic.displayHelpString(sender, this.help);
return;
}
SoulNetwork network = NetworkHelper.getSoulNetwork(player);
if (args.length > 1) {
int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier());
network.setCurrentEssence(maxOrb);
CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.cap.success", player.getDisplayName().getFormattedText());
}
}
},;
public String help;
ValidCommands(String help) {
this.help = help;
class Add extends NetworkCommand {
@Override
public String getName() {
return "add";
}
public abstract void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args);
@Override
public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
Integer amount = commandHelperAmount(server, sender, args);
if (amount == null)
return;
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.add.success", network.add(SoulTicket.command(sender, getName(), amount), NetworkHelper.getMaximumForTier(network.getOrbTier())), player.getDisplayName().getFormattedText()));
}
}
}
class Set extends NetworkCommand {
@Override
public String getName() {
return "set";
}
@Override
public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
Integer amount = commandHelperAmount(server, sender, args);
if (amount == null)
return;
network.setCurrentEssence(amount);
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.set.success", player.getDisplayName().getFormattedText(), amount));
}
}
class Get extends NetworkCommand {
@Override
public String getName() {
return "get";
}
@Override
public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) {
sender.sendMessage(new TextComponentTranslation(getHelp()));
return;
}
this.player = args.length < 1 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]);
sender.sendMessage(new TextComponentString((player != sender ? player.getDisplayName().getFormattedText() + " " : "" + new TextComponentTranslation("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()).getFormattedText())));
}
}
class Cap extends NetworkCommand {
@Override
public String getName() {
return "cap";
}
@Override
public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
network.setCurrentEssence(NetworkHelper.getMaximumForTier(network.getOrbTier()));
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.cap.success", player.getDisplayName().getFormattedText()));
}
}
class Fill extends NetworkCommand {
@Override
public String getInfo() {
return "" + Integer.MAX_VALUE;
}
@Override
public String getName() {
return "fill";
}
@Override
public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
network.setCurrentEssence(Integer.MAX_VALUE);
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.fill.success", player.getDisplayName().getFormattedText()));
}
}
class Tickets extends NetworkCommand {
@Override
public String getName() {
return "tickethistory";
}
@Override
public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
List<SoulTicket> tickethistory = network.getTicketHistory();
if (tickethistory.isEmpty())
for (SoulTicket i : network.getTicketHistory())
sender.sendMessage(i.getDescription());
sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success", player.getDisplayName().getFormattedText()));
}
}
}