diff --git a/README.md b/README.md
index 595aa439..fe38dba2 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ View the Spigot page (with FAQ and install instructions) [here](https://www.spig
Check the [wiki](https://github.com/espidev/ProtectionStones/wiki) for plugin reference information.
### Dependencies
-* ProtectionStones 2.10.5
+* ProtectionStones 2.10.6
* Spigot 1.20.6+
* WorldGuard 7.0.9+
* WorldEdit 7.2.6+
diff --git a/pom.xml b/pom.xml
index 37940957..3e0ec5cf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
dev.espi
protectionstones
- 2.10.5
+ 2.10.7
ProtectionStones
A grief prevention plugin for Spigot Minecraft servers.
https://github.com/espidev/ProtectionStones
@@ -207,13 +207,13 @@
org.spigotmc
spigot-api
- 1.20.6-R0.1-SNAPSHOT
+ 1.21.3-R0.1-SNAPSHOT
provided
com.sk89q.worldguard
worldguard-bukkit
- 7.0.9-SNAPSHOT
+ 7.0.14-SNAPSHOT
provided
@@ -231,7 +231,7 @@
com.sk89q.worldedit
worldedit-bukkit
- 7.2.6-SNAPSHOT
+ 7.3.16-SNAPSHOT
provided
@@ -240,6 +240,36 @@
+
+ net.kyori
+ adventure-api
+ 4.17.0
+ compile
+
+
+ net.kyori
+ adventure-platform-bukkit
+ 4.3.2
+ compile
+
+
+ net.kyori
+ adventure-text-serializer-plain
+ 4.17.0
+ compile
+
+
+ net.kyori
+ adventure-text-serializer-bungeecord
+ 4.4.1
+ compile
+
+
+ net.kyori
+ adventure-text-minimessage
+ 4.17.0
+ compile
+
me.clip
placeholderapi
diff --git a/src/main/java/dev/espi/protectionstones/BlockHandler.java b/src/main/java/dev/espi/protectionstones/BlockHandler.java
index 891a7650..c3d37003 100644
--- a/src/main/java/dev/espi/protectionstones/BlockHandler.java
+++ b/src/main/java/dev/espi/protectionstones/BlockHandler.java
@@ -30,6 +30,7 @@
import dev.espi.protectionstones.utils.MiscUtil;
import dev.espi.protectionstones.utils.WGMerge;
import dev.espi.protectionstones.utils.WGUtils;
+import net.kyori.adventure.text.Component;
import net.md_5.bungee.api.chat.TextComponent;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.*;
@@ -37,10 +38,7 @@
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockPlaceEvent;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
public class BlockHandler {
private static HashMap lastProtectStonePlaced = new HashMap<>();
@@ -140,7 +138,7 @@ public static boolean createPSRegion(Player p, Location l, PSProtectBlock blockO
if (ProtectionStones.getInstance().getConfigOptions().placingCooldown != -1) {
String time = checkCooldown(p);
if (time != null) {
- PSL.msg(p, PSL.COOLDOWN.msg().replace("%time%", time));
+ PSL.msg(p, PSL.COOLDOWN.replace("%time%", time));
return false;
}
}
@@ -168,7 +166,7 @@ public static boolean createPSRegion(Player p, Location l, PSProtectBlock blockO
// check if player has enough money
if (ProtectionStones.getInstance().isVaultSupportEnabled() && blockOptions.costToPlace != 0 && !ProtectionStones.getInstance().getVaultEconomy().has(p, blockOptions.costToPlace)) {
- PSL.msg(p, PSL.NOT_ENOUGH_MONEY.msg().replace("%price%", String.format("%.2f", blockOptions.costToPlace)));
+ PSL.msg(p, PSL.NOT_ENOUGH_MONEY.replace("%price%", String.format("%.2f", blockOptions.costToPlace)));
return false;
}
@@ -183,10 +181,10 @@ public static boolean createPSRegion(Player p, Location l, PSProtectBlock blockO
if (ProtectionStones.getInstance().isVaultSupportEnabled() && blockOptions.costToPlace != 0) {
EconomyResponse er = ProtectionStones.getInstance().getVaultEconomy().withdrawPlayer(p, blockOptions.costToPlace);
if (!er.transactionSuccess()) {
- PSL.msg(p, er.errorMessage);
+ PSL.msg(p, Component.text(er.errorMessage));
return true;
}
- PSL.msg(p, PSL.PAID_MONEY.msg().replace("%price%", String.format("%.2f", blockOptions.costToPlace)));
+ PSL.msg(p, PSL.PAID_MONEY.replace("%price%", String.format("%.2f", blockOptions.costToPlace)));
}
return true;
@@ -214,7 +212,7 @@ public static boolean createActualRegion(Player p, Location l, PSProtectBlock bl
// check for minimum distance between claims by using fake region
if (blockOptions.distanceBetweenClaims != -1 && !p.hasPermission("protectionstones.superowner")) {
if (!isFarEnoughFromOtherClaims(blockOptions, p.getWorld(), lp, bx, by, bz)) {
- PSL.msg(p, PSL.REGION_TOO_CLOSE.msg().replace("%num%", "" + blockOptions.distanceBetweenClaims));
+ PSL.msg(p, PSL.REGION_TOO_CLOSE.replace("%num%", "" + blockOptions.distanceBetweenClaims));
return false;
}
}
@@ -315,7 +313,7 @@ private static void playerMergeTask(Player p, PSRegion r) {
Bukkit.getScheduler().runTaskAsynchronously(ProtectionStones.getInstance(), () -> {
try {
WGMerge.mergeRealRegions(p.getWorld(), r.getWGRegionManager(), finalMergeTo, Arrays.asList(finalMergeTo, r));
- PSL.msg(p, PSL.MERGE_AUTO_MERGED.msg().replace("%region%", finalMergeTo.getId()));
+ PSL.msg(p, PSL.MERGE_AUTO_MERGED.replace("%region%", finalMergeTo.getId()));
} catch (WGMerge.RegionHoleException e) {
PSL.msg(p, PSL.NO_REGION_HOLES.msg()); // TODO github issue #120, prevent holes even if showGUI is true
} catch (WGMerge.RegionCannotMergeWhileRentedException e) {
@@ -327,14 +325,21 @@ private static void playerMergeTask(Player p, PSRegion r) {
// show merge gui
if (showGUI) {
- List tc = ArgMerge.getGUI(p, r);
+ List tc = ArgMerge.getGUI(p, r);
if (!tc.isEmpty()) { // if there are regions you can merge into
- p.sendMessage(ChatColor.WHITE + ""); // send empty line
+ PSL.msg(p, Component.empty());
PSL.msg(p, PSL.MERGE_INTO.msg());
- PSL.msg(p, PSL.MERGE_HEADER.msg().replace("%region%", r.getId()));
- for (TextComponent t : tc) p.spigot().sendMessage(t);
- p.sendMessage(ChatColor.WHITE + ""); // send empty line
+ PSL.msg(p, PSL.MERGE_HEADER.replaceAll(Map.of("%region%", r.getId())));
+
+ // GUI entries
+ for (Component t : tc) {
+ PSL.msg(p, t);
+ }
+
+ // empty line again
+ PSL.msg(p, Component.empty());
}
}
+
}
}
diff --git a/src/main/java/dev/espi/protectionstones/ListenerClass.java b/src/main/java/dev/espi/protectionstones/ListenerClass.java
index 783de998..9c33db3a 100644
--- a/src/main/java/dev/espi/protectionstones/ListenerClass.java
+++ b/src/main/java/dev/espi/protectionstones/ListenerClass.java
@@ -29,14 +29,14 @@
import dev.espi.protectionstones.utils.RecipeUtil;
import dev.espi.protectionstones.utils.UUIDCache;
import dev.espi.protectionstones.utils.WGUtils;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-import org.bukkit.block.BlockState;
-import org.bukkit.block.Furnace;
+import org.bukkit.block.*;
+import org.bukkit.block.data.type.Crafter;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
@@ -53,7 +53,7 @@
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
-import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.*;
import java.util.List;
@@ -92,7 +92,7 @@ public void onPlayerJoin(PlayerJoinEvent e) {
}
if (amount != 0) {
- PSL.msg(psp, PSL.TAX_JOIN_MSG_PENDING_PAYMENTS.msg().replace("%money%", "" + amount));
+ PSL.msg(psp.getPlayer(), PSL.TAX_JOIN_MSG_PENDING_PAYMENTS.replace("%money%", "" + amount));
}
});
}
@@ -137,7 +137,7 @@ public void onBlockPlace(BlockPlaceEvent e) {
// returns the error message, or "" if the player has permission to break the region
// TODO: refactor and move this to PSRegion, so that /ps unclaim can use the same checks
- private String checkPermissionToBreakProtection(Player p, PSRegion r) {
+ private Component checkPermissionToBreakProtection(Player p, PSRegion r) {
// check for destroy permission
if (!p.hasPermission("protectionstones.destroy")) {
return PSL.NO_PERMISSION_DESTROY.msg();
@@ -153,7 +153,7 @@ private String checkPermissionToBreakProtection(Player p, PSRegion r) {
return PSL.RENT_CANNOT_BREAK_WHILE_RENTING.msg();
}
- return "";
+ return Component.empty();
}
// helper method for breaking protection blocks
@@ -162,8 +162,8 @@ private boolean playerBreakProtection(Player p, PSRegion r) {
PSProtectBlock blockOptions = r.getTypeOptions();
// check if player has permission to break the protection
- String error = checkPermissionToBreakProtection(p, r);
- if (!error.isEmpty()) {
+ Component error = checkPermissionToBreakProtection(p, r);
+ if (!error.contains(Component.empty())) {
PSL.msg(p, error);
return false;
}
@@ -220,6 +220,7 @@ public void onPlayerInteract(PlayerInteractEvent e) {
// thus we should cancel the event here if possible (so other plugins don't start acting upon it)
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onBlockBreakLowPriority(BlockBreakEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onBlockBreakLowPriority");
Player p = e.getPlayer();
Block pb = e.getBlock();
@@ -228,8 +229,11 @@ public void onBlockBreakLowPriority(BlockBreakEvent e) {
// check if player has permission to break the protection
PSRegion r = PSRegion.fromLocation(pb.getLocation());
if (r != null) {
- String error = checkPermissionToBreakProtection(p, r);
- if (!error.isEmpty()) {
+ ProtectionStones.getInstance().debug("Player:"+ p.getName()+", Holding:"+ p.getPlayer().getInventory().getItemInMainHand().getType().name()+", Enchants:" +p.getPlayer().getInventory().getItemInMainHand().getEnchantments());
+
+
+ Component error = checkPermissionToBreakProtection(p, r);
+ if (!error.contains(Component.empty())) {
PSL.msg(p, error);
e.setCancelled(true);
}
@@ -238,6 +242,7 @@ public void onBlockBreakLowPriority(BlockBreakEvent e) {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onBlockBreak");
Player p = e.getPlayer();
Block pb = e.getBlock();
@@ -275,6 +280,7 @@ public void onBlockBreak(BlockBreakEvent e) {
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onFurnaceSmelt(FurnaceSmeltEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onFurnaceSmelt");
// prevent protect block item to be smelt
PSProtectBlock options = ProtectionStones.getBlockOptions(e.getSource());
if (options != null && !options.allowSmeltItem) {
@@ -284,6 +290,7 @@ public void onFurnaceSmelt(FurnaceSmeltEvent e) {
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onFurnaceBurnItem(FurnaceBurnEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onFurnaceBurnItem");
// prevent protect block item to be smelt
Furnace f = (Furnace) e.getBlock().getState();
if (f.getInventory().getSmelting() != null) {
@@ -299,6 +306,7 @@ public void onFurnaceBurnItem(FurnaceBurnEvent e) {
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onPrepareItemCraft(PrepareItemCraftEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onPrepareItemCraft");
for (ItemStack s : e.getInventory().getMatrix()) {
PSProtectBlock options = ProtectionStones.getBlockOptions(s);
if (options != null && !options.allowUseInCrafting) {
@@ -307,12 +315,30 @@ public void onPrepareItemCraft(PrepareItemCraftEvent e) {
}
}
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
+ public void onCrafter(CrafterCraftEvent e) {
+ Block block = e.getBlock();
+ BlockState state = block.getState();
+ if (block.getType() != Material.CRAFTER) return;
+ if (!(state instanceof Container container)) return;
+ Inventory inv = container.getInventory();
+ for (ItemStack item : inv.getContents()) {
+ if (item == null) continue;
+ PSProtectBlock options = ProtectionStones.getBlockOptions(item);
+ if (options != null && !options.allowUseInCrafting) {
+ e.setCancelled(true);
+ e.setResult(new ItemStack(Material.AIR));
+ }
+ }
+ }
+
// -=-=-=- disable grindstone inventory to prevent infinite exp exploit with enchanted_effect option -=-=-=-
// see https://github.com/espidev/ProtectionStones/issues/324
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onInventoryClickEvent(InventoryClickEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onInventoryClickEvent");
if (e.getInventory().getType() == InventoryType.GRINDSTONE) {
if (ProtectionStones.isProtectBlockItem(e.getCurrentItem())) {
e.setCancelled(true);
@@ -325,6 +351,7 @@ public void onInventoryClickEvent(InventoryClickEvent e) {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerBucketFill(PlayerBucketEmptyEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onPlayerBucketFill");
Block clicked = e.getBlockClicked();
BlockFace bf = e.getBlockFace();
Block check = clicked.getWorld().getBlockAt(clicked.getX() + e.getBlockFace().getModX(), clicked.getY() + bf.getModY(), clicked.getZ() + e.getBlockFace().getModZ());
@@ -335,6 +362,7 @@ public void onPlayerBucketFill(PlayerBucketEmptyEvent e) {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockIgnite(BlockIgniteEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onBlockIgnite");
if (ProtectionStones.isProtectBlock(e.getBlock())) {
e.setCancelled(true);
}
@@ -425,16 +453,19 @@ private void pistonUtil(List pushedBlocks, BlockPistonEvent e) {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockExplode(BlockExplodeEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onBlockExplode");
explodeUtil(e.blockList(), e.getBlock().getLocation().getWorld());
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityExplode(EntityExplodeEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onEntityExplode");
explodeUtil(e.blockList(), e.getLocation().getWorld());
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityChangeBlock(EntityChangeBlockEvent e) {
+ ProtectionStones.getInstance().debug("ListenerClass.java, onEntityChangeBlock");
if (!ProtectionStones.isProtectBlock(e.getBlock())) return;
// events like ender dragon block break, wither running into block break, etc.
diff --git a/src/main/java/dev/espi/protectionstones/PSEconomy.java b/src/main/java/dev/espi/protectionstones/PSEconomy.java
index f776e00f..ce8f9f2b 100644
--- a/src/main/java/dev/espi/protectionstones/PSEconomy.java
+++ b/src/main/java/dev/espi/protectionstones/PSEconomy.java
@@ -23,12 +23,14 @@
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.World;
+import org.bukkit.entity.Player;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
@@ -136,9 +138,13 @@ public static void processTaxes(PSRegion r) {
EconomyResponse res = r.payTax(psp, psp.getBalance());
if (psp.getPlayer() != null && res.amount != 0) {
- PSL.msg(psp.getPlayer(), PSL.TAX_PAID.msg()
- .replace("%amount%", String.format("%.2f", res.amount))
- .replace("%region%", r.getName() == null ? r.getId() : r.getName() + " (" + r.getId() + ")"));
+ PSL.msg(psp.getPlayer(),
+ PSL.TAX_PAID.replaceAll(Map.of(
+ "%amount%", String.format("%.2f", res.amount),
+ "%region%", r.getName() == null ? r.getId() : r.getName() + " (" + r.getId() + ")"
+ ))
+ );
+
}
}
@@ -157,49 +163,80 @@ public static void processTaxes(PSRegion r) {
* @param r the region to perform the rent payment
*/
public static void doRentPayment(PSRegion r) {
- PSPlayer tenant = PSPlayer.fromPlayer(Bukkit.getOfflinePlayer(r.getTenant()));
+ PSPlayer tenant = PSPlayer.fromPlayer(Bukkit.getOfflinePlayer(r.getTenant()));
PSPlayer landlord = PSPlayer.fromPlayer(Bukkit.getOfflinePlayer(r.getLandlord()));
+ final String regionName = (r.getName() != null ? r.getName() : r.getId());
+ final String priceStr = String.format("%.2f", r.getPrice());
+
// not enough money for rent
if (!tenant.hasAmount(r.getPrice())) {
- if (tenant.getOfflinePlayer().isOnline()) {
- PSL.msg(Bukkit.getPlayer(r.getTenant()), PSL.RENT_EVICT_NO_MONEY_TENANT.msg()
- .replace("%region%", r.getName() != null ? r.getName() : r.getId())
- .replace("%price%", String.format("%.2f", r.getPrice())));
+ Player tenantOnline = Bukkit.getPlayer(r.getTenant());
+ if (tenantOnline != null) {
+ PSL.msg(
+ tenantOnline,
+ PSL.RENT_EVICT_NO_MONEY_TENANT.replaceAll(Map.of(
+ "%region%", regionName,
+ "%price%", priceStr
+ ))
+ );
}
- if (landlord.getOfflinePlayer().isOnline()) {
- PSL.msg(Bukkit.getPlayer(r.getLandlord()), PSL.RENT_EVICT_NO_MONEY_LANDLORD.msg()
- .replace("%region%", r.getName() != null ? r.getName() : r.getId())
- .replace("%tenant%", tenant.getName()));
+
+ Player landlordOnline = Bukkit.getPlayer(r.getLandlord());
+ if (landlordOnline != null) {
+ PSL.msg(
+ landlordOnline,
+ PSL.RENT_EVICT_NO_MONEY_LANDLORD.replaceAll(Map.of(
+ "%region%", regionName,
+ "%tenant%", tenant.getName()
+ ))
+ );
}
+
r.removeRenting();
return;
}
// send payment messages
- if (tenant.getOfflinePlayer().isOnline()) {
- PSL.msg(Bukkit.getPlayer(r.getTenant()), PSL.RENT_PAID_TENANT.msg()
- .replace("%price%", String.format("%.2f", r.getPrice()))
- .replace("%landlord%", landlord.getName())
- .replace("%region%", r.getName() != null ? r.getName() : r.getId()));
+ Player tenantOnline = Bukkit.getPlayer(r.getTenant());
+ if (tenantOnline != null) {
+ PSL.msg(
+ tenantOnline,
+ PSL.RENT_PAID_TENANT.replaceAll(Map.of(
+ "%price%", priceStr,
+ "%landlord%", landlord.getName(),
+ "%region%", regionName
+ ))
+ );
}
- if (landlord.getOfflinePlayer().isOnline()) {
- PSL.msg(Bukkit.getPlayer(r.getLandlord()), PSL.RENT_PAID_LANDLORD.msg()
- .replace("%price%", String.format("%.2f", r.getPrice()))
- .replace("%tenant%", tenant.getName())
- .replace("%region%", r.getName() != null ? r.getName() : r.getId()));
+
+ Player landlordOnline = Bukkit.getPlayer(r.getLandlord());
+ if (landlordOnline != null) {
+ PSL.msg(
+ landlordOnline,
+ PSL.RENT_PAID_LANDLORD.replaceAll(Map.of(
+ "%price%", priceStr,
+ "%tenant%", tenant.getName(),
+ "%region%", regionName
+ ))
+ );
}
- // update money must be run in main thread
- Bukkit.getScheduler().runTask(ProtectionStones.getInstance(), () -> tenant.pay(landlord, r.getPrice()));
+ // update balances (main thread)
+ Bukkit.getScheduler().runTask(
+ ProtectionStones.getInstance(),
+ () -> tenant.pay(landlord, r.getPrice())
+ );
+
r.setRentLastPaid(Instant.now().getEpochSecond());
- try { // must save region to persist last paid
+ try {
r.getWGRegionManager().saveChanges();
} catch (StorageException e) {
e.printStackTrace();
}
}
+
/**
* Get list of rented regions.
*
diff --git a/src/main/java/dev/espi/protectionstones/PSL.java b/src/main/java/dev/espi/protectionstones/PSL.java
index b64c3248..825d16fa 100644
--- a/src/main/java/dev/espi/protectionstones/PSL.java
+++ b/src/main/java/dev/espi/protectionstones/PSL.java
@@ -1,4 +1,4 @@
-/*
+package dev.espi.protectionstones;/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -13,18 +13,21 @@
* along with this program. If not, see .
*/
-package dev.espi.protectionstones;
-
-import org.apache.commons.lang3.StringUtils;
-import org.bukkit.ChatColor;
+import dev.espi.protectionstones.utils.ChatUtil;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
+import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
+import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -32,505 +35,517 @@
public enum PSL {
// messages.yml
- COOLDOWN("cooldown", ChatColor.GOLD + "Warning: " + ChatColor.GRAY + "Please wait for %time% seconds before placing again!"),
- NO_SUCH_COMMAND("no_such_command", ChatColor.RED + "No such command. please type /ps help for more info"),
- NO_ACCESS("no_access", ChatColor.RED + "You are not allowed to do that here."),
- NO_ROOM_IN_INVENTORY("no_room_in_inventory", ChatColor.RED + "You don't have enough room in your inventory."),
- NO_ROOM_DROPPING_ON_FLOOR("no_room_dropping_on_floor", ChatColor.RED + "You don't have enough room in your inventory. Dropping item on floor."),
- INVALID_BLOCK("invalid_block", ChatColor.RED + "Invalid protection block."),
- NOT_ENOUGH_MONEY("not_enough_money", ChatColor.RED + "You don't have enough money! The price is %price%."),
- PAID_MONEY("paid_money", ChatColor.AQUA + "You've paid $%price%."),
- INVALID_WORLD("invalid_world", ChatColor.RED + "Invalid world."),
- MUST_BE_PLAYER("must_be_player", ChatColor.RED + "You must be a player to execute this command."),
+ // --- General ---
+ COOLDOWN("cooldown", "Warning: Please wait for %time% seconds before placing again!", "%time%"),
+ NO_SUCH_COMMAND("no_such_command", "No such command. please type /ps help for more info"),
+ NO_ACCESS("no_access", "You are not allowed to do that here."),
+ NO_ROOM_IN_INVENTORY("no_room_in_inventory", "You don't have enough room in your inventory."),
+ NO_ROOM_DROPPING_ON_FLOOR("no_room_dropping_on_floor", "You don't have enough room in your inventory. Dropping item on floor."),
+ INVALID_BLOCK("invalid_block", "Invalid protection block."),
+ NOT_ENOUGH_MONEY("not_enough_money", "You don't have enough money! The price is %price%.", "%price%"),
+ PAID_MONEY("paid_money", "You've paid $%price%.", "%price%"),
+ INVALID_WORLD("invalid_world", "Invalid world."),
+ MUST_BE_PLAYER("must_be_player", "You must be a player to execute this command."),
GO_BACK_PAGE("go_back_page", "Go back a page."),
GO_NEXT_PAGE("go_next_page", "Go to next page."),
- PAGE_DOES_NOT_EXIST("page_does_not_exist", ChatColor.RED + "Page does not exist."),
-
- HELP("help", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " PS Help " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "=====\n" + ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps help"),
- HELP_NEXT("help_next", ChatColor.GRAY + "Do /ps help %page% to go to the next page!"),
-
- COMMAND_REQUIRES_PLAYER_NAME("command_requires_player_name", ChatColor.RED + "This command requires a player name."),
-
- NO_PERMISSION_TOGGLE("no_permission_toggle", ChatColor.RED + "You don't have permission to use the toggle command."),
- NO_PERMISSION_CREATE("no_permission_create", ChatColor.RED + "You don't have permission to place a protection block."),
- NO_PERMISSION_CREATE_SPECIFIC("no_permission_create_specific", ChatColor.RED + "You don't have permission to place this protection block type."),
- NO_PERMISSION_DESTROY("no_permission_destroy", ChatColor.RED + "You don't have permission to destroy a protection block."),
- NO_PERMISSION_MEMBERS("no_permission_members", "&cYou don't have permission to use member commands."),
- NO_PERMISSION_OWNERS("no_permission_owners", "&cYou don't have permission to use owner commands."),
- NO_PERMISSION_ADMIN("no_permission_admin", ChatColor.RED + "You do not have permission to use that command."),
- NO_PERMISSION_COUNT("no_permission_count", ChatColor.RED + "You do not have permission to use that command."),
- NO_PERMISSION_COUNT_OTHERS("no_permission_count_others", ChatColor.RED + "You do not have permission to use that command."),
- NO_PERMISSION_FLAGS("no_permission_flags", "&cYou do not have permission to use flag commands."),
- NO_PERMISSION_PER_FLAG("no_permission_per_flag", ChatColor.RED + "You do not have permission to use that flag."),
- NO_PERMISSION_RENT("no_permission_rent", ChatColor.RED + "You do not have permission for renting."),
- NO_PERMISSION_TAX("no_permission_tax", ChatColor.RED + "You do not have permission to use the tax command."),
- NO_PERMISSION_BUYSELL("no_permission_buysell", ChatColor.RED + "You do not have permission to buy and sell regions."),
- NO_PERMISSION_UNHIDE("no_permission_unhide", ChatColor.RED + "You do not have permission to unhide protection blocks."),
- NO_PERMISSION_HIDE("no_permission_hide", ChatColor.RED + "You do not have permission to hide protection blocks."),
- NO_PERMISSION_INFO("no_permission_info", ChatColor.RED + "You do not have permission to use the region info command."),
- NO_PERMISSION_PRIORITY("no_permission_priority", ChatColor.RED + "You do not have permission to use the priority command."),
- NO_PERMISSION_REGION("no_permission_region", ChatColor.RED + "You do not have permission to use region commands."),
- NO_PERMISSION_TP("no_permission_tp", ChatColor.RED + "You do not have permission to teleport to other players' protection blocks."),
- NO_PERMISSION_HOME("no_permission_home", ChatColor.RED + "You do not have permission to teleport to your protection blocks."),
- NO_PERMISSION_UNCLAIM("no_permission_unclaim", ChatColor.RED + "You do not have permission to use the unclaim command."),
- NO_PERMISSION_UNCLAIM_REMOTE("no_permission_unclaim_remote", ChatColor.RED + "You do not have permission to use the unclaim remote command."),
- NO_PERMISSION_VIEW("no_permission_view", ChatColor.RED + "You do not have permission to use the view command."),
- NO_PERMISSION_GIVE("no_permission_give", ChatColor.RED + "You do not have permission to use the give command."),
- NO_PERMISSION_GET("no_permission_get", ChatColor.RED + "You do not have permission to use the get command."),
- NO_PERMISSION_SETHOME("no_permission_sethome", ChatColor.RED + "You do not have permission to use the sethome command."),
- NO_PERMISSION_LIST("no_permission_list", ChatColor.RED + "You do not have permission to use the list command."),
- NO_PERMISSION_LIST_OTHERS("no_permission_list_others", ChatColor.RED + "You do not have permission to use the list command for others."),
- NO_PERMISSION_NAME("no_permission_name", ChatColor.RED + "You do not have permission to use the name command."),
- NO_PERMISSION_SETPARENT("no_permission_setparent", ChatColor.RED + "You do not have permission to use the setparent command."),
- NO_PERMISSION_SETPARENT_OTHERS("no_permission_setparent_others", ChatColor.RED + "You do not have permission to inherit from regions you don't own."),
- NO_PERMISSION_MERGE("no_permission_merge", ChatColor.RED + "You do not have permission to use /ps merge."),
-
- ADDED_TO_REGION("psregion.added_to_region", ChatColor.AQUA + "%player%" + ChatColor.GRAY + " has been added to this region."),
- ADDED_TO_REGION_SPECIFIC("psregion.added_to_region_specific", ChatColor.AQUA + "%player%" + ChatColor.GRAY + " has been added to region %region%."),
- REMOVED_FROM_REGION("psregion.removed_from_region", ChatColor.AQUA + "%player%" + ChatColor.GRAY + " has been removed from region."),
- REMOVED_FROM_REGION_SPECIFIC("psregion.removed_from_region_specific", ChatColor.AQUA + "%player%" + ChatColor.GRAY + " has been removed from region %region%."),
- NOT_IN_REGION("psregion.not_in_region", ChatColor.RED + "You are not in a protection stones region!"),
- PLAYER_NOT_FOUND("psregion.player_not_found", ChatColor.RED + "Player not found."),
- NOT_PS_REGION("psregion.not_ps_region", ChatColor.RED + "Not a protection stones region."),
- REGION_DOES_NOT_EXIST("psregion.region_does_not_exist", ChatColor.RED + "Region does not exist."),
- NO_REGIONS_OWNED("psregion.no_regions_owned", ChatColor.RED + "You don't own any protected regions in this world!"),
- NO_REGION_PERMISSION("psregion.no_region_permission", ChatColor.RED + "You do not have permission to do this in this region."),
- PROTECTED("psregion.protected", ChatColor.AQUA + "This area is now protected."),
- NO_LONGER_PROTECTED("psregion.no_longer_protected", ChatColor.YELLOW + "This area is no longer protected."),
- CANT_PROTECT_THAT("psregion.cant_protect_that", ChatColor.RED + "You can't protect that area."),
- REACHED_REGION_LIMIT("psregion.reached_region_limit", ChatColor.RED + "You can not have any more protected regions (%limit%)."),
- REACHED_PER_BLOCK_REGION_LIMIT("psregion.reached_per_block_region_limit", ChatColor.RED + "You can not have any more regions of this type (%limit%)."),
- WORLD_DENIED_CREATE("psregion.world_denied_create", ChatColor.RED + "You can not create protections in this world."),
- REGION_OVERLAP("psregion.region_overlap", ChatColor.RED + "You can not place a protection block here as it overlaps another region."),
- REGION_TOO_CLOSE("psregion.region_too_close", ChatColor.RED + "Your protection block must be a minimum of %num% blocks from the edge of other regions!"),
- REGION_CANT_TELEPORT("psregion.cant_teleport", ChatColor.RED + "Your teleportation was blocked by a protection region!"),
- SPECIFY_ID_INSTEAD_OF_ALIAS("psregion.specify_id_instead_of_alias", ChatColor.GRAY + "There were multiple regions found with this name! Please use an ID instead.\n Regions with this name: " + ChatColor.AQUA + "%regions%"),
- REGION_NOT_ADJACENT("psregion.region_not_adjacent", ChatColor.RED + "You've passed the limit of non-adjacent regions! Try putting your protection block closer to other regions you already own."),
- REGION_NOT_OVERLAPPING("psregion.not_overlapping", ChatColor.RED + "These regions don't overlap each other!"),
+ PAGE_DOES_NOT_EXIST("page_does_not_exist", "Page does not exist."),
+
+ HELP("help", "===== PS Help =====\n> /ps help"),
+ HELP_NEXT("help_next", "Do /ps help %page% to go to the next page!", "%page%"),
+
+ COMMAND_REQUIRES_PLAYER_NAME("command_requires_player_name", "This command requires a player name."),
+
+ NO_PERMISSION_TOGGLE("no_permission_toggle", "You don't have permission to use the toggle command."),
+ NO_PERMISSION_CREATE("no_permission_create", "You don't have permission to place a protection block."),
+ NO_PERMISSION_CREATE_SPECIFIC("no_permission_create_specific", "You don't have permission to place this protection block type."),
+ NO_PERMISSION_DESTROY("no_permission_destroy", "You don't have permission to destroy a protection block."),
+ NO_PERMISSION_MEMBERS("no_permission_members", "You don't have permission to use member commands."),
+ NO_PERMISSION_OWNERS("no_permission_owners", "You don't have permission to use owner commands."),
+ NO_PERMISSION_ADMIN("no_permission_admin", "You do not have permission to use that command."),
+ NO_PERMISSION_COUNT("no_permission_count", "You do not have permission to use that command."),
+ NO_PERMISSION_COUNT_OTHERS("no_permission_count_others", "You do not have permission to use that command."),
+ NO_PERMISSION_FLAGS("no_permission_flags", "You do not have permission to use flag commands."),
+ NO_PERMISSION_PER_FLAG("no_permission_per_flag", "You do not have permission to use that flag."),
+ NO_PERMISSION_RENT("no_permission_rent", "You do not have permission for renting."),
+ NO_PERMISSION_TAX("no_permission_tax", "You do not have permission to use the tax command."),
+ NO_PERMISSION_BUYSELL("no_permission_buysell", "You do not have permission to buy and sell regions."),
+ NO_PERMISSION_UNHIDE("no_permission_unhide", "You do not have permission to unhide protection blocks."),
+ NO_PERMISSION_HIDE("no_permission_hide", "You do not have permission to hide protection blocks."),
+ NO_PERMISSION_INFO("no_permission_info", "You do not have permission to use the region info command."),
+ NO_PERMISSION_PRIORITY("no_permission_priority", "You do not have permission to use the priority command."),
+ NO_PERMISSION_REGION("no_permission_region", "You do not have permission to use region commands."),
+ NO_PERMISSION_TP("no_permission_tp", "You do not have permission to teleport to other players' protection blocks."),
+ NO_PERMISSION_HOME("no_permission_home", "You do not have permission to teleport to your protection blocks."),
+ NO_PERMISSION_UNCLAIM("no_permission_unclaim", "You do not have permission to use the unclaim command."),
+ NO_PERMISSION_UNCLAIM_REMOTE("no_permission_unclaim_remote", "You do not have permission to use the unclaim remote command."),
+ NO_PERMISSION_VIEW("no_permission_view", "You do not have permission to use the view command."),
+ NO_PERMISSION_GIVE("no_permission_give", "You do not have permission to use the give command."),
+ NO_PERMISSION_GET("no_permission_get", "You do not have permission to use the get command."),
+ NO_PERMISSION_SETHOME("no_permission_sethome", "You do not have permission to use the sethome command."),
+ NO_PERMISSION_LIST("no_permission_list", "You do not have permission to use the list command."),
+ NO_PERMISSION_LIST_OTHERS("no_permission_list_others", "You do not have permission to use the list command for others."),
+ NO_PERMISSION_NAME("no_permission_name", "You do not have permission to use the name command."),
+ NO_PERMISSION_SETPARENT("no_permission_setparent", "You do not have permission to use the setparent command."),
+ NO_PERMISSION_SETPARENT_OTHERS("no_permission_setparent_others", "You do not have permission to inherit from regions you don't own."),
+ NO_PERMISSION_MERGE("no_permission_merge", "You do not have permission to use /ps merge."),
+
+ // --- Region ---
+ ADDED_TO_REGION("psregion.added_to_region", "%player% has been added to this region.", "%player%"),
+ ADDED_TO_REGION_SPECIFIC("psregion.added_to_region_specific", "%player% has been added to region %region%.", "%player%", "%region%"),
+ REMOVED_FROM_REGION("psregion.removed_from_region", "%player% has been removed from region.", "%player%"),
+ REMOVED_FROM_REGION_SPECIFIC("psregion.removed_from_region_specific", "%player% has been removed from region %region%.", "%player%", "%region%"),
+ NOT_IN_REGION("psregion.not_in_region", "You are not in a protection stones region!"),
+ PLAYER_NOT_FOUND("psregion.player_not_found", "Player not found."),
+ NOT_PS_REGION("psregion.not_ps_region", "Not a protection stones region."),
+ REGION_DOES_NOT_EXIST("psregion.region_does_not_exist", "Region does not exist."),
+ NO_REGIONS_OWNED("psregion.no_regions_owned", "You don't own any protected regions in this world!"),
+ NO_REGION_PERMISSION("psregion.no_region_permission", "You do not have permission to do this in this region."),
+ PROTECTED("psregion.protected", "This area is now protected."),
+ NO_LONGER_PROTECTED("psregion.no_longer_protected", "This area is no longer protected."),
+ CANT_PROTECT_THAT("psregion.cant_protect_that", "You can't protect that area."),
+ REACHED_REGION_LIMIT("psregion.reached_region_limit", "You can not have any more protected regions (%limit%).", "%limit%"),
+ REACHED_PER_BLOCK_REGION_LIMIT("psregion.reached_per_block_region_limit", "You can not have any more regions of this type (%limit%).", "%limit%"),
+ WORLD_DENIED_CREATE("psregion.world_denied_create", "You can not create protections in this world."),
+ REGION_OVERLAP("psregion.region_overlap", "You can not place a protection block here as it overlaps another region."),
+ REGION_TOO_CLOSE("psregion.region_too_close", "Your protection block must be a minimum of %num% blocks from the edge of other regions!", "%num%"),
+ REGION_CANT_TELEPORT("psregion.cant_teleport", "Your teleportation was blocked by a protection region!"),
+ SPECIFY_ID_INSTEAD_OF_ALIAS("psregion.specify_id_instead_of_alias", "There were multiple regions found with this name! Please use an ID instead.\n Regions with this name: %regions%", "%regions%"),
+ REGION_NOT_ADJACENT("psregion.region_not_adjacent", "You've passed the limit of non-adjacent regions! Try putting your protection block closer to other regions you already own."),
+ REGION_NOT_OVERLAPPING("psregion.not_overlapping", "These regions don't overlap each other!"),
MULTI_REGION_DOES_NOT_EXIST("psregion.multi_region_does_not_exist", "One of these regions don't exist!"),
- NO_REGION_HOLES("psregion.no_region_holes", ChatColor.RED + "Unprotected area detected inside region! This is not allowed!"),
- DELETE_REGION_PREVENTED_NO_HOLES("psregion.delete_region_prevented", ChatColor.GRAY + "The region could not be removed, possibly because it creates a hole in the existing region."),
- NOT_OWNER("psregion.not_owner", ChatColor.RED + "You are not an owner of this region!"),
- CANNOT_MERGE_RENTED_REGION("psregion.cannot_merge_rented_region", ChatColor.RED + "Cannot merge regions because region %region% is in the process of being rented out!"),
- NO_PERMISSION_REGION_TYPE("psregion.no_permission_region_type", ChatColor.RED + "You do not have permission to have this region type."),
- REGION_HIDDEN("psregion.hidden", ChatColor.GRAY + "The protection block is now hidden."),
- MUST_BE_PLACED_IN_EXISTING_REGION("psregion.must_be_placed_in_existing_region", ChatColor.RED + "This must be placed inside of an existing region!"),
- REGION_ALREADY_IN_LOCATION_IS_HIDDEN("psregion.already_in_location_is_hidden", ChatColor.RED + "A region already exists in this location (is the protection block hidden?)"),
- CANNOT_REMOVE_YOURSELF_LAST_OWNER("psregion.cannot_remove_yourself_last_owner", ChatColor.RED + "You cannot remove yourself as you are the last owner."),
- CANNOT_REMOVE_YOURSELF_FROM_ALL_REGIONS("psregion.cannot_remove_yourself_all_regions", ChatColor.RED + "You cannot remove yourself from all of your regions at once, for safety reasons."),
-
- // ps toggle
- TOGGLE_HELP("toggle.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps toggle|on|off"),
+ NO_REGION_HOLES("psregion.no_region_holes", "Unprotected area detected inside region! This is not allowed!"),
+ DELETE_REGION_PREVENTED_NO_HOLES("psregion.delete_region_prevented", "The region could not be removed, possibly because it creates a hole in the existing region."),
+ NOT_OWNER("psregion.not_owner", "You are not an owner of this region!"),
+ CANNOT_MERGE_RENTED_REGION("psregion.cannot_merge_rented_region", "Cannot merge regions because region %region% is in the process of being rented out!", "%region%"),
+ NO_PERMISSION_REGION_TYPE("psregion.no_permission_region_type", "You do not have permission to have this region type."),
+ REGION_HIDDEN("psregion.hidden", "The protection block is now hidden."),
+ MUST_BE_PLACED_IN_EXISTING_REGION("psregion.must_be_placed_in_existing_region", "This must be placed inside of an existing region!"),
+ REGION_ALREADY_IN_LOCATION_IS_HIDDEN("psregion.already_in_location_is_hidden", "A region already exists in this location (is the protection block hidden?)"),
+ CANNOT_REMOVE_YOURSELF_LAST_OWNER("psregion.cannot_remove_yourself_last_owner", "You cannot remove yourself as you are the last owner."),
+ CANNOT_REMOVE_YOURSELF_FROM_ALL_REGIONS("psregion.cannot_remove_yourself_all_regions", "You cannot remove yourself from all of your regions at once, for safety reasons."),
+
+ // --- Toggle ---
+ TOGGLE_HELP("toggle.help", "> /ps toggle|on|off"),
TOGGLE_HELP_DESC("toggle.help_desc", "Use this command to turn on or off placement of protection blocks."),
- TOGGLE_ON("toggle.toggle_on", ChatColor.AQUA + "Protection block placement turned on."),
- TOGGLE_OFF("toggle.toggle_off", ChatColor.AQUA + "Protection block placement turned off."),
+ TOGGLE_ON("toggle.toggle_on", "Protection block placement turned on."),
+ TOGGLE_OFF("toggle.toggle_off", "Protection block placement turned off."),
- // ps count
- COUNT_HELP("count.count_help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps count [player (optional)]"),
+ // --- Count ---
+ COUNT_HELP("count.count_help", "> /ps count [player (optional)]"),
COUNT_HELP_DESC("count.count_help_desc", "Count the number of regions you own or another player."),
- PERSONAL_REGION_COUNT("count.personal_region_count", ChatColor.GRAY + "Your region count in this world: " + ChatColor.AQUA + "%num%"),
- PERSONAL_REGION_COUNT_MERGED("count.personal_region_count_merged", ChatColor.GRAY + "- Including each merged region: " + ChatColor.AQUA + "%num%"),
- OTHER_REGION_COUNT("count.other_region_count", ChatColor.GRAY + "%player%'s region count in this world: " + ChatColor.AQUA + "%num%"),
- OTHER_REGION_COUNT_MERGED("count.other_region_count_merged", ChatColor.GRAY + "- Including each merged region: " + ChatColor.AQUA + "%num%"),
+ PERSONAL_REGION_COUNT("count.personal_region_count", "Your region count in this world: %num%", "%num%"),
+ PERSONAL_REGION_COUNT_MERGED("count.personal_region_count_merged", "- Including each merged region: %num%", "%num%"),
+ OTHER_REGION_COUNT("count.other_region_count", "%player%'s region count in this world: %num%", "%player%", "%num%"),
+ OTHER_REGION_COUNT_MERGED("count.other_region_count_merged", "- Including each merged region: %num%", "%num%"),
- // ps flag
- FLAG_HELP("flag.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps flag [flagname] [value|null|default]"),
+ // --- Flag ---
+ FLAG_HELP("flag.help", "> /ps flag [flagname] [value|null|default]"),
FLAG_HELP_DESC("flag.help_desc", "Use this command to set a flag in your protected region."),
- FLAG_SET("flag.flag_set", ChatColor.AQUA + "%flag%" + ChatColor.GRAY + " flag has been set."),
- FLAG_NOT_SET("flag.flag_not_set", ChatColor.AQUA + "%flag%" + ChatColor.GRAY + " flag has " + ChatColor.RED + "not" + ChatColor.GRAY + " been set. Check your values again."),
- FLAG_PREVENT_EXPLOIT("flag.flag_prevent_exploit", ChatColor.RED + "This has been disabled to prevent exploits."),
- FLAG_PREVENT_EXPLOIT_HOVER("flag.flag_prevent_exploit_hover", ChatColor.RED + "Disabled for security reasons."),
- FLAG_GUI_HEADER("flag.gui_header", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " Flags (click to change) " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
- FLAG_GUI_HOVER_SET("flag.gui_hover_set", ChatColor.AQUA + "Click to set."),
- FLAG_GUI_HOVER_SET_TEXT("flag.gui_hover_set_text", ChatColor.AQUA + "Click to change." + ChatColor.WHITE + "\nCurrent value:\n%value%"),
- FLAG_GUI_HOVER_CHANGE_GROUP("flag.hover_change_group", "Click to set this flag to apply to only %group%."),
- FLAG_GUI_HOVER_CHANGE_GROUP_NULL("flag.hover_change_group_null", ChatColor.RED + "You must set this flag to a value before changing the group."),
-
- // ps rent
- RENT_HELP("rent.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps rent"),
+ FLAG_SET("flag.flag_set", "%flag% flag has been set.", "%flag%"),
+ FLAG_NOT_SET("flag.flag_not_set", "%flag% flag has not been set. Check your values again.", "%flag%"),
+ FLAG_PREVENT_EXPLOIT("flag.flag_prevent_exploit", "This has been disabled to prevent exploits."),
+ FLAG_PREVENT_EXPLOIT_HOVER("flag.flag_prevent_exploit_hover", "Disabled for security reasons."),
+ FLAG_GUI_HEADER("flag.gui_header", "===== Flags (click to change) ====="),
+ FLAG_GUI_HOVER_SET("flag.gui_hover_set", "Click to set."),
+ FLAG_GUI_HOVER_SET_TEXT("flag.gui_hover_set_text", "Click to change.\nCurrent value:\n%value%", "%value%"),
+ FLAG_GUI_HOVER_CHANGE_GROUP("flag.hover_change_group", "Click to set this flag to apply to only %group%.", "%group%"),
+ FLAG_GUI_HOVER_CHANGE_GROUP_NULL("flag.hover_change_group_null", "You must set this flag to a value before changing the group."),
+
+ // --- Rent ---
+ RENT_HELP("rent.help", "> /ps rent"),
RENT_HELP_DESC("rent.help_desc", "Use this command to manage rents (buying and selling)."),
- RENT_HELP_HEADER("rent.help_header", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " Rent Help " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
- RENT_ALREADY_RENTING("rent.already_renting", ChatColor.RED + "The region is already being rented out! You must stop leasing the region first."),
- RENT_NOT_RENTED("rent.not_rented", ChatColor.RED + "This region is not being rented."),
- RENT_LEASE_SUCCESS("rent.lease_success", ChatColor.AQUA + "Region leasing terms set:\n" + ChatColor.AQUA + "Price: " + ChatColor.GRAY + "%price%\n" + ChatColor.AQUA + "Payment Term: " + ChatColor.GRAY + "%period%"),
- RENT_STOPPED("rent.stopped", ChatColor.AQUA + "Leasing stopped."),
- RENT_EVICTED("rent.evicted", ChatColor.GRAY + "Evicted tenant %tenant%."),
- RENT_NOT_RENTING("rent.not_renting", ChatColor.RED + "This region is not being rented out to tenants."),
- RENT_PAID_LANDLORD("rent.paid_landlord", ChatColor.AQUA + "%tenant%" + ChatColor.GRAY + " has paid " + ChatColor.AQUA + "$%price%" + ChatColor.GRAY + " for renting out " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + "."),
- RENT_PAID_TENANT("rent.paid_tenant", ChatColor.GRAY + "Paid " + ChatColor.AQUA + "$%price%" + ChatColor.GRAY + " to " + ChatColor.AQUA + "%landlord%" + ChatColor.GRAY + " for region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + "."),
- RENT_RENTING_LANDLORD("rent.renting_landlord", ChatColor.AQUA + "%player%" + ChatColor.GRAY + " is now renting out region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + "."),
- RENT_RENTING_TENANT("rent.renting_tenant", ChatColor.GRAY + "You are now renting out region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " for " + ChatColor.AQUA + "%price%" + ChatColor.GRAY + " per " + ChatColor.AQUA + "%period%" + ChatColor.GRAY + "."),
- RENT_NOT_TENANT("rent.not_tenant", ChatColor.RED + "You are not the tenant of this region!"),
- RENT_TENANT_STOPPED_LANDLORD("rent.tenant_stopped_landlord", ChatColor.AQUA + "%player%" + ChatColor.GRAY + " has stopped renting out region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + ". It is now available for others to rent."),
- RENT_TENANT_STOPPED_TENANT("rent.tenant_stopped_tenant", ChatColor.AQUA + "You have stopped renting out region %region%."),
- RENT_BEING_SOLD("rent.being_sold", ChatColor.RED + "The region is being sold! Do /ps sell stop first."),
- RENT_EVICT_NO_MONEY_TENANT("rent.evict_no_money_tenant", ChatColor.GRAY + "You have been " + ChatColor.RED + "evicted" + ChatColor.GRAY + " from region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " because you do not have enough money (%price%) to pay for rent."),
- RENT_EVICT_NO_MONEY_LANDLORD("rent.evict_no_money_landlord", ChatColor.AQUA + "%tenant%" + ChatColor.GRAY + " has been " + ChatColor.RED + "evicted" + ChatColor.GRAY + " from region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " because they are unable to afford rent."),
- RENT_CANNOT_RENT_OWN_REGION("rent.cannot_rent_own_region", ChatColor.RED + "You cannot rent your own region!"),
- RENT_REACHED_LIMIT("rent.reached_limit", ChatColor.RED + "You've reached the limit of regions you are allowed to rent!"),
- RENT_PRICE_TOO_LOW("rent.price_too_low", ChatColor.RED + "The rent price is too low (must be larger than %price%)."),
- RENT_PRICE_TOO_HIGH("rent.price_too_high", ChatColor.RED + "The rent price is too high (must be lower than %price%)."),
- RENT_PERIOD_TOO_SHORT("rent.period_too_short", ChatColor.RED + "The rent period is too short (must be longer than %period% seconds)."),
- RENT_PERIOD_TOO_LONG("rent.period_too_long", ChatColor.RED + "The rent period is too long (must be shorter than %period% seconds)."),
- RENT_PERIOD_INVALID("rent.period_invalid", ChatColor.RED + "Invalid period format! Example: 24h for once a day."),
- RENT_CANNOT_BREAK_WHILE_RENTING("rent.cannot_break_while_renting", ChatColor.RED + "You cannot break the region when it is being rented out."),
-
- // ps tax
- TAX_HELP("tax.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps tax"),
+ RENT_HELP_HEADER("rent.help_header", "===== Rent Help ====="),
+ RENT_ALREADY_RENTING("rent.already_renting", "The region is already being rented out! You must stop leasing the region first."),
+ RENT_NOT_RENTED("rent.not_rented", "This region is not being rented."),
+ RENT_LEASE_SUCCESS("rent.lease_success", "Region leasing terms set:\nPrice: %price%\nPayment Term: %period%", "%price%", "%period%"),
+ RENT_STOPPED("rent.stopped", "Leasing stopped."),
+ RENT_EVICTED("rent.evicted", "Evicted tenant %tenant%.", "%tenant%"),
+ RENT_NOT_RENTING("rent.not_renting", "This region is not being rented out to tenants."),
+ RENT_PAID_LANDLORD("rent.paid_landlord", "%tenant% has paid $%price% for renting out %region%.", "%tenant%", "%price%", "%region%"),
+ RENT_PAID_TENANT("rent.paid_tenant", "Paid $%price% to %landlord% for region %region%.", "%price%", "%landlord%", "%region%"),
+ RENT_RENTING_LANDLORD("rent.renting_landlord", "%player% is now renting out region %region%.", "%player%", "%region%"),
+ RENT_RENTING_TENANT("rent.renting_tenant", "You are now renting out region %region% for %price% per %period%.", "%region%", "%price%", "%period%"),
+ RENT_NOT_TENANT("rent.not_tenant", "You are not the tenant of this region!"),
+ RENT_TENANT_STOPPED_LANDLORD("rent.tenant_stopped_landlord", "%player% has stopped renting out region %region%. It is now available for others to rent.", "%player%", "%region%"),
+ RENT_TENANT_STOPPED_TENANT("rent.tenant_stopped_tenant", "You have stopped renting out region %region%.", "%region%"),
+ RENT_BEING_SOLD("rent.being_sold", "The region is being sold! Do /ps sell stop first."),
+ RENT_EVICT_NO_MONEY_TENANT("rent.evict_no_money_tenant", "You have been evicted from region %region% because you do not have enough money (%price%) to pay for rent.", "%region%", "%price%"),
+ RENT_EVICT_NO_MONEY_LANDLORD("rent.evict_no_money_landlord", "%tenant% has been evicted from region %region% because they are unable to afford rent.", "%tenant%", "%region%"),
+ RENT_CANNOT_RENT_OWN_REGION("rent.cannot_rent_own_region", "You cannot rent your own region!"),
+ RENT_REACHED_LIMIT("rent.reached_limit", "You've reached the limit of regions you are allowed to rent!"),
+ RENT_PRICE_TOO_LOW("rent.price_too_low", "The rent price is too low (must be larger than %price%).", "%price%"),
+ RENT_PRICE_TOO_HIGH("rent.price_too_high", "The rent price is too high (must be lower than %price%).", "%price%"),
+ RENT_PERIOD_TOO_SHORT("rent.period_too_short", "The rent period is too short (must be longer than %period% seconds).", "%period%"),
+ RENT_PERIOD_TOO_LONG("rent.period_too_long", "The rent period is too long (must be shorter than %period% seconds).", "%period%"),
+ RENT_PERIOD_INVALID("rent.period_invalid", "Invalid period format! Example: 24h for once a day."),
+ RENT_CANNOT_BREAK_WHILE_RENTING("rent.cannot_break_while_renting", "You cannot break the region when it is being rented out."),
+
+ // --- Tax ---
+ TAX_HELP("tax.help", "> /ps tax"),
TAX_HELP_DESC("tax.help_desc", "Use this command to manage and pay taxes."),
- TAX_HELP_HEADER("tax.help_header", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " Taxes Help " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
- TAX_DISABLED_REGION("tax.disabled_region", ChatColor.RED + "Taxes are disabled for this region."),
- TAX_SET_AS_AUTOPAYER("tax.set_as_autopayer", ChatColor.GRAY + "Taxes for region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " will now be automatically paid by you."),
- TAX_SET_NO_AUTOPAYER("tax.set_no_autopayer", ChatColor.GRAY + "Taxes for region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " now have to be manually paid for."),
- TAX_PAID("tax.paid", ChatColor.GRAY + "Paid " + ChatColor.AQUA + "$%amount%" + ChatColor.GRAY + " in taxes for region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + "."),
- TAX_INFO_HEADER("tax.info_header", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " Tax Info (click for more info) " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
- TAX_JOIN_MSG_PENDING_PAYMENTS("tax.join_msg_pending_payments", ChatColor.GRAY + "You have " + ChatColor.AQUA + "$%money%" + ChatColor.GRAY + " in tax payments due on your regions!\nView them with /ps tax info."),
- TAX_PLAYER_REGION_INFO("tax.player_region_info", ChatColor.GRAY + "> " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " - " + ChatColor.DARK_AQUA + "$%money% due"),
- TAX_PLAYER_REGION_INFO_AUTOPAYER("tax.player_region_info_autopayer", ChatColor.GRAY + "> " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " - " + ChatColor.DARK_AQUA + "$%money% due" + ChatColor.GRAY + " (you autopay)"),
+ TAX_HELP_HEADER("tax.help_header", "===== Taxes Help ====="),
+ TAX_DISABLED_REGION("tax.disabled_region", "Taxes are disabled for this region."),
+ TAX_SET_AS_AUTOPAYER("tax.set_as_autopayer", "Taxes for region %region% will now be automatically paid by you.", "%region%"),
+ TAX_SET_NO_AUTOPAYER("tax.set_no_autopayer", "Taxes for region %region% now have to be manually paid for.", "%region%"),
+ TAX_PAID("tax.paid", "Paid $%amount% in taxes for region %region%.", "%amount%", "%region%"),
+ TAX_INFO_HEADER("tax.info_header", "===== Tax Info (click for more info) ====="),
+ TAX_JOIN_MSG_PENDING_PAYMENTS("tax.join_msg_pending_payments", "You have $%money% in tax payments due on your regions!\nView them with /ps tax info.", "%money%"),
+ TAX_PLAYER_REGION_INFO("tax.player_region_info", "> %region% - $%money% due", "%region%", "%money%"),
+ TAX_PLAYER_REGION_INFO_AUTOPAYER("tax.player_region_info_autopayer", "> %region% - $%money% due (you autopay)", "%region%", "%money%"),
TAX_CLICK_TO_SHOW_MORE_INFO("tax.click_to_show_more_info", "Click to show more information."),
- TAX_REGION_INFO_HEADER("tax.region_info_header", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " %region% Tax Info " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
- TAX_REGION_INFO("tax.region_info", ChatColor.BLUE + "Tax Rate: " + ChatColor.GRAY + "$%taxrate% (sum of all merged regions)" + "\n"
- + ChatColor.BLUE + "Time between tax cycles: " + ChatColor.GRAY + "%taxperiod%" + "\n"
- + ChatColor.BLUE + "Time to pay taxes after cycle: " + ChatColor.GRAY + "%taxpaymentperiod%" + "\n"
- + ChatColor.BLUE + "Tax Autopayer: " + ChatColor.GRAY + "%taxautopayer%" + "\n"
- + ChatColor.BLUE + "Taxes Owed: " + ChatColor.GRAY + "$%taxowed%"),
- TAX_NEXT("tax.next_page", ChatColor.GRAY + "Do /ps tax info -p %page% to go to the next page!"),
-
- // ps buy
- BUY_HELP("buy.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps buy"),
+ TAX_REGION_INFO_HEADER("tax.region_info_header", "===== %region% Tax Info =====", "%region%"),
+ TAX_REGION_INFO("tax.region_info", "Tax Rate: $%taxrate% (sum of all merged regions)\n"
+ + "Time between tax cycles: %taxperiod%\n"
+ + "Time to pay taxes after cycle: %taxpaymentperiod%\n"
+ + "Tax Autopayer: %taxautopayer%\n"
+ + "Taxes Owed: $%taxowed%", "%taxrate%", "%taxperiod%", "%taxpaymentperiod%", "%taxautopayer%", "%taxowed%"),
+ TAX_NEXT("tax.next_page", "Do /ps tax info -p %page% to go to the next page!", "%page%"),
+
+ // --- Buy ---
+ BUY_HELP("buy.help", "> /ps buy"),
BUY_HELP_DESC("buy.help_desc", "Buy the region you are currently in."),
- BUY_NOT_FOR_SALE("buy.not_for_sale", ChatColor.RED + "This region is not for sale."),
- BUY_STOP_SELL("buy.stop_sell", ChatColor.GRAY + "The region is now not for sale."),
- BUY_SOLD_BUYER("buy.sold_buyer", ChatColor.GRAY + "Bought region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " for " + ChatColor.AQUA + "$%price%" + ChatColor.GRAY + " from " + ChatColor.AQUA + "%player%" + ChatColor.GRAY + "."),
- BUY_SOLD_SELLER("buy.sold_seller", ChatColor.GRAY + "Sold region " + ChatColor.AQUA + "%region%" + ChatColor.GRAY + " for " + ChatColor.AQUA + "$%price%" + ChatColor.GRAY + " to " + ChatColor.AQUA + "%player%" + ChatColor.GRAY + "."),
+ BUY_NOT_FOR_SALE("buy.not_for_sale", "This region is not for sale."),
+ BUY_STOP_SELL("buy.stop_sell", "The region is now not for sale."),
+ BUY_SOLD_BUYER("buy.sold_buyer", "Bought region %region% for $%price% from %player%.", "%region%", "%price%", "%player%"),
+ BUY_SOLD_SELLER("buy.sold_seller", "Sold region %region% for $%price% to %player%.", "%region%", "%price%", "%player%"),
- // ps sell
- SELL_HELP("sell.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps sell [price|stop]"),
+ // --- Sell ---
+ SELL_HELP("sell.help", "> /ps sell [price|stop]"),
SELL_HELP_DESC("sell.help_desc", "Sell the region you are currently in."),
- SELL_RENTED_OUT("sell.rented_out", ChatColor.RED + "The region is being rented out! You must stop renting it out to sell."),
- SELL_FOR_SALE("sell.for_sale", ChatColor.GRAY + "The region is now for sale for " + ChatColor.AQUA + "$%price%" + ChatColor.GRAY + "."),
+ SELL_RENTED_OUT("sell.rented_out", "The region is being rented out! You must stop renting it out to sell."),
+ SELL_FOR_SALE("sell.for_sale", "The region is now for sale for $%price%.", "%price%"),
- // ps hide/unhide
- VISIBILITY_HIDE_HELP("visibility.hide_help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps hide"),
+ // --- Hide/Unhide ---
+ VISIBILITY_HIDE_HELP("visibility.hide_help", "> /ps hide"),
VISIBILITY_HIDE_HELP_DESC("visibility.hide_help_desc", "Use this command to hide or unhide your protection block."),
- VISIBILITY_UNHIDE_HELP("visibility.unhide_help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps unhide"),
+ VISIBILITY_UNHIDE_HELP("visibility.unhide_help", "> /ps unhide"),
VISIBILITY_UNHIDE_HELP_DESC("visibility.unhide_help_desc", "Use this command to hide or unhide your protection block."),
- ALREADY_NOT_HIDDEN("visibility.already_not_hidden", ChatColor.GRAY + "The protection stone doesn't appear hidden..."),
- ALREADY_HIDDEN("visibility.already_hidden", ChatColor.GRAY + "The protection stone appears to already be hidden..."),
+ ALREADY_NOT_HIDDEN("visibility.already_not_hidden", "The protection stone doesn't appear hidden..."),
+ ALREADY_HIDDEN("visibility.already_hidden", "The protection stone appears to already be hidden..."),
- // ps info
- INFO_HELP("info.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps info members|owners|flags"),
+ // --- Info ---
+ INFO_HELP("info.help", "> /ps info members|owners|flags"),
INFO_HELP_DESC("info.help_desc", "Use this command inside a ps region to see more information about it."),
- INFO_HEADER("info.header", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " PS Info " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
- INFO_TYPE2("info.type2", "&9Type: &7%type%", "%type%"),
+ INFO_HEADER("info.header", "===== PS Info ====="),
+ INFO_TYPE2("info.type2", "Type: %type%", "%type%"),
INFO_MAY_BE_MERGED("info.may_be_merged", "(may be merged with other types)"),
- INFO_MERGED2("info.merged2", ChatColor.BLUE + "Merged regions: " + ChatColor.GRAY + "%merged%", "%merged%"),
- INFO_MEMBERS2("info.members2", "&9Members: &7%members%", "%members%"),
- INFO_NO_MEMBERS("info.no_members", ChatColor.RED + "(no members)"),
- INFO_OWNERS2("info.owners2", "&9Owners: &7%owners%", "%owners%"),
- INFO_NO_OWNERS("info.no_owners", ChatColor.RED + "(no owners)"),
- INFO_FLAGS2("info.flags2", "&9Flags: &7%flags%", "%flags%"),
+ INFO_MERGED2("info.merged2", "Merged regions: %merged%", "%merged%"),
+ INFO_MEMBERS2("info.members2", "Members: %members%", "%members%"),
+ INFO_NO_MEMBERS("info.no_members", "(no members)"),
+ INFO_OWNERS2("info.owners2", "Owners: %owners%", "%owners%"),
+ INFO_NO_OWNERS("info.no_owners", "(no owners)"),
+ INFO_FLAGS2("info.flags2", "Flags: %flags%", "%flags%"),
INFO_NO_FLAGS("info.no_flags", "(none)"),
- INFO_REGION2("info.region2", "&9Region: &b%region%", "%region%"),
- INFO_PRIORITY2("info.priority2", "&9Priority: &b%priority%", "%priority%"),
- INFO_PARENT2("info.parent2", "&9Parent: &b%parentregion%", "%parentregion%"),
- INFO_BOUNDS_XYZ("info.bounds_xyz", "&9Bounds: &b(%minx%,%miny%,%minz%) -> (%maxx%,%maxy%,%maxz%)",
- "%minx%", "%miny%", "%minz%", "%maxx%", "%maxy%", "%maxz%"
- ),
- INFO_BOUNDS_XZ("info.bounds_xz", "&9Bounds: &b(%minx%, %minz%) -> (%maxx%, %maxz%)",
- "%minx%", "%minz%", "%maxx%", "%maxz%"
- ),
- INFO_SELLER2("info.seller2", "&9Seller: &7%seller%", "%seller%"),
- INFO_PRICE2("info.price2", "&9Price: &7%price%", "%price%"),
- INFO_TENANT2("info.tenant2", "&9Tenant: &7%tenant%", "%tenant%"),
- INFO_LANDLORD2("info.landlord2", "&9Landlord: &7%landlord%", "%landlord%"),
- INFO_RENT2("info.rent2", "&9Rent: &7%rent%", "%rent%"),
- INFO_AVAILABLE_FOR_SALE("info.available_for_sale", ChatColor.AQUA + "Region available for sale!"),
- INFO_AVAILABLE_FOR_RENT("info.available_for_rent", ChatColor.AQUA + "Region available for rent!"),
-
- // ps priority
- PRIORITY_HELP("priority.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps priority [number|null]"),
+ INFO_REGION2("info.region2", "Region: %region%", "%region%"),
+ INFO_PRIORITY2("info.priority2", "Priority: %priority%", "%priority%"),
+ INFO_PARENT2("info.parent2", "Parent: %parentregion%", "%parentregion%"),
+ INFO_BOUNDS_XYZ("info.bounds_xyz", "Bounds: (%minx%,%miny%,%minz%) -> (%maxx%,%maxy%,%maxz%)",
+ "%minx%", "%miny%", "%minz%", "%maxx%", "%maxy%", "%maxz%"),
+ INFO_BOUNDS_XZ("info.bounds_xz", "Bounds: (%minx%, %minz%) -> (%maxx%, %maxz%)",
+ "%minx%", "%minz%", "%maxx%", "%maxz%"),
+ INFO_SELLER2("info.seller2", "Seller: %seller%", "%seller%"),
+ INFO_PRICE2("info.price2", "Price: %price%", "%price%"),
+ INFO_TENANT2("info.tenant2", "Tenant: %tenant%", "%tenant%"),
+ INFO_LANDLORD2("info.landlord2", "Landlord: %landlord%", "%landlord%"),
+ INFO_RENT2("info.rent2", "Rent: %rent%", "%rent%"),
+ INFO_AVAILABLE_FOR_SALE("info.available_for_sale", "Region available for sale!"),
+ INFO_AVAILABLE_FOR_RENT("info.available_for_rent", "Region available for rent!"),
+
+ // --- Priority ---
+ PRIORITY_HELP("priority.help", "> /ps priority [number|null]"),
PRIORITY_HELP_DESC("priority.help_desc", "Use this command to set your region's priority."),
- PRIORITY_INFO("priority.info", ChatColor.GRAY + "Priority: %priority%"),
- PRIORITY_SET("priority.set", ChatColor.YELLOW + "Priority has been set."),
- PRIORITY_ERROR("priority.error", ChatColor.RED + "Error parsing input, check it again?"),
+ PRIORITY_INFO("priority.info", "Priority: %priority%", "%priority%"),
+ PRIORITY_SET("priority.set", "Priority has been set."),
+ PRIORITY_ERROR("priority.error", "Error parsing input, check it again?"),
- // ps region
- REGION_HELP("region.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps region [list|remove|disown] [playername]"),
+ // --- Region (admin over players) ---
+ REGION_HELP("region.help", "> /ps region [list|remove|disown] [playername]"),
REGION_HELP_DESC("region.help_desc", "Use this command to find information or edit other players' (or your own) protected regions."),
- REGION_NOT_FOUND_FOR_PLAYER("region.not_found_for_player", ChatColor.GRAY + "No regions found for %player% in this world."),
- REGION_LIST("region.list", ChatColor.GRAY + "%player%'s regions in this world: " + ChatColor.AQUA + "%regions%"),
- REGION_REMOVE("region.remove", ChatColor.YELLOW + "%player%'s regions have been removed in this world, and they have been removed from regions they co-owned."),
- REGION_DISOWN("region.disown", ChatColor.YELLOW + "%player% has been removed as owner from all regions on this world."),
- REGION_ERROR_SEARCH("region.error_search", ChatColor.RED + "Error while searching for %player%'s regions. Please make sure you have entered the correct name."),
-
- // ps tp
- TP_HELP("tp.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps tp [id/player] [num (optional)]"),
+ REGION_NOT_FOUND_FOR_PLAYER("region.not_found_for_player", "No regions found for %player% in this world.", "%player%"),
+ REGION_LIST("region.list", "%player%'s regions in this world: %regions%", "%player%", "%regions%"),
+ REGION_REMOVE("region.remove", "%player%'s regions have been removed in this world, and they have been removed from regions they co-owned.", "%player%"),
+ REGION_DISOWN("region.disown", "%player% has been removed as owner from all regions on this world.", "%player%"),
+ REGION_ERROR_SEARCH("region.error_search", "Error while searching for %player%'s regions. Please make sure you have entered the correct name.", "%player%"),
+
+ // --- TP ---
+ TP_HELP("tp.help", "> /ps tp [id/player] [num (optional)]"),
TP_HELP_DESC("tp.help_desc", "Teleports you to one of a given player's regions."),
- NUMBER_ABOVE_ZERO("tp.number_above_zero", ChatColor.RED + "Please enter a number above 0."),
- TP_VALID_NUMBER("tp.valid_number", ChatColor.RED + "Please enter a valid number."),
- ONLY_HAS_REGIONS("tp.only_has_regions", ChatColor.RED + "%player% only has %num% protected regions in this world!"),
- TPING("tp.tping", ChatColor.GREEN + "Teleporting..."),
- TP_ERROR_NAME("tp.error_name", ChatColor.RED + "Error in teleporting to protected region! (parsing WG region name error)"),
- TP_ERROR_TP("tp.error_tp", ChatColor.RED + "Error in finding the region to teleport to!"),
- TP_IN_SECONDS("tp.in_seconds", ChatColor.GRAY + "Teleporting in " + ChatColor.AQUA + "%seconds%" + ChatColor.GRAY + " seconds."),
- TP_CANCELLED_MOVED("tp.cancelled_moved", ChatColor.RED + "Teleport cancelled. You moved!"),
-
- // ps home
- HOME_HELP("home.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps home [name/id]"),
+ NUMBER_ABOVE_ZERO("tp.number_above_zero", "Please enter a number above 0."),
+ TP_VALID_NUMBER("tp.valid_number", "Please enter a valid number."),
+ ONLY_HAS_REGIONS("tp.only_has_regions", "%player% only has %num% protected regions in this world!", "%player%", "%num%"),
+ TPING("tp.tping", "Teleporting..."),
+ TP_ERROR_NAME("tp.error_name", "Error in teleporting to protected region! (parsing WG region name error)"),
+ TP_ERROR_TP("tp.error_tp", "Error in finding the region to teleport to!"),
+ TP_IN_SECONDS("tp.in_seconds", "Teleporting in %seconds% seconds.", "%seconds%"),
+ TP_CANCELLED_MOVED("tp.cancelled_moved", "Teleport cancelled. You moved!"),
+
+ // --- Home ---
+ HOME_HELP("home.help", "> /ps home [name/id]"),
HOME_HELP_DESC("home.help_desc", "Teleports you to one of your protected regions."),
- HOME_HEADER("home.header", ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " Homes (click to teleport) " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
+ HOME_HEADER("home.header", "===== Homes (click to teleport) ====="),
HOME_CLICK_TO_TP("home.click_to_tp", "Click to teleport!"),
- HOME_NEXT("home.next_page", ChatColor.GRAY + "Do /ps home -p %page% to go to the next page!"),
+ HOME_NEXT("home.next_page", "Do /ps home -p %page% to go to the next page!", "%page%"),
- // ps unclaim
- UNCLAIM_HELP("unclaim.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps unclaim"),
+ // --- Unclaim ---
+ UNCLAIM_HELP("unclaim.help", "> /ps unclaim"),
UNCLAIM_HELP_DESC("unclaim.help_desc", "Use this command to pickup a placed protection stone and remove the region."),
- UNCLAIM_HEADER("unclaim.header",ChatColor.DARK_GRAY + "" + ChatColor.STRIKETHROUGH + "=====" + ChatColor.RESET + " Unclaim (click to unclaim) " + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + "====="),
+ UNCLAIM_HEADER("unclaim.header", "===== Unclaim (click to unclaim) ====="),
- // ps view
- VIEW_HELP("view.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps view"),
+ // --- View ---
+ VIEW_HELP("view.help", "> /ps view"),
VIEW_HELP_DESC("view.help_desc", "Use this command to view the borders of a protected region."),
- VIEW_COOLDOWN("view.cooldown", ChatColor.RED + "Please wait a while before using /ps view again."),
- VIEW_GENERATING("view.generating", ChatColor.GRAY + "Generating border..."),
- VIEW_GENERATE_DONE("view.generate_done", ChatColor.GREEN + "Done! The border will disappear after 30 seconds!"),
- VIEW_REMOVING("view.removing", ChatColor.AQUA + "Removing border...\n" + ChatColor.GREEN + "If you still see ghost blocks, relog!"),
+ VIEW_COOLDOWN("view.cooldown", "Please wait a while before using /ps view again."),
+ VIEW_GENERATING("view.generating", "Generating border..."),
+ VIEW_GENERATE_DONE("view.generate_done", "Done! The border will disappear after 30 seconds!"),
+ VIEW_REMOVING("view.removing", "Removing border...\nIf you still see ghost blocks, relog!"),
- // ps admin
- ADMIN_HELP("admin.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps admin"),
+ // --- Admin ---
+ ADMIN_HELP("admin.help", "> /ps admin"),
ADMIN_HELP_DESC("admin.help_desc", "Do /ps admin help for more information."),
- ADMIN_CLEANUP_HEADER("admin.cleanup_header", ChatColor.YELLOW + "Cleanup %arg% %days% days\n================"),
- ADMIN_CLEANUP_FOOTER("admin.cleanup_footer", ChatColor.YELLOW + "================\nCompleted %arg% cleanup."),
- ADMIN_HIDE_TOGGLED("admin.hide_toggled", ChatColor.YELLOW + "All protection stones have been %message% in this world."),
- ADMIN_LAST_LOGON("admin.last_logon", ChatColor.YELLOW + "%player% last played %days% days ago."),
- ADMIN_IS_BANNED("admin.is_banned", ChatColor.YELLOW + "%player% is banned."),
- ADMIN_ERROR_PARSING("admin.error_parsing", ChatColor.RED + "Error parsing days, are you sure it is a number?"),
- ADMIN_CONSOLE_WORLD("admin.console_world", ChatColor.RED + "Please specify the world as the last parameter."),
- ADMIN_LASTLOGONS_HEADER("admin.lastlogons_header", ChatColor.YELLOW + "%days% Days Plus:\n================"),
- ADMIN_LASTLOGONS_LINE("admin.lastlogons_line", ChatColor.YELLOW + "%player% %time% days"),
- ADMIN_LASTLOGONS_FOOTER("admin.lastlogons_footer", ChatColor.YELLOW + "================\n%count% Total Players Shown\n%checked% Total Players Checked"),
-
- // ps reload
- RELOAD_HELP("reload.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps reload"),
+ ADMIN_CLEANUP_HEADER("admin.cleanup_header", "Cleanup %arg% %days% days\n================", "%arg%", "%days%"),
+ ADMIN_CLEANUP_FOOTER("admin.cleanup_footer", "================\nCompleted %arg% cleanup.", "%arg%"),
+ ADMIN_HIDE_TOGGLED("admin.hide_toggled", "All protection stones have been %message% in this world.", "%message%"),
+ ADMIN_LAST_LOGON("admin.last_logon", "%player% last played %days% days ago.", "%player%", "%days%"),
+ ADMIN_IS_BANNED("admin.is_banned", "%player% is banned.", "%player%"),
+ ADMIN_ERROR_PARSING("admin.error_parsing", "Error parsing days, are you sure it is a number?"),
+ ADMIN_CONSOLE_WORLD("admin.console_world", "Please specify the world as the last parameter."),
+ ADMIN_LASTLOGONS_HEADER("admin.lastlogons_header", "%days% Days Plus:\n================", "%days%"),
+ ADMIN_LASTLOGONS_LINE("admin.lastlogons_line", "%player% %time% days", "%player%", "%time%"),
+ ADMIN_LASTLOGONS_FOOTER("admin.lastlogons_footer", "================\n%count% Total Players Shown\n%checked% Total Players Checked", "%count%", "%checked%"),
+
+ // --- Reload ---
+ RELOAD_HELP("reload.help", "> /ps reload"),
RELOAD_HELP_DESC("reload.help_desc", "Reload settings from the config."),
- RELOAD_START("reload.start", ChatColor.AQUA + "Reloading config..."),
- RELOAD_COMPLETE("reload.complete", ChatColor.AQUA + "Completed config reload!"),
+ RELOAD_START("reload.start", "Reloading config..."),
+ RELOAD_COMPLETE("reload.complete", "Completed config reload!"),
- // ps add/remove
- ADDREMOVE_HELP("addremove.help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps add|remove [playername]"),
+ // --- Add/Remove ---
+ ADDREMOVE_HELP("addremove.help", "> /ps add|remove [playername]"),
ADDREMOVE_HELP_DESC("addremove.help_desc", "Use this command to add or remove a member of your protected region."),
- ADDREMOVE_OWNER_HELP("addremove.owner_help", ChatColor.AQUA + "> " + ChatColor.GRAY + "/ps addowner|removeowner [playername]"),
+ ADDREMOVE_OWNER_HELP("addremove.owner_help", ">