Command rework ()

* 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

@ -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;

View file

@ -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);
}

View file

@ -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)));
}
}

View file

@ -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");
}
}
}

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()));
}
}
}

View file

@ -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"));
}
}
}

View file

@ -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<String> ritualList = new ArrayList<>();
public RitualCreate() {
for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) {
ritualList.add(BloodMagic.RITUAL_MANAGER.getId(ritual));
}
}
@Override
public List<String> 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"));
}
}
}

View file

@ -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<TileTeleposer> 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"));
}
}
}

View file

@ -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;

View file

@ -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();

View file

@ -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)))) {

View file

@ -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<RitualComponent> 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<RitualComponent> 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<Ritual, EnumFacing> 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<RitualComponent> 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<RitualComponent> 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<Ritual, EnumFacing> 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<RitualComponent> 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);
}
}

View file

@ -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 <player> <add|subtract|fill|empty|get> [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: ([<player> (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: ([<player> (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