9 Commits

Author SHA1 Message Date
05440e66a0 Bumps version to 1.0.1 2022-10-26 19:51:33 +02:00
4d740521f3 Fixes tab-completion when editing default messages 2022-10-25 19:45:45 +02:00
b38cfbe710 Improves description of unsetting per-material/enchantment costs 2022-10-25 18:46:12 +02:00
cc7d66f270 Fixes several bugs and problems
Fixes getting the name of enchantments
Fixes inconsistencies in material and enchantment name-checking
Allows using "null" or "-1" to unset per-material or per-enchantment configuration options
Fixes a bug where basePrice was set to a material name instead of the price for the material being displayed
Adds missing tab-completion for material/enchantment costs
Prevents inconsistencies in deciding if a value is null
2022-10-24 13:57:58 +02:00
39e164c9c8 Implements language selection properly
Adds a configuration option for the plugin language
Loads the selected language instead of always loading "en"
Makes sure the language is updated upon reloading
2022-10-21 00:46:01 +02:00
9f433cb0f1 Fixes some bugs regarding displaying the exact time remaining 2022-10-20 12:03:16 +02:00
64004e4267 Fixes some problems in the calculation of the remaining cool-down time 2022-10-18 13:09:38 +02:00
3c677c18cb Makes sure to invalidate sessions properly
Sessions are invalidated if the player leaves the NPC or if 10 seconds pass, but only if the blacksmith isn't currently reforging.
2022-10-18 12:44:35 +02:00
9b1480453b Adds missing descriptions for some new config options 2022-10-18 12:34:01 +02:00
17 changed files with 158 additions and 48 deletions

View File

@ -55,13 +55,15 @@ In addition to just being able to repair items, blacksmiths have some random fea
For /blacksmith and /blacksmithconfig, if a new value isn't specified, the current value is displayed instead.
For /blacksmith, using "" or null as the value will clear a custom value, making the NPC use the default value set in
the config instead. Additionally, every value overridden for an NPC will display a marker (default \[NPC]) when
For /blacksmith, using -1 or null as the value will clear a custom value, making the NPC use the default value set in
the config instead. Additionally, every value overridden for an NPC will display a marker (default: \[NPC]) when
displaying the current value.
Note: basePrice, pricePerDurabilityPoint and enchantmentCost can be set like: `/blacksmithconfig option 4` or
like `/blacksmithconfig option material/enchantment 4` depending on whether you are setting the default or an override
for a specific material/enchantment.
for a specific material/enchantment. For /blacksmithconfig <basePrice/pricePerDurabilityPoint/enchantmentCost> <
material/enchantment>, using -1 or null as the value will clear the cost for the specified material/enchantment, using
the default one instead.
### Presets and filters:
@ -108,6 +110,12 @@ All currently supported presets, and available filters for each preset:
## Configuration options
### Plugin Options
| Key | Value type | Description |
| --- | --- | --- |
| language | string | The language used for this plugin. Only "en" is supported, unless you add a custom language. |
### Global-only options
| Key | Value type | Description |
@ -116,6 +124,7 @@ All currently supported presets, and available filters for each preset:
| pricePerDurabilityPoint | positive decimal number | The price added for each durability point present/missing (depends on whether natural cost is set to true or false). Setting this without specifying a material sets the pricePerDurabilityPoint for any item the pricePerDurabilityPoint has not been set for. |
| enchantmentCost | positive decimal number | The added cost for each level of an enchantment present on the item. The cost can be set for specific enchantments. Not specifying an enchantment sets the value for all enchantments without a set value.
| useNaturalCost | true/false | If true, each missing durability will add to the cost (price = basePrice + missingDurability * pricePerDurabilityPoint + enchantmentCost). If false, durability will be used to calculate the cost instead of missingDurability (this was the behavior before natural cost was added). |
| showExactTime | true/false | If true, blacksmiths will display exact time remaining in minutes and seconds, instead of vague expressions |
### Per-npc (with default values set in config.yml)
@ -133,6 +142,7 @@ All currently supported presets, and available filters for each preset:
| minReforgeDelay | 0-3600 | The minimum number of seconds a player needs to wait for an item to be repaired. |
| reforgeCoolDown | 0-3600 | The cool-down, in seconds, a player has to wait between each time they use one specific blacksmith. |
| reforgeAbleItems | DIAMOND_LEGGINGS,GOLD-pickaxe,bow, etc. | Specifies which items this blacksmith is able to reforge. If set to "" or null, all normally repairable items can be repaired. If set to a list of items, only the items specified can be repaired. Some presets have been included for ease of use. Use a preset by specifying "preset:sword-smith" instead of a material such as "gold-pickaxe". Available presets: SWORD_SMITH, WEAPON_SMITH, ARMOR_SMITH, TOOL_SMITH, RANGED_SMITH. |
| blacksmithTitle | text string | The title displayed as part of the message explaining that a blacksmith doesn't recognize a player's held item |
#### Messages
@ -148,6 +158,7 @@ All currently supported presets, and available filters for each preset:
| itemChangedMessage | The message displayed when a player changes their item after being shown the repair cost |
| startReforgeMessage | The message displayed when a blacksmith starts reforging an item |
| successMessage | The message displayed when a blacksmith successfully repairs an item |
| notDamagedMessage | The message displayed if a player tries to reforge an item with full durability |
## Language customization

View File

@ -6,7 +6,7 @@
<groupId>net.knarcraft</groupId>
<artifactId>blacksmith</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.0.1-SNAPSHOT</version>
<name>Blacksmith</name>
<description>Blacksmith Character for the CitizensAPI</description>

View File

@ -51,6 +51,8 @@ public class BlacksmithPlugin extends JavaPlugin {
*/
public void reload() {
config.load();
this.reloadConfig();
Translator.loadLanguages(this.getConfig().getString("language", "en"));
}
@Override
@ -73,7 +75,7 @@ public class BlacksmithPlugin extends JavaPlugin {
config = new GlobalSettings(this);
config.load();
Translator.loadLanguages("en");
Translator.loadLanguages(fileConfiguration.getString("language", "en"));
//Set up Vault integration
if (!setUpVault()) {

View File

@ -11,7 +11,6 @@ import net.knarcraft.blacksmith.util.InputParsingHelper;
import net.knarcraft.blacksmith.util.TypeValidationHelper;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -81,7 +80,14 @@ public class BlackSmithConfigCommand implements CommandExecutor {
}
//Change the value of the specified setting
return changeValue(args, detectedGlobalSetting, detectedNPCSetting, settings, sender);
if ((detectedGlobalSetting != null &&
TypeValidationHelper.isValid(detectedGlobalSetting.getValueType(), args[1], sender)) ||
(detectedNPCSetting != null &&
TypeValidationHelper.isValid(detectedNPCSetting.getValueType(), args[1], sender))) {
return changeValue(args, detectedGlobalSetting, detectedNPCSetting, settings, sender);
} else {
return false;
}
}
/**
@ -166,7 +172,7 @@ public class BlackSmithConfigCommand implements CommandExecutor {
private boolean displaySpecialCaseValue(String selector, CommandSender sender, GlobalSetting setting,
GlobalSettings settings) {
if (setting == GlobalSetting.BASE_PRICE || setting == GlobalSetting.PRICE_PER_DURABILITY_POINT) {
Material material = Material.matchMaterial(selector);
Material material = InputParsingHelper.matchMaterial(selector);
if (material == null) {
return false;
}
@ -176,16 +182,17 @@ public class BlackSmithConfigCommand implements CommandExecutor {
} else {
currentValue = String.valueOf(settings.getPricePerDurabilityPoint(material));
}
displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(), ItemType.MATERIAL,
material.name(), currentValue));
displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(),
ItemType.MATERIAL, material.name(), currentValue));
return true;
} else if (setting == GlobalSetting.ENCHANTMENT_COST) {
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(selector));
Enchantment enchantment = InputParsingHelper.matchEnchantment(selector);
if (enchantment == null) {
return false;
}
displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(), ItemType.ENCHANTMENT,
enchantment.toString(), String.valueOf(settings.getEnchantmentCost(enchantment))));
displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(),
ItemType.ENCHANTMENT, enchantment.getKey().getKey(),
String.valueOf(settings.getEnchantmentCost(enchantment))));
return true;
} else {
return false;
@ -215,7 +222,9 @@ public class BlackSmithConfigCommand implements CommandExecutor {
*/
private boolean updateSpecialCase(GlobalSettings settings, GlobalSetting detectedGlobalSetting, String[] args,
CommandSender sender) {
if (!TypeValidationHelper.isValid(SettingValueType.POSITIVE_DOUBLE, args[2], sender)) {
if (InputParsingHelper.isEmpty(args[2])) {
args[2] = "-1";
} else if (!TypeValidationHelper.isValid(SettingValueType.POSITIVE_DOUBLE, args[2], sender)) {
return true;
}
double newPrice = Double.parseDouble(args[2]);
@ -242,7 +251,7 @@ public class BlackSmithConfigCommand implements CommandExecutor {
return false;
}
itemType = ItemType.ENCHANTMENT;
itemChanged = enchantment.toString();
itemChanged = enchantment.getKey().getKey();
settings.setEnchantmentCost(enchantment, newPrice);
} else {
return false;

View File

@ -3,6 +3,7 @@ package net.knarcraft.blacksmith.command;
import net.knarcraft.blacksmith.config.GlobalSetting;
import net.knarcraft.blacksmith.config.NPCSetting;
import net.knarcraft.blacksmith.config.SettingValueType;
import net.knarcraft.blacksmith.util.InputParsingHelper;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
@ -28,6 +29,13 @@ public class BlackSmithConfigTabCompleter implements TabCompleter {
return new ArrayList<>();
}
//Arguments: <setting> [new value/material or enchantment] []
//Prevent tab-completion when typing messages with spaces
if (skipCompletionForSpacedMessage(args) != null) {
return new ArrayList<>();
}
if (args.length == 1) {
List<String> availableCommands = new ArrayList<>();
availableCommands.add("reload");
@ -40,10 +48,60 @@ public class BlackSmithConfigTabCompleter implements TabCompleter {
return filterMatchingContains(availableCommands, args[0]);
} else if (args.length == 2) {
return tabCompleteCommandValues(args[0], args[1]);
} else if (args.length == 3) {
//Get per-material tab completions, or return nothing if an invalid setting was specified
for (GlobalSetting globalSetting : GlobalSetting.values()) {
if (globalSetting.getCommandName().equalsIgnoreCase(args[0])) {
return getPerTypeTabCompletions(globalSetting, args);
}
}
return new ArrayList<>();
}
return null;
}
/**
* Checks whether to tab-complete nothing because a message containing spaces is being written
*
* @param args <p>The arguments given by the user</p>
* @return <p>Null if not writing a spaced message</p>
*/
private List<String> skipCompletionForSpacedMessage(String[] args) {
if (args.length > 2) {
NPCSetting npcSetting = null;
for (NPCSetting setting : NPCSetting.values()) {
if (setting.getCommandName().equalsIgnoreCase(args[0])) {
npcSetting = setting;
break;
}
}
if (npcSetting != null && npcSetting.getPath().startsWith("defaults.messages")) {
return new ArrayList<>();
}
}
return null;
}
/**
* Gets tab-completions for a selected material or enchantment
*
* @param globalSetting <p>The global setting to get tab-completions for</p>
* @param args <p>The arguments given by the user</p>
* @return <p>The tab-completions to show to the user</p>
*/
private List<String> getPerTypeTabCompletions(GlobalSetting globalSetting, String[] args) {
//Display possible tab-completions only if a valid enchantment or material is provided
if (((globalSetting == GlobalSetting.BASE_PRICE ||
globalSetting == GlobalSetting.PRICE_PER_DURABILITY_POINT) &&
InputParsingHelper.matchMaterial(args[1]) != null) ||
(globalSetting == GlobalSetting.ENCHANTMENT_COST &&
InputParsingHelper.matchEnchantment(args[1]) != null)) {
return filterMatchingContains(getTabCompletions(globalSetting.getValueType()), args[2]);
} else {
return new ArrayList<>();
}
}
/**
* Tab completes the values available for the given command
*

View File

@ -9,6 +9,7 @@ import net.knarcraft.blacksmith.formatting.StringFormatter;
import net.knarcraft.blacksmith.formatting.TranslatableMessage;
import net.knarcraft.blacksmith.formatting.Translator;
import net.knarcraft.blacksmith.trait.BlacksmithTrait;
import net.knarcraft.blacksmith.util.InputParsingHelper;
import net.knarcraft.blacksmith.util.TypeValidationHelper;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.command.Command;
@ -72,7 +73,7 @@ public class BlackSmithEditCommand implements CommandExecutor {
displayNPCSetting(blacksmithTrait, npcSetting, sender);
} else {
//If an empty value or null, clear the value instead of changing it
if (newValue.equalsIgnoreCase("null") || newValue.equals("\"\"") || newValue.trim().isEmpty()) {
if (InputParsingHelper.isEmpty(newValue)) {
newValue = null;
} else {
//Abort if an invalid value is given
@ -101,7 +102,7 @@ public class BlackSmithEditCommand implements CommandExecutor {
*/
private void displayNPCSetting(BlacksmithTrait blacksmithTrait, NPCSetting npcSetting, CommandSender sender) {
String rawValue = String.valueOf(blacksmithTrait.getSettings().getRawValue(npcSetting));
if (rawValue == null || rawValue.trim().isEmpty() || rawValue.equalsIgnoreCase("null")) {
if (InputParsingHelper.isEmpty(rawValue)) {
//Display the default value, if no custom value has been specified
rawValue = String.valueOf(BlacksmithPlugin.getInstance().getSettings().getRawValue(npcSetting));
displaySuccessMessage(sender, getCurrentValueMessage(npcSetting.getCommandName(), rawValue));

View File

@ -4,8 +4,8 @@ import net.citizensnpcs.api.util.DataKey;
import net.citizensnpcs.api.util.YamlStorage;
import net.knarcraft.blacksmith.BlacksmithPlugin;
import net.knarcraft.blacksmith.util.ConfigHelper;
import net.knarcraft.blacksmith.util.InputParsingHelper;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import java.io.File;
@ -112,13 +112,17 @@ public class GlobalSettings {
* @param newEnchantmentCost <p>The new enchantment cost</p>
*/
public void setEnchantmentCost(Enchantment enchantment, double newEnchantmentCost) {
if (newEnchantmentCost < 0) {
throw new IllegalArgumentException("Enchantment cost cannot be negative!");
}
if (enchantment == null) {
if (newEnchantmentCost < 0) {
throw new IllegalArgumentException("Enchantment cost cannot be negative!");
}
globalSettings.put(GlobalSetting.ENCHANTMENT_COST, newEnchantmentCost);
} else {
enchantmentCosts.put(enchantment, newEnchantmentCost);
if (newEnchantmentCost < 0) {
enchantmentCosts.put(enchantment, null);
} else {
enchantmentCosts.put(enchantment, newEnchantmentCost);
}
}
save();
}
@ -130,13 +134,18 @@ public class GlobalSettings {
* @param newPrice <p>The new price per durability point price</p>
*/
public void setPricePerDurabilityPoint(Material material, double newPrice) {
if (newPrice < 0) {
throw new IllegalArgumentException("Price per durability point cannot be negative!");
}
if (material == null) {
if (newPrice < 0) {
throw new IllegalArgumentException("Price per durability point cannot be negative!");
}
globalSettings.put(GlobalSetting.PRICE_PER_DURABILITY_POINT, newPrice);
} else {
materialPricePerDurabilityPoints.put(material, newPrice);
//Use a negative price to unset the per-item value
if (newPrice < 0) {
materialPricePerDurabilityPoints.put(material, null);
} else {
materialPricePerDurabilityPoints.put(material, newPrice);
}
}
save();
}
@ -148,13 +157,18 @@ public class GlobalSettings {
* @param newBasePrice <p>The new base price</p>
*/
public void setBasePrice(Material material, double newBasePrice) {
if (newBasePrice < 0) {
throw new IllegalArgumentException("Base price cannot be negative!");
}
if (material == null) {
if (newBasePrice < 0) {
throw new IllegalArgumentException("Base price cannot be negative!");
}
globalSettings.put(GlobalSetting.BASE_PRICE, newBasePrice);
} else {
materialBasePrices.put(material, newBasePrice);
//Use a negative price to unset the per-item value
if (newBasePrice < 0) {
materialBasePrices.put(material, null);
} else {
materialBasePrices.put(material, newBasePrice);
}
}
save();
}
@ -292,7 +306,7 @@ public class GlobalSettings {
Map<String, String> relevantKeys = getRelevantKeys(basePriceNode);
for (String key : relevantKeys.keySet()) {
String materialName = relevantKeys.get(key);
Material material = Material.matchMaterial(materialName);
Material material = InputParsingHelper.matchMaterial(materialName);
if (material != null) {
materialBasePrices.put(material, basePriceNode.getDouble(key));
} else {
@ -306,7 +320,7 @@ public class GlobalSettings {
relevantKeys = getRelevantKeys(basePerDurabilityPriceNode);
for (String key : relevantKeys.keySet()) {
String materialName = relevantKeys.get(key);
Material material = Material.matchMaterial(materialName);
Material material = InputParsingHelper.matchMaterial(materialName);
if (material != null) {
materialPricePerDurabilityPoints.put(material, basePerDurabilityPriceNode.getDouble(key));
} else {
@ -320,7 +334,7 @@ public class GlobalSettings {
relevantKeys = getRelevantKeys(basePerDurabilityPriceNode);
for (String key : relevantKeys.keySet()) {
String enchantmentName = relevantKeys.get(key);
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(enchantmentName));
Enchantment enchantment = InputParsingHelper.matchEnchantment(enchantmentName);
if (enchantment != null) {
enchantmentCosts.put(enchantment, enchantmentCostNode.getDouble(key));
} else {
@ -407,7 +421,7 @@ public class GlobalSettings {
//Load all enchantment prices
DataKey enchantmentCostNode = root.getRelative(GlobalSetting.ENCHANTMENT_COST.getParent());
for (Enchantment enchantment : enchantmentCosts.keySet()) {
enchantmentCostNode.setRaw(unNormalizeName(enchantment.getKey().toString()), enchantmentCosts.get(enchantment));
enchantmentCostNode.setRaw(unNormalizeName(enchantment.getKey().getKey()), enchantmentCosts.get(enchantment));
}
//Perform the actual save to disk

View File

@ -4,6 +4,7 @@ import net.citizensnpcs.api.util.DataKey;
import net.knarcraft.blacksmith.BlacksmithPlugin;
import net.knarcraft.blacksmith.trait.BlacksmithTrait;
import net.knarcraft.blacksmith.util.ConfigHelper;
import net.knarcraft.blacksmith.util.InputParsingHelper;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
@ -361,10 +362,10 @@ public class NPCSettings {
newReforgeAbleItems = (String) replaceReforgeAblePresets(newReforgeAbleItems);
for (String item : newReforgeAbleItems.split(",")) {
if (item == null || item.trim().isEmpty() || item.equalsIgnoreCase("null")) {
if (InputParsingHelper.isEmpty(item)) {
continue;
}
Material material = Material.matchMaterial(item.replace('-', '_'));
Material material = InputParsingHelper.matchMaterial(item);
if (material != null && BlacksmithTrait.isRepairable(new ItemStack(material, 1))) {
this.reforgeAbleItems.add(material);
} else {

View File

@ -124,7 +124,7 @@ public final class TimeFormatter {
String durationFormat = Translator.getTranslatedMessage(TranslatableMessage.DURATION_FORMAT);
durationFormat = replacePlaceholder(durationFormat, "{unit}",
Translator.getTranslatedMessage(translatableMessage));
return replacePlaceholder(durationFormat, "{duration}", castToInt ? String.valueOf((int) duration) :
return replacePlaceholder(durationFormat, "{time}", castToInt ? String.valueOf((int) duration) :
String.valueOf(duration));
}

View File

@ -8,7 +8,7 @@ public enum TimeInterval {
/**
* Less than 10 seconds left
*/
INTERVAL_LESS_THAN_10_SECONDS("momentarily", 10),
INTERVAL_LESS_THAN_10_SECONDS("in just a moment", 10),
/**
* Less than 30 seconds left

View File

@ -122,7 +122,7 @@ public class BlacksmithTrait extends Trait {
if (coolDowns.get(playerId) != null) {
Calendar calendar = Calendar.getInstance();
if (!calendar.after(coolDowns.get(playerId))) {
int secondDifference = (int) ((calendar.getTimeInMillis() - coolDowns.get(playerId).getTimeInMillis()) * 1000);
int secondDifference = (int) (coolDowns.get(playerId).getTimeInMillis() - calendar.getTimeInMillis()) / 1000;
boolean exactTime = BlacksmithPlugin.getInstance().getSettings().getShowExactTime();
sendNPCMessage(this.npc, player, replacePlaceholder(config.getCoolDownUnexpiredMessage(),
"{time}", TimeFormatter.formatTime(exactTime, secondDifference)));
@ -133,8 +133,8 @@ public class BlacksmithTrait extends Trait {
//If already in a session, but the player has failed to interact, and left the blacksmith, allow a new session
if (session != null) {
if (System.currentTimeMillis() > _sessionStart + 10 * 1000 &&
this.npc.getEntity().getLocation().distance(session.getPlayer().getLocation()) > 20) {
if (!session.isRunning() && (System.currentTimeMillis() > _sessionStart + 10 * 1000 ||
this.npc.getEntity().getLocation().distance(session.getPlayer().getLocation()) > 20)) {
session = null;
}
}

View File

@ -4,8 +4,8 @@ import net.citizensnpcs.api.npc.NPC;
import net.knarcraft.blacksmith.BlacksmithPlugin;
import net.knarcraft.blacksmith.config.NPCSettings;
import net.knarcraft.blacksmith.manager.EconomyManager;
import net.knarcraft.blacksmith.util.InputParsingHelper;
import net.knarcraft.blacksmith.util.ItemHelper;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
@ -57,7 +57,7 @@ public class ReforgeSession implements Runnable {
if (enchantments[0] == null) {
int i = 0;
for (Enchantment enchantment : Enchantment.values()) {
enchantments[i++] = enchantment.getKey().toString();
enchantments[i++] = enchantment.getKey().getKey();
}
}
}
@ -140,7 +140,7 @@ public class ReforgeSession implements Runnable {
//Find usable enchantments first
List<Enchantment> usableEnchantments = new ArrayList<>();
for (String enchantmentName : enchantments) {
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.fromString(enchantmentName));
Enchantment enchantment = InputParsingHelper.matchEnchantment(enchantmentName);
if (enchantment != null && enchantment.canEnchantItem(itemToReforge)) {
usableEnchantments.add(enchantment);
}

View File

@ -13,6 +13,17 @@ public final class InputParsingHelper {
}
/**
* Gets whether the input is an "empty" value treated as null
*
* @param input <p>The input to check</p>
* @return <p>True if the value is empty</p>
*/
public static boolean isEmpty(String input) {
return input == null || input.equalsIgnoreCase("null") || input.equals("\"\"") ||
input.trim().isEmpty() || input.equals("-1");
}
/**
* Tries to find the material matching the given input string
*

View File

@ -62,7 +62,7 @@ public final class TabCompleteValuesHelper {
private static List<String> getAllEnchantments() {
List<String> enchantments = new ArrayList<>();
for (Enchantment enchantment : Enchantment.values()) {
enchantments.add(enchantment.toString());
enchantments.add(enchantment.getKey().getKey());
}
return enchantments;
}

View File

@ -1,5 +1,8 @@
# Blacksmith Configuration
# The language used for messages. Only "en" is supported
language: en
# The settings which apply to all Blacksmith NPCs. These can also be changed using the /blacksmithconfig command
global:
# The minimum price of each cost

View File

@ -1,7 +1,7 @@
name: Blacksmith
author: EpicKnarvik97, aPunch, jrbudda, HurricanKai
authors: [ EpicKnarvik97, aPunch, jrbudda, HurricanKai ]
version: 1.0.0
version: 1.0.1
main: net.knarcraft.blacksmith.BlacksmithPlugin
depend: [ Citizens, Vault ]

View File

@ -18,13 +18,13 @@ en:
INVALID_FILTER_FOR_PRESET: "The specified filter is not valid for that preset"
INVALID_PRESET_OR_FILTER: "You specified an invalid preset or an invalid filter"
PRESET_MATERIALS: "Materials in preset: {materials}"
DURATION_FORMAT: "{time} {unit}"
DURATION_FORMAT: "in {time} {unit}"
UNIT_NOW: "imminently"
UNIT_SECOND: "second"
UNIT_SECONDS: "seconds"
UNIT_MINUTE: "minute"
UNIT_MINUTES: "minutes"
INTERVAL_LESS_THAN_10_SECONDS: "momentarily"
INTERVAL_LESS_THAN_10_SECONDS: "in just a moment"
INTERVAL_LESS_THAN_30_SECONDS: "in a little while"
INTERVAL_LESS_THAN_1_MINUTE: "in a while"
INTERVAL_LESS_THAN_5_MINUTES: "after some time"