Skip to content

Commit

Permalink
Adds ability to override a town's NationZone.
Browse files Browse the repository at this point in the history
  - New Command: /ta set nationzoneoverride [town] [size]
    - Sets a town's nationzone override.
  - Closes #4915.
  - New Permission Node: towny.command.townyadmin.set.nationzoneoverride
    - Child node of towny.command.townyadmin.set.*

Fix up feedback, helpmenus, negative values.
  • Loading branch information
LlmDl committed Oct 4, 2021
1 parent ff8b842 commit 52ee579
Show file tree
Hide file tree
Showing 10 changed files with 75 additions and 5 deletions.
4 changes: 3 additions & 1 deletion resources/lang/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1537,4 +1537,6 @@ status_joined_town: 'Joined town:'
#Used in the town screen's nation hover, to denote when a town joined a nation.
status_joined_nation: 'Joined nation:'
#Shown in status screen elements where a value is not known.
status_unknown: 'unknown'
status_unknown: 'unknown'
#Feedback given for the /ta set nationzoneoverride [townname] [size] command.
msg_nationzone_override_set_to: '%s has had their nationzone override set to %s.'
1 change: 1 addition & 0 deletions resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,7 @@ permissions:
children:
towny.command.townyadmin.set.capital: true
towny.command.townyadmin.set.mayor: true
towny.command.townyadmin.set.nationzoneoverride: true
towny.command.townyadmin.set.plot: true
towny.command.townyadmin.set.surname: true
towny.command.townyadmin.set.title: true
Expand Down
8 changes: 5 additions & 3 deletions src/com/palmergames/bukkit/towny/TownyAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -607,11 +607,13 @@ public TownBlockStatus hasNationZone(WorldCoord worldCoord) {
}

try {
int nationZoneRadius = Integer.parseInt(TownySettings.getNationLevel(TownyAPI.getInstance().getTownNationOrNull(nearestTown)).get(TownySettings.NationLevel.NATIONZONES_SIZE).toString());
int nationZoneRadius = Integer.parseInt(TownySettings.getNationLevel(nearestTown.getNationOrNull()).get(TownySettings.NationLevel.NATIONZONES_SIZE).toString());

if (nearestTown.isCapital()) {
if (nearestTown.isCapital())
nationZoneRadius += TownySettings.getNationZonesCapitalBonusSize();
}

if (nearestTown.hasNationZoneOverride())
nationZoneRadius = nearestTown.getNationZoneOverride();

if (distance <= nationZoneRadius) {
NationZoneTownBlockStatusEvent event = new NationZoneTownBlockStatusEvent(nearestTown);
Expand Down
10 changes: 10 additions & 0 deletions src/com/palmergames/bukkit/towny/command/HelpMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ protected MenuBuilder load() {
.add("mayor [town] " + Translation.of("town_help_2"), "")
.add("mayor [town] npc", "")
.add("capital [town] [nation]", "")
.add("nationzoneoverride [town name] [size]", "")
.add("title [resident] [title]", "")
.add("surname [resident] [surname]", "")
.add("plot [town]", "");
Expand Down Expand Up @@ -257,6 +258,15 @@ protected MenuBuilder load() {
}
},

TA_SET_NATIONZONE {
@Override
protected MenuBuilder load() {
return new MenuBuilder("townyadmin set nationzoneoverride")
.add("[town name] [size]", "")
.add("[town name] 0", "Removes the NationZone override.");
}
},

TA_PURGE {
@Override
protected MenuBuilder load() {
Expand Down
31 changes: 31 additions & 0 deletions src/com/palmergames/bukkit/towny/command/TownyAdminCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ public class TownyAdminCommand extends BaseCommand implements CommandExecutor {
"capital",
"title",
"surname",
"nationzoneoverride",
"plot"
);

Expand Down Expand Up @@ -264,6 +265,7 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
return filterByStartOrGetTownyStartingWith(Collections.singletonList("npc"), args[3], "+r");
}
case "capital":
case "nationzoneoverride":
case "plot":
if (args.length == 3)
return getTownyStartingWith(args[2], "t");
Expand Down Expand Up @@ -1872,7 +1874,36 @@ private void adminSet(String[] split) throws TownyException {
TownyMessaging.sendMessage(sender, Translatable.of("msg_clear_title_surname", "Surname", resident.getName()));
TownyMessaging.sendMessage(resident, Translatable.of("msg_clear_title_surname", "Surname", resident.getName()));
}
} else if (split[0].equalsIgnoreCase("nationzoneoverride")) {
if (!townyUniverse.getPermissionSource().testPermission(player, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_SET_NATIONZONE.getNode(split[0].toLowerCase())))
throw new TownyException(Translatable.of("msg_err_command_disable"));

if (split.length < 2) {
HelpMenu.TA_SET_NATIONZONE.send(sender);
return;
}

Town town = townyUniverse.getTown(split[1]);
if (town == null)
throw new TownyException(Translatable.of("msg_err_not_registered_1", split[1]));

int size;
try {
size = Integer.parseInt(split[2]);
} catch (NumberFormatException e) {
throw new TownyException(Translatable.of("msg_error_must_be_int"));
}

if (size < 0)
throw new TownyException(Translatable.of("msg_err_negative"));

town.setNationZoneOverride(size);
town.save();
if (size == 0)
TownyMessaging.sendMessage(sender, Translatable.of("msg_nationzone_override_removed", town.getName()));
else
TownyMessaging.sendMessage(sender, Translatable.of("msg_nationzone_override_set_to", town.getName(), size));

} else if (split[0].equalsIgnoreCase("plot")) {
if (!townyUniverse.getPermissionSource().testPermission(player, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_SET_PLOT.getNode(split[0].toLowerCase())))
throw new TownyException(Translatable.of("msg_err_command_disable"));
Expand Down
1 change: 1 addition & 0 deletions src/com/palmergames/bukkit/towny/db/SQL_Schema.java
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ private static List<String> getTownColumns() {
columns.add("`primaryJail` VARCHAR(36) DEFAULT NULL");
columns.add("`movedHomeBlockAt` BIGINT NOT NULL");
columns.add("`trustedResidents` mediumtext DEFAULT NULL");
columns.add("`nationZoneOverride` int(11) DEFAULT 0");
return columns;
}

Expand Down
9 changes: 8 additions & 1 deletion src/com/palmergames/bukkit/towny/db/TownyFlatFileSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -980,6 +980,13 @@ else if (universe.getReplacementNameMap().containsKey(line))
} else {
town.setMapColorHexCode(MapUtil.generateRandomTownColourAsHexCode());
}

line = keys.get("nationZoneOverride");
if (line != null)
try {
town.setNationZoneOverride(Integer.parseInt(line));
} catch (Exception ignored) {
}

} catch (Exception e) {
TownyMessaging.sendErrorMsg(Translation.of("flatfile_err_reading_town_file_at_line", town.getName(), line, town.getName()));
Expand Down Expand Up @@ -1974,7 +1981,7 @@ public boolean saveTown(Town town) {
list.add("trustedResidents=" + StringMgmt.join(toUUIDList(town.getTrustedResidents()), ","));

list.add("mapColorHexCode=" + town.getMapColorHexCode());

list.add("nationZoneOverride=" + town.getNationZoneOverride());

/*
* Make sure we only save in async
Expand Down
2 changes: 2 additions & 0 deletions src/com/palmergames/bukkit/towny/db/TownySQLSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -996,6 +996,7 @@ private boolean loadTown(ResultSet rs) {
town.setMovedHomeBlockAt(rs.getLong("movedHomeBlockAt"));

town.setPurchasedBlocks(rs.getInt("purchased"));
town.setNationZoneOverride(rs.getInt("nationZoneOverride"));

line = rs.getString("maxPercentTaxAmount");
if (line != null)
Expand Down Expand Up @@ -2123,6 +2124,7 @@ public synchronized boolean saveTown(Town town) {
twn_hm.put("protectionStatus", town.getPermissions().toString().replaceAll(",", "#"));
twn_hm.put("bonus", town.getBonusBlocks());
twn_hm.put("purchased", town.getPurchasedBlocks());
twn_hm.put("nationZoneOverride", town.getNationZoneOverride());
twn_hm.put("commercialPlotPrice", town.getCommercialPlotPrice());
twn_hm.put("commercialPlotTax", town.getCommercialPlotTax());
twn_hm.put("embassyPlotPrice", town.getEmbassyPlotPrice());
Expand Down
13 changes: 13 additions & 0 deletions src/com/palmergames/bukkit/towny/object/Town.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public class Town extends Government implements TownBlockOwner {
private boolean adminEnabledPVP = false; // This is a special setting to make a town ignore All PVP settings and keep PVP enabled. Overrides the admin disabled too.
private boolean isConquered = false;
private int conqueredDays;
private int nationZoneOverride = 0;
private final ConcurrentHashMap<WorldCoord, TownBlock> townBlocks = new ConcurrentHashMap<>();
private final TownyPermission permissions = new TownyPermission();
private boolean ruined = false;
Expand Down Expand Up @@ -1375,6 +1376,18 @@ public String getNationMapColorHexCode() {
public void save() {
TownyUniverse.getInstance().getDataSource().saveTown(this);
}

public int getNationZoneOverride() {
return nationZoneOverride;
}

public void setNationZoneOverride(int size) {
this.nationZoneOverride = size;
}

public boolean hasNationZoneOverride() {
return nationZoneOverride > 0;
}

/**
* @deprecated As of 0.96.0.0+ please use {@link EconomyAccount#getWorld()} instead.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ public enum PermissionNodes {
TOWNY_COMMAND_TOWNYADMIN_SET_CAPITAL("towny.command.townyadmin.set.capital"),
TOWNY_COMMAND_TOWNYADMIN_SET_TITLE("towny.command.townyadmin.set.title"),
TOWNY_COMMAND_TOWNYADMIN_SET_SURNAME("towny.command.townyadmin.set.surname"),
TOWNY_COMMAND_TOWNYADMIN_SET_NATIONZONE("towny.command.townyadmin.set.nationzoneoverride"),

TOWNY_COMMAND_TOWNYADMIN_PLOT("towny.command.townyadmin.plot.*"),
TOWNY_COMMAND_TOWNYADMIN_PLOT_CLAIM("towny.command.townyadmin.plot.claim"),
Expand Down

0 comments on commit 52ee579

Please sign in to comment.