Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added max residents per nation #6264

Merged
merged 5 commits into from
Oct 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion resources/lang/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1781,4 +1781,11 @@ msg_x_has_been_withdrawn_for_upkeep_of_prisoner_x: '%s withdrawn from Town bank
msg_x_has_been_withdrawn_for_jailing_of_prisoner_x: '%s withdrawn from Town bank to pay for jailing of %s.'

#Message shown in the confirmation for /ta resetbanks {amount}.
confirmation_are_you_sure_you_want_to_reset_all_banks: 'Are you sure you want to reset all town and nation banks to %s?'
confirmation_are_you_sure_you_want_to_reset_all_banks: 'Are you sure you want to reset all town and nation banks to %s?'

#Message shown when a nation cannot add a town because of the max-residents-limit.
msg_err_cannot_add_nation_over_resident_limit: '&cYour nation has reached the maximum number of allowed residents-per-nation, %s, and cannot add %s.'
#Message shown to a town when they cannot join a nation because of the max-residents-limit.
msg_err_cannot_join_nation_over_resident_limit: '&cYou cannot join this nation as it would be over the residents-per-nation limit of %s.'
#Message shown to a town because the nation has hit their max-towns-limit.
msg_err_cannot_join_nation_over_town_limit: '&cYou cannot join this nation, it has reached the maximum number of allowed towns-per-nation: %s.'
7 changes: 7 additions & 0 deletions src/com/palmergames/bukkit/config/ConfigNodes.java
Original file line number Diff line number Diff line change
Expand Up @@ -1099,6 +1099,13 @@ public enum ConfigNodes {
"",
"# If higher than 0, it will limit how many towns can be joined into a nation.",
"# Does not affect existing nations that are already over the limit."),
GNATION_SETTINGS_MAX_RESIDENTS_PER_NATION(
"global_nation_settings.max_residents_per_nation",
"0",
"",
"# If higher than 0, it will limit how many residents can join a nation.",
"# Does not affect existing nations that are already over the limit."
),
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",
Expand Down
4 changes: 4 additions & 0 deletions src/com/palmergames/bukkit/towny/TownySettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -2876,6 +2876,10 @@ public static boolean isNationSpawnOnlyAllowedInCapital() {
public static int getMaxTownsPerNation() {
return getInt(ConfigNodes.GNATION_SETTINGS_MAX_TOWNS_PER_NATION);
}

public static int getMaxResidentsPerNation() {
return getInt(ConfigNodes.GNATION_SETTINGS_MAX_RESIDENTS_PER_NATION);
}

public static double getSpawnTravelCost() {
return getDouble(ConfigNodes.ECO_PRICE_TOWN_SPAWN_TRAVEL_PUBLIC);
Expand Down
70 changes: 63 additions & 7 deletions src/com/palmergames/bukkit/towny/command/NationCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -662,12 +662,14 @@ private void parseNationJoin(Player player, String[] args) {
if (!nation.isOpen())
throw new TownyException(Translatable.of("msg_err_nation_not_open", nation.getFormattedName()));

if ((TownySettings.getNumResidentsJoinNation() > 0) && (town.getNumResidents() < TownySettings.getNumResidentsJoinNation()))
if (!testTownHasEnoughResidents(town))
throw new TownyException(Translatable.of("msg_err_not_enough_residents_join_nation", town.getName()));

if (TownySettings.getMaxTownsPerNation() > 0)
if (nation.getTowns().size() >= TownySettings.getMaxTownsPerNation())
throw new TownyException(Translatable.of("msg_err_nation_over_town_limit", TownySettings.getMaxTownsPerNation()));
if (!testNationMaxTowns(nation))
throw new TownyException(Translatable.of("msg_err_nation_over_town_limit", TownySettings.getMaxTownsPerNation()));

if (!testNationMaxResidents(nation, town))
throw new TownyException(Translatable.of("msg_err_cannot_add_nation_over_resident_limit", TownySettings.getMaxResidentsPerNation()));

if (TownySettings.getNationRequiresProximity() > 0) {
Coord capitalCoord = nation.getCapital().getHomeBlock().getCoord();
Expand Down Expand Up @@ -1189,7 +1191,7 @@ public void nationAdd(Player player, String[] names) throws TownyException {

Nation nation = getNationFromPlayerOrThrow(player);

if (TownySettings.getMaxTownsPerNation() > 0 && nation.getTowns().size() >= TownySettings.getMaxTownsPerNation())
if (testNationMaxTowns(nation))
throw new TownyException(Translatable.of("msg_err_nation_over_town_limit", TownySettings.getMaxTownsPerNation()));

// The list of valid invites.
Expand All @@ -1203,11 +1205,28 @@ public void nationAdd(Player player, String[] names) throws TownyException {
continue;
}

if (nation.hasTown(townname)) {
Town town = null;
try {
town = getTownOrThrow(townname);
} catch (NotRegisteredException e) {
// The Town doesn't actually exist or was mis-spelled.
removeinvites.add(townname);
continue;
}

if (nation.hasTown(town) || town.hasNation()) {
// Town is already part of the nation.
removeinvites.add(townname);
continue;
}

if (testNationMaxResidents(nation, town)) {
// Town has too many residents to join the nation
removeinvites.add(townname);
TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_cannot_join_nation_over_resident_limit", TownySettings.getMaxResidentsPerNation(), townname));
continue;
}

// add them to adding.
newtownlist.add(townname);
}
Expand Down Expand Up @@ -1247,7 +1266,7 @@ public static void nationAdd(Player player, Nation nation, List<Town> invited) t
continue;
}

if (TownySettings.getNumResidentsJoinNation() > 0 && town.getNumResidents() < TownySettings.getNumResidentsJoinNation()) {
if (!testTownHasEnoughResidents(town)) {
remove.add(town);
TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_not_enough_residents_join_nation", town.getName()));
continue;
Expand Down Expand Up @@ -1305,6 +1324,27 @@ public static void nationAdd(Player player, Nation nation, List<Town> invited) t
public static void nationAdd(Nation nation, List<Town> towns) throws AlreadyRegisteredException {
for (Town town : towns) {
if (!town.hasNation()) {
if (!testNationMaxTowns(nation)) {
// Nation has hit the max-towns limit.
TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_err_nation_over_town_limit", TownySettings.getMaxTownsPerNation()));
TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_err_cannot_join_nation_over_town_limit", TownySettings.getMaxTownsPerNation()));
continue;
}

if (!testTownHasEnoughResidents(town)) {
// Town has dropped below min.-residents-to-join-nation limit.
TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_err_not_enough_residents_join_nation", town.getName()));
TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_err_not_enough_residents_join_nation", town.getName()));
continue;
}

if (!testNationMaxResidents(nation, town)) {
// Nation has hit the max-residents limit.
TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_err_cannot_add_nation_over_resident_limit", TownySettings.getMaxResidentsPerNation(), town.getName()));
TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_err_cannot_join_nation_over_resident_limit", TownySettings.getMaxResidentsPerNation()));
continue;
}

town.setNation(nation);
town.save();
TownyMessaging.sendPrefixedNationMessage(nation, Translatable.of("msg_join_nation", town.getName()));
Expand All @@ -1316,6 +1356,22 @@ public static void nationAdd(Nation nation, List<Town> towns) throws AlreadyRegi

}

private static boolean testNationMaxResidents(Nation nation, Town town) {
int maxResidentPerNation = TownySettings.getMaxResidentsPerNation();
if (maxResidentPerNation < 1)
return true;
return nation.getResidents().size() + town.getResidents().size() > maxResidentPerNation;

}

private static boolean testTownHasEnoughResidents(Town town) {
return TownySettings.getNumResidentsJoinNation() > 0 && town.getNumResidents() < TownySettings.getNumResidentsJoinNation();
}

private static boolean testNationMaxTowns(Nation nation) {
return TownySettings.getMaxTownsPerNation() > 0 && nation.getTowns().size() >= TownySettings.getMaxTownsPerNation();
}

private static void nationRevokeInviteTown(CommandSender sender, Nation nation, List<Town> towns) {

for (Town town : towns) {
Expand Down