From d0ce21ad67df077446e2c071443c0a2d200c8199 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Mon, 12 Feb 2024 09:39:27 -0600 Subject: [PATCH 01/27] - Cause trusted residents who have changed their names to auto-matically carry their trusted status in a town over, without a server restart required. - Closes #7249. --- .../bukkit/towny/db/TownyDatabaseHandler.java | 27 ++++++++++++------- Towny/src/main/resources/ChangeLog.txt | 4 ++- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java index d05f9be200..59810c8b6c 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java @@ -71,10 +71,12 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Queue; import java.util.Random; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.logging.Level; @@ -826,26 +828,31 @@ public void renamePlayer(Resident resident, String newName) throws AlreadyRegist Resident oldResident = new Resident(oldName); // Search and update all friends lists - List toSaveResident = new ArrayList<>(universe.getResidents()); - for (Resident toCheck : toSaveResident){ + Set residentsToSave = new HashSet<>(); + for (Resident toCheck : new ArrayList<>(universe.getResidents())){ if (toCheck.hasFriend(oldResident)) { toCheck.removeFriend(oldResident); toCheck.addFriend(resident); + residentsToSave.add(toCheck); } } - for (Resident toCheck : toSaveResident) - saveResident(toCheck); - - // Search and update all outlaw lists. - List toSaveTown = new ArrayList<>(universe.getTowns()); - for (Town toCheckTown : toSaveTown) { + residentsToSave.forEach(res -> res.save()); + + // Search and update all town outlaw, trustedresidents lists. + Set townsToSave = new HashSet<>(); + for (Town toCheckTown : new ArrayList<>(universe.getTowns())) { if (toCheckTown.hasOutlaw(oldResident)) { toCheckTown.removeOutlaw(oldResident); toCheckTown.addOutlaw(resident); + townsToSave.add(toCheckTown); + } + if (toCheckTown.hasTrustedResident(oldResident)) { + toCheckTown.removeTrustedResident(oldResident); + toCheckTown.addTrustedResident(resident); + townsToSave.add(toCheckTown); } } - for (Town toCheckTown : toSaveTown) - saveTown(toCheckTown); + townsToSave.forEach(town -> town.save()); //delete the old resident and tidy up files deleteResident(oldResident); diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index 28ef2d304f..e56cfa3714 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9509,4 +9509,6 @@ v0.92.0.11: - Closes #7238. - New Command: /town invite sent removeall - Removes all of the invites which a town has sent. - - Requires the towny.command.town.invite.add permission node to use (same node used for removing one by one.) \ No newline at end of file + - Requires the towny.command.town.invite.add permission node to use (same node used for removing one by one.) + - Cause trusted residents who have changed their names to auto-matically carry their trusted status in a town over, without a server restart required. + - Closes #7249. \ No newline at end of file From f8fb29b878fa34e310bd076d9a1d4385faefefd2 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Mon, 12 Feb 2024 12:21:11 -0600 Subject: [PATCH 02/27] Overhaul the NameValidation class. (#7199) * Overhaul the NameValidation class. Makes all of the individual tests private, resulting in the classes that needed them instead calling specific Name Validation methods which are built for their object type. Some inconsistencies were uncovered: - we're now using the config-blacklisted-names lists more thoroughly, which should result in less shenanigans in titles and boards. - we're also now making towns/nations names play by more consistent rules, I believe I find some oversights which are now closed. TODO: make sure that the new InvalidNameException messages are being passed on to the user. This might require updating the exception to behave more like a TownyException or dropping them entirely for TownyExceptions. * Make the config blacklist name method always break the string down into words. * Add the ability for InvalidNameExceptions to be thrown with Translatables. * Make impropernames public * Correct version number. * Fix typo in javadoc, drop private methods using the AndThrow naming. --- .../bukkit/towny/TownyUniverse.java | 10 +- .../bukkit/towny/command/NationCommand.java | 63 +-- .../bukkit/towny/command/PlotCommand.java | 15 +- .../bukkit/towny/command/ResidentCommand.java | 2 +- .../bukkit/towny/command/TownCommand.java | 99 +---- .../towny/command/TownyAdminCommand.java | 34 +- .../bukkit/towny/db/TownyDatabaseHandler.java | 6 +- .../exceptions/InvalidNameException.java | 6 + .../bukkit/util/NameValidation.java | 411 ++++++++++++++---- Towny/src/main/resources/lang/en-US.yml | 24 +- 10 files changed, 395 insertions(+), 275 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java index b09f561abc..7eb8051809 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java @@ -476,7 +476,7 @@ public boolean hasTown(@NotNull String townName) { String formattedName; try { - formattedName = NameValidation.checkAndFilterName(townName).toLowerCase(Locale.ROOT); + formattedName = NameValidation.checkAndFilterTownNameOrThrow(townName).toLowerCase(Locale.ROOT); } catch (InvalidNameException e) { return false; } @@ -500,7 +500,7 @@ public Town getTown(@NotNull String townName) { String formattedName; try { - formattedName = NameValidation.checkAndFilterName(townName).toLowerCase(Locale.ROOT); + formattedName = NameValidation.checkAndFilterTownNameOrThrow(townName).toLowerCase(Locale.ROOT); } catch (InvalidNameException e) { return null; } @@ -541,7 +541,7 @@ public void newTown(@NotNull String name) throws AlreadyRegisteredException, Inv } private void newTown(String name, boolean assignUUID) throws AlreadyRegisteredException, InvalidNameException { - String filteredName = NameValidation.checkAndFilterName(name); + String filteredName = NameValidation.checkAndFilterTownNameOrThrow(name); Town town = new Town(filteredName, assignUUID ? UUID.randomUUID() : null); registerTown(town); @@ -621,7 +621,7 @@ public boolean hasNation(@NotNull String nationName) { String filteredName; try { - filteredName = NameValidation.checkAndFilterName(nationName).toLowerCase(Locale.ROOT); + filteredName = NameValidation.checkAndFilterNationNameOrThrow(nationName).toLowerCase(Locale.ROOT); } catch (InvalidNameException ignored) { return false; } @@ -657,7 +657,7 @@ public Nation getNation(@NotNull String nationName) { String filteredName; try { - filteredName = NameValidation.checkAndFilterName(nationName).toLowerCase(Locale.ROOT); + filteredName = NameValidation.checkAndFilterNationNameOrThrow(nationName).toLowerCase(Locale.ROOT); } catch (InvalidNameException ignored) { return null; } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java index 567d121794..b1abad608a 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java @@ -41,7 +41,6 @@ import com.palmergames.bukkit.towny.event.NationAcceptAllyRequestEvent; import com.palmergames.bukkit.towny.event.nation.NationKingChangeEvent; import com.palmergames.bukkit.towny.exceptions.AlreadyRegisteredException; -import com.palmergames.bukkit.towny.exceptions.InvalidNameException; import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; import com.palmergames.bukkit.towny.exceptions.TownyException; import com.palmergames.bukkit.towny.invites.Invite; @@ -868,6 +867,9 @@ private void newNation(Player player, String[] split) throws TownyException { throw new TownyException(Translatable.of("msg_specify_nation_name")); String nationName = String.join("_", split); + if (TownySettings.getTownAutomaticCapitalisationEnabled()) + nationName = StringMgmt.capitalizeStrings(nationName); + Town town = getTownForNationCapital(player); boolean noCharge = TownySettings.getNewNationPrice() == 0.0 || !TownyEconomyHandler.isActive(); newNation((CommandSender) player, nationName, town, noCharge); @@ -900,7 +902,7 @@ public static void newNation(CommandSender sender, String name, Town capitalTown if (capitalTown.hasNation()) throw new TownyException(Translatable.of("msg_err_already_nation")); - final String filteredName = validateNationNameOrThrow(name); + String filteredName = NameValidation.checkAndFilterNationNameOrThrow(name); BukkitTools.ifCancelledThenThrow(new PreNewNationEvent(capitalTown, filteredName)); @@ -931,24 +933,6 @@ public static void newNation(CommandSender sender, String name, Town capitalTown .sendTo(sender); } - private static String validateNationNameOrThrow(String name) throws TownyException { - if (TownySettings.getTownAutomaticCapitalisationEnabled()) - name = StringMgmt.capitalizeStrings(name); - - // Check the name is valid and doesn't already exist. - String filteredName; - try { - filteredName = NameValidation.checkAndFilterName(name); - } catch (InvalidNameException e) { - filteredName = null; - } - - if (filteredName == null || TownyUniverse.getInstance().hasNation(filteredName) || (!TownySettings.areNumbersAllowedInNationNames() && NameValidation.containsNumbers(filteredName))) - throw new TownyException(Translatable.of("msg_err_invalid_name", name)); - - return filteredName; - } - public static Nation newNation(String name, Town town) throws AlreadyRegisteredException, NotRegisteredException { TownyUniverse townyUniverse = TownyUniverse.getInstance(); @@ -2021,7 +2005,7 @@ private static void nationSetBoard(CommandSender sender, Nation nation, String[] String line = StringMgmt.join(StringMgmt.remFirstArg(split), " "); if (!line.equals("none")) { - if (!NameValidation.isValidString(line)) { + if (!NameValidation.isValidBoardString(line)) { TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_invalid_string_nationboard_not_set")); return; } @@ -2048,17 +2032,7 @@ private static void nationSetSurname(CommandSender sender, Nation nation, Reside return; } - String surname = StringMgmt.join(NameValidation.checkAndFilterArray(StringMgmt.remArgs(split, 2))); - if (surname.length() > TownySettings.getMaxTitleLength()) { - TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_input_too_long")); - return; - } - - if (NameValidation.isConfigBlacklistedName(surname)) { - TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_invalid_name")); - return; - } - + String surname = NameValidation.checkAndFilterTitlesSurnameOrThrow(StringMgmt.remArgs(split, 2)); resident.setSurname(surname); resident.save(); @@ -2087,17 +2061,7 @@ private static void nationSetTitle(CommandSender sender, Nation nation, Resident return; } - String title = StringMgmt.join(NameValidation.checkAndFilterArray(StringMgmt.remArgs(split, 2))); - if (title.length() > TownySettings.getMaxTitleLength()) { - TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_input_too_long")); - return; - } - - if (NameValidation.isConfigBlacklistedName(title)) { - TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_invalid_name")); - return; - } - + String title = NameValidation.checkAndFilterTitlesSurnameOrThrow(StringMgmt.remArgs(split, 2)); resident.setTitle(title); resident.save(); @@ -2121,10 +2085,8 @@ else if (split[1].equalsIgnoreCase("clear")) { nation.setTag(" "); TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_reset_nation_tag", name)); } else { - if (split[1].length() > TownySettings.getMaxTagLength()) - throw new TownyException(Translatable.of("msg_err_tag_too_long")); - - nation.setTag(NameValidation.checkAndFilterName(split[1])); + String tag = NameValidation.checkAndFilterTagOrThrow(split[1]); + nation.setTag(tag); TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_set_nation_tag", name, nation.getTag())); if (admin) TownyMessaging.sendMsg(sender, Translatable.of("msg_set_nation_tag", name, nation.getTag())); @@ -2140,10 +2102,9 @@ private static void nationSetName(CommandSender sender, Nation nation, String[] else { String name = String.join("_", StringMgmt.remFirstArg(split)); - - if (NameValidation.isBlacklistName(name) || TownyUniverse.getInstance().hasNation(name) || (!TownySettings.areNumbersAllowedInNationNames() && NameValidation.containsNumbers(name))) - throw new TownyException(Translatable.of("msg_invalid_name")); - + + name = NameValidation.checkAndFilterGovernmentNameOrThrow(name, nation); + if (TownySettings.getTownAutomaticCapitalisationEnabled()) name = StringMgmt.capitalizeStrings(name); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java index f19d8fbda3..70de707a03 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java @@ -668,13 +668,8 @@ public void parsePlotSetName(Player player, String[] name, TownBlock townBlock) townBlock.save(); return; } - - String newName = StringMgmt.join(name, "_"); - - // Test if the plot name contains invalid characters. - if (NameValidation.isBlacklistName(newName)) - throw new TownyException(Translatable.of("msg_invalid_name")); + String newName = NameValidation.checkAndFilterPlotNameOrThrow(StringMgmt.join(name, "_")); townBlock.setName(newName); townBlock.save(); TownyMessaging.sendMsg(player, Translatable.of("msg_plot_name_set_to", townBlock.getName())); @@ -1236,9 +1231,11 @@ public void parsePlotGroupAdd(String[] split, TownBlock townBlock, Player player if (split.length != 2 && !resident.hasPlotGroupName()) throw new TownyException(Translatable.of("msg_err_plot_group_name_required")); - String plotGroupName = split.length == 2 ? NameValidation.filterName(split[1]) : - resident.hasPlotGroupName() ? resident.getPlotGroupName() : null; - plotGroupName = NameValidation.filterCommas(plotGroupName); + String plotGroupName = split.length == 2 + ? NameValidation.checkAndFilterPlotGroupNameOrThrow(split[1]) + : resident.hasPlotGroupName() + ? resident.getPlotGroupName() + : null; if (town.hasPlotGroupName(plotGroupName)) { TownBlockType groupType = town.getPlotObjectGroupFromName(plotGroupName).getTownBlockType(); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java index ffad445da4..7960f50bb1 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java @@ -573,7 +573,7 @@ private void setAbout(Player player, String about, Resident resident) throws Tow } else if ("none".equalsIgnoreCase(about) || "clear".equalsIgnoreCase(about)) { about = ""; } else { - if (!NameValidation.isValidString(about)) { + if (!NameValidation.isValidBoardString(about)) { TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_invalid_string_about_not_set")); return; } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java index 9ca2440ad9..2958772e66 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java @@ -49,7 +49,6 @@ import com.palmergames.bukkit.towny.event.town.TownTrustTownAddEvent; import com.palmergames.bukkit.towny.event.town.TownTrustTownRemoveEvent; import com.palmergames.bukkit.towny.exceptions.AlreadyRegisteredException; -import com.palmergames.bukkit.towny.exceptions.InvalidNameException; import com.palmergames.bukkit.towny.exceptions.NoPermissionException; import com.palmergames.bukkit.towny.exceptions.TownyException; import com.palmergames.bukkit.towny.exceptions.CancelledEventException; @@ -1877,7 +1876,7 @@ public static void townSetBoard(CommandSender sender, String board, Town town) t } else if ("none".equalsIgnoreCase(board) || "clear".equalsIgnoreCase(board)) { board = ""; } else { - if (!NameValidation.isValidString(board)) { + if (!NameValidation.isValidBoardString(board)) { TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_invalid_string_board_not_set")); return; } @@ -1900,41 +1899,19 @@ public static void townSetTitle(@NotNull CommandSender sender, @NotNull String[] throw new TownyException("Eg: /town set title bilbo Jester"); Resident resident = getResidentOrThrow(split[0]); - String title = StringMgmt.join(NameValidation.checkAndFilterArray(StringMgmt.remArgs(split, 1))); - - townSetTitle(sender, resident, title, admin); - } - - /** - * @param sender The command sender who initiated the command. - * @param resident The resident to set the title for. - * @param title The title to set. - * @param admin Whether to skip the same-town test. - * @throws TownyException If the title wasn't able to be set. - */ - public static void townSetTitle(@NotNull CommandSender sender, @NotNull Resident resident, @NotNull String title, boolean admin) throws TownyException { - checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWN_SET_TITLE.getNode()); - final boolean sameTown = sender instanceof Player player && CombatUtil.isSameTown(getResidentOrThrow(player), resident); - + if (!admin && !sameTown) throw new TownyException(Translatable.of("msg_err_not_same_town", resident.getName())); - - title = NameValidation.filterName(title); - - if (title.length() > TownySettings.getMaxTitleLength()) - throw new TownyException(Translatable.of("msg_err_input_too_long")); - - if (NameValidation.isConfigBlacklistedName(title)) - throw new TownyException(Translatable.of("msg_invalid_name")); + String title = NameValidation.checkAndFilterTitlesSurnameOrThrow(StringMgmt.remArgs(split, 1)); resident.setTitle(title); resident.save(); Translatable message = resident.hasTitle() ? Translatable.of("msg_set_title", resident.getName(), Colors.translateColorCodes(resident.getTitle())) : Translatable.of("msg_clear_title_surname", "Title", resident.getName()); - + TownyMessaging.sendPrefixedTownMessage(resident, message); if (admin && !sameTown) @@ -1946,36 +1923,14 @@ public static void townSetSurname(CommandSender sender, String[] split, boolean // Give the resident a surname if (split.length == 0) throw new TownyException("Eg: /town set surname bilbo the dwarf "); - - Resident resident = getResidentOrThrow(split[0]); - String surname = StringMgmt.join(NameValidation.checkAndFilterArray(StringMgmt.remArgs(split, 1))); - - townSetSurname(sender, resident, surname, admin); - } - /** - * @param sender The command sender who initiated the command. - * @param resident The resident to set the surname for. - * @param surname The surname to set. - * @param admin Whether to skip the same-town test. - * @throws TownyException If the surname wasn't able to be set. - */ - public static void townSetSurname(@NotNull CommandSender sender, @NotNull Resident resident, @NotNull String surname, boolean admin) throws TownyException { - checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWN_SET_SURNAME.getNode()); - + Resident resident = getResidentOrThrow(split[0]); final boolean sameTown = sender instanceof Player player && CombatUtil.isSameTown(getResidentOrThrow(player), resident); - + if (!admin && !sameTown) throw new TownyException(Translatable.of("msg_err_not_same_town", resident.getName())); - - surname = NameValidation.filterName(surname); - - if (surname.length() > TownySettings.getMaxTitleLength()) - throw new TownyException(Translatable.of("msg_err_input_too_long")); - if (NameValidation.isConfigBlacklistedName(surname)) - throw new TownyException(Translatable.of("msg_invalid_name")); - + String surname = NameValidation.checkAndFilterTitlesSurnameOrThrow(StringMgmt.remArgs(split, 1)); resident.setSurname(surname); resident.save(); @@ -1984,7 +1939,7 @@ public static void townSetSurname(@NotNull CommandSender sender, @NotNull Reside : Translatable.of("msg_clear_title_surname", "Surname", resident.getName()); TownyMessaging.sendPrefixedTownMessage(resident, message); - + if (admin && !sameTown) TownyMessaging.sendMsg(sender, message); } @@ -2170,15 +2125,11 @@ public static void townSetName(CommandSender sender, String[] split, Town town) throw new TownyException("Eg: /town set name BillyBobTown"); String name = String.join("_", split); - - if (NameValidation.isBlacklistName(name) - || TownyUniverse.getInstance().hasTown(name) - || (!TownySettings.areNumbersAllowedInTownNames() && NameValidation.containsNumbers(name))) - throw new TownyException(Translatable.of("msg_invalid_name")); if (TownySettings.getTownAutomaticCapitalisationEnabled()) name = StringMgmt.capitalizeStrings(name); - + name = NameValidation.checkAndFilterGovernmentNameOrThrow(name, town); + if(TownyEconomyHandler.isActive() && TownySettings.getTownRenameCost() > 0) { if (!town.getAccount().canPayFromHoldings(TownySettings.getTownRenameCost())) throw new TownyException(Translatable.of("msg_err_no_money", prettyMoney(TownySettings.getTownRenameCost()))); @@ -2202,10 +2153,8 @@ else if (split[0].equalsIgnoreCase("clear")) { if (admin) TownyMessaging.sendMsg(sender, Translatable.of("msg_reset_town_tag", sender.getName())); TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_reset_town_tag", sender.getName())); } else { - if (split[0].length() > TownySettings.getMaxTagLength()) - throw new TownyException(Translatable.of("msg_err_tag_too_long")); - - town.setTag(NameValidation.checkAndFilterName(split[0])); + String tag = NameValidation.checkAndFilterTagOrThrow(split[0]); + town.setTag(tag); town.save(); if (admin) TownyMessaging.sendMsg(sender, Translatable.of("msg_set_town_tag", sender.getName(), town.getTag())); TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_set_town_tag", sender.getName(), town.getTag())); @@ -2513,7 +2462,10 @@ public static void newTown(Player player, String name, Resident resident, boolea throw new TownyException(Translatable.of("msg_err_cannot_create_new_town_x_seconds_remaining", CooldownTimerTask.getCooldownRemaining(player.getName(), CooldownType.TOWN_DELETE))); - name = filterNameOrThrow(name); + if (TownySettings.getTownAutomaticCapitalisationEnabled()) + name = StringMgmt.capitalizeStrings(name); + + name = NameValidation.checkAndFilterTownNameOrThrow(name); if (resident.hasTown()) throw new TownyException(Translatable.of("msg_err_already_res", resident.getName())); @@ -2650,25 +2602,6 @@ public static Town newTown(TownyWorld world, String name, Resident resident, Coo return town; } - private static String filterNameOrThrow(String name) throws TownyException { - if (TownySettings.getTownAutomaticCapitalisationEnabled()) - name = StringMgmt.capitalizeStrings(name); - - // Check the name is valid and doesn't already exist. - String filteredName; - try { - filteredName = NameValidation.checkAndFilterName(name); - } catch (InvalidNameException e) { - filteredName = null; - } - - if (filteredName == null || TownyUniverse.getInstance().hasTown(filteredName) || (!TownySettings.areNumbersAllowedInTownNames() && NameValidation.containsNumbers(filteredName))) - throw new TownyException(Translatable.of("msg_err_invalid_name", name)); - - name = filteredName; - return name; - } - public static void townRename(CommandSender sender, Town town, String newName) { TownyUniverse townyUniverse = TownyUniverse.getInstance(); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java index efc435ad7e..c63d6ecf43 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java @@ -1113,10 +1113,11 @@ private void residentRename(CommandSender sender, String[] split, Resident resid if (split.length != 3) throw new TownyException("Eg: /townyadmin resident [resident] rename [newname]"); - if (NameValidation.isBlacklistName(split[2])) - throw new TownyException(Translatable.of("msg_invalid_name")); + String name = NameValidation.checkAndFilterPlayerName(split[2]); +// if (NameValidation.isBlacklistName(split[2])) +// throw new TownyException(Translatable.of("msg_invalid_name")); - TownyUniverse.getInstance().getDataSource().renamePlayer(resident, split[2]); + TownyUniverse.getInstance().getDataSource().renamePlayer(resident, name); } private void residentFriend(CommandSender sender, String[] split, Resident resident) throws TownyException { @@ -1223,13 +1224,8 @@ public void parseAdminTownCommand(CommandSender sender, String[] split) throws T checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_TOWN_RENAME.getNode()); if (split.length < 3) throw new TownyException(Translatable.of("msg_err_invalid_input", "/ta town TOWNNAME rename NEWNAME")); - String name = String.join("_", StringMgmt.remArgs(split, 2)); - + String name = NameValidation.checkAndFilterTownNameOrThrow(String.join("_", StringMgmt.remArgs(split, 2))); BukkitTools.ifCancelledThenThrow(new TownPreRenameEvent(town, name)); - - if (NameValidation.isBlacklistName(name) || (!TownySettings.areNumbersAllowedInTownNames() && NameValidation.containsNumbers(name))) - throw new TownyException(Translatable.of("msg_invalid_name")); - townyUniverse.getDataSource().renameTown(town, name); TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_town_set_name", getSenderFormatted(sender), town.getName())); TownyMessaging.sendMsg(sender, Translatable.of("msg_town_set_name", getSenderFormatted(sender), town.getName())); @@ -1677,10 +1673,8 @@ public void parseAdminNationCommand(CommandSender sender, String[] split) throws break; case "rename": checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_NATION_RENAME.getNode()); - String name = String.join("_", StringMgmt.remArgs(split, 2)); + String name = NameValidation.checkAndFilterNationNameOrThrow(String.join("_", StringMgmt.remArgs(split, 2))); BukkitTools.ifCancelledThenThrow(new NationPreRenameEvent(nation, name)); - if (NameValidation.isBlacklistName(name) || (!TownySettings.areNumbersAllowedInNationNames() && NameValidation.containsNumbers(name))) - throw new TownyException(Translatable.of("msg_invalid_name")); townyUniverse.getDataSource().renameNation(nation, name); TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_nation_set_name", getSenderFormatted(sender), nation.getName())); TownyMessaging.sendMsg(sender, Translatable.of("msg_nation_set_name", getSenderFormatted(sender), nation.getName())); @@ -2187,13 +2181,7 @@ private void adminSetSurname(CommandSender sender, String[] split) throws TownyE } else resident = getResidentOrThrow(split[1]); - split = StringMgmt.remArgs(split, 2); - if (StringMgmt.join(split).length() > TownySettings.getMaxTitleLength()) { - TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_input_too_long")); - return; - } - - String surname = StringMgmt.join(NameValidation.checkAndFilterArray(split)); + String surname = NameValidation.checkAndFilterTitlesSurnameOrThrow(StringMgmt.remArgs(split, 2)); resident.setSurname(surname + " "); resident.save(); @@ -2217,13 +2205,7 @@ private void adminSetTitle(CommandSender sender, String[] split) throws TownyExc } else resident = getResidentOrThrow(split[1]); - split = StringMgmt.remArgs(split, 2); - if (StringMgmt.join(split).length() > TownySettings.getMaxTitleLength()) { - TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_input_too_long")); - return; - } - - String title = StringMgmt.join(NameValidation.checkAndFilterArray(split)); + String title = NameValidation.checkAndFilterTitlesSurnameOrThrow(StringMgmt.remArgs(split, 2)); resident.setTitle(title + " "); resident.save(); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java index 59810c8b6c..10df15acc8 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDatabaseHandler.java @@ -222,7 +222,7 @@ public void newNation(String name) throws AlreadyRegisteredException, NotRegiste public void newNation(String name, @Nullable UUID uuid) throws AlreadyRegisteredException, NotRegisteredException { String filteredName; try { - filteredName = NameValidation.checkAndFilterName(name); + filteredName = NameValidation.checkAndFilterNationNameOrThrow(name); } catch (InvalidNameException e) { throw new NotRegisteredException(e.getMessage()); } @@ -598,7 +598,7 @@ public void renameTown(Town town, String newName) throws AlreadyRegisteredExcept String filteredName; try { - filteredName = NameValidation.checkAndFilterName(newName); + filteredName = NameValidation.checkAndFilterTownNameOrThrow(newName); } catch (InvalidNameException e) { throw new NotRegisteredException(e.getMessage()); } @@ -704,7 +704,7 @@ public void renameNation(Nation nation, String newName) throws AlreadyRegistered String filteredName; try { - filteredName = NameValidation.checkAndFilterName(newName); + filteredName = NameValidation.checkAndFilterNationNameOrThrow(newName); } catch (InvalidNameException e) { throw new NotRegisteredException(e.getMessage()); } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/exceptions/InvalidNameException.java b/Towny/src/main/java/com/palmergames/bukkit/towny/exceptions/InvalidNameException.java index 6a77bae8df..2a7197ead1 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/exceptions/InvalidNameException.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/exceptions/InvalidNameException.java @@ -1,5 +1,7 @@ package com.palmergames.bukkit.towny.exceptions; +import com.palmergames.bukkit.towny.object.Translatable; + public class InvalidNameException extends TownyException { private static final long serialVersionUID = 4191685532590886161L; @@ -11,4 +13,8 @@ public InvalidNameException() { public InvalidNameException(String message) { super(message); } + + public InvalidNameException(Translatable translatable) { + super(translatable); + } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java index b9921be9cd..6538d08351 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java +++ b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java @@ -2,7 +2,14 @@ import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.TownySettings; +import com.palmergames.bukkit.towny.TownyUniverse; import com.palmergames.bukkit.towny.exceptions.InvalidNameException; +import com.palmergames.bukkit.towny.exceptions.TownyException; +import com.palmergames.bukkit.towny.object.Government; +import com.palmergames.bukkit.towny.object.Nation; +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.Translatable; +import com.palmergames.util.StringMgmt; import java.util.Arrays; import java.util.Collection; @@ -12,6 +19,8 @@ import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import org.jetbrains.annotations.VisibleForTesting; + /** * @author ElgarL * @@ -33,123 +42,303 @@ public class NameValidation { } /** - * Check and perform getNameCheckRegex on any town/nation names + * Check and perform regex on player names * - * @param name - Town/Nation name {@link String} - * @return result of getNameCheckRegex - * @throws InvalidNameException if the name parsed is blacklisted + * @param name of a player in {@link String} format. + * @return String of the valid name result. + * @throws InvalidNameException if the player name is invalid. */ - public static String checkAndFilterName(String name) throws InvalidNameException { + public static String checkAndFilterPlayerName(String name) throws InvalidNameException { String out = filterName(name); - if (out.isEmpty()) - throw new InvalidNameException(name + " is an invalid name."); - if (isAllUnderscores(out)) - throw new InvalidNameException(name + " is an invalid name."); + testForBadSymbols(name); - if (isBlacklistName(out)) - throw new InvalidNameException(out + " is an invalid name."); + if (!isNameAllowedViaRegex(out)) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_invalid_characters", out)); return out; } /** - * Check and perform regex on any player names + * Check and perform regex on town names * - * @param name of a player in {@link String} format. + * @param name of a Town object in {@link String} format. * @return String of the valid name result. - * @throws InvalidNameException if the player name is invalid. + * @throws InvalidNameException if the Town name is invalid. */ - public static String checkAndFilterPlayerName(String name) throws InvalidNameException { + public static String checkAndFilterTownNameOrThrow(String name) throws InvalidNameException { + String out = filterName(name); + + testNameLength(out); + + testForNumbers(out); + + testForImproperNameAndThrow(out); + + testForSubcommand(out); + + if (out.startsWith(TownySettings.getTownAccountPrefix())) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_begins_with_eco_prefix", out)); + if (TownyUniverse.getInstance().hasTown(out)) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_name_already_in_use", out)); + + return out; + } + + /** + * Check and perform regex on nation names + * + * @param name of a Nation object in {@link String} format. + * @return String of the valid name result. + * @throws InvalidNameException if the Nation name is invalid. + */ + public static String checkAndFilterNationNameOrThrow(String name) throws InvalidNameException { String out = filterName(name); - if (!isValidName(out)) - throw new InvalidNameException(out + " is an invalid name."); + testNameLength(out); + + testForNumbers(out); + + testForImproperNameAndThrow(out); + + testForSubcommand(out); + + if (out.startsWith(TownySettings.getNationAccountPrefix())) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_begins_with_eco_prefix", out)); + + if (TownyUniverse.getInstance().hasNation(out)) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_name_already_in_use", out)); return out; } /** - * Perform regex on all names passed and return the results. + * Check and perform regex on any town and nations names * - * @param arr - Array of names - * @return string array of the filtered names. + * @param name of a Government object in {@link String} format. + * @param gov the Government to validate. + * @return String of the valid name result. + * @throws InvalidNameException if the Government name is invalid. */ - public static String[] checkAndFilterArray(String[] arr) { - - int count = 0; + public static String checkAndFilterGovernmentNameOrThrow(String name, Government gov) throws InvalidNameException { + if (gov instanceof Town) + return checkAndFilterTownNameOrThrow(name); - for (String word : arr) { - arr[count] = filterName(word); - count++; + if (gov instanceof Nation) + return checkAndFilterNationNameOrThrow(name); + + return name; + } + + /** + * Check and perform regex on plot names + * + * @param name of a TownBlock object in {@link String} format. + * @return String of the valid name result. + * @throws InvalidNameException if the TownBlock name is invalid. + */ + public static String checkAndFilterPlotNameOrThrow(String name) throws InvalidNameException { + name = filterName(name); + + testNameLength(name); + + testForImproperNameAndThrow(name); + + return name; + } + + /** + * Check and perform regex on plotgroup names + * + * @param name of a PlotGroup object in {@link String} format. + * @return String of the valid name result. + * @throws InvalidNameException if the PlotGroup name is invalid. + */ + public static String checkAndFilterPlotGroupNameOrThrow(String name) throws InvalidNameException { + return checkAndFilterPlotNameOrThrow(filterCommas(name)); + } + + /** + * Check and perform regex on Titles and Surnames given to residents. + * + * @param words an Array of strings that make up the title or surname. + * @return String of the valid name result. + * @throws InvalidNameException if the title or surname is invalid. + */ + public static String checkAndFilterTitlesSurnameOrThrow(String[] words) throws InvalidNameException { + String title = StringMgmt.join(NameValidation.filterNameArray(words)); + + testForConfigBlacklistedName(title); + + if (title.length() > TownySettings.getMaxTitleLength()) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_title_too_long", title)); + + testForEmptyName(title); + + return title; + } + + /** + * Check and perform regex on Tags given to towns and nations. + * + * @param tag the Tag which was submitted by the user. + * @return String of the valid tag result. + * @throws TownyException if the title or surname is invalid. + */ + public static String checkAndFilterTagOrThrow(String tag) throws TownyException { + tag = filterName(tag); + + if (tag.length() > TownySettings.getMaxTagLength()) + throw new TownyException(Translatable.of("msg_err_tag_too_long")); + + testForEmptyName(tag); + + testAllUnderscores(tag); + + testForImproperNameAndThrow(tag); + + return tag; + } + + /** + * Used in validating the strings saved for town and nation boards and resident about sections. + * + * @param message String needing validation. + * @return true if the message is allowed. + */ + public static boolean isValidBoardString(String message) { + try { + testForBadSymbols(message); + + testForConfigBlacklistedName(message); + } catch (InvalidNameException e1) { + return false; } - return arr; + try { + if (stringPattern == null) + stringPattern = Pattern.compile(TownySettings.getStringCheckRegex(), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS); + return stringPattern.matcher(message).find(); + } catch (PatternSyntaxException e) { + Towny.getPlugin().getLogger().log(Level.WARNING, "Failed to compile the string check regex pattern because it contains errors (" + TownySettings.getStringCheckRegex() + ")", e); + return false; + } + } + + /** + * Stops Names which are: + * empty, in the config blacklist, all underscores, containing + * bad symbols, using characters not in the name regex. + * + * @param name Name to validate. + * @throws InvalidNameException when the name is not allowed. + */ + public static void testForImproperNameAndThrow(String name) throws InvalidNameException { + + testForEmptyName(name); + + testForConfigBlacklistedName(name); + + testAllUnderscores(name); + + testForBadSymbols(name); + + if (!isNameAllowedViaRegex(name)) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_invalid_characters", name)); } - private static boolean isAllUnderscores(String out) { - for (char letter : out.toCharArray()) + /** + * Stops any empty strings passing through. + * + * @param name String to validate. + * @throws InvalidNameException thrown when name is an empty String. + */ + private static void testForEmptyName(String name) throws InvalidNameException { + if (name.isEmpty()) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_is_empty")); + } + + /** + * Does this name not pass the config blacklist at plugin.name_blacklist + * + * @param line String to check. + * @throws InvalidNameException if the string is blacklisted in the config. + */ + private static void testForConfigBlacklistedName(String line) throws InvalidNameException { + String[] words = line.split(" "); + for (String word : words) + if(!word.isEmpty() && TownySettings.getBlacklistedNames().stream().anyMatch(word::equalsIgnoreCase)) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_is_not_permitted", word)); + } + + /** + * Stop objects being named with underscores, which Towny will filter into + * spaces in some occaissions. + * + * @param name String submitted for testing. + * @throws InvalidNameException when the name is entirely underscores. + */ + private static void testAllUnderscores(String name) throws InvalidNameException { + for (char letter : name.toCharArray()) if (letter != '_') - return false; - return true; + return; + throw new InvalidNameException(Translatable.of("msg_err_name_validation_is_all_underscores", name)); } /** - * Is this name in our blacklist? - * If not a blacklist, call isValidName and - * return true if it is an invalid name. + * Stops escape characters being used, something that could harm mysql if things weren't sanitized. * - * @param name - Name to be checked for invalidity. - * @return true if this name is blacklist/invalid + * @param message String to validate. + * @throws InvalidNameException when escape characters are present. */ - public static boolean isBlacklistName(String name) { + private static void testForBadSymbols(String message) throws InvalidNameException { + if (message.contains("'") || message.contains("`")) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_contains_harmful_characters", message)); + } - // Max name length - if (name.length() > TownySettings.getMaxNameLength()) - return true; - - // Economy prefixes - if (name.equalsIgnoreCase(TownySettings.getNationAccountPrefix()) || name.equalsIgnoreCase(TownySettings.getTownAccountPrefix())) - return true; - - // A list of all banned names (notably all sub commands like 'spawn' used in '/town spawn') + /** + * Stops town and nation subcommands being used as town and nation names. + * + * @param name String to validate. + * @throws InvalidNameException thrown when a name is used as a subcommand. + */ + private static void testForSubcommand(String name) throws InvalidNameException { if (isBannedName(name)) - return true; - - // Config's name blacklist. - if (isConfigBlacklistedName(name)) - return true; + throw new InvalidNameException(Translatable.of("msg_err_name_validation_used_in_command_structure", name)); + } - // Finally, send it over to pass the regex test. - return !isValidName(name); + /** + * Is this name too long for the config, set at + * filters_colour_chat.modify_chat.max_name_length + * + * @param name String to check + * @throws InvalidNameException if the name is too long. + */ + private static void testNameLength(String name) throws InvalidNameException { + if (name.length() > TownySettings.getMaxNameLength()) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_name_too_long", name)); } - + /** - * Does this name not pass the config blacklist at plugin.name_blacklist - * @param name String name to check. - * @return true if this is something that isn't allowed in the config's name blacklist. + * Stops numbers in town and nation names, when these are disallowed. + * + * @param name String to validate. + * @throws InvalidNameException thrown when numbers aren't allowed and they are present. */ - public static boolean isConfigBlacklistedName(String name) { - if (name.isEmpty()) - return false; - - return TownySettings.getBlacklistedNames().stream().anyMatch(name::equalsIgnoreCase); + private static void testForNumbers(String name) throws InvalidNameException { + if (TownySettings.areNumbersAllowedInNationNames() && numberPattern.matcher(name).find()) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_contains_numbers", name)); } - + /** * Is this a valid name via getNameCheckRegex * * @param name - {@link String} containing a name from getNameCheckRegex * @return true if this name is valid. */ - public static boolean isValidName(String name) { - - // Characters that mysql might not like. - if (name.contains("'") || name.contains("`")) - return false; - + private static boolean isNameAllowedViaRegex(String name) { try { if (namePattern == null) namePattern = Pattern.compile(TownySettings.getNameCheckRegex(), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS); @@ -158,45 +347,75 @@ public static boolean isValidName(String name) { Towny.getPlugin().getLogger().log(Level.WARNING, "Failed to compile the name check regex pattern because it contains errors (" + TownySettings.getNameCheckRegex() + ")", e); return false; } - } - + /** - * Used in validating the strings saved for town and nation boards. + * Filters out characters that match the NameFilterRegex, NameRemoveRegex and + * the &k symbol. * - * @param message - String needing validation. - * @return approved message. + * @param input String to filter + * @return filtered String. */ - public static boolean isValidString(String message) { + private static String filterName(String input) { + return input.replaceAll(TownySettings.getNameFilterRegex(), "_").replaceAll(TownySettings.getNameRemoveRegex(), "").replace("&k", ""); + } + + /** + * Perform regex on all names passed and return the results. + * + * @param arr - Array of names + * @return string array of the filtered names. + */ + private static String[] filterNameArray(String[] arr) { - if (message.contains("'") || message.contains("`")) { - return false; - } + int count = 0; - try { - if (stringPattern == null) - stringPattern = Pattern.compile(TownySettings.getStringCheckRegex(), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS); - return stringPattern.matcher(message).find(); - } catch (PatternSyntaxException e) { - Towny.getPlugin().getLogger().log(Level.WARNING, "Failed to compile the string check regex pattern because it contains errors (" + TownySettings.getStringCheckRegex() + ")", e); - return false; + for (String word : arr) { + arr[count] = filterName(word); + count++; } - } - - public static String filterName(String input) { - return input.replaceAll(TownySettings.getNameFilterRegex(), "_").replaceAll(TownySettings.getNameRemoveRegex(), "").replace("&k", ""); + return arr; } - - public static String filterCommas(String input) { + + /** + * Used to sanitize commas from plot group names. + * + * @param input String to filter. + * @return filtered String with commas made into _'s + */ + private static String filterCommas(String input) { return input.replace(",", "_"); } - - public static boolean containsNumbers(String input) { - return numberPattern.matcher(input).find(); - } - + + /** + * Does this name match one of the bannedNames which are usually town and nation + * subcommands. + * + * @param name String to check. + * @return true if this is a banned name. + */ + @VisibleForTesting public static boolean isBannedName(String name) { return bannedNames.contains(name.toLowerCase(Locale.ROOT)); } + + /** + * Check and perform getNameCheckRegex on any town/nation names + * + * @param name - Town/Nation name {@link String} + * @return result of getNameCheckRegex + * @throws InvalidNameException if the name parsed is blacklisted + * @deprecated 0.100.1.10 use any of the other checkAndFilter methods found in this class. + */ + @Deprecated + public static String checkAndFilterName(String name) throws InvalidNameException { + + String out = filterName(name); + testForEmptyName(out); + testAllUnderscores(out); + testForImproperNameAndThrow(out); + + return out; + } } diff --git a/Towny/src/main/resources/lang/en-US.yml b/Towny/src/main/resources/lang/en-US.yml index 7743355894..dd135491e7 100644 --- a/Towny/src/main/resources/lang/en-US.yml +++ b/Towny/src/main/resources/lang/en-US.yml @@ -2431,4 +2431,26 @@ msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a to status_nation_sanctioned_towns: "Sanctioned Towns" -msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." \ No newline at end of file +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." + +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." + +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." + +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." + +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." + +msg_err_name_validation_name_too_long: "%s is too long to use as a name." + +msg_err_name_validation_is_empty: "You cannot supply an empty name." + +msg_err_name_validation_is_not_permitted: "%s is not permitted." + +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." + +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." + +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." + +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." \ No newline at end of file From 861c3b724b8f25f2e2b11c9dfa590db9b4ded754 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Mon, 12 Feb 2024 12:21:52 -0600 Subject: [PATCH 03/27] - Overhaul the NameValidation class. --- Towny/src/main/resources/ChangeLog.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index e56cfa3714..28c770a4c9 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9511,4 +9511,5 @@ v0.92.0.11: - Removes all of the invites which a town has sent. - Requires the towny.command.town.invite.add permission node to use (same node used for removing one by one.) - Cause trusted residents who have changed their names to auto-matically carry their trusted status in a town over, without a server restart required. - - Closes #7249. \ No newline at end of file + - Closes #7249. + - Overhaul the NameValidation class. \ No newline at end of file From e7442e6706219f121753ae694e8d541384449d3a Mon Sep 17 00:00:00 2001 From: LlmDl Date: Tue, 13 Feb 2024 07:36:17 -0600 Subject: [PATCH 04/27] - Add the towny.command.resident.jail to the nomad section of the townyperms.yml file, so that players without a town can pay bail if they're jailed. --- Towny/src/main/resources/ChangeLog.txt | 3 ++- Towny/src/main/resources/townyperms.yml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index 28c770a4c9..acb30f2fe1 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9512,4 +9512,5 @@ v0.92.0.11: - Requires the towny.command.town.invite.add permission node to use (same node used for removing one by one.) - Cause trusted residents who have changed their names to auto-matically carry their trusted status in a town over, without a server restart required. - Closes #7249. - - Overhaul the NameValidation class. \ No newline at end of file + - Overhaul the NameValidation class. + - Add the towny.command.resident.jail to the nomad section of the townyperms.yml file, so that players without a town can pay bail if they're jailed. \ No newline at end of file diff --git a/Towny/src/main/resources/townyperms.yml b/Towny/src/main/resources/townyperms.yml index 94cd817ba3..290fd2ef3d 100644 --- a/Towny/src/main/resources/townyperms.yml +++ b/Towny/src/main/resources/townyperms.yml @@ -28,6 +28,7 @@ nomad: - towny.chat.general - towny.command.towny.war.hud - towny.command.resident.set.about + - towny.command.resident.jail towns: default: From 05e72c67e920f3c24c5109a1127b4ff498fb3468 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Tue, 13 Feb 2024 14:10:03 -0600 Subject: [PATCH 05/27] - Bump com.github.seeseemelk:MockBukkit-v1.20 from 3.65.0 to 3.72.0. --- Towny/pom.xml | 2 +- Towny/src/main/resources/ChangeLog.txt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index 796679cf0f..a5e5b996d3 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -246,7 +246,7 @@ com.github.seeseemelk MockBukkit-v1.20 - 3.65.0 + 3.72.0 test diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index acb30f2fe1..fa49501881 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9513,4 +9513,5 @@ v0.92.0.11: - Cause trusted residents who have changed their names to auto-matically carry their trusted status in a town over, without a server restart required. - Closes #7249. - Overhaul the NameValidation class. - - Add the towny.command.resident.jail to the nomad section of the townyperms.yml file, so that players without a town can pay bail if they're jailed. \ No newline at end of file + - Add the towny.command.resident.jail to the nomad section of the townyperms.yml file, so that players without a town can pay bail if they're jailed. + - Bump com.github.seeseemelk:MockBukkit-v1.20 from 3.65.0 to 3.72.0. \ No newline at end of file From 72fae91243c215e38b0372c8b199206b9915556b Mon Sep 17 00:00:00 2001 From: LlmDl Date: Tue, 13 Feb 2024 14:20:35 -0600 Subject: [PATCH 06/27] Bump version number for pre-release. --- Towny/pom.xml | 2 +- Towny/src/main/resources/ChangeLog.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index a5e5b996d3..f8ff5828b9 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -13,7 +13,7 @@ towny jar - 0.100.1.11 + 0.100.1.12 diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index fa49501881..7a47c80c4e 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9510,6 +9510,7 @@ v0.92.0.11: - New Command: /town invite sent removeall - Removes all of the invites which a town has sent. - Requires the towny.command.town.invite.add permission node to use (same node used for removing one by one.) +0.100.1.12: - Cause trusted residents who have changed their names to auto-matically carry their trusted status in a town over, without a server restart required. - Closes #7249. - Overhaul the NameValidation class. From 22afa0d8286ec54a8f5a2214eee2802a3599d2f2 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Tue, 13 Feb 2024 17:53:15 -0600 Subject: [PATCH 07/27] - Fix NameValidation issues. --- Towny/pom.xml | 2 +- .../palmergames/bukkit/towny/command/NationCommand.java | 5 +++++ .../palmergames/bukkit/towny/command/TownCommand.java | 4 ++++ .../bukkit/towny/command/TownyAdminCommand.java | 4 ++++ .../java/com/palmergames/bukkit/util/NameValidation.java | 9 +-------- Towny/src/main/resources/ChangeLog.txt | 4 +++- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index f8ff5828b9..3086192bf0 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -13,7 +13,7 @@ towny jar - 0.100.1.12 + 0.100.1.13 diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java index b1abad608a..a9eafe3d0e 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java @@ -903,6 +903,8 @@ public static void newNation(CommandSender sender, String name, Town capitalTown throw new TownyException(Translatable.of("msg_err_already_nation")); String filteredName = NameValidation.checkAndFilterNationNameOrThrow(name); + if (TownyUniverse.getInstance().hasNation(filteredName)) + throw new TownyException(Translatable.of("msg_err_name_validation_name_already_in_use", filteredName)); BukkitTools.ifCancelledThenThrow(new PreNewNationEvent(capitalTown, filteredName)); @@ -2104,6 +2106,9 @@ private static void nationSetName(CommandSender sender, Nation nation, String[] String name = String.join("_", StringMgmt.remFirstArg(split)); name = NameValidation.checkAndFilterGovernmentNameOrThrow(name, nation); + if (TownyUniverse.getInstance().hasNation(name)) + throw new TownyException(Translatable.of("msg_err_name_validation_name_already_in_use", name)); + if (TownySettings.getTownAutomaticCapitalisationEnabled()) name = StringMgmt.capitalizeStrings(name); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java index 2958772e66..6bd23f1395 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java @@ -2129,6 +2129,8 @@ public static void townSetName(CommandSender sender, String[] split, Town town) if (TownySettings.getTownAutomaticCapitalisationEnabled()) name = StringMgmt.capitalizeStrings(name); name = NameValidation.checkAndFilterGovernmentNameOrThrow(name, town); + if (TownyUniverse.getInstance().hasTown(name)) + throw new TownyException(Translatable.of("msg_err_name_validation_name_already_in_use", name)); if(TownyEconomyHandler.isActive() && TownySettings.getTownRenameCost() > 0) { if (!town.getAccount().canPayFromHoldings(TownySettings.getTownRenameCost())) @@ -2466,6 +2468,8 @@ public static void newTown(Player player, String name, Resident resident, boolea name = StringMgmt.capitalizeStrings(name); name = NameValidation.checkAndFilterTownNameOrThrow(name); + if (TownyUniverse.getInstance().hasTown(name)) + throw new TownyException(Translatable.of("msg_err_name_validation_name_already_in_use", name)); if (resident.hasTown()) throw new TownyException(Translatable.of("msg_err_already_res", resident.getName())); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java index c63d6ecf43..ad407dc319 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java @@ -1225,6 +1225,8 @@ public void parseAdminTownCommand(CommandSender sender, String[] split) throws T if (split.length < 3) throw new TownyException(Translatable.of("msg_err_invalid_input", "/ta town TOWNNAME rename NEWNAME")); String name = NameValidation.checkAndFilterTownNameOrThrow(String.join("_", StringMgmt.remArgs(split, 2))); + if (TownyUniverse.getInstance().hasTown(name)) + throw new TownyException(Translatable.of("msg_err_name_validation_name_already_in_use", name)); BukkitTools.ifCancelledThenThrow(new TownPreRenameEvent(town, name)); townyUniverse.getDataSource().renameTown(town, name); TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_town_set_name", getSenderFormatted(sender), town.getName())); @@ -1674,6 +1676,8 @@ public void parseAdminNationCommand(CommandSender sender, String[] split) throws case "rename": checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_NATION_RENAME.getNode()); String name = NameValidation.checkAndFilterNationNameOrThrow(String.join("_", StringMgmt.remArgs(split, 2))); + if (TownyUniverse.getInstance().hasNation(name)) + throw new TownyException(Translatable.of("msg_err_name_validation_name_already_in_use", name)); BukkitTools.ifCancelledThenThrow(new NationPreRenameEvent(nation, name)); townyUniverse.getDataSource().renameNation(nation, name); TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_nation_set_name", getSenderFormatted(sender), nation.getName())); diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java index 6538d08351..36854dc020 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java +++ b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java @@ -2,7 +2,6 @@ import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.TownySettings; -import com.palmergames.bukkit.towny.TownyUniverse; import com.palmergames.bukkit.towny.exceptions.InvalidNameException; import com.palmergames.bukkit.towny.exceptions.TownyException; import com.palmergames.bukkit.towny.object.Government; @@ -81,9 +80,6 @@ public static String checkAndFilterTownNameOrThrow(String name) throws InvalidNa if (out.startsWith(TownySettings.getTownAccountPrefix())) throw new InvalidNameException(Translatable.of("msg_err_name_validation_begins_with_eco_prefix", out)); - if (TownyUniverse.getInstance().hasTown(out)) - throw new InvalidNameException(Translatable.of("msg_err_name_validation_name_already_in_use", out)); - return out; } @@ -108,9 +104,6 @@ public static String checkAndFilterNationNameOrThrow(String name) throws Invalid if (out.startsWith(TownySettings.getNationAccountPrefix())) throw new InvalidNameException(Translatable.of("msg_err_name_validation_begins_with_eco_prefix", out)); - if (TownyUniverse.getInstance().hasNation(out)) - throw new InvalidNameException(Translatable.of("msg_err_name_validation_name_already_in_use", out)); - return out; } @@ -328,7 +321,7 @@ private static void testNameLength(String name) throws InvalidNameException { * @throws InvalidNameException thrown when numbers aren't allowed and they are present. */ private static void testForNumbers(String name) throws InvalidNameException { - if (TownySettings.areNumbersAllowedInNationNames() && numberPattern.matcher(name).find()) + if (!TownySettings.areNumbersAllowedInNationNames() && numberPattern.matcher(name).find()) throw new InvalidNameException(Translatable.of("msg_err_name_validation_contains_numbers", name)); } diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index 7a47c80c4e..c8dbb91166 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9515,4 +9515,6 @@ v0.92.0.11: - Closes #7249. - Overhaul the NameValidation class. - Add the towny.command.resident.jail to the nomad section of the townyperms.yml file, so that players without a town can pay bail if they're jailed. - - Bump com.github.seeseemelk:MockBukkit-v1.20 from 3.65.0 to 3.72.0. \ No newline at end of file + - Bump com.github.seeseemelk:MockBukkit-v1.20 from 3.65.0 to 3.72.0. +0.100.1.13: + - Fix NameValidation issues. \ No newline at end of file From 5f7ea554c3d39d34c87064348af857ff122fe8ab Mon Sep 17 00:00:00 2001 From: LlmDl Date: Fri, 16 Feb 2024 11:10:09 -0600 Subject: [PATCH 08/27] - Fix missing feedback messages when a resident cannot pay their plot or town taxes. --- Towny/pom.xml | 2 +- .../com/palmergames/bukkit/towny/tasks/DailyTimerTask.java | 3 +++ Towny/src/main/resources/ChangeLog.txt | 4 +++- Towny/src/main/resources/lang/en-US.yml | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index 3086192bf0..fa0ad3a876 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -13,7 +13,7 @@ towny jar - 0.100.1.13 + 0.100.1.14 diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/DailyTimerTask.java b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/DailyTimerTask.java index aa82354091..1d626b51ba 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/DailyTimerTask.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/DailyTimerTask.java @@ -490,6 +490,8 @@ private boolean collectTownTaxFromResident(double tax, Resident resident, Town t taxCollected += tax; return true; } + + TownyMessaging.sendMsg(resident, Translatable.of("msg_you_couldnt_pay_town_tax", prettyMoney(tax), town.getFormattedName())); // remove this resident from the town, they cannot pay the town tax. resident.removeTown(); return false; @@ -564,6 +566,7 @@ private boolean collectPlotTaxFromResident(double tax, Resident resident, Town t return true; } + TownyMessaging.sendMsg(resident, Translatable.of("msg_you_couldnt_pay_plot_tax", prettyMoney(tax), townBlock.toString())); // Could not pay the plot tax, remove the resident from the plot. townBlock.removeResident(); diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index c8dbb91166..9c08f4f94a 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9517,4 +9517,6 @@ v0.92.0.11: - Add the towny.command.resident.jail to the nomad section of the townyperms.yml file, so that players without a town can pay bail if they're jailed. - Bump com.github.seeseemelk:MockBukkit-v1.20 from 3.65.0 to 3.72.0. 0.100.1.13: - - Fix NameValidation issues. \ No newline at end of file + - Fix NameValidation issues. +0.100.1.14: + - Fix missing feedback messages when a resident cannot pay their plot or town taxes. \ No newline at end of file diff --git a/Towny/src/main/resources/lang/en-US.yml b/Towny/src/main/resources/lang/en-US.yml index dd135491e7..54783c3235 100644 --- a/Towny/src/main/resources/lang/en-US.yml +++ b/Towny/src/main/resources/lang/en-US.yml @@ -497,6 +497,8 @@ msg_buy_resident_plot: '&b%s bought %s''s plot for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s couldn''t pay taxes and was kicked from the %s.' msg_couldnt_pay_plot_taxes: '&b%s couldn''t pay taxes and lost ownership of a plot.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPayed town tax of ' msg_payed_plot_cost: '&bPayed %s for %s plots in %s' msg_payed_resident_tax: '&bPayed resident tax of ' From 9edbcb5855dcd8a6c7f00110dc7c8f79aa2da7f0 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Fri, 16 Feb 2024 16:07:01 -0600 Subject: [PATCH 09/27] - Add log messages describing why a town was deleted when it was ruined for too long, and when the last resident leaves town. --- .../bukkit/towny/object/Resident.java | 4 +++- .../bukkit/towny/utils/TownRuinUtil.java | 18 +++++++++++------- Towny/src/main/resources/ChangeLog.txt | 3 ++- Towny/src/main/resources/lang/en-US.yml | 6 +++++- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/Resident.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/Resident.java index dc08709735..736b2674d4 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/Resident.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/Resident.java @@ -344,8 +344,10 @@ public void removeTown(boolean townDeleted) { try { town.removeResident(this); } catch (EmptyTownException e) { - if (!townDeleted) + if (!townDeleted) { + TownyMessaging.sendMsg(Translatable.of("msg_town_being_deleted_because_no_residents", town.getName())); TownyUniverse.getInstance().getDataSource().removeTown(town, false); + } } catch (NotRegisteredException ignored) {} try { diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java index 99cdd1d2b7..1aae02d79d 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.List; import java.util.ListIterator; +import java.util.stream.Collectors; /** @@ -217,8 +218,8 @@ private static void setMayor(Town town, Resident newMayor) { */ public static void evaluateRuinedTownRemovals() { TownyUniverse townyUniverse = TownyUniverse.getInstance(); - List towns = new ArrayList<>(townyUniverse.getTowns()); - ListIterator townItr = towns.listIterator(); + List ruinedTowns = new ArrayList<>(townyUniverse.getTowns().stream().filter(Town::isRuined).collect(Collectors.toList())); + ListIterator townItr = ruinedTowns.listIterator(); Town town; while (townItr.hasNext()) { @@ -228,15 +229,18 @@ public static void evaluateRuinedTownRemovals() { * exists. * We are running in an Async thread so MUST verify all objects. */ - if (town.exists() && town.isRuined() - && town.getRuinedTime() != 0 && getTimeSinceRuining(town) > TownySettings - .getTownRuinsMaxDurationHours()) { + if (town.exists() && hasRuinTimeExpired(town)) { //Ruin found & recently ruined end time reached. Delete town now. + TownyMessaging.sendMsg(Translatable.of("msg_ruined_town_being_deleted", town.getName(), TownySettings.getTownRuinsMaxDurationHours())); townyUniverse.getDataSource().removeTown(town, false); } } - } - + } + + private static boolean hasRuinTimeExpired(Town town ) { + return town.getRuinedTime() != 0 && getTimeSinceRuining(town) > TownySettings.getTownRuinsMaxDurationHours(); + } + public static int getTimeSinceRuining(Town town) { return TimeTools.getHours(System.currentTimeMillis() - town.getRuinedTime()); } diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index 9c08f4f94a..972f209e07 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9519,4 +9519,5 @@ v0.92.0.11: 0.100.1.13: - Fix NameValidation issues. 0.100.1.14: - - Fix missing feedback messages when a resident cannot pay their plot or town taxes. \ No newline at end of file + - Fix missing feedback messages when a resident cannot pay their plot or town taxes. + - Add log messages describing why a town was deleted when it was ruined for too long, and when the last resident leaves town. \ No newline at end of file diff --git a/Towny/src/main/resources/lang/en-US.yml b/Towny/src/main/resources/lang/en-US.yml index 54783c3235..baa57f929a 100644 --- a/Towny/src/main/resources/lang/en-US.yml +++ b/Towny/src/main/resources/lang/en-US.yml @@ -1457,6 +1457,8 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." + #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' @@ -2455,4 +2457,6 @@ msg_err_name_validation_contains_harmful_characters: "%s contains symbols that c msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." -msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." \ No newline at end of file +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." + +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." \ No newline at end of file From e3ac746ffd2a930f411b0bfe2e50089c753a01b3 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Sat, 17 Feb 2024 16:42:34 +0100 Subject: [PATCH 10/27] Fix comod error when removing all sent invites (#7254) --- .../com/palmergames/bukkit/towny/command/TownCommand.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java index 6bd23f1395..6051ad654c 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java @@ -819,7 +819,10 @@ private void listTownSentInvites(Player player, String[] args, Resident resident private void removeAllTownSentInvites(Resident resident, Player player) throws TownyException { checkPermOrThrow(player, PermissionNodes.TOWNY_COMMAND_TOWN_INVITE_ADD.getNode()); - resident.getTown().getSentInvites().forEach(i -> i.decline(true)); + + for (final Invite invite : new ArrayList<>(resident.getTown().getSentInvites())) + invite.decline(true); + TownyMessaging.sendMessage(player, Translatable.of("msg_all_of_your_towns_sent_invites_have_been_cancelled")); } From f61cb5945e2f6cde0b9b12c3d443cf35900b8c70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 09:43:33 -0600 Subject: [PATCH 11/27] Bump org.junit.jupiter:junit-jupiter-api from 5.10.1 to 5.10.2 (#7231) Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit5) from 5.10.1 to 5.10.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.1...r5.10.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Towny/pom.xml | 1032 ++++++++++++++++++++++++------------------------- 1 file changed, 516 insertions(+), 516 deletions(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index fa0ad3a876..6af17af580 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -1,516 +1,516 @@ - - - 4.0.0 - - - com.palmergames.bukkit.towny - towny-parent - ../pom.xml - 1.0.0 - - - towny - jar - 0.100.1.14 - - - - CC BY-NC-ND 3.0 - https://creativecommons.org/licenses/by-nc-nd/3.0/ - Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported - repo - - - - - TownyAdvanced - https://github.com/TownyAdvanced - - - - 17 - 1.16 - true - - - - scm:git:https://github.com/TownyAdvanced/Towny.git - scm:git:https://github.com/TownyAdvanced/Towny.git - https://github.com/TownyAdvanced/Towny - - - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - papermc - https://repo.papermc.io/repository/maven-public/ - - - jitpack.io - https://jitpack.io - - - tne-repo - https://repo.codemc.io/repository/maven-public/ - - - placeholderapi - https://repo.extendedclip.com/content/repositories/placeholderapi/ - - - sonatype-oss-snapshots - https://s01.oss.sonatype.org/content/repositories/snapshots/ - - - central - https://repo1.maven.org/maven2 - - - playpro-repo - https://maven.playpro.com - - - - - - org.spigotmc - spigot-api - 1.20.4-R0.1-SNAPSHOT - provided - - - io.papermc - paperlib - 1.0.8 - compile - - - com.zaxxer - HikariCP - 5.1.0 - compile - - - net.tnemc - Reserve - 0.1.5.4 - provided - - - net.tnemc - TheNewChat - 1.5.1.0 - provided - - - com.github.MilkBowl - VaultAPI - 1.7.1 - provided - - - org.bukkit - bukkit - - - - - com.github.ElgarL - groupmanager - 3.2 - provided - - - - org.apache.logging.log4j - log4j-core - 2.22.1 - provided - - - me.clip - placeholderapi - 2.11.5 - provided - - - - org.apache.commons - commons-compress - 1.25.0 - - - org.apache.commons - commons-text - 1.11.0 - - - org.jetbrains - annotations - provided - - - net.kyori - adventure-platform-bukkit - 4.3.2 - - - net.kyori - adventure-text-serializer-plain - 4.15.0 - - - net.kyori - adventure-text-minimessage - 4.15.0 - - - org.bstats - bstats-bukkit - 3.0.2 - compile - - - net.luckperms - api - 5.4 - provided - - - com.github.bsideup.jabel - jabel-javac-plugin - 1.0.0 - provided - - - solar.squares - pixel-width-core - 1.1.0 - - - com.palmergames.bukkit.towny - towny-folia-provider - 1.0.0 - - - * - * - - - - - com.palmergames.bukkit.towny - towny-paper-provider - 1.0.0 - - - * - * - - - - - com.palmergames.bukkit.towny - towny-base-providers - 1.0.0 - - - * - * - - - - - org.junit.jupiter - junit-jupiter - 5.10.1 - test - - - org.junit.jupiter - junit-jupiter-api - 5.10.1 - test - - - net.coreprotect - coreprotect - 22.3 - provided - - - com.github.seeseemelk - MockBukkit-v1.20 - 3.72.0 - test - - - - - apache.snapshots - https://repository.apache.org/snapshots/ - - - jitpack - https://jitpack.io - - - - - clean package - - - org.apache.maven.plugins - maven-compiler-plugin - 3.12.1 - - 8 - ${java.version} - ${java.version} - - -Xplugin:jabel - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.6.3 - - - install - install - - jar - - - - deploy - deploy - - jar - - - - - 16 - all,-missing - Towny - ${project.version} - - - Events - com.palmergames.bukkit.towny.event* - - - Objects - com.palmergames.bukkit.towny.object* - - - Tasks - com.palmergames.bukkit.towny.regen*:com.palmergames.bukkit.towny.tasks - - - Plugin - com.palmergames.bukkit.towny.command*:com.palmergames.bukkit.towny.listeners*:com.palmergames.bukkit.towny:com.palmergames.bukkit.config*:com.palmergames.bukkit.towny.db* - - - Player - com.palmergames.bukkit.towny.confirmations:com.palmergames.bukkit.towny.invites:com.palmergames.bukkit.towny.conversation:com.palmergames.bukkit.towny.huds - - - Hooks - com.palmergames.bukkit.towny.permissions:com.palmergames.bukkit.towny.hooks:com.palmergames.bukkit.towny.chat* - - - Exceptions - com.palmergames.bukkit.towny.exceptions*:com.palmergames.bukkit.towny.invites.exceptions - - - Utilities - com.palmergames.annotations:com.palmergames.util:com.palmergames.bukkit.util:com.palmergames.bukkit.towny.utils - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.3.0 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.5.1 - - ${project.build.directory}/dependency-reduced-pom.xml - - - net.kyori:adventure-platform-bukkit - net.kyori:adventure-platform-api - net.kyori:adventure-api - net.kyori:adventure-text-serializer-craftbukkit - net.kyori:adventure-platform-facet - net.kyori:adventure-text-serializer-gson - net.kyori:adventure-text-serializer-legacy - net.kyori:adventure-key - net.kyori:adventure-text-serializer-gson-legacy-impl - net.kyori:adventure-text-serializer-bungeecord - net.kyori:adventure-platform-viaversion - net.kyori:adventure-nbt - net.kyori:examination-api - net.kyori:examination-string - net.kyori:adventure-text-serializer-plain - net.kyori:adventure-text-minimessage - com.zaxxer:HikariCP - io.papermc:paperlib - org.apache.commons:commons-compress - org.apache.commons:commons-text - org.bstats:bstats-bukkit - org.bstats:bstats-base - org.json:json - solar.squares:pixel-width-core - com.palmergames.bukkit.towny:towny-base-providers - com.palmergames.bukkit.towny:towny-folia-provider - com.palmergames.bukkit.towny:towny-paper-provider - - - - - io.papermc.lib - com.palmergames.paperlib - - - com.zaxxer.hikari - com.palmergames.hikaricp - - - org.apache.commons.compress - com.palmergames.compress - - - org.apache.commons.text - com.palmergames.text - - - net.kyori.adventure - com.palmergames.adventure - - - net.kyori.examination - com.palmergames.examination - - - org.bstats - com.palmergames.bukkit.metrics - - - solar.squares.pixelwidth - com.palmergames.bukkit.towny.libs.pixelwidth - - - - - *:* - - META-INF/*.MF - - - - net.kyori:* - META-INF/versions/9/module-info.class - - - true - - - - package - - shade - - - - - - com.github.TownyAdvanced - bridger - 1.7.1.Final - - - - weave - process-classes - - transform - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.2.5 - - ${skipTests} - - - - - - src/main/resources - true - - - - - - - test - - - maven.test.skip - false - - - - false - - - - - intellij-idea-only - - - idea.maven.embedder.version - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - - --enable-preview - - - - - - - - + + + 4.0.0 + + + com.palmergames.bukkit.towny + towny-parent + ../pom.xml + 1.0.0 + + + towny + jar + 0.100.1.14 + + + + CC BY-NC-ND 3.0 + https://creativecommons.org/licenses/by-nc-nd/3.0/ + Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported + repo + + + + + TownyAdvanced + https://github.com/TownyAdvanced + + + + 17 + 1.16 + true + + + + scm:git:https://github.com/TownyAdvanced/Towny.git + scm:git:https://github.com/TownyAdvanced/Towny.git + https://github.com/TownyAdvanced/Towny + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + papermc + https://repo.papermc.io/repository/maven-public/ + + + jitpack.io + https://jitpack.io + + + tne-repo + https://repo.codemc.io/repository/maven-public/ + + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + + + sonatype-oss-snapshots + https://s01.oss.sonatype.org/content/repositories/snapshots/ + + + central + https://repo1.maven.org/maven2 + + + playpro-repo + https://maven.playpro.com + + + + + + org.spigotmc + spigot-api + 1.20.4-R0.1-SNAPSHOT + provided + + + io.papermc + paperlib + 1.0.8 + compile + + + com.zaxxer + HikariCP + 5.1.0 + compile + + + net.tnemc + Reserve + 0.1.5.4 + provided + + + net.tnemc + TheNewChat + 1.5.1.0 + provided + + + com.github.MilkBowl + VaultAPI + 1.7.1 + provided + + + org.bukkit + bukkit + + + + + com.github.ElgarL + groupmanager + 3.2 + provided + + + + org.apache.logging.log4j + log4j-core + 2.22.1 + provided + + + me.clip + placeholderapi + 2.11.5 + provided + + + + org.apache.commons + commons-compress + 1.25.0 + + + org.apache.commons + commons-text + 1.11.0 + + + org.jetbrains + annotations + provided + + + net.kyori + adventure-platform-bukkit + 4.3.2 + + + net.kyori + adventure-text-serializer-plain + 4.15.0 + + + net.kyori + adventure-text-minimessage + 4.15.0 + + + org.bstats + bstats-bukkit + 3.0.2 + compile + + + net.luckperms + api + 5.4 + provided + + + com.github.bsideup.jabel + jabel-javac-plugin + 1.0.0 + provided + + + solar.squares + pixel-width-core + 1.1.0 + + + com.palmergames.bukkit.towny + towny-folia-provider + 1.0.0 + + + * + * + + + + + com.palmergames.bukkit.towny + towny-paper-provider + 1.0.0 + + + * + * + + + + + com.palmergames.bukkit.towny + towny-base-providers + 1.0.0 + + + * + * + + + + + org.junit.jupiter + junit-jupiter + 5.10.1 + test + + + org.junit.jupiter + junit-jupiter-api + 5.10.2 + test + + + net.coreprotect + coreprotect + 22.3 + provided + + + com.github.seeseemelk + MockBukkit-v1.20 + 3.72.0 + test + + + + + apache.snapshots + https://repository.apache.org/snapshots/ + + + jitpack + https://jitpack.io + + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.12.1 + + 8 + ${java.version} + ${java.version} + + -Xplugin:jabel + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + install + install + + jar + + + + deploy + deploy + + jar + + + + + 16 + all,-missing + Towny - ${project.version} + + + Events + com.palmergames.bukkit.towny.event* + + + Objects + com.palmergames.bukkit.towny.object* + + + Tasks + com.palmergames.bukkit.towny.regen*:com.palmergames.bukkit.towny.tasks + + + Plugin + com.palmergames.bukkit.towny.command*:com.palmergames.bukkit.towny.listeners*:com.palmergames.bukkit.towny:com.palmergames.bukkit.config*:com.palmergames.bukkit.towny.db* + + + Player + com.palmergames.bukkit.towny.confirmations:com.palmergames.bukkit.towny.invites:com.palmergames.bukkit.towny.conversation:com.palmergames.bukkit.towny.huds + + + Hooks + com.palmergames.bukkit.towny.permissions:com.palmergames.bukkit.towny.hooks:com.palmergames.bukkit.towny.chat* + + + Exceptions + com.palmergames.bukkit.towny.exceptions*:com.palmergames.bukkit.towny.invites.exceptions + + + Utilities + com.palmergames.annotations:com.palmergames.util:com.palmergames.bukkit.util:com.palmergames.bukkit.towny.utils + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.3.0 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.1 + + ${project.build.directory}/dependency-reduced-pom.xml + + + net.kyori:adventure-platform-bukkit + net.kyori:adventure-platform-api + net.kyori:adventure-api + net.kyori:adventure-text-serializer-craftbukkit + net.kyori:adventure-platform-facet + net.kyori:adventure-text-serializer-gson + net.kyori:adventure-text-serializer-legacy + net.kyori:adventure-key + net.kyori:adventure-text-serializer-gson-legacy-impl + net.kyori:adventure-text-serializer-bungeecord + net.kyori:adventure-platform-viaversion + net.kyori:adventure-nbt + net.kyori:examination-api + net.kyori:examination-string + net.kyori:adventure-text-serializer-plain + net.kyori:adventure-text-minimessage + com.zaxxer:HikariCP + io.papermc:paperlib + org.apache.commons:commons-compress + org.apache.commons:commons-text + org.bstats:bstats-bukkit + org.bstats:bstats-base + org.json:json + solar.squares:pixel-width-core + com.palmergames.bukkit.towny:towny-base-providers + com.palmergames.bukkit.towny:towny-folia-provider + com.palmergames.bukkit.towny:towny-paper-provider + + + + + io.papermc.lib + com.palmergames.paperlib + + + com.zaxxer.hikari + com.palmergames.hikaricp + + + org.apache.commons.compress + com.palmergames.compress + + + org.apache.commons.text + com.palmergames.text + + + net.kyori.adventure + com.palmergames.adventure + + + net.kyori.examination + com.palmergames.examination + + + org.bstats + com.palmergames.bukkit.metrics + + + solar.squares.pixelwidth + com.palmergames.bukkit.towny.libs.pixelwidth + + + + + *:* + + META-INF/*.MF + + + + net.kyori:* + META-INF/versions/9/module-info.class + + + true + + + + package + + shade + + + + + + com.github.TownyAdvanced + bridger + 1.7.1.Final + + + + weave + process-classes + + transform + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + ${skipTests} + + + + + + src/main/resources + true + + + + + + + test + + + maven.test.skip + false + + + + false + + + + + intellij-idea-only + + + idea.maven.embedder.version + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + + --enable-preview + + + + + + + + From 4f44b6a298086defe2d5f7fb90133f834998af59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 09:45:03 -0600 Subject: [PATCH 12/27] Bump org.junit.jupiter:junit-jupiter from 5.10.1 to 5.10.2 (#7233) Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.1 to 5.10.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.1...r5.10.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Towny/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index 6af17af580..71decf7674 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -228,7 +228,7 @@ org.junit.jupiter junit-jupiter - 5.10.1 + 5.10.2 test From 9edf15abdbcb257c41c9fa678f8e8aa2c77f1c63 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Sat, 17 Feb 2024 09:45:25 -0600 Subject: [PATCH 13/27] New Crowdin updates (#7242) * Update source file en-US.yml * New translations en-us.yml (Chinese Simplified) * New translations en-us.yml (German) * New translations en-us.yml (Romanian) * New translations en-us.yml (French) * New translations en-us.yml (Spanish) * New translations en-us.yml (Bulgarian) * New translations en-us.yml (Czech) * New translations en-us.yml (Danish) * New translations en-us.yml (Hebrew) * New translations en-us.yml (Italian) * New translations en-us.yml (Japanese) * New translations en-us.yml (Korean) * New translations en-us.yml (Lithuanian) * New translations en-us.yml (Dutch) * New translations en-us.yml (Norwegian) * New translations en-us.yml (Polish) * New translations en-us.yml (Portuguese) * New translations en-us.yml (Russian) * New translations en-us.yml (Albanian) * New translations en-us.yml (Swedish) * New translations en-us.yml (Turkish) * New translations en-us.yml (Ukrainian) * New translations en-us.yml (Chinese Traditional) * New translations en-us.yml (Vietnamese) * New translations en-us.yml (Portuguese, Brazilian) * New translations en-us.yml (Indonesian) * New translations en-us.yml (Spanish, Argentina) * New translations en-us.yml (Spanish, Chile) * New translations en-us.yml (Spanish, Mexico) * New translations en-us.yml (Spanish, Uruguay) * New translations en-us.yml (Spanish, Venezuela) * New translations en-us.yml (Spanish, Ecuador) * New translations en-us.yml (Thai) * New translations en-us.yml (Azerbaijani) * New translations en-us.yml (English, United Kingdom) * New translations en-us.yml (Tagalog) * New translations en-us.yml (Pirate English) * New translations en-us.yml (Serbian (Latin)) * New translations en-us.yml (English (upside down)) * New translations en-us.yml (LOLCAT) * New translations en-us.yml (Classical Chinese) * New translations en-us.yml (Vietnamese) * New translations en-us.yml (Vietnamese) * New translations en-us.yml (Classical Chinese) * New translations en-us.yml (Portuguese, Brazilian) * Update source file en-US.yml * New translations en-us.yml (Chinese Simplified) * New translations en-us.yml (German) * New translations en-us.yml (Romanian) * New translations en-us.yml (French) * New translations en-us.yml (Spanish) * New translations en-us.yml (Bulgarian) * New translations en-us.yml (Czech) * New translations en-us.yml (Danish) * New translations en-us.yml (Hebrew) * New translations en-us.yml (Italian) * New translations en-us.yml (Japanese) * New translations en-us.yml (Korean) * New translations en-us.yml (Lithuanian) * New translations en-us.yml (Dutch) * New translations en-us.yml (Norwegian) * New translations en-us.yml (Polish) * New translations en-us.yml (Portuguese) * New translations en-us.yml (Russian) * New translations en-us.yml (Albanian) * New translations en-us.yml (Swedish) * New translations en-us.yml (Turkish) * New translations en-us.yml (Ukrainian) * New translations en-us.yml (Chinese Traditional) * New translations en-us.yml (Vietnamese) * New translations en-us.yml (Portuguese, Brazilian) * New translations en-us.yml (Indonesian) * New translations en-us.yml (Spanish, Argentina) * New translations en-us.yml (Spanish, Chile) * New translations en-us.yml (Spanish, Mexico) * New translations en-us.yml (Spanish, Uruguay) * New translations en-us.yml (Spanish, Venezuela) * New translations en-us.yml (Spanish, Ecuador) * New translations en-us.yml (Thai) * New translations en-us.yml (Azerbaijani) * New translations en-us.yml (English, United Kingdom) * New translations en-us.yml (Tagalog) * New translations en-us.yml (Pirate English) * New translations en-us.yml (Serbian (Latin)) * New translations en-us.yml (English (upside down)) * New translations en-us.yml (LOLCAT) * New translations en-us.yml (Classical Chinese) * New translations en-us.yml (Spanish) * New translations en-us.yml (Spanish, Chile) * New translations en-us.yml (Chinese Simplified) * New translations en-us.yml (French) * New translations en-us.yml (Spanish, Chile) * New translations en-us.yml (Ukrainian) * New translations en-us.yml (Spanish, Chile) * New translations en-us.yml (Spanish, Chile) * Update source file en-US.yml * New translations en-us.yml (Chinese Simplified) * New translations en-us.yml (German) * New translations en-us.yml (Romanian) * New translations en-us.yml (French) * New translations en-us.yml (Spanish) * New translations en-us.yml (Bulgarian) * New translations en-us.yml (Czech) * New translations en-us.yml (Danish) * New translations en-us.yml (Hebrew) * New translations en-us.yml (Italian) * New translations en-us.yml (Japanese) * New translations en-us.yml (Korean) * New translations en-us.yml (Lithuanian) * New translations en-us.yml (Dutch) * New translations en-us.yml (Norwegian) * New translations en-us.yml (Polish) * New translations en-us.yml (Portuguese) * New translations en-us.yml (Russian) * New translations en-us.yml (Albanian) * New translations en-us.yml (Swedish) * New translations en-us.yml (Turkish) * New translations en-us.yml (Ukrainian) * New translations en-us.yml (Chinese Traditional) * New translations en-us.yml (Vietnamese) * New translations en-us.yml (Portuguese, Brazilian) * New translations en-us.yml (Indonesian) * New translations en-us.yml (Spanish, Argentina) * New translations en-us.yml (Spanish, Chile) * New translations en-us.yml (Spanish, Mexico) * New translations en-us.yml (Spanish, Uruguay) * New translations en-us.yml (Spanish, Venezuela) * New translations en-us.yml (Spanish, Ecuador) * New translations en-us.yml (Thai) * New translations en-us.yml (Azerbaijani) * New translations en-us.yml (English, United Kingdom) * New translations en-us.yml (Tagalog) * New translations en-us.yml (Pirate English) * New translations en-us.yml (Serbian (Latin)) * New translations en-us.yml (English (upside down)) * New translations en-us.yml (LOLCAT) * New translations en-us.yml (Classical Chinese) * Update source file en-US.yml * New translations en-us.yml (Chinese Simplified) * New translations en-us.yml (German) * New translations en-us.yml (Romanian) * New translations en-us.yml (French) * New translations en-us.yml (Spanish) * New translations en-us.yml (Bulgarian) * New translations en-us.yml (Czech) * New translations en-us.yml (Danish) * New translations en-us.yml (Hebrew) * New translations en-us.yml (Italian) * New translations en-us.yml (Japanese) * New translations en-us.yml (Korean) * New translations en-us.yml (Lithuanian) * New translations en-us.yml (Dutch) * New translations en-us.yml (Norwegian) * New translations en-us.yml (Polish) * New translations en-us.yml (Portuguese) * New translations en-us.yml (Russian) * New translations en-us.yml (Albanian) * New translations en-us.yml (Swedish) * New translations en-us.yml (Turkish) * New translations en-us.yml (Ukrainian) * New translations en-us.yml (Chinese Traditional) * New translations en-us.yml (Vietnamese) * New translations en-us.yml (Portuguese, Brazilian) * New translations en-us.yml (Indonesian) * New translations en-us.yml (Spanish, Argentina) * New translations en-us.yml (Spanish, Chile) * New translations en-us.yml (Spanish, Mexico) * New translations en-us.yml (Spanish, Uruguay) * New translations en-us.yml (Spanish, Venezuela) * New translations en-us.yml (Spanish, Ecuador) * New translations en-us.yml (Thai) * New translations en-us.yml (Azerbaijani) * New translations en-us.yml (English, United Kingdom) * New translations en-us.yml (Tagalog) * New translations en-us.yml (Pirate English) * New translations en-us.yml (Serbian (Latin)) * New translations en-us.yml (English (upside down)) * New translations en-us.yml (LOLCAT) * New translations en-us.yml (Classical Chinese) * New translations en-us.yml (Korean) --- Towny/src/main/resources/lang/az-AZ.yml | 17 ++ Towny/src/main/resources/lang/bg-BG.yml | 17 ++ Towny/src/main/resources/lang/cs-CZ.yml | 17 ++ Towny/src/main/resources/lang/da-DK.yml | 17 ++ Towny/src/main/resources/lang/de-DE.yml | 17 ++ Towny/src/main/resources/lang/en-GB.yml | 17 ++ Towny/src/main/resources/lang/en-PT.yml | 17 ++ Towny/src/main/resources/lang/en-UD.yml | 17 ++ Towny/src/main/resources/lang/es-AR.yml | 29 +- Towny/src/main/resources/lang/es-CL.yml | 361 ++++++++++++----------- Towny/src/main/resources/lang/es-EC.yml | 29 +- Towny/src/main/resources/lang/es-ES.yml | 29 +- Towny/src/main/resources/lang/es-MX.yml | 29 +- Towny/src/main/resources/lang/es-UY.yml | 29 +- Towny/src/main/resources/lang/es-VE.yml | 29 +- Towny/src/main/resources/lang/fr-FR.yml | 103 ++++--- Towny/src/main/resources/lang/he-IL.yml | 17 ++ Towny/src/main/resources/lang/id-ID.yml | 17 ++ Towny/src/main/resources/lang/it-IT.yml | 17 ++ Towny/src/main/resources/lang/ja-JP.yml | 17 ++ Towny/src/main/resources/lang/ko-KR.yml | 45 ++- Towny/src/main/resources/lang/lol-US.yml | 17 ++ Towny/src/main/resources/lang/lt-LT.yml | 17 ++ Towny/src/main/resources/lang/lzh.yml | 27 +- Towny/src/main/resources/lang/nl-NL.yml | 17 ++ Towny/src/main/resources/lang/no-NO.yml | 17 ++ Towny/src/main/resources/lang/pl-PL.yml | 17 ++ Towny/src/main/resources/lang/pt-BR.yml | 19 +- Towny/src/main/resources/lang/pt-PT.yml | 17 ++ Towny/src/main/resources/lang/ro-RO.yml | 17 ++ Towny/src/main/resources/lang/ru-RU.yml | 17 ++ Towny/src/main/resources/lang/sq-AL.yml | 17 ++ Towny/src/main/resources/lang/sr-CS.yml | 17 ++ Towny/src/main/resources/lang/sv-SE.yml | 17 ++ Towny/src/main/resources/lang/th-TH.yml | 17 ++ Towny/src/main/resources/lang/tl-PH.yml | 17 ++ Towny/src/main/resources/lang/tr-TR.yml | 17 ++ Towny/src/main/resources/lang/uk-UA.yml | 19 +- Towny/src/main/resources/lang/vi-VN.yml | 281 +++++++++--------- Towny/src/main/resources/lang/zh-CN.yml | 23 +- Towny/src/main/resources/lang/zh-TW.yml | 17 ++ 41 files changed, 1104 insertions(+), 407 deletions(-) diff --git a/Towny/src/main/resources/lang/az-AZ.yml b/Towny/src/main/resources/lang/az-AZ.yml index 13e1482ddf..70138eb831 100644 --- a/Towny/src/main/resources/lang/az-AZ.yml +++ b/Towny/src/main/resources/lang/az-AZ.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s, %s üçün %s sahəsini alıb!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s vergi ödəyə bilmədi və %s tərəfindən qovuldu.' msg_couldnt_pay_plot_taxes: '&b%s vergi ödəyə bilmədi və bir sahəsini itirdi.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bÖdənilmiş şəhər vergisi ' msg_payed_plot_cost: '&b%s içindəki %s parsellər üçün %s ödəndi' msg_payed_resident_tax: '&bÖdənilmiş şəhər vergisi ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/bg-BG.yml b/Towny/src/main/resources/lang/bg-BG.yml index 33f14f6eaf..780bcda2a5 100644 --- a/Towny/src/main/resources/lang/bg-BG.yml +++ b/Towny/src/main/resources/lang/bg-BG.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s закупи площта на %s за %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s не можа да плати данъците и беше изритан от %s.' msg_couldnt_pay_plot_taxes: '&b%s не можа да плати данъците и загуби своя парцел.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bПлати градски данък от ' msg_payed_plot_cost: '&b Плати %s за %s парцели в %s' msg_payed_resident_tax: '&bПлати граждански данък от ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/cs-CZ.yml b/Towny/src/main/resources/lang/cs-CZ.yml index 79589894d8..f6b6e61bff 100644 --- a/Towny/src/main/resources/lang/cs-CZ.yml +++ b/Towny/src/main/resources/lang/cs-CZ.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s koupil od %s parcelu za %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s neměl/a na zaplacení daní a není už součástí sídla %s.' msg_couldnt_pay_plot_taxes: '&b%s neměl/a na zaplacení daní a již nevlastní parcelu.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bZaplacena městká daň ' msg_payed_plot_cost: '&bZaplaceno %s za %s parcel v sídle %s' msg_payed_resident_tax: '&bZaplacena obyvatelská daň ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Zobrazí všechny pozvánky, které jsi odeslal' town_invite_help_4: 'Zobrazí všechny pozvánky, které jsi obdržel' town_invite_help_5: 'Přijme žádost o připojení se k národu' town_invite_help_6: 'Odmítne žádost o připojení se k národu' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Pozve město k tvému národu' nation_invite_help_2: 'Zruší pozvánku, která byla odeslána městu' nation_invite_help_3: 'Zobrazí všechny pozvánky, odeslané městům' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/da-DK.yml b/Towny/src/main/resources/lang/da-DK.yml index db2afdbf61..45288fe1c2 100644 --- a/Towny/src/main/resources/lang/da-DK.yml +++ b/Towny/src/main/resources/lang/da-DK.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s købte %s''s grund for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s kunne ikke betale skat og blev smidt ud af %s.' msg_couldnt_pay_plot_taxes: '&b%s kunne ikke betale skat og mistede ejerskab af en grund.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bBetalte byskat på ' msg_payed_plot_cost: '&bBetalte %s for %s grunde i %s' msg_payed_resident_tax: '&bBetalte indbygger skat på ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Vis liste over alle dine sendte invitationer' town_invite_help_4: 'Vis liste over alle invitationer, du har modtaget' town_invite_help_5: 'Acceptér en anmodning om at tilslutte sig en nation' town_invite_help_6: 'Afslå en anmodning om at tilslutte sig en nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invitér en by til din nation' nation_invite_help_2: 'Tilbagekald en invitation, der blev sendt til en by' nation_invite_help_3: 'Vis liste over alle invitation sendt til byer' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cDin by ligger i ruiner i yd msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cByneutralitet/fredelighed er nu %s.' msg_err_town_unclaim_canceled: '&cOpgivelse af krav annulleret. Du kan ikke opgive krav på dette område på dette tidspunkt.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/de-DE.yml b/Towny/src/main/resources/lang/de-DE.yml index a14e6bf57f..f0152ac9e2 100644 --- a/Towny/src/main/resources/lang/de-DE.yml +++ b/Towny/src/main/resources/lang/de-DE.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s kaufte %s'' Grundstück für %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s konnte die Steuern nicht bezahlen und wurde deshalb aus %s rausgeschmissen.' msg_couldnt_pay_plot_taxes: '&b%s konnte die Steuern für die Plots nicht bezahlen und verliert den Anspruch auf ein Grundstück.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bSteuern wurden bezahlt an ' msg_payed_plot_cost: '&b %s bezahlte %s für Grundstücke in %s' msg_payed_resident_tax: '&b bezahlte die Bürgersteuer für ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Listet all deine gesendeten Einladungen' town_invite_help_4: 'Eine Liste aller erhaltenen Einladungen aufrufen' town_invite_help_5: 'Die Einladung, einer Nation beizutreten, annehmen' town_invite_help_6: 'Die Einladung, einer Nation beizutreten, ablehnen' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Eine Stadt in deine Nation einladen' nation_invite_help_2: 'Wiederrufe eine Einladung, die an eine Stadt gesendet wurde' nation_invite_help_3: 'Listet aller Einladungen an Städte' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cDeine Stadt liegt noch %d S msg_time_remaining_before_full_removal: 'Verbleibende Zeit vor vollständiger Entfernung: %d Stunden.' msg_time_until_reclaim_available: 'Zeit bis zur Wiederherstellung verfügbar: %d Stunden.' msg_reclaim_available: 'Reclaim verfügbar.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cStädtische Neutralität/Friedlichkeit ist jetzt %s.' msg_err_town_unclaim_canceled: '&cUnbeansprucht abgebrochen. Du kannst diesen Bereich derzeit nicht freigeben.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/en-GB.yml b/Towny/src/main/resources/lang/en-GB.yml index a2f73ff34a..0601c2969d 100644 --- a/Towny/src/main/resources/lang/en-GB.yml +++ b/Towny/src/main/resources/lang/en-GB.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s bought %s''s plot for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s couldn''t pay taxes and was kicked from the %s.' msg_couldnt_pay_plot_taxes: '&b%s couldn''t pay taxes and lost ownership of a plot.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPayed town tax of ' msg_payed_plot_cost: '&bPayed %s for %s plots in %s' msg_payed_resident_tax: '&bPayed resident tax of ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/en-PT.yml b/Towny/src/main/resources/lang/en-PT.yml index d3bb18dd39..5bd3b6df75 100644 --- a/Towny/src/main/resources/lang/en-PT.yml +++ b/Towny/src/main/resources/lang/en-PT.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s bought %s''s plot for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s couldn''t pay taxes and was kicked from the %s.' msg_couldnt_pay_plot_taxes: '&b%s couldn''t pay taxes and lost ownership of a plot.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPayed town tax of ' msg_payed_plot_cost: '&bPayed %s for %s plots in %s' msg_payed_resident_tax: '&bPayed resident tax of ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/en-UD.yml b/Towny/src/main/resources/lang/en-UD.yml index f6e3e7af0f..7cc7bdffcc 100644 --- a/Towny/src/main/resources/lang/en-UD.yml +++ b/Towny/src/main/resources/lang/en-UD.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s bought %s''s plot for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s couldn''t pay taxes and was kicked from the %s.' msg_couldnt_pay_plot_taxes: '&b%s couldn''t pay taxes and lost ownership of a plot.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPayed town tax of ' msg_payed_plot_cost: '&bPayed %s for %s plots in %s' msg_payed_resident_tax: '&bPayed resident tax of ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/es-AR.yml b/Towny/src/main/resources/lang/es-AR.yml index 3ce4b5f3bc..80696547d0 100644 --- a/Towny/src/main/resources/lang/es-AR.yml +++ b/Towny/src/main/resources/lang/es-AR.yml @@ -45,12 +45,12 @@ help_0: 'Ayuda General sobre Towny' help_1: 'Prueba los siguientes comandos para aprender más sobre towny.' help_2: 'Chat de la Ciudad' help_3: 'Chat de la Nación' -help_4: 'Resident command help.' -help_5: 'Town command help.' -help_6: 'Nation command help.' -help_7: 'Plot command help.' -help_8: 'Towny command help.' -help_9: 'Townyadmin command help.' +help_4: 'Ayuda del comando resident.' +help_5: 'Ayuda del comando town.' +help_6: 'Ayuda del comando nation.' +help_7: 'Ayuda del comando plot.' +help_8: 'Ayuda del comando towny.' +help_9: 'Ayuda del comando townyadmin.' towny_help_0: "General help for Towny" towny_help_1: "Displays a map of the nearby townblocks" towny_help_2: "Display the prices used with Economy" @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s compró el terreno de %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s no pudo pagar los impuestos y fue expulsado de %s.' msg_couldnt_pay_plot_taxes: '&b%s no pudo pagar los impuestos y perdió la propiedad de un terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagaste los impuestos de la ciudad ' msg_payed_plot_cost: '&bPagaste %s por %s terrenos en %s' msg_payed_resident_tax: '&bPagaste los impuestos de residencia en ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Ver todas las invitaciones salientes' town_invite_help_4: 'Ver todas las invitaciones entrantes' town_invite_help_5: 'Aceptar una invitación para unirse a una nación' town_invite_help_6: 'Rechazar una invitación para unirse a una nación' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invitar a una ciudad a tu nación.' nation_invite_help_2: 'Anular una invitación enviada a una ciudad.' nation_invite_help_3: 'Ver todas las invitaciones salientes.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTu ciudad será considerada msg_time_remaining_before_full_removal: 'Tiempo hasta que sea eliminado completamente: %d horas.' msg_time_until_reclaim_available: 'Tiempo hasta que se pueda volver a reclamar: %d horas.' msg_reclaim_available: 'Reclamo disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralidad de la ciudad ahora está %s.' msg_err_town_unclaim_canceled: '&cAbandono cancelado. No puedes realizar esta operación ahora mismo.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/es-CL.yml b/Towny/src/main/resources/lang/es-CL.yml index 856891ab61..67909ab3e4 100644 --- a/Towny/src/main/resources/lang/es-CL.yml +++ b/Towny/src/main/resources/lang/es-CL.yml @@ -129,7 +129,7 @@ town_trust_help_2: "Ver los residentes de confianza de la ciudad." town_towntrust_help_0: "Confía en otra ciudad." town_towntrust_help_1: "Deja de confíar en otra ciudad." town_towntrust_help_2: "Ver las ciudades de confianza de la ciudad." -town_buy_help: "Purchases bonus townblocks to increase the claim limit of the town." +town_buy_help: "Compra terrenos bonus para aumentar el límite de reclamos de la ciudad." mayor_help_3: 'Reclamar área no adjunta a la ciudad' mayor_help_4: 'Reclamar alrededor de ti a un radio X.' mayor_help_5: 'Reclamar al radio máximo.' @@ -163,8 +163,8 @@ nation_list_help_6: "Ver un listado de naciones según el terreno reclamado con nation_list_help_7: "Ver un listado de naciones según los residentes conectados con la página especificada." nation_set_help_0: "Cambia el líder de la nación." nation_set_help_1: "Cambia la capital de la nación." -nation_set_help_2: "Set the amount of tax that towns will pay." -nation_set_help_3: "Set the amount of tax that conquered towns will pay." +nation_set_help_2: "Establezca la cantidad de impuestos que las ciudades pagarán." +nation_set_help_3: "Establezca la cantidad de impuestos que las ciudades conquistadas pagarán." nation_set_help_4: "Cambia el nombre de la nación." nation_set_help_5: "Cambia el título y apellido de un residente." nation_set_help_6: "Cambia la etiqueta de la nación." @@ -172,23 +172,23 @@ nation_set_help_7: "Cambia el tablero de anuncios de la nación." nation_set_help_8: "Cambia el punto de spawn de la nación." nation_set_help_9: "Cambia el costo de usar /n spawn." nation_set_help_10: "Cambia el color en el mapa de plugins de mapeo." -nation_toggle_help_0: "Toggles peaceful status of the nation." +nation_toggle_help_0: "Activa el estado pacífico de la nación." nation_toggle_help_1: "Cambia el estado público, permitiendo a los extranjeros usar /n spawn." -nation_toggle_help_2: "Toggles open status, allowing towns to join without an invite." -nation_toggle_help_3: "Toggles taxpercent, making towns pay a percentage instead of fixed rate." -nation_sanction_help_1: "Adds a town to the SanctionedTown list." -nation_sanction_help_2: "Removes a town from the SanctionedTown list." -nation_sanction_help_3: "Lists your nation's Sanctioned Towns." -nation_sanction_help_4: "Lists the given nation's Sanctioned Towns." +nation_toggle_help_2: "Activar o desactivar la apertura de la nación, permitiendo que ciudades se usan a esta sin invitación." +nation_toggle_help_3: "Activa el porcentaje de impuestos, haciendo que las ciudades paguen porcentajes en lugar de un valor fijo." +nation_sanction_help_1: "Agregar una ciudad a la lista de ciudades sancionadas." +nation_sanction_help_2: "Quita una ciudad de la lista de ciudades sancionadas." +nation_sanction_help_3: "Ver las ciudades sancionadas por la nación." +nation_sanction_help_4: "Ver las ciudades sancionadas por la nación dada." king_help_1: 'Ayuda para el Líder' king_help_2: 'Establece tus alianzas.' king_help_3: 'Establece tus enemistades.' -king_help_4: "Withdraw money from your nation bank." -king_help_5: "Add or remove towns from your nation." +king_help_4: "Retirar dinero del banco de tu nación." +king_help_5: "Agregar o quitar ciudades de tu nación." king_help_6: "Use /n set ? para obtener ayuda." king_help_7: "Use /n toggle ? para obtener ayuda." king_help_8: "Utilizado para absorber a otra nación en la tuya." -king_help_9: "Used to message everyone in your nation." +king_help_9: "Usado para mensajear a todos en tu nación." res_1: 'Tu estado' res_2: '[habitante]' res_3: 'Estado del habitante seleccionado' @@ -196,7 +196,7 @@ res_4: 'Lista de todos los juegadores activos' res_5: 'para ayuda' res_6: 'Coincidencia en línea' res_7: 'Nombre exacto' -res_8: 'Just a humble farmer' +res_8: 'Solo un humilde agricultor' res_9: "How much tax you will pay per day." res_10: "Use /res jail ? para obtener ayuda." res_11: "Use /res toggle ? para obtener ayuda." @@ -283,140 +283,140 @@ admin_panel_16: "Purgar residentes antiguos" townyadmin_town_help_0: "Crear una ciudad con el nombre y alcalde dados." townyadmin_town_help_1: "Show the town status screen." townyadmin_town_help_2: "Add or remove residents from a town." -townyadmin_town_help_3: "Rename a town." -townyadmin_town_help_4: "Delete a town." +townyadmin_town_help_3: "Renombrar una ciudad." +townyadmin_town_help_4: "Eliminar una ciudad." townyadmin_town_help_5: "Spawnear en una ciudad." townyadmin_town_help_6: "Spawnear en el outpost de una ciudad." -townyadmin_town_help_7: "Use a town's rank command." -townyadmin_town_help_8: "Use a town's set command." -townyadmin_town_help_9: "Use a town's toggle command." -townyadmin_town_help_10: "Alter a town's metadata." +townyadmin_town_help_7: "Usar el comando rank de una ciudad." +townyadmin_town_help_8: "Usar el comando set de una ciudad." +townyadmin_town_help_9: "Usar el comando toggle de una ciudad." +townyadmin_town_help_10: "Editar los metadatos de una ciudad." townyadmin_town_help_11: "Merge the 2nd town into the first town." townyadmin_town_help_12: "Merge the 2nd town into the first town, ignoring any rules." -townyadmin_town_help_13: "Put money into the town bank." -townyadmin_town_help_14: "Take money from the town bank." -townyadmin_town_help_15: "Open the town's bankhistory book." -townyadmin_town_help_16: "Alter a town's outlaws." -townyadmin_town_help_17: "Make the town leave their nation." -townyadmin_town_help_18: "Remove a town's conquered status." -townyadmin_town_toggle_help_0: "Toggle the Town's PVP." -townyadmin_town_toggle_help_1: "Toggle the Town's ForcePVP, preventing mayors from turning off pvp." -townyadmin_town_toggle_help_2: "Toggle the Town's Public status, allowing non-residents to teleport there." -townyadmin_town_toggle_help_3: "Toggle the Town's Explosion setting." -townyadmin_town_toggle_help_4: "Toggle the Town's Fire setting." +townyadmin_town_help_13: "Poner dinero en el banco de la ciudad." +townyadmin_town_help_14: "Quitar dinero del banco de la ciudad." +townyadmin_town_help_15: "Abrir el libro de finanzas de la ciudad." +townyadmin_town_help_16: "Editar los bandidos de una ciudad." +townyadmin_town_help_17: "Hacer que la ciudad abandone su nación." +townyadmin_town_help_18: "Eliminar el estado de conquista de una ciudad." +townyadmin_town_toggle_help_0: "Activa o desactiva el combate en la ciudad." +townyadmin_town_toggle_help_1: "Activar o desactiva el combate forzado de la ciudad, evitando que los alcaldes lo desactiven." +townyadmin_town_toggle_help_2: "Activa o desactiva el estado público de la ciudad, permitiendo que extranjeros se teletransporten a esta." +townyadmin_town_toggle_help_3: "Activar o desactivar las explosiones en la ciudad." +townyadmin_town_toggle_help_4: "Activar o desactivar el fuego en la ciudad." townyadmin_town_toggle_help_5: "Cambia la configuración de los mobs de la ciudad." -townyadmin_town_toggle_help_6: "Toggle the Town's Taxpercent setting." -townyadmin_town_toggle_help_7: "Toggle the Town's Open setting, allowing people to join the town without an invite." -townyadmin_nation_help_0: "Create a nation with the given name and capital city." -townyadmin_nation_help_1: "Show the nation status screen." -townyadmin_nation_help_2: "Add towns from the nation." -townyadmin_nation_help_3: "Remove towns from the nation." -townyadmin_nation_help_4: "Rename a nation." -townyadmin_nation_help_5: "Delete a town." -townyadmin_nation_help_6: "Recheck the nation's towns to make sure they're close enough to the capital." -townyadmin_nation_help_7: "Merge the 2nd nation into the first nation." -townyadmin_nation_help_8: "Merge the 2nd nation into the first nation, ignoring any rules." -townyadmin_nation_help_9: "Use a nation's toggle command." -townyadmin_nation_help_10: "Use a nation's set command." -townyadmin_nation_help_11: "Put money into the nation bank." -townyadmin_nation_help_12: "Take money from the nation bank." -townyadmin_nation_help_13: "Open the nation's bankhistory book." -townyadmin_nation_help_14: "Place the town into the nation." -townyadmin_nation_help_15: "Use the nation's rank command." -townyadmin_nationrank_help_0: "Adds a nation rank to the resident." -townyadmin_nationrank_help_1: "Removes a nation rank from the resident." +townyadmin_town_toggle_help_6: "Activar o desactivar el porcentaje de impuesto de la ciuda." +townyadmin_town_toggle_help_7: "Activar o desactivar la apertura de la ciudad, permitiendo que jugadores se usan a esta sin invitación." +townyadmin_nation_help_0: "Crear una nación con el nombre y capital dados." +townyadmin_nation_help_1: "Mostrar la pantalla del estado nacional." +townyadmin_nation_help_2: "Agregar ciudades a la nación." +townyadmin_nation_help_3: "Quitar ciudades de la nación." +townyadmin_nation_help_4: "Renombrar una nación." +townyadmin_nation_help_5: "Quitar una ciudad." +townyadmin_nation_help_6: "Verificar que las ciudades de la nación estén cerca de la capital." +townyadmin_nation_help_7: "Fusionar la segunda nación en la primera nación." +townyadmin_nation_help_8: "Fusionar la segunda nación en la primera nación, ignorando cualquier regla." +townyadmin_nation_help_9: "Usar el comando toggle de una nación." +townyadmin_nation_help_10: "Usar el comando set de una nación." +townyadmin_nation_help_11: "Poner dinero en el banco de la nación." +townyadmin_nation_help_12: "Quitar dinero del banco de la nación." +townyadmin_nation_help_13: "Abrir el libro de finanzas de la nación." +townyadmin_nation_help_14: "Poner una ciudad en la nación." +townyadmin_nation_help_15: "Usar el comando rank de una nación." +townyadmin_nationrank_help_0: "Añadir un rango nacional a un residente." +townyadmin_nationrank_help_1: "Quitar un rango nacional del residente." townyadmin_database_help_0: "Forzar el guardado de la base de datos." townyadmin_database_help_1: "Forzar el cargado de la base de datos." townyadmin_database_help_2: "Elimina todos los títulos y apellidos de cada residente." -ta_plot_help_0: "Claim a plot for a player." -ta_plot_help_1: "View the metadata stored in the plot you are stood in." -ta_plot_help_2: "Set plot metadata key and value." -ta_plot_help_3: "Add or remove a metadata by key." -ta_resident_help_0: "Rename a resident." -ta_resident_help_1: "Add or remove a friend." -ta_resident_help_2: "List or clear the friend list." +ta_plot_help_0: "Reclamar un terreno por un jugador." +ta_plot_help_1: "Ver los metadatos del terreno donde estás parado." +ta_plot_help_2: "Establecer la clave y valor de los metadatos de un terreno." +ta_plot_help_3: "Añadir o quitar metadatos por la clave." +ta_resident_help_0: "Renombrar a un residente." +ta_resident_help_1: "Añadir o quitar un amigo." +ta_resident_help_2: "Listar o borrar la lista de amigos." ta_resident_help_3: "Eliminar un residente de la base de datos." -ta_toggle_help_0: "Turn on/off the ability to use the Wilderness in all worlds." -ta_toggle_help_1: "Turn on/off the regeneration features in all worlds." -ta_toggle_help_2: "Turn on/off devmode, shows extra logging messages to the player specified in the config." -ta_toggle_help_3: "Turn on/off debug mode, showing extra messages in the log." -ta_toggle_help_4: "Turn on/off the ability for towns or nations to remove money from their banks." -ta_toggle_help_5: "Make a player an NPC or not." -ta_set_help_0: "Set a towns mayor to the given player." -ta_set_help_1: "Set a town with a new NPC mayor, they pay no upkeep." -ta_set_help_2: "Set the capital of a nation." -ta_set_help_3: "Set a nation's nationzone size." -ta_set_help_4: "Set a resident's title." -ta_set_help_5: "Set a resident's surname." -ta_set_help_6: "Set a plot to a different town." -ta_set_help_7: "Set a town's founder name." -ta_set_help_8: "Use size 0 to remove nationzone override." +ta_toggle_help_0: "Activar o desactivar la abilidad de usar el Exterior en todos los mundos." +ta_toggle_help_1: "Activar o desactivar las características de regeneración de todos los mundos." +ta_toggle_help_2: "Activar o desactivar el modo de desarrollador, el que muestra registros extra al jugador especificado en la configuración." +ta_toggle_help_3: "Activar o desactivar el modo de depuración, mostrando mensajes extra en el registro." +ta_toggle_help_4: "Activar o desactivar la abilidad de las ciudades o naciiones de quitar dinero de sus bancos." +ta_toggle_help_5: "Haz a un jugador un NPC o no." +ta_set_help_0: "Establece como alcalde de una ciudad a un jugador especificado." +ta_set_help_1: "Establecer como alcalde de una ciudad a un NPC nuevo, no pagan mantención." +ta_set_help_2: "Cambia la capital de una nación." +ta_set_help_3: "Cambia el tamaño de la zona nacional de una nación." +ta_set_help_4: "Cambia el título de un residente." +ta_set_help_5: "Cambia el apellido de un residente." +ta_set_help_6: "Cambia la ciudad de un terreno." +ta_set_help_7: "Cambia el nombre del fundador de una ciudad." +ta_set_help_8: "Usa el tamaño 0 para quitar la anulación de la zona nacional." ta_purge_help_0: "Purga a los residentes que no han iniciado sesión durante más tiempo de los días dados, opcionalmente puede usarse para eliminar sólo a jugadores sin ciudades, o especificar una ciudad para purgar sólo a los residentes de esta." -ta_townmeta_help_1: "View the metadata stored on the town you specify." -ta_townmeta_help_2: "Set town metadata key and value." +ta_townmeta_help_1: "Ver los metadatos de la ciudad especificada." +ta_townmeta_help_2: "Establece la clave y valor de los metadatos de una ciudad." ta_townmeta_help_3: "Add or remove a metadata by key from the town." ta_residentmeta_help_1: "View the metadata stored on the resident you specify." -ta_residentmeta_help_2: "Set resident metadata key and value." -ta_residentmeta_help_3: "Add or remove a metadata by key from the resident." -ta_nationmeta_help_1: "View the metadata stored on the nation you specify." -ta_nationmeta_help_2: "Set nation metadata key and value." -ta_nationmeta_help_3: "Add or remove a metadata by key from the nation." +ta_residentmeta_help_2: "Establece la clave y valor de los metadatos de un residente." +ta_residentmeta_help_3: "Añadir o quitar metadatos por la clave del residente." +ta_nationmeta_help_1: "Ver los metadatos de la nación especificada." +ta_nationmeta_help_2: "Establece la clave y valor de los metadatos de una nación." +ta_nationmeta_help_3: "Añadir o quitar metadatos por la clave de la nación." ta_reload_help_0: "Recargar la base de datos." -ta_reload_help_1: "Reloads config." -ta_reload_help_2: "Reloads language files." -ta_reload_help_3: "Reloads Towny permissions." -ta_reload_help_4: "Reloads all components of Towny." -ta_depositall_help_0: "Deposit the given amount into all town and nation banks." -plot_help_0: "Turns on the plot info HUD." -plot_help_1: "Removes the owner of the plot." -plot_help_2: "Deletes a list of blocks from the plot." -plot_help_3: "See /plot set ? for help." -plot_help_4: "See /plot toggle ? for help." -plot_help_5: "See /plot group ? for help." -plot_help_6: "Removes permission overrides for a player." -plot_help_7: "Adds default permission overrides for a player." -plot_help_8: "Opens the permission editor gui." -plot_help_9: "Adds a resident as Trusted in the plot." -plot_help_10: "Removes a resident as Trusted in the plot." -plot_group_help_0: "Ex: /plot group new ExpensivePlots" -plot_group_help_1: "Removes a plot from the specified group." -plot_group_help_2: "Deletes a plotgroup completely." -plot_group_help_3: "Renames the group you are standing in." -plot_group_help_4: "Ex: /plot group set perm resident on." +ta_reload_help_1: "Recargar configuración." +ta_reload_help_2: "Recargar traducciones." +ta_reload_help_3: "Recargar permisos de Towny." +ta_reload_help_4: "Recargar componentes de Towny." +ta_depositall_help_0: "Depositar la cantidad dada en todos los bancos del servidor." +plot_help_0: "Activa el HUD de información del terreno." +plot_help_1: "Quita el dueño del terreno." +plot_help_2: "Quita una lista de bloques del terreno." +plot_help_3: "Use /plot set ? para obtener ayuda." +plot_help_4: "Use /plot toggle ? para obtener ayuda." +plot_help_5: "Use /plot group ? para obtener ayuda." +plot_help_6: "Quita anulaciones de permisos para un jugador." +plot_help_7: "Añadir anulaciones de permisos para un jugador." +plot_help_8: "Abre la interfaz de edición de permisos." +plot_help_9: "Confía en un residente en el terreno." +plot_help_10: "Deja de confíar en un residente en el terreno." +plot_group_help_0: "Ej: /plot group new TerrenosCaros" +plot_group_help_1: "Quita un terreno del grupo especificado." +plot_group_help_2: "Elimina un grupo completamente." +plot_group_help_3: "Renombra el grupo en el que estás parado." +plot_group_help_4: "Ej: /plot group set perm resident on." plot_group_help_5: "Ej: /plot group toggle [pvp|fire|mobs]" -plot_group_help_6: "Ex: /plot group forsale 50" -plot_group_help_7: "Ex: /plot group notforsale" -plot_group_help_8: "Adds or removes a resident as trusted." -plot_group_help_9: "Adds a resident as Trusted in the plotgroup." -plot_group_help_10: "Removes a resident as Trusted in the plotgroup." -plot_group_help_11: "Opens the plot perm GUI." -plot_group_help_12: "Adds a player to the plot perm GUI." -plot_group_help_13: "Removes a player to the plot perm GUI." -plot_toggle_help_0: "Toggles pvp in the plot." -plot_toggle_help_1: "Toggles explosions in the plot." -plot_toggle_help_2: "Toggles fire in the plot." +plot_group_help_6: "Ej: /plot group forsale 50" +plot_group_help_7: "Ej: /plot group forsale" +plot_group_help_8: "Confiar o dejar de confiar en un residente." +plot_group_help_9: "Confíar en un residente en el grupo." +plot_group_help_10: "Deja de confíar en un residente en el grupo." +plot_group_help_11: "Abrir la interfaz de permisos del terreno." +plot_group_help_12: "Agregar un jugador a la interfaz de permisos del terreno." +plot_group_help_13: "Quitar un jugador de la interfaz de permisos del terreno." +plot_toggle_help_0: "Activa el combate en el terreno." +plot_toggle_help_1: "Activa las explosiones en el terreno." +plot_toggle_help_2: "Activa el fuego en el terreno." plot_toggle_help_3: "Permite los mobs en el terreno." -plot_group_toggle_help_0: "Toggles pvp in the plot group." -plot_group_toggle_help_1: "Toggles explosions in the plot group." -plot_group_toggle_help_2: "Toggles fire in the plot group." +plot_group_toggle_help_0: "Activa el combate en el grupo." +plot_group_toggle_help_1: "Activa las explosiones en el grupo." +plot_group_toggle_help_2: "Activa el fuego en el grupo." plot_group_toggle_help_3: "Permite los mobs en el grupo." plot_set_help_0: "Ej: Hotel, Campo, Granja, Embajada, etc." plot_set_help_1: "Cambia un terreno a un outpost." plot_set_help_2: "Quita el tipo de un terreno." plot_set_help_3: "Nombra un terreno." -plot_set_help_4: "Toggle all permissions." +plot_set_help_4: "Activa todos los permisos." plot_set_help_5: "Sets the permissions of a level or type to on or off." plot_set_help_6: "Sets the permission of a level and type to on or off." plot_set_help_7: "Sets the permissions to the resident or town that owns the plots." -plot_jailcell_help_0: "Adds a JailCell where you stand." -plot_jailcell_help_1: "Removes a JailCell where you stand." +plot_jailcell_help_0: "Agrega una celda donde estás parado." +plot_jailcell_help_1: "Quita una celda donde estás parado." msg_block_claim: 'Reclama este terreno de la ciudad' -msg_block_claim_radius: 'Claim a radius of plots surrounding you.' +msg_block_claim_radius: 'Reclama un radio de terrenos alrededor tuyo.' msg_plot_nfs: 'Remueve el estado de en venta de un terreno' -msg_plot_nfs_radius: 'Take down a radius of plots for sale' +msg_plot_nfs_radius: 'Quita un radio de terrenos de la venta' msg_nfs_abr: '&e''fs'' y ''nfs'' son abreviaciones aceptadas para ''forsale'' y ''notforsale''.' msg_plot_fs: 'Pon este terreno en venta.' -msg_plot_fs_radius: 'Put up a radius of plots for sale.' +msg_plot_fs_radius: 'Pon un radio de terrenos a la venta.' ############################################################ #+------------------------------------------------------+ # #| Messages | # @@ -424,9 +424,11 @@ msg_plot_fs_radius: 'Put up a radius of plots for sale.' ############################################################ msg_buy: '&bCompró %d %s por %s.' msg_buy_resident_plot: '&b%s compró el terreno de %s por %s!' -msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' +msg_buy_resident_plot_group: '&b%s compró el grupo de %s por %s!' msg_couldnt_pay_taxes: '&b%s no pudo pagar los impuestos y fue expulsado de %s.' msg_couldnt_pay_plot_taxes: '&b%s no pudo pagar los impuestos y perdió la propiedad de un terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagaste los impuestos de la ciudad ' msg_payed_plot_cost: '&bPagaste %s por %s terrenos en %s' msg_payed_resident_tax: '&bPagaste los impuestos de residencia en ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Ver todas las invitaciones salientes' town_invite_help_4: 'Ver todas las invitaciones entrantes' town_invite_help_5: 'Aceptar una invitación para unirse a una nación' town_invite_help_6: 'Rechazar una invitación para unirse a una nación' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invitar a una ciudad a tu nación.' nation_invite_help_2: 'Anular una invitación enviada a una ciudad.' nation_invite_help_3: 'Ver todas las invitaciones salientes.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTu ciudad será considerada msg_time_remaining_before_full_removal: 'Tiempo hasta que sea eliminado completamente: %d horas.' msg_time_until_reclaim_available: 'Tiempo hasta que se pueda volver a reclamar: %d horas.' msg_reclaim_available: 'Reclamo disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralidad de la ciudad ahora está %s.' msg_err_town_unclaim_canceled: '&cAbandono cancelado. No puedes realizar esta operación ahora mismo.' @@ -1596,7 +1600,7 @@ status_format_hover_bracket_colour: '&7' #Colour applied to the brackets of a ho status_format_key_important: '&c' #Colour applied to an important status screen value, ex: (BANKRUPT), Ruined town reclaim lines, taxes/upkeep costs. status_splitter: ' &7| ' #Used in status screens where a splitter is used between values. status_home_element: ' &7[Principal: %s]' -status_about: "About:" +status_about: "Sobre:" status_registered: 'Registrado:' status_lastonline: 'Última conexión:' status_fractions: '%s/%s' @@ -1881,13 +1885,13 @@ msg_perm_hud_outsider: 'extranjero' #Seen in /plot perm hud: msg_perm_hud_plot_name: 'Parcela: ' #Seen in /plot perm hud: -msg_perm_hud_plotgroup_name: 'Plot Group: ' +msg_perm_hud_plotgroup_name: 'Grupo: ' #Seen in /plot perm hud: -msg_perm_hud_plot_for_sale: 'For Sale: ' +msg_perm_hud_plot_for_sale: 'A la venta: ' #Seen in /plot perm hud: msg_perm_hud_no: 'No' #Seen in /plot perm hud: -msg_perm_hud_yes: 'Yes' +msg_perm_hud_yes: 'Si' #Added in 0.153 #Message shown confirming /ta town NAME settownlevel # command. msg_town_level_overridden_with: 'Se estableció el nivel de ciudad de %s en %s.' @@ -2004,38 +2008,38 @@ msg_err_this_townblock_cannot_be_taken_over: "This TownBlock cannot be taken ove #Message shown when taking over a claim would also set the homeblock because the town has no claims. msg_err_you_cannot_make_this_your_homeblock: "No puedes reclamar este terreno ya que se convertiría en tu homeblock, lo que no está permitido." #Message shown when taking over a claim is stopped by another plugin. -msg_err_another_plugin_cancelled_takeover: "Another plugin has stopped your takeover of this land." +msg_err_another_plugin_cancelled_takeover: "Otro plugin anuló la toma de este terreno." #Confirmation shown when taking over a claim. -confirmation_you_are_about_to_take_over_a_claim: "You are about to take over a claim belonging to %s for the cost: %s. Did you want to continue?" +confirmation_you_are_about_to_take_over_a_claim: "Estás a punto de tomar un terreno de %s por el costo: %s. ¿Quieres continuar?" #Warning message shown when a town is beginning to claim close to their limit, and the takeoverclaim feature is active. -msg_warning_you_are_almost_out_of_townblocks: "Warning: You have nearly used up your available townblocks for claiming. If you lose a resident you will be at risk of your town being able to have townblocks stolen by other towns." +msg_warning_you_are_almost_out_of_townblocks: "Advertencia: Has usado casi todos tus terrenos disponibles para reclamar. Si pierdes un residente, corres el riesgo de que puedan tomarse tus terrenos." #Warning message shown on login when a town is overclaimed and at risk of falling victim to the takeoverclaim feature. -msg_warning_your_town_is_overclaimed: "Warning: Your town is overclaimed. While you have too many townblocks claimed, it will be possible for other towns to takeover plots of your town, consider unclaiming some land." +msg_warning_your_town_is_overclaimed: "Advertencia: Tu ciudad tiene un exceso de terrenos. Cuando esto pase, es posible que otras ciudades se tomen terrenos de tu ciudad, considera abandonar algunos terrenos." #Chunk Notification slug, shown when entering a plot that can be stolen. -chunk_notification_takeover_available: " [TakeoverClaim Available]" +chunk_notification_takeover_available: " [Toma Disponible]" #Message shown when a takeover claim would cut a town into two sections. -msg_err_you_cannot_over_claim_would_cut_into_two: "You cannot take over this plot, because doing so would split the town into two segments. You will have to overclaim from a different direction." +msg_err_you_cannot_over_claim_would_cut_into_two: "No puedes tomarte este terreno, porque dividiría la ciudad en dos partes. Tendrás que tomarte un terreno en otra dirección." #Message shown when an admin tries to toggle conquered off of a town that is not conquered. -msg_err_that_town_is_not_conquered: "%s is already not conquered." +msg_err_that_town_is_not_conquered: "%s ya está no conquistado." #Message shown when a town has its conquered status removed by an admin. -msg_conquered_status_removed: "%s has had their conquered status removed." -msg_setup_command_folia: "The /ta install command currently does not work on Folia due to the conversation API not working, refer to the install guide below instead." -msg_perm_gui_folia: "This button currently does not work on Folia due to the conversation API not working, use the /plot perm add command instead." -msg_folia_scoreboard: "Changing scoreboards is currently not supported on Folia." +msg_conquered_status_removed: "Se quitó el estado de conquista de %s." +msg_setup_command_folia: "El comando /ta install no funciona en Folia debido a que la API de conversación no funciona, en su lugar, consulta la guía de instalación de abajo." +msg_perm_gui_folia: "Este botón no funciona en Folia debido a que la API de conversación no funciona, en su lugar, usa el comando /plot perm add ." +msg_folia_scoreboard: "Scoreboards cambiantes no está soportado por Folia en este momento." #Message shown when a player cannot unclaim land because at least one plot wouldn't have enough adjacent claims. -msg_err_cannot_unclaim_not_enough_adjacent_claims: "You cannot unclaim this townblock because the townblock at %s,%s would not have enough adjacent claims (%s are required.)" +msg_err_cannot_unclaim_not_enough_adjacent_claims: "No puedes abandonar este terreno porque el terreno en %s,%s no tendría suficientes reclamos adyacentes. (%s son necesarios)" #Message shown when a nation collects taxes from its towns. -msg_tax_collected_from_towns: "Your nation collected %s in tax from its towns." +msg_tax_collected_from_towns: "Tu nación recopiló %s en impuestos desde sus ciudades." #Message shown when a nation pays taxes to its towns. -msg_tax_paid_to_towns: "Your nation paid %s in tax to its towns." +msg_tax_paid_to_towns: "Tu nación pagó %s en impuestos a sus ciudades." #Message shown when a town collects taxes from its residents. -msg_tax_collected_from_residents: "Your town collected %s in tax from its residents." +msg_tax_collected_from_residents: "Tu ciudad recopiló %s en impuestos desde sus residentes." #Message shown when a town pays taxes to its residents. -msg_tax_paid_to_residents: "Your town paid %s in tax to its residents." +msg_tax_paid_to_residents: "Tu ciudad pagó %s en impuestos a sus residentes." #Message shown when a town collects taxes from its plottaxes. -msg_tax_collected_from_plots: "Your town collected %s in tax from its plots' taxes." +msg_tax_collected_from_plots: "Tu ciudad recopiló %s en impuestos desde sus terrenos." #Message shown when a town pays taxes to its plottaxes. -msg_tax_paid_to_residents_for_plots: "Your town paid %s in tax to the land owners via plot taxes." +msg_tax_paid_to_residents_for_plots: "Tu ciudad pagó %s en impuestos a los dueños de terrenos a través de SUS impuestos." #Message shown when a nation collects taxes from its towns that are conquered. msg_tax_collected_from_conquered_towns: "Your nation collected %s in extra tax from its conquered towns." msg_your_town_was_exempt_from_the_nation_conquered_tax: "Your town was exempt from the nation's conquered tax." @@ -2057,18 +2061,18 @@ msg_town_buytown_not_forsale: "Specified town is not for sale." msg_town_buytown_ruined: "Ruined towns cannot be bought." msg_resident_about_reset: "&bResident about reset." msg_err_invalid_string_about_not_set: "Invalid string, resident about not set." -msg_set_about: "%s's about was set to %s." -msg_clear_about: "%s's about was cleared." +msg_set_about: "La columna sobre de %s se estableció en %s." +msg_clear_about: "La columna sobre de %s fue limpiada." #Message shown when toggling town visibleontoplists setting -msg_town_visibleontoplist_setting_set_to: 'The town %s has had their visible-on-top-lists setting set to %s.' +msg_town_visibleontoplist_setting_set_to: 'Se cambió el ajuste a %2$s respecto a la visiblidad en los tops de %1$s.' #Message shown when an admin overrides a town founding date via townyadmin. -townyadmin_town_set_help_0: "Sets the founding date of a town." -townyadmin_nation_set_help_0: "Sets the founding date of a nation." -msg_town_registered_set: "Founding date of town: '%s' set to: '%s'." +townyadmin_town_set_help_0: "Establece la fecha de fundación de una ciudad." +townyadmin_nation_set_help_0: "Establece la fecha de fundación de una nación." +msg_town_registered_set: "Se cambió la fecha de fundación de la ciudad '%s' a '%s'." msg_nation_registered_set: "Se cambió la fecha de fundación de la nación '%s' a '%s'." -msg_err_time_cannot_be_in_the_future: "Specified time cannot be in the future." +msg_err_time_cannot_be_in_the_future: "El tiempo especificado no puede ser en el futuro." #The format used for the /t say and /n say commands. -town_say_format: "%s says: %s" +town_say_format: "%s dice: %s" msg_err_floodfill_not_in_wild: "You cannot use floodfill while standing in a claimed area." msg_err_floodfill_out_of_bounds: "Claim shape must be fully closed off in order to floodfill." msg_err_floodfill_cannot_contain_towns: "Flood fill selection must not contain other towns." @@ -2077,23 +2081,36 @@ msg_err_resident_is_npc: "No puedes hacerle esto a un residente NPC." #Message shown when a resident doesn't own any land and the /res plotlist command is used. msg_err_resident_doesnt_own_any_land: "El residente no posee ningun terreno personal." msg_unnamed: "Sin nombre" -msg_err_nation_cannot_sanction_own_town: "You cannot sanction a town that is a part of your nation." -msg_err_nation_town_isnt_sanctioned: "Your nation is not sanctioning that town." -msg_err_nation_town_already_sanctioned: "Your nation already sanctions that town." -msg_err_nation_town_sanctioned: "Your nation has now sanctioned %s, they will not be allowed to join your nation." -msg_err_nation_town_unsanctioned: "Your nation is no longer sanctioning %s." -msg_err_nation_has_no_sanctioned_towns: "The nation has no sanctioned towns." -title_nation_sanctioned_towns: 'Sanctioned Towns' -msg_err_cannot_add_sanctioned_town: "Your nation cannot add %s, your nation has sanctioned them." -msg_err_cannot_join_nation_sanctioned_town: "Your town cannot join %s, this nation has sanctioned your town." -msg_err_no_nation_cannot_do: "You cannot perform this action because no nation was able to be determined." -msg_err_cannot_nation_spawn_your_town_is_sanctioned: "Your town is sanctioned by %s, you cannot spawn there." -msg_err_cannot_claim_the_following_worldcoords_because_of_unwanted_biome: "The following coordinate(s) cannot be claimed because they contain too much of an unwanted biome: %s." -msg_err_cannot_claim_the_following_worldcoords_because_of_ocean_biome: "The following coordinate(s) cannot be claimed because they contain too much ocean biome: %s." -msg_err_cannot_begin_town_in_this_biome: "You cannot start a town in this biome." -msg_err_cannot_overclaim_this_town_because_they_arent_your_enemy: "You are not able to overclaim this town because your nation does not consider their nation an enemy." -msg_err_unable_to_command_outside_of_town: 'You cannot use that command outside of your town.' -msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that command outside of a bank plot.' -msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." -msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." -status_nation_sanctioned_towns: "Sanctioned Towns" +msg_err_nation_cannot_sanction_own_town: "No se puede sancionar a una ciudad que forma parte de tu nación." +msg_err_nation_town_isnt_sanctioned: "Tu nación no está sancionando a esa ciudad." +msg_err_nation_town_already_sanctioned: "Tu nación ya está sancionando a esa ciudad." +msg_err_nation_town_sanctioned: "Tu nación ha sancionado a %s, no se le permitirá unirse a tu nación." +msg_err_nation_town_unsanctioned: "Tu nación ya no está sancionando a %s." +msg_err_nation_has_no_sanctioned_towns: "La nación no tiene ciudades sancionadas." +title_nation_sanctioned_towns: 'Ciudades Sancionadas' +msg_err_cannot_add_sanctioned_town: "Tu nación no puede añadir %s, tu nación los ha sancionado." +msg_err_cannot_join_nation_sanctioned_town: "Tu ciudad no puede unirse a %s, esta nación ha sancionado tu ciudad." +msg_err_no_nation_cannot_do: "No se puede realizar esta acción porque ninguna nación pudo ser determinada." +msg_err_cannot_nation_spawn_your_town_is_sanctioned: "Tu ciudad está sancionada por %s, no puedes spawnear allí." +msg_err_cannot_claim_the_following_worldcoords_because_of_unwanted_biome: "Las siguientes coordenadas no se pueden reclamar porque contienen demasiado de un bioma no deseado: %s." +msg_err_cannot_claim_the_following_worldcoords_because_of_ocean_biome: "Las siguientes coordenadas no se pueden reclamar porque contienen demasiado de un bioma oceanico: %s." +msg_err_cannot_begin_town_in_this_biome: "No puedes fundar una ciudad en este bioma." +msg_err_cannot_overclaim_this_town_because_they_arent_your_enemy: "No puedes tomar esta ciudad porque tu nación no considera que su nación sea un enemigo." +msg_err_unable_to_command_outside_of_town: 'No puedes usar ese comando fuera de tu ciudad.' +msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'No puedes usar ese comando fuera de un terreno de banco.' +msg_err_you_cannot_outlaw_your_mayor: "No puedes declarar como bandido al alcalde." +msg_err_you_cannot_outlaw_because_of_rank: "No puedes declarar como bandido a %s por el rol comunal que tiene." +status_nation_sanctioned_towns: "Ciudades Sancionadas" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "Todas las invitaciones enviadas han sido canceladas." +msg_err_name_validation_invalid_characters: "%s contiene caracteres que no están permitidos en los ajustes de RegEx de Towny." +msg_err_name_validation_begins_with_eco_prefix: "%s comienza con letras usadas en las funciones de economía, no puedes usar este nombre." +msg_err_name_validation_name_already_in_use: "%s ya esta en uso." +msg_err_name_validation_title_too_long: "%s es muy largo para ser usado como un título o apellido." +msg_err_name_validation_name_too_long: "%s es muy largo para ser usado como un nombre." +msg_err_name_validation_is_empty: "No puedes proporcionar un nombre vacío." +msg_err_name_validation_is_not_permitted: "%s no está permitido." +msg_err_name_validation_is_all_underscores: "%s solo tiene guiones bajos." +msg_err_name_validation_contains_harmful_characters: "%s contiene símbolos que pueden ser dañinos." +msg_err_name_validation_contains_numbers: "%s contiene números que no están permitidos en nombres." +msg_err_name_validation_used_in_command_structure: "%s se usa en la estructura de los comandos, no puedes usar este nombre." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/es-EC.yml b/Towny/src/main/resources/lang/es-EC.yml index cd266d6c29..fb82228c4f 100644 --- a/Towny/src/main/resources/lang/es-EC.yml +++ b/Towny/src/main/resources/lang/es-EC.yml @@ -45,12 +45,12 @@ help_0: 'Ayuda General sobre Towny' help_1: 'Prueba los siguientes comandos para aprender más sobre towny.' help_2: 'Chat de la Ciudad' help_3: 'Chat de la Nación' -help_4: 'Resident command help.' -help_5: 'Town command help.' -help_6: 'Nation command help.' -help_7: 'Plot command help.' -help_8: 'Towny command help.' -help_9: 'Townyadmin command help.' +help_4: 'Ayuda del comando resident.' +help_5: 'Ayuda del comando town.' +help_6: 'Ayuda del comando nation.' +help_7: 'Ayuda del comando plot.' +help_8: 'Ayuda del comando towny.' +help_9: 'Ayuda del comando townyadmin.' towny_help_0: "General help for Towny" towny_help_1: "Displays a map of the nearby townblocks" towny_help_2: "Display the prices used with Economy" @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s compró el terreno de %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s no pudo pagar los impuestos y fue expulsado de %s.' msg_couldnt_pay_plot_taxes: '&b%s no pudo pagar los impuestos y perdió la propiedad de un terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagaste los impuestos de la ciudad ' msg_payed_plot_cost: '&bPagaste %s por %s terrenos en %s' msg_payed_resident_tax: '&bPagaste los impuestos de residencia en ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Ver todas las invitaciones salientes' town_invite_help_4: 'Ver todas las invitaciones entrantes' town_invite_help_5: 'Aceptar una invitación para unirse a una nación' town_invite_help_6: 'Rechazar una invitación para unirse a una nación' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invitar a una ciudad a tu nación.' nation_invite_help_2: 'Anular una invitación enviada a una ciudad.' nation_invite_help_3: 'Ver todas las invitaciones salientes.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTu ciudad será considerada msg_time_remaining_before_full_removal: 'Tiempo hasta que sea eliminado completamente: %d horas.' msg_time_until_reclaim_available: 'Tiempo hasta que se pueda volver a reclamar: %d horas.' msg_reclaim_available: 'Reclamo disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralidad de la ciudad ahora está %s.' msg_err_town_unclaim_canceled: '&cAbandono cancelado. No puedes realizar esta operación ahora mismo.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/es-ES.yml b/Towny/src/main/resources/lang/es-ES.yml index 16a7f852d0..d5acb90e96 100644 --- a/Towny/src/main/resources/lang/es-ES.yml +++ b/Towny/src/main/resources/lang/es-ES.yml @@ -45,12 +45,12 @@ help_0: 'Ayuda General de Towny' help_1: 'Pruebe los siguientes comandos para saber mas sobre Towny.' help_2: 'Chat de ciudad' help_3: 'Chat de país' -help_4: 'Resident command help.' -help_5: 'Town command help.' -help_6: 'Nation command help.' -help_7: 'Plot command help.' -help_8: 'Towny command help.' -help_9: 'Townyadmin command help.' +help_4: 'Ayuda del comando resident.' +help_5: 'Ayuda del comando town.' +help_6: 'Ayuda del comando nation.' +help_7: 'Ayuda del comando plot.' +help_8: 'Ayuda del comando towny.' +help_9: 'Ayuda del comando townyadmin.' towny_help_0: "General help for Towny" towny_help_1: "Displays a map of the nearby townblocks" towny_help_2: "Display the prices used with Economy" @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s le compro parcelas a %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s no pudo pagar los impuestos y fue echado de %s.' msg_couldnt_pay_plot_taxes: '&b%s no pudo pagar los impuestos y perdió una parcela.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagó los impuestos de ' msg_payed_plot_cost: '&bPago %s por %s parcelas en %s' msg_payed_resident_tax: '&bImpuestos de habitante de ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Muestra todas las invitaciones que has enviado' town_invite_help_4: 'Muestra todas las invitaciones que has recibido' town_invite_help_5: 'Aceptar invitación para unirte a una nación' town_invite_help_6: 'Rechazar invitación para unirte a una nación' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invita a un pueblo a tu ciudad.' nation_invite_help_2: 'Elimina una invitación enviada a un pueblo' nation_invite_help_3: 'Mostrar todas las invitaciones enviadas a ciudades.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTu ciudad esta en ruinas po msg_time_remaining_before_full_removal: 'Tiempo restante antes de que sea removido completamente %d horas.' msg_time_until_reclaim_available: 'Tiempo disponible para la reclamacion: %d horas.' msg_reclaim_available: 'Reclamo disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralidad/pacifismo de la ciudad ahora es %s.' msg_err_town_unclaim_canceled: '&cUnclaimeo cancelado. No puedes unclaimear este area ahora mismo.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/es-MX.yml b/Towny/src/main/resources/lang/es-MX.yml index 7595faf435..7194a6b93c 100644 --- a/Towny/src/main/resources/lang/es-MX.yml +++ b/Towny/src/main/resources/lang/es-MX.yml @@ -45,12 +45,12 @@ help_0: 'Ayuda General sobre Towny' help_1: 'Prueba los siguientes comandos para aprender más sobre towny.' help_2: 'Chat de la Ciudad' help_3: 'Chat de la Nación' -help_4: 'Resident command help.' -help_5: 'Town command help.' -help_6: 'Nation command help.' -help_7: 'Plot command help.' -help_8: 'Towny command help.' -help_9: 'Townyadmin command help.' +help_4: 'Ayuda del comando resident.' +help_5: 'Ayuda del comando town.' +help_6: 'Ayuda del comando nation.' +help_7: 'Ayuda del comando plot.' +help_8: 'Ayuda del comando towny.' +help_9: 'Ayuda del comando townyadmin.' towny_help_0: "General help for Towny" towny_help_1: "Displays a map of the nearby townblocks" towny_help_2: "Display the prices used with Economy" @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s compró el terreno de %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s no pudo pagar los impuestos y fue expulsado de %s.' msg_couldnt_pay_plot_taxes: '&b%s no pudo pagar los impuestos y perdió la propiedad de un terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagaste los impuestos de la ciudad ' msg_payed_plot_cost: '&bPagaste %s por %s terrenos en %s' msg_payed_resident_tax: '&bPagaste los impuestos de residencia en ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Ver todas las invitaciones salientes' town_invite_help_4: 'Ver todas las invitaciones entrantes' town_invite_help_5: 'Aceptar una invitación para unirse a una nación' town_invite_help_6: 'Rechazar una invitación para unirse a una nación' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invitar a una ciudad a tu nación.' nation_invite_help_2: 'Anular una invitación enviada a una ciudad.' nation_invite_help_3: 'Ver todas las invitaciones salientes.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTu ciudad será considerada msg_time_remaining_before_full_removal: 'Tiempo hasta que sea eliminado completamente: %d horas.' msg_time_until_reclaim_available: 'Tiempo hasta que se pueda volver a reclamar: %d horas.' msg_reclaim_available: 'Reclamo disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralidad de la ciudad ahora está %s.' msg_err_town_unclaim_canceled: '&cAbandono cancelado. No puedes realizar esta operación ahora mismo.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/es-UY.yml b/Towny/src/main/resources/lang/es-UY.yml index cd266d6c29..fb82228c4f 100644 --- a/Towny/src/main/resources/lang/es-UY.yml +++ b/Towny/src/main/resources/lang/es-UY.yml @@ -45,12 +45,12 @@ help_0: 'Ayuda General sobre Towny' help_1: 'Prueba los siguientes comandos para aprender más sobre towny.' help_2: 'Chat de la Ciudad' help_3: 'Chat de la Nación' -help_4: 'Resident command help.' -help_5: 'Town command help.' -help_6: 'Nation command help.' -help_7: 'Plot command help.' -help_8: 'Towny command help.' -help_9: 'Townyadmin command help.' +help_4: 'Ayuda del comando resident.' +help_5: 'Ayuda del comando town.' +help_6: 'Ayuda del comando nation.' +help_7: 'Ayuda del comando plot.' +help_8: 'Ayuda del comando towny.' +help_9: 'Ayuda del comando townyadmin.' towny_help_0: "General help for Towny" towny_help_1: "Displays a map of the nearby townblocks" towny_help_2: "Display the prices used with Economy" @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s compró el terreno de %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s no pudo pagar los impuestos y fue expulsado de %s.' msg_couldnt_pay_plot_taxes: '&b%s no pudo pagar los impuestos y perdió la propiedad de un terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagaste los impuestos de la ciudad ' msg_payed_plot_cost: '&bPagaste %s por %s terrenos en %s' msg_payed_resident_tax: '&bPagaste los impuestos de residencia en ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Ver todas las invitaciones salientes' town_invite_help_4: 'Ver todas las invitaciones entrantes' town_invite_help_5: 'Aceptar una invitación para unirse a una nación' town_invite_help_6: 'Rechazar una invitación para unirse a una nación' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invitar a una ciudad a tu nación.' nation_invite_help_2: 'Anular una invitación enviada a una ciudad.' nation_invite_help_3: 'Ver todas las invitaciones salientes.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTu ciudad será considerada msg_time_remaining_before_full_removal: 'Tiempo hasta que sea eliminado completamente: %d horas.' msg_time_until_reclaim_available: 'Tiempo hasta que se pueda volver a reclamar: %d horas.' msg_reclaim_available: 'Reclamo disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralidad de la ciudad ahora está %s.' msg_err_town_unclaim_canceled: '&cAbandono cancelado. No puedes realizar esta operación ahora mismo.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/es-VE.yml b/Towny/src/main/resources/lang/es-VE.yml index cd266d6c29..fb82228c4f 100644 --- a/Towny/src/main/resources/lang/es-VE.yml +++ b/Towny/src/main/resources/lang/es-VE.yml @@ -45,12 +45,12 @@ help_0: 'Ayuda General sobre Towny' help_1: 'Prueba los siguientes comandos para aprender más sobre towny.' help_2: 'Chat de la Ciudad' help_3: 'Chat de la Nación' -help_4: 'Resident command help.' -help_5: 'Town command help.' -help_6: 'Nation command help.' -help_7: 'Plot command help.' -help_8: 'Towny command help.' -help_9: 'Townyadmin command help.' +help_4: 'Ayuda del comando resident.' +help_5: 'Ayuda del comando town.' +help_6: 'Ayuda del comando nation.' +help_7: 'Ayuda del comando plot.' +help_8: 'Ayuda del comando towny.' +help_9: 'Ayuda del comando townyadmin.' towny_help_0: "General help for Towny" towny_help_1: "Displays a map of the nearby townblocks" towny_help_2: "Display the prices used with Economy" @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s compró el terreno de %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s no pudo pagar los impuestos y fue expulsado de %s.' msg_couldnt_pay_plot_taxes: '&b%s no pudo pagar los impuestos y perdió la propiedad de un terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagaste los impuestos de la ciudad ' msg_payed_plot_cost: '&bPagaste %s por %s terrenos en %s' msg_payed_resident_tax: '&bPagaste los impuestos de residencia en ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Ver todas las invitaciones salientes' town_invite_help_4: 'Ver todas las invitaciones entrantes' town_invite_help_5: 'Aceptar una invitación para unirse a una nación' town_invite_help_6: 'Rechazar una invitación para unirse a una nación' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invitar a una ciudad a tu nación.' nation_invite_help_2: 'Anular una invitación enviada a una ciudad.' nation_invite_help_3: 'Ver todas las invitaciones salientes.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTu ciudad será considerada msg_time_remaining_before_full_removal: 'Tiempo hasta que sea eliminado completamente: %d horas.' msg_time_until_reclaim_available: 'Tiempo hasta que se pueda volver a reclamar: %d horas.' msg_reclaim_available: 'Reclamo disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralidad de la ciudad ahora está %s.' msg_err_town_unclaim_canceled: '&cAbandono cancelado. No puedes realizar esta operación ahora mismo.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/fr-FR.yml b/Towny/src/main/resources/lang/fr-FR.yml index db3f942990..18bd8d30a1 100644 --- a/Towny/src/main/resources/lang/fr-FR.yml +++ b/Towny/src/main/resources/lang/fr-FR.yml @@ -106,30 +106,30 @@ town_set_help_1: "Mettre le homeblock de votre ville ici." town_set_help_2: "Mets le point de spawn dans votre homeblock ou votre point de spawn d'avant-poste quand vous êtes dans un avant-poste." town_set_help_3: "Voir /town set perm ? pour obtenir de l'aide." town_set_help_4: "Définissez le montant d'impôt de votre ville." -town_set_help_5: "Set the special amounts for per-plot taxes." -town_set_help_6: "Set the default prices for buying plots." -town_set_help_7: "Set the cost to use /t spawn." -town_set_help_8: "Set your town's name." -town_set_help_9: "Set your town's tag." -town_set_help_10: "Set the title or surname of your resident." -town_set_help_11: "Set the max amount of money a percentage tax can take from a resident." -town_jail_help_0: "List the town's jails." -town_jail_help_1: "Jail a resident in the primary jail." -town_jail_help_2: "Jail a resident in the primary jail, for the specified hours." -town_jail_help_3: "Jail a resident in the primary jail, for the specified hours, in the specified jail." -town_jail_help_4: "Jail a resident in the primary jail, for the specified hours, in the specified jail and cell." -town_jail_help_5: "Jail a resident in the primary jail, for the specified hours, with the given bail amount." -town_jail_help_6: "Jail a resident in the primary jail, for the specified hours, with the given bail amount, in the specified jail." -town_jail_help_7: "Jail a resident in the primary jail, for the specified hours, with the given bail amount, in the specified jail and cell." -town_jail_help_8: "Unjails the resident." -town_purge_help: "Purges residents that have not logged in for the given amount of days." -town_trust_help_0: "Adds a resident as Trusted in the town." -town_trust_help_1: "Removes a resident as Trusted in the town." -town_trust_help_2: "Lists the Trusted residents of a town." -town_towntrust_help_0: "Adds a town as Trusted in the town." -town_towntrust_help_1: "Removes a town as Trusted in the town." -town_towntrust_help_2: "Lists the Trusted towns of a town." -town_buy_help: "Purchases bonus townblocks to increase the claim limit of the town." +town_set_help_5: "Défini les montants spéciaux pour les taxes par parcelle." +town_set_help_6: "Défini les prix par défaut pour l'achat de parcelles." +town_set_help_7: "Défini le coût pour utiliser /t spawn." +town_set_help_8: "Défini le nom de votre ville." +town_set_help_9: "Défini le tag de votre ville." +town_set_help_10: "Défini le titre ou le surnom de votre résident." +town_set_help_11: "Défini le montant maximal d'argent qu'un pourcentage de taxe peut prendre à un résident." +town_jail_help_0: "Lister les prisons de la ville." +town_jail_help_1: "Emprisonner un résident dans la prison principale." +town_jail_help_2: "Emprisonner un résident dans la prison principale pendant les heures spécifiées." +town_jail_help_3: "Emprisonner un résident dans la prison principale, pendant les heures spécifiées, dans la prison spécifiée." +town_jail_help_4: "Emprisonner un résident dans la prison principale, pendant les heures spécifiées, dans la prison et la cellulle spécifiée." +town_jail_help_5: "Emprisonner un résident dans la prison principale, pendant les heures spécifiées, avec la caution spécifiée." +town_jail_help_6: "Emprisonner un résident dans la prison principale, pendant les heures spécifiées, avec la caution spécifiée, dans la prison spécifiée." +town_jail_help_7: "Emprisonner un résident dans la prison principale, pendant les heures spécifiées, avec la caution spécifiée, dans la prison et la cellule spécifiée." +town_jail_help_8: "Libère le résident emprisonné." +town_purge_help: "Expulse les résidents ne s'étant pas connectés pendant le montant donné de jours." +town_trust_help_0: "Ajoute un résident de confiance dans la ville." +town_trust_help_1: "Retire un résident de confiance dans la ville." +town_trust_help_2: "Liste les résidents de confiance d'une ville." +town_towntrust_help_0: "Ajoute une ville de confiance dans la ville." +town_towntrust_help_1: "Retire une ville de confiance de la ville." +town_towntrust_help_2: "Liste les villes de confiance d'une ville." +town_buy_help: "Achètes des blocs de ville bonus pour augmenter la limite de revendication de la ville." mayor_help_3: 'Parcelle non attachée à la ville' mayor_help_4: 'Annexe autour de vous dans un rayon de X' mayor_help_5: 'Annexe au rayon maximal' @@ -145,25 +145,25 @@ nation_help_6: 'Créer une nouvelle nation' nation_help_7: 'Lister les commandes de dirigeant de nation' nation_help_8: 'Créer une nouvelle nation' nation_help_9: 'Liste tout les résidents en ligne de la nation' -nation_help_11: "Lists the towns in the nation." -nation_help_12: "Lists the allied nations of the nation." -nation_help_13: "Lists the enemied nations of the nation." -nation_help_14: "Used to join open nations." -nation_help_15: "Deposits money into the nation bank." -nation_help_16: "Used to delete your nation." -nation_help_17: "Used to add or remove ranks from residents." -nation_help_18: "See /n rank ? for help." -nation_list_help_0: "View the specified page." -nation_list_help_1: "List nations by resident-count, with the specified page." -nation_list_help_2: "List nations by town-count, with the specified page." -nation_list_help_3: "List nations which are open, with the specified page." -nation_list_help_4: "List nations using bank balance, with the specified page." -nation_list_help_5: "List nations in alphabetical order, with the specified page." -nation_list_help_6: "List nations by claimed land, with the specified page." -nation_list_help_7: "List nations by number online, with the specified page." -nation_set_help_0: "Change the leader of the nation." -nation_set_help_1: "Change the capital city of the nation." -nation_set_help_2: "Set the amount of tax that towns will pay." +nation_help_11: "Liste les villes de la nation." +nation_help_12: "Liste les nations alliées de la nation." +nation_help_13: "Liste les nations ennemies de la nation." +nation_help_14: "Utilisé pour rejoindre les nations ouvertes." +nation_help_15: "Dépose de l'argent dans la banque de la nation." +nation_help_16: "Utilisé pour supprimer votre nation." +nation_help_17: "Utilisé pour ajouter ou retirer un rang des résidents." +nation_help_18: "Voir /n rank ? pour de l'aide." +nation_list_help_0: "Voir la page spécifiée." +nation_list_help_1: "Liste les nations par nombre de résidents, avec la page spécifiée." +nation_list_help_2: "Liste les nations par nombre de villes, avec la page spécifiée." +nation_list_help_3: "Liste les nations ouvertes avec la page spécifiée." +nation_list_help_4: "Liste les nations par solde bancaire avec la page spécifiée." +nation_list_help_5: "Liste les nations par ordre alphabétique avec la page spécifiée." +nation_list_help_6: "Liste les nations par possessions de terres avec la page spécifiée." +nation_list_help_7: "Liste les nations par joueurs en ligne, avec la page spécifiée." +nation_set_help_0: "Change le chef de la nation." +nation_set_help_1: "Change la capitale de la nation." +nation_set_help_2: "Définis le montant de taxe qu'une ville va payer." nation_set_help_3: "Set the amount of tax that conquered towns will pay." nation_set_help_4: "Set the name of the nation." nation_set_help_5: "Set the title or surname of one of your residents." @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s Achète la parcelle de %s pour %s !' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s ne pouvait pas payer les impôts et a été exclu de la %s.' msg_couldnt_pay_plot_taxes: '&b%s ne pouvait pas payer les impôts et a perdu la propriété d''une parcelle.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&ba payé les impôts de la ville de ' msg_payed_plot_cost: '&ba payé %s pour %s parcelles dans %s' msg_payed_resident_tax: '&ba payé l''impôt résidentiel de ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Liste de toutes les invitation envoyées' town_invite_help_4: 'Liste toutes les invitations que vous avez reçues' town_invite_help_5: 'Accepter une demande pour rejoindre une nation' town_invite_help_6: 'Rejeter une demande pour rejoindre une nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Inviter une ville dans votre nation' nation_invite_help_2: 'Annuler une invitation envoyée à une ville' nation_invite_help_3: 'Liste toutes les invitations envoyées aux villes' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cVotre ville est en ruine pe msg_time_remaining_before_full_removal: 'Temps restant avant la suppression complète : %d heures.' msg_time_until_reclaim_available: 'Temps jusqu''à ce que la récupération soit disponible: %d heures.' msg_reclaim_available: 'Récupération disponible.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralité / pacificité de la ville est maintenant %s.' msg_err_town_unclaim_canceled: '&cDésannexion annulée. Vous ne pouvez pas désannexer cette zone pour le moment.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/he-IL.yml b/Towny/src/main/resources/lang/he-IL.yml index ba26dac3a8..50c43b45a8 100644 --- a/Towny/src/main/resources/lang/he-IL.yml +++ b/Towny/src/main/resources/lang/he-IL.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b!סך הכל (%3$s) בעבור (%2$s) קנה את הח msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b.%s-לא עמד בתשלום מיסים וגורש מ s%' msg_couldnt_pay_plot_taxes: '&b%s לא עמד בתשלום מיסים ואיבד בעלות על חלקה.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&b שילם מס לעיר בסכום של ' msg_payed_plot_cost: '&b(%3$s)חלקות ב (%2$s) עבור (%1$s) שילם' msg_payed_resident_tax: '&b שילם מס תושב בסכום של ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cהעיר שלך תהיה ב msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cמצב הניטרליות/שחירת שלום עכשיו %s.' msg_err_town_unclaim_canceled: '&cביטול הבעלות בוטל. אתה לא יכול לבטל את הבעלות על איזור זה כרגע.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/id-ID.yml b/Towny/src/main/resources/lang/id-ID.yml index f851cfad20..1e2ba00673 100644 --- a/Towny/src/main/resources/lang/id-ID.yml +++ b/Towny/src/main/resources/lang/id-ID.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s membeli %s lahan seharga %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s tidak mampu membayar pajak, dan dikeluarkan dari %s.' msg_couldnt_pay_plot_taxes: '&b%s tidak mampu membayar pajak, dan kepemilikan lahan di hapus.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bMembayar pajak kota ' msg_payed_plot_cost: '&bTelah membayar %s seharga %s di lahan %s' msg_payed_resident_tax: '&bMembayar pajak penduduk ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Seluruh daftar undangan yang dikirim oleh mu' town_invite_help_4: 'Seluruh daftar undangan yang kamu terima' town_invite_help_5: 'Terima undangan untuk bergabung dengan negara tersebut' town_invite_help_6: 'Tolak undangan bergabung dengan negara' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Mengundang kota ke negara mu' nation_invite_help_2: 'Mencabut undangan, yang dikirim ke kota' nation_invite_help_3: 'Seluruh daftar undangan mu ke kota-kota' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cKota mu dalam keadaan krisi msg_time_remaining_before_full_removal: 'Waktu yang tersisa sebelum penghapusan penuh: %d jam.' msg_time_until_reclaim_available: 'Waktu hingga klaim ulang tersedia: %d jam.' msg_reclaim_available: 'Klaim ulang tersedia.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cKenetralan/kedamaian Kota saat ini %s.' msg_err_town_unclaim_canceled: '&cTidak klaim dibatalkan. Anda tidak dapat tidak mengeklaim area ini saat ini.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/it-IT.yml b/Towny/src/main/resources/lang/it-IT.yml index 206da97d79..f5f1a28aa8 100644 --- a/Towny/src/main/resources/lang/it-IT.yml +++ b/Towny/src/main/resources/lang/it-IT.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s ha comprato il lotto di %s per %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s non poteva pagare le tasse ed è stato cacciato da %s.' msg_couldnt_pay_plot_taxes: '&b%s non poteva pagare le tasse e ha perso la proprietà di un lotto.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bSono state pagate le tasse della città di ' msg_payed_plot_cost: '&bPagato %s per %s lotti in %s' msg_payed_resident_tax: '&bSono state pagate le tasse da residente di ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Elenco di tutti gli inviti mandati' town_invite_help_4: 'Elenco di tutti gli inviti ricevuti' town_invite_help_5: 'Accetta una richiesta di entrare in Nazione' town_invite_help_6: 'Rifiuta una richiesta di entrare in Nazione' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invita una città in Nazione.' nation_invite_help_2: 'Revoca un invito, che è stato inviato a una città' nation_invite_help_3: 'Elenco degli inviti mandati alle città.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cLa tua città si trova in u msg_time_remaining_before_full_removal: 'Tempo rimanente prima della rimozione completa: %d ora/e.' msg_time_until_reclaim_available: 'Tempo fino al reclaim disponibile: %d ora/e.' msg_reclaim_available: 'Reclaim disponibile.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cLa neutralità della città/tranquillità è ora %s.' msg_err_town_unclaim_canceled: '&cUnclaim annullata. Non puoi unclaimare questa area in questo momento.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/ja-JP.yml b/Towny/src/main/resources/lang/ja-JP.yml index a99988ef14..613342fee9 100644 --- a/Towny/src/main/resources/lang/ja-JP.yml +++ b/Towny/src/main/resources/lang/ja-JP.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s が %s のプロットを %s で購入しました msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s は税金を払うことができなかったため、 %s からキックされました' msg_couldnt_pay_plot_taxes: '&s%s は税金を払うことができなかったため、プロットの所有権を失いました' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '%b税金を支払いました: ' msg_payed_plot_cost: '&b %s を %s (%s)プロットに支払いました' msg_payed_resident_tax: '&b住民税を払いました: ' @@ -772,6 +774,7 @@ town_invite_help_3: '送信された招待を全て表示' town_invite_help_4: '送られてきた全ての招待を表示する' town_invite_help_5: '国からの参加リクエストを承認する' town_invite_help_6: '国からの参加リクエストを拒否する' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: '指定した町を自分の国に招待する' nation_invite_help_2: '町に送信された招待を削除する' nation_invite_help_3: '町に送られた招待を全て表示する' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/ko-KR.yml b/Towny/src/main/resources/lang/ko-KR.yml index 472c0c78c3..1835ff354e 100644 --- a/Towny/src/main/resources/lang/ko-KR.yml +++ b/Towny/src/main/resources/lang/ko-KR.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s는 %ss 만큼의 %s 땅을 구매하였습니다.' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s님은 세금을 미납하여 %s에서 추방되었습니다.' msg_couldnt_pay_plot_taxes: '&b%s님은 세금을 미납하여 땅의 소유권을 잃었습니다.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&b지불한 마을 세금: ' msg_payed_plot_cost: '&b %s을 %s 만큼의 %s의 땅을 위해 지불하였습니다' msg_payed_resident_tax: '&b지불한 주민 세금: ' @@ -464,7 +466,7 @@ msg_town_left_nation: '&b귀하의 도시가 %s에서 나갔습니다.' msg_nation_town_left: '&b%s시가 국가에서 나갔습니다.' msg_nation_kicked: '&b%s님이 %s을(를) 국가에서 추방하였습니다.' msg_raised_ass: '&b%s님이 %s을/를 %s의 도움이로 선택하였습니다.' -msg_lowered_to_res_by: '&b%s님에 의해 시민으로 강등되었습니다.' +msg_lowered_to_res_by: '&b%s님에 의해 일반 주민으로 강등되었습니다.' msg_lowered_to_res: '&b%s님이 %s을/를 시민으로 강등시켰습니다.' msg_invalid_name: '&b이름에 의해서 에러가 생겼습니다. 다시 시도해주세요.' msg_invited_join_town: '&b%s님이 %s님을 도시에 초대하였습니다.' @@ -772,6 +774,7 @@ town_invite_help_3: '귀하가 전송한 초대 목록' town_invite_help_4: '귀하가 수신한 초대 목록' town_invite_help_5: '국가 초대를 수락합니다.' town_invite_help_6: '국가 초대를 거부합니다.' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: '마을을 귀하의 국가에 초대합니다.' nation_invite_help_2: '마을에게 전송된 초대를 취소합니다.' nation_invite_help_3: '마을에게 전송한 초대 목록' @@ -1158,7 +1161,7 @@ msg_plot_was_put_into_group_x: '플롯 &9(%s,%s) 이(가) &2그룹 %s에 속합 msg_err_plot_not_associated_with_a_group: '해당 토지는 그룹과 연결되어 있지 않습니다.' msg_plot_was_removed_from_group_x: '토지 &9(%s,%s) 이(가) &2그룹 %s에서 제거 되었습니다.' msg_plot_renamed_from_x_to_y: '땅 %s을/를 %s(으)로 계명했습니다.' -msg_err_plot_group_specify_price: '가격을 정해주십시오, 예: /plot group fs [price]' +msg_err_plot_group_specify_price: '가격을 정해주십시오, 예: /plot group fs [값]' msg_player_put_group_up_for_sale_amount: '%s put group %s up for sale for %s!' msg_player_put_group_up_for_sale: '%s put group %s up for sale!' msg_err_could_not_set_group_type: '그룹 유형을 설정할 수 없습니다. - ' @@ -1263,10 +1266,10 @@ msg_nation_already_not_peaceful: '국가는 이미 평화상태가 아닙니다. status_world_friendlyfire: '아군 공격:' status_world_wildernessmobs: '야생 몹:' msg_outlaw_kick_cooldown: '당신은 %s에서 법외추방자로 지정되었습니다. 당신은 이 도시에서 %s초 이내에 떠나지 않을 경우, 자동으로 지정된 스폰으로 TP 됩니다.' -msg_outlaw_kicked: '&4당신은 %s에서 불청객이므로. 텔레포트 되어 쫓겨납니다!' +msg_outlaw_kicked: '&4당신은 %s에서 불청객이므로. 텔레포트 되어 쫓겨났습니다!' msg_outlaw_town_notify: '법외추방자인 %s가 영토에 진입하였습니다.' -msg_your_town_payed_upkeep_with_debt: '&b당신의 마을이 하루 유지비 %s 를 냈습니다..' -msg_payed_nation_tax_with_debt: '&b당신의 국가가 하루 유지비 %s 를 냈습니다.' +msg_your_town_payed_upkeep_with_debt: '&b당신의 마을이 하루 유지비 %s을(를) 냈습니다.' +msg_payed_nation_tax_with_debt: '&b당신의 국가가 하루 유지비 %s을(를) 냈습니다.' #Added in 0.90 status_plot_clear_deletion: 'PlotClearBlockDelete:' msg_err_plot_clear_disabled_in_this_world: '해당 월드에서 /plot clear 커맨드가 비활성화 되어 있습니다.' @@ -1277,18 +1280,19 @@ msg_universe_heart: '<3' townblock_plu: '마을 블록' #Added in 0.92 #Town Ruins -msg_newhour_success: '새로운 시간 커맨드가 성공적으로 실행 되었습니다!' +msg_newhour_success: 'newhour 커맨드가 성공적으로 실행 되었습니다!' town_help_12: '페허가된 상태에서 마을을 재점유합니다.' -msg_warning_town_ruined_if_deleted: "명령어 ''/t reclaim'' 를 사용하였을 때 %d 만큼이 지나면 마을주민 누구든 마을을 재점유 할 수 있습니다." -msg_warning_town_ruined_if_deleted2: "명령어 ''/t reclaim'' 를 사용하였을 때 %d 만큼이 지나면 마을주민 누구든 마을을 재점유 할 수 있습니다." +msg_warning_town_ruined_if_deleted: "경고!!!: 마을을 지울 시에 마을이 패허 상태로 %d 시간동안 전환됩니다. %d 시간 이후, 완전히 삭제됩니다. 패허 상태일때는 모든 권한이 일반 시민과 외부인에게 까지 부여되며 마을 회손이 가능합니다." +msg_warning_town_ruined_if_deleted2: "명령어 \"/t reclaim\"으로 %d시간 후에 일반 시민 누구나 마을을 재점유 할 수 있습니다." msg_err_cannot_reclaim_town_unless_ruined: '&c폐허가 되지 않았기 때문에 마을을 재점유 할 수 없습니다.' -msg_err_cannot_reclaim_town_yet: '&c당신은 마을을 %d 동안 재점유 할 수 없습니다.' +msg_err_cannot_reclaim_town_yet: '&c당신은 마을을 %d시간 동안 재점유 할 수 없습니다.' msg_town_reclaimed: '&b%s이(가) 마을 %s을(를) 재점유 했습니다.' -msg_err_cannot_use_command_because_town_ruined: "&c마을이 폐허가 되었으므로 커맨드를 쓸 수 없습니다. 노말 커맨드를 사용하려면 ''/town reclaim'', 또는 ''/town leave''을 사용하여 마을을 떠나십시오." -msg_warning_your_town_is_ruined_for_x_more_hours: '&c당신의 마을은 %d 동안 폐허 상태에 있습니다. 마을을 되찾으려면 ''''/town reclaim'''' 하여 관리 하세요.' -msg_time_remaining_before_full_removal: '전체 삭제까지 남은시간: %d 남음.' -msg_time_until_reclaim_available: '재점유 가능한 시간: %d' +msg_err_cannot_use_command_because_town_ruined: "&c마을이 폐허가 되었으므로 커맨드를 쓸 수 없습니다. 이 커맨드와 더불어 기본 마을 커멘드를 사용하려면 ''/town reclaim'', 또는 ''/town leave''를 사용하여 마을을 떠나십시오." +msg_warning_your_town_is_ruined_for_x_more_hours: '&c당신의 마을은 %d시간 동안 폐허 상태로 전환 되있습니다. 마을을 되찾으려면 ''''/town reclaim'''' 하여 되찾고 시장이 되세요.' +msg_time_remaining_before_full_removal: '완전 삭제까지 남은 시간: %d시간 남음.' +msg_time_until_reclaim_available: '재점유 가능한 시간: %d시간 남음' msg_reclaim_available: '재점유가 가능합니다.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&c마을의 중립/평화도는 %s입니다.' msg_err_town_unclaim_canceled: '&c점유 해제가 취소됨. 지금 해당 지역을 점유 해제 할 수 없습니다.' @@ -1471,7 +1475,7 @@ msg_err_player_is_not_jailed: '그 플레이어는 수감되지 않았습니다. msg_you_have_paid_bail: '당신은 보석금을 지불했습니다.' msg_you_have_been_freed_via_jailbreak: '탈옥입니다! 당신은 자유에요!!' msg_you_have_served_your_sentence_and_are_free: '감옥에서 제대로 복역했고 이젠 자유입니다!' -msg_x_has_served_their_sentence_and_is_free: '%s님은 성실히 복역했고 이젠 자유입니다!' +msg_x_has_served_their_sentence_and_is_free: '%s님은 성실히 복역했고 이젠 자유를 만끽합니다!' msg_you've_been_jailed_for_x_hours: '당신은 %s 시간동안 수감되었습니다.' msg_you_are_being_sent_to_jail: '당신은 곧 감옥에 갈 것입니다.' msg_err_you_cannot_remove_the_last_cell: '감옥에 다른 감방이 추가될 때까지 마지막 감방을 제거할 수 없습니다.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/lol-US.yml b/Towny/src/main/resources/lang/lol-US.yml index d120e03e3d..8040ab14d6 100644 --- a/Towny/src/main/resources/lang/lol-US.yml +++ b/Towny/src/main/resources/lang/lol-US.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s bought %s''s plot for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s couldn''t pay taxes and was kicked from the %s.' msg_couldnt_pay_plot_taxes: '&b%s couldn''t pay taxes and lost ownership of a plot.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPayed town tax of ' msg_payed_plot_cost: '&bPayed %s for %s plots in %s' msg_payed_resident_tax: '&bPayed resident tax of ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/lt-LT.yml b/Towny/src/main/resources/lang/lt-LT.yml index e894cdfb10..4bba1620f6 100644 --- a/Towny/src/main/resources/lang/lt-LT.yml +++ b/Towny/src/main/resources/lang/lt-LT.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s nusipirko %s sklypą už %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s negalėjo sumokėti mokesčių ir buvo išmestas iš %s.' msg_couldnt_pay_plot_taxes: '&b%s negalėjo sumokėti mokesčių ir prarado sklypo nuosavybės teises.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&b Sumokėtas miesto mokestis ' msg_payed_plot_cost: '&bSumokėta %s už %s sklypą/-us %s' msg_payed_resident_tax: '&b Sumokėtas gyventojo mokestis ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Išvardija visus Jūsų išsiųstus pakvietimus' town_invite_help_4: 'Išvardija visus Jūsų gautus pakvietimus' town_invite_help_5: 'Priimti prisijungimo prie valstybės pakvietimą' town_invite_help_6: 'Atmesti prisijungimo prie valstybės pakvietimą' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Pakviesti miestą prisijungti prie valstybės' nation_invite_help_2: 'Atšaukti miestui nusiųstą pakvietimą' nation_invite_help_3: 'Išvardyti visus miestams siųstus pakvietimus' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cJūsų miestas bus griuvės msg_time_remaining_before_full_removal: 'Iki visiško ištrinimo liko: %d valandos.' msg_time_until_reclaim_available: 'Iki galimo atgavimo liko: %d valandos.' msg_reclaim_available: 'Galimas atsiėmimas.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cMiesto neutralumas/taikingumas dabar yra %s.' msg_err_town_unclaim_canceled: '&cAtsisakymas atšauktas. Jūs negalite atsisakyti šių žemių dabar.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/lzh.yml b/Towny/src/main/resources/lang/lzh.yml index abb7fdc737..e3f5235de6 100644 --- a/Towny/src/main/resources/lang/lzh.yml +++ b/Towny/src/main/resources/lang/lzh.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s花費了%s購買了%s地段!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s因為交不起稅而被%s放逐 ' msg_couldnt_pay_plot_taxes: '&b%s因為交不起稅而失去了他的地段所有權 ' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&b繳納市鎮地方稅 ' msg_payed_plot_cost: '&b繳納%s作為%s在%s的地段稅' msg_payed_resident_tax: '&b繳納個人所得稅 ' @@ -471,8 +473,8 @@ msg_invited_join_town: '&b%s邀請%s加入市鎮 ' msg_invited_join_nation: '&b%s邀請%s加入城邦 ' msg_deny_invite: '&b%s拒絕了你的邀請 ' msg_invited: '&b你被邀請加入%s ' -msg_town_online: '城邑之在線者' -msg_nation_online: '國家之在線者' +msg_town_online: '邑之在線者' +msg_nation_online: '國之在線者' msg_allied_nations: '&b%s與%s結為友。' msg_enemy_nations: '&b%s將%s視為敵國 ' msg_enemy_to_neutral: '&b%s把%s調整為中立狀態 ' @@ -518,7 +520,7 @@ msg_specify_nation_name: '&b請取得城邦名' msg_peasant_right: '&b賤民沒有權利強迫他的領導者讓出寶座 ' msg_cost_spawn: '&b你花費了%s來傳送到市鎮傳送點 ' msg_cost_spawn_refund: '&b你獲得了被退回的市鎮傳送費用 ' -msg_town_spawn_warmup: '待傳……' +msg_town_spawn_warmup: '方傳送……' msg_town_rename_disabled: '&b已關閉市鎮重命名' msg_town_set_name: '&b%s更邑名為%s。' msg_nation_set_name: '&b%s更邦名為%s。' @@ -772,6 +774,7 @@ town_invite_help_3: '列出你發送的所有邀請' town_invite_help_4: '列出你收到的所有邀請' town_invite_help_5: '接受加入城邦的邀請' town_invite_help_6: '拒絕加入來自城邦的邀請' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: '邀請一個市鎮加入你的城邦' nation_invite_help_2: '撤消發送給市鎮的邀請' nation_invite_help_3: '列出發送給市鎮的所有邀請' @@ -946,7 +949,7 @@ msg_plot_evict: '已依法收復地段 ' msg_no_one_to_evict: '沒有人放棄這個地段 ' #Added in 0.46 nation_help_10: '傳送到城邦傳送點 ' -msg_nation_spawn_warmup: '&b等待傳送中 ' +msg_nation_spawn_warmup: '&b方傳送……' msg_set_nation_spawn: '&b已重新設定城邦傳送點 ' msg_err_cant_afford_tp_nation: '&c無法傳送到%s ' msg_err_nationspawn_has_not_been_set: '&c城邦傳送點尚未設定 ' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&c你的市鎮在一個毀滅 msg_time_remaining_before_full_removal: '距離完全清除前還剩%d小時 ' msg_time_until_reclaim_available: '距離可重新取得還須%d小時 ' msg_reclaim_available: '可以重新取得了 ' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&c現在市鎮中立/和平%s ' msg_err_town_unclaim_canceled: '&c取消收復 此時收復此地段失敗 ' @@ -1778,7 +1782,7 @@ msg_your_town_paid_x_to_unclaim: '你的市鎮支付了%s以註銷土地 ' confirmation_unclaiming_costs: '註銷土地將花費%s,是否繼續?' #Added in 0.140 #Message shown on first join, making players aware they can change how Towny messages appear using their Client's language setting. -msg_your_locale: 'Towny 以客户端置(%s)译之。 请注意,译或阙字符串。' +msg_your_locale: 'Towny 以客户端置(%s)译之。 請君留意,译或阙字符串。' #Message shown when a player tries to rename their town too quickly. msg_you_must_wait_x_seconds_before_renaming_your_town: '你必須再等待%s秒才能重新命名你的市鎮 ' #Added in 1.141 @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/nl-NL.yml b/Towny/src/main/resources/lang/nl-NL.yml index 10d14b57cd..1b6106c66f 100644 --- a/Towny/src/main/resources/lang/nl-NL.yml +++ b/Towny/src/main/resources/lang/nl-NL.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s heeft %s''s plot gekocht voor %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s kon geen belastingen betalen en werd uit de %s gezet.' msg_couldnt_pay_plot_taxes: '&b%s kon geen belastingen betalen en heeft het eigendom van een plot verloren.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bBetaalde stad belasting van ' msg_payed_plot_cost: '&bBetaalde %s voor %s plots in %s' msg_payed_resident_tax: '&bBetaalde inwoners belasting van ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Toon een lijst van al je gestuurde uitnodigingen' town_invite_help_4: 'Toont alle uitnodigingen die je hebt ontvangen' town_invite_help_5: 'Accepteer een verzoek om lid te worden van een natie' town_invite_help_6: 'Weiger een verzoek om lid te worden van een natie' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Nodig een stad uit voor uw natie' nation_invite_help_2: 'Trek een uitnodiging in, die gestuurd was naar een stad.' nation_invite_help_3: 'Lijst van alle uitnodigingen die naar steden verstuurd zijn.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/no-NO.yml b/Towny/src/main/resources/lang/no-NO.yml index 6eb9e7e0df..9fcf0c6e18 100644 --- a/Towny/src/main/resources/lang/no-NO.yml +++ b/Towny/src/main/resources/lang/no-NO.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s Kjøpt %s''s tomt for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s Kunne ikke betale skatt og ble fjernet fra %s.' msg_couldnt_pay_plot_taxes: '&b%s Kunne ikke betale skatt og mistet eierskapet av en tomt.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bBetalte ned skatten ' msg_payed_plot_cost: '&bBetalte %s for %s tomt i %s' msg_payed_resident_tax: '&bBetalte innbygger skatt ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Vis alle dine sendte invitasjoner' town_invite_help_4: 'Vis alle invitasjonene du har fått' town_invite_help_5: 'Aksepter en forespørsel om å bli med i en nasjon' town_invite_help_6: 'Avslå en forespørsel om å bli med i en nasjon' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your town.' nation_invite_help_2: 'Revoke an invite, that was sent to a ptown' nation_invite_help_3: 'List all of the invites sent to towns.' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cDin by er i en ruinert tils msg_time_remaining_before_full_removal: 'Gjenstående tid før full fjerning: %d timer.' msg_time_until_reclaim_available: 'Tid før reclaim er tilgjengelig: %d timer.' msg_reclaim_available: 'Reclaim er tilgjengelig.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cByens nøytralitet/fredelighet er nå %s.' msg_err_town_unclaim_canceled: '&cUnclaim ble avbrutt. Du kan ikke bruke unclaim på dette område på dette tidspunktet.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/pl-PL.yml b/Towny/src/main/resources/lang/pl-PL.yml index 9899c63821..617c768eac 100644 --- a/Towny/src/main/resources/lang/pl-PL.yml +++ b/Towny/src/main/resources/lang/pl-PL.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s kupił działkę od %s za %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&bMieszkaniec %s nie mógł zapłacić podatków i został wyrzucony z %s.' msg_couldnt_pay_plot_taxes: '&b%s nie mógł zapłacić podatków i został wysiedlony ze swojej działki.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bZapłacono podatki miejskie: ' msg_payed_plot_cost: '&bZapłacono %s za %s działek w %s' msg_payed_resident_tax: '&bZapłacono podatek mieszkańca w wysokości ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lista wysłanych przez ciebie zaproszeń' town_invite_help_4: 'Lista wszystkich zaproszeń, które otrzymałeś' town_invite_help_5: 'Zaakceptuj prośbę o dołączenie do nacji' town_invite_help_6: 'Odrzuć prośbę dołączenia do nacji' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Zaproś miasto do swojej nacji' nation_invite_help_2: 'Anuluj zaproszenie, ktore wysłałeś do miasta' nation_invite_help_3: 'Lista wszystkich zaproszeń wysłanych do miast' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTwoje miasto będzie w ruin msg_time_remaining_before_full_removal: 'Czas przed całkowitym usunięciem: %d godzin.' msg_time_until_reclaim_available: 'Odzyskanie tego miasta będzie możliwe za %d godzin.' msg_reclaim_available: 'Odzysk jest możliwy.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cNeutralność miasta jest teraz %s.' msg_err_town_unclaim_canceled: '&cPorzucenie anulowane. Nie możesz w tej chwili porzucić tego Bloku Miasta.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/pt-BR.yml b/Towny/src/main/resources/lang/pt-BR.yml index 0c930ce537..c9b8425659 100644 --- a/Towny/src/main/resources/lang/pt-BR.yml +++ b/Towny/src/main/resources/lang/pt-BR.yml @@ -179,7 +179,7 @@ nation_toggle_help_3: "Alterna o percentual de imposto, fazendo com que as cidad nation_sanction_help_1: "Adiciona uma cidade à lista de cidades sancionadas." nation_sanction_help_2: "Remove uma cidade da lista de cidades sancionadas." nation_sanction_help_3: "Lista as cidades sancionadas da sua nação." -nation_sanction_help_4: "Lists the given nation's Sanctioned Towns." +nation_sanction_help_4: "Lista as cidades sancionadas da nação em questão." king_help_1: 'Ajuda do Líder da Nação' king_help_2: 'Definir alianças.' king_help_3: 'Definir inimigos.' @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s comprou o terreno de %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s não conseguiu pagar os impostos e foi expulso de %s.' msg_couldnt_pay_plot_taxes: '&b%s não conseguiu pagar os impostos e perdeu a posse de um terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bVocê pagou o imposto da cidade de ' msg_payed_plot_cost: '&bVocê pagou %s por %s terrenos em %s' msg_payed_resident_tax: '&bVocê pagou o imposto de residência de ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lista de todos os seus convites enviados' town_invite_help_4: 'Lista de todos os seus convites recebidos' town_invite_help_5: 'Aceitar um convite para entrar numa nação' town_invite_help_6: 'Recusar um convite para entrar numa nação' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Convidar uma cidde para a sua nação' nation_invite_help_2: 'Cancelar um convite enviado a uma cidade' nation_invite_help_3: 'Lista de todos os convites enviados a cidades' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cSua cidade está em ruínas msg_time_remaining_before_full_removal: 'Tempo restante antes da remoção completa: %d horas.' msg_time_until_reclaim_available: 'Tempo até a reivindicação disponível: %d horas.' msg_reclaim_available: 'Reivindicação disponível.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cA neutralidade/paz da cidade agora é %s.' msg_err_town_unclaim_canceled: '&cReivindicação cancelada. Você não pode cancelar a reivindicação desta área neste momento.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/pt-PT.yml b/Towny/src/main/resources/lang/pt-PT.yml index 2f39be6e44..fd8bb42ccf 100644 --- a/Towny/src/main/resources/lang/pt-PT.yml +++ b/Towny/src/main/resources/lang/pt-PT.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s comprou o terreno de %s por %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s não conseguiu pagar os impostos e foi expulso de %s.' msg_couldnt_pay_plot_taxes: '&b%s não conseguiu pagar os impostos e perdeu a posse de um terreno.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPagaste os impostos da cidade de ' msg_payed_plot_cost: '&bPagaste %s por %s terrenos em %s' msg_payed_resident_tax: '&bPagaste o imposto de habitante de ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lista de todos os convites que enviaste' town_invite_help_4: 'Lista de todos os convites que recebeste' town_invite_help_5: 'Aceitar um convite para entrar numa nação' town_invite_help_6: 'Recusar um convite para entrar numa nação' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Convidar uma cidade para a tua nação' nation_invite_help_2: 'Cancelar um convite enviado a uma cidade' nation_invite_help_3: 'Lista de todos os convites enviados a cidades' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cSua cidade está em um esta msg_time_remaining_before_full_removal: 'Tempo restante antes da remoção completa: %d horas.' msg_time_until_reclaim_available: 'Tempo até a reclamação disponível: %d horas.' msg_reclaim_available: 'Reclamação disponível.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cA neutralidade/tranquilidade da cidade é agora %s.' msg_err_town_unclaim_canceled: '&cAbandono cancelado. Não podes abandonar esta área neste momento.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/ro-RO.yml b/Towny/src/main/resources/lang/ro-RO.yml index 43a207d791..9f98d0df85 100644 --- a/Towny/src/main/resources/lang/ro-RO.yml +++ b/Towny/src/main/resources/lang/ro-RO.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s a cumpărat plotul lui %s pentru %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s nu a putut să-şi plătească taxele şi a fost dat afară din %s.' msg_couldnt_pay_plot_taxes: '&b%s nu a putut să-şi plătească taxele şi a pierdut stăpânirea asupra unui plot.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bA plătit taxa oraşului de ' msg_payed_plot_cost: '&bA plătit %s pentru %s ploturi în %s' msg_payed_resident_tax: '%bA plătit taxa rezidenților de ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/ru-RU.yml b/Towny/src/main/resources/lang/ru-RU.yml index e2d999250b..393b882936 100644 --- a/Towny/src/main/resources/lang/ru-RU.yml +++ b/Towny/src/main/resources/lang/ru-RU.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s купил участок %s за %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s не смог оплатить налоги, и был изгнан из города %s.' msg_couldnt_pay_plot_taxes: '&b%s не смог заплатить налоги и потерял свой участок.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bЗаплатил налог городу ' msg_payed_plot_cost: '&bЗаплатил %s за %s участков в %s' msg_payed_resident_tax: '&bЗаплатил налог в ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Все отправленные вами приглашен town_invite_help_4: 'Все полученные вами приглашения' town_invite_help_5: 'Принять заявку на вступление в нацию' town_invite_help_6: 'Отказать в просьбе присоединиться к нации' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Пригласить город в свой город.' nation_invite_help_2: 'Отменить приглашение, которое было отправлено в город' nation_invite_help_3: 'Все приглашения, отправленные в города' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cВаш город нахо msg_time_remaining_before_full_removal: 'Время до полного удаления: %d часов.' msg_time_until_reclaim_available: 'Время до того, как будет доступен переприват: %d часов.' msg_reclaim_available: 'Переприват доступен.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cНейтралитет/мирность города теперь %s.' msg_err_town_unclaim_canceled: '&cРасприват отменён. Вы не можете расприватить этот участок в данный момент.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/sq-AL.yml b/Towny/src/main/resources/lang/sq-AL.yml index 46c6297343..97d05cef01 100644 --- a/Towny/src/main/resources/lang/sq-AL.yml +++ b/Towny/src/main/resources/lang/sq-AL.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s bought %s''s plot for %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s couldn''t pay taxes and was kicked from the %s.' msg_couldnt_pay_plot_taxes: '&b%s couldn''t pay taxes and lost ownership of a plot.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bPayed town tax of ' msg_payed_plot_cost: '&bPayed %s for %s plots in %s' msg_payed_resident_tax: '&bPayed resident tax of ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/sr-CS.yml b/Towny/src/main/resources/lang/sr-CS.yml index fb64db09cd..0e063a3bad 100644 --- a/Towny/src/main/resources/lang/sr-CS.yml +++ b/Towny/src/main/resources/lang/sr-CS.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s je kupio/la plot igrača %s za %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s je izbačen/a iz %s zbog nemogućnosti da plati poreze.' msg_couldnt_pay_plot_taxes: '&b%s je izgubio/la vlasništvo nad plotom zbog nemogućnosti da plati poreze.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bIsplaćen gradski porez od ' msg_payed_plot_cost: '&bPlaćeno %s za %s plot-ova u %s' msg_payed_resident_tax: '&bIsplaćen porez na stanovanje od ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Navodi sve poslate pozive' town_invite_help_4: 'Navodi sve primljene zahteve' town_invite_help_5: 'Prihvatite zahtev za ulazak u naciju' town_invite_help_6: 'Odbijte zahtev za ulazak u naciju' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Pozovite grad u Vašu naciju' nation_invite_help_2: 'Povucite poziv koji je poslat gradu' nation_invite_help_3: 'Spisak svih poziva poslatih gradovima' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cVaš grad leži u urušenom msg_time_remaining_before_full_removal: 'Vreme preostalo do potpunog uklanjanja: %d sati.' msg_time_until_reclaim_available: 'Vreme do dostupnosti reclaim-a: %d sati.' msg_reclaim_available: 'Reclaim dostupan.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cNeutralnost/mirnoća grada je sada %s.' msg_err_town_unclaim_canceled: '&cUnclaim otkazan. Ne možete unclaim-ovati ovu oblast u ovo vreme.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/sv-SE.yml b/Towny/src/main/resources/lang/sv-SE.yml index eef51f08bc..2de32a364b 100644 --- a/Towny/src/main/resources/lang/sv-SE.yml +++ b/Towny/src/main/resources/lang/sv-SE.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s köpte %s mark till priset %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s kunde inte betala skatten och blev utslängd från %s.' msg_couldnt_pay_plot_taxes: '&b%s kunde inte betala skatten och förlorade sin mark.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bBetalade statsskatten ' msg_payed_plot_cost: '&bBetalade %s för %s mark i %s' msg_payed_resident_tax: '&bBetalade invånarskatten ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lista alla dina skickade inbjudningar' town_invite_help_4: 'Listar alla inbjudningar du har fått' town_invite_help_5: 'Acceptera en inbjudan om att gå med i en nation' town_invite_help_6: 'Neka en inbjudan om att gå med i en nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Bjud in en stad till din nation' nation_invite_help_2: 'Återkalla en inbjudan, som skickades till en stad' nation_invite_help_3: 'Lista alla inbjudningar som skickats till städer' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cDin stad ligger i ett förs msg_time_remaining_before_full_removal: 'Tid kvar innan full borttagning: %d timmar.' msg_time_until_reclaim_available: 'Tid till reclaim är tillgängligt: %d timmar.' msg_reclaim_available: 'Reclaim tillgängligt.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cStadsneutralitet/fredlighet är nu %s.' msg_err_town_unclaim_canceled: '&cUnclaim avbruten. Du kan inte unclaima detta område just nu.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/th-TH.yml b/Towny/src/main/resources/lang/th-TH.yml index 18b3c3c3f2..4a57e9539c 100644 --- a/Towny/src/main/resources/lang/th-TH.yml +++ b/Towny/src/main/resources/lang/th-TH.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s ซื้อพล็อตของ %s สำห msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s ไม่สามารถจ่ายภาษีได้และถูกไล่ออกจาก %s' msg_couldnt_pay_plot_taxes: '&b%s ไม่สามารถจ่ายภาษีได้และเสียความเป็นเจ้าของ plot' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bจ่ายภาษีเมืองของ' msg_payed_plot_cost: '&bจ่าย %s สำหรับ %s แปลงใน %s' msg_payed_resident_tax: '&bชำระภาษีที่อยู่อาศัยของ' @@ -772,6 +774,7 @@ town_invite_help_3: 'แสดงรายการคำเชิญที่ town_invite_help_4: 'แสดงรายการคำเชิญทั้งหมดที่คุณได้รับ' town_invite_help_5: 'ยอมรับคำขอเข้าร่วม Nation' town_invite_help_6: 'ปฎิเสธขอร่วม Nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'เชิญ Town เข้าสู่ Nation ของคุณ' nation_invite_help_2: 'ปฏิเสทคำเชิญ, ที่ส่งไปยัง Town' nation_invite_help_3: 'รายชื่อคำเชิญทั้งหมดที่ส่งไปยัง Town' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cTown ของคุณจ msg_time_remaining_before_full_removal: '&cเวลาที่เหลือก่อนลบทั้งหมด: %d ชั่วโมง' msg_time_until_reclaim_available: '&cเวลาจนกว่าจะเรียกคืนได้: %d ชั่วโมง' msg_reclaim_available: '&aReclaim ใช้ได้' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cความเป็นกลางของเมือง/ความปลอดภัยตอนนี้คือ %s' msg_err_town_unclaim_canceled: '&cยกเลิกการ Claim แล้ว คุณไม่สามารถยกเลิกการ Claim พื้นที่นี้ได้ในขณะนี้' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/tl-PH.yml b/Towny/src/main/resources/lang/tl-PH.yml index 3bff69cc0b..486c923474 100644 --- a/Towny/src/main/resources/lang/tl-PH.yml +++ b/Towny/src/main/resources/lang/tl-PH.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s ay binili ang plot ni%s para sa %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: 'Si &b%s ay hindi nakapag-bayad nang buwis at ito ay natanggal sa %s.' msg_couldnt_pay_plot_taxes: 'Si &b%s ay hindi makapag-bayad nang buwis at nawala nito ang pag-mamay ari sa lupa.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bBinayaran ang buwis ng ' msg_payed_plot_cost: '&bNagbayad %s sa %s mga balakas sa %s' msg_payed_resident_tax: '&bNagbayad nang residenteng buwis ng ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Inililista ang lahat ng iyong ipinadalang imbitasyon' town_invite_help_4: 'Inililista ang lahat ng mga imbitasyon na iyong natanggap' town_invite_help_5: 'Tanggapin ang kahilingang sumali sa isang bansa' town_invite_help_6: 'Tanggihan ang isang kahilingan na sumali sa isang bansa' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Mag-imbita ng isang bayan sa iyong bansa' nation_invite_help_2: 'Bawiin ang isang imbitasyon, na ipinadala sa isang bayan' nation_invite_help_3: 'Ilista ang lahat ng mga imbitasyon na ipinadala sa mga bayan' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/tr-TR.yml b/Towny/src/main/resources/lang/tr-TR.yml index 99d07bb8f2..7600dd5b7d 100644 --- a/Towny/src/main/resources/lang/tr-TR.yml +++ b/Towny/src/main/resources/lang/tr-TR.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s, %s için %s arsasını satın aldı!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s vergi ödeyemedi ve %s tarafından atıldı.' msg_couldnt_pay_plot_taxes: '&b%s vergi ödeyemedi ve bir arsasını kaybetti.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bÖdenen şehir vergisi ' msg_payed_plot_cost: '&b%s içindeki %s parseller için %s ödendi' msg_payed_resident_tax: '&bÖdenen ikamet vergisi ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Gönderdiğiniz tüm davetleri listeler' town_invite_help_4: 'Aldığınız tüm davetleri listeler' town_invite_help_5: 'Bir ulusa katılma talebini kabul edin' town_invite_help_6: 'Bir ulusa katılma talebini reddedin' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Bir şehri milletinize davet edin' nation_invite_help_2: 'Bir şehire gönderilen daveti iptal et' nation_invite_help_3: 'Kasabalara gönderilen tüm davetleri listeleyin' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cKasabanız %d saat daha har msg_time_remaining_before_full_removal: 'Tam silinmeden önce kalan zaman: %d saat.' msg_time_until_reclaim_available: 'Alınabilirlik süresi: %d saat.' msg_reclaim_available: 'Geri alma mevcut.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cKasabanın tarafsızlığı / barışseverliği artık %s.' msg_err_town_unclaim_canceled: '&cHak talebi iptal edildi. Bu bölgeyi şu anda hak talebinde bulunamazsınız.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/uk-UA.yml b/Towny/src/main/resources/lang/uk-UA.yml index c4c97b6d06..551f4545f6 100644 --- a/Towny/src/main/resources/lang/uk-UA.yml +++ b/Towny/src/main/resources/lang/uk-UA.yml @@ -58,7 +58,7 @@ towny_help_3: "Показати ТОП" towny_help_4: "Показати час до початку нового дня" towny_help_5: "Показати статистику" towny_help_6: "Показати версію Towny" -towny_top_help_0: "List top residents based on subcommand." +towny_top_help_0: "Список найбагатших на основі субкоманди." towny_top_help_1: "Топ землевласників на основі субкоманди." towny_top_help_2: "Список найбагатших на основі субкоманди." town_help_1: 'Статус вашого міста' @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s купив ділянку землі %s за %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s не зміг сплатити податки, і був вигнаний з міста %s.' msg_couldnt_pay_plot_taxes: '&b%s не зміг сплатити податки й втратив право на власність ділянки.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bЗаплатив податок місту ' msg_payed_plot_cost: '&bСплатив %s за %s ділянок у %s' msg_payed_resident_tax: '&bЗаплатив податок у ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Всі повідомлення, які ви надісла town_invite_help_4: 'Всі повідомлення, які ви отримали' town_invite_help_5: 'Прийняти пропозицію щодо приєднання до нації' town_invite_help_6: 'Відхилити пропозицію приєднання до нації' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Запросити місто до своєї нації' nation_invite_help_2: 'Скасувати запрошення, надіслане до міста' nation_invite_help_3: 'Всі запрошення, які надіслані до міст' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cВаше місто зна msg_time_remaining_before_full_removal: 'Залишилось часу перед повним видаленням: %d годин.' msg_time_until_reclaim_available: 'Залишилось часу перед можливістю відновлення: %d годин.' msg_reclaim_available: 'Відновлення доступне.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cНейтралітет/мирність міста зараз %s.' msg_err_town_unclaim_canceled: '&cРозприват скасований. Ви не можете розприватити цю територію зараз.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/vi-VN.yml b/Towny/src/main/resources/lang/vi-VN.yml index c3af2edab4..ed79082e2e 100644 --- a/Towny/src/main/resources/lang/vi-VN.yml +++ b/Towny/src/main/resources/lang/vi-VN.yml @@ -46,21 +46,21 @@ help_1: 'Sử dụng lệnh sau để tìm hiểu thêm về lệnh Towny.' help_2: 'Chat thị trấn' help_3: 'Chat lãnh thổ' help_4: 'Resident command help.' -help_5: 'Town command help.' +help_5: 'Hướng Dẫn Lệnh Thành.' help_6: 'Resident command help.' -help_7: 'Plot command help.' -help_8: 'Towny command help.' -help_9: 'Townyadmin command help.' -towny_help_0: "General help for Towny" -towny_help_1: "Displays a map of the nearby townblocks" -towny_help_2: "Display the prices used with Economy" -towny_help_3: "Display highscores" -towny_help_4: "Display time until a new day" -towny_help_5: "Displays stats" -towny_help_6: "Displays the version of Towny" -towny_top_help_0: "List top residents based on subcommand." -towny_top_help_1: "List top land-owners based on subcommand." -towny_top_help_2: "List wealthiest based on subcommand." +help_7: 'Hướng Dẫn Lệnh Mảnh Đất.' +help_8: 'Hướng Dẫn Lệnh Quốc Gia.' +help_9: 'Lệnh Admin Towny.' +towny_help_0: "Trợ Giúp Của Quốc Gia" +towny_help_1: "Hiển Thị Map Ở Gần Thị trấn" +towny_help_2: "Hiện Thị Số Tiền" +towny_help_3: "Hiển Thị Điểm Số" +towny_help_4: "Hiển Thị Thời Gian Trong Ngày" +towny_help_5: "Hiển Thị Trạng thái" +towny_help_6: "Hiển Thị Phiên Bản" +towny_top_help_0: "Liệt Kê Những Cư Dân." +towny_top_help_1: "Top Nhà Giàu Sở Hữu Nhiều Ruộng Đất." +towny_top_help_2: "Những Người Giàu Nhất." town_help_1: 'Trạng thái thị trấn của bạn' town_help_2: '[Thị Trưởng]' town_help_3: 'Trạng thái của thị trấn đã chọn' @@ -71,65 +71,65 @@ town_help_7: 'Thị trấn mới với thị trưởng được chọn.' town_help_8: 'Danh sách lệnh cho thị trưởng.' town_help_9: 'Hôm nay là ngày đặc biệt!' town_help_10: 'Danh sách các cư dân đang online trong thị trấn' -town_help_13: "See a list of residents in the town." -town_help_14: "See a list of ranks in the town." -town_help_15: "See a list of outlaws in the town." -town_help_16: "See a list of plotgroups in the town." -town_help_17: "See a list of plot types in the town." -town_help_18: "Say a message to the town members." -town_help_19: "Set your town for sale, able to be bought by other players." -town_help_20: "Set your town not for sale." -town_help_21: "Buy the given town, as long as it is for sale." -town_help_22: "Deposit money into your town's bank." -town_help_23: "Used to modify your resident's town ranks." -town_help_24: "Used to delete your town." -town_help_25: "Used to modify your town's outlaws." -town_help_26: "List all towns, see /t list ? for help." -town_help_27: "Leave the town you're a member of." -town_help_28: "Withdraw money from your town's bank." -town_help_29: "Use /t claim ? for help." -town_help_30: "Used to unclaim land from your town." -town_help_31: "Add or remove residents." -town_help_32: "Use /t set ? for help." -town_help_33: "Use /t buy ? for help." -town_help_34: "Use /t toggle ? for help." -town_help_35: "Use /t rank ? for help." -town_list_help_0: "View the specified page." -town_list_help_1: "List towns by resident-count, with the specified page." -town_list_help_2: "List towns which are open, with the specified page." -town_list_help_3: "List towns using bank balance, with the specified page." -town_list_help_4: "List towns in alphabetical order, with the specified page." -town_list_help_5: "List towns by claimed land, with the specified page." -town_list_help_6: "List towns by number online, with the specified page." -town_set_help_0: "Set your town's board." -town_set_help_1: "Set your town's homeblock to where you're standing." -town_set_help_2: "Sets the spawn point in your homeblock or an outpost spawnpoint when stood in an outpost." -town_set_help_3: "See /town set perm ? for help." -town_set_help_4: "Set your town's tax amount." -town_set_help_5: "Set the special amounts for per-plot taxes." -town_set_help_6: "Set the default prices for buying plots." -town_set_help_7: "Set the cost to use /t spawn." -town_set_help_8: "Set your town's name." -town_set_help_9: "Set your town's tag." -town_set_help_10: "Set the title or surname of your resident." -town_set_help_11: "Set the max amount of money a percentage tax can take from a resident." -town_jail_help_0: "List the town's jails." -town_jail_help_1: "Jail a resident in the primary jail." -town_jail_help_2: "Jail a resident in the primary jail, for the specified hours." -town_jail_help_3: "Jail a resident in the primary jail, for the specified hours, in the specified jail." -town_jail_help_4: "Jail a resident in the primary jail, for the specified hours, in the specified jail and cell." -town_jail_help_5: "Jail a resident in the primary jail, for the specified hours, with the given bail amount." -town_jail_help_6: "Jail a resident in the primary jail, for the specified hours, with the given bail amount, in the specified jail." -town_jail_help_7: "Jail a resident in the primary jail, for the specified hours, with the given bail amount, in the specified jail and cell." -town_jail_help_8: "Unjails the resident." -town_purge_help: "Purges residents that have not logged in for the given amount of days." -town_trust_help_0: "Adds a resident as Trusted in the town." +town_help_13: "Xem Danh Sách Cư Dân Trong Thị Trấn." +town_help_14: "Xem Cấp Bậc Trong Thị trấn." +town_help_15: "Xem Trạng Thái Những Người Ngoài Thị Trấn." +town_help_16: "Xem Các Nhóm Trong Thị Trấn." +town_help_17: "Xem Danh Sách Đất Trong Thị Trấn." +town_help_18: "Gửi Tin Nhắn Tới Toàn Cư Dân." +town_help_19: "Bán Thị Trấn, Người Khác Có Thể Mua." +town_help_20: "Đặt Thị Trấn Không Bán." +town_help_21: "Mua Một Thị Trấn Nào Đó." +town_help_22: "Bỏ Tiền Vào Quỹ Thị Trấn." +town_help_23: "Sửa Đổi Cấp Bậc Của Cư Dân (Thị Trưởng)." +town_help_24: "Sử Dụng Thế Xóa Thị Trấn." +town_help_25: "Sửa Đổi Những Kẻ Ngoài Vòng Pháp Luật." +town_help_26: "Sử Dụng Lệnh /t list để được hướng dẫn." +town_help_27: "Cư Dân Rời Thị Trấn." +town_help_28: "Rút Tiền Khỏi Quỹ Thị Trấn." +town_help_29: "Sử Dụng /t claim ? để được tìm hiểu." +town_help_30: "Sử Dụng Để Bỏ Khu Đất Với Thị Trấn." +town_help_31: "Thêm Hoặc Đuổi Cư Dân." +town_help_32: "Sử dụng /t set ? để được hướng dẫn." +town_help_33: "Sử dụng /t buy ? để được hướng dẫn." +town_help_34: "Sử dụng /t toggle ? để được hướng dẫn." +town_help_35: "Sử dụng /t rank ? để được hướng dẫn." +town_list_help_0: "Xem Trang." +town_list_help_1: "Liệt Kê Những Thị Trấn Với Cư Dân Được Chọn." +town_list_help_2: "Liệt Kê Các Thị Trấn Đang Mở." +town_list_help_3: "Liệt kê các thị trấn sử dụng số dư ngân hàng, với trang được chỉ định." +town_list_help_4: "Liệt kê các thị trấn theo thứ tự bảng chữ cái, với trang được chỉ định." +town_list_help_5: "Liệt kê các thị trấn theo vùng đất được tuyên bố chủ quyền, với trang được chỉ định." +town_list_help_6: "Liệt kê các thị trấn theo số trực tuyến, với trang được chỉ định." +town_set_help_0: "Đặt bảng thị trấn của bạn." +town_set_help_1: "Đặt homeblock của thị trấn của bạn ở nơi bạn đang đứng." +town_set_help_2: "Đặt điểm sinh sản trong khối nhà của bạn hoặc điểm sinh sản tiền đồn khi đứng ở tiền đồn." +town_set_help_3: "Xem /town set perm ? để được giúp đỡ." +town_set_help_4: "Đặt số tiền thuế của thị trấn của bạn." +town_set_help_5: "Đặt số tiền đặc biệt cho thuế trên mỗi lô đất." +town_set_help_6: "Đặt giá mặc định để mua lô." +town_set_help_7: "Đặt chi phí để sử dụng /t spawn." +town_set_help_8: "Đặt tên thị trấn của bạn." +town_set_help_9: "Đặt thẻ thị trấn của bạn." +town_set_help_10: "Đặt chức danh hoặc họ của cư dân của bạn." +town_set_help_11: "Đặt số tiền tối đa mà thuế phần trăm có thể lấy từ một cư dân." +town_jail_help_0: "Liệt kê các nhà tù của thị trấn." +town_jail_help_1: "Bỏ tù một cư dân trong nhà tù chính." +town_jail_help_2: "Bỏ tù một cư dân trong nhà tù chính trong số giờ quy định." +town_jail_help_3: "Bỏ tù một cư dân trong nhà tù chính, trong số giờ quy định, trong nhà tù quy định." +town_jail_help_4: "Bỏ tù một cư dân trong nhà tù chính, trong số giờ quy định, trong nhà tù và phòng giam được chỉ định." +town_jail_help_5: "Bỏ tù một cư dân trong nhà tù chính, trong số giờ quy định, với số tiền bảo lãnh nhất định." +town_jail_help_6: "Bỏ tù một cư dân trong nhà tù chính, trong số giờ quy định, với số tiền bảo lãnh nhất định, trong nhà tù quy định." +town_jail_help_7: "Bỏ tù một cư dân trong nhà tù chính, trong số giờ quy định, với số tiền bảo lãnh nhất định, trong nhà tù và phòng giam được chỉ định." +town_jail_help_8: "Thả Tù cư dân." +town_purge_help: "Xóa những cư dân chưa đăng nhập trong số ngày nhất định." +town_trust_help_0: "Thêm một cư dân là Người đáng tin cậy trong thị trấn." town_trust_help_1: "Removes a resident as Trusted in the town." -town_trust_help_2: "Lists the Trusted residents of a town." -town_towntrust_help_0: "Adds a town as Trusted in the town." -town_towntrust_help_1: "Removes a town as Trusted in the town." -town_towntrust_help_2: "Lists the Trusted towns of a town." -town_buy_help: "Purchases bonus townblocks to increase the claim limit of the town." +town_trust_help_2: "Liệt kê các cư dân đáng tin cậy của một thị trấn." +town_towntrust_help_0: "Thêm một thị trấn là đáng tin cậy trong thị trấn." +town_towntrust_help_1: "Loại bỏ một thị trấn là đáng tin cậy trong thị trấn." +town_towntrust_help_2: "Liệt kê các thị trấn đáng tin cậy của một thị trấn." +town_buy_help: "Mua thêm các khối thị trấn để tăng giới hạn yêu cầu của thị trấn." mayor_help_3: 'Chiếm khu vực không thuộc thị trấn' mayor_help_4: 'Chiếm khu vực xung quanh bạn trong bán kính X' mayor_help_5: 'Chiếm theo bán kính lớn nhất' @@ -145,23 +145,23 @@ nation_help_6: 'Tạo một quốc gia mới' nation_help_7: 'Liệt kê các lệnh của lãnh đạo quốc gia' nation_help_8: 'Tạo một quốc gia mới' nation_help_9: 'Liệt kê tất cả cư dân online trong quốc gia' -nation_help_11: "Lists the towns in the nation." -nation_help_12: "Lists the allied nations of the nation." -nation_help_13: "Lists the enemied nations of the nation." -nation_help_14: "Used to join open nations." -nation_help_15: "Deposits money into the nation bank." -nation_help_16: "Used to delete your nation." -nation_help_17: "Used to add or remove ranks from residents." -nation_help_18: "See /n rank ? for help." -nation_list_help_0: "View the specified page." -nation_list_help_1: "List nations by resident-count, with the specified page." -nation_list_help_2: "List nations by town-count, with the specified page." -nation_list_help_3: "List nations which are open, with the specified page." -nation_list_help_4: "List nations using bank balance, with the specified page." -nation_list_help_5: "List nations in alphabetical order, with the specified page." -nation_list_help_6: "List nations by claimed land, with the specified page." -nation_list_help_7: "List nations by number online, with the specified page." -nation_set_help_0: "Change the leader of the nation." +nation_help_11: "Liệt kê các thị trấn trong cả nước." +nation_help_12: "Liệt kê các quốc gia đồng minh của quốc gia." +nation_help_13: "Liệt kê các quốc gia kẻ thù của dân tộc." +nation_help_14: "Được sử dụng để tham gia các quốc gia mở." +nation_help_15: "Gửi tiền vào ngân hàng quốc gia." +nation_help_16: "Được sử dụng để xóa quốc gia của bạn." +nation_help_17: "Được sử dụng để thêm hoặc xóa cấp bậc của cư dân." +nation_help_18: "Xem thứ hạng /n ? để được giúp đỡ." +nation_list_help_0: "Xem trang được chỉ định." +nation_list_help_1: "Liệt kê các quốc gia theo số lượng cư dân, với trang được chỉ định." +nation_list_help_2: "Liệt kê các quốc gia theo số thị trấn, với trang được chỉ định." +nation_list_help_3: "Liệt kê các quốc gia đang mở, với trang được chỉ định." +nation_list_help_4: "Liệt kê các quốc gia sử dụng số dư ngân hàng, với trang được chỉ định." +nation_list_help_5: "Liệt kê các quốc gia theo thứ tự bảng chữ cái, với trang được chỉ định." +nation_list_help_6: "Liệt kê các quốc gia theo vùng đất được tuyên bố chủ quyền, với trang được chỉ định." +nation_list_help_7: "Liệt kê các quốc gia theo số lượng trực tuyến, với trang được chỉ định." +nation_set_help_0: "Thay đổi người lãnh đạo đất nước." nation_set_help_1: "Change the capital city of the nation." nation_set_help_2: "Set the amount of tax that towns will pay." nation_set_help_3: "Set the amount of tax that conquered towns will pay." @@ -222,7 +222,7 @@ res_toggle_help_16: "Toggle the ability to deactivate your admin priviledges." res_jail_help_0: "Pays the bail cost to get out of jail." res_set_help_0: "Set your resident's About/Bio" res_set_help_1: "Set your resident's default plot permissions." -res_set_help_2: "Set your resident's modes." +res_set_help_2: "Đặt chế độ của cư dân của bạn." mode_1: 'Hiển thị bản đồ giữa các mảnh đất' mode_2: 'Chiếm đất khi bạn đi bộ tới' mode_3: 'Hủy sở hữu mảnh đất khi bạn đi bộ tới' @@ -247,40 +247,40 @@ world_help_2: '[Thế giới]' world_help_3: 'Trạng thái của thế giới mục tiêu' world_help_4: 'Liệt kê tất cả các thế giới' world_help_5: 'Tái tạo chunk này' -world_help_6: 'See /tw toggle ? for help' -world_help_7: 'See /tw set ? for help' -world_set_help_0: "Set the world's wilderness name." -world_toggle_help_0: "Toggle on/off if towns can claim land in this world." -world_toggle_help_1: "Toggle on/off if Towny is enabled in this world." -world_toggle_help_2: "Toggle on/off if wars can happen in this world." -world_toggle_help_3: "Toggle on/off if pvp or forcepvp is enabled in this world." -world_toggle_help_4: "Toggle on/off if friendlyfire is enabled in this world." -world_toggle_help_5: "Toggle on/off if explosions are enabled or forced in this world." -world_toggle_help_6: "Toggle on/off if fires are enabled or forced in this world." -world_toggle_help_7: "Toggle on/off the various mobs spawning settings in this world." -world_toggle_help_8: "Toggle on/off the revert-on-unclaim feature in this world." -world_toggle_help_9: "Toggle on/off the explosions-are-reverted features in this world." -world_toggle_help_10: "Toggle on/off the plot-clear-deletes-blocks command in this world." -world_toggle_help_11: "Toggle on/off the plot-unclaiming-deletes-blocks feature in this world." +world_help_6: 'Xem chuyển đổi /tw ? để được giúp đỡ' +world_help_7: '' +world_set_help_0: "Đặt tên hoang dã của thế giới." +world_toggle_help_0: "Bật/tắt nếu các thị trấn có thể yêu cầu đất ở thế giới này." +world_toggle_help_1: "Bật/tắt nếu Towny được kích hoạt ở thế giới này." +world_toggle_help_2: "Bật/tắt nếu chiến tranh có thể xảy ra trên thế giới này." +world_toggle_help_3: "Bật/tắt nếu pvp hoặc Forcepvp được bật trong thế giới này." +world_toggle_help_4: "Bật/tắt nếu tính năng bắn thân thiện được bật trong thế giới này." +world_toggle_help_5: "Bật/tắt nếu vụ nổ được kích hoạt hoặc buộc phải xảy ra trong thế giới này." +world_toggle_help_6: "Bật/tắt nếu hỏa hoạn được kích hoạt hoặc buộc phải xảy ra trong thế giới này." +world_toggle_help_7: "Bật/tắt các cài đặt sinh sản của mob khác nhau trong thế giới này." +world_toggle_help_8: "Bật/tắt tính năng hoàn nguyên khi không xác nhận trong thế giới này." +world_toggle_help_9: "Bật/tắt các tính năng hoàn nguyên về vụ nổ trong thế giới này." +world_toggle_help_10: "Bật/tắt lệnh cốt truyện rõ ràng-xóa-khối trong thế giới này." +world_toggle_help_11: "Bật/tắt tính năng không xác nhận cốt truyện-xóa-khối trong thế giới này." townyadmin_help_1: 'Hủy xác nhận quyền sở hữu mảnh đất này' townyadmin_help_2: 'Huỷ sở hữu đất xung quanh bạn.' -admin_panel_1: "See /ta set ? for help" +admin_panel_1: "" admin_panel_2: 'tải lại Towny' admin_panel_3: 'Chạy mã ngày mới' -admin_panel_4: "Unclaim an space surrounding you" +admin_panel_4: "Hủy yêu cầu một không gian xung quanh bạn" admin_panel_5: "See /ta plot ? for help" -admin_panel_6: "Give a positive or negative amount of townblocks to a player or town" +admin_panel_6: "Cung cấp số lượng thị trấn tích cực hoặc tiêu cực cho người chơi hoặc thị trấn" admin_panel_7: "See /ta toggle ? for help" -admin_panel_8: "Commands for controlling these objects" -admin_panel_9: "Teleport to the specified plot" -admin_panel_10: "Check if the player has a permission node" +admin_panel_8: "Các lệnh điều khiển các đối tượng này" +admin_panel_9: "Dịch chuyển đến cốt truyện được chỉ định" +admin_panel_10: "Kiểm tra xem người chơi có nút cấp phép không" admin_panel_11: "Reset your config" -admin_panel_12: "Make a backup of your Towny data" +admin_panel_12: "Tạo bản sao lưu dữ liệu Towny của bạn" admin_panel_13: "Dump your mysql db to flatfile" admin_panel_14: "Force save or load your database" admin_panel_15: "Run the newhour code" -admin_panel_16: "Purge old residents" -townyadmin_town_help_0: "Create a town with the given name and mayor." +admin_panel_16: "Thanh lọc cư dân cũ" +townyadmin_town_help_0: "Tạo một thị trấn với tên và thị trưởng đã cho." townyadmin_town_help_1: "Show the town status screen." townyadmin_town_help_2: "Add or remove residents from a town." townyadmin_town_help_3: "Rename a town." @@ -350,13 +350,13 @@ ta_set_help_4: "Set a resident's title." ta_set_help_5: "Set a resident's surname." ta_set_help_6: "Set a plot to a different town." ta_set_help_7: "Set a town's founder name." -ta_set_help_8: "Use size 0 to remove nationzone override." -ta_purge_help_0: "Purges residents who haven't logged in for longer than the given days, optionally set townless to remove only townless players, or specify a townname to only purge one town's residents." -ta_townmeta_help_1: "View the metadata stored on the town you specify." -ta_townmeta_help_2: "Set town metadata key and value." -ta_townmeta_help_3: "Add or remove a metadata by key from the town." -ta_residentmeta_help_1: "View the metadata stored on the resident you specify." -ta_residentmeta_help_2: "Set resident metadata key and value." +ta_set_help_8: "Sử dụng kích thước 0 để xóa ghi đè khu vực quốc gia." +ta_purge_help_0: "Thanh lọc những cư dân không đăng nhập lâu hơn số ngày nhất định, tùy chọn đặt không có thị trấn để chỉ loại bỏ những người chơi không có thị trấn hoặc chỉ định tên thị trấn để chỉ thanh lọc cư dân của một thị trấn." +ta_townmeta_help_1: "Xem siêu dữ liệu được lưu trữ trên thị trấn bạn chỉ định." +ta_townmeta_help_2: "Đặt khóa và giá trị siêu dữ liệu của thị trấn." +ta_townmeta_help_3: "Thêm hoặc xóa siêu dữ liệu theo khóa khỏi thị trấn." +ta_residentmeta_help_1: "Xem siêu dữ liệu được lưu trữ trên công dân mà bạn chỉ định." +ta_residentmeta_help_2: "Đặt khóa và giá trị siêu dữ liệu thường trú." ta_residentmeta_help_3: "Add or remove a metadata by key from the resident." ta_nationmeta_help_1: "View the metadata stored on the nation you specify." ta_nationmeta_help_2: "Set nation metadata key and value." @@ -368,27 +368,27 @@ ta_reload_help_3: "Reloads Towny permissions." ta_reload_help_4: "Reloads all components of Towny." ta_depositall_help_0: "Deposit the given amount into all town and nation banks." plot_help_0: "Turns on the plot info HUD." -plot_help_1: "Removes the owner of the plot." -plot_help_2: "Deletes a list of blocks from the plot." +plot_help_1: "Loại bỏ chủ sở hữu của lô đất." +plot_help_2: "Xóa danh sách các khối khỏi biểu đồ." plot_help_3: "See /plot set ? for help." plot_help_4: "See /plot toggle ? for help." plot_help_5: "See /plot group ? for help." -plot_help_6: "Removes permission overrides for a player." +plot_help_6: "Loại bỏ ghi đè quyền cho người chơi." plot_help_7: "Adds default permission overrides for a player." plot_help_8: "Opens the permission editor gui." -plot_help_9: "Adds a resident as Trusted in the plot." -plot_help_10: "Removes a resident as Trusted in the plot." +plot_help_9: "Thêm một cư dân là đáng tin cậy trong cốt truyện." +plot_help_10: "Xóa một cư dân là đáng tin cậy trong lô đất." plot_group_help_0: "Ex: /plot group new ExpensivePlots" -plot_group_help_1: "Removes a plot from the specified group." -plot_group_help_2: "Deletes a plotgroup completely." -plot_group_help_3: "Renames the group you are standing in." +plot_group_help_1: "Xóa một sơ đồ khỏi nhóm được chỉ định." +plot_group_help_2: "Xóa hoàn toàn một nhóm cốt truyện." +plot_group_help_3: "Đổi tên nhóm bạn đang tham gia." plot_group_help_4: "Ex: /plot group set perm resident on." plot_group_help_5: "Ex: /plot group toggle [pvp|fire|mobs]" plot_group_help_6: "Ex: /plot group forsale 50" plot_group_help_7: "Ex: /plot group notforsale" -plot_group_help_8: "Adds or removes a resident as trusted." -plot_group_help_9: "Adds a resident as Trusted in the plotgroup." -plot_group_help_10: "Removes a resident as Trusted in the plotgroup." +plot_group_help_8: "Thêm hoặc xóa một cư dân được coi là đáng tin cậy." +plot_group_help_9: "Thêm một cư dân là đáng tin cậy trong nhóm cốt truyện." +plot_group_help_10: "Xóa một cư dân là đáng tin cậy trong nhóm cốt truyện." plot_group_help_11: "Opens the plot perm GUI." plot_group_help_12: "Adds a player to the plot perm GUI." plot_group_help_13: "Removes a player to the plot perm GUI." @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s đã mua mảnh đất của %s với giá %s!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s không thể nộp thuế và bị đuổi khỏi %s.' msg_couldnt_pay_plot_taxes: '&b%s không thể nộp thuế và mất quyền sở hữu mảnh đất.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&bĐã nộp thuế thị trấn của ' msg_payed_plot_cost: '&bĐã thanh toán %s cho %s lô đất trong %s' msg_payed_resident_tax: '&bĐã nộp thuế cư trú của ' @@ -772,6 +774,7 @@ town_invite_help_3: 'Lists all of your sent invites' town_invite_help_4: 'Lists all of the invites you''ve received' town_invite_help_5: 'Accept a request to join a nation' town_invite_help_6: 'Deny a request to join a nation' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: 'Invite a town to your nation' nation_invite_help_2: 'Revoke an invite, that was sent to a town' nation_invite_help_3: 'List all of the invites sent to towns' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&cYour town lies in a ruined msg_time_remaining_before_full_removal: 'Time remaining before full removal: %d hours.' msg_time_until_reclaim_available: 'Time until reclaim available: %d hours.' msg_reclaim_available: 'Reclaim available.' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&cTown neutrality/peacefullness is now %s.' msg_err_town_unclaim_canceled: '&cUnclaim canceled. You cannot unclaim this area at this time.' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/zh-CN.yml b/Towny/src/main/resources/lang/zh-CN.yml index b9d0073b0e..280d59a11e 100644 --- a/Towny/src/main/resources/lang/zh-CN.yml +++ b/Towny/src/main/resources/lang/zh-CN.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s 花费了 %s 购买了 %s 的土地!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s 因为交不起税而被踢出了 %s.' msg_couldnt_pay_plot_taxes: '&b%s 交不起税而失去了他的土地所有权.' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&b缴纳城镇税: ' msg_payed_plot_cost: '&b缴纳 %s 作为 %s 在 %s 的土地税' msg_payed_resident_tax: '&b缴纳个人所得税: ' @@ -772,6 +774,7 @@ town_invite_help_3: '列出你发送的所有邀请' town_invite_help_4: '列出你收到的所有邀请' town_invite_help_5: '接受加入国家的邀请' town_invite_help_6: '拒绝加入来自国家的邀请' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: '邀请一个城镇加入你的国家' nation_invite_help_2: '撤消发送给城镇的邀请' nation_invite_help_3: '列出发送给城镇的所有邀请' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&c你的城镇已倒闭%d小 msg_time_remaining_before_full_removal: '距离完全删除:%d小时。' msg_time_until_reclaim_available: '距离可收复时间:%d小时。' msg_reclaim_available: '可收复。' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&c城镇中立/和平的状态现在是%s。' msg_err_town_unclaim_canceled: '&c放弃圈地已取消,你不能在这个时候放弃这片区域。' @@ -1714,7 +1718,7 @@ msg_jailed_war: '作为战俘监禁。' #Jail handbook messages msg_jailed_handbook_1: '看起来你因为%s而被监禁了。' #Jail handbook messages -msg_jailed_handbook_2: '啊……太糟糕了,实在太糟糕了。但是你又不能干些什么……不过,这里有一些被监禁时的小贴士,它们或许可以帮你。' +msg_jailed_handbook_2: '啊……太糟糕了,实在太糟糕了。但是你能干什么呢?这里有一些被监禁时的小贴士,读一读吧,这或许可以帮你。' #Jail handbook messages msg_jailed_handbook_3: '你已经被监禁%s小时了,服刑后你将得到自由。' #Jail handbook messages @@ -1730,11 +1734,11 @@ msg_jailed_handbook_5: '如果你坚持逃离到了城镇外的野地,你将 #Jail handbook messages msg_jailed_handbook_6: '但是在到达野地之前不要死亡,否则你将被送回监狱。' #Jail handbook messages -msg_jailed_teleport: '但幸运的是……如果你手中有一些末影珍珠和紫颂果,你可以在监狱里使用它们来帮助你越狱。' +msg_jailed_teleport: '但幸运的是——如果你有末影珍珠或是紫颂果的话,你可以使用它们,这可以帮助你越狱。' #Jail handbook messages msg_jailed_war_prisoner: '作为战俘,如果你的国家攻陷了监狱(HP降为0)或城镇退出了战争,你将获得自由。' #Jail handbook title -msg_jailed_title: '所以……你就这样被监禁了:(' +msg_jailed_title: '所以……你被监禁了:(' #Jail handbook author msg_jailed_author: 'Towny Jailco。' #Added in 0.130 @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." diff --git a/Towny/src/main/resources/lang/zh-TW.yml b/Towny/src/main/resources/lang/zh-TW.yml index c6d53ba788..fc51df58ff 100644 --- a/Towny/src/main/resources/lang/zh-TW.yml +++ b/Towny/src/main/resources/lang/zh-TW.yml @@ -427,6 +427,8 @@ msg_buy_resident_plot: '&b%s花費了%s購買了%s地段!' msg_buy_resident_plot_group: '&b%s bought %s''s plotgroup for %s!' msg_couldnt_pay_taxes: '&b%s因為交不起稅而被%s放逐 ' msg_couldnt_pay_plot_taxes: '&b%s因為交不起稅而失去了他的地段所有權 ' +msg_you_couldnt_pay_plot_tax: '&bYou couldn''t pay the plot tax of %s and lost ownership of the plot at %s.' +msg_you_couldnt_pay_town_tax: '&bYou couldn''t pay the town tax of %s and have been removed from %s.' msg_payed_town_tax: '&b繳納市鎮地方稅 ' msg_payed_plot_cost: '&b繳納%s作為%s在%s的地段稅' msg_payed_resident_tax: '&b繳納個人所得稅 ' @@ -772,6 +774,7 @@ town_invite_help_3: '列出你發送的所有邀請' town_invite_help_4: '列出你收到的所有邀請' town_invite_help_5: '接受加入城邦的邀請' town_invite_help_6: '拒絕加入來自城邦的邀請' +town_invite_help_7: 'Remove all of the invites your town has sent out' nation_invite_help_1: '邀請一個市鎮加入你的城邦' nation_invite_help_2: '撤消發送給市鎮的邀請' nation_invite_help_3: '列出發送給市鎮的所有邀請' @@ -1289,6 +1292,7 @@ msg_warning_your_town_is_ruined_for_x_more_hours: '&c你的市鎮在一個毀滅 msg_time_remaining_before_full_removal: '距離完全清除前還剩%d小時 ' msg_time_until_reclaim_available: '距離可重新取得還須%d小時 ' msg_reclaim_available: '可以重新取得了 ' +msg_ruined_town_being_deleted: "%s was ruined for %s hours and is being deleted." #Added in 0.93 msg_changed_peaceful: '&c現在市鎮中立/和平%s ' msg_err_town_unclaim_canceled: '&c取消收復 此時收復此地段失敗 ' @@ -2097,3 +2101,16 @@ msg_err_unable_to_use_bank_outside_bank_plot_no_homeblock: 'You cannot use that msg_err_you_cannot_outlaw_your_mayor: "You cannot outlaw your town's mayor." msg_err_you_cannot_outlaw_because_of_rank: "You cannot outlaw %s because of a town rank they hold." status_nation_sanctioned_towns: "Sanctioned Towns" +msg_all_of_your_towns_sent_invites_have_been_cancelled: "All of your town's sent invites have been cancelled." +msg_err_name_validation_invalid_characters: "%s contains characters which aren't allowed in the Towny regex settings." +msg_err_name_validation_begins_with_eco_prefix: "%s begins with letters used in the economy features, you cannot use this name." +msg_err_name_validation_name_already_in_use: "%s is a name that is already in use." +msg_err_name_validation_title_too_long: "%s is too long to use as a title or surname." +msg_err_name_validation_name_too_long: "%s is too long to use as a name." +msg_err_name_validation_is_empty: "You cannot supply an empty name." +msg_err_name_validation_is_not_permitted: "%s is not permitted." +msg_err_name_validation_is_all_underscores: "%s is entirely underscores." +msg_err_name_validation_contains_harmful_characters: "%s contains symbols that could be harmful." +msg_err_name_validation_contains_numbers: "%s contains numbers which aren't allowed in names." +msg_err_name_validation_used_in_command_structure: "%s is used in the command structure, you cannot use this name." +msg_town_being_deleted_because_no_residents: "%s is being deleted because it lost its last resident." From fa79d92445f87d3a93fa08de9bdb289e4d8f3f58 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Sat, 17 Feb 2024 09:47:04 -0600 Subject: [PATCH 14/27] Add do-not-overwrite block list to worlds. (#7256) Prevents wilderness explosions from overwriting newly placed blocks, ie chests inside of creeper holes. Closes #7255. --- .../bukkit/config/ConfigNodes.java | 13 ++++++++++-- .../bukkit/towny/TownySettings.java | 6 +++++- .../bukkit/towny/db/SQLSchema.java | 1 + .../bukkit/towny/db/TownyFlatFileSource.java | 19 +++++++++++++++++ .../bukkit/towny/db/TownySQLSource.java | 20 ++++++++++++++++++ .../bukkit/towny/object/TownyWorld.java | 20 ++++++++++++++++++ .../towny/tasks/ProtectionRegenTask.java | 21 ++++++++++++++++++- 7 files changed, 96 insertions(+), 4 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java index 44931c9470..2a1fd267f1 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java +++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java @@ -458,8 +458,17 @@ public enum ConfigNodes { NWS_PLOT_MANAGEMENT_WILD_REVERT_BLOCK_WHITELIST( "new_world_settings.plot_management.wild_revert_on_explosion_block_whitelist", "", - "# The list of blocks to regenerate. (if empty all blocks will regenerate)"), - + "# This section is applied to new worlds as default settings when new worlds are detected.", + "# The list of blocks to regenerate for block and entity explosions. (if empty all blocks will regenerate)"), + NWS_PLOT_MANAGEMENT_WILD_REVERT_BLOCKS_TO_NOT_OVERWRITE( + "new_world_settings.plot_management.wild_revert_explosions_blocks_to_not_replace", + "", + "# This section is applied to new worlds as default settings when new worlds are detected.", + "# This is the list of blocks that should not be overwritten by wilderness explosion reverts. (if empty all ", + "# blocks placed into regenerating explosions will be overwritten with the original pre-explosion blocks.)", + "# This list is useful if you have a death chest plugin which could put a player's inventory inside chest", + "# that is inside of a regenerating creeper explosion pit. For Example: By putting CHEST here you can ", + "# prevent the chest from being overwritten by the dirt block that used to be there."), GTOWN_SETTINGS( "global_town_settings", diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java index 52cadc5e45..7212747816 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java @@ -1517,7 +1517,11 @@ public static List getWildExplosionProtectionEntities() { public static List getWildExplosionRevertBlockWhitelist() { return getStrArr(ConfigNodes.NWS_PLOT_MANAGEMENT_WILD_REVERT_BLOCK_WHITELIST); } - + + public static List getWildExplosionRevertMaterialsToNotOverwrite() { + return getStrArr(ConfigNodes.NWS_PLOT_MANAGEMENT_WILD_REVERT_BLOCKS_TO_NOT_OVERWRITE); + } + public static List getWildExplosionProtectionBlocks() { return getStrArr(ConfigNodes.NWS_PLOT_MANAGEMENT_WILD_BLOCK_REVERT_LIST); } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLSchema.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLSchema.java index 7c3564f346..bcae78d886 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLSchema.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLSchema.java @@ -308,6 +308,7 @@ private static List getWorldColumns() { columns.add("`usingPlotManagementWildRegen` bool NOT NULL DEFAULT '0'"); columns.add("`plotManagementWildRegenEntities` mediumtext NOT NULL"); columns.add("`plotManagementWildRegenBlockWhitelist` mediumtext NOT NULL"); + columns.add("`wildRegenBlocksToNotOverwrite` mediumtext NOT NULL"); columns.add("`plotManagementWildRegenSpeed` long NOT NULL"); columns.add("`usingPlotManagementWildRegenBlocks` bool NOT NULL DEFAULT '0'"); columns.add("`plotManagementWildRegenBlocks` mediumtext NOT NULL"); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyFlatFileSource.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyFlatFileSource.java index e5040c8323..eb2e2de6ad 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyFlatFileSource.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyFlatFileSource.java @@ -1518,6 +1518,20 @@ public boolean loadWorld(TownyWorld world) { } catch (Exception ignored) { } + line = keys.get("wildRegenBlocksToNotOverwrite"); + if (line != null) + try { + List mats = new ArrayList<>(); + for (String s : line.split(",")) + if (!s.isEmpty()) + try { + mats.add(s.trim()); + } catch (NumberFormatException ignored) { + } + world.setWildRevertMaterialsToNotOverwrite(mats); + } catch (Exception ignored) { + } + line = keys.get("usingPlotManagementWildRegenDelay"); if (line != null) try { @@ -2288,6 +2302,11 @@ public boolean saveWorld(TownyWorld world) { if (world.getPlotManagementWildRevertBlockWhitelist() != null) list.add("PlotManagementWildRegenBlockWhitelist=" + StringMgmt.join(world.getPlotManagementWildRevertBlockWhitelist(), ",")); + list.add("# The list of blocks to that should not get replaced when an explosion is reverted in the wilderness, ie: a chest placed in a creeper hole that is reverting."); + // Wilderness Explosion materials to not overwrite. + if (world.getWildRevertMaterialsToNotOverwrite() != null) + list.add("wildRegenBlocksToNotOverwrite=" + StringMgmt.join(world.getWildRevertMaterialsToNotOverwrite(), ",")); + list.add("# The delay after which the explosion reverts will begin."); // Using PlotManagement Wild Regen Delay list.add("usingPlotManagementWildRegenDelay=" + world.getPlotManagementWildRevertDelay()); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java index 3491cdae30..4685fc30de 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java @@ -1674,6 +1674,21 @@ private boolean loadWorld(ResultSet rs) { } catch (Exception ignored) { } + line = rs.getString("wildRegenBlocksToNotOverwrite"); + if (line != null) + try { + List materials = new ArrayList<>(); + search = (line.contains("#")) ? "#" : ","; + for (String split : line.split(search)) + if (!split.isEmpty()) + try { + materials.add(split.trim()); + } catch (NumberFormatException ignored) { + } + world.setWildRevertMaterialsToNotOverwrite(materials); + } catch (Exception ignored) { + } + resultLong = rs.getLong("plotManagementWildRegenSpeed"); try { world.setPlotManagementWildRevertDelay(resultLong); @@ -2422,6 +2437,11 @@ public synchronized boolean saveWorld(TownyWorld world) { nat_hm.put("PlotManagementWildRegenBlockWhitelist", StringMgmt.join(world.getPlotManagementWildRevertBlockWhitelist(), "#")); + // Wilderness Explosion Protection Materials to not overwrite. + if (world.getWildRevertMaterialsToNotOverwrite() != null) + nat_hm.put("wildRegenBlocksToNotOverwrite", + StringMgmt.join(world.getWildRevertMaterialsToNotOverwrite(), "#")); + // Using PlotManagement Wild Regen Delay nat_hm.put("plotManagementWildRegenSpeed", world.getPlotManagementWildRevertDelay()); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index 178cfe8702..d39827c98c 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -52,6 +52,7 @@ public class TownyWorld extends TownyObject { private long plotManagementWildRevertDelay = TownySettings.getPlotManagementWildRegenDelay(); private Set entityExplosionProtection = null; private Set plotManagementWildRevertBlockWhitelist = null; + private Set wildRevertMaterialsToNotOverwrite = null; private boolean isUsingPlotManagementWildBlockRevert = TownySettings.isUsingPlotManagementWildBlockRegen(); private Set blockExplosionProtection = null; @@ -393,6 +394,7 @@ public void setUsingDefault() { setUsingPlotManagementWildBlockRevert(TownySettings.isUsingPlotManagementWildBlockRegen()); blockExplosionProtection = null; plotManagementWildRevertBlockWhitelist = null; + wildRevertMaterialsToNotOverwrite = null; // Entities protected from explosions entityExplosionProtection = null; } @@ -619,6 +621,24 @@ public boolean isExplodedBlockAllowedToRevert(Material mat) { return isPlotManagementWildRevertWhitelistedBlock(mat); } + public void setWildRevertMaterialsToNotOverwrite(List mats) { + wildRevertMaterialsToNotOverwrite = new HashSet<>(); + wildRevertMaterialsToNotOverwrite.addAll(TownySettings.toMaterialSet(mats)); + } + + public Collection getWildRevertMaterialsToNotOverwrite() { + if (wildRevertMaterialsToNotOverwrite == null) + setWildRevertMaterialsToNotOverwrite(TownySettings.getWildExplosionRevertMaterialsToNotOverwrite()); + return wildRevertMaterialsToNotOverwrite; + } + + public boolean isMaterialNotAllowedToBeOverwrittenByWildRevert(Material mat) { + if (wildRevertMaterialsToNotOverwrite == null) + setWildRevertMaterialsToNotOverwrite(TownySettings.getWildExplosionRevertMaterialsToNotOverwrite()); + + return wildRevertMaterialsToNotOverwrite.contains(mat); + } + /** * @deprecated in lieu of {@link #isExplodedBlockAllowedToRevert(Material)} in 0.99.1.5. * @param mat Material that is being checked diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/ProtectionRegenTask.java b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/ProtectionRegenTask.java index bbd5beff25..3a35db5935 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/ProtectionRegenTask.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/ProtectionRegenTask.java @@ -1,14 +1,18 @@ package com.palmergames.bukkit.towny.tasks; import com.palmergames.bukkit.towny.Towny; +import com.palmergames.bukkit.towny.TownyAPI; import com.palmergames.bukkit.towny.TownySettings; import com.palmergames.bukkit.towny.hooks.PluginIntegrations; +import com.palmergames.bukkit.towny.object.TownyWorld; import com.palmergames.bukkit.towny.regen.TownyRegenAPI; import com.palmergames.bukkit.towny.regen.block.BlockLocation; import com.palmergames.bukkit.towny.scheduling.ScheduledTask; import io.papermc.lib.PaperLib; import net.coreprotect.CoreProtect; + +import org.bukkit.Material; import org.bukkit.block.Banner; import org.bukkit.block.Block; import org.bukkit.block.BlockState; @@ -67,11 +71,15 @@ public void run() { } public void replaceProtections() { + // Don't replace blocks if a new block has appeared which should not be + // overwritten with the pre-explosion block. ie: death-chests. + if (unreplaceableBlockHasAppeared()) + return; Block block = state.getBlock(); // Replace physical block. - BlockData blockData = state.getBlockData().clone(); + BlockData blockData = state.getBlockData().clone(); block.setType(state.getType(), false); block.setBlockData(blockData); @@ -116,6 +124,17 @@ public void replaceProtections() { } } + private boolean unreplaceableBlockHasAppeared() { + Block block = blockLocation.getBlock(); + // We should only skip replacement when we're in the wilderness and not air. + if (block.getType() == Material.AIR || !TownyAPI.getInstance().isWilderness(block)) + return false; + + TownyWorld world = TownyAPI.getInstance().getTownyWorld(blockLocation.getWorld()); + return world != null && world.isMaterialNotAllowedToBeOverwrittenByWildRevert(block.getType()); + } + + /** * @return the blockLocation */ From a99e4f5209b1d169f4cc983b2f6333cb70682101 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Sat, 17 Feb 2024 09:48:45 -0600 Subject: [PATCH 15/27] - Fix comod error when removing all sent invites, courtesy of Warrior with PR #7254. - Bump org.junit.jupiter:junit-jupiter-api from 5.10.1 to 5.10.2. - Bump org.junit.jupiter:junit-jupiter from 5.10.1 to 5.10.2. - Add do-not-overwrite block list to worlds that affects wilderness explosion reverts. - Prevents wilderness explosions from overwriting newly placed blocks, ie chests inside of creeper holes. - Closes #7255. - New Config Option: new_world_settings.plot_management.wild_revert_explosions_blocks_to_not_replace - Default: "" - This section is applied to new worlds as default settings when new worlds are detected. - This is the list of blocks that should not be overwritten by wilderness explosion reverts. - (if empty all blocks placed into regenerating explosions will be overwritten with the original pre-explosion blocks.) - This list is useful if you have a death chest plugin which could put a player's inventory inside chest that is inside of a regenerating creeper explosion pit. - For Example: By putting CHEST here you can prevent the chest from being overwritten by the dirt block that used to be there. --- Towny/src/main/resources/ChangeLog.txt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index 972f209e07..f7bd5efdb7 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9520,4 +9520,17 @@ v0.92.0.11: - Fix NameValidation issues. 0.100.1.14: - Fix missing feedback messages when a resident cannot pay their plot or town taxes. - - Add log messages describing why a town was deleted when it was ruined for too long, and when the last resident leaves town. \ No newline at end of file + - Add log messages describing why a town was deleted when it was ruined for too long, and when the last resident leaves town. + - Fix comod error when removing all sent invites, courtesy of Warrior with PR #7254. + - Bump org.junit.jupiter:junit-jupiter-api from 5.10.1 to 5.10.2. + - Bump org.junit.jupiter:junit-jupiter from 5.10.1 to 5.10.2. + - Add do-not-overwrite block list to worlds that affects wilderness explosion reverts. + - Prevents wilderness explosions from overwriting newly placed blocks, ie chests inside of creeper holes. + - Closes #7255. + - New Config Option: new_world_settings.plot_management.wild_revert_explosions_blocks_to_not_replace + - Default: "" + - This section is applied to new worlds as default settings when new worlds are detected. + - This is the list of blocks that should not be overwritten by wilderness explosion reverts. + - (if empty all blocks placed into regenerating explosions will be overwritten with the original pre-explosion blocks.) + - This list is useful if you have a death chest plugin which could put a player's inventory inside chest that is inside of a regenerating creeper explosion pit. + - For Example: By putting CHEST here you can prevent the chest from being overwritten by the dirt block that used to be there. \ No newline at end of file From 373fc1fa85f03795de721af3760abc02ea331400 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Sat, 17 Feb 2024 15:04:12 -0600 Subject: [PATCH 16/27] - Prevent falling blocks falling during unclaimed land regeneration. - Closes #7259 --- Towny/pom.xml | 2 +- .../bukkit/towny/listeners/TownyEntityListener.java | 6 ++++++ .../main/java/com/palmergames/bukkit/util/ItemLists.java | 5 +++++ Towny/src/main/resources/ChangeLog.txt | 5 ++++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index 71decf7674..da7094879e 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -13,7 +13,7 @@ towny jar - 0.100.1.14 + 0.100.1.15 diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyEntityListener.java b/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyEntityListener.java index 52314181f5..b5222d77bf 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyEntityListener.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyEntityListener.java @@ -489,6 +489,12 @@ public void onEntityChangeBlockEvent(EntityChangeBlockEvent event) { return; } + // Prevent blocks from falling while their plot is being regenerated back to it's pre-claimed state. + if (ItemLists.FALLING_BLOCKS.contains(blockMat) && TownyRegenAPI.hasActiveRegeneration(WorldCoord.parseWorldCoord(event.getBlock()))) { + event.setCancelled(true); + return; + } + // Test other instances of Entities altering blocks. if (entityType == EntityType.ENDERMAN) { event.setCancelled(townyWorld.isEndermanProtect()); diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java b/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java index b372d7bf31..9b0255cf85 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java +++ b/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java @@ -258,6 +258,11 @@ public boolean contains(@NotNull ItemStack itemStack) { .conditionally(() -> CURRENT_VERSION.isNewerThanOrEquals(MINECRAFT_1_20_3), builder -> builder.add("DECORATED_POT")) .build(); + public static final ItemLists FALLING_BLOCKS = newBuilder() + .add("SAND", "RED_SAND", "GRAVEL", "SUSPICIOUS_SAND", "SUSPICIOUS_GRAVEL") + .endsWith("_CONCRETE_POWDER") + .build(); + /** * List of blocks which, when exploded, will not have their drops set to false, despite our asking. */ diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index f7bd5efdb7..a10a4aafea 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9533,4 +9533,7 @@ v0.92.0.11: - This is the list of blocks that should not be overwritten by wilderness explosion reverts. - (if empty all blocks placed into regenerating explosions will be overwritten with the original pre-explosion blocks.) - This list is useful if you have a death chest plugin which could put a player's inventory inside chest that is inside of a regenerating creeper explosion pit. - - For Example: By putting CHEST here you can prevent the chest from being overwritten by the dirt block that used to be there. \ No newline at end of file + - For Example: By putting CHEST here you can prevent the chest from being overwritten by the dirt block that used to be there. +0.100.1.15: + - Prevent falling blocks falling during unclaimed land regeneration. + - Closes #7259. \ No newline at end of file From e098a50424530a5d2bd27e64f5b6bdca90bcc080 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Sun, 18 Feb 2024 08:11:00 -0600 Subject: [PATCH 17/27] - Make use of the disallow numbers in town names config option again. --- .../bukkit/util/NameValidation.java | 25 +++++++++++++++---- Towny/src/main/resources/ChangeLog.txt | 3 ++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java index 36854dc020..94aa1b09a2 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java +++ b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java @@ -71,7 +71,7 @@ public static String checkAndFilterTownNameOrThrow(String name) throws InvalidNa testNameLength(out); - testForNumbers(out); + testForNumbersInTownName(out); testForImproperNameAndThrow(out); @@ -95,7 +95,7 @@ public static String checkAndFilterNationNameOrThrow(String name) throws Invalid testNameLength(out); - testForNumbers(out); + testForNumbersInNationName(out); testForImproperNameAndThrow(out); @@ -315,15 +315,30 @@ private static void testNameLength(String name) throws InvalidNameException { } /** - * Stops numbers in town and nation names, when these are disallowed. + * Stops numbers in nation names, when these are disallowed. * * @param name String to validate. * @throws InvalidNameException thrown when numbers aren't allowed and they are present. */ - private static void testForNumbers(String name) throws InvalidNameException { - if (!TownySettings.areNumbersAllowedInNationNames() && numberPattern.matcher(name).find()) + private static void testForNumbersInNationName(String name) throws InvalidNameException { + if (!TownySettings.areNumbersAllowedInNationNames() && nameContainsNumbers(name)) throw new InvalidNameException(Translatable.of("msg_err_name_validation_contains_numbers", name)); } + + /** + * Stops numbers in town names, when these are disallowed. + * + * @param name String to validate. + * @throws InvalidNameException thrown when numbers aren't allowed and they are present. + */ + private static void testForNumbersInTownName(String name) throws InvalidNameException { + if (!TownySettings.areNumbersAllowedInTownNames() && nameContainsNumbers(name)) + throw new InvalidNameException(Translatable.of("msg_err_name_validation_contains_numbers", name)); + } + + private static boolean nameContainsNumbers(String name) { + return numberPattern.matcher(name).find(); + } /** * Is this a valid name via getNameCheckRegex diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index a10a4aafea..bbebcd4fd8 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9536,4 +9536,5 @@ v0.92.0.11: - For Example: By putting CHEST here you can prevent the chest from being overwritten by the dirt block that used to be there. 0.100.1.15: - Prevent falling blocks falling during unclaimed land regeneration. - - Closes #7259. \ No newline at end of file + - Closes #7259. + - Make use of the disallow numbers in town names config option again. \ No newline at end of file From adbdbccd8f14225af4800c77aeabc8b90d937eba Mon Sep 17 00:00:00 2001 From: LlmDl Date: Mon, 19 Feb 2024 08:43:08 -0600 Subject: [PATCH 18/27] - Fix being unable to unset titles and surnames. --- .../main/java/com/palmergames/bukkit/util/NameValidation.java | 2 -- Towny/src/main/resources/ChangeLog.txt | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java index 94aa1b09a2..15761c4904 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java +++ b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java @@ -168,8 +168,6 @@ public static String checkAndFilterTitlesSurnameOrThrow(String[] words) throws I if (title.length() > TownySettings.getMaxTitleLength()) throw new InvalidNameException(Translatable.of("msg_err_name_validation_title_too_long", title)); - testForEmptyName(title); - return title; } diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index bbebcd4fd8..42876604d2 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9537,4 +9537,5 @@ v0.92.0.11: 0.100.1.15: - Prevent falling blocks falling during unclaimed land regeneration. - Closes #7259. - - Make use of the disallow numbers in town names config option again. \ No newline at end of file + - Make use of the disallow numbers in town names config option again. + - Fix being unable to unset titles and surnames. \ No newline at end of file From e06c22da8f2396f9eb2dc34fd8cb229508f80e78 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:43:46 +0100 Subject: [PATCH 19/27] Remove magic values from spawnpoint ring offsets (#7267) * Remove magic values from spawnpoint ring offsets * L --- .../bukkit/towny/TownyTimerHandler.java | 3 +- .../bukkit/towny/object/SpawnPoint.java | 59 ++++++++----------- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java index 57df320da1..741f0afa08 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java @@ -1,5 +1,6 @@ package com.palmergames.bukkit.towny; +import com.palmergames.bukkit.towny.object.SpawnPoint; import com.palmergames.bukkit.towny.scheduling.ScheduledTask; import com.palmergames.bukkit.towny.tasks.CooldownTimerTask; import com.palmergames.bukkit.towny.tasks.DrawSmokeTask; @@ -136,7 +137,7 @@ public static void toggleDrawSmokeTask(boolean on) { public static void toggleDrawSpointsTask(boolean on) { if (on && !isDrawSpawnPointsTaskRunning()) { // This is given a delay because it was causing ConcurrentModificationExceptions on startup on one server. - drawSpawnPointsTask = plugin.getScheduler().runAsyncRepeating(new DrawSpawnPointsTask(plugin), 40, 52); + drawSpawnPointsTask = plugin.getScheduler().runAsyncRepeating(new DrawSpawnPointsTask(plugin), 40, SpawnPoint.RING_POINT_COUNT * SpawnPoint.RING_DELAY_TICKS); } else if (!on && isDrawSpawnPointsTaskRunning()) { drawSpawnPointsTask.cancel(); drawSpawnPointsTask = null; diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/SpawnPoint.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/SpawnPoint.java index 24737f9976..b2615be385 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/SpawnPoint.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/SpawnPoint.java @@ -1,6 +1,9 @@ package com.palmergames.bukkit.towny.object; import java.util.ArrayList; +import java.util.List; + +import com.github.bsideup.jabel.Desugar; import org.bukkit.Location; import org.bukkit.Particle; @@ -13,7 +16,9 @@ public class SpawnPoint { private final SpawnPointType type; private final SpawnPointLocation spawnLocation; - private static final ArrayList RING_PATTERN = createRing(); + private static final List RING_PATTERN = createRingOffsets(); + public static final int RING_POINT_COUNT = 12; + public static final int RING_DELAY_TICKS = 4; public SpawnPoint(Location loc, SpawnPointType type) { this(Position.ofLocation(loc), type); @@ -55,13 +60,13 @@ public void drawParticle() { int i = 0; for (RingCoord ringPosition : RING_PATTERN) { - Location point = origin.clone().add(ringPosition.getX(), 0.0d, ringPosition.getZ()); + Location point = origin.clone().add(ringPosition.x(), 0.0d, ringPosition.z()); Towny.getPlugin().getScheduler().runAsyncLater(() -> { try { // This can potentially throw an exception if we're running this async and a player disconnects while it's sending particles. world.spawnParticle(Particle.CRIT_MAGIC, point, 1, 0.0, 0.0, 0.0, 0.0); } catch (Exception ignored) {} - }, i * 4L); + }, (long) i * RING_DELAY_TICKS); i++; } } @@ -73,21 +78,20 @@ private Location centreLocation(Location loc) { return loc; } - private static ArrayList createRing() { + private static List createRingOffsets() { ArrayList ring = new ArrayList<>(); - ring.add(RingCoord.of(0.0, 0.45)); - ring.add(RingCoord.of(0.225, 0.3897)); - ring.add(RingCoord.of(0.3897, 0.225)); - ring.add(RingCoord.of(0.45, 0.00)); - ring.add(RingCoord.of(0.3897, -0.225)); - ring.add(RingCoord.of(0.225, -0.3897)); - ring.add(RingCoord.of(0.00, -0.45)); - ring.add(RingCoord.of(-0.225, -0.3897)); - ring.add(RingCoord.of(-0.3897, -0.225)); - ring.add(RingCoord.of(-0.45, 0.0)); - ring.add(RingCoord.of(-0.3897, 0.225)); - ring.add(RingCoord.of(-0.225, 0.3897)); - return ring; + + final double radius = 0.45; + final double angleIncrement = 2 * Math.PI / RING_POINT_COUNT; + + for (int i = 0; i < RING_POINT_COUNT; i++) { + double angle = i * angleIncrement; + double x = radius * Math.sin(angle); + double y = radius * Math.cos(angle); + ring.add(RingCoord.offset(x, y)); + } + + return ring; } public enum SpawnPointType { @@ -97,24 +101,9 @@ public enum SpawnPointType { JAIL_SPAWN } - private static class RingCoord { - private double x; - private double z; - - private RingCoord(double x, double z) { - this.x = x; - this.z = z; - } - - private double getX() { - return this.x; - } - - private double getZ() { - return this.z; - } - - private static RingCoord of(double a, double b) { + @Desugar + private record RingCoord(double x, double z) { + private static RingCoord offset(double a, double b) { return new RingCoord(a, b); } } From 12ba98958bbc84fc49f503bc7d4e8dce9a1b146b Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:44:19 +0100 Subject: [PATCH 20/27] Fix mob removal on folia (#7262) --- .../bukkit/towny/TownyTimerHandler.java | 2 +- .../towny/listeners/TownyPaperEvents.java | 30 ++++ .../towny/tasks/MobRemovalTimerTask.java | 163 ++++++++++-------- 3 files changed, 124 insertions(+), 71 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java index 741f0afa08..2d726f5344 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyTimerHandler.java @@ -59,7 +59,7 @@ public static void toggleTownyRepeatingTimer(boolean on) { public static void toggleMobRemoval(boolean on) { - if (on && !isMobRemovalRunning()) { + if (on && !isMobRemovalRunning() && !plugin.isFolia()) { mobRemoveTask = plugin.getScheduler().runRepeating(new MobRemovalTimerTask(plugin), 1, TimeTools.convertToTicks(TownySettings.getMobRemovalSpeed())); } else if (!on && isMobRemovalRunning()) { mobRemoveTask.cancel(); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyPaperEvents.java b/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyPaperEvents.java index 4ca91597a9..d1b1d728d6 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyPaperEvents.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyPaperEvents.java @@ -3,9 +3,14 @@ import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.TownyAPI; import com.palmergames.bukkit.towny.TownyMessaging; +import com.palmergames.bukkit.towny.TownySettings; import com.palmergames.bukkit.towny.event.executors.TownyActionEventExecutor; +import com.palmergames.bukkit.towny.hooks.PluginIntegrations; +import com.palmergames.bukkit.towny.object.TownyWorld; +import com.palmergames.bukkit.towny.tasks.MobRemovalTimerTask; import com.palmergames.bukkit.towny.utils.BorderUtil; import com.palmergames.util.JavaUtil; +import com.palmergames.util.TimeTools; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; @@ -13,6 +18,7 @@ import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.event.Cancellable; @@ -22,6 +28,7 @@ import org.bukkit.event.block.BlockEvent; import org.bukkit.event.block.TNTPrimeEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.entity.EntityEvent; import org.bukkit.event.player.PlayerEvent; import org.bukkit.projectiles.BlockProjectileSource; import org.jetbrains.annotations.ApiStatus; @@ -52,6 +59,8 @@ public class TownyPaperEvents implements Listener { public static final MethodHandle DRAGON_FIREBALL_GET_EFFECT_CLOUD = JavaUtil.getMethodHandle(DRAGON_FIREBALL_HIT_EVENT, "getAreaEffectCloud"); + public static final String ADD_TO_WORLD_EVENT = "com.destroystokyo.paper.event.entity.EntityAddToWorldEvent"; + public TownyPaperEvents(Towny plugin) { this.plugin = plugin; } @@ -78,6 +87,10 @@ else if (GET_PRIMER_ENTITY != null) { registerEvent(DRAGON_FIREBALL_HIT_EVENT, this::dragonFireballHitEventListener, EventPriority.LOW, true); TownyMessaging.sendDebugMsg("Using " + DRAGON_FIREBALL_GET_EFFECT_CLOUD + " listener."); } + + if (this.plugin.isFolia()) { + registerEvent(ADD_TO_WORLD_EVENT, this::entityAddToWorldListener, EventPriority.MONITOR, false /* n/a */); + } } @SuppressWarnings("unchecked") @@ -189,4 +202,21 @@ private Consumer dragonFireballHitEventListener() { ((Cancellable) event).setCancelled(true); }; } + + private Consumer entityAddToWorldListener() { + return event -> { + if (!(event.getEntity() instanceof LivingEntity entity)) + return; + + if (entity instanceof Player || PluginIntegrations.getInstance().isNPC(entity)) + return; + + plugin.getScheduler().runRepeating(entity, () -> { + final TownyWorld world = TownyAPI.getInstance().getTownyWorld(entity.getWorld()); + + if (MobRemovalTimerTask.isRemovingEntities(world)) + MobRemovalTimerTask.checkEntity(plugin, world, entity); + }, 1L, TimeTools.convertToTicks(TownySettings.getMobRemovalSpeed())); + }; + } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/MobRemovalTimerTask.java b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/MobRemovalTimerTask.java index 57a9c779f9..c68700370f 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/MobRemovalTimerTask.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/MobRemovalTimerTask.java @@ -37,7 +37,12 @@ public class MobRemovalTimerTask extends TownyTimerTask { public static List> classesOfWildernessMobsToRemove = new ArrayList<>(); public static List> classesOfTownMobsToRemove = new ArrayList<>(); private static final Set ignoredSpawnReasons = new HashSet<>(); - private boolean isRemovingKillerBunny; + private static boolean isRemovingKillerBunny; + + static { + populateFields(); + TownySettings.addReloadListener(NamespacedKey.fromString("towny:mob-removal-task"), config -> populateFields()); + } // https://jd.papermc.io/paper/1.20/org/bukkit/entity/Entity.html#getEntitySpawnReason() private static final MethodHandle GET_SPAWN_REASON = JavaUtil.getMethodHandle(Entity.class, "getEntitySpawnReason"); @@ -46,7 +51,6 @@ public MobRemovalTimerTask(Towny plugin) { super(plugin); populateFields(); - TownySettings.addReloadListener(NamespacedKey.fromString("towny:mob-removal-task"), config -> this.populateFields()); } public static boolean isRemovingWorldEntity(LivingEntity livingEntity) { @@ -86,79 +90,98 @@ public void run() { for (final World world : Bukkit.getWorlds()) { // Filter worlds not using towny. final TownyWorld townyWorld = TownyAPI.getInstance().getTownyWorld(world); - if (townyWorld == null || !townyWorld.isUsingTowny()) - continue; - - // Filter worlds that will always pass all checks in a world, regardless of possible conditions. - if (townyWorld.isForceTownMobs() && townyWorld.hasWorldMobs()) + if (!isRemovingEntities(townyWorld)) continue; - final List entities = world.getLivingEntities(); - if (entities.isEmpty()) - continue; - - for (final LivingEntity entity : entities) { - // Check if entity is a player or Citizens NPC - if (entity instanceof Player || PluginIntegrations.getInstance().isNPC(entity)) - continue; - - // Handles entities Globally. - if (!townyWorld.hasWorldMobs() && isRemovingWorldEntity(entity)) { - removeEntity(entity); - continue; - } - - final Runnable runnable = () -> { - final Location livingEntityLoc = entity.getLocation(); - final TownBlock townBlock = TownyAPI.getInstance().getTownBlock(livingEntityLoc); - - // Handles entities in the wilderness. - if (townBlock == null) { - if (townyWorld.hasWildernessMobs() || !isRemovingWildernessEntity(entity)) - return; - } else { - // The entity is inside of a town. - - // Check if mobs are always allowed inside towns in this world, if the townblock allows it, or if the town has mobs forced on. - if (townyWorld.isForceTownMobs() || townBlock.getPermissions().mobs || townBlock.getTownOrNull().isAdminEnabledMobs()) - return; - - // Check that Towny is removing this type of entity inside towns. - if (!isRemovingTownEntity(entity)) - return; - } - - // Check if this is an EliteMob before we do any skipping-removal-of-named-mobs. - if (PluginIntegrations.getInstance().checkHostileEliteMobs(entity)) { - removeEntity(entity); - return; - } - - // Special check if it's a rabbit, for the Killer Bunny variant. - if (entity instanceof Rabbit rabbit && isRemovingKillerBunny && rabbit.getRabbitType() == Rabbit.Type.THE_KILLER_BUNNY) { - removeEntity(entity); - return; - } - - if (TownySettings.isSkippingRemovalOfNamedMobs() && entity.getCustomName() != null) - return; - - // Don't remove if the entity's spawn reason is considered ignored by the config - if (isSpawnReasonIgnored(entity)) - return; - - removeEntity(entity); - }; - - if (plugin.isFolia()) - plugin.getScheduler().run(entity, runnable); - else - runnable.run(); + for (final LivingEntity entity : world.getLivingEntities()) { + checkEntity(plugin, townyWorld, entity); } } } + + /** + * @param world The world to check + * @return Whether entities have a chance of being removed in this world + */ + public static boolean isRemovingEntities(final @Nullable TownyWorld world) { + if (world == null || !world.isUsingTowny()) + return false; + + // Filter worlds that will always pass all checks in a world, regardless of possible conditions. + if (world.isForceTownMobs() && world.hasWorldMobs()) + return false; + + return true; + } + + /** + * Checks and removes entities if necessary. Can be called from any thread. + * @param plugin Towny's plugin instance + * @param townyWorld The world the entity is in + * @param ent The entity to check + */ + public static void checkEntity(final @NotNull Towny plugin, final @NotNull TownyWorld townyWorld, final @NotNull Entity ent) { + if (!(ent instanceof LivingEntity entity)) + return; + + if (entity instanceof Player || PluginIntegrations.getInstance().isNPC(entity)) + return; + + // Handles entities Globally. + if (!townyWorld.hasWorldMobs() && isRemovingWorldEntity(entity)) { + removeEntity(plugin, entity); + return; + } + + final Runnable runnable = () -> { + final Location livingEntityLoc = entity.getLocation(); + final TownBlock townBlock = TownyAPI.getInstance().getTownBlock(livingEntityLoc); + + // Handles entities in the wilderness. + if (townBlock == null) { + if (townyWorld.hasWildernessMobs() || !isRemovingWildernessEntity(entity)) + return; + } else { + // The entity is inside of a town. + + // Check if mobs are always allowed inside towns in this world, if the townblock allows it, or if the town has mobs forced on. + if (townyWorld.isForceTownMobs() || townBlock.getPermissions().mobs || townBlock.getTownOrNull().isAdminEnabledMobs()) + return; + + // Check that Towny is removing this type of entity inside towns. + if (!isRemovingTownEntity(entity)) + return; + } + + // Check if this is an EliteMob before we do any skipping-removal-of-named-mobs. + if (PluginIntegrations.getInstance().checkHostileEliteMobs(entity)) { + removeEntity(plugin, entity); + return; + } + + // Special check if it's a rabbit, for the Killer Bunny variant. + if (entity instanceof Rabbit rabbit && isRemovingKillerBunny && rabbit.getRabbitType() == Rabbit.Type.THE_KILLER_BUNNY) { + removeEntity(plugin, entity); + return; + } + + if (TownySettings.isSkippingRemovalOfNamedMobs() && entity.getCustomName() != null) + return; + + // Don't remove if the entity's spawn reason is considered ignored by the config + if (isSpawnReasonIgnored(entity)) + return; + + removeEntity(plugin, entity); + }; + + if (plugin.getScheduler().isEntityThread(entity)) + runnable.run(); + else + plugin.getScheduler().run(entity, runnable); + } - private void removeEntity(@NotNull Entity entity) { + private static void removeEntity(final @NotNull Towny plugin, final @NotNull Entity entity) { if (MobRemovalEvent.getHandlerList().getRegisteredListeners().length > 0 && BukkitTools.isEventCancelled(new MobRemovalEvent(entity))) return; @@ -168,7 +191,7 @@ private void removeEntity(@NotNull Entity entity) { entity.remove(); } - private void populateFields() { + private static void populateFields() { classesOfWorldMobsToRemove = EntityTypeUtil.parseLivingEntityClassNames(TownySettings.getWorldMobRemovalEntities(), "WorldMob: "); classesOfWildernessMobsToRemove = EntityTypeUtil.parseLivingEntityClassNames(TownySettings.getWildernessMobRemovalEntities(),"WildernessMob: "); classesOfTownMobsToRemove = EntityTypeUtil.parseLivingEntityClassNames(TownySettings.getTownMobRemovalEntities(), "TownMob: "); From 1bd023916f1dc4b8c67e4905083fc47b7c6d0658 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:44:42 +0100 Subject: [PATCH 21/27] Make our custom registered commands identifiable (#7263) --- .../com/palmergames/bukkit/towny/Towny.java | 8 +++--- .../command/commandobjects/AcceptCommand.java | 25 ++++++++++++----- .../command/commandobjects/CancelCommand.java | 27 ++++++++++++++----- .../commandobjects/ConfirmCommand.java | 20 +++++++++++--- .../command/commandobjects/DenyCommand.java | 25 ++++++++++++----- 5 files changed, 78 insertions(+), 27 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java b/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java index 75bb185180..e5083e7be7 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java @@ -781,10 +781,10 @@ public static BukkitAudiences getAdventure() { // https://www.spigotmc.org/threads/small-easy-register-command-without-plugin-yml.38036/ private void registerSpecialCommands() { List commands = new ArrayList<>(4); - commands.add(new AcceptCommand(TownySettings.getAcceptCommand())); - commands.add(new DenyCommand(TownySettings.getDenyCommand())); - commands.add(new ConfirmCommand(TownySettings.getConfirmCommand())); - commands.add(new CancelCommand(TownySettings.getCancelCommand())); + commands.add(new AcceptCommand(this, TownySettings.getAcceptCommand())); + commands.add(new DenyCommand(this, TownySettings.getDenyCommand())); + commands.add(new ConfirmCommand(this, TownySettings.getConfirmCommand())); + commands.add(new CancelCommand(this, TownySettings.getCancelCommand())); try { BukkitTools.getCommandMap().registerAll("towny", commands); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/AcceptCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/AcceptCommand.java index b1e05c5595..6736bcf67b 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/AcceptCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/AcceptCommand.java @@ -1,22 +1,35 @@ package com.palmergames.bukkit.towny.command.commandobjects; +import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.command.InviteCommand; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.defaults.BukkitCommand; +import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; -public class AcceptCommand extends BukkitCommand { - public AcceptCommand(String name) { +public class AcceptCommand extends Command implements PluginIdentifiableCommand { + private final Towny plugin; + + public AcceptCommand(Towny plugin, String name) { super(name); + this.plugin = plugin; this.description = "Accept command for Towny"; this.usageMessage = "/" + name + " "; } @Override - public boolean execute(CommandSender commandSender, String s, String[] strings) { - if (commandSender instanceof Player) { - InviteCommand.parseAccept((Player) commandSender, strings); + public boolean execute(final @NotNull CommandSender sender, final @NotNull String alias, final @NotNull String[] args) { + if (sender instanceof Player player) { + InviteCommand.parseAccept(player, args); } return true; } + + @NotNull + @Override + public Plugin getPlugin() { + return this.plugin; + } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/CancelCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/CancelCommand.java index 895f996b25..4f750f2faa 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/CancelCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/CancelCommand.java @@ -1,26 +1,39 @@ package com.palmergames.bukkit.towny.command.commandobjects; +import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.TownyMessaging; import com.palmergames.bukkit.towny.confirmations.ConfirmationHandler; import com.palmergames.bukkit.towny.object.Translatable; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.defaults.BukkitCommand; +import org.bukkit.command.PluginIdentifiableCommand; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; -public class CancelCommand extends BukkitCommand { - public CancelCommand(String name) { +public class CancelCommand extends Command implements PluginIdentifiableCommand { + private final Towny plugin; + + public CancelCommand(Towny plugin, String name) { super(name); + this.plugin = plugin; this.description = "Cancel command for Towny"; this.usageMessage = "/" + name; } @Override - public boolean execute(CommandSender commandSender, String s, String[] strings) { - if (!ConfirmationHandler.hasConfirmation(commandSender)) { - TownyMessaging.sendErrorMsg(commandSender, Translatable.of("no_confirmations_open")); + public boolean execute(final @NotNull CommandSender sender, final @NotNull String alias, final @NotNull String[] args) { + if (!ConfirmationHandler.hasConfirmation(sender)) { + TownyMessaging.sendErrorMsg(sender, Translatable.of("no_confirmations_open")); return true; } - ConfirmationHandler.revokeConfirmation(commandSender); + ConfirmationHandler.revokeConfirmation(sender); return true; } + + @NotNull + @Override + public Plugin getPlugin() { + return this.plugin; + } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/ConfirmCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/ConfirmCommand.java index 4b7c3257b5..321e984c31 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/ConfirmCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/ConfirmCommand.java @@ -1,22 +1,28 @@ package com.palmergames.bukkit.towny.command.commandobjects; +import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.TownyMessaging; import com.palmergames.bukkit.towny.confirmations.ConfirmationHandler; import com.palmergames.bukkit.towny.object.Translatable; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.defaults.BukkitCommand; +import org.bukkit.command.PluginIdentifiableCommand; +import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; -public class ConfirmCommand extends BukkitCommand { - public ConfirmCommand(String name) { +public class ConfirmCommand extends Command implements PluginIdentifiableCommand { + private final Towny plugin; + + public ConfirmCommand(Towny plugin, String name) { super(name); + this.plugin = plugin; this.description = "Confirm command for Towny"; this.usageMessage = "/" + name; } @Override - public boolean execute(@NotNull CommandSender sender, @NotNull String label, String[] args) { + public boolean execute(final @NotNull CommandSender sender, final @NotNull String alias, final @NotNull String[] args) { // Check if confirmation is available. if (!ConfirmationHandler.hasConfirmation(sender)) { @@ -28,4 +34,10 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, Str ConfirmationHandler.acceptConfirmation(sender); return true; } + + @NotNull + @Override + public Plugin getPlugin() { + return this.plugin; + } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/DenyCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/DenyCommand.java index 8c3cd21951..0ec0b872d8 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/DenyCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/commandobjects/DenyCommand.java @@ -1,24 +1,37 @@ package com.palmergames.bukkit.towny.command.commandobjects; +import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.command.InviteCommand; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.defaults.BukkitCommand; +import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; -public class DenyCommand extends BukkitCommand { - public DenyCommand(String name) { +public class DenyCommand extends Command implements PluginIdentifiableCommand { + private final Towny plugin; + + public DenyCommand(Towny plugin, String name) { super(name); + this.plugin = plugin; this.description = "Deny command for Towny"; this.usageMessage = "/" + name + " "; } @Override - public boolean execute(CommandSender commandSender, String s, String[] strings) { - if (commandSender instanceof Player) { - InviteCommand.parseDeny((Player) commandSender, strings); + public boolean execute(final @NotNull CommandSender sender, final @NotNull String alias, final @NotNull String[] args) { + if (sender instanceof Player player) { + InviteCommand.parseDeny(player, args); return true; } else { return true; } } + + @NotNull + @Override + public Plugin getPlugin() { + return this.plugin; + } } From 03cd1c96444e6eba9d5a69655d4b0acd5fa3a681 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:45:31 +0100 Subject: [PATCH 22/27] Move using_economy to the eco section of the config (#7265) --- .../palmergames/bukkit/config/ConfigNodes.java | 16 ++++++++-------- .../palmergames/bukkit/towny/TownySettings.java | 2 +- Towny/src/main/resources/config-migration.json | 10 ++++++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java index 2a1fd267f1..d20be04d20 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java +++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java @@ -1471,14 +1471,6 @@ public enum ConfigNodes { "plugin.interfacing.tekkit.fake_residents", "[IndustrialCraft],[BuildCraft],[Redpower],[Forestry],[Turtle]", "# Add any fake players for client/server mods (aka Tekkit) here"), - PLUGIN_USING_ECONOMY( - "plugin.interfacing.using_economy", - "true", - "", - "# This enables/disables all the economy functions of Towny.", - "# This will first attempt to use Vault or Reserve to bridge your economy plugin with Towny.", - "# If Reserve/Vault is not present it will attempt to find a supported economy plugin.", - "# If neither Vault/Reserve or supported economy are present it will not be possible to create towns or do any operations that require money."), PLUGIN_LUCKPERMS_ROOT("plugin.interfacing.luckperms","",""), PLUGIN_LUCKPERMS_CONTEXTS( @@ -2328,6 +2320,14 @@ public enum ConfigNodes { "# +------------------------------------------------------+ #", "############################################################", ""), + ECO_USING_ECONOMY( + "economy.using_economy", + "true", + "", + "# This enables/disables all the economy functions of Towny.", + "# This will first attempt to use Vault or Reserve to bridge your economy plugin with Towny.", + "# If Reserve/Vault is not present it will attempt to find a supported economy plugin.", + "# If neither Vault/Reserve or supported economy are present it will not be possible to create towns or do any operations that require money."), ECO_USE_ASYNC( "economy.use_async", "true", diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java index 7212747816..a21645e40d 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java @@ -1358,7 +1358,7 @@ public static boolean isFriendlyFireEnabled() { public static boolean isUsingEconomy() { - return getBoolean(ConfigNodes.PLUGIN_USING_ECONOMY); + return getBoolean(ConfigNodes.ECO_USING_ECONOMY); } public static boolean isFakeResident(String name) { diff --git a/Towny/src/main/resources/config-migration.json b/Towny/src/main/resources/config-migration.json index e9193ec870..c2f1d1e314 100644 --- a/Towny/src/main/resources/config-migration.json +++ b/Towny/src/main/resources/config-migration.json @@ -836,5 +836,15 @@ "value": "spawning.nation_spawn.spawning_cooldowns.unaffiliated_nation_spawn_cooldown_time" } ] + }, + { + "version": "0.100.1.15", + "changes": [ + { + "type": "MOVE", + "path": "plugin.interfacing.using_economy", + "value": "economy.using_economy" + } + ] } ] \ No newline at end of file From b52f12729ba8cca26e8e1e02f4cae6e980c6ac22 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:46:30 +0100 Subject: [PATCH 23/27] Remove uuid percentage tracking (#7266) --- .../com/palmergames/bukkit/towny/Towny.java | 2 -- .../bukkit/towny/TownySettings.java | 35 ------------------- .../bukkit/towny/TownyUniverse.java | 1 - .../bukkit/towny/db/TownyDataSource.java | 5 --- .../bukkit/towny/db/TownySQLSource.java | 6 ---- .../bukkit/towny/tasks/OnPlayerLogin.java | 2 -- 6 files changed, 51 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java b/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java index e5083e7be7..2da74fe65b 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/Towny.java @@ -838,8 +838,6 @@ else if (getServer().getName().equalsIgnoreCase("craftbukkit")) metrics.addCustomChart(new SimplePie("town_block_size", () -> String.valueOf(TownySettings.getTownBlockSize()))); metrics.addCustomChart(new SimplePie("closed_economy_enabled", () -> String.valueOf(TownySettings.isEcoClosedEconomyEnabled()))); - - metrics.addCustomChart(new SimplePie("resident_uuids_stored", TownySettings::getUUIDPercent)); } /** diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java index a21645e40d..be2ed9bad8 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java @@ -3381,41 +3381,6 @@ public static Map getTownColorsMap() { } return townColorsMap; } - - public static String getUUIDPercent() { - double fraction = (double) uuidCount / TownyUniverse.getInstance().getNumResidents(); - - if (fraction == 1.00) - return "100%"; - if (fraction > 0.98) - return "99%"; - if (fraction > 0.95) - return "95%+"; - if (fraction > 0.89) - return "90%+"; - if (fraction > 0.79) - return "80%+"; - if (fraction > 0.69) - return "70%+"; - if (fraction > 0.59) - return "60%+"; - if (fraction > 0.49) - return "50%+"; - - return "<50%"; - } - - public static int getUUIDCount() { - return uuidCount; - } - - public static void setUUIDCount(int hasUUID) { - uuidCount = hasUUID; - } - - public static void incrementUUIDCount() { - uuidCount++; - } public static boolean isTownBankruptcyEnabled() { return getBoolean(ConfigNodes.ECO_BANKRUPTCY_ENABLED); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java index 7eb8051809..fca20a4aba 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java @@ -194,7 +194,6 @@ private boolean loadDatabase(String loadDbType) { long time = System.currentTimeMillis() - startTime; towny.getLogger().info("Database: Loaded in " + time + "ms."); - towny.getLogger().info("Database: " + TownySettings.getUUIDPercent() + " of residents have stored UUIDs."); // TODO: remove this when we're using UUIDs directly in the database. // Throw Event. BukkitTools.fireEvent(new TownyLoadedDatabaseEvent()); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java index ac7787141b..9e6a666ae8 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java @@ -158,16 +158,11 @@ public boolean loadResidents() { TownyMessaging.sendDebugMsg("Loading Residents"); - TownySettings.setUUIDCount(0); - for (Resident resident : universe.getResidents()) { if (!loadResident(resident)) { plugin.getLogger().severe("Loading Error: Could not read resident data '" + resident.getName() + "'."); return false; } - - if (resident.hasUUID()) - TownySettings.incrementUUIDCount(); } return true; } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java index 4685fc30de..fe0fcaec60 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownySQLSource.java @@ -649,8 +649,6 @@ public boolean loadJailList() { public boolean loadResidents() { TownyMessaging.sendDebugMsg("Loading Residents"); - TownySettings.setUUIDCount(0); - try (Connection connection = getConnection(); Statement s = connection.createStatement(); ResultSet rs = s.executeQuery("SELECT * FROM " + tb_prefix + "RESIDENTS")) { @@ -675,10 +673,6 @@ public boolean loadResidents() { plugin.getLogger().severe("Loading Error: Could not read resident data '" + resident.getName() + "'."); return false; } - - if (resident.hasUUID()) - TownySettings.incrementUUIDCount(); - } } catch (SQLException e) { TownyMessaging.sendErrorMsg("SQL: Load resident sql error : " + e.getMessage()); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/OnPlayerLogin.java b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/OnPlayerLogin.java index d1663c01a9..0436c21663 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/OnPlayerLogin.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/OnPlayerLogin.java @@ -84,7 +84,6 @@ public void run() { */ try { resident = universe.getDataSource().newResident(player.getName(), player.getUniqueId()); - TownySettings.incrementUUIDCount(); if (TownySettings.isShowingLocaleMessage()) TownyMessaging.sendMsg(resident, Translatable.of("msg_your_locale", player.getLocale())); @@ -204,7 +203,6 @@ private void loginExistingResident(Resident resident) { } catch (AlreadyRegisteredException e) { plugin.getLogger().log(Level.WARNING, "uuid for resident " + resident.getName() + " was already registered! (" + player.getUniqueId() + ")", e); } - TownySettings.incrementUUIDCount(); } resident.save(); }, 5); From 681259e88138e60056e12ee58597426809b07c4a Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:47:04 +0100 Subject: [PATCH 24/27] Make PlotClaim a runnable (#7268) * Make PlotClaim a runnable * redundant --- .../bukkit/towny/command/PlotCommand.java | 17 ++++++++--------- .../bukkit/towny/command/TownyAdminCommand.java | 2 +- .../bukkit/towny/tasks/PlotClaim.java | 3 +-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java index 70de707a03..d8a359d26d 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java @@ -724,7 +724,7 @@ public void parsePlotUnclaim(Player player, String[] split, Resident resident) t if (split.length == 2 && split[1].equalsIgnoreCase("all")) { // Start the unclaim task - new PlotClaim(plugin, player, resident, null, false, false, false).start(); + plugin.getScheduler().runAsync(new PlotClaim(plugin, player, resident, null, false, false, false)); return; } @@ -740,7 +740,7 @@ public void parsePlotUnclaim(Player player, String[] split, Resident resident) t if (!townBlock.hasPlotObjectGroup()) { // Start the unclaim task - new PlotClaim(plugin, player, resident, selection, false, false, false).start(); + plugin.getScheduler().runAsync(new PlotClaim(plugin, player, resident, selection, false, false, false)); return; } @@ -748,7 +748,7 @@ public void parsePlotUnclaim(Player player, String[] split, Resident resident) t final List groupSelection = townBlock.getPlotObjectGroup().getTownBlocks().stream().map(TownBlock::getWorldCoord).collect(Collectors.toList()); // Create confirmation. - Confirmation.runOnAccept(() -> new PlotClaim(Towny.getPlugin(), player, resident, groupSelection, false, false, false).start()) + Confirmation.runOnAcceptAsync(new PlotClaim(plugin, player, resident, groupSelection, false, false, false)) .setTitle(Translatable.of("msg_plot_group_unclaim_confirmation", townBlock.getPlotObjectGroup().getTownBlocks().size()).append(" ").append(Translatable.of("are_you_sure_you_want_to_continue"))) .sendTo(player); return; @@ -1838,7 +1838,7 @@ private void continuePlotClaimProcess(List selection, Resident resid group.getTownBlocks().forEach((tblock) -> coords.add(tblock.getWorldCoord())); // Execute the plot claim. - new PlotClaim(Towny.getPlugin(), player, resident, coords, true, false, true).start(); + plugin.getScheduler().runAsync(new PlotClaim(plugin, player, resident, coords, true, false, true)); }) .setTitle(Translatable.of("msg_plot_group_claim_confirmation", group.getTownBlocks().size()).append(" ").append(prettyMoney(group.getPrice())).append(". ").append(Translatable.of("are_you_sure_you_want_to_continue"))) .sendTo(player); @@ -1871,16 +1871,15 @@ private void continuePlotClaimProcess(List selection, Resident resid throw new TownyException(Translatable.of("msg_no_funds_claim_plot", prettyMoney(cost))); if (cost != 0) { - final List finalSelection = selection; - Confirmation.runOnAccept(() -> { + Confirmation.runOnAcceptAsync( // Start the claim task - new PlotClaim(plugin, player, resident, finalSelection, true, false, false).start(); - }) + new PlotClaim(plugin, player, resident, selection, true, false, false) + ) .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) .sendTo(player); } else { // Start the claim task - new PlotClaim(plugin, player, resident, selection, true, false, false).start(); + plugin.getScheduler().runAsync(new PlotClaim(plugin, player, resident, selection, true, false, false)); } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java index ad407dc319..3fb70ddfb6 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyAdminCommand.java @@ -942,7 +942,7 @@ private void parseAdminPlotClaim(Player player, String[] split) throws TownyExce String world = player.getWorld().getName(); List selection = new ArrayList<>(); selection.add(new WorldCoord(world, Coord.parseCoord(player))); - new PlotClaim(plugin, player, resOpt.get(), selection, true, true, false).start(); + plugin.getScheduler().runAsync(new PlotClaim(plugin, player, resOpt.get(), selection, true, true, false)); } private void parseAdminPlotClaimedAt(Player player) throws TownyException { diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/PlotClaim.java b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/PlotClaim.java index 04a273fde7..fb83990419 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/PlotClaim.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/PlotClaim.java @@ -26,7 +26,7 @@ * @author ElgarL * */ -public class PlotClaim extends Thread { +public class PlotClaim implements Runnable { Towny plugin; private final Player player; @@ -55,7 +55,6 @@ public PlotClaim(Towny plugin, Player player, Resident resident, List Date: Mon, 19 Feb 2024 15:49:39 +0100 Subject: [PATCH 25/27] Reorganize test directory layout (#7269) * Reorganize test directory layout * Clean up imports * protected not required * this was used somewhere else --- .../towny/object/AbstractRegistryList.java | 4 +- .../bukkit/towny/object/CommandList.java | 4 +- .../palmergames/bukkit/towny/object/Town.java | 4 +- .../palmergames/bukkit/util/ItemLists.java | 1 - .../bukkit/util/NameValidation.java | 5 +- .../BonusBlockPurchaseTests.java | 2 +- .../ConfigMigrationTests.java | 2 +- .../EntityTypeConversionTests.java | 2 +- .../{test => object}/CommandListTests.java | 3 +- .../{test => object}/PopulationTests.java | 43 ++++++++-------- .../{test => object}/RegistryListTests.java | 2 +- .../towny/test/text/HexConversionTests.java | 49 ------------------- .../ColorConversionTests.java} | 49 +++++++++++++++++-- .../test => util}/NameValidationTests.java | 3 +- .../towny/test => util}/TimeTests.java | 3 +- .../towny/test => util}/TrieTests.java | 3 +- 16 files changed, 77 insertions(+), 102 deletions(-) rename Towny/src/test/java/com/palmergames/bukkit/towny/{test => config}/BonusBlockPurchaseTests.java (99%) rename Towny/src/test/java/com/palmergames/bukkit/towny/{test => config}/ConfigMigrationTests.java (97%) rename Towny/src/test/java/com/palmergames/bukkit/towny/{test => config}/EntityTypeConversionTests.java (96%) rename Towny/src/test/java/com/palmergames/bukkit/towny/{test => object}/CommandListTests.java (96%) rename Towny/src/test/java/com/palmergames/bukkit/towny/{test => object}/PopulationTests.java (79%) rename Towny/src/test/java/com/palmergames/bukkit/towny/{test => object}/RegistryListTests.java (95%) delete mode 100644 Towny/src/test/java/com/palmergames/bukkit/towny/test/text/HexConversionTests.java rename Towny/src/test/java/com/palmergames/bukkit/{towny/test/text/LegacyConversionTests.java => util/ColorConversionTests.java} (62%) rename Towny/src/test/java/com/palmergames/bukkit/{towny/test => util}/NameValidationTests.java (86%) rename Towny/src/test/java/com/palmergames/{bukkit/towny/test => util}/TimeTests.java (92%) rename Towny/src/test/java/com/palmergames/{bukkit/towny/test => util}/TrieTests.java (90%) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/AbstractRegistryList.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/AbstractRegistryList.java index 7524941fec..7c626f6381 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/AbstractRegistryList.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/AbstractRegistryList.java @@ -11,7 +11,6 @@ import org.bukkit.Registry; import org.bukkit.Tag; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.VisibleForTesting; import java.util.Collection; import java.util.HashSet; import java.util.Locale; @@ -52,8 +51,7 @@ public boolean contains(@NotNull String element) { return matched != null && this.contains(matched); } - @VisibleForTesting - public Collection tagged() { + protected Collection tagged() { return this.tagged; } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/CommandList.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/CommandList.java index da28cee556..b9c59cc4f0 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/CommandList.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/CommandList.java @@ -1,8 +1,8 @@ package com.palmergames.bukkit.towny.object; import com.google.common.base.Preconditions; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.VisibleForTesting; import java.util.Collection; import java.util.HashMap; @@ -47,7 +47,7 @@ public void addCommand(@NotNull String command) { current.endOfWord = true; } - @VisibleForTesting + @ApiStatus.Internal public static String normalizeCommand(String command) { // Replace slash and/or space from the start of a command command = REMOVE_LEADING_SPACE.matcher(command).replaceAll(""); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/Town.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/Town.java index 3de4f1554a..fdfa06b163 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/Town.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/Town.java @@ -47,7 +47,6 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Arrays; @@ -397,8 +396,7 @@ public boolean hasResidentWithRank(Resident resident, String rank) { * * @param resident Resident that gets added to the town. */ - @VisibleForTesting - public void addResident(Resident resident) { + void addResident(Resident resident) { residents.add(resident); } diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java b/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java index 9b0255cf85..6f432e6c7a 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java +++ b/Towny/src/main/java/com/palmergames/bukkit/util/ItemLists.java @@ -4,7 +4,6 @@ import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Set; import java.util.stream.Collectors; diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java index 15761c4904..9b8a40e413 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java +++ b/Towny/src/main/java/com/palmergames/bukkit/util/NameValidation.java @@ -18,8 +18,6 @@ import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import org.jetbrains.annotations.VisibleForTesting; - /** * @author ElgarL * @@ -401,8 +399,7 @@ private static String filterCommas(String input) { * @param name String to check. * @return true if this is a banned name. */ - @VisibleForTesting - public static boolean isBannedName(String name) { + static boolean isBannedName(String name) { return bannedNames.contains(name.toLowerCase(Locale.ROOT)); } diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/BonusBlockPurchaseTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/config/BonusBlockPurchaseTests.java similarity index 99% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/BonusBlockPurchaseTests.java rename to Towny/src/test/java/com/palmergames/bukkit/towny/config/BonusBlockPurchaseTests.java index 793505ccdf..c168079e5a 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/BonusBlockPurchaseTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/config/BonusBlockPurchaseTests.java @@ -1,4 +1,4 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.bukkit.towny.config; import be.seeseemelk.mockbukkit.MockBukkit; import com.palmergames.bukkit.config.ConfigNodes; diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/ConfigMigrationTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/config/ConfigMigrationTests.java similarity index 97% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/ConfigMigrationTests.java rename to Towny/src/test/java/com/palmergames/bukkit/towny/config/ConfigMigrationTests.java index cb89ef2d77..6d0febd74a 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/ConfigMigrationTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/config/ConfigMigrationTests.java @@ -1,4 +1,4 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.bukkit.towny.config; import be.seeseemelk.mockbukkit.MockBukkit; import com.palmergames.bukkit.config.CommentedConfiguration; diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/EntityTypeConversionTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/config/EntityTypeConversionTests.java similarity index 96% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/EntityTypeConversionTests.java rename to Towny/src/test/java/com/palmergames/bukkit/towny/config/EntityTypeConversionTests.java index 51b01124fa..bf0218133d 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/EntityTypeConversionTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/config/EntityTypeConversionTests.java @@ -1,4 +1,4 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.bukkit.towny.config; import be.seeseemelk.mockbukkit.MockBukkit; import com.palmergames.bukkit.towny.TownySettings; diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/CommandListTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/object/CommandListTests.java similarity index 96% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/CommandListTests.java rename to Towny/src/test/java/com/palmergames/bukkit/towny/object/CommandListTests.java index df4b6fe262..b4e766b80e 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/CommandListTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/object/CommandListTests.java @@ -1,6 +1,5 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.bukkit.towny.object; -import com.palmergames.bukkit.towny.object.CommandList; import org.junit.jupiter.api.Test; import java.util.Arrays; diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/PopulationTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/object/PopulationTests.java similarity index 79% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/PopulationTests.java rename to Towny/src/test/java/com/palmergames/bukkit/towny/object/PopulationTests.java index 949c31305a..d9ac56b64a 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/PopulationTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/object/PopulationTests.java @@ -1,6 +1,6 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.bukkit.towny.object; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -8,9 +8,6 @@ import com.palmergames.bukkit.config.ConfigNodes; import com.palmergames.bukkit.towny.TownySettings; -import com.palmergames.bukkit.towny.object.Nation; -import com.palmergames.bukkit.towny.object.Resident; -import com.palmergames.bukkit.towny.object.Town; import be.seeseemelk.mockbukkit.MockBukkit; @@ -54,12 +51,12 @@ void reset() { @Test void testSuccessAddResidentNoRestrictionsWithoutCapital() { - assertEquals(town.isAllowedThisAmountOfResidents(10, false), true); + assertTrue(town.isAllowedThisAmountOfResidents(10, false)); } @Test void testSuccessAddResidentNoRestrictionsWithCapital() { - assertEquals(town.isAllowedThisAmountOfResidents(10, true), true); + assertTrue(town.isAllowedThisAmountOfResidents(10, true)); } /* @@ -70,14 +67,14 @@ void testSuccessAddResidentNoRestrictionsWithCapital() { void testSuccessAllowTownPopulationWithRestrictionsWithoutCapital() { TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_PER_TOWN.getRoot(), 5); TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_CAPITAL_OVERRIDE.getRoot(), 10); - assertEquals(town.isAllowedThisAmountOfResidents(5, false), true); + assertTrue(town.isAllowedThisAmountOfResidents(5, false)); } @Test void testFailAllowTownPopulationWithRestrictionsWithoutCapital() { TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_PER_TOWN.getRoot(), 5); TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_CAPITAL_OVERRIDE.getRoot(), 10); - assertEquals(town.isAllowedThisAmountOfResidents(10, false), false); + assertFalse(town.isAllowedThisAmountOfResidents(10, false)); } /* @@ -88,14 +85,14 @@ void testFailAllowTownPopulationWithRestrictionsWithoutCapital() { void testSuccessAllowTownPopulationWithRestrictionsWithCapital() { TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_PER_TOWN.getRoot(), 5); TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_CAPITAL_OVERRIDE.getRoot(), 10); - assertEquals(town.isAllowedThisAmountOfResidents(10, true), true); + assertTrue(town.isAllowedThisAmountOfResidents(10, true)); } @Test void testFailureAllowTownPopulationWithRestrictionsWithCapital() { TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_PER_TOWN.getRoot(), 5); TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_CAPITAL_OVERRIDE.getRoot(), 10); - assertEquals(town.isAllowedThisAmountOfResidents(11, true), false); + assertFalse(town.isAllowedThisAmountOfResidents(11, true)); } /* @@ -106,21 +103,21 @@ void testFailureAllowTownPopulationWithRestrictionsWithCapital() { void testSuccessAllowNationlessTownPopulationWithFeatureDisabled() { TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_PER_TOWN.getRoot(), 10); TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_MAX_NUMBER_RESIDENTS_WITHOUT_NATION.getRoot(), 0); - assertEquals(town.isAllowedThisAmountOfResidents(5, false), true); + assertTrue(town.isAllowedThisAmountOfResidents(5, false)); } @Test void testSuccessAllowNationlessTownPopulation() { TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_PER_TOWN.getRoot(), 10); TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_MAX_NUMBER_RESIDENTS_WITHOUT_NATION.getRoot(), 5); - assertEquals(town.isAllowedThisAmountOfResidents(5, false), true); + assertTrue(town.isAllowedThisAmountOfResidents(5, false)); } @Test void testFailureAllowNationlessTownPopulation() { TownySettings.getConfig().set(ConfigNodes.GTOWN_MAX_RESIDENTS_PER_TOWN.getRoot(), 10); TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_MAX_NUMBER_RESIDENTS_WITHOUT_NATION.getRoot(), 5); - assertEquals(town.isAllowedThisAmountOfResidents(6, false), false); + assertFalse(town.isAllowedThisAmountOfResidents(6, false)); } /* @@ -130,19 +127,19 @@ void testFailureAllowNationlessTownPopulation() { @Test void testSuccessTownMakingNationWithFeatureDisabled() { TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_REQUIRED_NUMBER_RESIDENTS_CREATE_NATION.getRoot(), 0); - assertEquals(town.hasEnoughResidentsToBeANationCapital(), true); + assertTrue(town.hasEnoughResidentsToBeANationCapital()); } @Test void testSucceedTownPopAllowsBeingCapital() { TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_REQUIRED_NUMBER_RESIDENTS_CREATE_NATION.getRoot(), 5); - assertEquals(town.hasEnoughResidentsToBeANationCapital(), true); + assertTrue(town.hasEnoughResidentsToBeANationCapital()); } @Test void testFailTownPopAllowsBeingCapital() { TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_REQUIRED_NUMBER_RESIDENTS_CREATE_NATION.getRoot(), 6); - assertEquals(town.hasEnoughResidentsToBeANationCapital(), false); + assertFalse(town.hasEnoughResidentsToBeANationCapital()); } /* @@ -152,19 +149,19 @@ void testFailTownPopAllowsBeingCapital() { @Test void testSuccessTownJoiningNationWithFeatureDisabled() { TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_REQUIRED_NUMBER_RESIDENTS_JOIN_NATION.getRoot(), 0); - assertEquals(town.hasEnoughResidentsToBeANationCapital(), true); + assertTrue(town.hasEnoughResidentsToBeANationCapital()); } @Test void testSucceedTownPopAllowsJoiningNation() { TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_REQUIRED_NUMBER_RESIDENTS_JOIN_NATION.getRoot(), 5); - assertEquals(town.hasEnoughResidentsToJoinANation(), true); + assertTrue(town.hasEnoughResidentsToJoinANation()); } @Test void testFailTownPopAllowsJoiningNation() { TownySettings.getConfig().set(ConfigNodes.GTOWN_SETTINGS_REQUIRED_NUMBER_RESIDENTS_JOIN_NATION.getRoot(), 6); - assertEquals(town.hasEnoughResidentsToJoinANation(), false); + assertFalse(town.hasEnoughResidentsToJoinANation()); } /* @@ -175,21 +172,21 @@ void testFailTownPopAllowsJoiningNation() { void testSuccessNationAddingResidentsWithFeatureDisabled() { TownySettings.getConfig().set(ConfigNodes.GNATION_SETTINGS_MAX_RESIDENTS_PER_NATION.getRoot(), 0); nation.addTown(town); - assertEquals(nation.canAddResidents(1), true); + assertTrue(nation.canAddResidents(1)); } @Test void testSuccessNationAddingResidents() { TownySettings.getConfig().set(ConfigNodes.GNATION_SETTINGS_MAX_RESIDENTS_PER_NATION.getRoot(), 7); nation.addTown(town); - assertEquals(nation.canAddResidents(1), true); + assertTrue(nation.canAddResidents(1)); } @Test void testFailureNationAddingResidents() { TownySettings.getConfig().set(ConfigNodes.GNATION_SETTINGS_MAX_RESIDENTS_PER_NATION.getRoot(), 5); nation.addTown(town); - assertEquals(nation.canAddResidents(1), false); + assertFalse(nation.canAddResidents(1)); } } diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/RegistryListTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/object/RegistryListTests.java similarity index 95% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/RegistryListTests.java rename to Towny/src/test/java/com/palmergames/bukkit/towny/object/RegistryListTests.java index ede76ddef8..b1a0a040dd 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/RegistryListTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/object/RegistryListTests.java @@ -1,4 +1,4 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.bukkit.towny.object; import be.seeseemelk.mockbukkit.MockBukkit; import com.palmergames.bukkit.towny.TownySettings; diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/text/HexConversionTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/test/text/HexConversionTests.java deleted file mode 100644 index 6c710a2279..0000000000 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/text/HexConversionTests.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.palmergames.bukkit.towny.test.text; - -import com.palmergames.bukkit.util.Colors; -import com.palmergames.util.StringMgmt; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -public class HexConversionTests { - - // https://github.com/TownyAdvanced/Towny/issues/6291 - // MiniMessage gradient tags should be untouched - @Test - void testNoHexGradientConversion() { - final String gradient = ""; - assertEquals(gradient, Colors.translateLegacyHex(gradient)); - } - - // MiniMessage hex tags should also not be touched - @Test - void testNoMiniMessageConversion() { - final String hex = "<#aaaaaa>"; - assertEquals(hex, Colors.translateLegacyHex(hex)); - } - - @Test - void testUnusualRepeatingPattern() { - final String hexFormat = "§x§a§a§a§a§a§a"; - assertEquals("<#aaaaaa>", Colors.translateLegacyHex(hexFormat)); - } - - @Test - void testAmpersandPoundFormat() { - String hexFormat = "&#aaaaaa"; - assertEquals("<#aaaaaa>", Colors.translateLegacyHex(hexFormat)); - } - - @Test - void testBracketFormat() { - String hexFormat = "{aaaaaa}"; - assertEquals("<#aaaaaa>", Colors.translateLegacyHex(hexFormat)); - } - - @Test - void testMiniMessageToLegacy() { - String hex = "<#aaaaaa>"; - assertEquals("§x§a§a§a§a§a§a", StringMgmt.translateHexColors(hex)); - } -} diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/text/LegacyConversionTests.java b/Towny/src/test/java/com/palmergames/bukkit/util/ColorConversionTests.java similarity index 62% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/text/LegacyConversionTests.java rename to Towny/src/test/java/com/palmergames/bukkit/util/ColorConversionTests.java index 720dc3d51c..8ef75a447b 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/text/LegacyConversionTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/util/ColorConversionTests.java @@ -1,12 +1,51 @@ -package com.palmergames.bukkit.towny.test.text; +package com.palmergames.bukkit.util; -import com.palmergames.bukkit.util.Colors; +import com.palmergames.util.StringMgmt; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; -public class LegacyConversionTests { +public class ColorConversionTests { + // https://github.com/TownyAdvanced/Towny/issues/6291 + // MiniMessage gradient tags should be untouched + @Test + void testNoHexGradientConversion() { + final String gradient = ""; + assertEquals(gradient, Colors.translateLegacyHex(gradient)); + } + + // MiniMessage hex tags should also not be touched + @Test + void testNoMiniMessageConversion() { + final String hex = "<#aaaaaa>"; + assertEquals(hex, Colors.translateLegacyHex(hex)); + } + + @Test + void testUnusualRepeatingPattern() { + final String hexFormat = "§x§a§a§a§a§a§a"; + assertEquals("<#aaaaaa>", Colors.translateLegacyHex(hexFormat)); + } + + @Test + void testAmpersandPoundFormat() { + String hexFormat = "&#aaaaaa"; + assertEquals("<#aaaaaa>", Colors.translateLegacyHex(hexFormat)); + } + + @Test + void testBracketFormat() { + String hexFormat = "{aaaaaa}"; + assertEquals("<#aaaaaa>", Colors.translateLegacyHex(hexFormat)); + } + + @Test + void testMiniMessageToLegacy() { + String hex = "<#aaaaaa>"; + assertEquals("§x§a§a§a§a§a§a", StringMgmt.translateHexColors(hex)); + } + @Test void testLegacyConversions() { assertEquals(Colors.BLACK, Colors.translateLegacyCharacters(Colors.Black)); @@ -19,7 +58,7 @@ void testLegacyConversions() { assertEquals(Colors.GRAY, Colors.translateLegacyCharacters(Colors.LightGray)); assertEquals(Colors.DARK_GRAY, Colors.translateLegacyCharacters(Colors.Gray)); assertEquals(Colors.BLUE, Colors.translateLegacyCharacters(Colors.DarkPurple)); - + assertEquals(Colors.GREEN, Colors.translateLegacyCharacters(Colors.LightGreen)); assertEquals(Colors.AQUA, Colors.translateLegacyCharacters(Colors.LightBlue)); assertEquals(Colors.RED, Colors.translateLegacyCharacters(Colors.Rose)); @@ -34,7 +73,7 @@ void testLegacyConversions() { assertEquals(Colors.ITALIC, Colors.translateLegacyCharacters("§o")); assertEquals(Colors.RESET, Colors.translateLegacyCharacters("§r")); } - + @Test void testNoLegacyUnaffected() { assertEquals("test", Colors.translateLegacyCharacters("test")); diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/NameValidationTests.java b/Towny/src/test/java/com/palmergames/bukkit/util/NameValidationTests.java similarity index 86% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/NameValidationTests.java rename to Towny/src/test/java/com/palmergames/bukkit/util/NameValidationTests.java index edf0e0f8a1..1819d35fe4 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/NameValidationTests.java +++ b/Towny/src/test/java/com/palmergames/bukkit/util/NameValidationTests.java @@ -1,8 +1,7 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.bukkit.util; import com.palmergames.bukkit.towny.command.NationCommand; import com.palmergames.bukkit.towny.command.TownCommand; -import com.palmergames.bukkit.util.NameValidation; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/TimeTests.java b/Towny/src/test/java/com/palmergames/util/TimeTests.java similarity index 92% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/TimeTests.java rename to Towny/src/test/java/com/palmergames/util/TimeTests.java index 34ad4c1262..863ca13593 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/TimeTests.java +++ b/Towny/src/test/java/com/palmergames/util/TimeTests.java @@ -1,6 +1,5 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.util; -import com.palmergames.util.TimeTools; import org.junit.jupiter.api.Test; import java.util.concurrent.TimeUnit; diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/TrieTests.java b/Towny/src/test/java/com/palmergames/util/TrieTests.java similarity index 90% rename from Towny/src/test/java/com/palmergames/bukkit/towny/test/TrieTests.java rename to Towny/src/test/java/com/palmergames/util/TrieTests.java index da29b7abc2..2ebdcfc8e3 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/TrieTests.java +++ b/Towny/src/test/java/com/palmergames/util/TrieTests.java @@ -1,6 +1,5 @@ -package com.palmergames.bukkit.towny.test; +package com.palmergames.util; -import com.palmergames.util.Trie; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; From c3bef169684d8073a27d64e2d5e8455aeae0bc1d Mon Sep 17 00:00:00 2001 From: LlmDl Date: Mon, 19 Feb 2024 08:51:38 -0600 Subject: [PATCH 26/27] - Remove magic values from spawnpoint ring offsets, courtesy of Warrior with PR #7267. - Fix mob removal on folia, courtesy of Warrior with PR #7262. - Closes #7261, #7221, #7202, #7253. - Make our custom registered commands identifiable, courtesy of Warrior with PR #7263. - Move using_economy to the eco section of the config, courtesy of Warrior with PR #7265. - Automatic config edit: - plugin.interfacing.using_economy moves to economy.using_economy - Remove uuid percentage tracking, courtesy of Warrior with PR #7266. - Make PlotClaim a runnable, courtesy of Warrior with PR #7268. - Reorganize test directory layout, courtesy of Warrior with PR #7269. --- .../com/palmergames/bukkit/towny/TownySettings.java | 1 - .../palmergames/bukkit/towny/db/TownyDataSource.java | 1 - Towny/src/main/resources/ChangeLog.txt | 12 +++++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java index be2ed9bad8..ff3a7653b5 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java @@ -97,7 +97,6 @@ public record NationLevel( private static CommentedConfiguration config; private static CommentedConfiguration newConfig; - private static int uuidCount; private static boolean areLevelTypeLimitsConfigured; private static final SortedMap configTownLevel = Collections.synchronizedSortedMap(new TreeMap<>(Collections.reverseOrder())); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java index 9e6a666ae8..ac8c5d9b69 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/TownyDataSource.java @@ -2,7 +2,6 @@ import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.TownyMessaging; -import com.palmergames.bukkit.towny.TownySettings; import com.palmergames.bukkit.towny.TownyUniverse; import com.palmergames.bukkit.towny.exceptions.AlreadyRegisteredException; import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index 42876604d2..2acb01dce9 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9538,4 +9538,14 @@ v0.92.0.11: - Prevent falling blocks falling during unclaimed land regeneration. - Closes #7259. - Make use of the disallow numbers in town names config option again. - - Fix being unable to unset titles and surnames. \ No newline at end of file + - Fix being unable to unset titles and surnames. + - Remove magic values from spawnpoint ring offsets, courtesy of Warrior with PR #7267. + - Fix mob removal on folia, courtesy of Warrior with PR #7262. + - Closes #7261, #7221, #7202, #7253. + - Make our custom registered commands identifiable, courtesy of Warrior with PR #7263. + - Move using_economy to the eco section of the config, courtesy of Warrior with PR #7265. + - Automatic config edit: + - plugin.interfacing.using_economy moves to economy.using_economy + - Remove uuid percentage tracking, courtesy of Warrior with PR #7266. + - Make PlotClaim a runnable, courtesy of Warrior with PR #7268. + - Reorganize test directory layout, courtesy of Warrior with PR #7269. \ No newline at end of file From ee8c779bb6e408b17234b9a4df36f87cc6d4a581 Mon Sep 17 00:00:00 2001 From: LlmDl Date: Mon, 19 Feb 2024 09:27:17 -0600 Subject: [PATCH 27/27] - Enabled /plot group toggle taxed command for plot groups. - You can now properly enabled/disable plot taxes for groups of plots. --- Towny/pom.xml | 2 +- .../java/com/palmergames/bukkit/towny/command/HelpMenu.java | 3 ++- .../com/palmergames/bukkit/towny/command/PlotCommand.java | 6 ++++++ Towny/src/main/resources/ChangeLog.txt | 5 ++++- Towny/src/main/resources/lang/en-US.yml | 2 ++ 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Towny/pom.xml b/Towny/pom.xml index da7094879e..0407d3aeaa 100644 --- a/Towny/pom.xml +++ b/Towny/pom.xml @@ -13,7 +13,7 @@ towny jar - 0.100.1.15 + 0.100.1.16 diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/HelpMenu.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/HelpMenu.java index bb930d66b2..a6b3581283 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/HelpMenu.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/HelpMenu.java @@ -843,7 +843,8 @@ protected MenuBuilder load() { .add("pvp", Translatable.of("plot_group_toggle_help_0")) .add("explosion", Translatable.of("plot_group_toggle_help_1")) .add("fire", Translatable.of("plot_group_toggle_help_2")) - .add("mobs", Translatable.of("plot_group_toggle_help_3")); + .add("mobs", Translatable.of("plot_group_toggle_help_3")) + .add("taxed", Translatable.of("plot_group_toggle_help_4")); } }, diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java index d8a359d26d..61c3bdf5de 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java @@ -1659,6 +1659,9 @@ public void plotGroupToggle(Player player, Resident resident, PlotGroup plotGrou case "mobs": checkPermOrThrow(player, PermissionNodes.TOWNY_COMMAND_PLOT_TOGGLE_MOBS.getNode()); break; + case "taxed": + checkPermOrThrow(player, PermissionNodes.TOWNY_COMMAND_PLOT_ASMAYOR.getNode()); + break; } for (TownBlock groupBlock : plotGroup.getTownBlocks()) { @@ -1683,6 +1686,9 @@ public void plotGroupToggle(Player player, Resident resident, PlotGroup plotGrou tryToggleTownBlockMobs(player, groupBlock, split, choice); endingMessage = Translatable.of("msg_changed_mobs", Translatable.of("msg_the_plot_group"), groupBlock.getPermissions().mobs ? Translatable.of("enabled") : Translatable.of("disabled")); break; + case "taxed": + tryToggleTownBlockTaxed(player, groupBlock, split, choice); + endingMessage = Translatable.of("msg_changed_plotgroup_taxed", groupBlock.isTaxed() ? Translatable.of("enabled") : Translatable.of("disabled")); default: TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_invalid_property", "plot")); return; diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt index 2acb01dce9..bf5ffbcf81 100644 --- a/Towny/src/main/resources/ChangeLog.txt +++ b/Towny/src/main/resources/ChangeLog.txt @@ -9548,4 +9548,7 @@ v0.92.0.11: - plugin.interfacing.using_economy moves to economy.using_economy - Remove uuid percentage tracking, courtesy of Warrior with PR #7266. - Make PlotClaim a runnable, courtesy of Warrior with PR #7268. - - Reorganize test directory layout, courtesy of Warrior with PR #7269. \ No newline at end of file + - Reorganize test directory layout, courtesy of Warrior with PR #7269. +0.100.1.16: + - Enabled /plot group toggle taxed command for plot groups. + - You can now properly enabled/disable plot taxes for groups of plots. \ No newline at end of file diff --git a/Towny/src/main/resources/lang/en-US.yml b/Towny/src/main/resources/lang/en-US.yml index baa57f929a..641f8193d8 100644 --- a/Towny/src/main/resources/lang/en-US.yml +++ b/Towny/src/main/resources/lang/en-US.yml @@ -465,6 +465,7 @@ plot_group_toggle_help_0: "Toggles pvp in the plot group." plot_group_toggle_help_1: "Toggles explosions in the plot group." plot_group_toggle_help_2: "Toggles fire in the plot group." plot_group_toggle_help_3: "Toggles mobs in the plot group." +plot_group_toggle_help_4: "Toggles the taxed status of the plot group." plot_set_help_0: "Ex: Inn, Wilds, Farm, Embassy, etc." plot_set_help_1: "Sets a plot to an Outpost." @@ -2357,6 +2358,7 @@ msg_err_world_not_loaded: "World is not loaded." # Message shown when a mayor toggles a plots taxed status. msg_changed_plot_taxed: '&cThis plot has had its taxed status set to %s.' +msg_changed_plotgroup_taxed: '&cThis plotgroup has had its taxed status set to %s.' status_forsale: "&a(For Sale: %s)" msg_town_forsale: "%s has been set for sale at %s."