diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 8939e5f5..658a87f6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.base.BlockInteger; import WayofTime.bloodmagic.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.teleport.PortalLocation; import WayofTime.bloodmagic.teleport.TeleportQueue; -import WayofTime.bloodmagic.block.base.BlockInteger; -import WayofTime.bloodmagic.ritual.portal.LocationsHandler; -import WayofTime.bloodmagic.ritual.portal.Teleports; +import WayofTime.bloodmagic.teleport.Teleports; import WayofTime.bloodmagic.tile.TileDimensionalPortal; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 22fb0307..24978953 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.command.sub.SubCommandTeleposer; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; import WayofTime.bloodmagic.util.Constants; @@ -48,8 +49,10 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, @Override public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileTeleposer tileTeleposer = (TileTeleposer) world.getTileEntity(blockPos); - if (tileTeleposer != null) + if (tileTeleposer != null) { tileTeleposer.dropItems(); + SubCommandTeleposer.teleposerSet.remove(tileTeleposer); + } super.breakBlock(world, blockPos, blockState); } diff --git a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java index 81eb9063..5c143101 100644 --- a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java @@ -1,18 +1,19 @@ package WayofTime.bloodmagic.command; -import WayofTime.bloodmagic.command.sub.SubCommandBind; -import WayofTime.bloodmagic.command.sub.SubCommandNetwork; -import WayofTime.bloodmagic.command.sub.SubCommandOrb; -import WayofTime.bloodmagic.util.helper.TextHelper; +import WayofTime.bloodmagic.command.sub.*; import net.minecraft.command.ICommandSender; -import net.minecraft.util.text.TextComponentString; import net.minecraftforge.server.command.CommandTreeBase; +import net.minecraftforge.server.command.CommandTreeHelp; public class CommandBloodMagic extends CommandTreeBase { + public CommandBloodMagic() { addSubcommand(new SubCommandBind()); addSubcommand(new SubCommandNetwork()); addSubcommand(new SubCommandOrb()); + addSubcommand(new SubCommandRitual()); + addSubcommand(new SubCommandTeleposer()); + addSubcommand(new CommandTreeHelp(this)); } @Override @@ -30,15 +31,4 @@ public class CommandBloodMagic extends CommandTreeBase { return 2; } - public static void displayHelpString(ICommandSender commandSender, String display, Object... info) { - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } - - public static void displayErrorString(ICommandSender commandSender, String display, Object... info) { - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } - - public static void displaySuccessString(ICommandSender commandSender, String display, Object... info) { - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index f229ad5b..2d99578a 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -3,17 +3,26 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.helper.BindableHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; 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.item.ItemStack; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentTranslation; +import net.minecraftforge.server.command.CommandTreeBase; +import net.minecraftforge.server.command.CommandTreeHelp; + +public class SubCommandBind extends CommandTreeBase { + public EntityPlayerMP player; + + public SubCommandBind() { + addSubcommand(new CommandTreeHelp(this)); + } + + public String getInfo() { + return player.getName(); + } -public class SubCommandBind extends CommandBase { @Override public String getName() { return "bind"; @@ -21,7 +30,11 @@ public class SubCommandBind extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.bloodmagic.bind.usage"); + return "commands.bloodmagic.bind.usage"; + } + + public String getHelp() { + return "commands.bloodmagic.bind.help"; } @Override @@ -30,49 +43,49 @@ public class SubCommandBind extends CommandBase { } @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - if (commandSender.getEntityWorld().isRemote) + public void execute(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; - - try { - EntityPlayer player = CommandBase.getCommandSenderAsPlayer(commandSender); - ItemStack held = player.getHeldItemMainhand(); - boolean bind = true; - - if (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) - player = CommandBase.getPlayer(server, commandSender, args[1]); - } else { - player = CommandBase.getPlayer(server, commandSender, args[0]); - } - } - - if (bind) { - Binding binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); - BindableHelper.applyBinding(held, binding); - commandSender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.success")); - } else { - Binding binding = ((IBindable) held.getItem()).getBinding(held); - if (binding != null) { - held.getTagCompound().removeTag("binding"); - commandSender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.remove.success")); - } - } - } - } catch (PlayerNotFoundException e) { - commandSender.sendMessage(new TextComponentTranslation(TextHelper.localizeEffect("commands.bloodmagic.error.404"))); } + if (sender.getEntityWorld().isRemote) + return; + EntityPlayerMP player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + ItemStack held = player.getHeldItemMainhand(); + boolean bind = true; + if (held.getItem() instanceof IBindable) { + Binding binding = ((IBindable) held.getItem()).getBinding(held); + if (binding != null) + bind = false; + if (args.length < 2) + if (args.length == 1) + if (isBoolean(args[0])) + bind = Boolean.parseBoolean(args[0]); + else + player = getPlayer(server, sender, args[0]); + if (bind) { + if (binding.getOwnerName().equals(player.getName())) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.error.ownerEqualsTarget")); + return; + } + binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); + BindableHelper.applyBinding(held, binding); + this.player = player; + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.success", getInfo())); + } else { + if (binding == null) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.error.notBound")); + } + held.getTagCompound().removeTag("binding"); + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.remove.success")); + } + } else + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.error.notBindable")); + + } private boolean isBoolean(String string) { return string.equalsIgnoreCase("true") || string.equalsIgnoreCase("false"); } -} +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 12db2d7f..a96cef8a 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -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 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())); + } + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java index cdba93a2..816c828b 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -1,22 +1,25 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.core.registry.OrbRegistry; +import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.command.CommandBloodMagic; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; 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; +public class SubCommandOrb extends CommandTreeBase { + public SubCommandOrb() { + addSubcommand(new Get()); + addSubcommand(new Set()); + addSubcommand(new CommandTreeHelp(this)); + } -public class SubCommandOrb extends CommandBase { @Override public String getName() { return "orb"; @@ -24,7 +27,7 @@ public class SubCommandOrb extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.bloodmagic.orb.usage"); + return "commands.bloodmagic.orb.usage"; } @Override @@ -32,76 +35,93 @@ public class SubCommandOrb extends CommandBase { return 2; } - @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - if (args.length > 0) { + abstract class OrbCommand extends CommandTreeBase { - if (args[0].equalsIgnoreCase("help")) + public EntityPlayerMP player; + public String uuid; + public SoulNetwork network; + public Object info; + + @Override + public String getUsage(ICommandSender sender) { + return "commands.bloodmagic.orb." + getName() + ".usage"; + } + + public String getHelp() { + return "commands.bloodmagic.orb." + getName() + ".help"; + } + + public String getInfo() { + return ""; + } + + @Override + public void execute(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; - - try { - String givenName = commandSender.getName(); - - if (args.length > 1) - givenName = args[1]; - - EntityPlayer player = CommandBase.getPlayer(server, commandSender, givenName); - String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); - SoulNetwork network = NetworkHelper.getSoulNetwork(uuid); - - boolean displayHelp = args.length > 0 && args.length < 2; - - try { - switch (ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH))) { - case SET: { - if (displayHelp) { - CommandBloodMagic.displayHelpString(commandSender, ValidCommands.SET.help); - break; - } - - if (args.length == 3) { - if (Utils.isInteger(args[2])) { - int amount = Integer.parseInt(args[2]); - network.setOrbTier(amount); - CommandBloodMagic.displaySuccessString(commandSender, "commands.bloodmagic.success"); - } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.invalid"); - } - } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.missing"); - } - - break; - } - case GET: { - if (displayHelp) { - CommandBloodMagic.displayHelpString(commandSender, ValidCommands.GET.help); - break; - } - - if (args.length > 1) - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect("message.orb.currenttier", network.getOrbTier()))); - - break; - } - } - } catch (IllegalArgumentException e) { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.404"); - } - } catch (PlayerNotFoundException e) { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.404"); } + player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); + network = NetworkHelper.getSoulNetwork(uuid); + + subExecute(server, sender, args); + } + + protected abstract void subExecute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException; + } + + class Get extends OrbCommand { + + @Override + public String getName() { + return "get"; + } + + @Override + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + super.execute(server, sender, args); + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.orb.currenttier", network.getOrbTier())); } } - private enum ValidCommands { - SET("commands.bloodmagic.orb.set.help"), - GET("commands.bloodmagic.orb.get.help"); + class Set extends OrbCommand { + //TODO: check whether maxTier check works with custom Blood Orbs + int maxTier = OrbRegistry.getTierMap().size() - 1; - public String help; + @Override + public String getInfo() { + return "" + maxTier; + } - ValidCommands(String help) { - this.help = help; + @Override + public String getName() { + return "set"; + } + + @Override + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + super.execute(server, sender, args); + + int targetTier; + if (args.length == 1 && Utils.isInteger(args[0])) + targetTier = Integer.parseInt(args[0]); + else if (args.length == 2 && Utils.isInteger(args[1])) + targetTier = Integer.parseInt(args[1]); + else { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + return; + } + if (targetTier < 0) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.negative")); + return; + } else if (targetTier > maxTier) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.orb.error.tierTooHigh", getInfo())); + return; + } + network.setOrbTier(targetTier); + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); } } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java new file mode 100644 index 00000000..b527ed5f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java @@ -0,0 +1,144 @@ +package WayofTime.bloodmagic.command.sub; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.tile.TileMasterRitualStone; +import WayofTime.bloodmagic.util.helper.RitualHelper; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraftforge.server.command.CommandTreeBase; +import net.minecraftforge.server.command.CommandTreeHelp; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +public class SubCommandRitual extends CommandTreeBase { + public SubCommandRitual() { + addSubcommand(new RitualCreate()); + addSubcommand(new RitualRepair()); + addSubcommand(new CommandTreeHelp(this)); + } + + @Override + public String getName() { + return "ritual"; + } + + @Override + public String getUsage(ICommandSender sender) { + return null; + } + + public TileMasterRitualStone getMRS(ICommandSender sender) { + BlockPos pos = sender.getPosition().down(); + World world = sender.getEntityWorld(); + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof TileMasterRitualStone) { + return (TileMasterRitualStone) tile; + } + return null; + } + + class RitualCreate extends CommandTreeBase { + public List ritualList = new ArrayList<>(); + public RitualCreate() { + for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { + ritualList.add(BloodMagic.RITUAL_MANAGER.getId(ritual)); + } + } + + @Override + public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) { + return ritualList; + } + + @Override + public String getName() { + return "create"; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException { + if (args.length == 0) { + sender.sendMessage(new TextComponentTranslation("commands.blooodmagic.ritual.create.noRitual")); + return; + } else if (args.length == 2 && (args[1].equals("help") || args[1].equals("?"))) { + sender.sendMessage(new TextComponentTranslation(BloodMagic.RITUAL_MANAGER.getRitual(args[0]).getUnlocalizedName() + ".info")); + return; + } + EntityPlayerMP player = args.length < 3 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[1]); + boolean safe = false; + if (args.length > 1 && args.length < 4) { + int k = args.length - 1; + if (args[k].equals("true") || args[k].equals("false")) { + safe = Boolean.parseBoolean(args[k]); + } else if (args[1].equals("safe")) + safe = true; + else + player = getPlayer(server, sender, args[1]); + } + + BlockPos pos = player.getPosition().down(); + World world = player.getEntityWorld(); + EnumFacing direction = player.getHorizontalFacing(); + + if (RitualHelper.createRitual(world, pos, direction, BloodMagic.RITUAL_MANAGER.getRitual(args[0]), safe)) + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + else if (!safe) + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); + else + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritaul.create.error.unsafe")); + + } + + @Override + public String getUsage(ICommandSender sender) { + return "commands.bloodmagic.ritual.create.help"; + } + } + + class RitualRepair extends CommandTreeBase { + + @Override + public String getName() { + return "repair"; + } + + @Override + public String getUsage(ICommandSender sender) { + return "commands.bloodmagic.ritual.repair.usage"; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException { + EntityPlayerMP player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + TileMasterRitualStone tile = getMRS(player); + boolean safe = false; + if (args.length > 0 && args.length < 3) { + int k = args.length - 1; + if (args[k].equals("true") || args[k].equals("false")) { + safe = Boolean.parseBoolean(args[k]); + } else if (args[0].equals("safe")) + safe = true; + } + if (tile != null) + if (RitualHelper.repairRitualFromRuins(tile, safe)) + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + else if (!safe) + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); + else + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritaul.create.error.unsafe")); + else + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.error.noMRS")); + } + + } +} diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java new file mode 100644 index 00000000..8f74b045 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java @@ -0,0 +1,329 @@ +package WayofTime.bloodmagic.command.sub; + +import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.item.ItemTelepositionFocus; +import WayofTime.bloodmagic.teleport.Teleports; +import WayofTime.bloodmagic.tile.TileTeleposer; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraftforge.server.command.CommandTreeBase; +import net.minecraftforge.server.command.CommandTreeHelp; + +import java.util.HashSet; +import java.util.Set; + +public class SubCommandTeleposer extends CommandTreeBase { + public static final Set teleposerSet = new HashSet<>(); //contains "valid" teleposers (teleposers with focus), teleposers check themselves every 100 ticks. + public static TileTeleposer[] teleposerArray; + + public SubCommandTeleposer() { + addSubcommand(new OutputTeleposerList()); + addSubcommand(new TeleportToTeleposer()); + addSubcommand(new TeleportToTeleposerFocus()); + addSubcommand(new RemoveTeleposer()); + addSubcommand(new RecursiveRemoveTeleposer()); + addSubcommand(new RemoveAllOfPlayer()); + addSubcommand(new CommandTreeHelp(this)); + } + + @Override + public int getRequiredPermissionLevel() { + return 2; + } + + + @Override + public String getName() { + return "teleposer"; + } + + @Override + public String getUsage(ICommandSender sender) { + return "commands.bloodmagic.teleposer.usage"; + } + + abstract class TeleposeHelper extends CommandTreeBase { + public EntityPlayer player; + + @Override + public String getUsage(ICommandSender sender) { + return "commands.bloodmagic.teleposer." + getName() + ".usage"; + } + + public String getHelp() { + return "commands.bloodmagic.teleposer." + getName() + ".help"; + } + + public String getInfo() { + return ""; + } + + @Override + public int getRequiredPermissionLevel() { + return 2; + } + + public TileTeleposer[] cleanUpAndCreateArrayFromTeleposerList(EntityPlayer player) { + if (player == null) + for (TileTeleposer i : teleposerSet) { + if (i == null || i.isInvalid() || i.isEmpty()) { + teleposerSet.remove(i); + } + } + else { + for (TileTeleposer i : teleposerSet) { + if (i == null || i.isInvalid() || i.isEmpty()) { + teleposerSet.remove(i); + continue; + } + ItemStack stack = i.getStackInSlot(0); + ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); + Binding binding = focus.getBinding(stack); + if (binding != null && !binding.getOwnerName().equals(player.getName())) { + teleposerSet.remove(i); + } + } + } + teleposerArray = teleposerSet.toArray(new TileTeleposer[0]); + return teleposerArray; + + } + + public void sendOwnedTeleposerList(ICommandSender sender, EntityPlayer player) { + teleposerArray = cleanUpAndCreateArrayFromTeleposerList(player); + for (int i = 0; i < teleposerArray.length; i++) { + ItemStack stack = teleposerArray[i].getStackInSlot(0); + ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); + Binding binding = focus.getBinding(stack); + if (binding != null) { + String name = binding.getOwnerName(); + if (player != null) { + if (name.equals(player.getName())) + sender.sendMessage(new TextComponentString(i + new TextComponentTranslation("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.owner").getFormattedText() + " " + name)); + } else + sender.sendMessage(new TextComponentString(i + new TextComponentTranslation("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.owner").getFormattedText() + " " + name)); + } + } + } + + public Integer getIDFromArgs(ICommandSender sender, String[] args) { + int teleposerID; + if (args.length == 0) { + return null; + } + + if (Utils.isInteger(args[0])) + teleposerID = Integer.parseInt(args[0]); + else if (args.length > 1 && Utils.isInteger(args[1])) + teleposerID = Integer.parseInt(args[1]); + else { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + return null; + } + if (teleposerID < 0) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.negative")); + return null; + } + return teleposerID; + } + + @Override + public final void execute(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; + } + if (!(getName().equals("rmrf") || getName().equals("remove"))) { + this.player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + } + subExecute(server, sender, args); + } + + protected abstract void subExecute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException; + } + + class OutputTeleposerList extends TeleposeHelper { + + @Override + public String getName() { + return "list"; + } + + @Override + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + sendOwnedTeleposerList(sender, player); + } + } + + class TeleportToTeleposer extends TeleposeHelper { + + @Override + public String getName() { + return "teleport"; + } + + @Override + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + Integer teleposerID = getIDFromArgs(sender, args); + if (teleposerID == null) + sendOwnedTeleposerList(sender, null); + else if (!sender.getEntityWorld().isRemote) { + if (teleposerID > teleposerArray.length) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.outofbounds")); + return; + } + TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! + BlockPos brunhildePos = brunhilde.getPos(); + World brunhildeWorld = brunhilde.getWorld(); + if (player.getEntityWorld().equals(brunhildeWorld)) + new Teleports.TeleportSameDim(brunhildePos, player, player.getUniqueID(), false).teleport(); + else + new Teleports.TeleportToDim(brunhildePos, player, player.getUniqueID(), player.getEntityWorld(), brunhildeWorld.provider.getDimension(), false).teleport(); + } else + return; + + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + } + } + + class TeleportToTeleposerFocus extends TeleposeHelper { + + @Override + public String getName() { + return "teleportfocus"; + } + + @Override + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + Integer teleposerID = getIDFromArgs(sender, args); + if (teleposerID == null) + sendOwnedTeleposerList(sender, null); + else if (!sender.getEntityWorld().isRemote) { + if (teleposerID > teleposerArray.length) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.outofbounds")); + return; + } + TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! + ItemStack stack = brunhilde.getStackInSlot(0); + ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); + BlockPos brunhildeFocusPos = focus.getBlockPos(stack); + World brunhildeFocusWorld = focus.getWorld(stack); + if (player.getEntityWorld().equals(brunhildeFocusWorld)) + new Teleports.TeleportSameDim(brunhildeFocusPos, player, player.getUniqueID(), false).teleport(); + else + new Teleports.TeleportToDim(brunhildeFocusPos, player, player.getUniqueID(), player.getEntityWorld(), brunhildeFocusWorld.provider.getDimension(), false).teleport(); + } else + return; + + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + } + } + + class RemoveTeleposer extends TeleposeHelper { + + @Override + public String getName() { + return "remove"; + } + + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + Integer teleposerID = getIDFromArgs(sender, args); + if (teleposerID == null) + sendOwnedTeleposerList(sender, null); + else if (!sender.getEntityWorld().isRemote) { + if (teleposerID > teleposerArray.length) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.outofbounds")); + return; + } + TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! + BlockPos brunhildePos = brunhilde.getPos(); + World brunhildeWorld = brunhilde.getWorld(); + brunhildeWorld.setBlockToAir(brunhildePos); + cleanUpAndCreateArrayFromTeleposerList(null); + } else + return; + + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + } + } + + class RecursiveRemoveTeleposer extends TeleposeHelper { + + @Override + public String getName() { + return "rmrf"; + } + + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + Integer teleposerID = getIDFromArgs(sender, args); + if (teleposerID == null) + sendOwnedTeleposerList(sender, null); + else if (!sender.getEntityWorld().isRemote) { + if (teleposerID > teleposerArray.length) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.outofbounds")); + return; + } + TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! + do { + BlockPos brunhildePos = brunhilde.getPos(); + World brunhildeWorld = brunhilde.getWorld(); + ItemStack stack = brunhilde.getStackInSlot(0); + ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); + BlockPos brunhildeFocusPos = focus.getBlockPos(stack); + World brunhildeFocusWorld = focus.getWorld(stack); + brunhilde.setInventorySlotContents(0, ItemStack.EMPTY); + brunhildeWorld.setBlockToAir(brunhildePos); + TileEntity testTile = brunhildeFocusWorld.getTileEntity(brunhildeFocusPos); + if (!(testTile instanceof TileTeleposer) || ((TileTeleposer) testTile).getStackInSlot(0).isEmpty()) + break; + for (TileTeleposer i : teleposerArray) { + if (i.getPos().equals(brunhildeFocusPos)) { + brunhilde = i; + break; + } + + } + } while (true); + cleanUpAndCreateArrayFromTeleposerList(null); + } else + return; + + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + } + + } + + class RemoveAllOfPlayer extends TeleposeHelper { + + @Override + public String getName() { + return "removeall"; + } + + public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + cleanUpAndCreateArrayFromTeleposerList(player); + + if (!sender.getEntityWorld().isRemote) { + for (TileTeleposer i : teleposerArray) { + i.setInventorySlotContents(0, ItemStack.EMPTY); + i.getWorld().setBlockToAir(i.getPos()); + } + + } + cleanUpAndCreateArrayFromTeleposerList(null); + + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index ebca00db..5a9ea8f0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -3,10 +3,10 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.ISigil; import WayofTime.bloodmagic.teleport.TeleportQueue; +import WayofTime.bloodmagic.teleport.Teleports; +import WayofTime.bloodmagic.tile.TileTeleposer; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.ritual.portal.Teleports; -import WayofTime.bloodmagic.tile.TileTeleposer; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java rename to src/main/java/WayofTime/bloodmagic/teleport/Teleports.java index 43e738dc..646480f3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java @@ -1,9 +1,8 @@ -package WayofTime.bloodmagic.ritual.portal; +package WayofTime.bloodmagic.teleport; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.event.TeleposeEvent; -import WayofTime.bloodmagic.teleport.Teleport; import WayofTime.bloodmagic.util.helper.NetworkHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; @@ -148,7 +147,7 @@ public class Teleports { network.syphon(ticket(oldWorld, player, getTeleportCost())); - /* begin brandon3055 "BrandonsCore" intedimensional teleportation code */ + /* begin brandon3055 "BrandonsCore" interdimensional teleportation code */ PlayerList playerList = server.getPlayerList(); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 8aaf092f..d3c7caf3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -1,12 +1,13 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.block.BlockTeleposer; +import WayofTime.bloodmagic.command.sub.SubCommandTeleposer; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.event.TeleposeEvent; import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.ritual.portal.Teleports; import WayofTime.bloodmagic.teleport.TeleportQueue; +import WayofTime.bloodmagic.teleport.Teleports; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.NetworkHelper; @@ -56,6 +57,17 @@ public class TileTeleposer extends TileInventory implements ITickable { } previousInput = currentInput; + + if (world.getTotalWorldTime() % 100 == 0) { + ItemStack focusStack = getStackInSlot(0); + if (!focusStack.isEmpty()) { + if (((ItemTelepositionFocus) focusStack.getItem()).getBinding(focusStack) != null) + SubCommandTeleposer.teleposerSet.add(this); + else + SubCommandTeleposer.teleposerSet.remove(this); + } else + SubCommandTeleposer.teleposerSet.remove(this); + } } } @@ -66,14 +78,14 @@ public class TileTeleposer extends TileInventory implements ITickable { Binding binding = focus.getBinding(focusStack); if (binding == null) return; - BlockPos focusPos = focus.getBlockPos(getStackInSlot(0)); - World focusWorld = focus.getWorld(getStackInSlot(0)); + BlockPos focusPos = focus.getBlockPos(focusStack); + World focusWorld = focus.getWorld(focusStack); if (focusWorld == null) return; TileEntity boundTile = focusWorld.getTileEntity(focusPos); if (boundTile instanceof TileTeleposer && boundTile != this) { - final int focusLevel = (getStackInSlot(0).getItemDamage() + 1); + final int focusLevel = (focusStack.getItemDamage() + 1); final int lpToBeDrained = (int) (0.5F * Math.sqrt((pos.getX() - focusPos.getX()) * (pos.getX() - focusPos.getX()) + (pos.getY() - focusPos.getY() + 1) * (pos.getY() - focusPos.getY() + 1) + (pos.getZ() - focusPos.getZ()) * (pos.getZ() - focusPos.getZ()))); if (NetworkHelper.syphonFromContainer(focusStack, SoulTicket.block(world, pos, lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1)))) { diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java index eedf6f7c..b9da4f00 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java @@ -1,10 +1,12 @@ package WayofTime.bloodmagic.util.helper; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.ritual.IRitualStone; import WayofTime.bloodmagic.ritual.Ritual; import WayofTime.bloodmagic.ritual.RitualComponent; +import WayofTime.bloodmagic.tile.TileMasterRitualStone; import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -14,6 +16,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; +import org.apache.commons.lang3.tuple.Pair; import java.util.List; @@ -96,10 +99,8 @@ public class RitualHelper { return true; else if (tile instanceof IRitualStone.Tile) return true; - else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) - return true; + else return tile != null && tile.hasCapability(RUNE_CAPABILITY, null); - return false; } public static void setRuneType(World world, BlockPos pos, EnumRuneType type) { @@ -117,4 +118,94 @@ public class RitualHelper { world.notifyBlockUpdate(pos, state, state, 3); } } + + public static boolean createRitual(World world, BlockPos pos, EnumFacing direction, Ritual ritual, boolean safe) { + + List components = Lists.newArrayList(); + ritual.gatherComponents(components::add); + + if (abortConstruction(world, pos, direction, safe, components)) return false; + + IBlockState mrs = RegistrarBloodMagicBlocks.RITUAL_CONTROLLER.getDefaultState(); + world.setBlockState(pos, mrs); + + setRitualStones(direction, world, pos, components); + return true; + } + + public static boolean abortConstruction(World world, BlockPos pos, EnumFacing direction, boolean safe, List components) { + //TODO: can be optimized to check only for the first and last component if every ritual has those at the highest and lowest y-level respectivly. + for (RitualComponent component : components) { + BlockPos offset = component.getOffset(direction); + BlockPos newPos = pos.add(offset); + if (world.isOutsideBuildHeight(newPos) || (safe && !world.isAirBlock(newPos))) + return true; + } + return false; + } + + public static boolean repairRitualFromRuins(TileMasterRitualStone tile, boolean safe) { + Ritual ritual = tile.getCurrentRitual(); + EnumFacing direction; + Pair pair; + if (ritual == null) { + pair = getRitualFromRuins(tile); + ritual = pair.getKey(); + direction = pair.getValue(); + } else + direction = tile.getDirection(); + + World world = tile.getWorld(); + BlockPos pos = tile.getPos(); + + List components = Lists.newArrayList(); + ritual.gatherComponents(components::add); + + if (abortConstruction(world, pos, direction, safe, components)) return false; + + setRitualStones(direction, world, pos, components); + return true; + } + + public static void setRitualStones(EnumFacing direction, World world, BlockPos pos, List gatheredComponents) { + for (RitualComponent component : gatheredComponents) { + BlockPos offset = component.getOffset(direction); + BlockPos newPos = pos.add(offset); + int meta = component.getRuneType().ordinal(); + IBlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); + world.setBlockState(newPos, newState); + } + } + + + public static Pair getRitualFromRuins(TileMasterRitualStone tile) { + BlockPos pos = tile.getPos(); + World world = tile.getWorld(); + Ritual possibleRitual = tile.getCurrentRitual(); + EnumFacing possibleDirection = tile.getDirection(); + int highestCount = 0; + + if (possibleRitual == null || possibleDirection == null) + for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { + for (EnumFacing direction : EnumFacing.HORIZONTALS) { + List components = Lists.newArrayList(); + ritual.gatherComponents(components::add); + int currentCount = 0; + + for (RitualComponent component : components) { + BlockPos newPos = pos.add(component.getOffset(direction)); + if (isRuneType(world, newPos, component.getRuneType())) + currentCount += 1; + } + if (currentCount > highestCount) { + highestCount = currentCount; + possibleRitual = ritual; + possibleDirection = direction; + } + + } + + } + return Pair.of(possibleRitual, possibleDirection); + } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 83614e9a..82c23c2e 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -817,9 +817,8 @@ entity.bloodmagic.Mimic.name=Mimic commands.bloodmagic.error.arg.invalid=Invalid arguments commands.bloodmagic.error.arg.missing=Not enough arguments commands.bloodmagic.error.arg.player.missing=You must specify which player you wish to perform this action on. -commands.bloodmagic.error.404=Command not found! -commands.bloodmagic.error.unknown=Unknown command! -commands.bloodmagic.error.perm=You do not have permission to use this command. +commands.bloodmagic.error.negative=Amount must be a positive Integer. +commands.bloodmagic.error.outofbounds=Given integer is too large (must be within list ID boundaries). commands.bloodmagic.success=Executed successfully @@ -833,42 +832,67 @@ commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] commands.bloodmagic.network.help=LP network utilities commands.bloodmagic.network.syphon.help=Removes the given amount of LP from the given player's LP network. commands.bloodmagic.network.syphon.success=Successfully syphoned %d LP from %s. +commands.bloodmagic.network.syphon.usage=/bloodmagic network syphon [player] [amount] +commands.bloodmagic.network.syphon.amountTooHigh=Cannot syphon more LP than available. commands.bloodmagic.network.add.help=Adds the given amount of LP to the given player's LP network. Follows standard LP gain rules. +commands.bloodmagic.network.add.usage=/bloodmagic network add [player] [amount] commands.bloodmagic.network.add.success=Successfully added %d LP to %s's LP network. commands.bloodmagic.network.set.help=Sets the given player's LP to the given amount. +commands.bloodmagic.network.set.usage=/bloodmagic network set [player] [amount] commands.bloodmagic.network.set.success=Successfully set %s's LP network to %d LP. commands.bloodmagic.network.get.help=Returns the amount of LP in the given player's LP network. +commands.bloodmagic.network.get.usage=/bloodmagic network get [player] commands.bloodmagic.network.fill.help=Fills the given player's LP network to %d. +commands.bloodmagic.network.fill.usage=/bloodmagic network fill [player] commands.bloodmagic.network.fill.success=Successfully filled %s's LP network. commands.bloodmagic.network.cap.help=Fills the given player's LP network to the max that their highest Blood Orb can store. +commands.bloodmagic.network.cap.usage=/bloodmagic network cap [player] commands.bloodmagic.network.cap.success=Successfully capped off %s's LP network. -commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [player] + +commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [player] ("?" or "help" for help) commands.bloodmagic.bind.help=Attempts to (un)bind the currently held item. -commands.bloodmagic.bind.success=Binding successful +commands.bloodmagic.bind.success=Successfully bound to %d. commands.bloodmagic.bind.remove.success=Unbinding successful +commands.bloodmagic.bind.error.ownerEqualsTarget=Nothing changed: Target and current owner are equal. +commands.bloodmagic.bind.error.notBound=Cannot unbind: Item not bound. +commands.bloodmagic.bind.error.notBindable=Cannot bind: Item not bindable. -commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] player [tier] +commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] player [tier] ("?" or "help" for help) commands.bloodmagic.orb.help=Used to set or get the Player's max Blood Orb tier. +commands.bloodmagic.orb.get.help=Used to get the Player's max Blood Orb tier. +commands.bloodmagic.orb.get.usage=/bloodmagic orb get [player|?|help] +commands.bloodmagic.orb.set.help=Used to set the Player's max Blood Orb tier. +commands.bloodmagic.orb.set.usage=/bloodmagic orb set [player|?|help] +commands.bloodmagic.orb.currenttier=Current Orb tier is %d. +commands.bloodmagic.orb.error.tierTooHigh=Orb tier cannot be higher than %d. -commands.bloodmagic.bind.failed.noPlayer=There is no player specified -commands.bloodmagic.bind.failed.alreadyBound=Item is already bound; use /unbind to unbind it -commands.bloodmagic.bind.failed.notBindable=Item cannot be bound -commands.bloodmagic.unbind.usage=/unbind -commands.bloodmagic.unbind.success=Item successfully unbound! -commands.bloodmagic.unbind.failed.notBindable=Item cannot be unbound -commands.bloodmagic.soulnetwork.usage=/soulnetwork [amount] -commands.bloodmagic.soulnetwork.add.success=Successfully added %dLP to %s's Soul Network! -commands.bloodmagic.soulnetwork.subtract.success=Successfully subtracted %dLP from %s's Soul Network! -commands.bloodmagic.soulnetwork.fill.success=Successfully filled %s's Soul Network! -commands.bloodmagic.soulnetwork.empty.success=Successfully emptied %s's Soul Network! -commands.bloodmagic.soulnetwork.get.success=There is %dLP in %s's Soul Network! -commands.bloodmagic.soulnetwork.noPlayer=There is no player specified -commands.bloodmagic.soulnetwork.noCommand=There is no command specified -commands.bloodmagic.soulnetwork.notACommand=That is not a valid command -commands.bloodmagic.soulnetwork.fillMax.success=Successfully filled %s's Soul Network to their orb max! -commands.bloodmagic.soulnetwork.create.success=Successfully created %s's Soul Network (Orb tier: %d) +commands.bloodmagic.ritual.create.help=Creates the specified ritual with the MRS at your feet, ignores other blocks by default. (Optional parameters: ([ (safe|true|false)] | [safe|true|false])) +commands.bloodmagic.ritual.repair.help=Repairs the ritual with the closest match to the remaining ritual stones, ignores other blocks by default. (Optional parameters: ([ (safe|true|false)] | [safe|true|false])) +commands.bloodmagic.ritual.create.noRitual=You must select a ritual. (Tab-completions are available!) +commands.bloodmagic.ritaul.create.error.unsafe=Created or repaired ritual cannot be placed safely. +commands.bloodmagic.ritual.create.error.outOfWorldBoundaries=Created or repaired ritual would be out of world boundaries. +commands.bloodmagic.ritual.error.noMRS=You need to stand on a Master Ritual Stone to execute the command! + +commands.bloodmagic.teleposer.usage=Teleposer Utilities ("?" or "help" for help) +commands.bloodmagic.teleposer.list.help=Returns a list of all valid teleposers, optionally possessed by [player]. +commands.bloodmagic.teleposer.list.usage=/bloodmagic teleposer list [player|?|help] +commands.bloodmagic.teleposer.teleport.help=Teleports to the location of the specified teleposer. +commands.bloodmagic.teleposer.teleport.usage=/bloodmagic teleposer teleport [ID|?|help] +commands.bloodmagic.teleposer.teleportfocus.help=Teleports to the location stored in the specified teleposer's focus. +commands.bloodmagic.teleposer.teleportfocus.usage=/bloodmagic teleposer teleportfocus [ID|?|help] +commands.bloodmagic.teleposer.rmrf.help=Follows teleposer foci and removes all teleposers along the path, starting with the specified teleposer. +commands.bloodmagic.teleposer.rmrf.usage=/bloodmagic teleposer rmrf [ID|?|help] +commands.bloodmagic.teleposer.remove.help=Removes the specified teleposer. +commands.bloodmagic.teleposer.remove.usage=/bloodmagic teleposer remove [ID|?|help] +commands.bloodmagic.teleposer.removeall.help=Removes all teleposers or all teleposers containing a focus bound to [player], if specified. +commands.bloodmagic.teleposer.removeall.usage=/bloodmagic teleposer removeall [player|?|help] + +#Used by commands.bloodmagic.teleposer.list for the dump sent to the player +commands.bloodmagic.teleposer.anddimension=: Teleposer: DimID: +commands.bloodmagic.teleposer.focusanddim=Focus: DimID: +commands.bloodmagic.teleposer.owner=Owner: # GUI