More command stuff, ugh command stuff...

This commit is contained in:
pahimar 2015-02-05 23:06:53 -05:00
parent 5c8c98b46d
commit 15fded2a64
12 changed files with 161 additions and 296 deletions

View file

@ -2,9 +2,6 @@ package com.pahimar.ee3;
import com.pahimar.ee3.array.AlchemyArrayRegistry;
import com.pahimar.ee3.command.CommandEE;
import com.pahimar.ee3.command.CommandSetCurrentItemValue;
import com.pahimar.ee3.command.CommandSetValue;
import com.pahimar.ee3.command.CommandSyncValues;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import com.pahimar.ee3.handler.*;
import com.pahimar.ee3.init.*;
@ -59,9 +56,6 @@ public class EquivalentExchange3
TransmutationKnowledgeRegistry.getInstance();
event.registerServerCommand(new CommandEE());
event.registerServerCommand(new CommandSetValue());
event.registerServerCommand(new CommandSetCurrentItemValue());
event.registerServerCommand(new CommandSyncValues());
}
@EventHandler

View file

@ -2,6 +2,8 @@ package com.pahimar.ee3.api;
import com.google.gson.*;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.IChatComponent;
import java.lang.reflect.Type;
@ -100,6 +102,11 @@ public final class EnergyValue implements Comparable<EnergyValue>, JsonDeseriali
}
}
public IChatComponent getChatComponent()
{
return new ChatComponentText("" + this.getEnergyValue());
}
public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound)
{
nbtTagCompound.setFloat("energyValue", energyValue);

View file

@ -63,6 +63,8 @@ public class CommandEE extends CommandBase
static
{
modCommands.add(new CommandSetEnergyValue());
modCommands.add(new CommandSyncEnergyValues());
modCommands.add(new CommandPlayerLearnEverything());
modCommands.add(new CommandPlayerLearnItem());
modCommands.add(new CommandPlayerForgetEverything());

View file

@ -1,5 +1,6 @@
package com.pahimar.ee3.command;
import com.pahimar.ee3.knowledge.AbilityRegistry;
import com.pahimar.ee3.knowledge.TransmutationKnowledgeRegistry;
import com.pahimar.ee3.reference.Messages;
import com.pahimar.ee3.reference.Names;
@ -82,8 +83,11 @@ public class CommandPlayerLearnItem extends CommandBase
}
}
TransmutationKnowledgeRegistry.getInstance().teachPlayer(entityPlayer, itemStack);
func_152373_a(commandSender, this, Messages.Commands.PLAYER_LEARN_ITEM_SUCCESS, new Object[]{commandSender.getCommandSenderName(), entityPlayer.getCommandSenderName(), itemStack.func_151000_E()});
if (AbilityRegistry.getInstance().isLearnable(itemStack))
{
TransmutationKnowledgeRegistry.getInstance().teachPlayer(entityPlayer, itemStack);
func_152373_a(commandSender, this, Messages.Commands.PLAYER_LEARN_ITEM_SUCCESS, new Object[]{commandSender.getCommandSenderName(), entityPlayer.getCommandSenderName(), itemStack.func_151000_E()});
}
}
else
{

View file

@ -1,94 +0,0 @@
package com.pahimar.ee3.command;
import com.pahimar.ee3.api.EnergyValue;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import com.pahimar.ee3.exchange.WrappedStack;
import com.pahimar.ee3.network.PacketHandler;
import com.pahimar.ee3.network.message.MessageSetEnergyValue;
import com.pahimar.ee3.reference.Files;
import com.pahimar.ee3.util.LogHelper;
import com.pahimar.ee3.util.SerializationHelper;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import java.util.List;
import java.util.Map;
public class CommandSetCurrentItemValue extends CommandBase
{
@Override
public String getCommandName()
{
return "ee3-set-current-item-value";
}
@Override
public String getCommandUsage(ICommandSender commandSender)
{
return "command.ee3.set-current-item-value.usage";
}
@Override
public void processCommand(ICommandSender commandSender, String[] args)
{
if (args.length < 2)
{
throw new WrongUsageException("command.ee3.set-current-item-value.usage");
}
else
{
ItemStack itemStack = ((EntityPlayer) commandSender).getCurrentEquippedItem().copy();
double energyValue = 0;
if (args.length >= 2)
{
energyValue = parseDoubleWithMin(commandSender, args[1], 0);
}
if (itemStack != null && Double.compare(energyValue, 0) > 0)
{
WrappedStack wrappedStack = new WrappedStack(itemStack);
EnergyValue newEnergyValue = new EnergyValue(energyValue);
if (args[0].equalsIgnoreCase("pre"))
{
Map<WrappedStack, EnergyValue> preAssignedValues = SerializationHelper.readEnergyValueStackMapFromJsonFile(Files.PRE_ASSIGNED_ENERGY_VALUES);
preAssignedValues.put(wrappedStack, newEnergyValue);
SerializationHelper.writeEnergyValueStackMapToJsonFile(Files.PRE_ASSIGNED_ENERGY_VALUES, preAssignedValues);
EnergyValueRegistry.getInstance().setShouldRegenNextRestart(true);
}
else if (args[0].equalsIgnoreCase("post"))
{
EnergyValueRegistry.getInstance().setEnergyValue(wrappedStack, newEnergyValue);
Map<WrappedStack, EnergyValue> postAssignedValues = SerializationHelper.readEnergyValueStackMapFromJsonFile(Files.POST_ASSIGNED_ENERGY_VALUES);
postAssignedValues.put(wrappedStack, newEnergyValue);
SerializationHelper.writeEnergyValueStackMapToJsonFile(Files.POST_ASSIGNED_ENERGY_VALUES, postAssignedValues);
PacketHandler.INSTANCE.sendToAll(new MessageSetEnergyValue(wrappedStack, newEnergyValue));
}
// Notify admins and log the value change
func_152373_a(commandSender, this, "command.ee3.set-current-item-value.success", new Object[]{commandSender.getCommandSenderName(), args[0], wrappedStack.toString(), newEnergyValue.toString()});
LogHelper.info(String.format("%s set the EnergyValue of %s to %s", commandSender.getCommandSenderName(), wrappedStack, newEnergyValue));
}
else
{
throw new WrongUsageException("command.ee3.set-current-item-value.usage");
}
}
}
@Override
public List addTabCompletionOptions(ICommandSender commandSender, String[] args)
{
if (args.length == 1)
{
return getListOfStringsMatchingLastWord(args, "pre", "post");
}
return null;
}
}

View file

@ -7,6 +7,7 @@ import com.pahimar.ee3.network.PacketHandler;
import com.pahimar.ee3.network.message.MessageSetEnergyValue;
import com.pahimar.ee3.reference.Files;
import com.pahimar.ee3.reference.Messages;
import com.pahimar.ee3.reference.Names;
import com.pahimar.ee3.util.LogHelper;
import com.pahimar.ee3.util.SerializationHelper;
import net.minecraft.command.CommandBase;
@ -21,47 +22,57 @@ import net.minecraft.nbt.NBTTagCompound;
import java.util.List;
import java.util.Map;
public class CommandSetValue extends CommandBase
public class CommandSetEnergyValue extends CommandBase
{
@Override
public String getCommandName()
{
return "ee3-set-value";
return Names.Commands.SET_ENERGY_VALUE;
}
@Override
public int getRequiredPermissionLevel()
{
return 2;
}
@Override
public String getCommandUsage(ICommandSender commandSender)
{
return "command.ee3.set-value.usage";
return Messages.Commands.SET_ENERGY_VALUE_USAGE;
}
@Override
public void processCommand(ICommandSender commandSender, String[] args)
{
if (args.length < 3)
for (int i = 0; i < args.length; i++)
{
throw new WrongUsageException("command.ee3.set-value.usage");
LogHelper.info(String.format("args[%s]: %s", i, args[i]));
}
if (args.length < 4)
{
throw new WrongUsageException(Messages.Commands.SET_ENERGY_VALUE_USAGE);
}
else
{
Item item = getItemByText(commandSender, args[1]);
Item item = getItemByText(commandSender, args[2]);
double energyValue = 0;
int metaData = 0;
if (args.length >= 3)
if (args.length >= 4)
{
energyValue = parseDoubleWithMin(commandSender, args[2], 0);
energyValue = parseDoubleWithMin(commandSender, args[3], 0);
}
else if (args.length >= 4)
else if (args.length >= 5)
{
metaData = parseInt(commandSender, args[3]);
metaData = parseInt(commandSender, args[4]);
}
ItemStack itemStack = new ItemStack(item, 1, metaData);
if (args.length >= 5)
if (args.length >= 6)
{
String stringNBTData = func_147178_a(commandSender, args, 4).getUnformattedText();
String stringNBTData = func_147178_a(commandSender, args, 5).getUnformattedText();
try
{
@ -104,12 +115,11 @@ public class CommandSetValue extends CommandBase
}
// Notify admins and log the value change
func_152373_a(commandSender, this, "command.ee3.set-value.success", new Object[]{commandSender.getCommandSenderName(), args[0], wrappedStack.toString(), newEnergyValue.toString()});
LogHelper.info(String.format("%s set the EnergyValue of %s to %s", commandSender.getCommandSenderName(), wrappedStack, newEnergyValue));
func_152373_a(commandSender, this, Messages.Commands.SET_ENERGY_VALUE_SUCCESS, new Object[]{commandSender.getCommandSenderName(), args[1], itemStack.func_151000_E(), newEnergyValue.getChatComponent()});
}
else
{
throw new WrongUsageException("command.ee3.set-value.usage");
throw new WrongUsageException(Messages.Commands.SET_ENERGY_VALUE_USAGE);
}
}
}
@ -117,11 +127,11 @@ public class CommandSetValue extends CommandBase
@Override
public List addTabCompletionOptions(ICommandSender commandSender, String[] args)
{
if (args.length == 1)
if (args.length == 2)
{
return getListOfStringsMatchingLastWord(args, "pre", "post");
}
else if (args.length == 2)
else if (args.length == 3)
{
return getListOfStringsFromIterableMatchingLastWord(args, Item.itemRegistry.getKeys());
}

View file

@ -0,0 +1,79 @@
package com.pahimar.ee3.command;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import com.pahimar.ee3.network.PacketHandler;
import com.pahimar.ee3.network.message.MessageSyncEnergyValues;
import com.pahimar.ee3.reference.Messages;
import com.pahimar.ee3.reference.Names;
import com.pahimar.ee3.reference.Settings;
import com.pahimar.ee3.util.LogHelper;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ChatComponentTranslation;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class CommandSyncEnergyValues extends CommandBase
{
private static Map<UUID, Long> requesterMap = new HashMap<UUID, Long>();
@Override
public String getCommandName()
{
return Names.Commands.SYNC_ENERGY_VALUES;
}
@Override
public int getRequiredPermissionLevel()
{
return 4;
}
@Override
public String getCommandUsage(ICommandSender commandSender)
{
return Messages.Commands.SYNC_ENERGY_VALUES_USAGE;
}
@Override
public void processCommand(ICommandSender commandSender, String[] args)
{
boolean shouldSync = true;
float coolDown = 0f;
UUID commandSenderUUID = ((EntityPlayer) commandSender).getUniqueID();
if (requesterMap.containsKey(commandSenderUUID))
{
long timeDifference = System.currentTimeMillis() - requesterMap.get(commandSenderUUID).longValue();
if (timeDifference >= (Settings.General.syncThreshold * 1000))
{
requesterMap.remove(commandSenderUUID);
}
else
{
coolDown = (Settings.General.syncThreshold * 1000) - timeDifference;
shouldSync = false;
}
}
else
{
requesterMap.put(commandSenderUUID, System.currentTimeMillis());
}
if (shouldSync)
{
LogHelper.info(String.format("Syncing energy values with player '%s' at their request", commandSender.getCommandSenderName()));
PacketHandler.INSTANCE.sendTo(new MessageSyncEnergyValues(EnergyValueRegistry.getInstance()), (EntityPlayerMP) commandSender);
commandSender.addChatMessage(new ChatComponentTranslation(Messages.Commands.SYNC_ENERGY_VALUES_SUCCESS));
}
else
{
throw new WrongUsageException(Messages.Commands.SYNC_ENERGY_VALUES_DENIED, new Object[]{coolDown / 1000f});
}
}
}

View file

@ -1,122 +0,0 @@
package com.pahimar.ee3.command;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import com.pahimar.ee3.network.PacketHandler;
import com.pahimar.ee3.network.message.MessageSyncEnergyValues;
import com.pahimar.ee3.reference.Settings;
import com.pahimar.ee3.util.LogHelper;
import com.pahimar.ee3.util.PlayerHelper;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ChatComponentTranslation;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class CommandSyncValues extends CommandBase
{
private static Map<UUID, Long> requesterMap = new HashMap<UUID, Long>();
@Override
public String getCommandName()
{
return "ee3-sync-values";
}
@Override
public boolean canCommandSenderUseCommand(ICommandSender commandSender)
{
return true;
}
@Override
public String getCommandUsage(ICommandSender commandSender)
{
return "command.ee3.sync-values.usage";
}
@Override
public void processCommand(ICommandSender commandSender, String[] args)
{
if (args.length == 1)
{
if (args[0].equalsIgnoreCase("self"))
{
boolean shouldSync = true;
float coolDown = 0f;
if (!PlayerHelper.isPlayerOp(((EntityPlayer) commandSender)))
{
UUID commandSenderUUID = ((EntityPlayer) commandSender).getUniqueID();
if (requesterMap.containsKey(commandSenderUUID))
{
long timeDifference = System.currentTimeMillis() - requesterMap.get(commandSenderUUID).longValue();
if (timeDifference >= (Settings.General.syncThreshold * 1000))
{
requesterMap.remove(commandSenderUUID);
}
else
{
coolDown = (Settings.General.syncThreshold * 1000) - timeDifference;
shouldSync = false;
}
}
else
{
requesterMap.put(commandSenderUUID, System.currentTimeMillis());
}
}
if (shouldSync)
{
LogHelper.info(String.format("Syncing EnergyValues with player '%s' at their request", commandSender.getCommandSenderName()));
PacketHandler.INSTANCE.sendTo(new MessageSyncEnergyValues(EnergyValueRegistry.getInstance()), (EntityPlayerMP) commandSender);
commandSender.addChatMessage(new ChatComponentTranslation("command.ee3.sync-values.self.success"));
}
else
{
throw new WrongUsageException("command.ee3.sync-values.self.denied", new Object[]{coolDown / 1000f});
}
}
else if (args[0].equalsIgnoreCase("all"))
{
if (PlayerHelper.isPlayerOp((EntityPlayer) commandSender))
{
LogHelper.info(String.format("Syncing EnergyValues with all players at %s's request", commandSender.getCommandSenderName()));
PacketHandler.INSTANCE.sendToAll(new MessageSyncEnergyValues(EnergyValueRegistry.getInstance()));
func_152373_a(commandSender, this, "command.ee3.sync-values.all.success", new Object[]{commandSender.getCommandSenderName()});
}
else
{
throw new WrongUsageException("command.ee3.sync-values.all.denied");
}
}
else
{
throw new WrongUsageException("command.ee3.sync-values.usage");
}
}
else
{
throw new WrongUsageException("command.ee3.sync-values.usage");
}
}
@Override
@SuppressWarnings("rawtypes")
public List addTabCompletionOptions(ICommandSender commandSender, String[] args)
{
if (args.length == 1)
{
return getListOfStringsMatchingLastWord(args, "self", "all");
}
return null;
}
}

View file

@ -1,5 +1,6 @@
package com.pahimar.ee3.command;
import com.pahimar.ee3.knowledge.AbilityRegistry;
import com.pahimar.ee3.knowledge.TransmutationKnowledgeRegistry;
import com.pahimar.ee3.reference.Messages;
import com.pahimar.ee3.reference.Names;
@ -76,8 +77,11 @@ public class CommandTemplateLearnItem extends CommandBase
}
}
TransmutationKnowledgeRegistry.getInstance().teachTemplate(itemStack);
func_152373_a(commandSender, this, Messages.Commands.TEMPLATE_LEARN_ITEM_SUCCESS, new Object[]{commandSender.getCommandSenderName(), itemStack.func_151000_E()});
if (AbilityRegistry.getInstance().isLearnable(itemStack))
{
TransmutationKnowledgeRegistry.getInstance().teachTemplate(itemStack);
func_152373_a(commandSender, this, Messages.Commands.TEMPLATE_LEARN_ITEM_SUCCESS, new Object[]{commandSender.getCommandSenderName(), itemStack.func_151000_E()});
}
}
}

View file

@ -11,13 +11,20 @@ public final class Messages
public static final class Commands
{
private static final String COMMAND_PREFIX = "command.ee3.";
private static final String COMMAND_PREFIX = "commands.ee3.";
public static final String BASE_COMMAND_USAGE = COMMAND_PREFIX + "usage";
public static final String PLAYER_NOT_FOUND_ERROR = COMMAND_PREFIX + "player-not-found.error";
public static final String INVALID_NBT_TAG_ERROR = COMMAND_PREFIX + "invalid-nbt-tag.error";
public static final String SET_ENERGY_VALUE_USAGE = COMMAND_PREFIX + Names.Commands.SET_ENERGY_VALUE + ".usage";
public static final String SET_ENERGY_VALUE_SUCCESS = COMMAND_PREFIX + Names.Commands.SET_ENERGY_VALUE + ".success";
public static final String SYNC_ENERGY_VALUES_USAGE = COMMAND_PREFIX + Names.Commands.SYNC_ENERGY_VALUES + ".usage";
public static final String SYNC_ENERGY_VALUES_SUCCESS = COMMAND_PREFIX + Names.Commands.SYNC_ENERGY_VALUES + ".success";
public static final String SYNC_ENERGY_VALUES_DENIED = COMMAND_PREFIX + Names.Commands.SYNC_ENERGY_VALUES + ".denied";
public static final String PLAYER_LEARN_EVERYTHING_USAGE = COMMAND_PREFIX + Names.Commands.PLAYER_LEARN_EVERYTHING + ".usage";
public static final String PLAYER_LEARN_EVERYTHING_SUCCESS = COMMAND_PREFIX + Names.Commands.PLAYER_LEARN_EVERYTHING + ".success";

View file

@ -122,6 +122,8 @@ public class Names
public static final class Commands
{
public static final String BASE_COMMAND = Reference.LOWERCASE_MOD_ID;
public static final String SET_ENERGY_VALUE = "set-energy-value";
public static final String SYNC_ENERGY_VALUES = "sync-energy-values";
public static final String PLAYER_LEARN_EVERYTHING = "player-learn-everything";
public static final String PLAYER_LEARN_ITEM = "player-learn-item";
public static final String PLAYER_FORGET_EVERYTHING = "player-forget-everything";

View file

@ -105,59 +105,31 @@ gui.nei.ee3:calcination.tooltip.1=Energy values needed to calcine
gui.nei.ee3:calcination.tooltip.2=From %s to %s
gui.nei.ee3:aludel=Aludel
# Glyphs
glyph.ee3:baseCircle=Circle (Base)
glyph.ee3:circle=Circle
glyph.ee3:diamond=Diamond
glyph.ee3:dot=Dot
glyph.ee3:heptagon=Heptagon
glyph.ee3:hexagon=Hexagon
glyph.ee3:invertedTriangle=Triangle (Inverted)
glyph.ee3:line=Line
glyph.ee3:octagon=Octagon
glyph.ee3:pentagon=Pentagon
glyph.ee3:square=Square
glyph.ee3:triangle=Triangle
# Commands
command.ee3.usage=/ee3 <set-value|sync-values>
command.ee3.player-not-found.error=Player with name %s was not found on the server
command.ee3.invalid-nbt-tag.error=Data tag parsing failed: %s
command.ee3.set-value.usage=/ee3-set-value <pre|post> <item> <value> [data] [dataTag]
command.ee3.set-value.success=%s set a %s EnergyValue of %s to %s
command.ee3.set-current-item-value.usage=/ee3-set-current-item-value <pre|post> <value>
command.ee3.set-current-item-value.success=%s set a %s EnergyValue of %s to %s
command.ee3.sync-values.usage=/ee3-sync-values <self|all>
command.ee3.sync-values.self.success=Successfully synchronized EnergyValues with the server
command.ee3.sync-values.self.denied=Please wait %s more seconds and try again
command.ee3.sync-values.all.success=%s synchronized all EnergyValues with all players on the server
command.ee3.sync-values.all.denied=Only ops can use this command
command.ee3.player-learn-everything.usage=/ee3 player-learn-everything <playername>
command.ee3.player-learn-everything.success=%s taught %s how to transmute everything
command.ee3.player-learn-item.usage=/ee3 player-learn-item <playername> <item> <data> [dataTag]
command.ee3.player-learn-item.success=%s taught %s how to transmute %s
command.ee3.player-forget-everything.usage=/ee3 player-forget-everything <playername>
command.ee3.player-forget-everything.success=%s made %s forget how to transmute everything
command.ee3.player-forget-item.usage=/ee3 player-forget-item <playername> <item> <data> [dataTag]
command.ee3.player-forget-item.success=%s made %s forget how to transmute %s
command.ee3.template-learn-everything.usage=/ee3 template-learn-everything <playername>
command.ee3.template-learn-everything.success=%s taught the knowledge template how to transmute everything
command.ee3.template-learn-item.usage=/ee3 template-learn-item <playername> <item> <data> [dataTag]
command.ee3.template-learn-item.success=%s taught the knowledge template how to transmute %s
command.ee3.template-forget-everything.usage=/ee3 template-forget-everything <playername>
command.ee3.template-forget-everything.success=%s made the knowledge template forget how to transmute everything
command.ee3.template-forget-item.usage=/ee3 template-forget-item <playername> <item> <data> [dataTag]
command.ee3.template-forget-item.success=%s made the knowledge template forget how to transmute %s
commands.ee3.usage=/ee3
commands.ee3.player-not-found.error=Player with name %s was not found on the server
commands.ee3.invalid-nbt-tag.error=Data tag parsing failed: %s
commands.ee3.set-energy-value.usage=/ee3 set-energy-value <pre> <item> <value> [data] [dataTag] OR /ee3 set-energy-value <post> <item> <value> [data] [dataTag]
commands.ee3.set-energy-value.success=%s set a %s EnergyValue of %s to %s
commands.ee3.sync-energy-values.usage=/ee3 sync-energy-values
commands.ee3.sync-energy-values.success=Successfully synchronized energy values with the server
commands.ee3.sync-energy-values.denied=Please wait %s more seconds and try again
commands.ee3.player-learn-everything.usage=/ee3 player-learn-everything <playername>
commands.ee3.player-learn-everything.success=%s taught %s how to transmute everything
commands.ee3.player-learn-item.usage=/ee3 player-learn-item <playername> <item> <data> [dataTag]
commands.ee3.player-learn-item.success=%s taught %s how to transmute %s
commands.ee3.player-forget-everything.usage=/ee3 player-forget-everything <playername>
commands.ee3.player-forget-everything.success=%s made %s forget how to transmute everything
commands.ee3.player-forget-item.usage=/ee3 player-forget-item <playername> <item> <data> [dataTag]
commands.ee3.player-forget-item.success=%s made %s forget how to transmute %s
commands.ee3.template-learn-everything.usage=/ee3 template-learn-everything <playername>
commands.ee3.template-learn-everything.success=%s taught the knowledge template how to transmute everything
commands.ee3.template-learn-item.usage=/ee3 template-learn-item <playername> <item> <data> [dataTag]
commands.ee3.template-learn-item.success=%s taught the knowledge template how to transmute %s
commands.ee3.template-forget-everything.usage=/ee3 template-forget-everything <playername>
commands.ee3.template-forget-everything.success=%s made the knowledge template forget how to transmute everything
commands.ee3.template-forget-item.usage=/ee3 template-forget-item <playername> <item> <data> [dataTag]
commands.ee3.template-forget-item.success=%s made the knowledge template forget how to transmute %s
# Tooltips
tooltip.ee3:upgradesPrefix=Upgrades (Alchemical) Chests