diff --git a/Towny/pom.xml b/Towny/pom.xml
index 220d5e400a..fa5c6b4e96 100644
--- a/Towny/pom.xml
+++ b/Towny/pom.xml
@@ -13,7 +13,7 @@
townyjar
- 0.100.0.14
+ 0.100.0.18
@@ -172,12 +172,12 @@
net.kyoriadventure-text-serializer-plain
- 4.14.0
+ 4.15.0net.kyoriadventure-text-minimessage
- 4.14.0
+ 4.15.0org.bstats
@@ -277,7 +277,7 @@
org.apache.maven.pluginsmaven-compiler-plugin
- 3.11.0
+ 3.12.18
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 30b5441a4f..0b7c2eb286 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java
@@ -75,6 +75,8 @@ public enum ConfigNodes {
""),
LEVELS_TOWN_LEVEL("levels.town_level", "", "", "# Guide On How to Configure: https://github.com/TownyAdvanced/Towny/wiki/How-Towny-Works#configuring-town_level-and-nation_level"),
LEVELS_NATION_LEVEL("levels.nation_level", "", "", "# Guide On How to Configure: https://github.com/TownyAdvanced/Towny/wiki/How-Towny-Works#configuring-town_level-and-nation_level"),
+
+
TOWN(
"town",
"",
@@ -82,7 +84,7 @@ public enum ConfigNodes {
"",
"############################################################",
"# +------------------------------------------------------+ #",
- "# | Town Claim/new defaults | #",
+ "# | New Town Defaults | #",
"# +------------------------------------------------------+ #",
"############################################################",
""),
@@ -159,176 +161,8 @@ public enum ConfigNodes {
"# A required minimum tax amount for the default_tax, will not change any towns which already have a tax set.",
"# Do not forget to set the default_tax to more than 0 or new towns will still begin with a tax of zero.",
"# This setting has no effect when negative taxes are allowed."),
- TOWN_MAX_PURCHASED_BLOCKS(
- "town.max_purchased_blocks",
- "0",
- "",
- "# Limits the maximum amount of bonus blocks a town can buy.",
- "# This setting does nothing when town.max_purchased_blocks_uses_town_levels is set to true."),
- TOWN_MAX_PURCHASED_BLOCKS_USES_TOWN_LEVELS(
- "town.max_purchased_blocks_uses_town_levels",
- "true",
- "",
- "# When set to true, the town_level section of the config determines the maximum number of bonus blocks a town can purchase."),
- TOWN_MAX_PLOTS_PER_RESIDENT(
- "town.max_plots_per_resident",
- "100",
- "",
- "# maximum number of plots any single resident can own"),
- TOWN_MAX_CLAIM_RADIUS_VALUE(
- "town.max_claim_radius_value",
- "4",
- "",
- "# maximum number used in /town claim/unclaim # commands.",
- "# set to 0 to disable limiting of claim radius value check.",
- "# keep in mind that the default value of 4 is a radius, ",
- "# and it will allow claiming 9x9 (80 plots) at once."),
- TOWN_MAX_BUYTOWN_PRICE(
- "town.max_buytown_price",
- "999999999",
- "",
- "# The Maximum price that a town can be put for sale at. This refers to the price that",
- "# someone could pay if they ran /t buytown, to buy a town that has been put up for sale."),
-
- TOWN_OVERCLAIMING_ROOT("town.overclaiming", "", "", ""),
- TOWN_OVER_ALLOWED_CLAIM_LIMITS_ALLOWS_STEALING_LAND(
- "town.overclaiming.being_overclaimed_allows_other_towns_to_steal_land",
- "false",
- "",
- "# A feature that allows towns which have too many townblocks claimed (overclaimed) ie: 120/100 TownBlocks, ",
- "# to have their land stolen by other towns which are not overclaimed. Using this incentivises Towns to keep",
- "# their residents from leaving, and will mean that mayors will be more careful about which land they choose",
- "# to claim.",
- "# Overclaiming does not allow a town to be split into two separate parts, requiring the Town that is stealing",
- "# land to work from the outside inwards.",
- "# It is highly recommended to only use this on servers where outposts are disabled, and requiring ",
- "# a number of adjacent claims over 1 is enabled.",
- "# Towns take land using /t takeoverclaim."),
- TOWN_OVERCLAIMING_PREVENTED_BY_HOMEBLOCK_RADIUS(
- "town.overclaiming.overclaiming_prevented_by_homeblock_radius",
- "true",
- "",
- "# While true, overclaiming is stopped by the min_distance_from_town_homeblock setting below.",
- "# This prevents a town from having townblocks stolen surrounding their homeblocks."),
- TOWN_OVERCLAIMING_TOWN_AGE_REQUIREMENT(
- "town.overclaiming.town_age_requirement",
- "7d",
- "",
- "# When in use, requires that a town be of a minimum age in order to overclaim another town. This prevents new towns being made just to overclaim someone.",
- "# Default is for 7 days."),
- TOWN_OVERCLAIMING_COMMAND_COOLDOWN(
- "town.overclaiming.command_cooldown",
- "0m",
- "",
- "# When in use, requires an amount of time to pass before the /t takeoverclaim command can be used again."),
-
- TOWN_LIMIT(
- "town.town_limit",
- "3000",
- "",
- "# Maximum number of towns allowed on the server."),
- TOWN_MAX_DISTANCE_FOR_MERGE(
- "town.max_distance_for_merge",
- "10",
- "",
- "# The maximum distance (in townblocks) that 2 town's homeblocks can be to be eligible for merging."),
- TOWN_MIN_DISTANCE_IGNORED_FOR_NATIONS(
- "town.min_distances_ignored_for_towns_in_same_nation",
- "true",
- "",
- "# If true, the below settings: min_plot_distance_from_town_plot and min_distance_from_town_homeblock",
- "# will be ignored for towns that are in the same nation. Setting to false will keep all towns separated the same."),
- TOWN_MIN_DISTANCE_IGNORED_FOR_ALLIES(
- "town.min_distances_ignored_for_towns_in_allied_nation",
- "false",
- "",
- "# If true, the below settings: min_plot_distance_from_town_plot and min_distance_from_town_homeblock",
- "# will be ignored for towns that are mutually allied. Setting to false will keep all towns separated the same."),
- TOWN_MIN_PLOT_DISTANCE_FROM_TOWN_PLOT(
- "town.min_plot_distance_from_town_plot",
- "5",
- "",
- "# Minimum number of plots any towns plot must be from the next town's own plots.",
- "# Put in other words: the buffer area around every claim that no other town can claim into.",
- "# Does not affect towns which are in the same nation.",
- "# This will prevent town encasement to a certain degree."),
- TOWN_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK(
- "town.min_distance_from_town_homeblock",
- "5",
- "",
- "# Minimum number of plots any towns home plot must be from the next town.",
- "# Put in other words: the buffer area around every homeblock that no other town can claim into.",
- "# Does not affect towns which are in the same nation.",
- "# This will prevent someone founding a town right on your doorstep"),
- TOWN_MIN_DISTANCE_FOR_OUTPOST_FROM_PLOT(
- "town.min_distance_for_outpost_from_plot",
- "5",
- "",
- "# Minimum number of plots an outpost must be from any other town's plots.",
- "# Useful when min_plot_distance_from_town_plot is set to near-zero to allow towns to have claims",
- "# near to each other, but want to keep outposts away from towns."),
- TOWN_MAX_DISTANCE_FOR_OUTPOST_FROM_TOWN_PLOT(
- "town.max_distance_for_outpost_from_town_plot",
- "0",
- "",
- "# Set to 0 to disable. When above 0 an outpost may only be claimed within the given number of townblocks from a townblock owned by the town.",
- "# Setting this to any value above 0 will stop outposts being made off-world from the town's homeworld.",
- "# Do not set lower than min_distance_for_outpost_from_plot above."),
- TOWN_MIN_DISTANCE_BETWEEN_HOMEBLOCKS(
- "town.min_distance_between_homeblocks",
- "0",
- "",
- "# Minimum distance between homeblocks."),
- TOWN_MAX_DISTANCE_BETWEEN_HOMEBLOCKS(
- "town.max_distance_between_homeblocks",
- "0",
- "",
- "# Maximum distance between homeblocks.",
- "# This will force players to build close together."),
- TOWN_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_PLOT(
- "town.new_town_min_distance_from_town_plot",
- "-1",
- "",
- "# The minimum distance that a new town must be from nearby towns' plots.",
- "# When set to -1, this will use the value of the min_plot_distance_from_town_plot option."),
- TOWN_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK(
- "town.new_town_min_distance_from_town_homeblock",
- "-1",
- "",
- "# The minimum distance that a new town must be from nearby towns' homeblocks.",
- "# When set to -1, this will use the value of the min_distance_from_town_homeblock setting."),
- TOWN_TOWN_BLOCK_RATIO(
- "town.town_block_ratio",
- "8",
- "",
- "# The maximum townblocks available to a town is (numResidents * ratio).",
- "# Setting this value to 0 will instead use the level based jump values determined in the town level config.",
- "# Setting this to -1 will result in every town having unlimited claims."),
- TOWN_TOWN_BLOCK_LIMIT(
- "town.town_block_limit",
- "0",
- "",
- "# The maximimum amount of townblocks a town can have, if town_block_ratio is 0 the max size will be decided by the town_levels.",
- "# Set to 0 to have no size limit."),
- TOWN_TOWN_BLOCK_SIZE(
- "town.town_block_size",
- "16",
- "",
- "# The size of the square grid cell. Changing this value is suggested only when you first install Towny.",
- "# Doing so after entering data will shift things unwantedly. Using smaller value will allow higher precision,",
- "# at the cost of more work setting up. Also, extremely small values will render the caching done useless.",
- "# Each cell is (town_block_size * town_block_size * height-of-the-world) in size, with height-of-the-world",
- "# being from the bottom to the top of the build-able world."),
- TOWN_MIN_ADJACENT_BLOCKS(
- "town.min_adjacent_blocks",
- "-1",
- "",
- "# The minimum adjacent town blocks required to expand.",
- "# This can prevent long lines and snake-like patterns.",
- "# Set to -1 to disable. Set to 3 to force wider expansions of towns."),
-
NATION("nation", "", "", "",
"############################################################",
"# +------------------------------------------------------+ #",
@@ -382,6 +216,8 @@ public enum ConfigNodes {
"100",
"",
"# The maximum amount of money that can be charge by a nation on their conquered towns."),
+
+
NWS(
"new_world_settings",
"",
@@ -401,7 +237,6 @@ public enum ConfigNodes {
"# #",
"############################################################",
""),
-
NWS_WORLD_USING_TOWNY("new_world_settings.using_towny", "true",
"# Do new worlds have Towny enabled by default?",
"# You can adjust this setting for an existing world using /townyworld toggle usingtowny"),
@@ -411,7 +246,6 @@ public enum ConfigNodes {
"# Are new worlds claimable by default?",
"# Setting this to false means that Towny will still be active but no land can be claimed by towns.",
"# You can adjust this setting for an existing world using /townyworld toggle claimable"),
-
NWS_WORLD_PVP_HEADER("new_world_settings.pvp", "", ""),
NWS_WORLD_PVP(
"new_world_settings.pvp.world_pvp",
@@ -439,7 +273,6 @@ public enum ConfigNodes {
"",
"# Do new worlds have their war_allowed enabled by default?",
"# You can adjust this setting for an existing world using /townyworld toggle warallowed"),
-
NWS_WORLD_MONSTERS_HEADER("new_world_settings.mobs", "", ""),
NWS_WORLD_MONSTERS_ON(
"new_world_settings.mobs.world_monsters_on",
@@ -459,7 +292,6 @@ public enum ConfigNodes {
"# Do new worlds have force_town_monsters_on enabled by default?",
"# This setting overrides a towns' setting.",
"# You can adjust this setting for an existing world using /townyworld toggle townmobs"),
-
NWS_WORLD_EXPLOSION_HEADER("new_world_settings.explosions", "", ""),
NWS_WORLD_EXPLOSION(
"new_world_settings.explosions.world_explosions_enabled",
@@ -473,7 +305,6 @@ public enum ConfigNodes {
"# Do new worlds have force_explosions_on enabled by default.",
"# This setting overrides a towns' setting, preventing them from turning explosions off in their town.",
"# You can adjust this setting for an existing world using /townyworld toggle forceexplosion"),
-
NWS_WORLD_FIRE_HEADER("new_world_settings.fire", "", ""),
NWS_WORLD_FIRE(
"new_world_settings.fire.world_firespread_enabled",
@@ -487,25 +318,21 @@ public enum ConfigNodes {
"# Do new worlds have force_fire_on enabled by default?",
"# This setting overrides a towns' setting.",
"# You can adjust this setting for an existing world using /townyworld toggle forcefire"),
-
NWS_WORLD_ENDERMAN(
"new_world_settings.enderman_protect",
"true",
"",
"# Do new worlds prevent Endermen from picking up and placing blocks, by default?"),
-
NWS_DISABLE_CREATURE_CROP_TRAMPLING(
"new_world_settings.disable_creature_crop_trampling",
"true",
"",
"# Do new worlds disable creatures trampling crops, by default?"),
-
NWS_PLOT_MANAGEMENT_HEADER(
"new_world_settings.plot_management",
"",
"",
"# World management settings to deal with un/claiming plots"),
-
NWS_PLOT_MANAGEMENT_DELETE_HEADER(
"new_world_settings.plot_management.block_delete",
"",
@@ -521,7 +348,6 @@ public enum ConfigNodes {
"BEDS,TORCHES,REDSTONE_WIRE,SIGNS,DOORS,PRESSURE_PLATES",
"",
"# These items will be deleted upon a plot being unclaimed"),
-
NWS_PLOT_MANAGEMENT_ENTITY_DELETE_HEADER(
"new_world_settings.plot_management.entity_delete",
"",
@@ -536,7 +362,6 @@ public enum ConfigNodes {
"",
"# These entities will be deleted upon a plot being unclaimed.",
"# Valid EntityTypes can be found here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/entity/EntityType.html"),
-
NWS_PLOT_MANAGEMENT_MAYOR_DELETE_HEADER(
"new_world_settings.plot_management.mayor_plotblock_delete",
"",
@@ -553,7 +378,6 @@ public enum ConfigNodes {
"",
"# These items will be deleted upon a mayor using /plot clear",
"# To disable deleting replace the current entries with NONE."),
-
NWS_PLOT_MANAGEMENT_REVERT_HEADER(
"new_world_settings.plot_management.revert_on_unclaim",
"",
@@ -594,7 +418,6 @@ public enum ConfigNodes {
"# useful when you allow players to build/destroy in the wilderness.",
"# Like other options in the new_world_settings section, this is only applied as a default setting for new worlds.",
"# Configure the list found in the towny\\data\\worlds\\WORLDNAME.txt files."),
-
NWS_PLOT_MANAGEMENT_WILD_MOB_REVERT_HEADER(
"new_world_settings.plot_management.wild_revert_on_mob_explosion",
"",
@@ -636,7 +459,7 @@ public enum ConfigNodes {
"new_world_settings.plot_management.wild_revert_on_explosion_block_whitelist",
"",
"# The list of blocks to regenerate. (if empty all blocks will regenerate)"),
-
+
GTOWN_SETTINGS(
"global_town_settings",
@@ -649,6 +472,17 @@ public enum ConfigNodes {
"# +------------------------------------------------------+ #",
"############################################################",
""),
+ GTOWN_SETTINGS_LIMIT(
+ "global_town_settings.town_limit",
+ "3000",
+ "",
+ "# Maximum number of towns allowed on the server."),
+ GTOWN_SETTINGS_MAX_DISTANCE_FOR_MERGE(
+ "global_town_settings.max_distance_for_merge",
+ "10",
+ "",
+ "# The maximum distance (in townblocks) that 2 town's homeblocks can be to be eligible for merging."),
+
GTOWN_SETTINGS_HEALTH_REGEN(
"global_town_settings.health_regen",
"",
@@ -658,127 +492,7 @@ public enum ConfigNodes {
GTOWN_SETTINGS_REGEN_ENABLE(
"global_town_settings.health_regen.enable",
"true"),
- GTOWN_SETTINGS_ALLOW_OUTPOSTS(
- "global_town_settings.allow_outposts",
- "true",
- "",
- "# Allow towns to claim outposts (a townblock not connected to town)."),
- GTOWN_SETTINGS_LIMIT_OUTPOST_USING_LEVELS(
- "global_town_settings.limit_outposts_using_town_and_nation_levels",
- "false",
- "",
- "# When set to true outposts can be limited by the townOutpostLimit value of the Town Levels and",
- "# the nationBonusOutpostLimit value in the Nation Levels. In this way nations can be made to be",
- "# the only way of receiving outposts, or as an incentive to receive more outposts. Towns which are",
- "# larger can have more outposts.",
- "# When activated, this setting will not cause towns who already have higher than their limit",
- "# to lose outposts. They will not be able to start new outposts until they have unclaimed outposts",
- "# to become under their limit. Likewise, towns that join a nation and receive bonus outposts will",
- "# be over their limit if they leave the nation."),
- GTOWN_SETTINGS_OVER_OUTPOST_LIMIT_STOP_TELEPORT(
- "global_town_settings.over_outpost_limits_stops_teleports",
- "false",
- "",
- "# When limit_outposts_using_town_and_nation_levels is also true, towns which are over their outpost",
- "# limit will not be able to use their /town outpost teleports for the outpost #'s higher than their limit,",
- "# until they have dropped below their limit.",
- "# eg: If their limit is 3 then they cannot use /t outpost 4"),
- GTOWN_SETTINGS_ALLOW_TOWN_SPAWN(
- "global_town_settings.allow_town_spawn",
- "true",
- "",
- "# Allow the use of /town spawn",
- "# Valid values are: true, false, war, peace",
- "# When war or peace is set, it is only possible to teleport to the town,",
- "# when there is a war or peace."),
- GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL(
- "global_town_settings.allow_town_spawn_travel",
- "true",
- "",
- "# Allow regular residents to use /town spawn [town] (TP to other towns if they are public).",
- "# Valid values are: true, false, war, peace",
- "# When war or peace is set, it is only possible to teleport to the town,",
- "# when there is a war or peace."),
- GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL_NATION(
- "global_town_settings.allow_town_spawn_travel_nation",
- "true",
- "",
- "# Allow regular residents to use /town spawn [town] to other towns in your nation.",
- "# Valid values are: true, false, war, peace",
- "# When war or peace is set, it is only possible to teleport to the town,",
- "# when there is a war or peace."),
- GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL_ALLY(
- "global_town_settings.allow_town_spawn_travel_ally",
- "true",
- "",
- "# Allow regular residents to use /town spawn [town] to other towns in a nation allied with your nation.",
- "# Valid values are: true, false, war, peace",
- "# When war or peace is set, it is only possible to teleport to the town,",
- "# when there is a war or peace."),
- GTOWN_SETTINGS_IS_ALLY_SPAWNING_REQUIRING_PUBLIC_STATUS(
- "global_town_settings.is_nation_ally_spawning_requiring_public_status",
- "false",
- "",
- "# When set to true both nation and ally spawn travel will also require the target town to have their status set to public."),
- GTOWN_SETTINGS_IS_TRUSTED_RESIDENTS_COUNT_AS_RESIDENTS(
- "global_town_settings.do_trusted_residents_count_as_residents",
- "false",
- "",
- "# When set to true, a player that is trusted by a town is allowed to spawn to the town as if they were a resident.",
- "# Allows allows the residents of entire an town when that town is trusted by the town."),
- GTOWN_SETTINGS_IS_NEW_RESIDENT_PROMPTED_TO_SPAWN(
- "global_town_settings.are_new_residents_prompted_to_town_spawn",
- "false",
- "",
- "# When a resident joins a town, should they be prompted to use spawn to the town?",
- "# This requires them to not already be standing in the town, and also to be able to use /t spawn and whatever costs may be associated with it."),
- GTOWN_SETTINGS_SPAWN_TIMER(
- "global_town_settings.teleport_warmup_time",
- "0",
- "",
- "# If non zero it delays any spawn request by x seconds."),
- GTOWN_SETTINGS_MOVEMENT_CANCELS_SPAWN_WARMUP(
- "global_town_settings.movement_cancels_spawn_warmup",
- "false",
- "",
- "# When set to true, if players are currently in a spawn warmup, moving will cancel their spawn."),
- GTOWN_SETTINGS_DAMAGE_CANCELS_SPAWN_WARMUP(
- "global_town_settings.damage_cancels_spawn_warmup",
- "false",
- "",
- "# When set to true, if players are damaged in any way while in a spawn warmup, their spawning will be cancelled."),
- GTOWN_SETTINGS_COOLDOWN_ROOT(
- "global_town_settings.spawning_cooldowns", "", ""),
- GTOWN_SETTINGS_SPAWN_COOLDOWN_TIMER(
- "global_town_settings.spawning_cooldowns.town_spawn_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player can use /t spawn or /res spawn."),
- GTOWN_SETTINGS_OUTPOST_COOLDOWN_TIMER(
- "global_town_settings.spawning_cooldowns.outpost_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player can use /t outpost."),
- GTOWN_SETTINGS_NATION_MEMBER_COOLDOWN_TIMER(
- "global_town_settings.spawning_cooldowns.nation_member_town_spawn_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player of the same nation can use /t spawn."),
- GTOWN_SETTINGS_NATION_ALLY_COOLDOWN_TIMER(
- "global_town_settings.spawning_cooldowns.nation_ally_town_spawn_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player in an allied nation can use /t spawn."),
- GTOWN_SETTINGS_UNAFFILIATED_COOLDOWN_TIMER(
- "global_town_settings.spawning_cooldowns.unaffiliated_town_spawn_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player who is not a member or ally of town can use /t spawn."),
- GTOWN_SETTINGS_SPAWN_WARNINGS(
- "global_town_settings.spawn_warnings",
- "true",
- "",
- "# Decides whether confirmations should appear if you spawn to an area with an associated cost."),
+
GTOWN_SETTINGS_PVP_COOLDOWN_TIMER(
"global_town_settings.pvp_cooldown_time",
"30",
@@ -801,47 +515,6 @@ public enum ConfigNodes {
"0",
"",
"# Number of seconds that must pass before a town that has unclaimed a townblock can claim it again."),
-
- GTOWN_SETTINGS_TOWN_RESPAWN(
- "global_town_settings.town_respawn",
- "false",
- "",
- "# When true Towny will handle respawning, with town or resident spawns."),
- GTOWN_SETTINGS_RESPAWN_PROTECTION_ROOT("global_town_settings.respawn_protection", "", ""),
- GTOWN_SETTINGS_RESPAWN_PROTECTION_TIME(
- "global_town_settings.respawn_protection.time",
- "10s",
- "",
- "# When greater than 0s, the amount of time a player who has respawned is considered invulnerable.",
- "# Invulnerable players who attack other players will lose their invulnerability.",
- "# Invulnerable players who teleport after respawn will also lose their invulnerability."),
- GTOWN_SETTINGS_RESPAWN_PROTECTION_ALLOW_PICKUP(
- "global_town_settings.respawn_protection.allow_pickup",
- "true",
- "",
- "# If disabled, players will not be able to pickup items while under respawn protection."),
- GTOWN_SETTINGS_TOWN_RESPAWN_SAME_WORLD_ONLY(
- "global_town_settings.town_respawn_same_world_only",
- "false",
- "",
- "# Town respawn only happens when the player dies in the same world as the town's spawn point."),
- GTOWN_SETTINGS_PREVENT_TOWN_SPAWN_IN(
- "global_town_settings.prevent_town_spawn_in",
- "enemy,outlaw",
- "",
- "# Prevent players from using /town spawn while within unclaimed areas and/or enemy/neutral towns.",
- "# Allowed options: unclaimed,enemy,neutral,outlaw"),
- GTOWN_SETTINGS_ENEMIES_ALLOWED_TO_SPAWN_TO_PEACEFUL_TOWNS(
- "global_town_settings.allow_enemies_spawn_to_peaceful_towns",
- "false",
- "",
- "# When true, players will be allowed to spawn to peaceful/neutral towns in which they are considered enemies.",
- "# Setting this to true will make town spawn points unsafe for private towns which are part of nations with enemies."),
- GTOWN_RESPAWN_ANCHOR_HIGHER_PRECEDENCE(
- "global_town_settings.respawn_anchor_higher_precendence",
- "true",
- "",
- "# When this is true, players will respawn to respawn anchors on death rather than their own town. 1.16+ only."),
GTOWN_HOMEBLOCK_MOVEMENT_COOLDOWN(
"global_town_settings.homeblock_movement_cooldown_hours",
"0",
@@ -996,13 +669,6 @@ public enum ConfigNodes {
"",
"# If set to true, when a world has forcepvp set to true, homeblocks of towns will not be affected and have PVP set to off.",
"# Does not have any effect when Event War is active."),
- GTOWN_SETTINGS_MINIMUM_AMOUNT_RESIDENTS_FOR_OUTPOSTS(
- "global_town_settings.minimum_amount_of_residents_in_town_for_outpost",
- "0",
- "",
- "# The amount of residents a town needs to claim an outpost,",
- "# Setting this value to 0, means a town can claim outposts no matter how many residents"
- ),
GTOWN_SETTINGS_KEEP_INVENTORY_ON_DEATH_IN_TOWN(
"global_town_settings.keep_inventory_on_death_in_town",
"false",
@@ -1045,6 +711,13 @@ public enum ConfigNodes {
"# If People should keep their experience on death in an arena townblock.",
"# Is not guaranteed to work with other keep experience plugins!"
),
+ GTOWN_SETTINGS_MAX_BUYTOWN_PRICE(
+ "global_town_settings.max_buytown_price",
+ "999999999",
+ "",
+ "# The Maximum price that a town can be put for sale at. This refers to the price that",
+ "# someone could pay if they ran /t buytown, to buy a town that has been put up for sale."
+ ),
GTOWN_MAX_PLOT_PRICE_COST(
"global_town_settings.maximum_plot_price_cost",
"1000000.0",
@@ -1052,6 +725,12 @@ public enum ConfigNodes {
"# Maximum amount that a town can set their plot, embassy, shop, etc plots' prices to.",
"# Setting this higher can be dangerous if you use Towny in a mysql database. Large numbers can become shortened to scientific notation. "
),
+ GTOWN_SETTINGS_MAX_PLOTS_PER_RESIDENT(
+ "global_town_settings.max_plots_per_resident",
+ "100",
+ "",
+ "# maximum number of plots any single resident can own"
+ ),
GTOWN_SETTINGS_DISPLAY_XYZ_INSTEAD_OF_TOWNY_COORDS(
"global_town_settings.display_xyz_instead_of_towny_coords",
"false",
@@ -1078,7 +757,6 @@ public enum ConfigNodes {
"",
"# When enabled, blocks like lava or water will be unable to flow into other plots, if the owners aren't the same."
),
-
GTOWN_SETTINGS_COMMAND_BLACKLISTING(
"global_town_settings.town_command_blacklisting",
"",
@@ -1097,14 +775,12 @@ public enum ConfigNodes {
"# Allows blocking commands inside towns through the town_blacklisted_commands setting.",
"# This boolean allows you to disable this feature altogether if you don't need it"
),
-
GTOWN_TOWN_BLACKLISTED_COMMANDS(
"global_town_settings.town_command_blacklisting.town_blacklisted_commands",
"somecommandhere,othercommandhere",
"",
"# Comma separated list of commands which cannot be run inside of any town."
),
-
GTOWN_TOWN_LIMITED_COMMANDS(
"global_town_settings.town_command_blacklisting.player_owned_plot_limited_commands",
"sethome,home",
@@ -1115,7 +791,6 @@ public enum ConfigNodes {
"# Players with the towny.claimed.owntown.* permission node (given to mayors/assistants usually,)",
"# will also not be limited by this command blacklist."
),
-
GTOWN_TOWN_TOURIST_BLOCKED_COMMANDS(
"global_town_settings.town_command_blacklisting.own_town_and_wilderness_limited_commands",
"sethome,home",
@@ -1125,7 +800,6 @@ public enum ConfigNodes {
"# Players with the towny.globally_welcome permission node are not going to be limited by this list.",
"# Commands have to be on town_command_blacklisting.town_blacklisted_commands, else this is not going to be checked."
),
-
GTOWN_TOWN_TOURIST_BLOCKED_COMMANDS_TRUSTED_BYPASS(
"global_town_settings.town_command_blacklisting.own_town_and_wilderness_limited_commands_allow_trusted_residents",
"true",
@@ -1134,7 +808,6 @@ public enum ConfigNodes {
"# as well as residents that are members of a town that is trusted,) will be able to use",
"# commands that only town residents could use."
),
-
GTOWN_TOWN_TOURIST_BLOCKED_COMMANDS_ALLIES_BYPASS(
"global_town_settings.town_command_blacklisting.own_town_and_wilderness_limited_commands_allow_allies",
"false",
@@ -1142,25 +815,21 @@ public enum ConfigNodes {
"# When set to true, residents which are allies of the town (which could be nation members as well as allied nations' members) will be able to use",
"# commands that only town residents could use."
),
-
GTOWN_SETTINGS_AUTOMATIC_CAPITALISATION(
"global_town_settings.automatic_capitalisation",
"false",
"",
"# When enabled, town (and nation) names will automatically be capitalised upon creation."
),
-
GTOWN_SETTINGS_ALLOW_NUMBERS_IN_TOWN_NAME(
"global_town_settings.allow_numbers_in_town_name",
"true",
"",
"# When disabled, towns will not be able to be created with or renamed to a name that contains numbers.",
"# Disabling this option does not affect already created towns."),
-
GTOWN_SETTINGS_ALLOWED_TOWN_COLORS(
"global_town_settings.allowed_map_colors",
"aqua:00ffff, azure:f0ffff, beige:f5f5dc, black:000000, blue:0000ff, brown:a52a2a, cyan:00ffff, darkblue:00008b, darkcyan:008b8b, darkgrey:a9a9a9, darkgreen:006400, darkkhaki:bdb76b, darkmagenta:8b008b, darkolivegreen:556b2f, darkorange:ff8c00, darkorchid:9932cc, darkred:8b0000, darksalmon:e9967a, darkviolet:9400d3, fuchsia:ff00ff, gold:ffd700, green:008000, indigo:4b0082, khaki:f0e68c, lightblue:add8e6, lightcyan:e0ffff, lightgreen:90ee90, lightgrey:d3d3d3, lightpink:ffb6c1, lightyellow:ffffe0, lime:00ff00, magenta:ff00ff, maroon:800000, navy:000080, olive:808000, orange:ffa500, pink:ffc0cb, purple:800080, violet:800080, red:ff0000, silver:c0c0c0, white:ffffff, yellow:ffff00",
-
"",
"# This setting determines the list of allowed town map colors.",
"# The color codes are in hex format."
@@ -1170,7 +839,8 @@ public enum ConfigNodes {
"assistant",
"",
"# List of ranks (separated by a comma) that will prevent a player from being kicked from a town."),
-
+
+
GNATION_SETTINGS(
"global_nation_settings",
"",
@@ -1229,52 +899,6 @@ public enum ConfigNodes {
"false",
"",
"# If true the capital city of nation cannot be neutral/peaceful."),
- GNATION_SETTINGS_CAPITAL_SPAWN(
- "global_nation_settings.capital_spawn",
- "true",
- "",
- "# If enabled, only allow the nation spawn to be set in the capital city."),
- GNATION_SETTINGS_ALLOW_NATION_SPAWN(
- "global_nation_settings.allow_nation_spawn",
- "true",
- "",
- "# Allow the use of /nation spawn",
- "# Valid values are: true, false, war, peace",
- "# When war or peace is set, it is only possible to teleport to the nation,",
- "# when there is a war or peace."),
- GNATION_SETTINGS_ALLOW_NATION_SPAWN_TRAVEL(
- "global_nation_settings.allow_nation_spawn_travel",
- "true",
- "",
- "# Allow regular residents to use /nation spawn [nation] (TP to other nations if they are public).",
- "# Valid values are: true, false, war, peace",
- "# When war or peace is set, it is only possible to teleport to the nation,",
- "# when there is a war or peace."),
- GNATION_SETTINGS_ALLOW_NATION_SPAWN_TRAVEL_ALLY(
- "global_nation_settings.allow_nation_spawn_travel_ally",
- "true",
- "",
- "# Allow regular residents to use /nation spawn [nation] to other nations allied with your nation.",
- "# Valid values are: true, false, war, peace",
- "# When war or peace is set, it is only possible to teleport to the nations,",
- "# when there is a war or peace."),
- GNATION_SETTINGS_COOLDOWN_ROOT(
- "global_nation_settings.spawning_cooldowns", "", ""),
- GNATION_SETTINGS_NATION_MEMBER_COOLDOWN_TIMER(
- "global_nation_settings.spawning_cooldowns.nation_member_nation_spawn_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player of the same nation can use /n spawn."),
- GNATION_SETTINGS_NATION_ALLY_COOLDOWN_TIMER(
- "global_nation_settings.spawning_cooldowns.nation_ally_nation_spawn_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player allied with the nation can use /n spawn."),
- GNATION_SETTINGS_NATION_UNAFFILIATED_COOLDOWN_TIMER(
- "global_nation_settings.spawning_cooldowns.unaffiliated_nation_spawn_cooldown_time",
- "30",
- "",
- "# Number of seconds that must pass before a player who is not a member or ally can use /n spawn."),
GNATION_SETTINGS_NATION_LEVEL_IS_DETERMINED_BY_TOWNS_COUNT(
"global_nation_settings.nation_level_is_determined_by_town_count_instead_of_resident_count",
"false",
@@ -1296,7 +920,6 @@ public enum ConfigNodes {
GNATION_SETTINGS_ALLOWED_NATION_COLORS(
"global_nation_settings.allowed_map_colors",
"aqua:00ffff, azure:f0ffff, beige:f5f5dc, black:000000, blue:0000ff, brown:a52a2a, cyan:00ffff, darkblue:00008b, darkcyan:008b8b, darkgrey:a9a9a9, darkgreen:006400, darkkhaki:bdb76b, darkmagenta:8b008b, darkolivegreen:556b2f, darkorange:ff8c00, darkorchid:9932cc, darkred:8b0000, darksalmon:e9967a, darkviolet:9400d3, fuchsia:ff00ff, gold:ffd700, green:008000, indigo:4b0082, khaki:f0e68c, lightblue:add8e6, lightcyan:e0ffff, lightgreen:90ee90, lightgrey:d3d3d3, lightpink:ffb6c1, lightyellow:ffffe0, lime:00ff00, magenta:ff00ff, maroon:800000, navy:000080, olive:808000, orange:ffa500, pink:ffc0cb, purple:800080, violet:800080, red:ff0000, silver:c0c0c0, white:ffffff, yellow:ffff00",
-
"",
"# This setting determines the list of allowed nation map colors.",
"# The color codes are in hex format."),
@@ -1336,7 +959,6 @@ public enum ConfigNodes {
"# This setting is only used when nation_proximity_to_capital_city is above 0.",
"# Leave this setting at 0.0 in order to allow nations to chain towns together to go as wide as they like."
),
-
GNATION_SETTINGS_ALLOW_NUMBERS_IN_NATION_NAME(
"global_nation_settings.allow_numbers_in_nation_name",
"true",
@@ -1344,6 +966,443 @@ public enum ConfigNodes {
"# When disabled, nations will not be able to be created with or renamed to a name that contains numbers.",
"# Disabling this option does not affect already created nations."),
+
+ CLAIMING(
+ "claiming",
+ "",
+ "",
+ "",
+ "############################################################",
+ "# +------------------------------------------------------+ #",
+ "# | Town Claiming Settings | #",
+ "# +------------------------------------------------------+ #",
+ "############################################################",
+ ""),
+ CLAIMING_TOWN_BLOCK_RATIO(
+ "claiming.town_block_ratio",
+ "8",
+ "",
+ "# The maximum townblocks available to a town is (numResidents * ratio).",
+ "# Setting this value to 0 will instead use the level based jump values determined in the town level config.",
+ "# Setting this to -1 will result in every town having unlimited claims."),
+ CLAIMING_TOWN_BLOCK_LIMIT(
+ "claiming.town_block_limit",
+ "0",
+ "",
+ "# The maximimum amount of townblocks a town can have, if town_block_ratio is 0 the max size will be decided by the town_levels.",
+ "# Set to 0 to have no size limit."),
+ CLAIMING_TOWN_BLOCK_SIZE(
+ "claiming.town_block_size",
+ "16",
+ "",
+ "# The size of the square grid cell. Changing this value is suggested only when you first install Towny.",
+ "# Doing so after entering data will shift things unwantedly. Using smaller value will allow higher precision,",
+ "# at the cost of more work setting up. Also, extremely small values will render the caching done useless.",
+ "# Each cell is (town_block_size * town_block_size * height-of-the-world) in size, with height-of-the-world",
+ "# being from the bottom to the top of the build-able world."),
+ CLAIMING_MIN_ADJACENT_BLOCKS(
+ "claiming.min_adjacent_blocks",
+ "-1",
+ "",
+ "# The minimum adjacent town blocks required to expand.",
+ "# This can prevent long lines and snake-like patterns.",
+ "# Set to -1 to disable. Set to 3 to force wider expansions of towns."),
+ CLAIMING_MAX_CLAIM_RADIUS_VALUE(
+ "claiming.max_claim_radius_value",
+ "4",
+ "",
+ "# maximum number used in /town claim/unclaim # commands.",
+ "# set to 0 to disable limiting of claim radius value check.",
+ "# keep in mind that the default value of 4 is a radius, ",
+ "# and it will allow claiming 9x9 (80 plots) at once."),
+
+ CLAIMING_BIOME_RULES("claiming.biome_rules","","",""),
+
+ CLAIMING_UNWANTED_BIOMES_ROOT("claiming.biome_rules.unwanted_biomes","","",
+ "# When a townblock is made up of too many blocks of these biomes, it will not be able to be claimed by a town."),
+ CLAIMING_BIOME_UNWANTED_BIOMES_ENABLED("claiming.biome_rules.unwanted_biomes.enabled",
+ "false",
+ "",
+ "# When true, unwanted biomes will be tested for when a player is claiming land."),
+ CLAIMING_BIOME_UNWANTED_BIOMES("claiming.biome_rules.unwanted_biomes.biomes",
+ "the_end,end_barrens,end_highlands,end_midlands,small_end_islands",
+ "",
+ "# A comma separated list of biome names that will add up towards a townblock's un-claim-ability.",
+ "# Use lower-case only or this will not work properly for you."),
+ CLAIMING_BIOME_UNWANTED_BIOMES_THRESHOLD("claiming.biome_rules.unwanted_biomes.threshold",
+ "55",
+ "",
+ "# The max amount of combined unwanted biomes as a percent, that will be allowed in plots being claimed by towns.",
+ "# For example, if a townblock would be more than X percent ocean it will not be able to be claimed."),
+
+ CLAIMING_BIOME_OCEAN_BLOCKING_ROOT("claiming.biome_rules.ocean_blocking","","",""),
+ CLAIMING_BIOME_BLOCK_OCEAN_CLAIMS("claiming.biome_rules.ocean_blocking.enabled",
+ "false",
+ "",
+ "# When true, any wilderness plot which has more Ocean biome in it than the allowed threshold (see below,)",
+ "# will not be able to be claimed."),
+ CLAIMING_BIOME_BLOCK_OCEAN_THRESHOLD("claiming.biome_rules.ocean_blocking.threshold",
+ "55",
+ "",
+ "# The max amount of combined ocean biomes as a percent, that will be allowed in plots being claimed by towns.",
+ "# For example, if a townblock would be more than X percent ocean it will not be able to be claimed."),
+
+ CLAIMING_DISTANCE_RULES("claiming.distance_rules","","",""),
+ CLAIMING_MIN_DISTANCE_IGNORED_FOR_NATIONS(
+ "claiming.distance_rules.min_distances_ignored_for_towns_in_same_nation",
+ "true",
+ "",
+ "# If true, the below settings: min_plot_distance_from_town_plot and min_distance_from_town_homeblock",
+ "# will be ignored for towns that are in the same nation. Setting to false will keep all towns separated the same."),
+ CLAIMING_MIN_DISTANCE_IGNORED_FOR_ALLIES(
+ "claiming.distance_rules.min_distances_ignored_for_towns_in_allied_nation",
+ "false",
+ "",
+ "# If true, the below settings: min_plot_distance_from_town_plot and min_distance_from_town_homeblock",
+ "# will be ignored for towns that are mutually allied. Setting to false will keep all towns separated the same."),
+ CLAIMING_MIN_PLOT_DISTANCE_FROM_TOWN_PLOT(
+ "claiming.distance_rules.min_plot_distance_from_town_plot",
+ "5",
+ "",
+ "# Minimum number of plots any towns plot must be from the next town's own plots.",
+ "# Put in other words: the buffer area around every claim that no other town can claim into.",
+ "# Does not affect towns which are in the same nation.",
+ "# This will prevent town encasement to a certain degree."),
+ CLAIMING_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK(
+ "claiming.distance_rules.min_distance_from_town_homeblock",
+ "5",
+ "",
+ "# Minimum number of plots any towns home plot must be from the next town.",
+ "# Put in other words: the buffer area around every homeblock that no other town can claim into.",
+ "# Does not affect towns which are in the same nation.",
+ "# This will prevent someone founding a town right on your doorstep"),
+ CLAIMING_MIN_DISTANCE_FOR_OUTPOST_FROM_PLOT(
+ "claiming.distance_rules.min_distance_for_outpost_from_plot",
+ "5",
+ "",
+ "# Minimum number of plots an outpost must be from any other town's plots.",
+ "# Useful when min_plot_distance_from_town_plot is set to near-zero to allow towns to have claims",
+ "# near to each other, but want to keep outposts away from towns."),
+ CLAIMING_MAX_DISTANCE_FOR_OUTPOST_FROM_TOWN_PLOT(
+ "claiming.distance_rules.max_distance_for_outpost_from_town_plot",
+ "0",
+ "",
+ "# Set to 0 to disable. When above 0 an outpost may only be claimed within the given number of townblocks from a townblock owned by the town.",
+ "# Setting this to any value above 0 will stop outposts being made off-world from the town's homeworld.",
+ "# Do not set lower than min_distance_for_outpost_from_plot above."),
+ CLAIMING_MIN_DISTANCE_BETWEEN_HOMEBLOCKS(
+ "claiming.distance_rules.min_distance_between_homeblocks",
+ "0",
+ "",
+ "# Minimum distance between homeblocks."),
+ CLAIMING_MAX_DISTANCE_BETWEEN_HOMEBLOCKS(
+ "claiming.distance_rules.max_distance_between_homeblocks",
+ "0",
+ "",
+ "# Maximum distance between homeblocks.",
+ "# This will force players to build close together."),
+ CLAIMING_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_PLOT(
+ "claiming.distance_rules.new_town_min_distance_from_town_plot",
+ "-1",
+ "",
+ "# The minimum distance that a new town must be from nearby towns' plots.",
+ "# When set to -1, this will use the value of the min_plot_distance_from_town_plot option."),
+ CLAIMING_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK(
+ "claiming.distance_rules.new_town_min_distance_from_town_homeblock",
+ "-1",
+ "",
+ "# The minimum distance that a new town must be from nearby towns' homeblocks.",
+ "# When set to -1, this will use the value of the min_distance_from_town_homeblock setting."),
+
+ CLAIMING_OUTPOSTS("claiming.outposts","","",""),
+ CLAIMING_ALLOW_OUTPOSTS(
+ "claiming.outposts.allow_outposts",
+ "true",
+ "",
+ "# Allow towns to claim outposts (a townblock not connected to town)."),
+ CLAIMING_LIMIT_OUTPOST_USING_LEVELS(
+ "claiming.outposts.limit_outposts_using_town_and_nation_levels",
+ "false",
+ "",
+ "# When set to true outposts can be limited by the townOutpostLimit value of the Town Levels and",
+ "# the nationBonusOutpostLimit value in the Nation Levels. In this way nations can be made to be",
+ "# the only way of receiving outposts, or as an incentive to receive more outposts. Towns which are",
+ "# larger can have more outposts.",
+ "# When activated, this setting will not cause towns who already have higher than their limit",
+ "# to lose outposts. They will not be able to start new outposts until they have unclaimed outposts",
+ "# to become under their limit. Likewise, towns that join a nation and receive bonus outposts will",
+ "# be over their limit if they leave the nation."),
+ CLAIMING_OVER_OUTPOST_LIMIT_STOP_TELEPORT(
+ "claiming.outposts.over_outpost_limits_stops_teleports",
+ "false",
+ "",
+ "# When limit_outposts_using_town_and_nation_levels is also true, towns which are over their outpost",
+ "# limit will not be able to use their /town outpost teleports for the outpost #'s higher than their limit,",
+ "# until they have dropped below their limit.",
+ "# eg: If their limit is 3 then they cannot use /t outpost 4"),
+ CLAIMING_MINIMUM_AMOUNT_RESIDENTS_FOR_OUTPOSTS(
+ "claiming.outposts.minimum_amount_of_residents_in_town_for_outpost",
+ "0",
+ "",
+ "# The amount of residents a town needs to claim an outpost,",
+ "# Setting this value to 0, means a town can claim outposts no matter how many residents"),
+
+ CLAIMING_OVERCLAIMING_ROOT("claiming.overclaiming", "", "", ""),
+ CLAIMING_OVER_ALLOWED_CLAIM_LIMITS_ALLOWS_STEALING_LAND(
+ "claiming.overclaiming.being_overclaimed_allows_other_towns_to_steal_land",
+ "false",
+ "",
+ "# A feature that allows towns which have too many townblocks claimed (overclaimed) ie: 120/100 TownBlocks, ",
+ "# to have their land stolen by other towns which are not overclaimed. Using this incentivises Towns to keep",
+ "# their residents from leaving, and will mean that mayors will be more careful about which land they choose",
+ "# to claim.",
+ "# Overclaiming does not allow a town to be split into two separate parts, requiring the Town that is stealing",
+ "# land to work from the outside inwards.",
+ "# It is highly recommended to only use this on servers where outposts are disabled, and requiring ",
+ "# a number of adjacent claims over 1 is enabled.",
+ "# Towns take land using /t takeoverclaim."),
+ CLAIMING_OVERCLAIMING_PREVENTED_BY_HOMEBLOCK_RADIUS(
+ "claiming.overclaiming.overclaiming_prevented_by_homeblock_radius",
+ "true",
+ "",
+ "# While true, overclaiming is stopped by the min_distance_from_town_homeblock setting below.",
+ "# This prevents a town from having townblocks stolen surrounding their homeblocks."),
+ CLAIMING_OVERCLAIMING_TOWN_AGE_REQUIREMENT(
+ "claiming.overclaiming.town_age_requirement",
+ "7d",
+ "",
+ "# When in use, requires that a town be of a minimum age in order to overclaim another town. This prevents new towns being made just to overclaim someone.",
+ "# Default is for 7 days."),
+ CLAIMING_OVERCLAIMING_COMMAND_COOLDOWN(
+ "claiming.overclaiming.command_cooldown",
+ "0m",
+ "",
+ "# When in use, requires an amount of time to pass before the /t takeoverclaim command can be used again."),
+
+ CLAIMING_BUY_BONUS_ROOT("claiming.purchased_bonus_blocks", "", "", ""),
+ CLAIMING_MAX_PURCHASED_BLOCKS(
+ "claiming.purchased_bonus_blocks.max_purchased_blocks",
+ "0",
+ "",
+ "# Limits the maximum amount of bonus blocks a town can buy.",
+ "# This setting does nothing when town.max_purchased_blocks_uses_town_levels is set to true."),
+ CLAIMING_MAX_PURCHASED_BLOCKS_USES_TOWN_LEVELS(
+ "claiming.purchased_bonus_blocks.max_purchased_blocks_uses_town_levels",
+ "true",
+ "",
+ "# When set to true, the town_level section of the config determines the maximum number of bonus blocks a town can purchase."),
+
+
+ SPAWNING(
+ "spawning",
+ "",
+ "",
+ "",
+ "############################################################",
+ "# +------------------------------------------------------+ #",
+ "# | Spawning Settings | #",
+ "# +------------------------------------------------------+ #",
+ "############################################################",
+ ""),
+ SPAWNING_COST_SPAWN_WARNINGS(
+ "spawning.spawn_cost_warnings",
+ "true",
+ "",
+ "# Decides whether confirmations should appear if you spawn to an area with an associated cost."),
+ SPAWNING_VISUALIZED_SPAWN_POINTS_ENABLED(
+ "spawning.visualized_spawn_points_enabled",
+ "true",
+ "",
+ "# If enabled, particles will appear around town, nation, outpost & jail spawns."),
+
+ SPAWNING_WARMUP_ROOT("spawning.spawning_warmups","",""),
+ SPAWNING_WARMUP_TIMER(
+ "spawning.spawning_warmups.teleport_warmup_time",
+ "0",
+ "",
+ "# If non zero it delays any spawn request by x seconds."),
+ SPAWNING_MOVEMENT_CANCELS_SPAWN_WARMUP(
+ "spawning.spawning_warmups.movement_cancels_spawn_warmup",
+ "false",
+ "",
+ "# When set to true, if players are currently in a spawn warmup, moving will cancel their spawn."),
+ SPAWNING_DAMAGE_CANCELS_SPAWN_WARMUP(
+ "spawning.spawning_warmups.damage_cancels_spawn_warmup",
+ "false",
+ "",
+ "# When set to true, if players are damaged in any way while in a spawn warmup, their spawning will be cancelled."),
+
+ SPAWNING_TOWN_SPAWN_ROOT("spawning.town_spawn","",""),
+ SPAWNING_ALLOW_TOWN_SPAWN(
+ "spawning.town_spawn.allow_town_spawn",
+ "true",
+ "",
+ "# Allow the use of /town spawn",
+ "# Valid values are: true, false, war, peace",
+ "# When war or peace is set, it is only possible to teleport to the town,",
+ "# when there is a war or peace."),
+ SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL(
+ "spawning.town_spawn.allow_town_spawn_travel",
+ "true",
+ "",
+ "# Allow regular residents to use /town spawn [town] (TP to other towns if they are public).",
+ "# Valid values are: true, false, war, peace",
+ "# When war or peace is set, it is only possible to teleport to the town,",
+ "# when there is a war or peace."),
+ SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL_NATION(
+ "spawning.town_spawn.allow_town_spawn_travel_nation",
+ "true",
+ "",
+ "# Allow regular residents to use /town spawn [town] to other towns in your nation.",
+ "# Valid values are: true, false, war, peace",
+ "# When war or peace is set, it is only possible to teleport to the town,",
+ "# when there is a war or peace."),
+ SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL_ALLY(
+ "spawning.town_spawn.allow_town_spawn_travel_ally",
+ "true",
+ "",
+ "# Allow regular residents to use /town spawn [town] to other towns in a nation allied with your nation.",
+ "# Valid values are: true, false, war, peace",
+ "# When war or peace is set, it is only possible to teleport to the town,",
+ "# when there is a war or peace."),
+ SPAWNING_IS_ALLY_TOWN_SPAWNING_REQUIRING_PUBLIC_STATUS(
+ "spawning.town_spawn.is_nation_ally_spawning_to_town_requiring_public_status",
+ "false",
+ "",
+ "# When set to true both nation and ally spawn travel will also require the target town to have their status set to public."),
+ SPAWNING_SETTINGS_IS_TRUSTED_RESIDENTS_COUNT_AS_RESIDENTS(
+ "spawning.town_spawn.do_trusted_residents_count_as_residents",
+ "false",
+ "",
+ "# When set to true, a player that is trusted by a town is allowed to spawn to the town as if they were a resident.",
+ "# Allows allows the residents of entire an town when that town is trusted by the town."),
+ SPAWNING_IS_NEW_RESIDENT_PROMPTED_TO_SPAWN(
+ "spawning.town_spawn.are_new_residents_prompted_to_town_spawn",
+ "false",
+ "",
+ "# When a resident joins a town, should they be prompted to use spawn to the town?",
+ "# This requires them to not already be standing in the town, and also to be able to use /t spawn and whatever costs may be associated with it."),
+ SPAWNING_PREVENT_TOWN_SPAWN_IN(
+ "spawning.town_spawn.prevent_town_spawn_in",
+ "enemy,outlaw",
+ "",
+ "# Prevent players from using /town spawn while within unclaimed areas and/or enemy/neutral towns.",
+ "# Allowed options: unclaimed,enemy,neutral,outlaw"),
+ SPAWNING_ENEMIES_ALLOWED_TO_SPAWN_TO_PEACEFUL_TOWNS(
+ "spawning.town_spawn.allow_enemies_spawn_to_peaceful_towns",
+ "false",
+ "",
+ "# When true, players will be allowed to spawn to peaceful/neutral towns in which they are considered enemies.",
+ "# Setting this to true will make town spawn points unsafe for private towns which are part of nations with enemies."),
+
+ SPAWNING_TOWN_SPAWN_COOLDOWN_ROOT(
+ "spawning.town_spawn.spawning_cooldowns", "", ""),
+ SPAWNING_TOWN_SPAWN_COOLDOWN_TIMER(
+ "spawning.town_spawn.spawning_cooldowns.town_spawn_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player can use /t spawn or /res spawn."),
+ SPAWNING_TOWN_SPAWN_OUTPOST_COOLDOWN_TIMER(
+ "spawning.town_spawn.spawning_cooldowns.outpost_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player can use /t outpost."),
+ SPAWNING_TOWN_SPAWN_NATION_MEMBER_COOLDOWN_TIMER(
+ "spawning.town_spawn.spawning_cooldowns.nation_member_town_spawn_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player of the same nation can use /t spawn."),
+ SPAWNING_TOWN_SPAWN_NATION_ALLY_COOLDOWN_TIMER(
+ "spawning.town_spawn.spawning_cooldowns.nation_ally_town_spawn_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player in an allied nation can use /t spawn."),
+ SPAWNING_TOWN_SPAWN_UNAFFILIATED_COOLDOWN_TIMER(
+ "spawning.town_spawn.spawning_cooldowns.unaffiliated_town_spawn_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player who is not a member or ally of town can use /t spawn."),
+
+ SPAWNING_NATION_SPAWN_ROOT("spawning.nation_spawn","",""),
+ SPAWNING_FORCE_NATION_SPAWN_IN_CAPITAL(
+ "spawning.nation_spawn.force_nation_spawn_in_capital",
+ "true",
+ "",
+ "# If enabled, only allow the nation spawn to be set in the capital city."),
+ SPAWNING_ALLOW_NATION_SPAWN(
+ "spawning.nation_spawn.allow_nation_spawn",
+ "true",
+ "",
+ "# Allow the use of /nation spawn",
+ "# Valid values are: true, false, war, peace",
+ "# When war or peace is set, it is only possible to teleport to the nation,",
+ "# when there is a war or peace."),
+ SPAWNING_ALLOW_NATION_SPAWN_TRAVEL(
+ "spawning.nation_spawn.allow_nation_spawn_travel",
+ "true",
+ "",
+ "# Allow regular residents to use /nation spawn [nation] (TP to other nations if they are public).",
+ "# Valid values are: true, false, war, peace",
+ "# When war or peace is set, it is only possible to teleport to the nation,",
+ "# when there is a war or peace."),
+ SPAWNING_ALLOW_NATION_SPAWN_TRAVEL_ALLY(
+ "spawning.nation_spawn.allow_nation_spawn_travel_ally",
+ "true",
+ "",
+ "# Allow regular residents to use /nation spawn [nation] to other nations allied with your nation.",
+ "# Valid values are: true, false, war, peace",
+ "# When war or peace is set, it is only possible to teleport to the nations,",
+ "# when there is a war or peace."),
+
+ SPAWNING_NATION_SPAWN_COOLDOWN_ROOT(
+ "spawning.nation_spawn.spawning_cooldowns", "", ""),
+ SPAWNING_NATION_SPAWN_NATION_MEMBER_COOLDOWN_TIMER(
+ "spawning.nation_spawn.spawning_cooldowns.nation_member_nation_spawn_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player of the same nation can use /n spawn."),
+ SPAWNING_NATION_SPAWN_NATION_ALLY_COOLDOWN_TIMER(
+ "spawning.nation_spawn.spawning_cooldowns.nation_ally_nation_spawn_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player allied with the nation can use /n spawn."),
+ SPAWNING_NATION_SPAWN_NATION_UNAFFILIATED_COOLDOWN_TIMER(
+ "spawning.nation_spawn.spawning_cooldowns.unaffiliated_nation_spawn_cooldown_time",
+ "30",
+ "",
+ "# Number of seconds that must pass before a player who is not a member or ally can use /n spawn."),
+
+ SPAWNING_RESPAWN_ROOT("spawning.respawning","",""),
+ SPAWNING_TOWN_RESPAWN(
+ "spawning.respawning.town_respawn",
+ "false",
+ "",
+ "# When true Towny will handle respawning, with town or resident spawns."),
+ SPAWNING_TOWN_RESPAWN_SAME_WORLD_ONLY(
+ "spawning.respawning.town_respawn_same_world_only",
+ "false",
+ "",
+ "# Town respawn only happens when the player dies in the same world as the town's spawn point."),
+ SPAWNING_RESPAWN_ANCHOR_HIGHER_PRECEDENCE(
+ "spawning.respawning.respawn_anchor_higher_precendence",
+ "true",
+ "",
+ "# When this is true, players will respawn to respawn anchors on death rather than their own town."),
+
+ SPAWNING_RESPAWN_PROTECTION_ROOT("spawning.respawning.respawn_protection", "", ""),
+ SPAWNING_RESPAWN_PROTECTION_TIME(
+ "spawning.respawning.respawn_protection.time",
+ "10s",
+ "",
+ "# When greater than 0s, the amount of time a player who has respawned is considered invulnerable.",
+ "# Invulnerable players who attack other players will lose their invulnerability.",
+ "# Invulnerable players who teleport after respawn will also lose their invulnerability."),
+ SPAWNING_RESPAWN_PROTECTION_ALLOW_PICKUP(
+ "spawning.respawning.respawn_protection.allow_pickup",
+ "true",
+ "",
+ "# If disabled, players will not be able to pickup items while under respawn protection."),
+
PLUGIN(
"plugin",
"",
@@ -1459,6 +1518,7 @@ public enum ConfigNodes {
PLUGIN_HOUR_INTERVAL(
"plugin.hour_timer.hour_interval",
"60m",
+ "",
"# The number of minutes in each \"day\".",
"# Default is 60m."),
PLUGIN_NEWHOUR_TIME(
@@ -1499,12 +1559,6 @@ public enum ConfigNodes {
"",
"# Sets the default size that /towny top commands display."
),
- PLUGIN_VISUALIZED_SPAWN_POINTS_ENABLED(
- "plugin.visualized_spawn_points_enabled",
- "true",
- "",
- "# If enabled, particles will appear around town, nation, outpost & jail spawns."
- ),
PLUGIN_NAME_BLACKLIST(
"plugin.name_blacklist",
"",
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 f29694bc4a..c1c25c71a1 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java
@@ -1257,7 +1257,7 @@ public static int getMaxTownBlocks(Town town) {
n += getNationBonusBlocks(town);
- int ratioSizeLimit = getInt(ConfigNodes.TOWN_TOWN_BLOCK_LIMIT);
+ int ratioSizeLimit = getInt(ConfigNodes.CLAIMING_TOWN_BLOCK_LIMIT);
if (ratio != 0 && ratioSizeLimit > 0)
n = Math.min(ratioSizeLimit, n);
@@ -1335,12 +1335,12 @@ public static boolean areTownBlocksUnlimited() {
public static int getTownBlockRatio() {
- return getInt(ConfigNodes.TOWN_TOWN_BLOCK_RATIO);
+ return getInt(ConfigNodes.CLAIMING_TOWN_BLOCK_RATIO);
}
public static int getTownBlockSize() {
- return getInt(ConfigNodes.TOWN_TOWN_BLOCK_SIZE);
+ return getInt(ConfigNodes.CLAIMING_TOWN_BLOCK_SIZE);
}
public static boolean isFriendlyFireEnabled() {
@@ -1607,14 +1607,14 @@ public static boolean hasTownLimit() {
public static int getTownLimit() {
- return getInt(ConfigNodes.TOWN_LIMIT);
+ return getInt(ConfigNodes.GTOWN_SETTINGS_LIMIT);
}
public static int getMaxPurchasedBlocks(Town town, int residents) {
if (isBonusBlocksPerTownLevel())
return getMaxBonusBlocks(town, residents);
else
- return getInt(ConfigNodes.TOWN_MAX_PURCHASED_BLOCKS);
+ return getInt(ConfigNodes.CLAIMING_MAX_PURCHASED_BLOCKS);
}
public static int getMaxPurchasedBlocks(Town town) {
@@ -1622,33 +1622,53 @@ public static int getMaxPurchasedBlocks(Town town) {
if (isBonusBlocksPerTownLevel())
return getMaxBonusBlocks(town);
else
- return getInt(ConfigNodes.TOWN_MAX_PURCHASED_BLOCKS);
+ return getInt(ConfigNodes.CLAIMING_MAX_PURCHASED_BLOCKS);
}
public static int getMaxPurchasedBlocksNode() {
- return getInt(ConfigNodes.TOWN_MAX_PURCHASED_BLOCKS);
+ return getInt(ConfigNodes.CLAIMING_MAX_PURCHASED_BLOCKS);
}
public static int getMaxClaimRadiusValue() {
- return getInt(ConfigNodes.TOWN_MAX_CLAIM_RADIUS_VALUE);
+ return getInt(ConfigNodes.CLAIMING_MAX_CLAIM_RADIUS_VALUE);
+ }
+
+ public static boolean isUnwantedBiomeClaimingEnabled() {
+ return getBoolean(ConfigNodes.CLAIMING_BIOME_UNWANTED_BIOMES_ENABLED);
+ }
+
+ public static double getUnwantedBiomeThreshold() {
+ return getDouble(ConfigNodes.CLAIMING_BIOME_UNWANTED_BIOMES_THRESHOLD) / 100;
+ }
+
+ public static List getUnwantedBiomeNames() {
+ return getStrArr(ConfigNodes.CLAIMING_BIOME_UNWANTED_BIOMES);
+ }
+
+ public static boolean isOceanClaimingBlocked() {
+ return getBoolean(ConfigNodes.CLAIMING_BIOME_BLOCK_OCEAN_CLAIMS);
+ }
+
+ public static double getOceanBlockThreshold() {
+ return getDouble(ConfigNodes.CLAIMING_BIOME_BLOCK_OCEAN_THRESHOLD) / 100;
}
public static boolean isOverClaimingAllowingStolenLand() {
- return getBoolean(ConfigNodes.TOWN_OVER_ALLOWED_CLAIM_LIMITS_ALLOWS_STEALING_LAND);
+ return getBoolean(ConfigNodes.CLAIMING_OVER_ALLOWED_CLAIM_LIMITS_ALLOWS_STEALING_LAND);
}
public static boolean isOverClaimingPreventedByHomeBlockRadius() {
- return getBoolean(ConfigNodes.TOWN_OVERCLAIMING_PREVENTED_BY_HOMEBLOCK_RADIUS);
+ return getBoolean(ConfigNodes.CLAIMING_OVERCLAIMING_PREVENTED_BY_HOMEBLOCK_RADIUS);
}
public static long getOverclaimingTownAgeRequirement() {
- return getMillis(ConfigNodes.TOWN_OVERCLAIMING_TOWN_AGE_REQUIREMENT);
+ return getMillis(ConfigNodes.CLAIMING_OVERCLAIMING_TOWN_AGE_REQUIREMENT);
}
public static int getOverclaimingCommandCooldownInSeconds() {
- return (int) getSeconds(ConfigNodes.TOWN_OVERCLAIMING_COMMAND_COOLDOWN);
+ return (int) getSeconds(ConfigNodes.CLAIMING_OVERCLAIMING_COMMAND_COOLDOWN);
}
public static boolean isSellingBonusBlocks(Town town) {
@@ -1658,7 +1678,7 @@ public static boolean isSellingBonusBlocks(Town town) {
public static boolean isBonusBlocksPerTownLevel() {
- return getBoolean(ConfigNodes.TOWN_MAX_PURCHASED_BLOCKS_USES_TOWN_LEVELS);
+ return getBoolean(ConfigNodes.CLAIMING_MAX_PURCHASED_BLOCKS_USES_TOWN_LEVELS);
}
public static double getPurchasedBonusBlocksCost() {
@@ -1711,17 +1731,17 @@ public static boolean isTownNeutralityCostMultipliedByTownClaimsSize() {
public static boolean isAllowingOutposts() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_ALLOW_OUTPOSTS);
+ return getBoolean(ConfigNodes.CLAIMING_ALLOW_OUTPOSTS);
}
public static boolean isOutpostsLimitedByLevels() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_LIMIT_OUTPOST_USING_LEVELS);
+ return getBoolean(ConfigNodes.CLAIMING_LIMIT_OUTPOST_USING_LEVELS);
}
public static boolean isOutpostLimitStoppingTeleports() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_OVER_OUTPOST_LIMIT_STOP_TELEPORT);
+ return getBoolean(ConfigNodes.CLAIMING_OVER_OUTPOST_LIMIT_STOP_TELEPORT);
}
public static double getOutpostCost() {
@@ -1880,34 +1900,34 @@ public static long getNewHourTime() {
public static SpawnLevel isAllowingTownSpawn() {
- return getSpawnLevel(ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN);
+ return getSpawnLevel(ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN);
}
public static SpawnLevel isAllowingPublicTownSpawnTravel() {
- return getSpawnLevel(ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL);
+ return getSpawnLevel(ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL);
}
public static boolean isConfigAllowingPublicTownSpawnTravel() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL);
+ return getBoolean(ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL);
}
public static boolean isConfigAllowingPublicNationSpawnTravel() {
- return getBoolean(ConfigNodes.GNATION_SETTINGS_ALLOW_NATION_SPAWN_TRAVEL);
+ return getBoolean(ConfigNodes.SPAWNING_ALLOW_NATION_SPAWN_TRAVEL);
}
public static List getDisallowedTownSpawnZones() {
- return getStrArr(ConfigNodes.GTOWN_SETTINGS_PREVENT_TOWN_SPAWN_IN);
+ return getStrArr(ConfigNodes.SPAWNING_PREVENT_TOWN_SPAWN_IN);
}
public static boolean areEnemiesAllowedToSpawnToPeacefulTowns() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_ENEMIES_ALLOWED_TO_SPAWN_TO_PEACEFUL_TOWNS);
+ return getBoolean(ConfigNodes.SPAWNING_ENEMIES_ALLOWED_TO_SPAWN_TO_PEACEFUL_TOWNS);
}
public static boolean isSpawnWarnConfirmationUsed() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_SPAWN_WARNINGS);
+ return getBoolean(ConfigNodes.SPAWNING_COST_SPAWN_WARNINGS);
}
public static boolean isTaxingDaily() {
@@ -2444,16 +2464,16 @@ public static Collection getRevertOnUnclaimWhitelistMaterials() {
public static boolean isTownRespawning() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_TOWN_RESPAWN);
+ return getBoolean(ConfigNodes.SPAWNING_TOWN_RESPAWN);
}
public static boolean isTownRespawningInOtherWorlds() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_TOWN_RESPAWN_SAME_WORLD_ONLY);
+ return getBoolean(ConfigNodes.SPAWNING_TOWN_RESPAWN_SAME_WORLD_ONLY);
}
public static boolean isRespawnAnchorHigherPrecedence() {
- return getBoolean(ConfigNodes.GTOWN_RESPAWN_ANCHOR_HIGHER_PRECEDENCE);
+ return getBoolean(ConfigNodes.SPAWNING_RESPAWN_ANCHOR_HIGHER_PRECEDENCE);
}
public static int getHomeBlockMovementCooldownHours() {
@@ -2507,25 +2527,25 @@ public static void setLastRunVersion(String currentVersion) {
public static int getMinDistanceFromTownHomeblocks() {
- return getInt(ConfigNodes.TOWN_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK);
+ return getInt(ConfigNodes.CLAIMING_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK);
}
public static int getMinDistanceForOutpostsFromPlot() {
- return getInt(ConfigNodes.TOWN_MIN_DISTANCE_FOR_OUTPOST_FROM_PLOT);
+ return getInt(ConfigNodes.CLAIMING_MIN_DISTANCE_FOR_OUTPOST_FROM_PLOT);
}
public static int getMaxDistanceForOutpostsFromTown() {
- return getInt(ConfigNodes.TOWN_MAX_DISTANCE_FOR_OUTPOST_FROM_TOWN_PLOT);
+ return getInt(ConfigNodes.CLAIMING_MAX_DISTANCE_FOR_OUTPOST_FROM_TOWN_PLOT);
}
public static int getMinDistanceFromTownPlotblocks() {
- return getInt(ConfigNodes.TOWN_MIN_PLOT_DISTANCE_FROM_TOWN_PLOT);
+ return getInt(ConfigNodes.CLAIMING_MIN_PLOT_DISTANCE_FROM_TOWN_PLOT);
}
public static int getMaxDistanceForTownMerge() {
- return getInt(ConfigNodes.TOWN_MAX_DISTANCE_FOR_MERGE);
+ return getInt(ConfigNodes.GTOWN_SETTINGS_MAX_DISTANCE_FOR_MERGE);
}
public static int getBaseCostForTownMerge() {
@@ -2538,27 +2558,27 @@ public static int getPercentageCostPerPlot() {
public static boolean isMinDistanceIgnoringTownsInSameNation() {
- return getBoolean(ConfigNodes.TOWN_MIN_DISTANCE_IGNORED_FOR_NATIONS);
+ return getBoolean(ConfigNodes.CLAIMING_MIN_DISTANCE_IGNORED_FOR_NATIONS);
}
public static boolean isMinDistanceIgnoringTownsInAlliedNation() {
- return getBoolean(ConfigNodes.TOWN_MIN_DISTANCE_IGNORED_FOR_ALLIES);
+ return getBoolean(ConfigNodes.CLAIMING_MIN_DISTANCE_IGNORED_FOR_ALLIES);
}
public static int getMinDistanceBetweenHomeblocks() {
- return getInt(ConfigNodes.TOWN_MIN_DISTANCE_BETWEEN_HOMEBLOCKS);
+ return getInt(ConfigNodes.CLAIMING_MIN_DISTANCE_BETWEEN_HOMEBLOCKS);
}
public static int getMaxDistanceBetweenHomeblocks() {
- return getInt(ConfigNodes.TOWN_MAX_DISTANCE_BETWEEN_HOMEBLOCKS);
+ return getInt(ConfigNodes.CLAIMING_MAX_DISTANCE_BETWEEN_HOMEBLOCKS);
}
public static int getMaxResidentPlots(Resident resident) {
int maxPlots = TownyUniverse.getInstance().getPermissionSource().getGroupPermissionIntNode(resident.getName(), PermissionNodes.TOWNY_MAX_PLOTS.getNode());
if (maxPlots == -1)
- maxPlots = getInt(ConfigNodes.TOWN_MAX_PLOTS_PER_RESIDENT);
+ maxPlots = getInt(ConfigNodes.GTOWN_SETTINGS_MAX_PLOTS_PER_RESIDENT);
return maxPlots;
}
@@ -2918,22 +2938,22 @@ public static String getNameRemoveRegex() {
public static int getTeleportWarmupTime() {
- return getInt(ConfigNodes.GTOWN_SETTINGS_SPAWN_TIMER);
+ return getInt(ConfigNodes.SPAWNING_WARMUP_TIMER);
}
public static boolean isMovementCancellingSpawnWarmup() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_MOVEMENT_CANCELS_SPAWN_WARMUP);
+ return getBoolean(ConfigNodes.SPAWNING_MOVEMENT_CANCELS_SPAWN_WARMUP);
}
public static boolean isDamageCancellingSpawnWarmup() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_DAMAGE_CANCELS_SPAWN_WARMUP);
+ return getBoolean(ConfigNodes.SPAWNING_DAMAGE_CANCELS_SPAWN_WARMUP);
}
public static int getSpawnCooldownTime() {
- return getInt(ConfigNodes.GTOWN_SETTINGS_SPAWN_COOLDOWN_TIMER);
+ return getInt(ConfigNodes.SPAWNING_TOWN_SPAWN_COOLDOWN_TIMER);
}
public static int getPVPCoolDownTime() {
@@ -3104,7 +3124,7 @@ public static boolean isNotificationUsingTitles() {
}
public static int getAmountOfResidentsForOutpost() {
- return getInt(ConfigNodes.GTOWN_SETTINGS_MINIMUM_AMOUNT_RESIDENTS_FOR_OUTPOSTS);
+ return getInt(ConfigNodes.CLAIMING_MINIMUM_AMOUNT_RESIDENTS_FOR_OUTPOSTS);
}
public static int getMaximumInvitesSentTown() {
@@ -3148,7 +3168,7 @@ public static int getNationZonesCapitalBonusSize() {
}
public static boolean isNationSpawnOnlyAllowedInCapital() {
- return getBoolean(ConfigNodes.GNATION_SETTINGS_CAPITAL_SPAWN);
+ return getBoolean(ConfigNodes.SPAWNING_FORCE_NATION_SPAWN_IN_CAPITAL);
}
public static int getMaxTownsPerNation() {
@@ -3168,15 +3188,15 @@ public static boolean isPublicSpawnCostAffectedByTownSpawncost() {
}
public static boolean isAllySpawningRequiringPublicStatus() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_IS_ALLY_SPAWNING_REQUIRING_PUBLIC_STATUS);
+ return getBoolean(ConfigNodes.SPAWNING_IS_ALLY_TOWN_SPAWNING_REQUIRING_PUBLIC_STATUS);
}
public static boolean trustedResidentsGetToSpawnToTown() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_IS_TRUSTED_RESIDENTS_COUNT_AS_RESIDENTS);
+ return getBoolean(ConfigNodes.SPAWNING_SETTINGS_IS_TRUSTED_RESIDENTS_COUNT_AS_RESIDENTS);
}
public static boolean isPromptingNewResidentsToTownSpawn() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_IS_NEW_RESIDENT_PROMPTED_TO_SPAWN);
+ return getBoolean(ConfigNodes.SPAWNING_IS_NEW_RESIDENT_PROMPTED_TO_SPAWN);
}
public static String getNotificationTitlesTownTitle() {
@@ -3451,7 +3471,7 @@ public static List getWarBlacklistedCommands() {
}
public static boolean getVisualizedSpawnPointsEnabled() {
- return getBoolean(ConfigNodes.PLUGIN_VISUALIZED_SPAWN_POINTS_ENABLED);
+ return getBoolean(ConfigNodes.SPAWNING_VISUALIZED_SPAWN_POINTS_ENABLED);
}
public static List getBlacklistedNames() {
@@ -3563,7 +3583,7 @@ public static void saveConfig() {
}
public static long getSpawnProtectionDuration() {
- return TimeTools.getTicks(getString(ConfigNodes.GTOWN_SETTINGS_RESPAWN_PROTECTION_TIME));
+ return TimeTools.getTicks(getString(ConfigNodes.SPAWNING_RESPAWN_PROTECTION_TIME));
}
public static boolean isUsingWebMapStatusScreens() {
@@ -3620,7 +3640,7 @@ public static boolean isContextEnabled(String id) {
}
public static boolean getRespawnProtectionAllowPickup() {
- return getBoolean(ConfigNodes.GTOWN_SETTINGS_RESPAWN_PROTECTION_ALLOW_PICKUP);
+ return getBoolean(ConfigNodes.SPAWNING_RESPAWN_PROTECTION_ALLOW_PICKUP);
}
public static String getNotificationsAppearAs() {
@@ -3707,15 +3727,15 @@ public static float getBossBarNotificationProgress() {
}
public static int getNewTownMinDistanceFromTownPlots() {
- return getInt(ConfigNodes.TOWN_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_PLOT);
+ return getInt(ConfigNodes.CLAIMING_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_PLOT);
}
public static int getNewTownMinDistanceFromTownHomeblocks() {
- return getInt(ConfigNodes.TOWN_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK);
+ return getInt(ConfigNodes.CLAIMING_NEW_TOWN_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK);
}
public static int getMinAdjacentBlocks() {
- return Math.min(3, getInt(ConfigNodes.TOWN_MIN_ADJACENT_BLOCKS));
+ return Math.min(3, getInt(ConfigNodes.CLAIMING_MIN_ADJACENT_BLOCKS));
}
public static boolean isDeletingOldResidentsRemovingTownOnly() {
@@ -3739,7 +3759,7 @@ public static String getDefaultResidentAbout() {
}
public static double maxBuyTownPrice() {
- return getDouble(ConfigNodes.TOWN_MAX_BUYTOWN_PRICE);
+ return getDouble(ConfigNodes.GTOWN_SETTINGS_MAX_BUYTOWN_PRICE);
}
}
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 1b520657dc..b09f561abc 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyUniverse.java
@@ -92,7 +92,8 @@ public class TownyUniverse {
private final Map wildernessMapDataMap = new ConcurrentHashMap();
private final String rootFolder;
- private TownyDataSource dataSource;
+ private TownyDataSource loadDataSource;
+ private TownyDataSource saveDataSource;
private TownyPermissionSource permissionSource;
private TownyUniverse() {
@@ -141,21 +142,17 @@ public void clearAllObjects() {
* @param loadDbType - load setting from the config.
* @param saveDbType - save setting from the config.
*/
- void loadAndSaveDatabase(String loadDbType, String saveDbType) {
+ void loadAndSaveDatabase(String loadDbType, String saveDbType) throws TownyInitException {
towny.getLogger().info("Database: [Load] " + loadDbType + " [Save] " + saveDbType);
- try {
- // Try loading the database.
- loadDatabase(loadDbType);
- } catch (TownyInitException e) {
- throw new TownyInitException(e.getMessage(), e.getError());
+
+ loadDatabase(loadDbType);
+ saveDatabase(saveDbType);
+
+ // Dispose of the load data source if it's no longer needed
+ if (this.loadDataSource != this.saveDataSource) {
+ this.loadDataSource.finishTasks();
+ this.loadDataSource = null;
}
-
- try {
- // Try saving the database.
- saveDatabase(saveDbType);
- } catch (TownyInitException e) {
- throw new TownyInitException(e.getMessage(), e.getError());
- }
}
/**
@@ -174,22 +171,25 @@ private boolean loadDatabase(String loadDbType) {
switch (loadDbType.toLowerCase(Locale.ROOT)) {
case "ff":
case "flatfile": {
- this.dataSource = new TownyFlatFileSource(towny, this);
+ this.loadDataSource = new TownyFlatFileSource(towny, this);
break;
}
case "mysql": {
- this.dataSource = new TownySQLSource(towny, this);
+ this.loadDataSource = new TownySQLSource(towny, this);
break;
}
default: {
throw new TownyInitException("Database: Database.yml unsupported load format: " + loadDbType, TownyInitException.TownyError.DATABASE_CONFIG);
}
}
+
+ // Loading the database can cause saving, so save that back to the load source
+ this.saveDataSource = this.loadDataSource;
/*
* Load the actual database.
*/
- if (!dataSource.loadAll())
+ if (!loadDataSource.loadAll())
throw new TownyInitException("Database: Failed to load database.", TownyInitException.TownyError.DATABASE);
long time = System.currentTimeMillis() - startTime;
@@ -215,11 +215,11 @@ private boolean saveDatabase(String saveDbType) {
switch (saveDbType.toLowerCase(Locale.ROOT)) {
case "ff":
case "flatfile": {
- this.dataSource = new TownyFlatFileSource(towny, this);
+ this.saveDataSource = this.loadDataSource instanceof TownyFlatFileSource ? this.loadDataSource : new TownyFlatFileSource(towny, this);
break;
}
case "mysql": {
- this.dataSource = new TownySQLSource(towny, this);
+ this.saveDataSource = this.loadDataSource instanceof TownySQLSource ? this.loadDataSource : new TownySQLSource(towny, this);
break;
}
default: {
@@ -229,10 +229,10 @@ private boolean saveDatabase(String saveDbType) {
if (TownySettings.getLoadDatabase().equalsIgnoreCase(saveDbType)) {
// Update all Worlds data files
- dataSource.saveAllWorlds();
+ saveDataSource.saveAllWorlds();
} else {
//Formats are different so save ALL data.
- dataSource.saveAll();
+ saveDataSource.saveAll();
}
return true;
} catch (UnsupportedOperationException e) {
@@ -261,7 +261,7 @@ public void finishTasks() {
*/
public TownyDataSource getDataSource() {
- return dataSource;
+ return saveDataSource;
}
public TownyPermissionSource getPermissionSource() {
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 e92976ff3a..c2b26a224d 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
@@ -2304,26 +2304,7 @@ public static void townSetHomeblock(Player player, final Town town) throws Towny
if (town.hasHomeBlock() && town.getHomeBlock().getWorldCoord().equals(townBlock.getWorldCoord()))
throw new TownyException(Translatable.of("msg_err_homeblock_already_set_here"));
- if (world.hasTowns() &&
- TownySettings.getMinDistanceFromTownHomeblocks() > 0 ||
- TownySettings.getMaxDistanceBetweenHomeblocks() > 0 ||
- TownySettings.getMinDistanceBetweenHomeblocks() > 0) {
-
- final int distanceToNextNearestHomeblock = world.getMinDistanceFromOtherTownsHomeBlocks(Coord.parseCoord(player), town);
- if (distanceToNextNearestHomeblock < TownySettings.getMinDistanceFromTownHomeblocks() ||
- distanceToNextNearestHomeblock < TownySettings.getMinDistanceBetweenHomeblocks())
- throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("homeblock")));
-
- if (TownySettings.getMaxDistanceBetweenHomeblocks() > 0 &&
- distanceToNextNearestHomeblock > TownySettings.getMaxDistanceBetweenHomeblocks())
- throw new TownyException(Translatable.of("msg_too_far"));
- }
-
- if (TownySettings.getHomeBlockMovementDistanceInTownBlocks() > 0) {
- double distance = MathUtil.distance(town.getHomeBlock().getCoord(), townBlock.getCoord());
- if (distance > TownySettings.getHomeBlockMovementDistanceInTownBlocks())
- throw new TownyException(Translatable.of("msg_err_you_cannot_move_your_homeblock_this_far_limit_is_x_you_are_x", TownySettings.getHomeBlockMovementDistanceInTownBlocks(), Math.floor(distance)));
- }
+ ProximityUtil.allowTownHomeBlockOrThrow(world, townBlock.getCoord(), town, false);
BukkitTools.ifCancelledThenThrow(new TownPreSetHomeBlockEvent(town, townBlock, player));
@@ -2575,8 +2556,16 @@ public static void newTown(Player player, String name, Resident resident, boolea
if (!TownyAPI.getInstance().isWilderness(spawnLocation))
throw new TownyException(Translatable.of("msg_already_claimed_1", key));
- if (world.hasTowns())
- testDistancesOrThrow(world, key);
+ // Check that a town isn't being formed inside of a biome that isn't allowed to be claimed.
+ if (TownySettings.isUnwantedBiomeClaimingEnabled() || TownySettings.isOceanClaimingBlocked()) {
+ List selection = Arrays.asList(WorldCoord.parseWorldCoord(spawnLocation));
+ selection = AreaSelectionUtil.filterOutUnwantedBiomeWorldCoords(player, selection);
+ selection = AreaSelectionUtil.filterOutOceanBiomeWorldCoords(player, selection);
+ if (selection.isEmpty())
+ throw new TownyException("msg_err_cannot_begin_town_in_this_biome");
+ }
+
+ ProximityUtil.allowTownHomeBlockOrThrow(world, key, null, true);
// If the town doesn't cost money to create, just make the Town.
if (noCharge || !TownyEconomyHandler.isActive()) {
@@ -2683,37 +2672,6 @@ public static Town newTown(TownyWorld world, String name, Resident resident, Coo
return town;
}
- private static void testDistancesOrThrow(TownyWorld world, Coord key) throws TownyException {
- if (TownySettings.getMinDistanceFromTownPlotblocks() > 0 || TownySettings.getNewTownMinDistanceFromTownPlots() > 0) {
- int minDistance = TownySettings.getNewTownMinDistanceFromTownPlots();
- if (minDistance <= 0)
- minDistance = TownySettings.getMinDistanceFromTownPlotblocks();
-
- if (world.getMinDistanceFromOtherTownsPlots(key) < minDistance)
- throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("townblock")));
- }
-
- if (TownySettings.getMinDistanceFromTownHomeblocks() > 0 ||
- TownySettings.getMaxDistanceBetweenHomeblocks() > 0 ||
- TownySettings.getMinDistanceBetweenHomeblocks() > 0 ||
- TownySettings.getNewTownMinDistanceFromTownHomeblocks() > 0) {
-
- final int distanceToNextNearestHomeblock = world.getMinDistanceFromOtherTownsHomeBlocks(key);
-
- int minDistance = TownySettings.getNewTownMinDistanceFromTownHomeblocks();
- if (minDistance <= 0)
- minDistance = TownySettings.getMinDistanceFromTownHomeblocks();
-
- if (distanceToNextNearestHomeblock < minDistance || distanceToNextNearestHomeblock < TownySettings.getMinDistanceBetweenHomeblocks())
- throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("homeblock")));
-
- if (TownySettings.getMaxDistanceBetweenHomeblocks() > 0 &&
- TownyUniverse.getInstance().getTowns().size() > 0 &&
- distanceToNextNearestHomeblock > TownySettings.getMaxDistanceBetweenHomeblocks())
- throw new TownyException(Translatable.of("msg_too_far"));
- }
- }
-
private static String filterNameOrThrow(String name) throws TownyException {
if (TownySettings.getTownAutomaticCapitalisationEnabled())
name = StringMgmt.capitalizeStrings(name);
@@ -3548,14 +3506,17 @@ else if (result.feedback() != null)
// Select the area, can be one or many.
selection = AreaSelectionUtil.selectWorldCoordArea(town, new WorldCoord(world.getName(), key), split, true);
-
- if (selection.size() > 1)
- checkPermOrThrow(player, PermissionNodes.TOWNY_COMMAND_TOWN_CLAIM_TOWN_MULTIPLE.getNode());
}
// Filter out any TownBlocks which aren't Wilderness.
selection = AreaSelectionUtil.filterOutTownOwnedBlocks(selection);
+ // Filter out any TownBlocks which have too much of the unwanted biomes, when enabled.
+ selection = AreaSelectionUtil.filterOutUnwantedBiomeWorldCoords(player, selection);
+
+ // Filter out any TownBlocks which have too much ocean biomes, when enabled.
+ selection = AreaSelectionUtil.filterOutOceanBiomeWorldCoords(player, selection);
+
if (selection.isEmpty())
throw new TownyException(Translatable.of("msg_err_empty_area_selection"));
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 f2614b2077..e5204550ac 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
@@ -2822,7 +2822,7 @@ private void parseAdminInstall(CommandSender sender) throws NoPermissionExceptio
toggleWildernessUsage(parseBoolean(context.getSessionData(0)));
toggleRevertUnclaim(parseBoolean(context.getSessionData(1)));
- TownySettings.setProperty(ConfigNodes.TOWN_TOWN_BLOCK_RATIO.getRoot(), Integer.parseInt((String) context.getSessionData(2)));
+ TownySettings.setProperty(ConfigNodes.CLAIMING_TOWN_BLOCK_RATIO.getRoot(), Integer.parseInt((String) context.getSessionData(2)));
if (TownyEconomyHandler.isActive()) {
TownySettings.setProperty(ConfigNodes.ECO_PRICE_NEW_TOWN.getRoot(), Integer.parseInt((String) context.getSessionData(3)));
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java
index 75d7f6932f..73e9b4afc4 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java
@@ -362,17 +362,27 @@ private void parseTopCommand(CommandSender sender, String[] args) throws TownyEx
}
public List getUniverseStats(Translator translator) {
+ String heart1 = "\u00A70-\u00A74###\u00A70---\u00A74###\u00A70- ";
+ String heart2 = "\u00A74#\u00A7c###\u00A74#\u00A70-\u00A74#\u00A7c###\u00A74#\u00A70 ";
+ String heart3 = "\u00A74#\u00A7c####\u00A74#\u00A7c####\u00A74# ";
+ String heart4 = "\u00A70-\u00A74#\u00A7c#######\u00A74#\u00A70-";
+ String heart5 = "\u00A70--\u00A74##\u00A7c###\u00A74##\u00A70-- ";
+ String heart6 = "\u00A70----\u00A74#\u00A7c#\u00A74#\u00A70---- ";
+ String heart7 = "\u00A70-----\u00A74#\u00A70----- ";
+ String splitter = Colors.Gray + " | ";
TownyUniverse townyUniverse = TownyUniverse.getInstance();
List output = new ArrayList<>();
-
output.add(""); // Intentionally left blank
- output.add("\u00A70-\u00A74###\u00A70---\u00A74###\u00A70- " + Colors.Gold + "[" + Colors.Yellow + "Towny " + Colors.Green + plugin.getVersion() + Colors.Gold + "]");
- output.add("\u00A74#\u00A7c###\u00A74#\u00A70-\u00A74#\u00A7c###\u00A74#\u00A70 " + Colors.Blue + translator.of("msg_universe_attribution") + Colors.LightBlue + "Chris H (Shade), ElgarL, LlmDl");
- output.add("\u00A74#\u00A7c####\u00A74#\u00A7c####\u00A74# " + Colors.LightBlue + translator.of("msg_universe_contributors") + Colors.Rose + translator.of("msg_universe_heart"));
- output.add("\u00A70-\u00A74#\u00A7c#######\u00A74#\u00A70-");
- output.add("\u00A70--\u00A74##\u00A7c###\u00A74##\u00A70-- " + Colors.Blue + translator.of("res_list")+ ": " + Colors.LightBlue + townyUniverse.getNumResidents() + Colors.Gray + " | " + Colors.Blue + translator.of("town_plu") + ": " + Colors.LightBlue + townyUniverse.getTowns().size() + Colors.Gray + " | " + Colors.Blue + translator.of("nation_plu") + ": " + Colors.LightBlue + townyUniverse.getNumNations());
- output.add("\u00A70----\u00A74#\u00A7c#\u00A74#\u00A70---- " + Colors.Blue + translator.of("world_plu") + ": " + Colors.LightBlue + townyUniverse.getTownyWorlds().size() + Colors.Gray + " | " + Colors.Blue + translator.of("townblock_plu") + ": " + Colors.LightBlue + townyUniverse.getTownBlocks().size());
- output.add("\u00A70-----\u00A74#\u00A70----- " + Colors.LightGreen + "https://TownyAdvanced.github.io/");
+ output.add(heart1 + Colors.Gold + "[" + Colors.Yellow + "Towny " + Colors.Green + plugin.getVersion() + Colors.Gold + "]");
+ output.add(heart2 + Colors.Blue + translator.of("msg_universe_attribution") + Colors.LightBlue + "LlmDl, Warrior, ElgarL, Chris H (Shade)");
+ output.add(heart3 + Colors.LightBlue + translator.of("msg_universe_contributors") + Colors.Rose + translator.of("msg_universe_heart"));
+ output.add(heart4);
+ output.add(heart5 + Colors.Blue + translator.of("res_list")+ ": " + Colors.LightBlue + townyUniverse.getNumResidents() + splitter
+ + Colors.Blue + translator.of("town_plu") + ": " + Colors.LightBlue + townyUniverse.getTowns().size() + splitter
+ + Colors.Blue + translator.of("nation_plu") + ": " + Colors.LightBlue + townyUniverse.getNumNations());
+ output.add(heart6 + Colors.Blue + translator.of("world_plu") + ": " + Colors.LightBlue + townyUniverse.getTownyWorlds().size() + splitter
+ + Colors.Blue + translator.of("townblock_plu") + ": " + Colors.LightBlue + townyUniverse.getTownBlocks().size());
+ output.add(heart7 + Colors.LightGreen + "https://TownyAdvanced.github.io/");
output.add(""); // Intentionally left blank
// Other TownyAdvanced plugins to report versions
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLTask.java b/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLTask.java
index ae9756e9c9..140916ac33 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLTask.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/db/SQLTask.java
@@ -6,7 +6,8 @@
import java.util.Map;
@ApiStatus.Internal
-public class SQLTask {
+public class SQLTask implements Runnable {
+ private final TownySQLSource source;
// Update flags this for an insert/update or delete.
public final boolean update;
@@ -21,9 +22,9 @@ public class SQLTask {
* @param tb_name - Table name.
* @param args - Arguments.
*/
- public SQLTask(String tb_name, Map args) {
+ public SQLTask(TownySQLSource source, String tb_name, Map args) {
- this(false, tb_name, args, null);
+ this(source, false, tb_name, args, null);
}
@@ -34,14 +35,14 @@ public SQLTask(String tb_name, Map args) {
* @param args - Arguments.
* @param keys - Keys to add to table.
*/
- public SQLTask(String tb_name, Map args, List keys) {
+ public SQLTask(TownySQLSource source, String tb_name, Map args, List keys) {
- this(true, tb_name, args, keys);
+ this(source, true, tb_name, args, keys);
}
- private SQLTask(boolean update, String tb_name, Map args, List keys) {
-
+ private SQLTask(TownySQLSource source, boolean update, String tb_name, Map args, List keys) {
+ this.source = source;
this.update = update;
this.tb_name = tb_name;
this.args = args;
@@ -49,4 +50,12 @@ private SQLTask(boolean update, String tb_name, Map args, List {
- while (!this.queryQueue.isEmpty()) {
- Runnable operation = this.queryQueue.poll();
- operation.run();
+ synchronized(queryQueue) {
+ while (!this.queryQueue.isEmpty()) {
+ Runnable operation = this.queryQueue.poll();
+ operation.run();
+ }
}
}, 5L, 5L);
}
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 9c3e0cd008..f08ea0fda4 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
@@ -28,7 +28,6 @@
import com.palmergames.bukkit.towny.object.WorldCoord;
import com.palmergames.bukkit.towny.object.metadata.MetadataLoader;
import com.palmergames.bukkit.towny.object.jail.Jail;
-import com.palmergames.bukkit.towny.scheduling.ScheduledTask;
import com.palmergames.bukkit.towny.tasks.CooldownTimerTask;
import com.palmergames.bukkit.towny.utils.MapUtil;
import com.palmergames.bukkit.util.BukkitTools;
@@ -57,19 +56,13 @@
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
-import java.util.Queue;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.logging.Level;
import java.util.stream.Collectors;
public final class TownySQLSource extends TownyDatabaseHandler {
- private final Queue queryQueue = new ConcurrentLinkedQueue<>();
- private boolean isPolling = false;
- private final ScheduledTask task;
-
private final String tb_prefix;
private final HikariDataSource hikariDataSource;
@@ -140,47 +133,12 @@ public TownySQLSource(Towny plugin, TownyUniverse universe) {
} catch (SQLException e) {
logger.error("Failed to connect to the database", e);
}
-
- /*
- * Start our Async queue for pushing data to the database.
- */
- task = plugin.getScheduler().runAsyncRepeating(() -> {
- if (this.isPolling)
- return;
-
- this.isPolling = true;
- try {
- SQLTask query;
- while ((query = this.queryQueue.poll()) != null) {
- if (query.update) {
- TownySQLSource.this.queueUpdateDB(query.tb_name, query.args, query.keys);
- } else {
- TownySQLSource.this.queueDeleteDB(query.tb_name, query.args);
- }
- }
- } finally {
- this.isPolling = false;
- }
-
- }, 5L, 5L);
}
@Override
public void finishTasks() {
- // Cancel the repeating task as its not needed anymore.
- if (task != null)
- task.cancel();
-
- // Make sure that *all* tasks are saved before shutting down.
- while (!queryQueue.isEmpty()) {
- SQLTask query = TownySQLSource.this.queryQueue.poll();
+ super.finishTasks();
- if (query.update) {
- TownySQLSource.this.queueUpdateDB(query.tb_name, query.args, query.keys);
- } else {
- TownySQLSource.this.queueDeleteDB(query.tb_name, query.args);
- }
- }
// Close the database sources on shutdown to get GC
if (hikariDataSource != null)
hikariDataSource.close();
@@ -232,7 +190,7 @@ public boolean updateDB(String tb_name, Map args, List keys)
* Make sure we only execute queries in async
*/
- this.queryQueue.add(new SQLTask(tb_name, args, keys));
+ this.queryQueue.add(new SQLTask(this, tb_name, args, keys));
return true;
@@ -398,7 +356,7 @@ public boolean DeleteDB(String tb_name, HashMap args) {
// Make sure we only execute queries in async
- this.queryQueue.add(new SQLTask(tb_name, args));
+ this.queryQueue.add(new SQLTask(this, tb_name, args));
return true;
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/hooks/PluginIntegrations.java b/Towny/src/main/java/com/palmergames/bukkit/towny/hooks/PluginIntegrations.java
index 2a245681d4..8002cd7d33 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/hooks/PluginIntegrations.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/hooks/PluginIntegrations.java
@@ -40,9 +40,9 @@ public class PluginIntegrations {
private static PluginIntegrations instance;
private final String[] TOWNYADVANCED_PLUGINS = { "TownyChat", "TownyFlight", "TownyCultures", "TownyResources",
"TownyCombat", "FlagWar", "SiegeWar", "MapTowny", "Dynmap-Towny", "ChestShop-Towny", "mcMMO-Towny",
- "Towny-TNE", "WorldGuard-Towny" };
+ "Towny-TNE", "WorldGuard-Towny", "TownyProvinces" };
private final String[] SPONSOR_PLUGINS = { "EventWar", "SiegeConquest", "TownyCamps", "TownyHistories", "TownyRTP",
- "TownyWayPointTravel", "TownOptionalLWC" };
+ "TownyWayPointTravel", "TownOptionalLWC", "TowerOfBable", "TownyCaptureSites" };
private final String NEWLINE_STRING = System.lineSeparator() + " ";
private final Map warnings = new LinkedHashMap<>();
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyCustomListener.java b/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyCustomListener.java
index 92c3292894..82efd50bb6 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyCustomListener.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/listeners/TownyCustomListener.java
@@ -247,7 +247,7 @@ public void onChunkNotification(ChunkNotificationEvent event) {
@EventHandler(ignoreCancelled = true)
public void onResidentJoinTown(TownAddResidentEvent event) {
- if (!TownySettings.isPromptingNewResidentsToTownSpawn() || !TownySettings.getBoolean(ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN))
+ if (!TownySettings.isPromptingNewResidentsToTownSpawn() || !TownySettings.getBoolean(ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN))
return;
Town town = event.getTown();
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 f7e218507d..c91c45b79c 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
@@ -454,10 +454,15 @@ public void onEntityInteract(EntityInteractEvent event) {
if (entity instanceof Villager && ItemLists.WOOD_DOORS.contains(block.getType()))
return;
- // Prevent creatures triggering switch items,
- // OR prevent creatures triggering stone pressure plates (if the config denies it.)
- if (TownySettings.isSwitchMaterial(block.getType(), block.getLocation())
- || (TownySettings.isCreatureTriggeringPressurePlateDisabled() && block.getType() == Material.STONE_PRESSURE_PLATE)) {
+ // Special case protecting stone pressure plates triggered by creatures.
+ if (block.getType() == Material.STONE_PRESSURE_PLATE) {
+ if(TownySettings.isCreatureTriggeringPressurePlateDisabled())
+ event.setCancelled(true);
+ return;
+ }
+
+ // Prevent creatures triggering switch items.
+ if (TownySettings.isSwitchMaterial(block.getType(), block.getLocation())) {
event.setCancelled(true);
return;
}
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/NationSpawnLevel.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/NationSpawnLevel.java
index f8a6f66956..83064c41a1 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/NationSpawnLevel.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/NationSpawnLevel.java
@@ -12,29 +12,29 @@
public enum NationSpawnLevel {
PART_OF_NATION(
- ConfigNodes.GNATION_SETTINGS_ALLOW_NATION_SPAWN,
+ ConfigNodes.SPAWNING_ALLOW_NATION_SPAWN,
"msg_err_nation_spawn_forbidden",
"msg_err_nation_spawn_forbidden_war",
"msg_err_nation_spawn_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL,
PermissionNodes.TOWNY_NATION_SPAWN_NATION.getNode(),
- ConfigNodes.GNATION_SETTINGS_NATION_MEMBER_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_NATION_SPAWN_NATION_MEMBER_COOLDOWN_TIMER),
NATION_ALLY(
- ConfigNodes.GNATION_SETTINGS_ALLOW_NATION_SPAWN_TRAVEL_ALLY,
+ ConfigNodes.SPAWNING_ALLOW_NATION_SPAWN_TRAVEL_ALLY,
"msg_err_nation_spawn_ally_forbidden",
"msg_err_nation_spawn_nation_forbidden_war",
"msg_err_nation_spawn_nation_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL_ALLY,
PermissionNodes.TOWNY_NATION_SPAWN_ALLY.getNode(),
- ConfigNodes.GNATION_SETTINGS_NATION_ALLY_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_NATION_SPAWN_NATION_ALLY_COOLDOWN_TIMER),
UNAFFILIATED(
- ConfigNodes.GNATION_SETTINGS_ALLOW_NATION_SPAWN_TRAVEL,
+ ConfigNodes.SPAWNING_ALLOW_NATION_SPAWN_TRAVEL,
"msg_err_public_nation_spawn_forbidden",
"msg_err_public_nation_spawn_forbidden_war",
"msg_err_public_nation_spawn_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL_PUBLIC,
PermissionNodes.TOWNY_NATION_SPAWN_PUBLIC.getNode(),
- ConfigNodes.GNATION_SETTINGS_NATION_UNAFFILIATED_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_NATION_SPAWN_NATION_UNAFFILIATED_COOLDOWN_TIMER),
ADMIN(
null,
null,
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/TownSpawnLevel.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/TownSpawnLevel.java
index 3096307c0d..6579825d17 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/TownSpawnLevel.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/spawnlevel/TownSpawnLevel.java
@@ -12,45 +12,45 @@
public enum TownSpawnLevel {
TOWN_RESIDENT(
- ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN,
+ ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN,
"msg_err_town_spawn_forbidden",
"msg_err_town_spawn_forbidden_war",
"msg_err_town_spawn_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL,
PermissionNodes.TOWNY_SPAWN_TOWN.getNode(),
- ConfigNodes.GTOWN_SETTINGS_SPAWN_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_TOWN_SPAWN_COOLDOWN_TIMER),
TOWN_RESIDENT_OUTPOST(
- ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN,
+ ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN,
"msg_err_town_spawn_forbidden",
"msg_err_town_spawn_forbidden_war",
"msg_err_town_spawn_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL,
PermissionNodes.TOWNY_SPAWN_OUTPOST.getNode(),
- ConfigNodes.GTOWN_SETTINGS_OUTPOST_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_TOWN_SPAWN_OUTPOST_COOLDOWN_TIMER),
PART_OF_NATION(
- ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL_NATION,
+ ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL_NATION,
"msg_err_town_spawn_nation_forbidden",
"msg_err_town_spawn_nation_forbidden_war",
"msg_err_town_spawn_nation_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL_NATION,
PermissionNodes.TOWNY_SPAWN_NATION.getNode(),
- ConfigNodes.GTOWN_SETTINGS_NATION_MEMBER_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_TOWN_SPAWN_NATION_MEMBER_COOLDOWN_TIMER),
NATION_ALLY(
- ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL_ALLY,
+ ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL_ALLY,
"msg_err_town_spawn_ally_forbidden",
"msg_err_town_spawn_nation_forbidden_war",
"msg_err_town_spawn_nation_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL_ALLY,
PermissionNodes.TOWNY_SPAWN_ALLY.getNode(),
- ConfigNodes.GTOWN_SETTINGS_NATION_ALLY_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_TOWN_SPAWN_NATION_ALLY_COOLDOWN_TIMER),
UNAFFILIATED(
- ConfigNodes.GTOWN_SETTINGS_ALLOW_TOWN_SPAWN_TRAVEL,
+ ConfigNodes.SPAWNING_ALLOW_TOWN_SPAWN_TRAVEL,
"msg_err_public_spawn_forbidden",
"msg_err_town_spawn_forbidden_war",
"msg_err_town_spawn_forbidden_peace",
ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL_PUBLIC,
PermissionNodes.TOWNY_SPAWN_PUBLIC.getNode(),
- ConfigNodes.GTOWN_SETTINGS_UNAFFILIATED_COOLDOWN_TIMER),
+ ConfigNodes.SPAWNING_TOWN_SPAWN_UNAFFILIATED_COOLDOWN_TIMER),
ADMIN(
null,
null,
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/permissions/PermissionNodes.java b/Towny/src/main/java/com/palmergames/bukkit/towny/permissions/PermissionNodes.java
index 6c5a59dafe..32d892e04c 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/permissions/PermissionNodes.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/permissions/PermissionNodes.java
@@ -176,7 +176,6 @@ public enum PermissionNodes {
TOWNY_COMMAND_TOWN_CLAIM("towny.command.town.claim.*"),
TOWNY_COMMAND_TOWN_CLAIM_TOWN("towny.command.town.claim.town"),
- TOWNY_COMMAND_TOWN_CLAIM_TOWN_MULTIPLE("towny.command.town.claim.town.multiple"),
TOWNY_COMMAND_TOWN_CLAIM_OUTPOST("towny.command.town.claim.outpost"),
TOWNY_COMMAND_TOWN_CLAIM_FILL("towny.command.town.claim.fill"),
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 2cbed5746b..0b37a1b0be 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
@@ -132,7 +132,7 @@ public void run() {
TownyMessaging.sendDebugMsg(" Towns: " + universe.getTowns().size());
TownyMessaging.sendDebugMsg(" Nations: " + universe.getNumNations());
for (TownyWorld world : universe.getTownyWorlds())
- TownyMessaging.sendDebugMsg(" " + world.getName() + " (townblocks): " + universe.getTownBlocks().size());
+ TownyMessaging.sendDebugMsg(" " + world.getName() + " (townblocks): " + world.getTownBlocks().size());
TownyMessaging.sendDebugMsg("Memory (Java Heap):");
TownyMessaging.sendDebugMsg(String.format("%8d Mb (max)", Runtime.getRuntime().maxMemory() / 1024 / 1024));
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java
index 021765e6ec..a1a2114f88 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java
@@ -12,14 +12,19 @@
import com.palmergames.bukkit.towny.object.TownBlockOwner;
import com.palmergames.bukkit.towny.object.Translatable;
import com.palmergames.bukkit.towny.object.WorldCoord;
+import com.palmergames.bukkit.util.BiomeUtil;
import com.palmergames.util.MathUtil;
import com.palmergames.util.StringMgmt;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
import java.util.stream.Collectors;
+import org.bukkit.entity.Player;
+
public class AreaSelectionUtil {
/** A maximum radius of 15 will garner 961 townblocks. Capped to prevent servers from dying. */
@@ -322,7 +327,6 @@ private static List selectWorldCoordAreaCircle(int maxSelectionSize,
* Returns a list containing only townblocks that can be claimed.
* Filters out townblocks too close to other towns as set in the config.
*
-
* @param selection - List<WorldCoord> of coordinates
* @param town - Town to check distance from
* @return List of {@link WorldCoord}
@@ -525,6 +529,56 @@ public static List filterOutResidentBlocks(Resident resident, List filterOutUnwantedBiomeWorldCoords(Player player, List selection) {
+ if (!TownySettings.isUnwantedBiomeClaimingEnabled())
+ return selection;
+ Predicate biomeThresholdTest = wc -> BiomeUtil.getWorldCoordUnwantedBiomePercent(wc) < TownySettings.getUnwantedBiomeThreshold();
+ return filterOutByBiome(player, selection, biomeThresholdTest, "msg_err_cannot_claim_the_following_worldcoords_because_of_unwanted_biome");
+ }
+
+ /**
+ * Returns a List containing only WorldCoords which are not composed of "too much"
+ * ocean biomes, with the threshold determined by the config.
+ *
+ * @param player Player trying to claim.
+ * @param selection List of WorldCoords.
+ * @return a List of WorldCoords which have passed the biome requirements.
+ */
+ public static List filterOutOceanBiomeWorldCoords(Player player, List selection) {
+ if (!TownySettings.isOceanClaimingBlocked())
+ return selection;
+
+ Predicate biomeThresholdTest = wc -> BiomeUtil.getWorldCoordOceanBiomePercent(wc) < TownySettings.getOceanBlockThreshold();
+ return filterOutByBiome(player, selection, biomeThresholdTest, "msg_err_cannot_claim_the_following_worldcoords_because_of_ocean_biome");
+ }
+
+ public static List filterOutByBiome(Player player, List selection, Predicate biomeThresholdTest, String errorMsg) {
+ // Strip list into succesful and failing lists of WorldCoords.
+ Map> worldCoords = selection.stream().collect(Collectors.partitioningBy(biomeThresholdTest));
+
+ // Feedback as to why a plot isn't claimable due to biome.
+ if (!worldCoords.get(false).isEmpty())
+ TownyMessaging.sendErrorMsg(player, Translatable.of(errorMsg, prettyWorldCoordList(worldCoords.get(false))));
+
+ // Return successful selections.
+ return worldCoords.get(true);
+ }
+
+ private static String prettyWorldCoordList(List worldCoords) {
+ return StringMgmt.join(worldCoords.stream()
+ .map(wc -> String.format("(%s)", wc.getCoord().toString()))
+ .collect(Collectors.toList()), ", ");
+ }
+
public static int getAreaSelectPivot(String[] args) {
for (int i = 0; i < args.length; i++) {
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java
index ef0920b4b3..39ef2753bf 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java
@@ -4,18 +4,69 @@
import java.util.List;
import java.util.stream.Collectors;
+import org.jetbrains.annotations.Nullable;
+
import com.palmergames.bukkit.towny.TownyMessaging;
import com.palmergames.bukkit.towny.TownySettings;
import com.palmergames.bukkit.towny.exceptions.TownyException;
+import com.palmergames.bukkit.towny.object.Coord;
import com.palmergames.bukkit.towny.object.Nation;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.TownBlock;
+import com.palmergames.bukkit.towny.object.TownyWorld;
import com.palmergames.bukkit.towny.object.Translatable;
import com.palmergames.bukkit.towny.object.WorldCoord;
import com.palmergames.util.MathUtil;
public class ProximityUtil {
+ /*
+ * Town Proximity Methods
+ */
+
+ public static void allowTownHomeBlockOrThrow(TownyWorld world, Coord key, @Nullable Town town, boolean newTown) throws TownyException {
+ if (!world.hasTowns()) // No towns exist yet, we cannot be too close to any other town.
+ return;
+
+ if (newTown) { // Tests run only when there is a new town involved.
+ if (TownySettings.getMinDistanceFromTownPlotblocks() > 0 || TownySettings.getNewTownMinDistanceFromTownPlots() > 0) {
+ // Sometimes new towns have special min. distances from other towns.
+ int minDistance = TownySettings.getNewTownMinDistanceFromTownPlots();
+ if (minDistance <= 0)
+ minDistance = TownySettings.getMinDistanceFromTownPlotblocks();
+
+ // throws when a new town is being made to close to another town's land.
+ if (world.getMinDistanceFromOtherTownsPlots(key) < minDistance)
+ throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("townblock")));
+ }
+ }
+
+ if (TownySettings.getMinDistanceFromTownHomeblocks() > 0 ||
+ TownySettings.getMaxDistanceBetweenHomeblocks() > 0 ||
+ TownySettings.getMinDistanceBetweenHomeblocks() > 0 ||
+ (newTown && TownySettings.getNewTownMinDistanceFromTownHomeblocks() > 0)) {
+
+ final int distanceToNextNearestHomeblock = world.getMinDistanceFromOtherTownsHomeBlocks(key, town);
+ // Sometimes new towns have special min. distances from other towns' homeblocks.
+ int minDistance = newTown ? TownySettings.getNewTownMinDistanceFromTownHomeblocks() : 0;
+ if (minDistance <= 0)
+ minDistance = TownySettings.getMinDistanceFromTownHomeblocks();
+
+ // throws when the town's homeblock is too close to another homeblock.
+ if (distanceToNextNearestHomeblock < minDistance || distanceToNextNearestHomeblock < TownySettings.getMinDistanceBetweenHomeblocks())
+ throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("homeblock")));
+
+ // throws when the town's homeblock would be too far from other towns' homeblocks.
+ if (TownySettings.getMaxDistanceBetweenHomeblocks() > 0 &&
+ distanceToNextNearestHomeblock > TownySettings.getMaxDistanceBetweenHomeblocks())
+ throw new TownyException(Translatable.of("msg_too_far"));
+ }
+ }
+
+ /*
+ * Nation Promixity Methods
+ */
+
public static void testTownProximityToNation(Town town, Nation nation) throws TownyException {
if (TownySettings.getNationProximityToCapital() <= 0)
return;
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java
index 974c8fa7f1..854965fc89 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java
@@ -535,6 +535,11 @@ private static void testDisallowedZones(Player player, Resident resident, SpawnT
if (townAtPlayerLoc != null) {
if (townAtPlayerLoc.hasOutlaw(player.getName()) && disallowedZones.contains("outlaw"))
throw new TownyException(Translatable.of("msg_err_x_spawn_disallowed_from_x", "RTP", Translatable.of("msg_a_town_you_are_outlawed_in")));
+ if (resident.hasTown() && townAtPlayerLoc.hasNation()) {
+ Nation townLocNation = townAtPlayerLoc.getNationOrNull();
+ if (townLocNation.hasSanctionedTown(resident.getTownOrNull()))
+ throw new TownyException(Translatable.of("msg_err_cannot_nation_spawn_your_town_is_sanctioned", townLocNation.getName()));
+ }
if (resident.hasNation() && townAtPlayerLoc.hasNation()) {
if (CombatUtil.isEnemy(resident.getTownOrNull(), townAtPlayerLoc) && disallowedZones.contains("enemy"))
throw new TownyException(Translatable.of("msg_err_x_spawn_disallowed_from_x", spawnType.typeName(), Translatable.of("msg_enemy_areas")));
diff --git a/Towny/src/main/java/com/palmergames/bukkit/util/BiomeUtil.java b/Towny/src/main/java/com/palmergames/bukkit/util/BiomeUtil.java
new file mode 100644
index 0000000000..534adf6f4a
--- /dev/null
+++ b/Towny/src/main/java/com/palmergames/bukkit/util/BiomeUtil.java
@@ -0,0 +1,37 @@
+package com.palmergames.bukkit.util;
+
+import java.util.Locale;
+import java.util.function.Predicate;
+import org.bukkit.World;
+import org.bukkit.block.Biome;
+import com.palmergames.bukkit.towny.TownySettings;
+import com.palmergames.bukkit.towny.object.WorldCoord;
+
+public class BiomeUtil {
+
+ private static Predicate isOceanPredicate = (biome) -> biome.name().contains("OCEAN");
+ private static Predicate isUnwantedBiomePredicate = (biome) -> TownySettings.getUnwantedBiomeNames().contains(biome.name().toLowerCase(Locale.ROOT));
+
+ public static double getWorldCoordOceanBiomePercent(WorldCoord worldCoord) {
+ return getWorldCoordBadBiomePercent(worldCoord, isOceanPredicate);
+ }
+
+ public static double getWorldCoordUnwantedBiomePercent(WorldCoord worldCoord) {
+ return getWorldCoordBadBiomePercent(worldCoord, isUnwantedBiomePredicate);
+ }
+
+ public static double getWorldCoordBadBiomePercent(WorldCoord worldCoord, Predicate biomePredicate) {
+ World world = worldCoord.getBukkitWorld();
+ int plotSize = TownySettings.getTownBlockSize();
+ int worldX = worldCoord.getX() * plotSize, worldZ = worldCoord.getZ() * plotSize;
+
+ int total = plotSize * plotSize;
+ int badBiomeBlocks = 0;
+ for (int z = 0; z < plotSize; z++)
+ for (int x = 0; x < plotSize; x++)
+ if (biomePredicate.test(world.getHighestBlockAt(worldX + x, worldZ + z).getBiome()))
+ badBiomeBlocks++;
+
+ return (double) badBiomeBlocks / total;
+ }
+}
diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt
index b708dc797c..b8dab0c1a0 100644
--- a/Towny/src/main/resources/ChangeLog.txt
+++ b/Towny/src/main/resources/ChangeLog.txt
@@ -9315,4 +9315,47 @@ v0.92.0.11:
- API: Added NationSanctionTownRemoveEvent
- A cancellable event which is fired before a town becomes unsanctioned.
0.100.0.14:
- - Fix potential IllegalArgumentException by loading sanctioned towns in a safer way.
\ No newline at end of file
+ - Fix potential IllegalArgumentException by loading sanctioned towns in a safer way.
+0.100.0.15:
+ - Removed Permission Node: towny.command.town.claim.town.multiple
+ - Towny over the years has made great progress towards making claiming more light weight on the server.
+ - Therefore it makes sense to allow the use of /t claim # and other multi-claiming commands by default.
+ - Update attribution in /towny universe to reflect 2023 stats.
+ - Update Towny/Sponsor plugins list.
+ - Correct townblock reporting in debug messages no one sees.
+ - Make the TownyUniverse code a bit more readable.
+ - Seperate the load and save data sources, courtesy of Warrior with PR #7100.
+ - Fixes a minor memory/connection leak when using mysql, the load datasource is now properly shut down when it's no longer needed and re-used if possible.
+0.100.0.16:
+ - Reorganize the config, creating dedicated sections for Claiming and Spawning.
+ - Existing config.yml's will have ~60 entries moved into their new locations with their settings preserved.
+ - Over 13 years of Towny development there have been many settings added into the section that was a "best-fit".
+ - The creation of Spawning and Claiming section will ease the addition of future settings in these areas.
+ - Bump net.kyori:adventure-text-minimessage from 4.14.0 to 4.15.0.
+ - Bump org.apache.maven.plugins:maven-compiler-plugin from 3.11.0 to 3.12.1.
+ - Bump net.kyori:adventure-text-serializer-plain from 4.14.0 to 4.15.0.
+ - Prevent players of nation-sanctioned towns being able to use /n spawn [nationname].
+0.100.0.17:
+ - Fix creatures-using-stone-pressure-plates config setting being overridden.
+ - Closes #7150.
+ - Add the ability to block claiming in plots which have too much Ocean or otherwise Unwanted biome in them.
+ - Closes #7136.
+ - New Config Option: claiming.biome_rules.unwanted_biomes.enabled
+ - Default: false
+ - When true, unwanted biomes will be tested for when a player is claiming land.
+ - New Config Option: claiming.biome_rules.unwanted_biomes.biomes
+ - Default: "the_end,end_barrens,end_highlands,end_midlands,small_end_islands"
+ - A comma separated list of biome names that will add up towards a townblock's un-claim-ability.
+ - New Config Option: claiming.biome_rules.unwanted_biomes.threshold
+ - Default: 55
+ - The max amount of combined unwanted biomes as a percent, that will be allowed in plots being claimed by towns.
+ - For example, if a townblock would be more than X percent ocean it will not be able to be claimed.
+ - New Config Option: claiming.biome_rules.ocean_blocking.enabled
+ - Default: false
+ - When true, any wilderness plot which has more Ocean biome in it than the allowed threshold (see below,) will not be able to be claimed.
+ - New Config Option: claiming.biome_rules.ocean_blocking.threshold
+ - Default: 55
+ - The max amount of combined ocean biomes as a percent, that will be allowed in plots being claimed by towns.
+ - For example, if a townblock would be more than X percent ocean it will not be able to be claimed.
+0.100.0.18:
+ - Refactor town homeblock proximity tests into new ProximityUtil method.
\ No newline at end of file
diff --git a/Towny/src/main/resources/config-migration.json b/Towny/src/main/resources/config-migration.json
index 8faea1fbae..e9193ec870 100644
--- a/Towny/src/main/resources/config-migration.json
+++ b/Towny/src/main/resources/config-migration.json
@@ -526,5 +526,315 @@
"value": "global_nation_settings.proximity.nation_proximity_to_capital_city"
}
]
+ },
+ {
+ "version": "0.100.0.16",
+ "changes": [
+ {
+ "type": "MOVE",
+ "path": "town.town_block_ratio",
+ "value": "claiming.town_block_ratio"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.town_block_limit",
+ "value": "claiming.town_block_limit"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.town_block_size",
+ "value": "claiming.town_block_size"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.min_adjacent_blocks",
+ "value": "claiming.min_adjacent_blocks"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_claim_radius_value",
+ "value": "claiming.max_claim_radius_value"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.min_distances_ignored_for_towns_in_same_nation",
+ "value": "claiming.distance_rules.min_distances_ignored_for_towns_in_same_nation"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.min_distances_ignored_for_towns_in_allied_nation",
+ "value": "claiming.distance_rules.min_distances_ignored_for_towns_in_allied_nation"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.min_plot_distance_from_town_plot",
+ "value": "claiming.distance_rules.min_plot_distance_from_town_plot"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.min_distance_from_town_homeblock",
+ "value": "claiming.distance_rules.min_distance_from_town_homeblock"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.min_distance_for_outpost_from_plot",
+ "value": "claiming.distance_rules.min_distance_for_outpost_from_plot"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_distance_for_outpost_from_town_plot",
+ "value": "claiming.distance_rules.max_distance_for_outpost_from_town_plot"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.min_distance_between_homeblocks",
+ "value": "claiming.distance_rules.min_distance_between_homeblocks"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_distance_between_homeblocks",
+ "value": "claiming.distance_rules.max_distance_between_homeblocks"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.new_town_min_distance_from_town_plot",
+ "value": "claiming.distance_rules.new_town_min_distance_from_town_plot"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.new_town_min_distance_from_town_homeblock",
+ "value": "claiming.distance_rules.new_town_min_distance_from_town_homeblock"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.allow_outposts",
+ "value": "claiming.outposts.allow_outposts"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.limit_outposts_using_town_and_nation_levels",
+ "value": "claiming.outposts.limit_outposts_using_town_and_nation_levels"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.over_outpost_limits_stops_teleports",
+ "value": "claiming.outposts.over_outpost_limits_stops_teleports"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.overclaiming.being_overclaimed_allows_other_towns_to_steal_land",
+ "value": "claiming.overclaiming.being_overclaimed_allows_other_towns_to_steal_land"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.overclaiming.overclaiming_prevented_by_homeblock_radius",
+ "value": "claiming.overclaiming.overclaiming_prevented_by_homeblock_radius"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.overclaiming.town_age_requirement",
+ "value": "claiming.overclaiming.town_age_requirement"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.overclaiming.command_cooldown",
+ "value": "claiming.overclaiming.command_cooldown"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_purchased_blocks",
+ "value": "claiming.purchased_bonus_blocks.max_purchased_blocks"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_purchased_blocks_uses_town_levels",
+ "value": "claiming.purchased_bonus_blocks.max_purchased_blocks_uses_town_levels"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_plots_per_resident",
+ "value": "global_town_settings.max_plots_per_resident"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_buytown_price",
+ "value": "global_town_settings.max_buytown_price"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.town_limit",
+ "value": "global_town_settings.town_limit"
+ },
+ {
+ "type": "MOVE",
+ "path": "town.max_distance_for_merge",
+ "value": "global_town_settings.max_distance_for_merge"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.minimum_amount_of_residents_in_town_for_outpost",
+ "value": "claiming.outposts.minimum_amount_of_residents_in_town_for_outpost"
+ },
+ {
+ "type": "MOVE",
+ "path": "plugin.visualized_spawn_points_enabled",
+ "value": "spawning.visualized_spawn_points_enabled"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.allow_town_spawn",
+ "value": "spawning.town_spawn.allow_town_spawn"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.allow_town_spawn_travel",
+ "value": "spawning.town_spawn.allow_town_spawn_travel"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.allow_town_spawn_travel_nation",
+ "value": "spawning.town_spawn.allow_town_spawn_travel_nation"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.allow_town_spawn_travel_ally",
+ "value": "spawning.town_spawn.allow_town_spawn_travel_ally"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.is_nation_ally_spawning_requiring_public_status",
+ "value": "spawning.town_spawn.is_nation_ally_spawning_to_town_requiring_public_status"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.do_trusted_residents_count_as_residents",
+ "value": "spawning.town_spawn.do_trusted_residents_count_as_residents"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.are_new_residents_prompted_to_town_spawn",
+ "value": "spawning.town_spawn.are_new_residents_prompted_to_town_spawn"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.teleport_warmup_time",
+ "value": "spawning.spawning_warmups.teleport_warmup_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.movement_cancels_spawn_warmup",
+ "value": "spawning.spawning_warmups.movement_cancels_spawn_warmup"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.damage_cancels_spawn_warmup",
+ "value": "spawning.spawning_warmups.damage_cancels_spawn_warmup"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.spawning_cooldowns.town_spawn_cooldown_time",
+ "value": "spawning.town_spawn.spawning_cooldowns.town_spawn_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.spawning_cooldowns.outpost_cooldown_time",
+ "value": "spawning.town_spawn.spawning_cooldowns.outpost_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.spawning_cooldowns.nation_member_town_spawn_cooldown_time",
+ "value": "spawning.town_spawn.spawning_cooldowns.nation_member_town_spawn_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.spawning_cooldowns.nation_ally_town_spawn_cooldown_time",
+ "value": "spawning.town_spawn.spawning_cooldowns.nation_ally_town_spawn_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.spawning_cooldowns.unaffiliated_town_spawn_cooldown_time",
+ "value": "spawning.town_spawn.spawning_cooldowns.unaffiliated_town_spawn_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.spawning_cooldowns.town_spawn_cooldown_time",
+ "value": "spawning.town_spawn.spawning_cooldowns.town_spawn_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.spawn_warnings",
+ "value": "spawning.spawn_cost_warnings"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.town_respawn",
+ "value": "spawning.respawning.town_respawn"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.respawn_anchor_higher_precendence",
+ "value": "spawning.respawning.respawn_anchor_higher_precendence"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.respawn_protection.time",
+ "value": "spawning.respawning.respawn_protection.time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.respawn_protection.allow_pickup",
+ "value": "spawning.respawning.respawn_protection.allow_pickup"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.town_respawn_same_world_only",
+ "value": "spawning.respawning.town_respawn_same_world_only"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.prevent_town_spawn_in",
+ "value": "spawning.town_spawn.prevent_town_spawn_in"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_town_settings.allow_enemies_spawn_to_peaceful_towns",
+ "value": "spawning.town_spawn.allow_enemies_spawn_to_peaceful_towns"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_nation_settings.capital_spawn",
+ "value": "spawning.nation_spawn.force_nation_spawn_in_capital"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_nation_settings.allow_nation_spawn",
+ "value": "spawning.nation_spawn.allow_nation_spawn"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_nation_settings.allow_nation_spawn_travel",
+ "value": "spawning.nation_spawn.allow_nation_spawn_travel"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_nation_settings.allow_nation_spawn_travel_ally",
+ "value": "spawning.nation_spawn.allow_nation_spawn_travel_ally"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_nation_settings.spawning_cooldowns.nation_member_nation_spawn_cooldown_time",
+ "value": "spawning.nation_spawn.spawning_cooldowns.nation_member_nation_spawn_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_nation_settings.spawning_cooldowns.nation_ally_nation_spawn_cooldown_time",
+ "value": "spawning.nation_spawn.spawning_cooldowns.nation_ally_nation_spawn_cooldown_time"
+ },
+ {
+ "type": "MOVE",
+ "path": "global_nation_settings.spawning_cooldowns.unaffiliated_nation_spawn_cooldown_time",
+ "value": "spawning.nation_spawn.spawning_cooldowns.unaffiliated_nation_spawn_cooldown_time"
+ }
+ ]
}
]
\ No newline at end of file
diff --git a/Towny/src/main/resources/lang/az-AZ.yml b/Towny/src/main/resources/lang/az-AZ.yml
index 65e91070e7..f0d591cbf7 100644
--- a/Towny/src/main/resources/lang/az-AZ.yml
+++ b/Towny/src/main/resources/lang/az-AZ.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Millətin Lideri köməyi'
king_help_2: 'İttifaqınızı formalaşdırın.'
king_help_3: 'Düşmənlərinizi seçin.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/bg-BG.yml b/Towny/src/main/resources/lang/bg-BG.yml
index 50a2ab1b83..e86f95c754 100644
--- a/Towny/src/main/resources/lang/bg-BG.yml
+++ b/Towny/src/main/resources/lang/bg-BG.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Помощ за национален лидер'
king_help_2: 'Съюзете се.'
king_help_3: 'Изберете си врагове.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/cs-CZ.yml b/Towny/src/main/resources/lang/cs-CZ.yml
index aff658d0ad..e33e2c598e 100644
--- a/Towny/src/main/resources/lang/cs-CZ.yml
+++ b/Towny/src/main/resources/lang/cs-CZ.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nápověda vůdce státu'
king_help_2: 'Nastavení svých spojenců.'
king_help_3: 'Nastavení svých nepřátel.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/da-DK.yml b/Towny/src/main/resources/lang/da-DK.yml
index 93b1028550..70df6a2b5e 100644
--- a/Towny/src/main/resources/lang/da-DK.yml
+++ b/Towny/src/main/resources/lang/da-DK.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Leader Help'
king_help_2: 'Sæt din alliance.'
king_help_3: 'Sæt dine fjender.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/de-DE.yml b/Towny/src/main/resources/lang/de-DE.yml
index 4a6895cb67..33b6f2f2c1 100644
--- a/Towny/src/main/resources/lang/de-DE.yml
+++ b/Towny/src/main/resources/lang/de-DE.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Führer Hilfe'
king_help_2: 'Verbündete festlegen'
king_help_3: 'Feinde festlegen'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/en-GB.yml b/Towny/src/main/resources/lang/en-GB.yml
index 4410dc17dd..d8ba3e9abf 100644
--- a/Towny/src/main/resources/lang/en-GB.yml
+++ b/Towny/src/main/resources/lang/en-GB.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Leader Help'
king_help_2: 'Set your alliance.'
king_help_3: 'Set your enemies.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/en-PT.yml b/Towny/src/main/resources/lang/en-PT.yml
index 97157ca486..af1f89636e 100644
--- a/Towny/src/main/resources/lang/en-PT.yml
+++ b/Towny/src/main/resources/lang/en-PT.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Leader Help'
king_help_2: 'Set your alliance.'
king_help_3: 'Set your enemies.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/en-UD.yml b/Towny/src/main/resources/lang/en-UD.yml
index 2af107f835..c938314c44 100644
--- a/Towny/src/main/resources/lang/en-UD.yml
+++ b/Towny/src/main/resources/lang/en-UD.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Leader Help'
king_help_2: 'Set your alliance.'
king_help_3: 'Set your enemies.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/en-US.yml b/Towny/src/main/resources/lang/en-US.yml
index c9b567b105..65382af9e5 100644
--- a/Towny/src/main/resources/lang/en-US.yml
+++ b/Towny/src/main/resources/lang/en-US.yml
@@ -2396,4 +2396,10 @@ msg_err_cannot_add_sanctioned_town: "Your nation cannot add %s, your nation has
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."
\ No newline at end of file
+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."
\ No newline at end of file
diff --git a/Towny/src/main/resources/lang/es-AR.yml b/Towny/src/main/resources/lang/es-AR.yml
index f7df4a4ad5..52b802c7ed 100644
--- a/Towny/src/main/resources/lang/es-AR.yml
+++ b/Towny/src/main/resources/lang/es-AR.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ayuda del Líder de Nación'
king_help_2: 'Establece tus alianzas.'
king_help_3: 'Establece tus enemistades.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/es-CL.yml b/Towny/src/main/resources/lang/es-CL.yml
index 5cd9a3659a..63761234c7 100644
--- a/Towny/src/main/resources/lang/es-CL.yml
+++ b/Towny/src/main/resources/lang/es-CL.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
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."
king_help_1: 'Ayuda para el Líder'
king_help_2: 'Establece tus alianzas.'
king_help_3: 'Establece tus enemistades.'
@@ -2061,3 +2065,14 @@ 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."
diff --git a/Towny/src/main/resources/lang/es-EC.yml b/Towny/src/main/resources/lang/es-EC.yml
index 692cd79177..f11af06139 100644
--- a/Towny/src/main/resources/lang/es-EC.yml
+++ b/Towny/src/main/resources/lang/es-EC.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ayuda del Líder de Nación'
king_help_2: 'Establece tus alianzas.'
king_help_3: 'Establece tus enemistades.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/es-ES.yml b/Towny/src/main/resources/lang/es-ES.yml
index 116d1827b6..a78e1ae599 100644
--- a/Towny/src/main/resources/lang/es-ES.yml
+++ b/Towny/src/main/resources/lang/es-ES.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ayuda del Líder de Nación'
king_help_2: 'Elige tus aliados.'
king_help_3: 'Elige tus enemigos.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/es-MX.yml b/Towny/src/main/resources/lang/es-MX.yml
index bf73f84c45..a64fb615e7 100644
--- a/Towny/src/main/resources/lang/es-MX.yml
+++ b/Towny/src/main/resources/lang/es-MX.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ayuda del Líder de Nación'
king_help_2: 'Establece tus alianzas.'
king_help_3: 'Establece tus enemistades.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/es-UY.yml b/Towny/src/main/resources/lang/es-UY.yml
index 692cd79177..f11af06139 100644
--- a/Towny/src/main/resources/lang/es-UY.yml
+++ b/Towny/src/main/resources/lang/es-UY.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ayuda del Líder de Nación'
king_help_2: 'Establece tus alianzas.'
king_help_3: 'Establece tus enemistades.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/es-VE.yml b/Towny/src/main/resources/lang/es-VE.yml
index 692cd79177..f11af06139 100644
--- a/Towny/src/main/resources/lang/es-VE.yml
+++ b/Towny/src/main/resources/lang/es-VE.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ayuda del Líder de Nación'
king_help_2: 'Establece tus alianzas.'
king_help_3: 'Establece tus enemistades.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/fr-FR.yml b/Towny/src/main/resources/lang/fr-FR.yml
index e384689f67..aa6282d70e 100644
--- a/Towny/src/main/resources/lang/fr-FR.yml
+++ b/Towny/src/main/resources/lang/fr-FR.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Aides du Dirigeant de Nation'
king_help_2: 'Gérer vos alliances.'
king_help_3: 'Gérer vos ennemis.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/he-IL.yml b/Towny/src/main/resources/lang/he-IL.yml
index 6a40cb7fa5..3262182c0a 100644
--- a/Towny/src/main/resources/lang/he-IL.yml
+++ b/Towny/src/main/resources/lang/he-IL.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Leader Help'
king_help_2: 'קבע את בעלי הברית שלך.'
king_help_3: 'קבע את האויבים שלך.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/id-ID.yml b/Towny/src/main/resources/lang/id-ID.yml
index c1420cf3a2..2169ff62a6 100644
--- a/Towny/src/main/resources/lang/id-ID.yml
+++ b/Towny/src/main/resources/lang/id-ID.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Bantuan Pemimpin Negara'
king_help_2: 'Atur sekutu kamu.'
king_help_3: 'Atur musuh kamu.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/it-IT.yml b/Towny/src/main/resources/lang/it-IT.yml
index 7ce5c653c8..ee9832ecf0 100644
--- a/Towny/src/main/resources/lang/it-IT.yml
+++ b/Towny/src/main/resources/lang/it-IT.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Guida del Re della nazione'
king_help_2: 'Scegli le tue alleanze.'
king_help_3: 'Scegli i tuoi nemici.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/ja-JP.yml b/Towny/src/main/resources/lang/ja-JP.yml
index 2ad017a5f1..667ed0d7ab 100644
--- a/Towny/src/main/resources/lang/ja-JP.yml
+++ b/Towny/src/main/resources/lang/ja-JP.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "国家の平和な状態を切り替えます。"
nation_toggle_help_1: "公開状態を切り替え、居住者でない人が /n spawnを使用できるようにします。"
nation_toggle_help_2: "オープンステータスを切り替え、招待なしで参加できるようにする。"
nation_toggle_help_3: "税率を切り替えて、町が固定税率ではなく割合で支払うようにします。"
+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."
king_help_1: '国家リーダーヘルプ'
king_help_2: '同盟を設定'
king_help_3: '敵を設定'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/ko-KR.yml b/Towny/src/main/resources/lang/ko-KR.yml
index 7f05efcceb..6d5e81ecc5 100644
--- a/Towny/src/main/resources/lang/ko-KR.yml
+++ b/Towny/src/main/resources/lang/ko-KR.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: '국가 리더 도움말'
king_help_2: '동맹국 설정'
king_help_3: '적국 설정'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/lol-US.yml b/Towny/src/main/resources/lang/lol-US.yml
index 99783816c1..b7f8992ca7 100644
--- a/Towny/src/main/resources/lang/lol-US.yml
+++ b/Towny/src/main/resources/lang/lol-US.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Halp 4 royel kitteh'
king_help_2: 'Set your alliance.'
king_help_3: 'Set your enemies.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/lt-LT.yml b/Towny/src/main/resources/lang/lt-LT.yml
index 027687718e..68095ba40a 100644
--- a/Towny/src/main/resources/lang/lt-LT.yml
+++ b/Towny/src/main/resources/lang/lt-LT.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Pakeičia valstybės taikumo būseną."
nation_toggle_help_1: "Paskelbia valstybę vieša, leidžiant nepiliečiams naudotis Jūsų valstybės /n spawn."
nation_toggle_help_2: "Paskelbia valstybę atvira, leidžiant miestams prisijungti prie jos be pakvietimo."
nation_toggle_help_3: "Įtvirtina procentinius mokesčius, todėl miestai mokėtų tam tikrą dalį pinigų nuo savo banko vietoj fiksuoto dydžio."
+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."
king_help_1: 'Valstybės Vadovo Komandos'
king_help_2: 'Tvarkyti aljansų sąrašą.'
king_help_3: 'Tvarkyti priešiškų valstybių sąrašą.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Be pavadinimo"
+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."
diff --git a/Towny/src/main/resources/lang/lzh.yml b/Towny/src/main/resources/lang/lzh.yml
index 80bc3f58f1..cd8c2d7f81 100644
--- a/Towny/src/main/resources/lang/lzh.yml
+++ b/Towny/src/main/resources/lang/lzh.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: '國君之助'
king_help_2: '設汝之友。'
king_help_3: '設汝之敵。'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "未命名"
+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."
diff --git a/Towny/src/main/resources/lang/nl-NL.yml b/Towny/src/main/resources/lang/nl-NL.yml
index 4eeba801c3..28a67a6ba0 100644
--- a/Towny/src/main/resources/lang/nl-NL.yml
+++ b/Towny/src/main/resources/lang/nl-NL.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Natie Leider Help'
king_help_2: 'Stel je alliantie in.'
king_help_3: 'Stel je vijanden in.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/no-NO.yml b/Towny/src/main/resources/lang/no-NO.yml
index 942898a446..8bab1a36d7 100644
--- a/Towny/src/main/resources/lang/no-NO.yml
+++ b/Towny/src/main/resources/lang/no-NO.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nasjonsleder Hjelp'
king_help_2: 'Sett din allianse.'
king_help_3: 'Sett din fiende.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/pl-PL.yml b/Towny/src/main/resources/lang/pl-PL.yml
index ccfcc21b63..86e625a490 100644
--- a/Towny/src/main/resources/lang/pl-PL.yml
+++ b/Towny/src/main/resources/lang/pl-PL.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Przełącza stan pokojowy nacji."
nation_toggle_help_1: "Przełącza status publiczny, pozwalając graczom spoza nacji użyć /n spawn."
nation_toggle_help_2: "Przełącza status otwarty, pozwalając miastom dołączyć bez zaproszenia."
nation_toggle_help_3: "Przełącza obowiązywanie podatku procentowego. Miasta będą płaciły procent od posiadanych pieniędzy, zamiast stałej stawki."
+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."
king_help_1: 'Pomoc Lidera Nacji'
king_help_2: 'Wyznacz swoich sojuszników.'
king_help_3: 'Wyznacz swoich wrogów.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/pt-BR.yml b/Towny/src/main/resources/lang/pt-BR.yml
index b32ceec9d1..e497a61d8c 100644
--- a/Towny/src/main/resources/lang/pt-BR.yml
+++ b/Towny/src/main/resources/lang/pt-BR.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: ""
nation_toggle_help_1: "Alterna o status público, permitindo que não residentes usem /n spawn."
nation_toggle_help_2: "Alterna o estado aberto, permitindo as cidades entrarem sem um convite."
nation_toggle_help_3: "Alterna o percentual de imposto, fazendo com que as cidades paguem uma porcentagem em vez de uma taxa fixa."
+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."
king_help_1: 'Ajuda do Líder da Nação'
king_help_2: 'Definir alianças.'
king_help_3: 'Definir inimigos.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/pt-PT.yml b/Towny/src/main/resources/lang/pt-PT.yml
index 6963d7d047..ada160e4b3 100644
--- a/Towny/src/main/resources/lang/pt-PT.yml
+++ b/Towny/src/main/resources/lang/pt-PT.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ajuda do Líder da Nação'
king_help_2: 'Define os teus aliados.'
king_help_3: 'Define os teus inimigos.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/ro-RO.yml b/Towny/src/main/resources/lang/ro-RO.yml
index a234a3b671..ba3a7ac7ab 100644
--- a/Towny/src/main/resources/lang/ro-RO.yml
+++ b/Towny/src/main/resources/lang/ro-RO.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ajutor pentru lideri de naţiune'
king_help_2: 'Setează-ți alianța.'
king_help_3: 'Setează-ți dușmanii.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/ru-RU.yml b/Towny/src/main/resources/lang/ru-RU.yml
index ef56863468..4004643439 100644
--- a/Towny/src/main/resources/lang/ru-RU.yml
+++ b/Towny/src/main/resources/lang/ru-RU.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Помощь для лидеров наций'
king_help_2: 'Установить альянс.'
king_help_3: 'Установить врагов.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/sq-AL.yml b/Towny/src/main/resources/lang/sq-AL.yml
index ca54b3d245..59fe5f8576 100644
--- a/Towny/src/main/resources/lang/sq-AL.yml
+++ b/Towny/src/main/resources/lang/sq-AL.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Leader Help'
king_help_2: 'Set your alliance.'
king_help_3: 'Set your enemies.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/sr-CS.yml b/Towny/src/main/resources/lang/sr-CS.yml
index c3f1fe9faa..0e9d855291 100644
--- a/Towny/src/main/resources/lang/sr-CS.yml
+++ b/Towny/src/main/resources/lang/sr-CS.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Pomoc vodji nacije'
king_help_2: 'Postavite svoj savez.'
king_help_3: 'Postavite svoje protivnike.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/sv-SE.yml b/Towny/src/main/resources/lang/sv-SE.yml
index c8347324e4..7082180614 100644
--- a/Towny/src/main/resources/lang/sv-SE.yml
+++ b/Towny/src/main/resources/lang/sv-SE.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Hjälp med nationens ledare'
king_help_2: 'Bestäm dina allierade.'
king_help_3: 'Bestäm dina fiender.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/th-TH.yml b/Towny/src/main/resources/lang/th-TH.yml
index 4392860d48..3888c586e4 100644
--- a/Towny/src/main/resources/lang/th-TH.yml
+++ b/Towny/src/main/resources/lang/th-TH.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Nation Leader Help'
king_help_2: 'Set your alliance.'
king_help_3: 'Set your enemies.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/tl-PH.yml b/Towny/src/main/resources/lang/tl-PH.yml
index 75581e5012..0265652cd6 100644
--- a/Towny/src/main/resources/lang/tl-PH.yml
+++ b/Towny/src/main/resources/lang/tl-PH.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Tulong sa Pinuno ng Bansa'
king_help_2: 'Itakda ang iyong alyansa.'
king_help_3: 'Itakda ang iyong mga kalaban.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/tr-TR.yml b/Towny/src/main/resources/lang/tr-TR.yml
index e06d82faef..7ce8dc2a1c 100644
--- a/Towny/src/main/resources/lang/tr-TR.yml
+++ b/Towny/src/main/resources/lang/tr-TR.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Ulus Lideri Yardımı'
king_help_2: 'İttifakınızı kurun.'
king_help_3: 'Düşmanlarınızı ayarlayın.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/uk-UA.yml b/Towny/src/main/resources/lang/uk-UA.yml
index c7dead33df..a3532813cd 100644
--- a/Towny/src/main/resources/lang/uk-UA.yml
+++ b/Towny/src/main/resources/lang/uk-UA.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /n spawn."
nation_toggle_help_2: "Перемикає відкритий статус, дозволяючи містам приєднуватися без запрошення."
nation_toggle_help_3: "Перемикає податкові відсотки, що сплачують міста відсотковою ставкою, а не фіксованою."
+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."
king_help_1: 'Допомога лідеру нації'
king_help_2: 'Установити альянс.'
king_help_3: 'Визначити ворогів.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "Ви не можете зробити цього з NP
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "Жодною земельною ділянкою гравець особисто не володіє."
msg_unnamed: "Безіменне"
+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."
diff --git a/Towny/src/main/resources/lang/vi-VN.yml b/Towny/src/main/resources/lang/vi-VN.yml
index 351a3ee72c..96b16fd781 100644
--- a/Towny/src/main/resources/lang/vi-VN.yml
+++ b/Towny/src/main/resources/lang/vi-VN.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: 'Trợ giúp dành cho lãnh đạo quốc gia'
king_help_2: 'Đặt liên minh của bạn.'
king_help_3: 'Đặt kẻ thù của bạn.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/zh-CN.yml b/Towny/src/main/resources/lang/zh-CN.yml
index 393361254c..14828caf56 100644
--- a/Towny/src/main/resources/lang/zh-CN.yml
+++ b/Towny/src/main/resources/lang/zh-CN.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "切换国家“公开”的状态,允许不是居民的玩家使用/n spawn。"
nation_toggle_help_2: "切换国家“开放”的状态,允许没有被邀请的城市加入。"
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."
king_help_1: '国家领导者帮助'
king_help_2: '设置你的盟国.'
king_help_3: '设置你的敌国.'
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "Unnamed"
+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."
diff --git a/Towny/src/main/resources/lang/zh-TW.yml b/Towny/src/main/resources/lang/zh-TW.yml
index e2181f3e1e..10c304d8ba 100644
--- a/Towny/src/main/resources/lang/zh-TW.yml
+++ b/Towny/src/main/resources/lang/zh-TW.yml
@@ -175,6 +175,10 @@ nation_toggle_help_0: "Toggles peaceful status of the nation."
nation_toggle_help_1: "Toggles public status, allowing non-residents to use /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."
king_help_1: '元首幫助'
king_help_2: '設定你的盟邦 '
king_help_3: '設定你的敵國 '
@@ -2061,3 +2065,14 @@ msg_err_resident_is_npc: "You cannot do this to an NPC resident."
#Message shown when a resident doesn't own any land and the /res plotlist command is used.
msg_err_resident_doesnt_own_any_land: "The resident does not own any land personally."
msg_unnamed: "未命名"
+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."
diff --git a/Towny/src/main/resources/plugin.yml b/Towny/src/main/resources/plugin.yml
index 4986906125..240434f3fb 100644
--- a/Towny/src/main/resources/plugin.yml
+++ b/Towny/src/main/resources/plugin.yml
@@ -60,7 +60,6 @@ permissions:
towny.command.townyworld.*: true
towny.command.towny.*: true
towny.command.town.*: true
- towny.command.town.claim.town.multiple: true
towny.command.nation.*: true
towny.command.plot.*: true
towny.town.resident: true
@@ -424,7 +423,6 @@ permissions:
children:
towny.command.town.claim.town: true
towny.command.town.claim.outpost: true
- towny.command.town.claim.town.multiple: false
towny.command.town.claim.fill: true
towny.command.town.invite.*:
diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/test/BonusBlockPurchaseTests.java b/Towny/src/test/java/com/palmergames/bukkit/towny/test/BonusBlockPurchaseTests.java
index dbeb623cc1..793505ccdf 100644
--- a/Towny/src/test/java/com/palmergames/bukkit/towny/test/BonusBlockPurchaseTests.java
+++ b/Towny/src/test/java/com/palmergames/bukkit/towny/test/BonusBlockPurchaseTests.java
@@ -22,8 +22,8 @@ static void init() {
town = new Town("test");
// No limit on bought townblocks
- TownySettings.getConfig().set(ConfigNodes.TOWN_MAX_PURCHASED_BLOCKS.getRoot(), Integer.MAX_VALUE);
- TownySettings.getConfig().set(ConfigNodes.TOWN_MAX_PURCHASED_BLOCKS_USES_TOWN_LEVELS.getRoot(), false);
+ TownySettings.getConfig().set(ConfigNodes.CLAIMING_MAX_PURCHASED_BLOCKS.getRoot(), Integer.MAX_VALUE);
+ TownySettings.getConfig().set(ConfigNodes.CLAIMING_MAX_PURCHASED_BLOCKS_USES_TOWN_LEVELS.getRoot(), false);
}
@BeforeEach
diff --git a/providers/BaseProviders/pom.xml b/providers/BaseProviders/pom.xml
index 2a25b63e4c..40dd13ff62 100644
--- a/providers/BaseProviders/pom.xml
+++ b/providers/BaseProviders/pom.xml
@@ -46,7 +46,7 @@
org.apache.maven.pluginsmaven-compiler-plugin
- 3.11.0
+ 3.12.18
diff --git a/providers/FoliaProvider/pom.xml b/providers/FoliaProvider/pom.xml
index 320e7504e4..35875a0901 100644
--- a/providers/FoliaProvider/pom.xml
+++ b/providers/FoliaProvider/pom.xml
@@ -47,7 +47,7 @@
org.apache.maven.pluginsmaven-compiler-plugin
- 3.11.0
+ 3.12.18
diff --git a/providers/PaperProvider/pom.xml b/providers/PaperProvider/pom.xml
index ce2e65c76e..0ffb13f217 100644
--- a/providers/PaperProvider/pom.xml
+++ b/providers/PaperProvider/pom.xml
@@ -47,7 +47,7 @@
org.apache.maven.pluginsmaven-compiler-plugin
- 3.11.0
+ 3.12.18