Compare commits

...
35 Commits
Author SHA1 Message Date
Thijs Wiefferink 271b17b6be Set version to 2.4.0 and update language files 2016-12-02 14:37:27 +01:00
Desjardins Jérôme 1dfedea50c Create a permission for teleporting to available regions (#241)
* Update GeneralRegion.java
Add Available abstract function
Check Permission modification

Update BuyRegion.java
Add Available function for selled

Update RentRegion.java
Add Available function for rented

Update TeleportCommand.java
Check new permission

Finish feature teleport available region

* Fix translation
2016-11-19 17:15:23 +01:00
Thijs Wiefferink d9abe2e347 FIx problem with null regionFlags sections 2016-11-14 18:02:59 +01:00
Thijs Wiefferink 1ba2e21ae9 Make profile based settings easier to understand
- Remove 'signProfiles', 'flagProfiles', 'eventCommandProfiles', 'schematicProfiles' and 'expirationWarningProfiles' from the config.yml file
- Add the removed profile contents directly to the setting without the trailing 's' in the default.yml file (this prevents the need to understand the creation of profiles, and then assigning them, taking out a step in the thought process of users)
- Added method in GeneralRegion to get a ConfigurationSection from the region file, group files or default file while also taking into account the translation from a string to a profile that is defined in the config.yml file. This ensures backwards compatibility with current config files (the old style will not be promoted anymore though).
- The 'expirationWarningProfiles' does not have the subkeys 'warnPlayer' and 'commands' anymore, it is just a list of commands now, using the '/areashop message' command to warn a player.
- Add a workaround for the empty sign problem after unrent/sell of a region while having restore enabled, an AsyncWorldEdit plugin installed and signs inside the region (sign will be updated again half a second after unrent/sell).
2016-11-13 00:44:35 +01:00
Thijs Wiefferink fcdfdc6094 Update language files
- Swedish is added
- German, French and Russian are improved
2016-11-07 14:13:03 +01:00
Thijs Wiefferink 8a7e2ba5c2 Indicate limits when a MaxChangedBlocksException is thrown by WorldEdit 2016-11-07 13:52:54 +01:00
Thijs Wiefferink 0950452692 Fix a couple of problems caused by vertical /as stack addition 2016-10-31 21:07:08 +01:00
Thijs Wiefferink 293978f068 Decouple Message class from replacement providers
- Instead of applying replacements by testing for a replacement that has the GeneralRegion type, it now checks for a ReplacementProvider instances (one step closer to making Message independent of AreaShop).
- Replacements are handled one by one with a switch-case instead of getting them from a map, helps performance a lot.
2016-10-25 20:57:58 +02:00
Thijs Wiefferink 5efe14b8e9 Add up and down direction for '/as stack'
Prevents creating regions above and below the world limits, still needs
testing.
Progress for #105
2016-10-24 15:02:49 +02:00
Thijs Wiefferink 839d510151 Switch from Bukkit to Spigot Maven repo since it is down
Also switched from Bukkit 1.7.9 to Bukkit 1.8.0 because that is the lowest version available on the Spigot repo
2016-10-17 23:45:08 +02:00
Thijs Wiefferink 9180d9b8ee Fix small language file issue
When you only have a formatting code before a language variable, the hover/click effects will accidentally be applied to one text part earlier
2016-10-16 18:29:26 +02:00
Thijs Wiefferink 7aa786f4ce Fix default config trying to execute /as message as player
Fixes #221
2016-09-04 22:43:03 +02:00
Thijs Wiefferink 10ea8540e7 Add tab completion for '/as me [player]'
Closes #220
2016-09-04 00:59:04 +02:00
Thijs Wiefferink dba00769f6 Fix problem with line breaks 2016-09-03 20:58:45 +02:00
Thijs Wiefferink 44c70c6a33 Cleanup messages about region that does not exist in WorldGuard 2016-09-03 19:46:05 +02:00
Thijs Wiefferink 570f7b4055 Don't extend rent when using '/as setowner' to set a different owner
Also remove new owner from the friends list.
Fixes #219
2016-09-03 19:19:40 +02:00
Thijs Wiefferink feafa012dd Fix issue with \n on 1.7.x servers
- Each line of a message will now be sent separately instead of using '\n' in the text
- Drastically reduced the number of StringBuilders that are instantiated during message construction
- Fixes #222
2016-09-03 17:22:40 +02:00
Thijs Wiefferink 82b340ce1a Messages: also parse section signs into color tags properly
Fixes line-wrapping removing color in some cases
2016-09-02 21:43:58 +02:00
Thijs Wiefferink 93809f27fc Rename events to be consistent with commands
- AddFriendEvent -> AddedFriendEvent
- DeleteFriendEvent -> DeletedFriendEvent
- RemovedRegionEvent -> DeletedRegionEvent
2016-08-28 22:45:20 +02:00
Thijs Wiefferink f8ed3654fd Fix compilation error 2016-08-28 22:31:06 +02:00
Thijs Wiefferink 58a1afccf3 Invert inheritance of RegionEvent and CancellabelRegionEvent/NotifyRegionEvent 2016-08-28 22:29:45 +02:00
Thijs Wiefferink d9c3573225 Change RegionUpdateEvent to UpdateRegionEvent
This breaks plugins using the event
2016-08-28 22:21:33 +02:00
Thijs Wiefferink 1577443203 Generalize events better
Adds generic classes for events with a region (BuyRegion, RentRegion or GeneralRegion)
2016-08-28 22:11:17 +02:00
Thijs Wiefferink ab7a92c57d Update README.md 2016-08-26 19:49:21 +02:00
Thijs Wiefferink 2e09b0f60f Update README.md 2016-08-26 19:48:59 +02:00
Thijs Wiefferink 6e5c35f95b Add extension plugins section 2016-08-26 19:45:37 +02:00
Thijs Wiefferink 066ceedafd Add 'build' flag by default to prevent inheriting from parent regions. 2016-08-21 22:20:25 +02:00
Thijs Wiefferink c8ebe24bd3 Put break in '/as info' help message in the right spot 2016-08-19 20:52:07 +02:00
Thijs Wiefferink ad7db5ee23 Attempt to fix unable to add new players with '/as addfriend' 2016-08-16 22:43:09 +02:00
Thijs Wiefferink f80a8178ff Fix formatting not clearing on new lines 2016-08-13 22:28:15 +02:00
Thijs Wiefferink 05c8e1a7e4 Make loggin methods more generic 2016-08-10 16:07:39 +02:00
Thijs Wiefferink 9904805310 Improve version detection of WorldGuard
- First detect version 5
- Then detect lower than 6.1.3
- Else check build number:
  - Build number exists and lower than 1672: 6
  - Build number exists and Is 1672: broken
  - Else: 6_1_3
2016-08-09 22:56:21 +02:00
Thijs Wiefferink 0df2f429c0 Only print build number warning if we found it 2016-08-09 22:38:33 +02:00
Thijs Wiefferink b3408a2648 Fix compilation error and WorldGuard version detection 2016-08-09 21:52:53 +02:00
Thijs Wiefferink e1f89e7904 Cleanup some leftover logging in an old style 2016-08-08 22:06:31 +02:00
65 changed files with 2129 additions and 1376 deletions

No files matched your search

+2 -2
View File
@@ -4,7 +4,7 @@
<artifactId>areashop</artifactId>
<packaging>jar</packaging>
<name>AreaShop</name>
<version>2.3.2</version> <!-- Main plugin version -->
<version>2.4.0</version> <!-- Main plugin version -->
<parent>
<groupId>me.wiefferink</groupId>
@@ -16,7 +16,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version>
<version>1.8-R0.1-SNAPSHOT</version>
<type>jar</type>
<scope>provided</scope>
<optional>true</optional>
@@ -31,7 +31,6 @@ import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
@@ -86,55 +85,55 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
public static final int versionFilesCurrent = 3;
// Keys for replacing parts of flags, commands, strings
public static final String tagPlayerName = "%player%";
public static final String tagPlayerUUID = "%uuid%";
public static final String tagWorldName = "%world%";
public static final String tagRegionName = "%region%";
public static final String tagRegionType = "%type%";
public static final String tagPrice = "%price%";
public static final String tagRawPrice = "%rawprice%";
public static final String tagDuration = "%duration%";
public static final String tagRentedUntil = "%until%";
public static final String tagRentedUntilShort = "%untilshort%";
public static final String tagWidth = "%width%"; // x-axis
public static final String tagHeight = "%height%"; // y-axis
public static final String tagDepth = "%depth%"; // z-axis
public static final String tagTimeLeft = "%timeleft%";
public static final String tagClicker = "%clicker%";
public static final String tagResellPrice = "%resellprice%";
public static final String tagRawResellPrice = "%rawresellprice%";
public static final String tagFriends = "%friends%";
public static final String tagFriendsUUID = "%friendsuuid%";
public static final String tagMoneyBackPercentage = "%moneybackpercent%";
public static final String tagMoneyBackAmount = "%moneyback%";
public static final String tagRawMoneyBackAmount = "%rawmoneyback%";
public static final String tagMaxExtends = "%maxextends%";
public static final String tagExtendsLeft = "%extendsleft%";
public static final String tagMaxRentTime = "%maxrenttime%";
public static final String tagMaxInactiveTime = "%inactivetime%";
public static final String tagLandlord = "%landlord%";
public static final String tagLandlordUUID = "%landlorduuid%";
public static final String tagDateTime = "%datetime%";
public static final String tagDateTimeShort = "%datetimeshort%";
public static final String tagYear = "%year%";
public static final String tagMonth = "%month%";
public static final String tagDay = "%day%";
public static final String tagHour = "%hour%";
public static final String tagMinute = "%minute%";
public static final String tagSecond = "%second%";
public static final String tagMillisecond = "%millisecond%";
public static final String tagEpoch = "%epoch%";
public static final String tagTeleportX = "%tpx%";
public static final String tagTeleportY = "%tpy%";
public static final String tagTeleportZ = "%tpz%";
public static final String tagTeleportBlockX = "%tpblockx%";
public static final String tagTeleportBlockY = "%tpblocky%";
public static final String tagTeleportBlockZ = "%tpblockz%";
public static final String tagTeleportPitch = "%tppitch%";
public static final String tagTeleportYaw = "%tpyaw%";
public static final String tagTeleportPitchRound = "%tppitchround%";
public static final String tagTeleportYawRound = "%tpyawround%";
public static final String tagTeleportWorld = "%tpworld%";
public static final String tagPlayerName = "player";
public static final String tagPlayerUUID = "uuid";
public static final String tagWorldName = "world";
public static final String tagRegionName = "region";
public static final String tagRegionType = "type";
public static final String tagPrice = "price";
public static final String tagRawPrice = "rawprice";
public static final String tagDuration = "duration";
public static final String tagRentedUntil = "until";
public static final String tagRentedUntilShort = "untilshort";
public static final String tagWidth = "width"; // x-axis
public static final String tagHeight = "height"; // y-axis
public static final String tagDepth = "depth"; // z-axis
public static final String tagTimeLeft = "timeleft";
public static final String tagClicker = "clicker";
public static final String tagResellPrice = "resellprice";
public static final String tagRawResellPrice = "rawresellprice";
public static final String tagFriends = "friends";
public static final String tagFriendsUUID = "friendsuuid";
public static final String tagMoneyBackPercentage = "moneybackpercent";
public static final String tagMoneyBackAmount = "moneyback";
public static final String tagRawMoneyBackAmount = "rawmoneyback";
public static final String tagMaxExtends = "maxextends";
public static final String tagExtendsLeft = "extendsleft";
public static final String tagMaxRentTime = "maxrenttime";
public static final String tagMaxInactiveTime = "inactivetime";
public static final String tagLandlord = "landlord";
public static final String tagLandlordUUID = "landlorduuid";
public static final String tagDateTime = "datetime";
public static final String tagDateTimeShort = "datetimeshort";
public static final String tagYear = "year";
public static final String tagMonth = "month";
public static final String tagDay = "day";
public static final String tagHour = "hour";
public static final String tagMinute = "minute";
public static final String tagSecond = "second";
public static final String tagMillisecond = "millisecond";
public static final String tagEpoch = "epoch";
public static final String tagTeleportX = "tpx";
public static final String tagTeleportY = "tpy";
public static final String tagTeleportZ = "tpz";
public static final String tagTeleportBlockX = "tpblockx";
public static final String tagTeleportBlockY = "tpblocky";
public static final String tagTeleportBlockZ = "tpblockz";
public static final String tagTeleportPitch = "tppitch";
public static final String tagTeleportYaw = "tpyaw";
public static final String tagTeleportPitchRound = "tppitchround";
public static final String tagTeleportYawRound = "tpyawround";
public static final String tagTeleportWorld = "tpworld";
public static AreaShop getInstance() {
return AreaShop.instance;
@@ -154,61 +153,64 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
Integer build = null;
Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
if (plugin == null || !(plugin instanceof WorldGuardPlugin)) {
getLogger().severe("WorldGuard plugin is not present or has not loaded correctly");
error("WorldGuard plugin is not present or has not loaded correctly");
error = true;
} else {
worldGuard = (WorldGuardPlugin)plugin;
// Get correct WorldGuardInterface (handles things that changed version to version)
rawVersion = worldGuard.getDescription().getVersion();
if(rawVersion.contains("-SNAPSHOT;")) {
String buildNumber = rawVersion.substring(rawVersion.indexOf("-SNAPSHOT;")+10, rawVersion.length());
if(rawVersion.contains("-")) {
buildNumber = buildNumber.substring(0, buildNumber.indexOf("-"));
}
try {
build = Integer.parseInt(buildNumber);
} catch(NumberFormatException e) {
getLogger().warning("Could not correctly parse the build of WorldGuard, raw version: "+rawVersion+", buildNumber: "+buildNumber);
}
}
// Clear stuff from the version string that is not a number
String[] versionParts = rawVersion.split("\\.");
for(int i = 0; i < versionParts.length; i++) {
Pattern pattern = Pattern.compile("^\\d+");
Matcher matcher = pattern.matcher(versionParts[i]);
if(matcher.find()) {
versionParts[i] = matcher.group();
}
}
// Find major, minor and fix numbers
try {
if(versionParts.length > 0) {
major = Integer.parseInt(versionParts[0]);
rawVersion = worldGuard.getDescription().getVersion();
if(rawVersion.contains("-SNAPSHOT;")) {
String buildNumber = rawVersion.substring(rawVersion.indexOf("-SNAPSHOT;")+10, rawVersion.length());
if(buildNumber.contains("-")) {
buildNumber = buildNumber.substring(0, buildNumber.indexOf("-"));
try {
build = Integer.parseInt(buildNumber);
} catch(NumberFormatException e) {
warn("Could not correctly parse the build of WorldGuard, raw version: "+rawVersion+", buildNumber: "+buildNumber);
}
}
}
if(versionParts.length > 1) {
minor = Integer.parseInt(versionParts[1]);
// Clear stuff from the version string that is not a number
String[] versionParts = rawVersion.split("\\.");
for(int i = 0; i < versionParts.length; i++) {
Pattern pattern = Pattern.compile("^\\d+");
Matcher matcher = pattern.matcher(versionParts[i]);
if(matcher.find()) {
versionParts[i] = matcher.group();
}
}
if(versionParts.length > 2) {
fixes = Integer.parseInt(versionParts[2]);
// Find major, minor and fix numbers
try {
if(versionParts.length > 0) {
major = Integer.parseInt(versionParts[0]);
}
if(versionParts.length > 1) {
minor = Integer.parseInt(versionParts[1]);
}
if(versionParts.length > 2) {
fixes = Integer.parseInt(versionParts[2]);
}
} catch(NumberFormatException e) {
warn("Something went wrong while parsing WorldGuard version number: "+rawVersion);
}
} catch(NumberFormatException e) {
getLogger().warning("Something went wrong while parsing WorldGuard version number: "+rawVersion);
}
// Determine correct implementation to use
if(major >= 6 && minor >= 1 && fixes > 3) {
wgVersion = "6_1_3";
} else if(build != null && build >= 1672) {
if(build > 1672) {
wgVersion = "6_1_3"; // Flag name to flag object method changed
// Determine correct implementation to use
if(worldGuard.getDescription().getVersion().startsWith("5.")) {
wgVersion = "5";
} else if(major == 6 && minor == 1 && fixes < 3) {
wgVersion = "6";
} else {
// Build 1672 is broken, flags changed but no FlagContext added yet
error = true;
getLogger().severe("Build 1672 of WorldGuard is broken, update to a later build or a stable version!");
if(build != null && build == 1672) {
error = true;
error("Build 1672 of WorldGuard is broken, update to a later build or a stable version!");
} else if(build != null && build < 1672) {
wgVersion = "6";
} else {
wgVersion = "6_1_3";
}
}
} else if(worldGuard.getDescription().getVersion().startsWith("5.")) {
wgVersion = "5";
} else {
wgVersion = "6"; // Schematic methods changed
} catch(Exception e) { // If version detection fails, at least try to load the latest version
wgVersion = "6_1_3";
}
// Load chosen implementation
try {
@@ -218,7 +220,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
worldGuardInterface = (WorldGuardInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
}
} catch (final Exception e) {
getLogger().severe("Could not load the handler for WorldGuard (tried to load "+wgVersion+"), report this problem to the author:"+ExceptionUtils.getStackTrace(e));
error("Could not load the handler for WorldGuard (tried to load "+wgVersion+"), report this problem to the author:"+ExceptionUtils.getStackTrace(e));
error = true;
wgVersion = null;
}
@@ -228,7 +230,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
String weVersion = null;
plugin = getServer().getPluginManager().getPlugin("WorldEdit");
if (plugin == null || !(plugin instanceof WorldEditPlugin)) {
getLogger().severe("WorldEdit plugin is not present or has not loaded correctly");
error("WorldEdit plugin is not present or has not loaded correctly");
error = true;
} else {
worldEdit = (WorldEditPlugin)plugin;
@@ -245,7 +247,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
worldEditInterface = (WorldEditInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
}
} catch (final Exception e) {
getLogger().severe("Could not load the handler for WorldEdit (tried to load "+weVersion+"), report this problem to the author: "+ExceptionUtils.getStackTrace(e));
error("Could not load the handler for WorldEdit (tried to load "+weVersion+"), report this problem to the author: "+ExceptionUtils.getStackTrace(e));
error = true;
weVersion = null;
}
@@ -253,7 +255,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
// Check if Vault is present
if(getServer().getPluginManager().getPlugin("Vault") == null) {
getLogger().severe("Vault plugin is not present or has not loaded correctly");
error("Vault plugin is not present or has not loaded correctly");
error = true;
}
@@ -273,7 +275,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
languageManager = new LanguageManager(this);
if(error) {
getLogger().severe("The plugin has not started, fix the errors listed above");
error("The plugin has not started, fix the errors listed above");
} else {
// Register the event listeners
getServer().getPluginManager().registerEvents(new SignChangeListener(this), this);
@@ -308,7 +310,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
AreaShop.debug("Result=" + updater.getResult().toString() + ", Latest=" + updater.getLatestName() + ", Type=" + updater.getLatestType());
updateAvailable = updater.getResult() == UpdateResult.UPDATE_AVAILABLE;
if(updateAvailable) {
AreaShop.getInstance().getLogger().info("Update from AreaShop V" + AreaShop.getInstance().getDescription().getVersion() + " to " + updater.getLatestName() + " available, get the latest version at http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/");
AreaShop.info("Update from AreaShop V"+AreaShop.getInstance().getDescription().getVersion()+" to "+updater.getLatestName()+" available, get the latest version at http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/");
new BukkitRunnable() {
@Override
public void run() {
@@ -342,7 +344,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
region.updateLastActiveTime();
}
}
fileManager.saveRequiredFilesAtOnce();
fileManager.saveRequiredFilesAtOnce();
Bukkit.getServer().getScheduler().cancelTasks(this);
worldGuard = null;
@@ -368,9 +370,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
// Register as listener when necessary
for(Feature feature : features) {
if(feature instanceof Listener) {
getServer().getPluginManager().registerEvents((Listener)feature, this);
}
feature.listen();
}
}
@@ -465,7 +465,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
public Economy getEconomy() {
RegisteredServiceProvider<Economy> economy = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
if (economy == null || economy.getProvider() == null) {
getLogger().severe("There is no economy provider to support Vault, make sure you installed an economy plugin");
error("There is no economy provider to support Vault, make sure you installed an economy plugin");
return null;
}
return economy.getProvider();
@@ -518,7 +518,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
try {
Bukkit.getPluginManager().addPermission(perm);
} catch(IllegalArgumentException e) {
getLogger().warning("Could not add the following permission to be used as limit: "+perm.getName());
warn("Could not add the following permission to be used as limit: "+perm.getName());
}
}
}
@@ -617,10 +617,22 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
}
}
/**
* Send a message to a target without a prefix
* @param target The target to send the message to
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void messageNoPrefix(Object target, String key, Object... replacements) {
Message.fromKey(key).replacements(replacements).send(target);
}
/**
* Send a message to a target, prefixed by the default chat prefix
* @param target The target to send the message to
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void message(Object target, String key, Object... replacements) {
Message.fromKey(key).prefix().replacements(replacements).send(target);
}
@@ -653,39 +665,47 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
*/
public static void debug(Object... message) {
if(AreaShop.getInstance().debug) {
AreaShop.getInstance().getLogger().info("Debug: "+StringUtils.join(message, " "));
info("Debug: "+StringUtils.join(message, " "));
}
}
/**
* Non-static debug to use as implementation of the interface
*/
public void debugI(String message) {
AreaShop.debug(message);
}
/**
* Print a warning to the console
* @param message The message to print
*/
public static void warn(String... message) {
AreaShop.getInstance().getLogger().warning(StringUtils.join(message, " "));
public void debugI(Object... message) {
AreaShop.debug(StringUtils.join(message, " "));
}
/**
* Print an information message to the console
* @param message The message to print
*/
public static void info(String... message) {
public static void info(Object... message) {
AreaShop.getInstance().getLogger().info(StringUtils.join(message, " "));
}
/**
* Print a warning to the console
* @param message The message to print
*/
public static void warn(Object... message) {
AreaShop.getInstance().getLogger().warning(StringUtils.join(message, " "));
}
/**
* Print an error to the console
* @param message The messagfe to print
*/
public static void error(Object... message) {
AreaShop.getInstance().getLogger().severe(StringUtils.join(message, " "));
}
/**
* Print debug message for periodic task
* @param message The message to print
*/
public static void debugTask(String message) {
public static void debugTask(Object... message) {
if(AreaShop.getInstance().getConfig().getBoolean("debugTask")) {
AreaShop.debug(message);
AreaShop.debug(StringUtils.join(message, " "));
}
}
@@ -698,7 +718,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface {
setReady(false);
fileManager.saveRequiredFilesAtOnce();
fileManager.loadFiles();
languageManager.startup();
languageManager = new LanguageManager(this);
message(confirmationReceiver, "reload-reloading");
fileManager.checkRents();
fileManager.updateAllRegions(confirmationReceiver);
@@ -75,7 +75,7 @@ public class Utils {
* @return A Message object containing the parts combined into one message
*/
public static Message combinedMessage(Collection<?> replacements, String messagePart, String combiner) {
Message result = Message.none();
Message result = Message.empty();
boolean first = true;
for(Object part : replacements) {
if(first) {
@@ -101,7 +101,7 @@ public class AddCommand extends CommandAreaShop {
}
ProtectedRegion region = plugin.getWorldGuard().getRegionManager(world).getRegion(args[2]);
if(region == null) {
plugin.message(sender, "add-noRegion", args[2]);
plugin.message(sender, "cmd-noRegion", args[2]);
return;
}
regions.add(region);
@@ -77,7 +77,7 @@ public class AddfriendCommand extends CommandAreaShop {
return;
}
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(friend.getLastPlayed() == 0 && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
if(friend.getLastPlayed() == 0 && !friend.isOnline() && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
plugin.message(sender, "addfriend-notVisited", args[1], region);
return;
}
@@ -85,7 +85,7 @@ public class FindCommand extends CommandAreaShop {
if(!results.isEmpty()) {
// Draw a random one
BuyRegion region = results.get(new Random().nextInt(results.size()));
Message onlyInGroup = Message.none();
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
@@ -96,7 +96,7 @@ public class FindCommand extends CommandAreaShop {
}
region.teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
Message onlyInGroup = Message.none();
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
@@ -119,7 +119,7 @@ public class FindCommand extends CommandAreaShop {
if(!results.isEmpty()) {
// Draw a random one
RentRegion region = results.get(new Random().nextInt(results.size()));
Message onlyInGroup = Message.none();
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
@@ -130,7 +130,7 @@ public class FindCommand extends CommandAreaShop {
}
region.teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
Message onlyInGroup = Message.none();
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
@@ -77,7 +77,7 @@ public class InfoCommand extends CommandAreaShop {
}
});
// Header
Message limitedToGroup = Message.none();
Message limitedToGroup = Message.empty();
if(filterGroup != null) {
limitedToGroup = Message.fromKey("info-limitedToGroup").replacements(filterGroup.getName());
}
@@ -111,7 +111,7 @@ public class InfoCommand extends CommandAreaShop {
plugin.messageNoPrefix(sender, "info-entry"+state, region);
linesPrinted++;
}
Message footer = Message.none();
Message footer = Message.empty();
// Previous button
if(page > 1) {
footer.append(Message.fromKey("info-pagePrevious").replacements(baseCommand+" "+(page-1)));
@@ -365,11 +365,7 @@ public class InfoCommand extends CommandAreaShop {
}
// Restoring
if(rent.isRestoreEnabled()) {
if(sender.hasPermission("areashop.setrestore")) {
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent, Message.fromKey("info-regionRestoringProfile").replacements(rent.getRestoreProfile()));
} else {
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent, "");
}
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent);
}
// Restrictions
if(!rent.isRented()) {
@@ -444,11 +440,7 @@ public class InfoCommand extends CommandAreaShop {
}
// Restoring
if(buy.isRestoreEnabled()) {
if(sender.hasPermission("areashop.setrestore")) {
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy, Message.fromKey("info-regionRestoringProfile").replacements(buy.getRestoreProfile()));
} else {
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy, "");
}
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy);
}
// Restrictions
if(!buy.isSold()) {
@@ -1,6 +1,7 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
@@ -9,7 +10,9 @@ import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MeCommand extends CommandAreaShop {
@@ -106,8 +109,15 @@ public class MeCommand extends CommandAreaShop {
}
}
public static void show() {
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
}
return result;
}
}
@@ -98,28 +98,21 @@ public class SetownerCommand extends CommandAreaShop {
calendar.setTimeInMillis(rent.getRentedUntil() + rent.getDuration());
rent.setRentedUntil(calendar.getTimeInMillis());
rent.setRenter(uuid);
rent.update();
plugin.message(sender, "setowner-succesRentExtend", region);
} else {
// change
Calendar calendar = Calendar.getInstance();
long current = calendar.getTimeInMillis();
if(rent.isRented()) {
current = rent.getRentedUntil();
}
calendar.setTimeInMillis(current + rent.getDuration());
rent.setRentedUntil(calendar.getTimeInMillis());
rent.setRenter(uuid);
rent.update();
plugin.message(sender, "setowner-succesRent", region);
}
}
if(region.isBuyRegion()) {
BuyRegion buy = (BuyRegion)region;
buy.setBuyer(uuid);
buy.update();
plugin.message(sender, "setowner-succesBuy", region);
}
region.getFriendsFeature().deleteFriend(region.getOwner(), null);
region.update();
region.saveRequired();
}
@Override
@@ -1,6 +1,7 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
@@ -11,7 +12,6 @@ import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -98,19 +98,28 @@ public class StackCommand extends CommandAreaShop {
}
// Get facing of the player (must be clearly one of the four directions to make sure it is no mistake)
BlockFace facing = Utils.yawToFacing(player.getLocation().getYaw());
if(!(facing == BlockFace.NORTH || facing == BlockFace.EAST || facing == BlockFace.SOUTH || facing == BlockFace.WEST)) {
plugin.message(player, "stack-unclearDirection", facing.toString().toLowerCase().replace('_', '-'));
if (player.getLocation().getPitch() > 45) {
facing = BlockFace.DOWN;
} else if (player.getLocation().getPitch() < -45) {
facing = BlockFace.UP;
}
if (!(facing == BlockFace.NORTH || facing == BlockFace.EAST || facing == BlockFace.SOUTH || facing == BlockFace.WEST || facing == BlockFace.UP || facing == BlockFace.DOWN)) {
plugin.message(player, "stack-unclearDirection", facing.toString().toLowerCase().replace('_', '-'));
return;
}
final Location shift = new Location(selection.getWorld(), 0, 0, 0);
Vector shift = new BlockVector(0, 0, 0);
if(facing == BlockFace.SOUTH) {
shift.setZ(-selection.getLength() - gap);
shift = shift.setZ(-selection.getLength()-gap);
} else if(facing == BlockFace.WEST) {
shift.setX(selection.getWidth() + gap);
shift = shift.setX(selection.getWidth()+gap);
} else if(facing == BlockFace.NORTH) {
shift.setZ(selection.getLength() + gap);
shift = shift.setZ(selection.getLength()+gap);
} else if(facing == BlockFace.EAST) {
shift.setX(-selection.getWidth() - gap);
shift = shift.setX(-selection.getWidth()-gap);
} else if (facing == BlockFace.DOWN) {
shift = shift.setY(-selection.getHeight()-gap);
} else if (facing == BlockFace.UP) {
shift = shift.setY(selection.getHeight()+gap);
}
AreaShop.debug(" calculated shift vector: " + shift + ", with facing=" + facing);
// Create regions and add them to AreaShop
@@ -119,26 +128,31 @@ public class StackCommand extends CommandAreaShop {
final boolean rentRegions = "rent".equalsIgnoreCase(args[4]);
final int amount = tempAmount;
final RegionGroup finalGroup = group;
final Vector finalShift = shift;
String type;
if(rentRegions) {
type = "rent";
} else {
type = "buy";
}
Message groupsMessage = Message.none();
Message groupsMessage = Message.empty();
if(group != null) {
groupsMessage = Message.fromKey("stack-addToGroup").replacements(group.getName());
}
plugin.message(player, "stack-accepted", amount, type, gap, namePrefix, groupsMessage);
plugin.message(player, "stack-addStart", amount, regionsPerTick*20);
new BukkitRunnable() {
private int current = 0;
private RegionManager manager = AreaShop.getInstance().getWorldGuard().getRegionManager(selection.getWorld());
private int current = -1;
private RegionManager manager = AreaShop.getInstance().getWorldGuard().getRegionManager(selection.getWorld());
private int counter = 1;
@Override
private int tooLow = 0;
private int tooHigh = 0;
@Override
public void run() {
for(int i=0; i<regionsPerTick; i++) {
if(current < amount) {
current++;
if(current < amount) {
// Create the region name
String counterName = counter+"";
int minimumLength = plugin.getConfig().getInt("stackRegionNumberLength");
@@ -156,19 +170,18 @@ public class StackCommand extends CommandAreaShop {
regionName = namePrefix + counterName;
}
// Add the region to WorldGuard (at startposition shifted by the number of this region times the blocks it should shift)
ProtectedCuboidRegion region = new ProtectedCuboidRegion(regionName,
new BlockVector(
selection.getMinimumPoint().getBlockX() + shift.getBlockX()*current,
selection.getMinimumPoint().getBlockY() + shift.getBlockY()*current,
selection.getMinimumPoint().getBlockZ() + shift.getBlockZ()*current
),
new BlockVector(
selection.getMaximumPoint().getBlockX() + shift.getBlockX()*current,
selection.getMaximumPoint().getBlockY() + shift.getBlockY()*current,
selection.getMaximumPoint().getBlockZ() + shift.getBlockZ()*current
)
);
manager.addRegion(region);
BlockVector minimum = new BlockVector(selection.getNativeMinimumPoint().add(finalShift.multiply(current)));
BlockVector maximum = new BlockVector(selection.getNativeMaximumPoint().add(finalShift.multiply(current)));
// Check for out of bounds
if (minimum.getBlockY() < 0) {
tooLow++;
continue;
} else if (maximum.getBlockY() > 256) {
tooHigh++;
continue;
}
ProtectedCuboidRegion region = new ProtectedCuboidRegion(regionName, minimum, maximum);
manager.addRegion(region);
// Add the region to AreaShop
if(rentRegions) {
RentRegion rent = new RentRegion(plugin, region.getId(), selection.getWorld());
@@ -191,13 +204,20 @@ public class StackCommand extends CommandAreaShop {
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
buy.update();
}
current++;
}
}
}
}
if(current >= amount) {
if(player.isOnline()) {
plugin.message(player, "stack-addComplete");
}
int added = amount - tooLow - tooHigh;
Message wrong = Message.empty();
if(tooHigh > 0) {
wrong.append(Message.fromKey("stack-tooHigh").replacements(tooHigh));
}
if (tooLow > 0) {
wrong.append(Message.fromKey("stack-tooLow").replacements(tooLow));
}
plugin.message(player, "stack-addComplete", added, wrong);
}
this.cancel();
}
}
@@ -40,12 +40,13 @@ public class TeleportCommand extends CommandAreaShop {
Player player = (Player)person;
return player.hasPermission("areashop.teleportall")
|| region.isOwner(player) && player.hasPermission("areashop.teleport")
|| region.isAvailable() && player.hasPermission("areashop.teleportavailable")
|| region.getFriendsFeature().getFriends().contains(player.getUniqueId()) && player.hasPermission("areashop.teleportfriend");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.teleport") && !sender.hasPermission("areashop.teleportall") && !sender.hasPermission("areashop.teleportsign") && !sender.hasPermission("areashop.teleportsignall") && !sender.hasPermission("areashop.teleportfriend") && !sender.hasPermission("teleportfriendsign")) {
if(!sender.hasPermission("areashop.teleport") && !sender.hasPermission("areashop.teleportall") && !sender.hasPermission("areashop.teleportavailable") && !sender.hasPermission("areashop.teleportavailablesign") && !sender.hasPermission("areashop.teleportsign") && !sender.hasPermission("areashop.teleportsignall") && !sender.hasPermission("areashop.teleportfriend") && !sender.hasPermission("teleportfriendsign")) {
plugin.message(sender, "teleport-noPermission");
return;
}
@@ -1,21 +1,12 @@
package me.wiefferink.areashop.events;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class CancellableRegionEvent<T> extends RegionEvent<T> {
public class CancellableAreaShopEvent extends Event {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private String reason;
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
public CancellableRegionEvent(T region) {
super(region);
}
/**
@@ -50,4 +41,5 @@ public class CancellableAreaShopEvent extends Event {
public String getReason() {
return reason;
}
}
@@ -0,0 +1,7 @@
package me.wiefferink.areashop.events;
public class NotifyRegionEvent<T> extends RegionEvent<T> {
public NotifyRegionEvent(T region) {
super(region);
}
}
@@ -3,10 +3,14 @@ package me.wiefferink.areashop.events;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class NotifyAreaShopEvent extends Event {
public class RegionEvent<T> extends Event {
protected T region;
private static final HandlerList handlers = new HandlerList();
public RegionEvent(T region) {
this.region = region;
}
@Override
public HandlerList getHandlers() {
return handlers;
@@ -15,4 +19,12 @@ public class NotifyAreaShopEvent extends Event {
public static HandlerList getHandlerList() {
return handlers;
}
/**
* Get the region of this event
* @return The region the event is about
*/
public T getRegion() {
return region;
}
}
@@ -1,15 +1,14 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableAreaShopEvent;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.entity.Player;
/**
* Broadcasted when a player tries to buy a region.
*/
public class BuyingRegionEvent extends CancellableAreaShopEvent {
public class BuyingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private BuyRegion region;
private Player player;
/**
@@ -18,18 +17,10 @@ public class BuyingRegionEvent extends CancellableAreaShopEvent {
* @param player The player that tries to buy the region
*/
public BuyingRegionEvent(BuyRegion region, Player player) {
this.region = region;
super(region);
this.player = player;
}
/**
* Get the region that is about to be bought
* @return the region that is about to be bought
*/
public BuyRegion getRegion() {
return region;
}
/**
* Get the player that is trying to buy the region
* @return The player that is trying to buy the region
@@ -1,15 +1,14 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableAreaShopEvent;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.entity.Player;
/**
* Broadcasted when a player tries to rent a region
*/
public class RentingRegionEvent extends CancellableAreaShopEvent {
public class RentingRegionEvent extends CancellableRegionEvent<RentRegion> {
private RentRegion region;
private Player player;
private boolean extending;
@@ -20,19 +19,11 @@ public class RentingRegionEvent extends CancellableAreaShopEvent {
* @param extending true if the player is extending the rental of the region, otherwise false
*/
public RentingRegionEvent(RentRegion region, Player player, boolean extending) {
this.region = region;
super(region);
this.player = player;
this.extending = extending;
}
/**
* Get the region that is about to be rented
* @return the region that is about to be rented
*/
public RentRegion getRegion() {
return region;
}
/**
* Get the player that is trying to rent the region
* @return The player that is trying to rent the region
@@ -1,15 +1,14 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableAreaShopEvent;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.entity.Player;
/**
* Broadcasted when a player tries to resell a region
*/
public class ResellingRegionEvent extends CancellableAreaShopEvent {
public class ResellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private BuyRegion region;
private Player player;
/**
@@ -18,18 +17,10 @@ public class ResellingRegionEvent extends CancellableAreaShopEvent {
* @param player The player that is trying to buy this region from the current owner
*/
public ResellingRegionEvent(BuyRegion region, Player player) {
this.region = region;
super(region);
this.player = player;
}
/**
* Get the region that is about to be bought
* @return the region that is about to be bought
*/
public BuyRegion getRegion() {
return region;
}
/**
* Get the player that is trying to buy the region
* @return The player that is trying to buy the region
@@ -1,28 +1,18 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableAreaShopEvent;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
/**
* Broadcasted when a region is about to get sold
*/
public class SellingRegionEvent extends CancellableAreaShopEvent {
private BuyRegion region;
public class SellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
/**
* Constructor
* @param region The region that is about to get sold
*/
public SellingRegionEvent(BuyRegion region) {
this.region = region;
}
/**
* Get the region that is about to be sold
* @return the region that is about to be sold
*/
public BuyRegion getRegion() {
return region;
super(region);
}
}
@@ -1,28 +1,18 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableAreaShopEvent;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
/**
* Broadcasted when a region is about to be unrented
*/
public class UnrentingRegionEvent extends CancellableAreaShopEvent {
private RentRegion region;
public class UnrentingRegionEvent extends CancellableRegionEvent<RentRegion> {
/**
* Constructor
* @param region The region that is about to be unrented
*/
public UnrentingRegionEvent(RentRegion region) {
this.region = region;
}
/**
* Get the region that is about to be rented
* @return the region that is about to be rented
*/
public RentRegion getRegion() {
return region;
super(region);
}
}
@@ -1,6 +1,6 @@
package me.wiefferink.areashop.events.askandnotify;
import me.wiefferink.areashop.events.CancellableAreaShopEvent;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
@@ -8,9 +8,8 @@ import org.bukkit.command.CommandSender;
/**
* Broadcasted when a friend is being added to a region
*/
public class AddFriendEvent extends CancellableAreaShopEvent {
public class AddedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
private GeneralRegion region;
private OfflinePlayer friend;
private CommandSender by;
@@ -20,20 +19,12 @@ public class AddFriendEvent extends CancellableAreaShopEvent {
* @param friend The friend that is about to be added
* @param by The CommandSender that is adding the friend, or null if none
*/
public AddFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
this.region = region;
public AddedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
super(region);
this.friend = friend;
this.by = by;
}
/**
* Get the region where the friend is getting added to
* @return the region
*/
public GeneralRegion getRegion() {
return region;
}
/**
* Get the OfflinePlayer that is getting added as friend
* @return The friend that is getting added
@@ -1,6 +1,6 @@
package me.wiefferink.areashop.events.askandnotify;
import me.wiefferink.areashop.events.CancellableAreaShopEvent;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
@@ -8,9 +8,8 @@ import org.bukkit.command.CommandSender;
/**
* Broadcasted when a friend is being added to a region
*/
public class DeleteFriendEvent extends CancellableAreaShopEvent {
public class DeletedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
private GeneralRegion region;
private OfflinePlayer friend;
private CommandSender by;
@@ -20,20 +19,12 @@ public class DeleteFriendEvent extends CancellableAreaShopEvent {
* @param friend The friend that is about to be added
* @param by The CommandSender that is adding the friend, or null if none
*/
public DeleteFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
this.region = region;
public DeletedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
super(region);
this.friend = friend;
this.by = by;
}
/**
* Get the region where the friend is getting added to
* @return the region
*/
public GeneralRegion getRegion() {
return region;
}
/**
* Get the OfflinePlayer that is getting added as friend
* @return The friend that is getting added
@@ -1,28 +1,19 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when a region has been added to AreaShop
*/
public class AddedRegionEvent extends NotifyAreaShopEvent {
private GeneralRegion region;
public class AddedRegionEvent extends NotifyRegionEvent<GeneralRegion> {
/**
* Constructor
* @param region The region that has been added
*/
public AddedRegionEvent(GeneralRegion region) {
this.region = region;
super(region);
}
/**
* Get the region that has been added
* @return the region that has been added
*/
public GeneralRegion getRegion() {
return region;
}
}
@@ -1,28 +1,19 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
/**
* Broadcasted when a region has been bought
*/
public class BoughtRegionEvent extends NotifyAreaShopEvent {
private BuyRegion region;
public class BoughtRegionEvent extends NotifyRegionEvent<BuyRegion> {
/**
* Constructor
* @param region The region that has been bought
*/
public BoughtRegionEvent(BuyRegion region) {
this.region = region;
super(region);
}
/**
* Get the region that has been bought
* @return the region that has been bought
*/
public BuyRegion getRegion() {
return region;
}
}
@@ -0,0 +1,18 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when a region has been removed from AreaShop
*/
public class DeletedRegionEvent extends NotifyRegionEvent<GeneralRegion> {
/**
* Constructor
* @param region The region that has been removed
*/
public DeletedRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -1,29 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when the data of a region changes.
* Should be used for updating displays that use region data.
*/
public class RegionUpdateEvent extends NotifyAreaShopEvent {
private GeneralRegion region;
/**
* Contructor
* @param region The region that has been updated
*/
public RegionUpdateEvent(GeneralRegion region) {
this.region = region;
}
/**
* The region that has been updated
* @return The GeneralRegion that has been updated
*/
public GeneralRegion getRegion() {
return region;
}
}
@@ -1,28 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when a region has been removed from AreaShop
*/
public class RemovedRegionEvent extends NotifyAreaShopEvent {
private GeneralRegion region;
/**
* Constructor
* @param region The region that has been removed
*/
public RemovedRegionEvent(GeneralRegion region) {
this.region = region;
}
/**
* Get the region that has been removed
* @return the region that has been removed
*/
public GeneralRegion getRegion() {
return region;
}
}
@@ -1,14 +1,13 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
/**
* Broadcasted when a region has been rented
*/
public class RentedRegionEvent extends NotifyAreaShopEvent {
public class RentedRegionEvent extends NotifyRegionEvent<RentRegion> {
private RentRegion region;
private boolean extended;
/**
@@ -17,18 +16,11 @@ public class RentedRegionEvent extends NotifyAreaShopEvent {
* @param extended true if the region has been extended, false if this is the first time buying the region
*/
public RentedRegionEvent(RentRegion region, boolean extended) {
super(region);
this.region = region;
this.extended = extended;
}
/**
* Get the region that has been rented
* @return the region that has been rented
*/
public RentRegion getRegion() {
return region;
}
/**
* Check if the region was extended or rented for the first time
* @return true if the region was extended, false when rented for the first time
@@ -1,6 +1,6 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import java.util.UUID;
@@ -8,9 +8,8 @@ import java.util.UUID;
/**
* Broadcasted when a region has been resold
*/
public class ResoldRegionEvent extends NotifyAreaShopEvent {
public class ResoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
private BuyRegion region;
private UUID from;
/**
@@ -19,18 +18,10 @@ public class ResoldRegionEvent extends NotifyAreaShopEvent {
* @param from The player from who the region has been resold to the current owner
*/
public ResoldRegionEvent(BuyRegion region, UUID from) {
this.region = region;
super(region);
this.from = from;
}
/**
* Get the region that has been bought
* @return the region that has been bought
*/
public BuyRegion getRegion() {
return region;
}
/**
* Get the player that the region has been bought from
* @return The UUID of the player that the region has been bought from
@@ -1,6 +1,6 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import java.util.UUID;
@@ -8,9 +8,8 @@ import java.util.UUID;
/**
* Broadcasted when a region is sold
*/
public class SoldRegionEvent extends NotifyAreaShopEvent {
public class SoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
private BuyRegion region;
private UUID oldBuyer;
private double refundedMoney;
@@ -21,19 +20,11 @@ public class SoldRegionEvent extends NotifyAreaShopEvent {
* @param refundedMoney The amount of money that has been refunded
*/
public SoldRegionEvent(BuyRegion region, UUID oldBuyer, double refundedMoney) {
this.region = region;
super(region);
this.oldBuyer = oldBuyer;
this.refundedMoney = refundedMoney;
}
/**
* Get the region that has been sold
* @return the region that has been sold
*/
public BuyRegion getRegion() {
return region;
}
/**
* Get the player that the region is sold for
* @return The UUID of the player that the region is sold for
@@ -1,6 +1,6 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
import java.util.UUID;
@@ -8,7 +8,7 @@ import java.util.UUID;
/**
* Broadcasted when a region has been unrented
*/
public class UnrentedRegionEvent extends NotifyAreaShopEvent {
public class UnrentedRegionEvent extends NotifyRegionEvent<RentRegion> {
private RentRegion region;
private UUID oldRenter;
@@ -21,19 +21,11 @@ public class UnrentedRegionEvent extends NotifyAreaShopEvent {
* @param refundedMoney The amount of money that has been refunded
*/
public UnrentedRegionEvent(RentRegion region, UUID oldRenter, double refundedMoney) {
this.region = region;
super(region);
this.oldRenter = oldRenter;
this.refundedMoney = refundedMoney;
}
/**
* Get the region that has been unrented
* @return the region that has been unrented
*/
public RentRegion getRegion() {
return region;
}
/**
* Get the player that the region was unrented for
* @return The UUID of the player that the region was unrented for
@@ -0,0 +1,19 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when the data of a region changes.
* Should be used for updating displays that use region data.
*/
public class UpdateRegionEvent extends NotifyRegionEvent<GeneralRegion> {
/**
* Contructor
* @param region The region that has been updated
*/
public UpdateRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -3,13 +3,12 @@ package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.events.ask.*;
import me.wiefferink.areashop.events.askandnotify.AddFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeleteFriendEvent;
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
import me.wiefferink.areashop.events.notify.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class DebugFeature extends Feature implements Listener {
public class DebugFeature extends Feature {
@EventHandler
public void buyingRegion(BuyingRegionEvent event) {
@@ -62,8 +61,8 @@ public class DebugFeature extends Feature implements Listener {
}
@EventHandler
public void regionUpdate(RegionUpdateEvent event) {
//AreaShop.debug("RegionUpdateEvent: " + event.getRegion().getName() + " updated");
public void regionUpdate(UpdateRegionEvent event) {
//AreaShop.debug("UpdateRegionEvent: " + event.getRegion().getName() + " updated");
}
@EventHandler
@@ -72,17 +71,17 @@ public class DebugFeature extends Feature implements Listener {
}
@EventHandler
public void removedRegion(RemovedRegionEvent event) {
AreaShop.debug("RemovedRegionEvent: "+event.getRegion().getName());
public void removedRegion(DeletedRegionEvent event) {
AreaShop.debug("DeletedRegionEvent: "+event.getRegion().getName());
}
@EventHandler
public void addedFriend(AddFriendEvent event) {
AreaShop.debug("AddFriendEvent: region "+event.getRegion().getName()+", "+event.getFriend().getName()+" by "+(event.getBy() == null ? "<nobody>" : event.getBy().getName()));
public void addedFriend(AddedFriendEvent event) {
AreaShop.debug("AddedFriendEvent: region "+event.getRegion().getName()+", "+event.getFriend().getName()+" by "+(event.getBy() == null ? "<nobody>" : event.getBy().getName()));
}
@EventHandler
public void deleteFriend(DeleteFriendEvent event) {
AreaShop.debug("DeleteFriendEvent: region "+event.getRegion().getName()+", "+event.getFriend().getName()+" by "+(event.getBy() == null ? "<nobody>" : event.getBy().getName()));
public void deleteFriend(DeletedFriendEvent event) {
AreaShop.debug("DeletedFriendEvent: region "+event.getRegion().getName()+", "+event.getFriend().getName()+" by "+(event.getBy() == null ? "<nobody>" : event.getBy().getName()));
}
}
@@ -1,7 +1,26 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
public class Feature implements Listener {
public AreaShop plugin = AreaShop.getInstance();
public YamlConfiguration config = plugin.getConfig();
/**
* Start listening to events
*/
public void listen() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* Stop listening to events
*/
public void stopListen() {
HandlerList.unregisterAll(this);
}
public class Feature {
AreaShop plugin = AreaShop.getInstance();
}
@@ -1,7 +1,7 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.events.askandnotify.AddFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeleteFriendEvent;
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
@@ -25,7 +25,7 @@ public class FriendsFeature extends Feature {
*/
public boolean addFriend(UUID player, CommandSender by) {
// Fire and check event
AddFriendEvent event = new AddFriendEvent(region, Bukkit.getOfflinePlayer(player), by);
AddedFriendEvent event = new AddedFriendEvent(region, Bukkit.getOfflinePlayer(player), by);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
plugin.message(by, "general-cancelled", event.getReason(), this);
@@ -47,7 +47,7 @@ public class FriendsFeature extends Feature {
*/
public boolean deleteFriend(UUID player, CommandSender by) {
// Fire and check event
DeleteFriendEvent event = new DeleteFriendEvent(region, Bukkit.getOfflinePlayer(player), by);
DeletedFriendEvent event = new DeletedFriendEvent(region, Bukkit.getOfflinePlayer(player), by);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
plugin.message(by, "general-cancelled", event.getReason(), this);
@@ -2,7 +2,8 @@ package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.events.notify.RegionUpdateEvent;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.messages.Message;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@@ -14,11 +15,10 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import java.util.*;
public class SignsFeature extends Feature implements Listener {
public class SignsFeature extends Feature {
private static Map<String, RegionSign> allSigns = new HashMap<>();
@@ -67,7 +67,7 @@ public class SignsFeature extends Feature implements Listener {
}
@EventHandler
public void regionUpdate(RegionUpdateEvent event) {
public void regionUpdate(UpdateRegionEvent event) {
event.getRegion().getSignsFeature().update();
}
@@ -206,12 +206,12 @@ public class SignsFeature extends Feature implements Listener {
region.setSetting("general.signs."+key, null);
}
public String getProfile() {
String profile = region.getConfig().getString("general.signs."+key+".profile");
if(profile == null || profile.length() == 0) {
profile = region.getStringSetting("general.signProfile");
}
return profile;
/**
* Get the ConfigurationSection defining the sign layout
* @return The sign layout config
*/
public ConfigurationSection getProfile() {
return region.getConfigurationSectionSetting("general.signProfile", "signProfiles", region.getConfig().get("general.signs."+key+".profile"));
}
/**
@@ -222,72 +222,80 @@ public class SignsFeature extends Feature implements Listener {
if(region.isDeleted()) {
return false;
}
YamlConfiguration config = region.getConfig();
// Get the prefix
String prefix = "signProfiles."+getProfile()+"."+region.getState().getValue().toLowerCase()+".";
YamlConfiguration regionConfig = region.getConfig();
ConfigurationSection signConfig = getProfile();
Block block = getLocation().getBlock();
if(signConfig == null || !signConfig.isSet(region.getState().getValue())) {
block.setType(Material.AIR);
return true;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(region.getState().getValue());
// Get the lines
String[] signLines = new String[4];
signLines[0] = plugin.getConfig().getString(prefix+"line1");
signLines[1] = plugin.getConfig().getString(prefix+"line2");
signLines[2] = plugin.getConfig().getString(prefix+"line3");
signLines[3] = plugin.getConfig().getString(prefix+"line4");
// Check if the sign should be present
Block block = getLocation().getBlock();
if(!plugin.getConfig().isSet(prefix)
|| ((signLines[0] == null || signLines[0].length() == 0)
&& (signLines[1] == null || signLines[1].length() == 0)
&& (signLines[2] == null || signLines[2].length() == 0)
&& (signLines[3] == null || signLines[3].length() == 0))) {
block.setType(Material.AIR);
} else {
Sign signState = null;
if(block.getType() != Material.WALL_SIGN && block.getType() != Material.SIGN_POST) {
Material signType;
try {
signType = Material.valueOf(config.getString("general.signs."+key+".signType"));
} catch(NullPointerException|IllegalArgumentException e) {
signType = null;
}
if(signType != Material.WALL_SIGN && signType != Material.SIGN_POST) {
AreaShop.debug(" setting sign failed");
return false;
}
block.setType(signType);
signState = (Sign)block.getState();
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
BlockFace signFace;
try {
signFace = BlockFace.valueOf(config.getString("general.signs."+key+".facing"));
} catch(NullPointerException|IllegalArgumentException e) {
signFace = null;
}
if(signFace != null) {
signData.setFacingDirection(signFace);
signState.setData(signData);
}
}
if(signState == null) {
signState = (Sign)block.getState();
}
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
if(!config.isString("general.signs."+key+".signType")) {
region.setSetting("general.signs."+key+".signType", signState.getType().toString());
}
if(!config.isString("general.signs."+key+".facing")) {
region.setSetting("general.signs."+key+".facing", signData.getFacing().toString());
}
// Apply replacements and color and then set it on the sign
for(int i = 0; i < signLines.length; i++) {
if(signLines[i] == null) {
signState.setLine(i, "");
continue;
}
signLines[i] = region.applyAllReplacements(signLines[i]);
signLines[i] = Utils.applyColors(signLines[i]);
signState.setLine(i, signLines[i]);
}
signState.update();
boolean signEmpty = true;
for(int i = 0; i < 4; i++) {
signLines[i] = stateConfig.getString("line"+(i+1));
signEmpty &= (signLines[i] == null || signLines[i].isEmpty());
}
if(signEmpty) {
block.setType(Material.AIR);
return true;
}
Sign signState = null;
// Place the sign back (with proper rotation and type) after it has been hidden or (indirectly) destroyed
if(block.getType() != Material.WALL_SIGN && block.getType() != Material.SIGN_POST) {
Material signType;
try {
signType = Material.valueOf(regionConfig.getString("general.signs."+key+".signType"));
} catch(NullPointerException|IllegalArgumentException e) {
signType = null;
}
if(signType != Material.WALL_SIGN && signType != Material.SIGN_POST) {
AreaShop.debug("Setting sign", key, "of region", region.getName(), "failed, could not set sign block back");
return false;
}
block.setType(signType);
signState = (Sign)block.getState();
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
BlockFace signFace;
try {
signFace = BlockFace.valueOf(regionConfig.getString("general.signs."+key+".facing"));
} catch(NullPointerException|IllegalArgumentException e) {
signFace = null;
}
if(signFace != null) {
signData.setFacingDirection(signFace);
signState.setData(signData);
}
}
if(signState == null) {
signState = (Sign)block.getState();
}
// Save current rotation and type
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
if(!regionConfig.isString("general.signs."+key+".signType")) {
region.setSetting("general.signs."+key+".signType", signState.getType().toString());
}
if(!regionConfig.isString("general.signs."+key+".facing")) {
region.setSetting("general.signs."+key+".facing", signData.getFacing().toString());
}
// Apply replacements and color and then set it on the sign
for(int i = 0; i < signLines.length; i++) {
if(signLines[i] == null) {
signState.setLine(i, "");
continue;
}
signLines[i] = Message.fromString(signLines[i]).replacements(region).getSingle();
signLines[i] = Utils.applyColors(signLines[i]);
signState.setLine(i, signLines[i]);
}
signState.update();
return true;
}
@@ -296,13 +304,15 @@ public class SignsFeature extends Feature implements Listener {
* @return true if it needs periodic updates, otherwise false
*/
public boolean needsPeriodicUpdate() {
// Get the prefix
String prefix = "signProfiles."+getProfile()+"."+region.getState().getValue().toLowerCase()+".line";
String line;
// Get the lines
for(int i = 1; i < 5; i++) {
line = plugin.getConfig().getString(prefix+i);
if(line != null && line.length() != 0 && line.contains(AreaShop.tagTimeLeft)) {
ConfigurationSection signConfig = getProfile();
if(signConfig == null || !signConfig.isSet(region.getState().getValue().toLowerCase())) {
return false;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(region.getState().getValue().toLowerCase());
// Check the lines for the timeleft tag
for(int i = 1; i <= 4; i++) {
String line = stateConfig.getString("line"+i);
if(line != null && !line.isEmpty() && line.contains(Message.VARIABLESTART+AreaShop.tagTimeLeft+Message.VARIABLEEND)) {
return true;
}
}
@@ -316,27 +326,23 @@ public class SignsFeature extends Feature implements Listener {
* @return true if the commands ran successfully, false if any of them failed
*/
public boolean runSignCommands(Player clicker, GeneralRegion.ClickType clickType) {
// Get the profile set in the config
String profile = region.getConfig().getString("general.signs."+key+".profile");
if(profile == null || profile.length() == 0) {
profile = region.getStringSetting("general.signProfile");
ConfigurationSection signConfig = getProfile();
if(signConfig == null) {
return false;
}
// Get paths (state may change after running them)
String playerPath = "signProfiles."+profile+"."+region.getState().getValue().toLowerCase()+"."+clickType.getValue()+"Player";
String consolePath = "signProfiles."+profile+"."+region.getState().getValue().toLowerCase()+"."+clickType.getValue()+"Console";
ConfigurationSection stateConfig = signConfig.getConfigurationSection(region.getState().getValue().toLowerCase());
// Run player commands if specified
List<String> playerCommands = new ArrayList<>();
for(String command : plugin.getConfig().getStringList(playerPath)) {
playerCommands.add(command.replace(AreaShop.tagClicker, clicker.getName()));
for(String command : stateConfig.getStringList(clickType.getValue()+"Player")) {
playerCommands.add(command.replace(Message.VARIABLESTART+AreaShop.tagClicker+Message.VARIABLEEND, clicker.getName()));
}
region.runCommands(clicker, playerCommands);
// Run console commands if specified
List<String> consoleCommands = new ArrayList<>();
for(String command : plugin.getConfig().getStringList(consolePath)) {
consoleCommands.add(command.replace(AreaShop.tagClicker, clicker.getName()));
for(String command : stateConfig.getStringList(clickType.getValue()+"Console")) {
consoleCommands.add(command.replace(Message.VARIABLESTART+AreaShop.tagClicker+Message.VARIABLEEND, clicker.getName()));
}
region.runCommands(Bukkit.getConsoleSender(), consoleCommands);
@@ -6,20 +6,19 @@ import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.flags.RegionGroupFlag;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.notify.RegionUpdateEvent;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.messages.Message;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import java.util.Set;
public class WorldGuardRegionFlagsFeature extends Feature implements Listener {
public class WorldGuardRegionFlagsFeature extends Feature {
@EventHandler
public void regionUpdate(RegionUpdateEvent event) {
public void regionUpdate(UpdateRegionEvent event) {
updateRegionFlags(event.getRegion());
}
@@ -31,19 +30,26 @@ public class WorldGuardRegionFlagsFeature extends Feature implements Listener {
protected boolean updateRegionFlags(GeneralRegion region) {
boolean result = true;
// General region flags
String allPath = "flagProfiles."+region.getStringSetting("general.flagProfile")+".ALL";
ConfigurationSection generalFlags = plugin.getConfig().getConfigurationSection(allPath);
if(plugin.getConfig().isSet(allPath) && generalFlags != null) { // Explicitely check if it is set, so don't apply if only in the default config
result = updateRegionFlags(region, generalFlags);
// Get section defining the region flag profile
ConfigurationSection flagProfileSection = region.getConfigurationSectionSetting("general.flagProfile", "flagProfiles");
if(flagProfileSection == null) {
return false;
}
// Specific region flags
String specificPath = "flagProfiles."+region.getStringSetting("general.flagProfile")+"."+region.getState().getValue();
if(plugin.getConfig().isSet(specificPath)) { // Do no apply default flags if they are removed from the active config
ConfigurationSection specificFlags = plugin.getConfig().getConfigurationSection(specificPath);
result = result && specificFlags != null && updateRegionFlags(region, specificFlags);
// Region flags for all states
String allPath = "flagProfiles."+region.getStringSetting("general.flagProfile")+".ALL";
ConfigurationSection allFlags = flagProfileSection.getConfigurationSection("ALL");
if(allFlags != null) {
result = result && updateRegionFlags(region, allFlags);
}
// Region flags for the current state
String specificPath = "flagProfiles."+region.getStringSetting("general.flagProfile")+"."+region.getState().getValue();
ConfigurationSection stateFlags = flagProfileSection.getConfigurationSection(region.getState().getValue());
if(stateFlags != null) {
result = result && updateRegionFlags(region, stateFlags);
}
return result;
}
/**
@@ -105,7 +105,7 @@ public final class SignChangeListener implements Listener {
}
ProtectedRegion region = regionManager.getRegion(secondLine);
if(region == null) {
plugin.message(player, "cmd-notRegistered", secondLine);
plugin.message(player, "cmd-noRegion", secondLine);
return;
}
@@ -219,7 +219,7 @@ public final class SignChangeListener implements Listener {
}
ProtectedRegion region = regionManager.getRegion(secondLine);
if(region == null) {
plugin.message(player, "add-noRegion", secondLine);
plugin.message(player, "cmd-noRegion", secondLine);
return;
}
FileManager.AddResult addResult = plugin.getFileManager().checkRegionAdd(player, region, GeneralRegion.RegionType.BUY);
@@ -290,7 +290,7 @@ public final class SignChangeListener implements Listener {
// Get region by secondLine of the sign
region = plugin.getFileManager().getRegion(secondLine);
if(region == null) {
plugin.message(player, "add-noRegion", secondLine);
plugin.message(player, "cmd-noRegion", secondLine);
return;
}
} else {
@@ -7,7 +7,7 @@ import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.events.notify.AddedRegionEvent;
import me.wiefferink.areashop.events.notify.RemovedRegionEvent;
import me.wiefferink.areashop.events.notify.DeletedRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.GeneralRegion.RegionEvent;
@@ -335,7 +335,7 @@ public class FileManager {
result = true;
// Broadcast event
Bukkit.getPluginManager().callEvent(new RemovedRegionEvent(rent));
Bukkit.getPluginManager().callEvent(new DeletedRegionEvent(rent));
// Run commands
rent.runEventCommands(RegionEvent.DELETED, false);
@@ -391,7 +391,7 @@ public class FileManager {
result = true;
// Broadcast event
Bukkit.getPluginManager().callEvent(new RemovedRegionEvent(buy));
Bukkit.getPluginManager().callEvent(new DeletedRegionEvent(buy));
// Run commands
buy.runEventCommands(RegionEvent.DELETED, false);
@@ -20,7 +20,7 @@ public class FancyMessageFormat {
/**
* The special character that prefixes all basic chat formatting codes.
*/
private static final char SIMPLE_FORMAT_PREFIX_CHAR = '\u00A7';
private static final char SIMPLE_FORMAT_PREFIX_CHAR = '§';
/**
* Resets all previous chat colors or formats.
@@ -71,9 +71,9 @@ public class FancyMessageFormat {
* Parses the given FancyMessageFormat message to a JSON array that can be
* used with the tellraw command and the like.
* @param message The mesage to convert to JSON
* @return JSON string that can be send to a player
* @return JSON strings that can be send to a player (multiple means line breaks have been used)
*/
public static String convertToJSON(final String message) {
public static List<String> convertToJSON(final String message) {
return convertToJSON(Collections.singleton(message));
}
@@ -81,27 +81,41 @@ public class FancyMessageFormat {
* Parses the given FancyMessageFormat message to a JSON array that can be
* used with the tellraw command and the like.
* @param inputLines Input message split at line breaks.
* @return JSON string that can be send to a player
* @return JSON string that can be send to a player (multiple means line breaks have been used)
*/
public static String convertToJSON(final Iterable<String> inputLines) {
public static List<String> convertToJSON(final Iterable<String> inputLines) {
ArrayList<String> lines = cleanInputString(inputLines);
LinkedList<InteractiveMessagePart> message = parse(lines);
StringBuilder sb = new StringBuilder();
sb.append("[");
if(message.size() == 1) {
sb.append(message.getFirst().toJSON());
} else if(message.size() > 0) {
sb.append("{\"text\":\"\",\"extra\":[");
for(InteractiveMessagePart messagePart : message) {
sb.append(messagePart.toJSON());
sb.append(',');
List<String> result = new ArrayList<>();
List<InteractiveMessagePart> combine = new ArrayList<>(); // Part that are combined to a line
while(!message.isEmpty()) {
InteractiveMessagePart part = message.removeFirst();
combine.add(part);
if(part.newline || message.isEmpty()) {
if(combine.size() == 1) {
StringBuilder nextLine = new StringBuilder("[");
combine.get(0).toJSON(nextLine);
nextLine.append("]");
result.add(nextLine.toString());
} else if(combine.size() > 1) {
StringBuilder nextLine = new StringBuilder("[{\"text\":\"\",\"extra\":[");
for(int i = 0; i < combine.size(); i++) {
// Skip possibly last empty InteractiveMessagePart which has newline set
if(!combine.get(i).content.isEmpty()) {
if(i != 0) {
nextLine.append(",");
}
combine.get(i).toJSON(nextLine);
}
}
nextLine.append("]}]");
result.add(nextLine.toString());
}
combine.clear();
}
sb.deleteCharAt(sb.length()-1);
sb.append("]}");
}
sb.append("]");
return sb.toString();
return result;
}
@@ -136,7 +150,7 @@ public class FancyMessageFormat {
LinkedList<InteractiveMessagePart> parts = parse(inputLines, false);
StringBuilder result = new StringBuilder();
for(InteractiveMessagePart part : parts) {
result.append(part.toSimpleString());
part.toSimpleString(result);
}
return result.toString();
}
@@ -156,6 +170,7 @@ public class FancyMessageFormat {
}
String lineContent = message.remove(line);
if(start > lineContent.length() || end > lineContent.length()) {
message.add(line, lineContent); // Repair damage
return;
}
if(isTaggedInteractive(lineContent)) {
@@ -263,7 +278,6 @@ public class FancyMessageFormat {
if(isTextLine || isHoverLine) {
// Parse inline tags
Color currentLineColor = currentColor;
Set<FormatType> currentLineFormatting = currentFormatting;
LinkedList<TextMessagePart> targetList = messagePart.content;
@@ -296,7 +310,7 @@ public class FancyMessageFormat {
}
// Add a text part with the correct formatting
if((tagged && nextTag.tag == ControlTag.BREAK) || !textToAdd.isEmpty()) {
if(!textToAdd.isEmpty()) {
TextMessagePart part = new TextMessagePart();
part.text = textToAdd;
part.formatTypes = new HashSet<>(currentLineFormatting);
@@ -315,9 +329,8 @@ public class FancyMessageFormat {
} else if(tag instanceof FormatCloseTag) {
currentLineFormatting.remove(((FormatCloseTag)tag).closes);
} else if(tag == ControlTag.BREAK) {
if(!targetList.isEmpty()) {
targetList.getLast().text += '\n';
}
messagePart.newline = true;
currentLineFormatting.clear();
continue lineLoop;
} else if(tag == ControlTag.RESET) {
currentLineFormatting.clear();
@@ -329,12 +342,18 @@ public class FancyMessageFormat {
if(!isHoverLine) {
// Adapt global attributes
currentColor = currentLineColor;
if(messagePart.content.size() == 0) { // Prevent interactive parts without content
message.removeLast();
}
}
}
}
// Cleanup empty parts (some parts only affected the formatting of next parts, but do not have actual content)
Iterator<InteractiveMessagePart> it = message.iterator();
while(it.hasNext()) {
InteractiveMessagePart check = it.next();
if(check.content.size() == 0 && !check.newline) {
it.remove();
}
}
return message;
}
@@ -345,12 +364,12 @@ public class FancyMessageFormat {
* Null if nothing is found.
*/
private static TaggedContent getNextTag(String line, boolean parseBreak) {
Pattern pattern = Pattern.compile("\\[[/a-zA-Z1-9]+\\]|&[1-9abcdeflonskr]");
Pattern pattern = Pattern.compile("\\[[/a-zA-Z1-9]+\\]|[&"+SIMPLE_FORMAT_PREFIX_CHAR+"][1-9abcdeflonskr]");
Matcher matcher = pattern.matcher(line);
// TODO Fix for escape things, and something with parseBreak?
while(matcher.find()) {
Tag tag = null;
if(matcher.group().startsWith("&")) {
if(matcher.group().startsWith("&") || matcher.group().startsWith(SIMPLE_FORMAT_PREFIX_CHAR+"")) {
for(Color color : Color.class.getEnumConstants()) {
if(color.getNativeFormattingCode() == matcher.group().charAt(1)) {
tag = color;
@@ -450,21 +469,21 @@ public class FancyMessageFormat {
* Produce a string in double quotes with backslash sequences in all the
* right places.
* @param string A String
* @param sb The StringBuilder to add the quoted string to
* @return A String correctly formatted for insertion in a JSON text.
*/
/*
* Copyright (c) 2002 JSON.org
* Licensed under the Apache License, Version 2.0
*/
private static String quoteStringJson(String string) {
private static StringBuilder quoteStringJson(String string, StringBuilder sb) {
if(string == null || string.length() == 0) {
return "\"\"";
return new StringBuilder("\"\"");
}
char c;
int i;
int len = string.length();
StringBuilder sb = new StringBuilder(len+4);
String t;
sb.append('"');
@@ -506,7 +525,7 @@ public class FancyMessageFormat {
}
}
sb.append('"');
return sb.toString();
return sb;
}
@@ -538,10 +557,10 @@ public class FancyMessageFormat {
/**
* Get a simple colored/formatted string
* @return String with formatting
* @param sb The StringBuilder to append the result to
* @return StringBuilder with the message appended
*/
String toSimpleString() {
StringBuilder sb = new StringBuilder();
StringBuilder toSimpleString(StringBuilder sb) {
// Color
if(color != null) {
sb.append(SIMPLE_FORMAT_PREFIX_CHAR);
@@ -554,17 +573,18 @@ public class FancyMessageFormat {
}
// Text
sb.append(text);
return sb.toString();
return sb;
}
/**
* Get a JSON component for this message part
* @param sb The StringBuilder to append the result to
* @return This part formatted in JSON
*/
String toJSON() {
StringBuilder sb = new StringBuilder();
StringBuilder toJSON(StringBuilder sb) {
sb.append('{');
sb.append("\"text\":").append(quoteStringJson(text));
sb.append("\"text\":");
quoteStringJson(text, sb);
if(color != null && color != Color.WHITE) {
sb.append(",\"color\":\"").append(color.jsonValue).append("\"");
}
@@ -574,7 +594,7 @@ public class FancyMessageFormat {
sb.append("true");
}
sb.append('}');
return sb.toString();
return sb;
}
boolean hasFormatting() {
@@ -594,6 +614,7 @@ public class FancyMessageFormat {
private static class InteractiveMessagePart {
LinkedList<TextMessagePart> content = new LinkedList<>();
boolean newline = false;
// Click
ClickType clickType = null;
@@ -604,32 +625,37 @@ public class FancyMessageFormat {
LinkedList<TextMessagePart> hoverContent = null;
/**
* Get a simple colored/formatted string
* @return String with formatting
* Append the message content to the StringBuilder
* @param sb The StringBuilder to append the message to
*/
String toSimpleString() {
StringBuilder sb = new StringBuilder();
StringBuilder toSimpleString(StringBuilder sb) {
for(TextMessagePart part : content) {
sb.append(part.toSimpleString());
part.toSimpleString(sb);
}
return sb.toString();
return sb;
}
/**
* Get a JSON component for this message part
* @param sb The StringBuilder to append the result to
* @return This part formatted in JSON
*/
String toJSON() {
StringBuilder sb = new StringBuilder();
StringBuilder toJSON(StringBuilder sb) {
// Error case, should never happen, print something as safeguard
if(content.size() == 0) {
sb.append("{\"text\":\"\"}");
return sb;
}
if(content.size() == 1) {
// Add attributes to TextMessagePart object
sb.append(content.getFirst().toJSON());
content.getFirst().toJSON(sb);
sb.deleteCharAt(sb.length()-1);
} else {
sb.append('{');
sb.append("\"text\":\"\",\"extra\":[");
for(TextMessagePart textPart : content) {
sb.append(textPart.toJSON());
textPart.toJSON(sb);
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
@@ -639,7 +665,8 @@ public class FancyMessageFormat {
sb.append(',');
sb.append("\"clickEvent\":{");
sb.append("\"action\":\"").append(clickType.getJsonKey()).append("\",");
sb.append("\"value\":").append(quoteStringJson(clickContent));
sb.append("\"value\":");
quoteStringJson(clickContent, sb);
sb.append('}');
}
if(hoverType != null) {
@@ -650,14 +677,14 @@ public class FancyMessageFormat {
if(hoverContent.size() == 1) {
TextMessagePart hoverPart = hoverContent.getFirst();
if(hoverPart.hasFormatting()) {
sb.append(hoverPart.toJSON());
hoverPart.toJSON(sb);
} else {
sb.append(quoteStringJson(hoverPart.text));
quoteStringJson(hoverPart.text, sb);
}
} else {
sb.append('[');
for(TextMessagePart hoverPart : hoverContent) {
sb.append(hoverPart.toJSON());
hoverPart.toJSON(sb);
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
@@ -666,12 +693,12 @@ public class FancyMessageFormat {
sb.append('}');
}
sb.append('}');
return sb.toString();
return sb;
}
@Override
public String toString() {
return "InteractiveMessagePart(textMessageParts:"+content+", clickType:"+clickType+", clickContent:"+clickContent+", hoverType:"+hoverType+", hoverContent:"+hoverContent+")";
return "InteractiveMessagePart(textMessageParts:"+content+", clickType:"+clickType+", clickContent:"+clickContent+", hoverType:"+hoverType+", hoverContent:"+hoverContent+", newline:"+newline+")";
}
}
@@ -10,7 +10,7 @@ import java.util.*;
public class LanguageManager {
private AreaShop plugin = null;
private String languages[] = {"EN", "NL", "FR", "DE", "NO", "RU"};
private String languages[] = {"EN", "NL", "FR", "DE", "RU", "SV", "NO"};
private Map<String, List<String>> currentLanguage, defaultLanguage;
/**
@@ -19,14 +19,6 @@ public class LanguageManager {
*/
public LanguageManager(AreaShop plugin) {
this.plugin = plugin;
startup();
}
/**
* Save the default language files and open the current and backup language file
*/
public void startup() {
this.saveDefaults();
currentLanguage = loadLanguage(plugin.getConfig().getString("language"));
defaultLanguage = loadLanguage(languages[0]);
@@ -2,7 +2,7 @@ package me.wiefferink.areashop.messages;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -28,6 +28,7 @@ public class Message {
private List<String> message;
private Object[] replacements;
private String key = null;
private boolean doLanguageReplacements = true;
/**
* Internal use only
@@ -40,7 +41,7 @@ public class Message {
* Empty message object
* @return this
*/
public static Message none() {
public static Message empty() {
return new Message();
}
@@ -76,7 +77,7 @@ public class Message {
* @return Message as a list
*/
public List<String> get() {
executeReplacements();
doReplacements();
return message;
}
@@ -89,10 +90,19 @@ public class Message {
if(limit.reached()) {
return new ArrayList<>();
}
executeReplacements(limit);
doReplacements(limit);
return message;
}
/**
* Get the message with all replacements done
* @return Message as a string
*/
public String getSingle() {
doReplacements();
return StringUtils.join(message, "");
}
/**
* Get the raw message without replacing anything
* @return The message
@@ -101,12 +111,20 @@ public class Message {
return message;
}
/**
* Get raw message as string
* @return The raw message
*/
public String getSingleRaw() {
return StringUtils.join(message, "");
}
/**
* Get a plain string for the message (for example for using in the console)
* @return The message as simple string
*/
public String getPlain() {
executeReplacements();
doReplacements();
return FancyMessageFormat.convertToConsole(message);
}
@@ -168,6 +186,15 @@ public class Message {
return this;
}
/**
* Turn off language replacements for this message
* @return this
*/
public Message noLanguageReplacements() {
doLanguageReplacements = false;
return this;
}
/**
* Send the message to a target
* @param target The target to send the message to (Player, CommandSender, Logger)
@@ -177,22 +204,25 @@ public class Message {
if(message == null || message.size() == 0 || (message.size() == 1 && message.get(0).length() == 0) || target == null) {
return this;
}
executeReplacements();
doReplacements();
if(target instanceof Player) {
boolean sendPlain = true;
if(AreaShop.getInstance().getConfig().getBoolean("useFancyMessages") && fancyWorks) {
try {
String jsonString = FancyMessageFormat.convertToJSON(message);
if(jsonString.length() > MAXIMUMJSONLENGTH) {
AreaShop.getInstance().getLogger().severe("Message with key "+key+" could not be send, results in a JSON string that is too big to send to the client, start of the message: "+Utils.getMessageStart(this, 100));
return this;
boolean result = true;
List<String> jsonMessages = FancyMessageFormat.convertToJSON(message);
for(String jsonMessage : jsonMessages) {
if(jsonMessage.length() > MAXIMUMJSONLENGTH) {
AreaShop.error("Message with key", key, "could not be send, results in a JSON string that is too big to send to the client, start of the message:", Utils.getMessageStart(this, 100));
return this;
}
result &= Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tellraw "+((Player)target).getName()+" "+jsonMessage);
}
boolean result = Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tellraw "+((Player)target).getName()+" "+jsonString);
sendPlain = !result;
fancyWorks = result;
} catch(Exception e) {
fancyWorks = false;
AreaShop.getInstance().getLogger().warning("Sending fancy message did not work, falling back to plain messages. Message key: "+key);
AreaShop.error("Sending fancy message did not work, falling back to plain messages. Message key:", key);
AreaShop.debug(ExceptionUtils.getStackTrace(e));
}
}
@@ -209,7 +239,7 @@ public class Message {
} else if(target instanceof Logger) {
((Logger)target).info(plainMessage);
} else {
AreaShop.getInstance().getLogger().warning("Could not send message, target is wrong: "+plainMessage);
AreaShop.warn("Could not send message, target is wrong: "+plainMessage);
}
}
return this;
@@ -254,12 +284,13 @@ public class Message {
/**
* Apply all replacements to the message
* @return this
*/
private void executeReplacements() {
executeReplacements(new Limit(REPLACEMENTLIMIT, this));
public Message doReplacements() {
return doReplacements(new Limit(REPLACEMENTLIMIT, this));
}
private void executeReplacements(Limit limit) {
private Message doReplacements(Limit limit) {
// Replace variables until they are all gone, or when the limit is reached
Pattern variable = Pattern.compile(Pattern.quote(VARIABLESTART)+"[a-zA-Z]+"+Pattern.quote(VARIABLEEND));
@@ -272,20 +303,23 @@ public class Message {
if(limit.reached()) {
if(!limit.notified) {
limit.notified = true;
AreaShop.getInstance().getLogger().severe("Reached replacement limit, probably has replacements loops, problematic message key: "+limit.message.key+", first characters of the message: "+Utils.getMessageStart(limit.message, 100));
AreaShop.error("Reached replacement limit, probably has replacements loops, problematic message key: "+limit.message.key+", first characters of the message: "+Utils.getMessageStart(limit.message, 100));
}
break;
}
replaceArgumentVariables(limit);
replaceLanguageVariables(limit);
if(doLanguageReplacements) {
replaceLanguageVariables(limit);
}
shouldReplace = !message.equals(original);
}
} catch(StackOverflowError e) {
limit.left = 0;
limit.notified = true;
AreaShop.getInstance().getLogger().severe("Too many recursive replacements for message with key: "+limit.message.key+" (probably includes itself as replacement), start of the message: "+Utils.getMessageStart(limit.message, 100));
AreaShop.error("Too many recursive replacements for message with key: "+limit.message.key+" (probably includes itself as replacement), start of the message: "+Utils.getMessageStart(limit.message, 100));
}
return this;
}
/**
@@ -298,23 +332,38 @@ public class Message {
if(message == null || message.size() == 0 || replacements == null || limit.reached()) {
return;
}
boolean result = false;
Pattern variablePattern = Pattern.compile(Pattern.quote(VARIABLESTART)+"[a-zA-Z]+"+Pattern.quote(VARIABLEEND));
for(int i = 0; i < message.size(); i++) {
int number = 0;
for(Object param : replacements) {
String line = message.get(i);
if(param != null) {
if(param instanceof GeneralRegion) {
message.set(i, ((GeneralRegion)param).applyAllReplacements(message.get(i)));
if(param instanceof ReplacementProvider) {
Matcher matcher = variablePattern.matcher(line);
if(matcher.find()) {
Object replacement = ((ReplacementProvider)param).provideReplacement(matcher.group().substring(1, matcher.group().length()-1));
if(replacement != null) {
String result = "";
if(matcher.start() > 0) {
result += line.substring(0, matcher.start());
}
result += replacement.toString();
if(matcher.end() < line.length()) {
result += line.substring(matcher.end());
}
message.set(i, result);
}
}
} else if(param instanceof Message) {
Pattern variables = Pattern.compile(Pattern.quote(VARIABLESTART)+number+Pattern.quote(VARIABLEEND));
Matcher matches = variables.matcher(message.get(i));
if(matches.find()) { // Only replaces one occurance of the variable, others will be done next round
Pattern indexPattern = Pattern.compile(Pattern.quote(VARIABLESTART)+number+Pattern.quote(VARIABLEEND));
Matcher matcher = indexPattern.matcher(line);
if(matcher.find()) { // Only replaces one occurance of the variable, others will be done next round
int startDiff = message.size()-i;
List<String> insertMessage = ((Message)param).get(limit);
if(limit.reached()) {
return;
}
FancyMessageFormat.insertMessage(message, insertMessage, i, matches.start(), matches.end());
FancyMessageFormat.insertMessage(message, insertMessage, i, matcher.start(), matcher.end());
// Skip to end of insert
i = message.size()-startDiff;
}
@@ -350,10 +399,10 @@ public class Message {
String key;
Object[] arguments = null;
if(variable.contains("|")) {
key = variable.substring(6, variable.indexOf("|"));
arguments = variable.substring(variable.indexOf("|")+1, variable.length()-1).split("\\|");
key = variable.substring(VARIABLESTART.length()+LANGUAGEVARIABLE.length(), variable.indexOf("|"));
arguments = variable.substring(variable.indexOf("|")+1, variable.length()-VARIABLEEND.length()).split("\\|");
} else {
key = variable.substring(6, variable.length()-1);
key = variable.substring(VARIABLESTART.length()+LANGUAGEVARIABLE.length(), variable.length()-VARIABLEEND.length());
}
Message insert = Message.fromKey(key);
if(arguments != null) {
@@ -404,4 +453,16 @@ public class Message {
return left <= 0;
}
}
/**
* Provide custom replacement for variables
*/
public interface ReplacementProvider {
/**
* Get the replacement for a variable
* @param variable The variable to replace
* @return The replacement for the variable, or null if empty
*/
Object provideReplacement(String variable);
}
}
@@ -17,7 +17,6 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.util.Calendar;
import java.util.HashMap;
import java.util.UUID;
public class BuyRegion extends GeneralRegion {
@@ -46,6 +45,11 @@ public class BuyRegion extends GeneralRegion {
}
}
@Override
public boolean isAvailable() {
return !isSold();
}
/**
* Get the UUID of the owner of this region
* @return The UUID of the owner of this region
@@ -207,27 +211,34 @@ public class BuyRegion extends GeneralRegion {
public String getFormattedMoneyBackAmount() {
return Utils.formatCurrency(getMoneyBackAmount());
}
@Override
public HashMap<String, Object> getSpecificReplacements() {
// Fill the replacements map with things specific to a BuyRegion
HashMap<String, Object> result = new HashMap<>();
result.put(AreaShop.tagPrice, getFormattedPrice());
result.put(AreaShop.tagRawPrice, getPrice());
result.put(AreaShop.tagPlayerName, getPlayerName());
result.put(AreaShop.tagPlayerUUID, getBuyer());
result.put(AreaShop.tagResellPrice, getFormattedResellPrice());
result.put(AreaShop.tagRawResellPrice, getResellPrice());
result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount());
result.put(AreaShop.tagRawMoneyBackAmount, getMoneyBackAmount());
double moneyBackPercent = getMoneyBackPercentage();
if((moneyBackPercent%1.0) == 0.0) {
result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent);
} else {
result.put(AreaShop.tagMoneyBackPercentage, moneyBackPercent);
public Object provideReplacement(String variable) {
switch(variable) {
case AreaShop.tagPrice:
return getFormattedPrice();
case AreaShop.tagRawPrice:
return getPrice();
case AreaShop.tagPlayerName:
return getPlayerName();
case AreaShop.tagPlayerUUID:
return getBuyer();
case AreaShop.tagResellPrice:
return getFormattedResellPrice();
case AreaShop.tagRawResellPrice:
return getResellPrice();
case AreaShop.tagMoneyBackAmount:
return getFormattedMoneyBackAmount();
case AreaShop.tagRawMoneyBackAmount:
return getMoneyBackAmount();
case AreaShop.tagMoneyBackPercentage:
return getMoneyBackPercentage()%1.0 == 0.0 ? (int)getMoneyBackPercentage() : getMoneyBackPercentage();
case AreaShop.tagMaxInactiveTime:
return this.getFormattedInactiveTimeUntilSell();
default:
return super.provideReplacement(variable);
}
result.put(AreaShop.tagMaxInactiveTime, this.getFormattedInactiveTimeUntilSell());
return result;
}
/**
@@ -5,8 +5,8 @@ import com.sk89q.worldguard.protection.flags.DefaultFlag;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.events.NotifyAreaShopEvent;
import me.wiefferink.areashop.events.notify.RegionUpdateEvent;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.features.FriendsFeature;
import me.wiefferink.areashop.features.SignsFeature;
import me.wiefferink.areashop.interfaces.GeneralRegionInterface;
@@ -18,8 +18,10 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import javax.annotation.Nonnull;
import java.io.File;
@@ -27,7 +29,7 @@ import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
public abstract class GeneralRegion implements GeneralRegionInterface, Comparable<GeneralRegion> {
public abstract class GeneralRegion implements GeneralRegionInterface, Comparable<GeneralRegion>, Message.ReplacementProvider {
YamlConfiguration config;
private static ArrayList<Material> canSpawnIn = new ArrayList<>(Arrays.asList(Material.WOOD_DOOR, Material.WOODEN_DOOR, Material.SIGN_POST, Material.WALL_SIGN, Material.STONE_PLATE, Material.IRON_DOOR_BLOCK, Material.WOOD_PLATE, Material.TRAP_DOOR, Material.REDSTONE_LAMP_OFF, Material.REDSTONE_LAMP_ON, Material.DRAGON_EGG, Material.GOLD_PLATE, Material.IRON_PLATE));
private static ArrayList<Material> cannotSpawnOn = new ArrayList<>(Arrays.asList(Material.PISTON_EXTENSION, Material.PISTON_MOVING_PIECE, Material.SIGN_POST, Material.WALL_SIGN, Material.STONE_PLATE, Material.IRON_DOOR_BLOCK, Material.WOOD_PLATE, Material.TRAP_DOOR, Material.REDSTONE_LAMP_OFF, Material.REDSTONE_LAMP_ON, Material.CACTUS, Material.IRON_FENCE, Material.FENCE_GATE, Material.THIN_GLASS, Material.NETHER_FENCE, Material.DRAGON_EGG, Material.GOLD_PLATE, Material.IRON_PLATE, Material.STAINED_GLASS_PANE));
@@ -36,9 +38,6 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
private boolean saveRequired = false;
private boolean deleted = false;
private HashMap<String, Object> replacementsCache = null;
private long replacementsCacheTime = 0;
// Features
private FriendsFeature friendsFeature;
private SignsFeature signsFeature;
@@ -176,6 +175,12 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
*/
public abstract RegionType getType();
/**
* Get the region availability
* @return true/false if region cant be rented or sell
*/
public abstract boolean isAvailable();
// Sorting by name
/**
@@ -211,24 +216,18 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
* This will update region flags, signs, etc.
*/
public void update() {
Bukkit.getServer().getPluginManager().callEvent(new RegionUpdateEvent(this));
Bukkit.getServer().getPluginManager().callEvent(new UpdateRegionEvent(this));
}
/**
* Broadcast the given event and update the region status
* @param event The update event that should be broadcasted
*/
public void notifyAndUpdate(NotifyAreaShopEvent event) {
public void notifyAndUpdate(NotifyRegionEvent event) {
Bukkit.getPluginManager().callEvent(event);
update();
}
/**
* Get the tag replacements, used in commands or signs
* @return A map with strings like '%region%' linking to the value to replace it with
*/
public abstract HashMap<String, Object> getSpecificReplacements();
/**
* Get the state of a region
* @return The RegionState of the region
@@ -283,14 +282,7 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
public boolean isRestoreEnabled() {
return getBooleanSetting("general.enableRestore");
}
/**
* Get the restoreprofile as defined in config.yml
* @return The restoreprofile
*/
public String getRestoreProfile() {
return getStringSetting("general.schematicProfile");
}
/**
* Get the time that the player was last active
* @return Current time if he is online, last online time if offline, -1 if the region has no owner
@@ -508,85 +500,88 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
return result;
}
/**
* Get all the replacements for this region
* @return Map with the keys that need to be replaced with the value of the object
*/
public HashMap<String, Object> getAllReplacements() {
// Reply with cache if we have one
if(replacementsCache != null && (Calendar.getInstance().getTimeInMillis() - replacementsCacheTime) < 1000) {
return replacementsCache;
}
HashMap<String, Object> result = getSpecificReplacements();
result.put(AreaShop.tagRegionName, getName());
result.put(AreaShop.tagRegionType, getType().getValue().toLowerCase());
result.put(AreaShop.tagWorldName, getWorldName());
result.put(AreaShop.tagWidth, getWidth());
result.put(AreaShop.tagDepth, getDepth());
result.put(AreaShop.tagHeight, getHeight());
result.put(AreaShop.tagFriends, Utils.createCommaSeparatedList(getFriendsFeature().getFriendNames()));
result.put(AreaShop.tagFriendsUUID, Utils.createCommaSeparatedList(getFriendsFeature().getFriends()));
result.put(AreaShop.tagLandlord, getLandlordName());
result.put(AreaShop.tagLandlordUUID, getLandlord());
// Date/time stuff
Calendar calendar = Calendar.getInstance();
result.put(AreaShop.tagEpoch, calendar.getTimeInMillis());
result.put(AreaShop.tagMillisecond, calendar.get(Calendar.MILLISECOND));
result.put(AreaShop.tagSecond, calendar.get(Calendar.SECOND));
result.put(AreaShop.tagMinute, calendar.get(Calendar.MINUTE));
result.put(AreaShop.tagHour, calendar.get(Calendar.HOUR_OF_DAY));
result.put(AreaShop.tagDay, calendar.get(Calendar.DAY_OF_MONTH));
result.put(AreaShop.tagMonth, calendar.get(Calendar.MONTH));
result.put(AreaShop.tagYear, calendar.get(Calendar.YEAR));
// In specified format
SimpleDateFormat date = new SimpleDateFormat(plugin.getConfig().getString("timeFormatChat"));
String dateString = date.format(Calendar.getInstance().getTime());
result.put(AreaShop.tagDateTime, dateString);
date = new SimpleDateFormat(plugin.getConfig().getString("timeFormatSign"));
dateString = date.format(Calendar.getInstance().getTime());
result.put(AreaShop.tagDateTimeShort, dateString);
// Teleport location
Location tp = getTeleportLocation();
if(tp != null) {
result.put(AreaShop.tagTeleportBlockX, tp.getBlockX());
result.put(AreaShop.tagTeleportBlockY, tp.getBlockY());
result.put(AreaShop.tagTeleportBlockZ, tp.getBlockZ());
result.put(AreaShop.tagTeleportX, tp.getX());
result.put(AreaShop.tagTeleportY, tp.getY());
result.put(AreaShop.tagTeleportZ, tp.getZ());
result.put(AreaShop.tagTeleportPitch, tp.getPitch());
result.put(AreaShop.tagTeleportYaw, tp.getYaw());
result.put(AreaShop.tagTeleportPitchRound, Math.round(tp.getPitch()));
result.put(AreaShop.tagTeleportYawRound, Math.round(tp.getYaw()));
result.put(AreaShop.tagTeleportWorld, tp.getWorld().getName());
}
replacementsCache = result;
replacementsCacheTime = Calendar.getInstance().getTimeInMillis();
return result;
}
/**
* Applies all replacements to the given string
* @param source The source string to replace things in
* @return The result string with all the replacements applied
*/
public String applyAllReplacements(String source) {
if(source == null || source.length() == 0) {
return "";
@Override
public Object provideReplacement(String variable) {
switch(variable) {
// Basics
case AreaShop.tagRegionName:
return getName();
case AreaShop.tagRegionType:
return getType().getValue().toLowerCase();
case AreaShop.tagWorldName:
return getWorldName();
case AreaShop.tagWidth:
return getWidth();
case AreaShop.tagDepth:
return getDepth();
case AreaShop.tagHeight:
return getHeight();
case AreaShop.tagFriends:
return Utils.createCommaSeparatedList(getFriendsFeature().getFriendNames());
case AreaShop.tagFriendsUUID:
return Utils.createCommaSeparatedList(getFriendsFeature().getFriends());
case AreaShop.tagLandlord:
return getLandlordName();
case AreaShop.tagLandlordUUID:
return getLandlord();
// Date/time
case AreaShop.tagEpoch:
return Calendar.getInstance().getTimeInMillis();
case AreaShop.tagMillisecond:
return Calendar.getInstance().get(Calendar.MILLISECOND);
case AreaShop.tagSecond:
return Calendar.getInstance().get(Calendar.SECOND);
case AreaShop.tagMinute:
return Calendar.getInstance().get(Calendar.MINUTE);
case AreaShop.tagHour:
return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
case AreaShop.tagDay:
return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
case AreaShop.tagMonth:
return Calendar.getInstance().get(Calendar.MONTH);
case AreaShop.tagYear:
return Calendar.getInstance().get(Calendar.YEAR);
case AreaShop.tagDateTime:
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatChat")).format(Calendar.getInstance().getTime());
case AreaShop.tagDateTimeShort:
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatSign")).format(Calendar.getInstance().getTime());
// Teleport locations
default:
Location tp = getTeleportLocation();
if(tp == null) {
return null;
}
switch(variable) {
case AreaShop.tagTeleportBlockX:
return tp.getBlockX();
case AreaShop.tagTeleportBlockY:
return tp.getBlockY();
case AreaShop.tagTeleportBlockZ:
return tp.getBlockZ();
case AreaShop.tagTeleportX:
return tp.getX();
case AreaShop.tagTeleportY:
return tp.getY();
case AreaShop.tagTeleportZ:
return tp.getZ();
case AreaShop.tagTeleportPitch:
return tp.getPitch();
case AreaShop.tagTeleportYaw:
return tp.getYaw();
case AreaShop.tagTeleportPitchRound:
return Math.round(tp.getPitch());
case AreaShop.tagTeleportYawRound:
return Math.round(tp.getYaw());
case AreaShop.tagTeleportWorld:
return tp.getWorld().getName();
default:
return null;
}
}
// Apply static replacements
HashMap<String, Object> replacements = getAllReplacements();
for(String tag : replacements.keySet()) {
Object replacement = replacements.get(tag);
if(replacement != null) {
source = source.replace(tag, replacement.toString());
}
}
return source;
}
/**
@@ -700,7 +695,7 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
File parent = saveFile.getParentFile();
if (parent != null && !parent.exists()) {
if (!parent.mkdirs()) {
AreaShop.warn("Did not save region "+getName()+", schematic directory could not be created: "+saveFile);
AreaShop.warn("Did not save region "+getName()+", schematic directory could not be created: "+saveFile.getAbsolutePath());
return false;
}
}
@@ -724,12 +719,20 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
// The path to save the schematic
File restoreFile = new File(plugin.getFileManager().getSchematicFolder() + File.separator + fileName + AreaShop.schematicExtension);
if(!restoreFile.exists() || !restoreFile.isFile()) {
AreaShop.info("Did not restore region "+getName()+", schematic file does not exist: "+restoreFile);
AreaShop.info("Did not restore region "+getName()+", schematic file does not exist: "+restoreFile.getAbsolutePath());
return false;
}
boolean result = plugin.getWorldEditHandler().restoreRegionBlocks(restoreFile, this);
if(result) {
AreaShop.debug("Restored schematic for region " + getName());
// Workaround for signs inside the region in combination with async restore of plugins like AsyncWorldEdit and FastAsyncWorldEdit
new BukkitRunnable() {
@Override
public void run() {
getSignsFeature().update();
}
}.runTaskLater(plugin, 10L);
}
return result;
}
@@ -749,7 +752,6 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
* Indicate this region needs to be saved, saving will happen by a repeating task
*/
public void saveRequired() {
replacementsCache = null; // Remove cache
saveRequired = true;
}
@@ -804,6 +806,7 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
int checked = 1;
boolean owner;
boolean friend = getFriendsFeature().getFriends().contains(player.getUniqueId());
boolean available = isAvailable();
Location startLocation = null;
ProtectedRegion region = getRegion();
if(getWorld() == null) {
@@ -820,33 +823,41 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
owner = player.getUniqueId().equals(((BuyRegion)this).getBuyer());
}
if(checkPermissions) {
// Teleport to sign instead if they dont have permission for teleporting to region
if( (!toSign && owner && !player.hasPermission("areashop.teleport") && player.hasPermission("areashop.teleportsign")
|| !toSign && !owner && !friend && !player.hasPermission("areashop.teleportall") && player.hasPermission("areashop.teleportsignall")
|| !toSign && !owner && friend && !player.hasPermission("areashop.teleportfriend") && player.hasPermission("areashop.teleportfriendsign"))) {
|| !toSign && !owner && friend && !player.hasPermission("areashop.teleportfriend") && player.hasPermission("areashop.teleportfriendsign")
|| !toSign && !owner && !friend && available && !player.hasPermission("areashop.teleportavailable") && player.hasPermission("areashop.teleportavailablesign"))) {
message(player, "teleport-changedToSign");
toSign = true;
}
// Check permissions
if(owner && !player.hasPermission("areashop.teleport") && !toSign) {
if(owner && !available && !player.hasPermission("areashop.teleport") && !toSign) {
message(player, "teleport-noPermission");
return false;
} else if(!owner && !player.hasPermission("areashop.teleportall") && !toSign && !friend) {
} else if(!owner && !available && !player.hasPermission("areashop.teleportall") && !toSign && !friend) {
message(player, "teleport-noPermissionOther");
return false;
} else if(!owner && !player.hasPermission("areashop.teleportfriend") && !toSign && friend) {
} else if(!owner && !available && !player.hasPermission("areashop.teleportfriend") && !toSign && friend) {
message(player, "teleport-noPermissionFriend");
return false;
} else if(owner && !player.hasPermission("areashop.teleportsign") && toSign) {
} else if(available && !player.hasPermission("areashop.teleportavailable") && !toSign) {
message(player, "teleport-noPermissionAvailable");
return false;
} else if(owner && !available && !player.hasPermission("areashop.teleportsign") && toSign) {
message(player, "teleport-noPermissionSign");
return false;
} else if(!owner && !player.hasPermission("areashop.teleportsignall") && toSign && !friend) {
} else if(!owner && !available && !player.hasPermission("areashop.teleportsignall") && toSign && !friend) {
message(player, "teleport-noPermissionOtherSign");
return false;
} else if(!owner && !player.hasPermission("areashop.teleportfriendsign") && toSign && friend) {
} else if(!owner && !available && !player.hasPermission("areashop.teleportfriendsign") && toSign && friend) {
message(player, "teleport-noPermissionFriendSign");
return false;
} else if(available && !player.hasPermission("areashop.teleportavailablesign") && toSign) {
message(player, "teleport-noPermissionAvailableSign");
return false;
}
}
@@ -1388,6 +1399,89 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
return this.getFileManager().getDefaultSettings().getStringList(path);
}
/**
* Get a configuration section setting for this region, defined as follows
* - If the region has the setting in its own file (/regions/regionName.yml), use that
* - If the region has groups, use the setting defined by the most important group, if any
* - Otherwise fallback to the default.yml file setting
* @param path The path to get the setting of
* @return The value of the setting
*/
public ConfigurationSection getConfigurationSectionSetting(String path) {
if(config.isSet(path)) {
return config.getConfigurationSection(path);
}
ConfigurationSection result = null;
int priority = Integer.MIN_VALUE;
boolean found = false;
for(RegionGroup group : plugin.getFileManager().getGroups()) {
if(group.isMember(this) && group.getSettings().isSet(path) && group.getPriority() > priority) {
result = group.getSettings().getConfigurationSection(path);
priority = group.getPriority();
found = true;
}
}
if(found) {
return result;
}
return this.getFileManager().getDefaultSettings().getConfigurationSection(path);
}
/**
* Get a configuration section setting for this region, defined as follows
* - If the region has the setting in its own file (/regions/regionName.yml), use that
* - If the region has groups, use the setting defined by the most important group, if any
* - Otherwise fallback to the default.yml file setting
* @param path The path to get the setting of
* @param translateProfileName The name of the profile section in the plugin config file to translate result strings into sections
* @return The value of the setting
*/
public ConfigurationSection getConfigurationSectionSetting(String path, String translateProfileName) {
return getConfigurationSectionSetting(path, translateProfileName, null);
}
/**
* Get a configuration section setting for this region, defined as follows
* - If earlyResult is non-null, use that
* - Else if the region has the setting in its own file (/regions/regionName.yml), use that
* - Else if the region has groups, use the setting defined by the most important group, if any
* - Otherwise fallback to the default.yml file setting
* @param path The path to get the setting of
* @param translateProfileName The name of the profile section in the plugin config file to translate result strings into sections
* @param earlyResult Result that should have priority over the rest
* @return The value of the setting
*/
public ConfigurationSection getConfigurationSectionSetting(String path, String translateProfileName, Object earlyResult) {
Object result = null;
if(earlyResult != null) {
result = earlyResult;
} else if(config.isSet(path)) {
result = config.get(path);
} else {
boolean found = false;
int priority = Integer.MIN_VALUE;
for(RegionGroup group : plugin.getFileManager().getGroups()) {
if(group.isMember(this) && group.getSettings().isSet(path) && group.getPriority() > priority) {
result = group.getSettings().get(path);
priority = group.getPriority();
found = true;
}
}
if(!found) {
result = this.getFileManager().getDefaultSettings().get(path);
}
}
// Either result is a ConfigurationSection or is used as key in the plugin config to get a ConfigurationSection
if(result == null) {
return null;
} else if(result instanceof ConfigurationSection) {
return (ConfigurationSection)result;
} else {
return plugin.getConfig().getConfigurationSection(translateProfileName+"."+result.toString());
}
}
/**
* Set a setting in the file of the region itself
* @param path The path to set
@@ -1630,9 +1724,7 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
return false;
}
/**
* Checks an event and handles saving to and restoring from schematic for it
* @param type The type of event
@@ -1640,25 +1732,27 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
public void handleSchematicEvent(RegionEvent type) {
// Check the individual>group>default setting
if(!isRestoreEnabled()) {
AreaShop.debug("Schematic operations for " + getName() + " not enabled, skipped");
AreaShop.debug("Schematic operations for "+getName()+" not enabled, skipped");
return;
}
// Get the safe and restore names
String save = plugin.getConfig().getString("schematicProfiles." + getRestoreProfile() + "." + type.getValue() + ".save");
String restore = plugin.getConfig().getString("schematicProfiles." + getRestoreProfile() + "." + type.getValue() + ".restore");
// Get the safe and restore names
ConfigurationSection profileSection = getConfigurationSectionSetting("general.schematicProfile", "schematicProfiles");
String save = profileSection.getString(type.getValue()+".save");
String restore = profileSection.getString(type.getValue()+".restore");
// Save the region if needed
if(save != null && save.length() != 0) {
save = applyAllReplacements(save);
this.saveRegionBlocks(save);
save = Message.fromString(save).replacements(this).getSingle();
saveRegionBlocks(save);
}
// Restore the region if needed
if(restore != null && restore.length() != 0) {
restore = applyAllReplacements(restore);
this.restoreRegionBlocks(restore);
restore = Message.fromString(restore).replacements(this).getSingle();
restoreRegionBlocks(restore);
}
}
// COMMAND EXECUTING
// COMMAND EXECUTING
/**
* Run commands as the CommandsSender, replacing all tags with the relevant values
* @param sender The sender that should perform the command
@@ -1672,8 +1766,10 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
for(String command : commands) {
if(command == null || command.length() == 0) {
continue;
}
command = applyAllReplacements(command);
}
// It is not ideal we have to disable language replacements here, but otherwise giving language variables
// to '/areashop message' by a command in the config gets replaced and messes up the fancy formatting.
command = Message.fromString(command).replacements(this).noLanguageReplacements().getSingle();
boolean result;
String error = null;
@@ -1714,21 +1810,14 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
* @param before The 'before' or 'after' commands
*/
public void runEventCommands(RegionEvent event, boolean before) {
String profile = getStringSetting("general.eventCommandProfile");
if(profile == null || profile.length() == 0) {
ConfigurationSection eventCommandProfileSection = getConfigurationSectionSetting("general.eventCommandProfile", "eventCommandProfiles");
if(eventCommandProfileSection == null) {
return;
}
String path = "eventCommandProfiles." + profile + "." + event.getValue().toLowerCase();
if(before) {
path += ".before";
} else {
path += ".after";
}
List<String> commands = plugin.getConfig().getStringList(path);
// Don't waste time if there are no commands to be run
List<String> commands = eventCommandProfileSection.getStringList(event.getValue()+"."+(before ? "before" : "after"));
if(commands == null || commands.isEmpty()) {
return;
}
}
runCommands(Bukkit.getConsoleSender(), commands);
}
}
@@ -18,7 +18,7 @@ import org.bukkit.entity.Player;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import static me.wiefferink.areashop.Utils.millisToHumanFormat;
@@ -59,6 +59,11 @@ public class RentRegion extends GeneralRegion {
}
}
@Override
public boolean isAvailable() {
return !isRented();
}
/**
* Get the UUID of the player renting the region
* @return The UUID of the renter
@@ -129,36 +134,44 @@ public class RentRegion extends GeneralRegion {
setSetting("rent.timesExtended", times);
}
}
@Override
public HashMap<String, Object> getSpecificReplacements() {
// Fill the replacements map with things specific to a RentRegion
HashMap<String, Object> result = new HashMap<>();
result.put(AreaShop.tagPrice, getFormattedPrice());
result.put(AreaShop.tagRawPrice, getPrice());
result.put(AreaShop.tagDuration, getDurationString());
result.put(AreaShop.tagPlayerName, getPlayerName());
result.put(AreaShop.tagPlayerUUID, getRenter());
SimpleDateFormat date = new SimpleDateFormat(plugin.getConfig().getString("timeFormatChat"));
String dateString = date.format(new Date(getRentedUntil()));
result.put(AreaShop.tagRentedUntil, dateString);
date = new SimpleDateFormat(plugin.getConfig().getString("timeFormatSign"));
dateString = date.format(new Date(getRentedUntil()));
result.put(AreaShop.tagRentedUntilShort, dateString);
result.put(AreaShop.tagTimeLeft, getTimeLeftString());
result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount());
result.put(AreaShop.tagRawMoneyBackAmount, getMoneyBackAmount());
double moneyBackPercent = getMoneyBackPercentage();
if((moneyBackPercent%1.0) == 0.0) {
result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent);
} else {
result.put(AreaShop.tagMoneyBackPercentage, moneyBackPercent);
public Object provideReplacement(String variable) {
switch(variable) {
case AreaShop.tagPrice:
return getFormattedPrice();
case AreaShop.tagRawPrice:
return getPrice();
case AreaShop.tagDuration:
return getDurationString();
case AreaShop.tagPlayerName:
return getPlayerName();
case AreaShop.tagPlayerUUID:
return getRenter();
case AreaShop.tagRentedUntil:
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatChat")).format(new Date(getRentedUntil()));
case AreaShop.tagRentedUntilShort:
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatSign")).format(new Date(getRentedUntil()));
case AreaShop.tagTimeLeft:
return getTimeLeftString();
case AreaShop.tagMoneyBackAmount:
return getFormattedMoneyBackAmount();
case AreaShop.tagRawMoneyBackAmount:
return getMoneyBackAmount();
case AreaShop.tagMoneyBackPercentage:
return getMoneyBackPercentage()%1.0 == 0.0 ? (int)getMoneyBackPercentage() : getMoneyBackPercentage();
case AreaShop.tagMaxExtends:
return this.getMaxExtends();
case AreaShop.tagExtendsLeft:
return getMaxExtends()-getTimesExtended();
case AreaShop.tagMaxRentTime:
return millisToHumanFormat(getMaxRentTime());
case AreaShop.tagMaxInactiveTime:
return this.getFormattedInactiveTimeUntilUnrent();
default:
return super.provideReplacement(variable);
}
result.put(AreaShop.tagMaxExtends, this.getMaxExtends());
result.put(AreaShop.tagExtendsLeft, getMaxExtends() - getTimesExtended());
result.put(AreaShop.tagMaxRentTime, millisToHumanFormat(getMaxRentTime()));
result.put(AreaShop.tagMaxInactiveTime, this.getFormattedInactiveTimeUntilUnrent());
return result;
}
/**
@@ -313,7 +326,7 @@ public class RentRegion extends GeneralRegion {
double percentage = (getMoneyBackPercentage()) / 100.0;
Double timePeriod = (double) (getDuration());
double periods = timeLeft / timePeriod;
return periods * getPrice() * percentage;
return Math.max(0, periods*getPrice()*percentage);
}
/**
@@ -341,7 +354,7 @@ public class RentRegion extends GeneralRegion {
if(!isDeleted() && isRented() && now > getRentedUntil()) {
// Send message to the player if online
Player player = Bukkit.getPlayer(getRenter());
if(unRent(false, player)) {
if(unRent(false, null)) {
if(player != null) {
message(player, "unrent-expired");
}
@@ -356,19 +369,19 @@ public class RentRegion extends GeneralRegion {
* Sends all warnings since previous call until (now + normal delay), delay can be found in the config as well
*/
public void sendExpirationWarnings() {
// send from warningsDoneUntil to current+delay
// Send from warningsDoneUntil to current+delay
if(isDeleted() || !isRented()) {
return;
}
Player player = Bukkit.getPlayer(getRenter());
long sendUntil = Calendar.getInstance().getTimeInMillis()+(plugin.getConfig().getInt("expireWarning.delay")*60*1000);
// loop through warning defined in the config for the profile that is set for this region
String configPath = "expirationWarningProfiles."+getStringSetting("rent.expirationWarningProfile");
ConfigurationSection section = plugin.getConfig().getConfigurationSection(configPath);
if(section == null) {
ConfigurationSection profileSection = getConfigurationSectionSetting("rent.expirationWarningProfile", "expirationWarningProfiles");
if(profileSection == null) {
return;
}
for(String timeBefore : section.getKeys(false)) {
// Check if a warning needs to be send for each defined point in time
Player player = Bukkit.getPlayer(getRenter());
long sendUntil = Calendar.getInstance().getTimeInMillis()+(plugin.getConfig().getInt("expireWarning.delay")*60*1000);
for(String timeBefore : profileSection.getKeys(false)) {
long timeBeforeParsed = Utils.durationStringToLong(timeBefore);
if(timeBeforeParsed <= 0) {
return;
@@ -376,10 +389,22 @@ public class RentRegion extends GeneralRegion {
long checkTime = getRentedUntil()-timeBeforeParsed;
if(checkTime > warningsDoneUntil && checkTime <= sendUntil) {
if(plugin.getConfig().getBoolean(configPath+"."+timeBefore+".warnPlayer") && player != null) {
message(player, "rent-expireWarning");
List<String> commands;
if(profileSection.isConfigurationSection(timeBefore)) {
/* Legacy config layout:
* "1 minute":
* warnPlayer: true
* commands: ["say hi"]
*/
commands = profileSection.getStringList(timeBefore+".commands");
// Warn player
if(profileSection.getBoolean(timeBefore+".warnPlayer") && player != null) {
message(player, "rent-expireWarning", this);
}
} else {
commands = profileSection.getStringList(timeBefore);
}
this.runCommands(Bukkit.getConsoleSender(), plugin.getConfig().getStringList(configPath+"."+timeBefore+".commands"));
this.runCommands(Bukkit.getConsoleSender(), commands);
}
}
warningsDoneUntil = sendUntil;
+94 -270
View File
@@ -6,53 +6,54 @@
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ GENERAL: Options that influence the global state of the plugin │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Chatprefix used for all messages in the chat, also changes the greeting messages.
# Chat prefix used for all messages in the chat, also changes the greeting messages.
chatPrefix:
- '[darkgreen][AreaShop][reset]'
- ' hover: AreaShop region management plugin'
- ' hover: %lang:action|Click to check the available commands|%'
- ' command: /areashop help'
- ' '
## The language file that should be used, check the 'lang' folder for build-in languages (use the filename without .yml here).
## More information can be found here: https://github.com/NLthijs48/AreaShop/wiki/Language-support.
# The language file that should be used, check the 'lang' folder for build-in languages (use the filename without .yml here).
# More information can be found here: https://github.com/NLthijs48/AreaShop/wiki/Language-support.
language: EN
## The tags that need to be written on the first line of a sign to use it with AreaShop.
# The tags that need to be written on the first line of a sign to add it to AreaShop.
signTags:
## Add a rental region.
# Add a rental region.
rent: '[asrent]'
## Add a buy region.
# Add a buy region.
buy: '[asbuy]'
## Add a sign to an existing region.
# Add a sign to an existing region.
add: '[as]'
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ NUMBERS: Options to change the display of prices. │
# │ ECONOMY: Options to change the display of prices. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## The characters displayed before a price.
# The characters displayed before a price.
moneyCharacter: '$'
## The characters displayed after a price.
# The characters displayed after a price.
moneyCharacterAfter: ''
## How many numbers behind the dot should be shown (2 will make numbers like '8.55', '9.01', '5.20').
# How many numbers behind the dot should be shown (2 will make numbers like '8.55', '9.01', '5.20').
fractionalNumbers: 2
## Set this to true if you want to hide '.0' for a number like '15.0' ('4.50' will still stay '4.50').
# Set this to true if you want to hide '.0' for a number like '15.0' ('4.50' will still stay '4.50').
hideEmptyFractionalPart: true
## Use metric suffixes if the price is above this number (use 1.00M instead of 1000000.00 etc.), use -1 to disable.
## Indications are used as defined on: http://en.wikipedia.org/wiki/Metric_prefix, implemented from 'k' to 'Y'.
# Use metric suffixes if the price is above this number (use 1.00M instead of 1000000.00 etc.), use -1 to disable.
# Indications are used as defined on: http://en.wikipedia.org/wiki/Metric_prefix, implemented from 'k' to 'Y'.
metricSuffixesAbove: 1000000.0
## The character(s) to use as decimal mark.
# The character(s) to use as decimal mark.
decimalMark: '.'
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ RENTING: Options that apply to all rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Timeformat to use on the signs, default is like '30-06 14:52', US format: 'MM-dd KK:mm a'.
## Search for 'java SimpleDateFormat' for more options and documentation.
# Timeformat to use on the signs, default is like '30-06 14:52', US format: 'MM-dd KK:mm a'.
# Search for 'java SimpleDateFormat' for more options and documentation.
timeFormatSign: 'dd-MM HH:mm'
## Timeformat used in the chat, default is like '30 june 2014 14:52', US format: 'MMMMMMMMMMMMMMMMM dd yyyy KK:mm a'.
## Search for 'java SimpleDateFormat' for more options and documentation.
# Timeformat used in the chat, default is like '30 june 2014 14:52', US format: 'MMMMMMMMMMMMMMMMM dd yyyy KK:mm a'.
# Search for 'java SimpleDateFormat' for more options and documentation.
timeFormatChat: 'dd MMMMMMMMMMMMMMMMM yyyy HH:mm'
## Time indicators, used for specifing time periods (for example rent duration).
# Time indicators, used for specifing time periods (for example rent duration).
seconds: [s, sec, secs, second, seconds]
minutes: [m, min, mins, minute, minutes]
hours: [h, hour, hours]
@@ -65,12 +66,12 @@ years: [y, year, years]
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ PERMISSION GROUPS: Assigned by giving players certain permissions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Configure the max total regions, max rent regions and max buy regions with different groups (-1 is unlimited).
## Assign a group to players by giving them the permission 'areashop.limits.<group>'.
## Every player already has the group 'default', OPs bypass the limits because of the 'areashop.limitbypass' permission.
## All the groups applied to the player will be checked and only if they all allow an extra region it will be allowed.
## More information like limits for regions of a certain group or in a certain word can be found here:
## https://github.com/NLthijs48/AreaShop/wiki/Limitgroups-information-and-examples.
# Configure the max total regions, max rent regions and max buy regions with different groups (-1 is unlimited).
# Assign a group to players by giving them the permission 'areashop.limits.<group>'.
# Every player already has the group 'default', OPs bypass the limits because of the 'areashop.limitbypass' permission.
# All the groups applied to the player will be checked and only if they all allow an extra region it will be allowed.
# More information like limits for regions of a certain group or in a certain word can be found here:
# https://github.com/NLthijs48/AreaShop/wiki/Limitgroups-information-and-examples.
limitGroups:
default:
total: 1
@@ -78,269 +79,92 @@ limitGroups:
buys: 1
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ PROFILES: Assigned in general (default.yml), for a group (groups.yml) or individually (<region>.yml) │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## The idea of profiles is that you can make different variations of them, and then assign the different variations to
## subsets of regions (by assigning a profile to a region group, or an individual region).
## Determines the layout and functions of the signs linked to regions.
## Set 'general.signProfile' in default.yml, groups or individual regions to set the profile.
## The following sections can be added for performing certain commands when the sign is clicked:
## rightClickPlayer, rightClickConsole, shiftRightClickPlayer, shiftRightClickConsole,
## leftClickPlayer, leftClickConsole, shiftLeftClickPlayer, shiftLeftClickConsole.
## Sections with 'Player' at the end will be run by the player that clicks the sign and 'Console' ones from the console.
signProfiles:
default:
forrent:
line1: '&2&l[For Rent]'
line2: '%region%'
line3: '%duration%'
line4: '%price%'
rightClickPlayer:
- 'areashop rent %region%'
#- 'areashop message %clicker% %lang:confirm-rent|%region%|%' # Alternative to first ask for confirmation
leftClickPlayer:
- 'areashop info region %region%'
rented:
line1: '&4&l[Rented]'
line2: '%region%'
line3: '%player%'
line4: '%untilshort%'
rightClickPlayer:
- 'areashop rent %region%'
#- 'areashop message %clicker% %lang:confirm-extend|%region%|%' # Alternative to first ask for confirmation
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop message %clicker% %lang:confirm-unrent|%region%|%'
forsale:
line1: '&2&l[For Sale]'
line2: '%region%'
line3: '%price%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
#- 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation
leftClickPlayer:
- 'areashop info region %region%'
resell:
line1: '&9&l[Resale]'
line2: '%region%'
line3: '%resellprice%'
line4: '&8%player%'
rightClickPlayer:
- 'areashop buy %region%'
#- 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop stopresell %region%'
sold:
line1: '&4&l[Sold]'
line2: '%region%'
line3: '%player%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop message %clicker% %lang:confirm-sell|%region%|%'
## Flag profiles specify which flags to set on the WorldGuard regions depending on their state.
## All normal region flags as present in WorldGuard can be used, and also members, owners, priority and parent.
## The members and owners flag normally take a list of UUID's separated by a comma, adding by name is possible with 'n:<name>'.
## You can add groups by using 'g:<groupname>', so an example woul be: '%uuid%, %friendsuuid%, g:vip, n:coolGuy'.
## For allow/deny flags like 'entry' and 'exit' you can set the group setting by using 'g:<scope>', <scope> is one of the following:
## members, non_members, owners, non_owners, all. Example, only members can enter the region:
## entry: 'deny g:non_members'
## '' will remove the flag from the region.
flagProfiles:
default:
ALL: # Flags to apply for all states
priority: 10
members: ''
interact: 'deny g:non_members' # Only allow region members/owners to use things in the region (chests, furnace, animals, etc.)
forrent:
greeting: '%lang:prefix%%lang:greeting-forrent%'
rented:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-rented%'
forsale:
greeting: '%lang:prefix%%lang:greeting-forsale%'
sold:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-bought%'
resale:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-resale%'
## Run commands when an event happens.
## Commands at a 'before' section will execute before the region details are changed in the AreaShop system
## and before any other actions occurred (setting the owner, saving/loading schematics, etc.),
## the 'after' commands will be run when all changes are done.
## You can add a list of commands to 'before' and 'after'.
eventCommandProfiles:
default:
created:
before:
after:
## - "say An AreaShop region has been created: %region%"
deleted:
before:
after:
rented:
before:
after:
extended:
before:
after:
unrented:
before:
after:
bought:
before:
after:
sold:
before:
after:
resell:
before:
after:
## For the following events you can specify if you want to restore or save the region to a schematic.
## After 'save:' or 'restore:' you enter the name of the file to restore from/to.
## The limit 'maximumBlocks' applies to restoring/saving schematics, be sure your region size is below the limit.
## More information can be found here: https://github.com/NLthijs48/AreaShop/wiki/Region-blocks-save-restore.
schematicProfiles:
default:
created:
save: '%type%-%region%'
restore: ''
deleted:
save: ''
restore: '%type%-%region%'
rented:
save: ''
restore: ''
unrented:
save: ''
restore: '%type%-%region%'
bought:
save: ''
restore: ''
sold:
save: ''
restore: '%type%-%region%'
resell:
save: ''
restore: ''
## Profiles that specify what happens when their rental region almost runs out.
## Time identifiers specify how much time before the rent is actually over the player should be notified.
## When warnPlayer is set to true a message will be send that is specified in the language file.
## All commands in the list below 'commands:' will execute together with the warning, all normal variables can be used.
expirationWarningProfiles:
default:
"1 day":
warnPlayer: true
commands:
## - "say %region% is about to expire for %player%: %timeleft% left"
"1 hour":
warnPlayer: true
commands:
"5 minutes":
warnPlayer: true
commands:
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ ADVANCED AND DEBUG: Specific options to tweak the plugin precisely and check if it functions correctly. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Blacklist of region names that cannot be added to AreaShop for renting or buying. Regular expressions can be used, search
## for 'java regex pattern' to find documentation about how to use it.
## Example: Blocking all regions that have a name like 'house_1', 'house_2', etc. would be done with 'house_\d+'.
## The '\d' represents the numerical digits 0-9, the + symbol represents 1 or more times repeated.
## This means it would also block 'house_123' and 'house_000456'. It will not block 'ahouse_1' or 'house_'.
# Blacklist of region names that cannot be added to AreaShop for renting or buying. Regular expressions can be used, search
# for 'java regex pattern' to find documentation about how to use it.
# Example: Blocking all regions that have a name like 'house_1', 'house_2', etc. would be done with 'house_\d+'.
# The '\d' represents the numerical digits 0-9, the + symbol represents 1 or more times repeated.
# This means it would also block 'house_123' and 'house_000456'. It will not block 'ahouse_1' or 'house_'.
blacklist:
- '__global__'
## Minimum length of the numbers that are suffixed for region names generated by the '/as stack' command.
## When having this at 3 it will generate names like this: 'region-001', 'region-014', 'region-4567'.
# Minimum length of the numbers that are suffixed for region names generated by the '/as stack' command.
# When having this at 3 it will generate names like this: 'region-001', 'region-014', 'region-4567'.
stackRegionNumberLength: 3
# Allow/disallow adding players that did not visit the server yet as friend of a region.
addFriendNotExistingPlayers: false
## Enable sending stats to http://mcstats.org/ (Metrics plugin).
## This information will give me an indication about how much the plugin is used and encourages me to continue development.
# Enable sending stats to http://mcstats.org/ (Metrics plugin).
# This information will give me an indication about how much the plugin is used and encourages me to continue development.
sendStats: true
## If enabled it will check for updates when loading the plugin, it will never download files, it will only notify about it
## A message will be printed in the console when an update is available and OPs will be notified when joining the server.
# If enabled it will check for updates when loading the plugin, it will never download files, it will only notify about it.
checkForUpdates: true
## Use colors when sending messages to console and log files.
# Use colors when sending messages to console and log files.
useColorsInConsole: false
## Use tellraw style messages
# Use tellraw style messages, which can be interacted with by players
useFancyMessages: true
## Update all region flags and signs after starting the plugin (uses the 'regionsPerTick' setting from the 'update' section).
## This ensures that changes to the config are directly visible after restarting the server.
# Update all region flags and signs after starting the plugin.
# This ensures that changes to the config are directly visible after restarting the server.
updateRegionsOnStartup: true
## Enables / disables debug messages in the console, could be useful to figure out where errors come from.
# Enables / disables debug messages in the console, could be useful to figure out where errors come from.
debug: false
## Version of the config, do not change!
# Version of the config, do not change!
version: ${project.version}
## Maximum number of blocks to save to or restore from a .schemetic file.
# Maximum number of blocks to save to or restore from a .schemetic file.
maximumBlocks: 1000000
## Maximum number of locations the teleport function should check to find a safe spot.
# Maximum number of locations the teleport function should check to find a safe spot.
maximumTries: 50000
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ VARIABLES: Variables that can be used in messages and settings where a region is available. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## If a tag has no value (for example %player% when the region is not rented/bought) then the tag will not get replaced.
## %region% The region name (with correct capitalization).
## %player% The name of the player that rents/buys the region (with correct capitalization).
## %uuid% The UUID of the player that rents/buys the region.
## %friends% The names of friends added to this region separated by ', '.
## %friendsuuid% The UUID's of friends added to this region separated by ', '.
## $landlord$ The name of the landlord.
## %landlorduuid% The UUID of the landlord.
## %price% The price of the region formatted with the configured characters before and after the number.
## %rawprice% The price without formatting, like '10.0' or '7.77'.
## %duration% The duration of a rent region, for example '1 d', '4 minutes' or '2 years'.
## %world% The name of the world that the region is in.
## %type% The type of the region, 'rent' or 'buy'.
## %until% The end time of a rent formatted as configured with 'timeFormatChat'.
## %untilshort% The end time of a rent formatted as configured with 'timeFormatSign'.
## %width% The width of the region (number of blocks on the x-axis).
## %depth% The depth of the region (number of blocks on the z-axis).
## %height% The height of the region (number of blocks on the y-axis).
## %timeleft% The time left on the rent (uses the unit of time that fits best, minutes used from 121 seconds till 120 minutes).
## %clicker% The name of the player that clicked the sign (only to be used in the signProfiles section).
## %resellprice% The price of a region when it is in resell mode.
## %rawresellprice% The resellprice without formatting.
## %moneyback% The amount of money the player will get back when unrenting/selling the region (formatted with currency layout).
## %rawmoneyback% The moneyback without formatting.
## %moneybackpercent% The percentage of the price the player will get back when unrenting the region.
## %maxextends% The maximum number of extends a player can do on the region.
## %extendsleft% The number of extends that are left (maxextends - timesextended).
## %maxrenttime% The maximum time you can rent a region in advance (human readable).
## %inactivetime% The maximum time a player may be inactive before unrent/sell (human readable).
## %year% The current year.
## %month% The current month in the year.
## %day% The current day in the month.
## %hour% The current hour in the day (0-23).
## %minute% The current minute of the hour.
## %second% The current second of the minute.
## %millisecond% The current millisecond of the second.
## %epoch% The number of milliseconds since January 1, 1970 (Unix Epoch).
## %tpx% The exact x coordinate of the location that the teleport is set to
## %tpy% The exact y coordinate of the location that the teleport is set to
## %tpz% The exact z coordinate of the location that the teleport is set to
## %tpblockx% The rounded x coordinate of the location that the teleport is set to
## %tpblocky% The rounded y coordinate of the location that the teleport is set to
## %tpblockz% The rounded z coordinate of the location that the teleport is set to
## %tppitch% The exact pitch of the teleport location
## %tppitchround% The rounded pitch of the teleport location
## %tpyaw% The exact yaw of the teleport location
## %tpyawround% The rounded yaw of the teleport location
## %tpworld% The world name of the teleport location
# If a tag has no value (for example %player% when the region is not rented/bought) then the tag will not get replaced.
# %region% The region name (with correct capitalization).
# %player% The name of the player that rents/buys the region (with correct capitalization).
# %uuid% The UUID of the player that rents/buys the region.
# %friends% The names of friends added to this region separated by ', '.
# %friendsuuid% The UUID's of friends added to this region separated by ', '.
# $landlord$ The name of the landlord.
# %landlorduuid% The UUID of the landlord.
# %price% The price of the region formatted with the configured characters before and after the number.
# %rawprice% The price without formatting, like '10.0' or '7.77'.
# %duration% The duration of a rent region, for example '1 d', '4 minutes' or '2 years'.
# %world% The name of the world that the region is in.
# %type% The type of the region, 'rent' or 'buy'.
# %until% The end time of a rent formatted as configured with 'timeFormatChat'.
# %untilshort% The end time of a rent formatted as configured with 'timeFormatSign'.
# %width% The width of the region (number of blocks on the x-axis).
# %depth% The depth of the region (number of blocks on the z-axis).
# %height% The height of the region (number of blocks on the y-axis).
# %timeleft% The time left on the rent (uses the unit of time that fits best, minutes used from 121 seconds till 120 minutes).
# %clicker% The name of the player that clicked the sign (only to be used in the signProfiles section).
# %resellprice% The price of a region when it is in resell mode.
# %rawresellprice% The resellprice without formatting.
# %moneyback% The amount of money the player will get back when unrenting/selling the region (formatted with currency layout).
# %rawmoneyback% The moneyback without formatting.
# %moneybackpercent% The percentage of the price the player will get back when unrenting the region.
# %maxextends% The maximum number of extends a player can do on the region.
# %extendsleft% The number of extends that are left (maxextends - timesextended).
# %maxrenttime% The maximum time you can rent a region in advance (human readable).
# %inactivetime% The maximum time a player may be inactive before unrent/sell (human readable).
# %year% The current year.
# %month% The current month in the year.
# %day% The current day in the month.
# %hour% The current hour in the day (0-23).
# %minute% The current minute of the hour.
# %second% The current second of the minute.
# %millisecond% The current millisecond of the second.
# %epoch% The number of milliseconds since January 1, 1970 (Unix Epoch).
# %tpx% The exact x coordinate of the location that the teleport is set to
# %tpy% The exact y coordinate of the location that the teleport is set to
# %tpz% The exact z coordinate of the location that the teleport is set to
# %tpblockx% The rounded x coordinate of the location that the teleport is set to
# %tpblocky% The rounded y coordinate of the location that the teleport is set to
# %tpblockz% The rounded z coordinate of the location that the teleport is set to
# %tppitch% The exact pitch of the teleport location
# %tppitchround% The rounded pitch of the teleport location
# %tpyaw% The exact yaw of the teleport location
# %tpyawround% The rounded yaw of the teleport location
# %tpworld% The world name of the teleport location
# %lang:<languageKey>|Optional arguments|% Insert a message from EN.yml, for example: '%lang:timeleft-ended%' or '%lang:timeleft-years|15|%'
+194 -42
View File
@@ -4,75 +4,227 @@
# ║ More information and tutorials can be found on the wiki: https://github.com/NLthijs48/AreaShop/wiki ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ GENERAL: Options for all regions. │
# │ GENERAL: Settings that apply to all regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
general:
## Set to true to enable saving/restoring for regions as specified in the profile below, which is specified in the config.
enableRestore: false
## The schematic profile from the 'schematicProfiles' section in the config.
schematicProfile: 'default'
## The event commands profile from the 'eventCommandProfiles' section in the config.
eventCommandProfile: 'default'
## The profile for the format of the sign from the 'signProfiles' section in the config.
signProfile: 'default'
## The profile for the WorldGuard flags from the 'flagProfiles' section in the config.
flagProfile: 'default'
## The y location within the region to start searching for safe teleport spots (x and z will be in the middle of the region).
## Possible values: bottom, middle, top, integer.
# The y location within the region to start searching for safe teleport locations (x and z are in the middle of the region).
# Possible values: 'bottom', 'middle', 'top' or a number indicating an exact y coordinate.
teleportLocationY: bottom
## If true the teleportation algorithm only allows telportation to inside the region, otherwise it will expand
## a cube from the starting point to check for safe spots (then it could end outside of the region).
# If true the teleportation algorithm only allows telportation to inside the region, otherwise it will expand
# a cube from the starting point to check for safe spots (then it could end outside of the region).
teleportIntoRegion: true
## Same as above, but then for when you teleport to the sign of a region instead of the region itself.
# Same as above, but then for when you teleport to the sign of a region instead of the region itself.
teleportToSignIntoRegion: false
## Set where the '/as find' command should teleport the player to, set to true for the first sign of the region and set to
## false to teleport to the location set by '/as settp' or the default location (if not set).
# Set where the '/as find' command should teleport the player to, set to true for the first sign of the region and set to
# false to teleport to the location set by '/as settp' or the default location (if not set).
findTeleportToSign: true
## Restricts the '/as buy' and '/as rent' commands to the world of the region.
# Restricts buying and renting of regions to the world of the region.
restrictedToWorld: false
## Restricts the '/as buy' and '/as rent' commands to the region itself (player needs to be inside).
# Restricts buying and renting of regions to the region itself (player needs to be inside the region).
restrictedToRegion: false
## The UUID of the landlord, this player will receive all money from rents/buys (but not reselling with '/as resell').
# The UUID of the landlord, this player will receive all money from rents/buys (but not reselling with '/as resell').
landlord: ''
## Name of the landlord, if the landlord UUID setting is not provided then the name will be used instead
# Name of the landlord, if the landlord UUID setting is not provided then the name will be used instead
landlordName: ''
##### Set the layout and functions of the signs.
# The following sections can be added for performing certain commands when the sign is clicked:
# rightClickPlayer, rightClickConsole, shiftRightClickPlayer, shiftRightClickConsole,
# leftClickPlayer, leftClickConsole, shiftLeftClickPlayer, shiftLeftClickConsole.
# Sections with 'Player' at the end will be run by the player that clicks the sign and 'Console' ones from the console.
signProfile:
forrent:
line1: '&2&l[For Rent]'
line2: '%region%'
line3: '%duration%'
line4: '%price%'
rightClickPlayer:
- 'areashop rent %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-rent|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
rented:
line1: '&4&l[Rented]'
line2: '%region%'
line3: '%player%'
line4: '%untilshort%'
rightClickPlayer:
- 'areashop rent %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-extend|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickConsole:
- 'areashop message %clicker% %lang:confirm-unrent|%region%|%'
forsale:
line1: '&2&l[For Sale]'
line2: '%region%'
line3: '%price%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
resell:
line1: '&9&l[Resale]'
line2: '%region%'
line3: '%resellprice%'
line4: '&8%player%'
rightClickPlayer:
- 'areashop buy %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop stopresell %region%'
sold:
line1: '&4&l[Sold]'
line2: '%region%'
line3: '%player%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickConsole:
- 'areashop message %clicker% %lang:confirm-sell|%region%|%'
##### Set WorldGuard regions flags depending on the region state.
# All normal region flags as present in WorldGuard can be used, in addition to 'members', 'owners', 'priority' and 'parent'.
# The members and owners flag normally take a list of UUID's separated by a comma, adding by name is possible with 'n:<name>'.
# You can add groups by using 'g:<groupname>', so an example woul be: '%uuid%, %friendsuuid%, g:vip, n:coolGuy'.
# For allow/deny flags like 'entry' and 'exit' you can set the group setting by using 'g:<scope>', <scope> is one of the following:
# members, non_members, owners, non_owners, all. Example, only members can enter the region:
# entry: 'deny g:non_members'
# '' will remove the flag from the region.
flagProfile:
ALL: # Flags that should always be applied
priority: 10
members: ''
interact: 'deny g:non_members' # Only allow region members/owners to use things in the region (chests, furnace, animals, etc.)
build: 'deny g:non_members'
forrent:
greeting: '%lang:prefix%%lang:greeting-forrent%'
rented:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-rented%'
forsale:
greeting: '%lang:prefix%%lang:greeting-forsale%'
sold:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-bought%'
resale:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-resale%'
##### Save and restore schematics to clean up regions.
# After 'save:' or 'restore:' you enter the name of the file to restore from/to (.schematic is added automatically).
# Set to true to enable saving/restoring for regions as specified in the profile below, which is specified in the config.
enableRestore: false
schematicProfile:
created:
save: '%type%-%region%'
restore: ''
deleted:
save: ''
restore: '%type%-%region%'
rented:
save: '%type%-%region%'
restore: ''
unrented:
save: ''
restore: '%type%-%region%'
bought:
save: '%type%-%region%'
restore: ''
sold:
save: ''
restore: '%type%-%region%'
resell:
save: ''
restore: ''
##### Run commands when an event happens.
# Commands at a 'before' section will execute before the region details are changed in the AreaShop system
# and before any other actions occurred (setting the owner, saving/loading schematics, etc.),
# the 'after' commands will be run when all changes are done.
# You can add a list of commands to 'before' and 'after'.
eventCommandProfile:
created:
before:
after:
# - "say An AreaShop region has been created: %region%"
deleted:
before:
after:
rented:
before:
after:
extended:
before:
after:
unrented:
before:
after:
bought:
before:
after:
sold:
before:
after:
resell:
before:
after:
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ RENT: Options for rent regions. │
# │ RENT: Settings that apply to rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
rent:
## The default price of a rental region.
# The default price of a rental region.
price: 1000
## The default duration of a rental region, you can find all time indicators in config.yml below the RENTING header.
# The default duration of a rental region, you can find all time indicators in config.yml below the RENTING header.
duration: '1 day'
## The percentage of the rent price you get back if you unrent the region (price of time left will be multiplied by this/100).
# The percentage of the rent price you get back if you unrent the region (price of time left will be multiplied by this/100).
moneyBack: 100
## Maximum number of extends a player can do (-1 for infinite, 0 for no extending), if they are at this number then
## they are force to let their rent run out (and can rent it again at that point).
# Maximum number of extends a player can do (-1 for infinite, 0 for no extending), if they are at this number then
# they are force to let their rent run out (and can rent it again at that point).
maxExtends: -1
## The Maximum time they can have the region rented in advance (use times like '1 day' etc, or 'unlimited' for no limit).
## This can prevent players from renting their region for a year, and to ensure they periodically have to extend their rent.
# The Maximum time they can have the region rented in advance (use times like '1 day' etc, or 'unlimited' for no limit).
# This can prevent players from renting their region for a year, and to ensure they periodically have to extend their rent.
maxRentTime: 'unlimited'
## Automatically unrent the region after the specified time between the last login time of the renter and the current time.
## Use times like '1 day' etc, or 'disabled' for never.
# Automatically unrent the region after the specified time between the last login time of the renter and the current time.
# Use times like '1 day' etc, or 'disabled' for never.
inactiveTimeUntilUnrent: 'disabled'
## If a region of a player has less then this time left when he joins the server he will get a notice about his region.
## Use '' to disable.
# If a region of a player has less then this time left when he joins the server he will get a notice about his region.
# Use '' to disable.
warningOnLoginTime: '1 day'
## The profile for the expiration warnings from the 'expirationWarningProfiles' section in the config.
expirationWarningProfile: 'default'
## If renting the region would go above 'maxRentTIme', then extend to the maximum instead of cancelling the rent.
# If renting the region would go above 'maxRentTIme', then extend to the maximum instead of cancelling the rent.
extendToFullWhenAboveMaxRentTime: true
##### Run commands a certain time before expiration of a region.
# Time identifiers specify how much time before the rent is over the commands should be executed.
# These commands are executed in a 'best effort' manner, if your server is offline when it should trigger then it won't run.
expirationWarningProfile:
'1 day':
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
'1 hour':
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
'5 minutes':
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ BUY: Options for buy regions. │
# │ BUY: Settings that apply to buy regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
buy:
## The default price of a buy region.
# The default price of a buy region.
price: 1000
## The percentage of the price you get back if you sell the region.
# The percentage of the price you get back if you sell the region.
moneyBack: 100
## Automatically sell the region after the specified number of minutes between the last login time of the buyer and the current time
## Use times like '1 day' etc, or 'disabled' for never.
# Automatically sell the region after the specified number of minutes between the last login time of the buyer and the current time
# Use times like '1 day' etc, or 'disabled' for never.
inactiveTimeUntilSell: 'disabled'
+28 -20
View File
@@ -6,38 +6,38 @@
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ TIMERS: Settings to define how often scheduled tasks run. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Setting the 'delay' setting to 0 or lower will prevent the taks from runnning.
## The 'delay' settings are specified using a number followed by one of the identifiers as defined in config.yml.
## The 'regionsPerTick' settings are to configure how fast something goes, lower value is less lag, but slower updates.
## There are 20 ticks in 1 second, so if you set 'regionPerTick' to 5, then 5*20=100 regions per second will be updated.
# Setting the 'delay' setting to 0 or lower will prevent the taks from runnning.
# The 'delay' settings are specified using a number followed by one of the identifiers as defined in config.yml.
# The 'regionsPerTick' settings are to configure how fast something goes, lower value is less lag, but slower updates.
# There are 20 ticks in 1 second, so if you set 'regionPerTick' to 5, then 5*20=100 regions per second will be updated.
## Timings for saving files that need saving.
# Timings for saving files that need saving.
saving:
delay: '10 minutes'
delay: '11 minutes'
regionsPerTick: 1
## Timings for rent expiration checking.
# Timings for rent expiration checking.
expiration:
delay: '59 seconds'
delay: '29 seconds'
regionsPerTick: 5
## Timings for expiration warning to online players.
# Timings for expiration warning to online players.
expireWarning:
delay: '5 minutes'
delay: '61 seconds'
regionsPerTick: 5
## Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel').
# Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel').
update:
regionsPerTick: 5
## Time between checking if any regions need to be unrented because the player was not online for the specified time period.
# Time between checking if any regions need to be unrented because the player was not online for the specified time period.
inactive:
delay: '15 minutes'
delay: '17 minutes'
regionsPerTick: 5
## Timings for the periodic updating of signs (for timeleft tags etc).
# Timings for the periodic updating of signs (for timeleft tags etc).
signs:
delay: '60 seconds'
delay: '1 minute'
regionsPerTick: 3
## Number of regions per tick to check when a player joins to see if his name changed for regions he owned (updates the regions when changed).
# Number of regions per tick to check when a player joins to see if his name changed for regions he owned (updates the regions when changed).
nameupdate:
regionsPerTick: 10
## Timings for adding regions to AreaShop ('/as stack').
# Timings for adding regions to AreaShop ('/as stack').
adding:
regionsPerTick: 2
@@ -45,6 +45,14 @@ adding:
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ OTHER: All other settings. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Allow or disallow extending a rental region when the player is above his limits enforced by the 'limitGroups' section below.
## false will ensure a player will eventually lose his region when he has no access anymore.
allowRegionExtendsWhenAboveLimits: false
# Allow or disallow extending a rental region when the player is above his limits enforced by the 'limitGroups' section below.
# false will ensure a player will eventually lose his region when he has no access anymore.
allowRegionExtendsWhenAboveLimits: false
# Flag profiles that can be used by the 'general.flagProfile' setting in default.yml
flagProfiles:
# Event command profiles that can be used by the 'general.eventCommandProfile' setting in default.yml
eventCommandProfiles:
# Sign profiles that can be used by the 'general.signProfile' setting in default.yml
signProfiles:
# Schematic profiles that can be used by the 'general.schematicProfile' setting in default.yml
schematicProfiles:
+73 -62
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: German, Version: V2.3.2, Percentage translated: 96% ║
# ║ Language: German, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -8,6 +8,8 @@
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
@@ -33,7 +35,7 @@ player: "%lang:tPlayer|%player%|%"
tPlayer:
- "[bold]%0%[/bold]"
- " hover: Spieler %0%"
- " hover: %lang:action|Regionen von%0%|%"
- " hover: %lang:action|Regionen von %0%|%"
- " command: /areashop info player %0%"
landlord:
@@ -56,7 +58,6 @@ cmd-weOnlyByPlayer: "Eine WorldEdit-Selektion kann nur von einem Spieler gewähl
cmd-noSelection: "Du hast mit WorldEdit nichts markiert."
cmd-noRegionsFound: "In deiner Selektion wurden keine in AreaShop registrierten Regionen gefunden."
cmd-noWERegionsFound: "Es wurden keine WorldEdit-Regionen gefunden, die sich mit deiner Selektion überschneiden."
cmd-notRegistered: "Die angegebene Region ist in AreaShop nicht verfügbar: %0%."
cmd-noRegionsAtLocation: "Keine Regionen an deiner Position gefunden, gib die Region als Argument an."
cmd-moreRegionsAtLocation: "Mehr als eine Region wurde an deiner Position gefunden, gib die Region als Argument an."
cmd-automaticRegionOnlyByPlayer: "Die Automatische Auswahl einer Region ist nur für Spieler möglich, gib die Region als Argument an."
@@ -64,7 +65,7 @@ cmd-automaticRegionOnlyByPlayer: "Die Automatische Auswahl einer Region ist nur
help-header: "Hilfeseite mit Befehlen, die du ausführen kannst."
help-noPermission: "Du hast keine Permissions, um diese Hilfeseite anzuzeigen."
help-alias: "Befehlsaliase: /areashop, /as."
help-help: "%lang:helpCommand|/as help|% Zeigt diese HilfeSeite.."
help-help: "%lang:helpCommand|/as help|% Zeigt diese Hilfeseite."
help-info: "%lang:helpCommand|/as info|% Zeigt Infos über aktuelle Regionen."
help-rent: "%lang:helpCommand|/as rent|% Miete eine Region oder verlängere deine derzeitige Miete."
help-buy: "%lang:helpCommand|/as buy|% Kaufe eine Region."
@@ -72,9 +73,9 @@ help-unrent: "%lang:helpCommand|/as unrent|% Breche eine Miete für eine Region
help-sell: "%lang:helpCommand|/as sell|% Verkaufe eine Region."
help-reload: "%lang:helpCommand|/as reload|% Lade alle Dateien sowie Regionen neu."
help-setrestore: "%lang:helpCommand|/as setrestore|% Aktiviere das Zurücksetzen und wähle ein Profil."
help-setprice: "%lang:helpCommand|/as setprice|% Ändere die Preis einer Region."
help-setprice: "%lang:helpCommand|/as setprice|% Ändere den Preis einer Region."
help-setduration: "%lang:helpCommand|/as setduration|% Ändere die Dauer einer gemieteten Region."
help-teleport: "%lang:helpCommand|/as tp|% Teleportiere zu einer kauf- oder mietbaren Region."
help-teleport: "%lang:helpCommand|/as tp|% Teleportiere dich zu einer kauf- oder mietbaren Region."
help-setteleport: "%lang:helpCommand|/as settp|% Setze die Teleport Position von einer Region."
help-find: "%lang:helpCommand|/as find|% Finde eine kauf- oder mietbare Region."
help-groupadd: "%lang:helpCommand|/as groupadd|% Füge eine Region zu einer Gruppe hinzu."
@@ -88,7 +89,7 @@ help-addsign: "%lang:helpCommand|/as addsign|% Füge ein Schild zu einer existie
help-delsign: "%lang:helpCommand|/as delsign|% Lösche das Schild auf das du Schaust."
help-me: "%lang:helpCommand|/as me|% Liste alle Regionen, welche zu besitzt auf, sowie deren Ablaufdatum."
help-setowner: "%lang:helpCommand|/as setowner|% Setze den Besitzer einer Region oder verlängere die Miete."
help-resell: "%lang:helpCommand|/as resell|% Setzt eine Tegion in den resell Modus."
help-resell: "%lang:helpCommand|/as resell|% Setzt eine Region in den Wiederverkaufs-Modus."
help-stopResell: "%lang:helpCommand|/as stopresell|% Setzt eine Region zurück in den Verkauft Modus."
help-addFriend: "%lang:helpCommand|/as addfriend|% Fügt einen Freund zu einer Region hinzu."
help-delFriend: "%lang:helpCommand|/as delfriend|% Löscht einen Freund von einer Region."
@@ -96,12 +97,12 @@ help-linksigns: "%lang:helpCommand|/as linksigns|% Benutze Massenschild Verlinku
help-stack: "%lang:helpCommand|/as stack|% Erstelle mehrere Regionen und füge sie hinzu."
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Setzt den Vermieter einer Region."
rent-help: "/as rent [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
rent-help: "/as rent [Region], Die Region in der du stehst wird Gemietet, wenn du keine Region angegeben hast."
rent-noPermission: "Du bist nicht berechtigt, diese Region zu mieten."
rent-maximum: "Du kannst nicht mehr als %0% Region(en) mieten (Du hast bereits %1% in Gruppe '%2%')."
rent-maximumExtend: "Du kannst diese Miete nicht verlängern weil du mehr als %0% Region(en) hast. (Du hast bereits %1% in Gruppe '%2%')."
rent-payError: "Die Bezahlung hat nicht funktioniert. Bitte versuche es später noch einmal."
rent-rented: "Du hast die Region %lang:region% gemietet bis zum %until%. Du kannst deine Mieter verlängern, in dem du auf das Schild klickst, oder du /as rent eingibts."
rent-rented: "Du hast die Region %lang:region% bis zum %until% gemietet. Du kannst deine Miete verlängern, in dem du erneut auf das Schild klickst, oder /as rent eingibst."
rent-extended: "Du hast Deine Miete von %lang:region% bis zum %until% verlängert."
rent-extendedToMax: "Du hast Deine Miete von %lang:region% bis zum %until% verlängert. (Das ist die maximal zulässige Mietdauer von %maxrenttime%)."
rent-lowMoneyExtend: "Du hast nicht genug Geld um die Miete zu verlängern. (Du hast %0% und benötigst %price%)."
@@ -109,13 +110,13 @@ rent-lowMoneyRent: "Du hast nicht genug Geld um die Region %lang:region% zu miet
rent-someoneElse: "Die Region %lang:region% ist bereits vermietet."
rent-notRentable: "Diese Region ist nicht mietbar."
rent-maxExtends: "Du kannst diese Miete nicht weiter verlängern. (Zulässig sind %maxextends% Verlängerungen). Nachdem die Miete abgelaufen ist, kannst du die Region %lang:region% erneut mieten."
rent-maxRentTime: "Du kannst die Region%lang:region% nicht noch mehr im Voraus mieten. Die maximale Zeit beträgt %maxrenttime% und du hast diese Region im Moment für %timeleft% gemietet."
rent-maxRentTime: "Du kannst die Region%lang:region% nicht noch mehr im Voraus mieten. Die maximale Zeit beträgt %maxrenttime% und du hast diese Region für %timeleft% gemietet."
rent-restrictedToWorld: "Du musst dich in der Welt '%world%' befinden, um die Region %lang:region% mieten zu können (Du befindest Dich in der Welt '%0%')."
rent-restrictedToRegion: "Du musst innerhalb der Region %lang:region% sein, um diese mieten zu können."
rent-expireWarning: "Deine Region %lang:region% hat %timeleft% übrig. Beachte, dass du sie rechtzeitig verlängerst, wenn du sie behalten willst."
rent-alreadyAtFull: "Die Region %lang:region% ist bereits auf oder über der maximalen Mietzeit, Du kannst diese noch nicht verlängern."
buy-help: "/as buy [Regionname], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
buy-help: "/as buy [Regionname], Die Region in der du stehst wird gekauft wenn keine Region angegeben wurde."
buy-noPermission: "Du bist nicht berechtigt, eine Region zu kaufen."
buy-noPermissionResell: "Du hast keine Berechtigung eine Region im Weiterverkaufs-Modus zu kaufen."
buy-noPermissionNoResell: "Du hast keine Berechtigung um eine Region zu kaufen, die nicht im Weiterverkaufs-Modus ist."
@@ -132,7 +133,7 @@ buy-someoneElse: "Jemand anderes hat die Region %lang:region% bereits gekauft."
buy-restrictedToWorld: "Du musst Dich in der Welt '%world%' befinden, um die Region %lang:region% kaufen zu können. (Du befindest Dich in der Welt '%0%')."
buy-restrictedToRegion: "Du musst innerhalb der Region %lang:region% sein, um diese kaufen zu können."
unrent-help: "/as unrent [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der Du Dich gerade befindest."
unrent-help: "/as unrent [Region], Die Region in der du stehst wird entmietet, wenn keine Region angegeben wird."
unrent-noPermission: "Du bist nicht berechtigt, den Mietvertrag zu kündigen."
unrent-noPermissionOther: "Du bist nicht berechtigt, den Mietvertrag einer anderen Region zu kündigen."
unrent-notRegistered: "Die Region kann nicht entmietet werden, weil sie nicht für Vermietungen registriert ist."
@@ -140,7 +141,7 @@ unrent-notRented: "Die Region kann nicht entmietet werden, weil sie nicht gemiet
unrent-unrented: "Die Region %lang:region% ist nun nicht mehr an %lang:player% vermietet."
unrent-expired: "Deine Miete von %lang:region% ist abgelaufen."
sell-help: "/as sell [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der Du dich gerade befindest."
sell-help: "/as sell [Region], Die Region in der du stehst wird verkauft wenn keine Region angegeben wurde."
sell-notRegistered: "Die Region kann nicht verkauft werden, da sie nicht für den Verkauf registriert ist."
sell-notBought: "Die Region kann nicht verkauft werden, da sie keinen Eigentümer hat."
sell-sold: "Die Region %lang:region% von %lang:player% wurde verkauft."
@@ -153,16 +154,6 @@ reload-updateComplete: "[gray]Regionen erfolgreich aktualisiert."
reload-noPermission: "Du hast keine Berechtigungen um die Konfigurationsdateien neu zu laden."
reload-updateCommandChanged: "'/as updaterents' und '/as updatebuys' wurden entfernt, bitte benutze '/as reload' um die Regionen neu zu laden."
info-help:
- "/as info[break]"
- "%lang:command|all|/as info all|%"
- "%lang:command|rented|/as info rented|% [Gruppe] [Seite]"
- "%lang:command|forrent|/as info forrent|% [Gruppe] [Seite]"
- "%lang:command|sold|/as info sold|% [Gruppe] [Seite]"
- "%lang:command|forsale|/as info forsale|% [Gruppe] [Seite]"
- "%lang:command|reselling|/as info reselling|% [Gruppe] [Seite]"
- "%lang:command|nogroup|/as info nogroup|% [Seite]"
- "%lang:command|region|/as info region|% [Region]"
info-noPermission: "Du hast keine Berechtigung, Informationen über Regionen zu erhalten."
info-allHeader: "Alle Regionen%0%:"
info-rentedHeader: "Gemietete Regionen%0%:"
@@ -176,9 +167,23 @@ info-nogroupNone: "Es gibt keine Regionen ohne Gruppe."
info-noFiltergroup: "Gruppe '%0%' existiert nicht und kann deshalb nicht genutzt werden um die Ergebnisse zu limitieren."
info-noRegions: "Es wurden keine Regionen gefunden."
info-wrongPage: "%0% ist keine korrekte Seitenzahl."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]Zur Vermietung für %price% je %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Vermietet an %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]Zum Verkauf für %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player% (Weiterverkauf)."
info-pageStatus: "[gold]Seite %0%/%1%"
info-pagePrevious:
- " [gold][bold]◄Vorherige[/bold] "
- " hover: %lang:action|Zeige vorherige Seite|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Vorherige[/bold] "
- " hover: Das ist bereits die erste Seite."
info-pageNext:
- " [gold][bold]Nächste►[/bold]"
- " hover: %lang:action|Zeige nächste Seite|%"
- " command: %0%"
info-pageNoNext:
- " [darkgray][bold]Nächste►[/bold]"
- " hover: Das ist bereits die letzte Seite."
@@ -236,23 +241,23 @@ info-regionMoneyBackRent: "[darkgreen][bold]►[reset] Rückzahlung bei Mietkün
info-regionMoneyBackRentClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Mietrückzahlung[/bold]"
- " hover: Mietabbruch %region% und bekomme %moneyback% zurück"
- " hover: %lang:action|Mietabbruch %region%|%"
- " hover: Entmiete %region% und bekomme %moneyback% zurück"
- " hover: %lang:action|Unrent %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% der verbleibenden Zeit)."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Maximale Anzahl an Mietverlängerungen: [gray]%maxextends% mal."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Maximale Anzahl an Verlängerungen: [gray]%maxextends% ."
info-regionNoExtending: "[darkgreen][bold]►[reset] Miete kann nicht verlängert werden."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Verbleibende Mietverlängerungen: [gray]%extendsleft% von %maxextends% mal."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Verbleibende Mietverlängerungen: [gray]%extendsleft% von %maxextends% ."
info-regionMaxRentTime: "[darkgreen][bold]►[reset] Miete im Voraus: [gray]Maximal %maxrenttime%."
info-prefix: "[darkgreen][bold]►[reset] "
info-regionTeleport:
- "[bold]Gehe zu der Region[/bold]"
- " hover: %lang:action|Teleportiere zu %region%|%"
- " hover: %lang:action|Teleport to %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]Setze den Teleport Punkt[/bold]"
- " hover: %region%"
- " hover: %lang:action|Setze den Teleport Punkt|%"
- " hover: %lang:action|Set teleport location|%"
- " command: /areashop settp %region%"
info-regionSigns: "[darkgreen][bold]►[reset] Verbundene Schilder: [gray]%0%."
info-regionSignLocation: "[gray](%0%, %1%, %2%, %3%)[reset]"
@@ -263,21 +268,18 @@ info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Du musst dich in d
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Du musst in der Welt '%world%' sein, um die Region %lang:region% mieten zu können."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Du musst dich in der Region %lang:region% befinden, um sie kaufen zu können."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Du musst in der Welt '%world%' sein, um die Region %lang:region% kaufen zu können."
info-regionRestoringRent: "[darkgreen][bold]►[reset] Die Wiederherstellung ist aktiviert [gray](Region wird bei Mietkündigung zurückgesetzt)%0%."
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Die Wiederherstellung ist aktiviert. [gray](Region wird beim Verkauf zurückgesetzt)%0%."
info-regionRestoringProfile: " (profile: %0%)"
info-regionLandlord: "[darkgreen][bold]►[reset] Vermieter: [gray]%lang:landlord% (Erhält das Geld)."
info-regionNotExisting: "Die angegebene Region ist nicht registriert: %0%."
setrestore-help: "/as setrestore <Region> <true|false|general> [Profil]."
setrestore-noPermission: "Du bist nicht berechtigt, die Wiederherstellungs-Einstellungen zu verändern."
setrestore-notRegistered: "Die angegebene Region ist nicht registriert: %0%."
setrestore-invalidSetting: "'%0%' ist kein gültiger Status, kann true sein, false oder general."
setrestore-invalidSetting: "'%0%' ist keine gültige Angabe, benutze true, false oder general."
setrestore-success: "Wiederherstellungs-Einstellungen von %lang:region% erfolgreich zu '%0%' geändert."
setrestore-successProfile: "Wiederherstellungs-Einstellungen von %lang:region% erfolgreich zu '%0%' geändert und das Profil zu '%1%' geändert."
setrestore-successProfile: "Wiederherstellungs-Einstellungen von %lang:region% erfolgreich zu '%0%' geändert und das Profil zu '%1%'."
setprice-noPermission: "Du bist nicht berechtigt, den Preis einer Region zu ändern."
setprice-help: "/as setprice <Preis> [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
setprice-help: "/as setprice <Preis> [Region], Andert den Preis der Region in der du stehst wenn keine Region angegeben wird."
setprice-notRegistered: "Die angegebene Region ist nicht registriert: %0%."
setprice-wrongPrice: "'%0%' ist kein gültiger Preis."
setprice-successRent: "Der Preis der Region %lang:region% änderte sich zu %price% per %duration%."
@@ -286,7 +288,7 @@ setprice-successRemoved: "Der Preis der Region %lang:region% wurde entfernt, ab
setprice-noLandlord: "Du hast keine Rechte um den Preis zu ändern, da du nicht der Vermieter der Region %lang:region% bist."
setduration-noPermission: "Du hast keine Berechtigung, die Mietdauer zu verändern."
setduration-help: "/as setduration <Anzahl> <Zeiteinheit> [Region], wählt automatisch die Region, in der du dich gerade befindest, wenn nichts angegeben wird."
setduration-help: "/as setduration <Anzahl> <Zeiteinheit> [Region], ändert die Zeit der Region in der du dich befindest wenn keine Region angegeben wurde."
setduration-notRegistered: "%0% ist nicht als mietbar registriert."
setduration-wrongAmount: "'%0%' ist keine gültige Anzahl, gib eine ganze Zahl an."
setduration-wrongFormat: "'%0%' ist kein gültiges Zeitformat, schau in der Doku auf Bukkit nach."
@@ -303,14 +305,14 @@ setup-noPrice: "Du hast in der vierten Zeile noch keinen Preis angegeben."
setup-wrongPrice: "Du hast den Preis nicht korrekt angegeben, bitte nutze dafür ausschließlich Zahlen."
setup-rentSuccess: "Die Vermietung der Region %lang:region% ist erfolgreich erstellt worden."
setup-buySuccess: "Das Kaufen der Region %lang:region% ist erfolgreich erstellt worden."
setup-noPermissionRent: "Du hast keine Berechtigungen um mietbare Regionen aufzusetzen."
setup-noPermissionBuy: "Du hast keine Berechtigungen um kaufbare Regionen aufzusetzen."
setup-noPermissionRent: "Du hast keine Berechtigungen um mietbare Regionen zu erstellen."
setup-noPermissionBuy: "Du hast keine Berechtigungen um kaufbare Regionen zu erstellen."
setup-couldNotDetect: "Mehrere Regionen mit der selben Priorität und/oder Eltern/Kind-Verhältnis gefunden, bitte gib die gewünschte Region in der zweiten Zeile an (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
setup-blacklisted: "%0% ist auf der Blacklist und kann nicht in AreaShop eingefügt werden."
setup-noPermission: "Du kannst die Region '%0%' nicht hinzufügen, da du weder Besitzer noch Mitglied der Region bist oder keine Rechte dazu hast."
destroy-noPermissionRent: "Du hast keine Berechtigungen um eine mietbare Region zu deregistrieren. "
destroy-noPermissionBuy: "Du hast keine Berechtigungen um eine kaufbare Region zu deregistrieren. "
destroy-noPermissionRent: "Du hast keine Berechtigungen um eine mietbare Region abzumelden. "
destroy-noPermissionBuy: "Du hast keine Berechtigungen um eine kaufbare Region abzumelden. "
destroy-successRent: "%lang:region% erfolgreich als mietbare Region abgemeldet."
destroy-successBuy: "%lang:region% erfolgreich als kaufbare Region abgemeldet."
@@ -319,9 +321,9 @@ teleport-noRentOrBuy: "Die angegebene Region ist nicht registriert: %0%."
teleport-noPermission: "Du hast keine Rechte um dich zu dieser Region zu teleportieren."
teleport-noPermissionOther: "Du bist nicht berechtigt, dich zu einer Region zu teleportieren, welche du nicht besitzt."
teleport-noPermissionSign: "Du hast keine Rechte um dich zu diesem Schild in deiner Region zu teleportieren."
teleport-noPermissionOtherSign: "Du fehlt die Berechtigung, dich zu Schildern von Regionen, die du nicht besitzt, zu teleportieren."
teleport-noPermissionFriend: "Du hast keine Berechtigungen zu Regionen zu teleporten, in denen du als Freund hinzugefügt worden bist."
teleport-noPermissionFriendSign: "Du hast keine Berechtigungen um zu dem Schild einer Region zu teleporten, in denen du als Freund hinzugefügt worden bist."
teleport-noPermissionOtherSign: "Du hast keine Berechtigung, dich zu Schildern von Regionen, die du nicht besitzt, zu teleportieren."
teleport-noPermissionFriend: "Du hast keine Berechtigungen, dich zu Regionen zu teleporten, in denen du als Freund hinzugefügt worden bist."
teleport-noPermissionFriendSign: "Du hast keine Berechtigungen, dich zu dem Schild einer Region zu teleportieren, in denen du als Freund hinzugefügt worden bist."
teleport-success: "Du wurdest zu %lang:region% teleportiert."
teleport-successSign: "Du wurdest zum Schild von %lang:region% teleportiert."
teleport-noSafe: "Keine sichere Position in %lang:region% gefunden, kein Boden vorhanden oder maximale Anzahl an Versuchen erreicht (%0%/%1%)."
@@ -383,7 +385,6 @@ add-failed: "Bereits eingetragen: [gray]%0%."
add-blacklisted: "Auf der Blacklist: [gray]%0%."
add-specifyWorld: "Bei Verwendung der Konsole bitte Welt der Region eintragen."
add-incorrectWorld: "Welt '%0%' nicht gefunden, versuche es bitte noch einmal (Groß- und Kleinschreibung beachten)."
add-noRegion: "WorldGuard Region '%0%' existiert nicht in dieser Welt."
add-noPermissionRegions: "Keine Rechte zum hinzufügen: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Entweder bist du weder Mitglied noch Besitzer der Region oder hast keine Rechte um deine Regionen hinzuzufügen."
@@ -400,7 +401,7 @@ addsign-wrongProfile: "Das eingetragene Profil existiert nicht. Bitte benutze ei
addsign-profile:
- "[bold]%0%[/bold]"
- " hover: Schildprofil %0%"
- " hover: %lang:action|Nutze dieses Profil|%"
- " hover: %lang:action|Use this profile|%"
- " command: /areashop linksigns %0%"
addsign-success: "Das Schild wurde hinzugefügt zu %lang:region%."
addsign-successProfile: "Das Schild wurde zu %lang:region% mit dem Profil %0% hinzugefügt."
@@ -415,9 +416,20 @@ delsign-success: "Das Schild wurde von der Region %lang:region% entfernt."
me-noPermission: "Dir fehlt die Berechtigung einzusehen, welche Regionen du besitzt."
me-header: "Regionen von %lang:tPlayer|%0%|%:"
me-notAPlayer: "Du bist kein Spieler, darum können dir keine Regionen gehören."
me-rentLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% übrig"
- " hover: bis %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "Im Besitz von %lang:player%"
- " hover: Du wurdest als Freund hinzugefügt"
- ")."
me-nothing: "%lang:tPlayer|%0%|% hat keine gemieteten oder gekaufen Regionen und wurde nicht als Freund zu einem hinzugefügt."
me-noPlayer: "%0% konnte nicht gefunden werden, möglicherweise war er nie auf diesem Server."
me-clickHint: "[gray][italic]Klicke auf eine Region, um weitere Details zu erhalten."
setowner-help: "/as setowner <Spieler> [Region], wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
setowner-noPermission: "Dir fehlt die Berechtigung den Besitzer einer Region festzulegen."
@@ -445,8 +457,8 @@ stopresell-noPermission: "Du hast keine Berechtigung, den Weiterverkauf deiner R
stopresell-noPermissionOther: "Du hast keine Berechtigung, den Weiterverkauf einer Region zu stoppen."
addfriend-help: "/as addfriend <Spieler> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
addfriend-noPermissionOther: "Du hast keine Berechtigung, Freunde zu deiner Region hinzuzufügen."
addfriend-noPermission: "Du hast keine Berechtigung, Spieler zu einer Region hinzuzufügen."
addfriend-noPermissionOther: "Du hast keine Berechtigung, Freunde zu einer Region hinzufügen, welche dir nicht gehört."
addfriend-noPermission: "Du hast keine Berechtigung, Spieler zu deiner Region hinzuzufügen."
addfriend-successOther: "%lang:tPlayer|%0%|% wurde als Freund zur Region %lang:region% hinzugefügt."
addfriend-success: "%lang:tPlayer|%0%|% wurde als Freund zu deiner Region %lang:region% hinzugefügt."
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% wurde bereits als Freund zu der Region %lang:region% hinzugefügt."
@@ -459,12 +471,13 @@ delfriend-noPermissionOther: "Du hast keine Berechtigung, Freunde von Regionen z
delfriend-noPermission: "Du hast keine Berechtigung, Freunde von deinen Regionen zu entfernen."
delfriend-successOther: "%lang:tPlayer|%0%|% wurde als Freund der Region %lang:region% entfernt."
delfriend-success: "%lang:tPlayer|%0%|% wurde als Freund Deiner Region %lang:region% entfernt."
delfriend-notAdded: "%lang:tPlayer|%0%|% wurde nicht als Freund zur Region %lang:region% hinzugefügt."
delfriend-noOwner: "Du kannst keine Freunde von einer Region ohne Besitzer entfernen."
linksigns-multipleRegions: "Mehrere Regionen gefunden: [gray]%0%."
linksigns-multipleRegionsAdvice: "Bitte klicke nochmal oder benutze '/as linksigns' um aufzuhören."
linksigns-multipleRegionsAdvice: "Bitte klicke nochmal oder benutze '/as linksigns', um aufzuhören."
linksigns-noRegions: "Keine AreaShop Regionen in Cursorrichtung gefunden, bitte stell sicher, dass die Region in AreaShop registriert ist. [gray](Maximale Reichweite 100 Blöcke)"
linksigns-regionFound: "Region %lang:region% wurde gefunden, mach einen Linksklick auf ein Schild um die Region mit dem Schild zu verbinden."
linksigns-regionFound: "Region %lang:region% wurde gefunden, verbinde sie jetzt mit einem Linksklick auf ein Schild."
linksigns-signFound: "Schild gefunden bei (%0%, %1%, %2%), mach einen Rechtsklick auf eine Region um das Schild zu verbinden."
linksigns-noSign: "Kein Schild in Cursorrichtung gefunden, bitte stell sicher, dass du eine direkte Sicht auf ein Schild hast und klicke erneut [gray](Maximale Reichweite 100 Blöcke)."
linksigns-alreadyRegistered: "Dieses Schild ist bereits auf die Region %lang:region% registriert, klicke erneut um ein anderes Schild zu wählen."
@@ -488,8 +501,6 @@ stack-wrongAmount: "'%0%' ist keine korrekte Anzahl von Regionen."
stack-wrongGap: "'%0%' ist keine korrekte Nummer von Blöcken für den Abstand, der zwischen den Regionen sein soll."
stack-noSelection: "Du hast keine Auswahl, die angibt, wo die erste Region erstellt werden soll."
stack-addStart: "[gray]Füge %0% Regionen mit %1% Regionen pro Sekunde hinzu."
stack-addComplete: "[gray]Regionen erfolgreich hinzugefügt."
stack-unclearDirection: "Bitte gucke nur nach Norden, Osten, Süden oder Westen. Du guckst im Moment nach %0%."
setlandlord-help: "/as setlandlord <Spieler> [Region], die Region in der du stehst wird verwendet, wenn keine angegeben wird."
setlandlord-noPermission: "Du hast keine Rechte um den Vermieter einer Region zu setzen."
@@ -501,29 +512,29 @@ message-notOnline: "%0% ist nicht online."
confirm-rent:
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% mieten willst?"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum mieten %0%|%"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Mieten %0%|%"
- "hover: %lang:action|Rent %0%|%"
- "command: /areashop rent %0%"
confirm-extend:
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% verlängern willst?"
- "[darkgreen][bold]►[reset] %lang:button|Click to extend %0%|%"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Verlängern %0%|%"
- "hover: %lang:action|Verlängern %0%|%"
- "command: /areashop rent %0%"
confirm-unrent:
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% nicht länger mieten möchtest?"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum auflösen %0%|%"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Auflösen %0%|%"
- "hover: %lang:action|Mietvertrag auslösen %0%|%"
- "command: /areashop unrent %0%"
confirm-buy:
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% kaufen willst?"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum kaufen %0%|%"
- "hover: %lang:action|Kaufen %0%|%"
- "command: /areashop buy %0%"
- "%lang:prefix% Bist du sicher das du %lang:tRegion|%0%|% kaufen möchtest?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to buy %0%|%"
- " hover: %lang:action|Buy %0%|%"
- " command: /areashop buy %0% "
confirm-sell:
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% verkaufen willst?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum verkaufen %0%|%"
- " hover: %lang:action|Verkaufen %0%|%"
- " command: /areashop sell %0%"
- "%lang:prefix% Bist du sicher, dass du %lang:tRegion|%0%|% verkaufen willst?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Verkaufen von %0%|%"
- " hover: %lang:action|Verkaufe %0%|%"
- " command: /areashop sell %0% "
timeleft-years: "%0% Jahre"
timeleft-months: "%0% Monate"
+18 -14
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: English, Version: V2.3.2, Percentage translated: 100% (source), author: NLThijs48 ║
# ║ Language: English, Version: V2.4.0, Percentage translated: 100% (source), author: NLThijs48 ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -25,10 +25,10 @@ helpCommand:
region: "%lang:tRegion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
@@ -58,7 +58,8 @@ cmd-weOnlyByPlayer: "Using a WorldEdit selection is only possible as a player, s
cmd-noSelection: "You don't have a WorldEdit selection."
cmd-noRegionsFound: "No regions registered in AreaShop are found in your selection."
cmd-noWERegionsFound: "No WorldEdit regions intersecting your selection are found."
cmd-notRegistered: "The specified region is not available in AreaShop: %0%."
cmd-notRegistered: "Region '%0%' is not available in AreaShop."
cmd-noRegion: "'%0%' is not a valid WorldGuard region."
cmd-noRegionsAtLocation: "No regions found at your location, specify the region as argument."
cmd-moreRegionsAtLocation: "More than one region has been found at your location, specify the region as argument."
cmd-automaticRegionOnlyByPlayer: "Automatically determining the region is only possible for players, specify the region as argument."
@@ -115,6 +116,7 @@ rent-maxRentTime: "You cannot rent %lang:region% more time in advance, the maxim
rent-restrictedToWorld: "You need to be in the '%world%' world to rent %lang:region% (you are in '%0%')."
rent-restrictedToRegion: "You need to be inside %lang:region% to rent it."
rent-expireWarning: "Your region %lang:region% has %timeleft% left, be sure to extend it if you want to keep it."
rent-expiringSoon: "Your region %lang:tRegion|%0%|% has %1% left, be sure to extend it if you want to keep it."
rent-alreadyAtFull: "%lang:region% is already at or above the maximum rental time, you cannot extend it yet."
buy-help: "/as buy [region], the region you stand in will be used if not specified."
@@ -163,8 +165,8 @@ info-help:
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%"
- " %lang:command|region|/as info region|% [region][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
- " %lang:command|region|/as info region|% [region]"
info-noPermission: "You don't have permission to get information about regions."
info-allHeader: "All regions%0%:"
info-rentedHeader: "Rented regions%0%:"
@@ -284,9 +286,8 @@ info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] You must be inside
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] You need to be inside world '%world%' to rent %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] You must be inside %lang:region% to buy it."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] You need to be inside world '%world%' to buy %lang:region%."
info-regionRestoringRent: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at unrent)%0%."
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at sell)%0%."
info-regionRestoringProfile: " (profile: %0%)"
info-regionRestoringRent: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at unrent)."
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at sell)."
info-regionLandlord: "[darkgreen][bold]►[reset] Landlord: [gray]%lang:landlord% (receives the money)."
info-regionNotExisting: "The specified region is not registered: %0%."
@@ -343,6 +344,8 @@ teleport-noPermissionSign: "You don't have permission to teleport to the sign of
teleport-noPermissionOtherSign: "You don't have permission to teleport to signs of regions you do not own."
teleport-noPermissionFriend: "You don't have permission to teleport to regions you are added to as a friend."
teleport-noPermissionFriendSign: "You don't have permission to teleport to the sign of regions you are added to as a friend."
teleport-noPermissionAvailable: "You don't have permission to teleport to available regions."
teleport-noPermissionAvailableSign: "You don't have permission to teleport to the sign of available regions."
teleport-success: "You teleported to %lang:region%."
teleport-successSign: "You teleported to the sign of %lang:region%."
teleport-noSafe: "No safe position found in %lang:region%, no spots in the region left or maximum tries exceeded (%0%/%1%)."
@@ -404,7 +407,6 @@ add-failed: "Already registered: [gray]%0%."
add-blacklisted: "On the blacklist: [gray]%0%."
add-specifyWorld: "Specify the world of the region when using from console."
add-incorrectWorld: "World '%0%' not found, try again (case-sensitive)."
add-noRegion: "WorldGuard region '%0%' does not exist in this world."
add-noPermissionRegions: "No permission to add: [gray]%0%."
add-noPermissionOwnerMember: "[gray]You either are not a member/owner of these regions or have no permission to add your regions."
@@ -521,8 +523,10 @@ stack-wrongAmount: "'%0%' is not a correct amount of regions."
stack-wrongGap: "'%0%' is not a correct number for the number of blocks gap between regions."
stack-noSelection: "You don't have a selection that indicates where the first region should be created."
stack-addStart: "[gray]Adding %0% regions at %1% per second."
stack-addComplete: "[gray]Adding regions complete."
stack-unclearDirection: "Please look clearly in the north, east, south or west direction, currently detected %0%."
stack-addComplete: "[gray]Added %0% regions%1%."
stack-tooHigh: ", %0% regions skipped because they were above Y=256"
stack-tooLow: ", %0% regions skipped because they were below Y=0"
stack-unclearDirection: "Please look clearly in the north, east, south, west, up or down direction, currently detected %0%."
setlandlord-help: "/as setlandlord <player> [region], the region you stand in will be used if not specified."
setlandlord-noPermission: "You don't have permission to set the landlord for a region."
+61 -50
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: French, Version: V2.3.2, Percentage translated: 96% ║
# ║ Language: French, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -8,24 +8,26 @@
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|Utilise %1%|%"
- " hover: %lang:action|Utilisez %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Utilise%0%|%"
- " hover: %lang:action|Utilisez %0%|%"
- " command: %0%"
region: "%lang:tRegion|%region%|%"
region: "%lang:tRégion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Région %0%"
- " hover: %lang:action|Région information|%"
- " hover: %lang:action|Information sur la région|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
@@ -38,7 +40,7 @@ tPlayer:
landlord:
- "[bold]%landlord%[/bold]"
- " hover: Bailleur%landlord%"
- " hover: Bailleur %landlord%"
- " hover: %lang:action|Région de %landlord%|%"
- " command: /areashop info player %landlord%"
@@ -47,7 +49,7 @@ total-maximum: "Vous ne pouvez pas louer ou acheter plus de %0% région(s) au to
general-notReady: "AreaShop n'est pas totalement chargé, merci d'attendre."
general-noWorld: "Vous ne pouvez pas faire ceci, le monde de %lang:region% n'est en ce moment pas disponible (monde '%world%')."
general-noRegion: "Vous ne pouvez pas faire ceci, la région WorldGuard n'est pour le moment pas disponible (région %lang:region%)."
general-noEconomy: "Il n'y a pas de plugin d'économie sur votre serveur, ou bien qu'il n'est pas correctement installé. Merci de prévenir l'opérateur du serveur dès que possible."
general-noEconomy: "Il n'y a pas de plugin d'économie sur votre serveur, ou celui-ci n'est pas correctement installé. Merci de prévenir l'administrateur du serveur."
general-cancelled: "%0%"
cmd-notValid: "Cette commande est incorrecte, utilisez '/as help' pour plus de détails."
@@ -56,21 +58,20 @@ cmd-weOnlyByPlayer: "Utiliser une sélection WorldEdit n'est possible qu'en tant
cmd-noSelection: "Vous n'avez pas de séléction WorldEdit."
cmd-noRegionsFound: "Aucune région enregistrée dans AreaShop n'a été trouvée dans votre séléction."
cmd-noWERegionsFound: "Aucune région WorldEdit croisant votre séléction n'a été trouvée."
cmd-notRegistered: "La région spécifiée n'est pas disponible dans AreaShop: %0%."
cmd-noRegionsAtLocation: "Aucune région trouvée à votre emplacement, spécifiez la région comme un argument."
cmd-moreRegionsAtLocation: "Plus d'une région ont été trouvées à votre emplacement, spécifiez la région comme un argument."
cmd-automaticRegionOnlyByPlayer: "Déterminer la région automatiquement est disponible uniquement pour les joueurs, spécifiez la région comme un argument."
cmd-automaticRegionOnlyByPlayer: "Déterminer la région automatiquement est possible uniquement pour les joueurs, spécifiez la région comme un argument."
help-header: "Page d'aide, commandes que vous pouvez exécuter."
help-noPermission: "Vous ne pouvez pas voir la page d'aide."
help-noPermission: "Vous n'avez pas la permission de voir la page d'aide."
help-alias: "Alias des commandes : /areashop, /as"
help-help: "%lang:helpCommand|/as help|% Montre cette page d'aide."
help-help: "%lang:helpCommand|/as help|% Affiche cette page d'aide."
help-info: "%lang:helpCommand|/as info|% Obtenir les informations sur les régions actuelles."
help-rent: "%lang:helpCommand|/as rent|% Louer une région, ou prolonger la location actuelle."
help-buy: "%lang:helpCommand|/as buy|% Acheter une région."
help-unrent: "%lang:helpCommand|/as unrent|% Ne plus louer une région."
help-sell: "%lang:helpCommand|/as sell|% Vendre une région."
help-reload: "%lang:helpCommand|/as reload|% Reloader tout les fichiers et régions."
help-reload: "%lang:helpCommand|/as reload|% Recharge tous les fichiers et met à jour les régions."
help-setrestore: "%lang:helpCommand|/as setrestore|% Active/Désactive la restauration et choix du profil."
help-setprice: "%lang:helpCommand|/as setprice|% Changer le prix d'une région."
help-setduration: "%lang:helpCommand|/as setduration|% Changer le temps de location d'une région."
@@ -83,11 +84,11 @@ help-grouplist: "%lang:helpCommand|/as grouplist|% Afficher tout les groupes."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Afficher des informations sur un groupe."
help-schemevent: "%lang:helpCommand|/as schemevent|% Déclenche un événement schématique d'une région."
help-add: "%lang:helpCommand|/as add|% Enregistrer une région à la vente ou à la location."
help-del: "%lang:helpCommand|/as del|% Supprimer une région enregistrée par AreaShop."
help-del: "%lang:helpCommand|/as del|% Supprimer une région enregistrée dans AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Ajouter un panneau à une région existante."
help-delsign: "%lang:helpCommand|/as delsign|% Supprimer le panneau que vous regardez."
help-me: "%lang:helpCommand|/as me|% Voir les régions que vous possédez (et le temps restant)."
help-setowner: "%lang:helpCommand|/as setowner|% Change le propriétaire d'une région ou allonge le temps de location."
help-setowner: "%lang:helpCommand|/as setowner|% Change le propriétaire d'une région ou prolonge le temps de location."
help-resell: "%lang:helpCommand|/as resell|% Mettre une région en revente."
help-stopResell: "%lang:helpCommand|/as stopresell|% Ne plus revendre votre région."
help-addFriend: "%lang:helpCommand|/as addfriend|% Ajouter un ami à votre région."
@@ -99,23 +100,23 @@ help-setlandlord: "%lang:helpCommand|/as setlandlord|% Définir le bailleur d'un
rent-help: "/as rent [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
rent-noPermission: "Vous n'avez pas la permission de louer une région."
rent-maximum: "Vous ne pouvez pas louer plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
rent-maximumExtend: "Vous ne pouvez pas allonger cette location car vous avez plus de %0% région(s) (Vous avez déjà %1% dans le groupe '%2%')."
rent-maximumExtend: "Vous ne pouvez pas prolonger cette location car vous avez plus de %0% région(s) (Vous avez déjà %1% dans le groupe '%2%')."
rent-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
rent-rented: "Vous louez %lang:region% jusqu'à %until%, vous pouvez étendre la location en fesant un clic droit sur le panneau ou avec la commande /as rent."
rent-rented: "Vous louez %lang:region% jusqu'à %until%, vous pouvez étendre la location en faisant un clic droit sur le panneau ou avec la commande /as rent."
rent-extended: "Vous avez prolongé votre location de %lang:region% jusqu'au %until%."
rent-extendedToMax: "Vous avez allongé votre location de %lang:region% jusqu'au %until% (qui est la durée maximum de location de %maxrenttime%)."
rent-lowMoneyExtend: "Vous n'avez pas assez d'argent pour allongé votre location (Vous avez %0% et vous avez besoin de %price%)."
rent-lowMoneyExtend: "Vous n'avez pas assez d'argent pour prolonger votre location (Vous avez %0% et vous avez besoin de %price%)."
rent-lowMoneyRent: "Vous n'avez pas assez d'argent pour louer %lang:region% (Vous avez %0% et vous avez besoin de %price%)."
rent-someoneElse: "Quelqu'un d'autre loue déjà %lang:region%."
rent-notRentable: "Cette région n'est pas disponible à la location."
rent-maxExtends: "Vous ne pouvez plus allongé cette location (le maximum est de %maxextends% fois), mais après que la prochaine location soit terminé, vous pourrez louer %lang:region% à nouveau."
rent-maxExtends: "Vous ne pouvez plus prolonger cette location (le maximum est de %maxextends% fois), mais après que la prochaine location soit terminé, vous pourrez louer %lang:region% à nouveau."
rent-maxRentTime: "Vous ne pouvez pas louer %lang:region% plus longtemps à l'avance, le maximum est de %maxrenttime% et vous avez déjà loué pour %timeleft%."
rent-restrictedToWorld: "Vous devez être dans le monde '%world%' pour louer %lang:region% (vous êtes dans '%0%')."
rent-restrictedToRegion: "Vous devez être à l'intérieur de %lang:region% pour pouvoir la louer."
rent-expireWarning: "Votre région %lang:region% n'a plus que %timeleft% de temps de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
rent-expireWarning: "Votre région %lang:region% n'a plus que %timeleft% de temps de restant de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
rent-alreadyAtFull: "%lang:region% a déjà atteint ou a dépassé le temps maximum de location, vous ne pouvez pas encore l'étendre la location."
buy-help: "/as buy [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
buy-help: "/as buy [région], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
buy-noPermission: "Vous n'avez pas la permission d'acheter une région."
buy-noPermissionResell: "Vous n'avez pas la permission d'acheter une région dans le mode revente."
buy-noPermissionNoResell: "Vous n'avez pas la permission d'acheter une région qui n'est pas dans le mode revente."
@@ -126,23 +127,23 @@ buy-succes: "Vous avez acheté la région %lang:region%."
buy-successResale: "Vous avez racheté la région %lang:region% qui appartenait à %lang:tPlayer|%0%|%."
buy-successSeller: "Votre région %lang:region% a été vendue à %lang:player% pour %0%."
buy-lowMoney: "Vous n'avez pas assez d'argent pour acheter %lang:region% (vous possédez %0% et devez payer %price%)."
buy-lowMoneyResell: "Vous n'avez pas assez d'argent pour acheter %lang:region% (vous possédez %0% et devez payer %resellprice%)."
buy-lowMoneyResell: "Vous n'avez pas assez d'argent pour acheter %lang:region% (vous possédez %0% et vous avez besoin de %resellprice%)."
buy-yours: "Vous avez déjà acheté %lang:region%."
buy-someoneElse: "Quelqu'un a déjà acheté %lang:region%."
buy-restrictedToWorld: "Vous devez être dans le monde '%world%' pour acheter %lang:region% (vous êtes dans '%0%')."
buy-restrictedToRegion: "Vous devez être dans %lang:region% pour pouvoir l'acheter."
unrent-help: "/as unrent [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
unrent-noPermission: "Vous n'avez pas la permission de dé-louer une région."
unrent-noPermissionOther: "Vous n'avez pas la permission de dé-louer une autre région."
unrent-notRegistered: "La région ne peut pas ne plus être louée car elle n'est pas enregistrée comme une région que l'on peut louer."
unrent-notRented: "La région ne peut pas ne plus être louée car elle n'est pas enregistrée comme actuellement louée."
unrent-help: "/as unrent [région], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
unrent-noPermission: "Vous n'avez pas la permission de cesser la location d'une région."
unrent-noPermissionOther: "Vous n'avez pas la permission de cesser la location d'une autre région."
unrent-notRegistered: "Vous ne pouvez pas cesser la location sur cette région car elle n'est pas enregistrer comme location."
unrent-notRented: "Vous ne pouvez pas cesser la location sur cette région car elle n'est pas louée."
unrent-unrented: "Vous avez rompu la location de %lang:region% de %lang:player%."
unrent-expired: "Votre location de %lang:region% a expiré."
unrent-expired: "Votre location de %lang:region% a expirée."
sell-help: "/as sell [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
sell-notRegistered: "La région ne peut pas être vendue car son statut n'est pas \"à vendre\"."
sell-notBought: "La région ne peut pas être vendue car ce n'est pas la propriété de quelqu'un."
sell-notRegistered: "La région ne peut pas être vendue car elle n'est pas enregistrée comme à vendre."
sell-notBought: "La région ne peut pas être vendue car elle n'est la propriété de personne."
sell-sold: " %lang:player% a vendu la région %lang:region%"
sell-noPermission: "Vous n'avez pas la permission de vendre une région."
sell-noPermissionOther: "Vous n'avez pas la permission de vendre une autre région."
@@ -153,16 +154,6 @@ reload-updateComplete: "[gray]Mise à jour des régions terminée."
reload-noPermission: "Vous n'avez pas la permission de recharger les fichiers."
reload-updateCommandChanged: "'/as updaterents' et '/as updatebuys' ont été supprimées, '/as reload' est la commande à utiliser pour mettre à jour les régions."
info-help:
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%"
- " %lang:command|region|/as info region|% [region][break]"
info-noPermission: "Vous n'avez pas la permission d'avoir des informations à propos des régions."
info-allHeader: "Toutes les régions%0%:"
info-rentedHeader: "Les régions louées%0%:"
@@ -176,9 +167,23 @@ info-nogroupNone: "Il n'y a pas de région sans groupe."
info-noFiltergroup: "Le groupe '%0%' n'existe pas ou ne peut donc pas être utilisé pour limiter les résultats."
info-noRegions: "Aucune région trouvée."
info-wrongPage: "%0% n'est pas un numéro de page correct."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]A louer pour %price% par %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Loué à %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]A vendre pour %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player% (revente)."
info-pageStatus: "[gold]Page %0%/%1%"
info-pagePrevious:
- "⇥[gold][bold]◄Précédent[/bold] "
- "⇥hover: %lang:action|Afficher la page précédente|%"
- "⇥command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Précédent[/bold] "
- " hover: C'est déjà la premier page"
info-pageNext:
- "⇥[gold][bold]Suivant►[/bold]"
- "⇥hover: %lang:action|Afficher la page suivante|%"
- "⇥command: %0%"
info-pageNoNext:
- " [darkgray][bold]Suivaznt►[/bold]"
- " hover: C'est déjà la dernière page"
@@ -263,9 +268,6 @@ info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Vous devez être
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Vous devez à l'intérieur du monde '%world%' pour louer %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Vous devez être à l'intérieur de %lang:region% pour l'acheter."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Vous devez à l'intérieur du monde '%world%' pour acheter %lang:region%."
info-regionRestoringRent: "[darkgreen][bold]►[reset] La restauration est activée [gray](la région sera remise à zéro a la fin de la location)%0%"
info-regionRestoringBuy: "[darkgreen][bold]►[reset] La restauration est activée [gray](la région sera remise à zéro a la fin de la location)%0%"
info-regionRestoringProfile: "(Profil : %0%)"
info-regionLandlord: "[darkgreen][bold]►[reset] Bailleur : [gray]%lang:landlord% (reçoit l'argent)."
info-regionNotExisting: "La région spécifiée n'est pas enregistrée : %0%."
@@ -383,7 +385,6 @@ add-failed: "Déjà enregistré: [gray]%0%."
add-blacklisted: "Dans la liste noir: [gray]%0%."
add-specifyWorld: "Spécifiez le monde de la région lors de l'utilisation de la console."
add-incorrectWorld: "Le monde '%0%' est introuvable, essayez de nouveau (attention à la casse)."
add-noRegion: "La région WorldGuard '%0%' n'existe pas dans ce monde."
add-noPermissionRegions: "Pas de permission à ajouter: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Soit vous n'êtes pas membre / propriétaire de cette région ou n'avez pas la permission d'ajouter vos régions."
@@ -415,9 +416,20 @@ delsign-success: "Le panneau à été retiré de la région %lang:region%."
me-noPermission: "Vous n'avez pas la permission de voir quelle(s) région(s) vous possédez."
me-header: "Régions de %lang:tPlayer|%0%|%:"
me-notAPlayer: "Vous n'êtes pas un joueur. Vous ne pouvez donc pas avoir de régions."
me-rentLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% restant"
- "⇥hover: depuis %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "propriétaire: %lang:player%"
- "⇥hover: Vous avez ajouté comme ami"
- ")."
me-nothing: "%lang:tPlayer|%0%|% n'a pas loué ou acheté de régions et n'a pas été ajouté comme ami dans l'un entre eux."
me-noPlayer: "%0% n'a pas été trouvé, il ne s'est peut être jamais connecté sur le serveur."
me-clickHint: "[gray][italic]Cliquez sur le nom d'une région pour voir les détails."
setowner-help: "/as setowner <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
setowner-noPermission: "Vous n'avez pas la permission de définir le propriétaire d'une région."
@@ -459,6 +471,7 @@ delfriend-noPermissionOther: "Vous n'avez pas la permission de supprimer des ami
delfriend-noPermission: "Vous n'avez pas la permission de supprimer des amis de votre région."
delfriend-successOther: "%lang:tPlayer|%0%|% a été supprimé comme ami de la région %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% a été supprimé comme ami de votre région %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% n'est pas dans les amis de %lang:region%."
delfriend-noOwner: "Vous ne pouvez pas supprimer les amis d'une région sans propriétaire."
linksigns-multipleRegions: "Plusieurs régions trouvées : [gray]%0%."
@@ -488,8 +501,6 @@ stack-wrongAmount: "'%0%' n'est pas une quantité correcte de régions."
stack-wrongGap: "'%0%' n'est pas un nombre correct pour le nombre de blocs séparant deux régions."
stack-noSelection: "Vous n'avez pas de sélection qui indique où doit se trouver la première région créée."
stack-addStart: "[gray]Ajout de %0% régions, %1% par seconde."
stack-addComplete: "[gray]Ajout de régions terminé."
stack-unclearDirection: "Merci de regarder clairement le Nord, l'Est, le Sud ou l'Ouest, actuellement détectée %0%."
setlandlord-help: "/as setlandlord <joueur> [région], la région où vous êtes sera utilisé si non spécifié."
setlandlord-noPermission: "Vous n'avez pas la permission de définir le bailleur d'une région."
@@ -532,10 +543,10 @@ timeleft-hours: "%0% heures"
timeleft-minutes: "%0% minutes"
timeleft-second: "%0% seconde"
timeleft-seconds: "%0% secondes"
timeleft-ended: "Expiré"
timeleft-ended: "Expirée"
greeting-forrent: "La région '%region%' peut être louée pour %price% pour une durée de %duration%."
greeting-rented: "La région '%region%' est louée par %player% jusqu'au %until%."
greeting-forsale: "La région '%region%' peut être achetée pour %price%."
greeting-bought: "La région '%region%' est la propriété de %player%."
greeting-forrent: "%region% peut être louée pour %price% pour une durée de %duration%."
greeting-rented: "%region% est louée par %player% jusqu'au %until%."
greeting-forsale: "%region% peut être achetée pour %price%."
greeting-bought: "%region% est la propriété de %player%."
greeting-resale: "La région '%region%' peut être achetée pour %resaleprice% à %player%."
+12 -9
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Dutch, Version: V2.3.2, Percentage translated: 100% ║
# ║ Language: Dutch, Version: V2.4.0, Percentage translated: 100% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -58,7 +58,8 @@ cmd-weOnlyByPlayer: "Gebruikmaken van een WorldEdit selectie is alleen mogelijk
cmd-noSelection: "Je hebt geen WorldEdit selectie."
cmd-noRegionsFound: "Er zijn geen gebieden in je selectie gevonden die geregistreerd staan in AreaShop."
cmd-noWERegionsFound: "Er zijn geen WorldEdit gebieden gevonden die zich in je selectie bevinden."
cmd-notRegistered: "Het aangegeven gebied is niet geregistreerd in AreaShop: %0%."
cmd-notRegistered: "Gebied '%0%' is niet beschikbaar in AreaShop."
cmd-noRegion: "'%0%' is geen geldig WorldGuard gebied."
cmd-noRegionsAtLocation: "Geen gebieden gevonden op je lokatie, geef het gebied mee als argument."
cmd-moreRegionsAtLocation: "Meerdere gebieden gevonden op je lokatie, geef het gebied mee als argument."
cmd-automaticRegionOnlyByPlayer: "Automatisch bepalen van het gebied is alleen mogelijk voor spelers, geef het gebied mee als argument."
@@ -115,6 +116,7 @@ rent-maxRentTime: "Je kunt %lang:region% niet meer tijd van tevoren huren, de ma
rent-restrictedToWorld: "Je moet in de wereld '%world%' zijn om %lang:region% te kopen (je ben in '%0%')."
rent-restrictedToRegion: "Je moet in %lang:region% staan om hem te huren."
rent-expireWarning: "Je gebied %lang:region% heeft nog %timeleft% over, verleng het als je het wilt houden.."
rent-expiringSoon: "Je gebied %lang:tRegion|%0%|% heeft nog %1% over, verleng het als je het wilt houden."
rent-alreadyAtFull: "%lang:region% is al verhuurd voor de maximale tijd, je kunt hem niet verlengen."
buy-help: "/as buy [region], het gebied waarin je staat word gebruikt als je het niet aangeeft."
@@ -163,8 +165,9 @@ info-help:
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%"
- " %lang:command|region|/as info region|% [region][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
- " %lang:command|region|/as info region|% [break]"
info-noPermission: "Je hebt geen toestemming om informatie over gebieden te bekijken."
info-allHeader: "Alle gebieden%0%:"
info-rentedHeader: "Verhuurde gebieden%0%:"
@@ -279,9 +282,8 @@ info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Je moet in %lang:r
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] je moet in de wereld '%world%' zijn om %lang:region% te huren."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Je moet in %lang:region% staan om deze te kopen."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Je moet in de wereld '%world%' staan om %lang:region% te kopen."
info-regionRestoringRent: "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij een huurstop)%0%."
info-regionRestoringRent: "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij een huurstop)."
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij verkoop)%0%."
info-regionRestoringProfile: " (profiel: %0%)"
info-regionLandlord: "[darkgreen][bold]►[reset] Landeigenaar: [gray]%lang:landlord% (krijgt het geld)."
info-regionNotExisting: "Het aangegeven gebied is niet geregistreerd: %0%."
@@ -399,7 +401,6 @@ add-failed: "Al geregistreerd: [gray]%0%."
add-blacklisted: "Op de blacklist: [gray]%0%."
add-specifyWorld: "Geef de wereld van het gebied aan als je het commando vanuit de console gebruikt."
add-incorrectWorld: "Wereld '%0%' niet gevonden, probeer opnieuw (hoofdlettergevoelig)."
add-noRegion: "WorldGuard gebied '%0%' bestaat niet in deze wereld."
add-noPermissionRegions: "Geen toestemming om toe te voegen: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Je bent geen member/owner van deze gebieden of hebt geen toestemming om je gebieden toe te voegen."
@@ -516,8 +517,10 @@ stack-wrongAmount: "'%0%' is geen goed aantal gebieden."
stack-wrongGap: "'%0%' is geen correct getal voor het aantal blokken ruimte tussen gebieden."
stack-noSelection: "Je hebt geen selectie die aangeeft waar het eerste gebied word gemaakt."
stack-addStart: "[gray]%0% gebieden aan het toevoegen met %1% per seconde."
stack-addComplete: "[gray]Toevoegen van gebieden voltooid."
stack-unclearDirection: "Kijk precies in het noorden, oosten, zuiden of westen, op dit moment gedetecteert: %0%."
stack-addComplete: "[gray]%0% gebieden toegevoegd%1%."
stack-tooHigh: ", %0% gebieden overgeslagen omdat ze zich boven Y=256 bevinden"
stack-tooLow: ", %0% gebieden overgeslagen omdat ze zich onder Y=0 bevinden"
stack-unclearDirection: "Kijk duidelijk in de noord, oost, zuid, west, omhoog of naar beneden richting, gedetecteerd: %0%."
setlandlord-help: "/as setlandlord <speler> [gebied], het gebied waar je in staat zal worden gebruikt als niet aangegeven."
setlandlord-noPermission: "Je hebt geen toestemming om de landeigenaar in te stellen voor een gebied."
+2 -18
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Norwegian, Version: V2.3.2, Percentage translated: 96% ║
# ║ Language: Norwegian, Version: V2.4.0, Percentage translated: 94% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -56,7 +56,6 @@ cmd-weOnlyByPlayer: "Du kan bare bruke en WorldEdit markering som en spiller, sp
cmd-noSelection: "Du har ikke laget en WorldEdit markering."
cmd-noRegionsFound: "Ingen regioner som er registrert i AreaShop er funnet i din markering."
cmd-noWERegionsFound: "Ingen WorldEdit regioner som overlapper din markering er funnet."
cmd-notRegistered: "Den spesifiserte regionen er ikke tilgjengelig i AreaShop: %0%."
cmd-noRegionsAtLocation: "Ingen regioner er funnet på din plassering, spesifiser region navnet som et argument."
cmd-moreRegionsAtLocation: "Mer enn en region er funnet på din plassering, spesifiser region navnet som et argument."
cmd-automaticRegionOnlyByPlayer: "Automatisk valg av region er bare mulig for spillere, spesifiser region navnet som som et argument."
@@ -153,16 +152,6 @@ reload-updateComplete: "[gray]Oppdatering av regioner ferdig."
reload-noPermission: "Du har ikke rettigheter til å laste inn konfigurasjonen på nytt."
reload-updateCommandChanged: "'/as updaterents' og '/as updatebuys' har blitt fjernet, '/as reload' vil også oppdatere regioner så bruk den kommandoen fremover."
info-help:
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%"
- " %lang:command|region|/as info region|% [region][break]"
info-noPermission: "Du har ikke rettigheter til å få informasjon om regioner."
info-allHeader: "Alle regioner%0%:"
info-rentedHeader: "Leide regioner%0%:"
@@ -263,9 +252,6 @@ info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Du må stå på in
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Du må være i '%world%' for å leie %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Du må være på innsiden av %lang:region% for å kjøpe den."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Du må være i '%world%' for å kjøpe %lang:region%."
info-regionRestoringRent: "[darkgreen][bold]►[reset] Gjenoppretting er aktivert [gray](regionen vil gjenopprettes ved stopp av leie)%0%."
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Gjenoppretting er aktivert [gray](regionen vil gjenopprettes ved salg)%0%."
info-regionRestoringProfile: "(profil: %0%)"
info-regionLandlord: "[darkgreen][bold]►[reset] Grunneier: [gray]%lang:landlord% (mottar pengene)."
info-regionNotExisting: "Den spesifiserte regionen er ikke registrert: %0%."
@@ -383,7 +369,6 @@ add-failed: "Allerede registrert: [gray]%0%."
add-blacklisted: "På svartelisten: [gray]%0%."
add-specifyWorld: "Spesifiser verdenen til en region når du bruker konsoll."
add-incorrectWorld: "Verden '%0%' ikke funnet, prøv igjen (sensitiv for store og små bokstaver)."
add-noRegion: "WorldGuard region '%0%' eksisterer ikke i denne verdenen."
add-noPermissionRegions: "Ingen rettigheter til å legge til: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Du er enten ikke et medlem/eier av disse regionene eller har ikke rettigheter til å legge til dine regioner."
@@ -481,6 +466,7 @@ stack-help:
- " [gray]<rent|buy> Bestem om dem skal leies eller kjøpes.[break]"
- " [gray][group] En gruppe du vil legge dem til i.[break]"
- " [gray]Regionene vil bli laget i rettningen du ser."
stack-accepted: "Begynner å lage %0% %1% regioner med %2% blokker mellom dem, navnene starter med %3% og vil ha nummer bak seg.%4%"
stack-addToGroup: "Regioner laget vil bli lagt til i gruppen '%0%'."
stack-noPermission: "Du har ikke rettigheter til å lage og legge til regioner i AreaShop i store mengder."
@@ -488,8 +474,6 @@ stack-wrongAmount: "'%0%' er ikke en riktig mengde regioner."
stack-wrongGap: "'%0%' er ikke et riktig nummer for antall blokker mellom regioner."
stack-noSelection: "Du har ikke laget en markering som indikerer hvor den første regionen skal bli laget."
stack-addStart: "[gray]Legger til %0% regioner på %1% per sekund."
stack-addComplete: "[gray]Regioner er ferdig lagt til."
stack-unclearDirection: "Du må se rett mot nord, sør, øst eller vest, du ser mot %0%."
setlandlord-help: "/as setlandlord <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
setlandlord-noPermission: "Du har ikke rettigheter til å sette grunneier for en region."
+87 -34
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Russian, Version: V2.3.2, Percentage translated: 86% ║
# ║ Language: Russian, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -8,6 +8,8 @@
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
@@ -53,10 +55,9 @@ general-cancelled: "%0%"
cmd-notValid: "Ошибка в команде, используй '/as help' для получения дополнительной информации."
cmd-onlyByPlayer: "Эта команда может быть применена только игроком. "
cmd-weOnlyByPlayer: "Использование выделения доступно только для игроков, укажите название региона в качестве дополнительного аргумента."
cmd-noSelection: "Вы не выделили регион."
cmd-noSelection: "Вы не имеете WorldEdit выделения."
cmd-noRegionsFound: "В выбранной области не найдено регионов, зарегистрированных в AreaShop."
cmd-noWERegionsFound: "Внутри вашего выделения не обнаружено регионов."
cmd-notRegistered: "Указаный регион не используется в AreaShop: %0%."
cmd-noRegionsAtLocation: "В вашем местоположении не найдено регионов, укажите регион в качестве аргумента."
cmd-moreRegionsAtLocation: "В вашем местоположении найдено несколько регионов, укажите название региона для уточнения."
cmd-automaticRegionOnlyByPlayer: "Автоматическое определение региона доступно только для игроков, укажите регион в качестве аргумента."
@@ -86,7 +87,7 @@ help-add: "%lang:helpCommand|/as add|% Зарегистрировать реги
help-del: "%lang:helpCommand|/as del|% Удалить зарегистрированный регион из AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Добавить табличку для региона."
help-delsign: "%lang:helpCommand|/as delsign|% Удалить табличку на которую вы смотрите."
help-me: "%lang:helpCommand|/as me|% Проверить список своих регионов(+истечение аренды)"
help-me: "%lang:helpCommand|/as me|% Проверить список своих регионов(+истечение аренды)."
help-setowner: "%lang:helpCommand|/as setowner|% Установить владельца региона или расширить аренду."
help-resell: "%lang:helpCommand|/as resell|% Установить один из Ваших регионов в режим перепродажи."
help-stopResell: "%lang:helpCommand|/as stopresell|% Установить Ваш регион обратно в режим продано."
@@ -153,16 +154,6 @@ reload-updateComplete: "[gray]Обновление регионов заверш
reload-noPermission: "Недостаточно полномочий для того, чтобы перезагрузить конфиги плагина."
reload-updateCommandChanged: "'/as updaterents' и '/as updatebuys' были удалены, '/as reload' теперь будет также обновлять регионы, используйте эту команду взамен."
info-help:
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%"
- " %lang:command|region|/as info region|% [region][break]"
info-noPermission: "У Вас нет прав для получения информации о регионах."
info-allHeader: "Все регионы%0%:"
info-rentedHeader: "Арендовано регионов%0%:"
@@ -176,9 +167,23 @@ info-nogroupNone: "Здесь нет регионов без групп."
info-noFiltergroup: "Группа '%0%' не существует, потому не может быть использована для ограничения результатов."
info-noRegions: "Нет найденых регионов."
info-wrongPage: "%0% неверный номер страницы."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]Можно арендовать за %price% на %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Арендован %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]Можно продать за %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Продан %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Продан %lang:player% (перепродажа)."
info-pageStatus: "[gold]Страница %0%/%1%"
info-pagePrevious:
- " [gold][bold]◄Предыдущая[/bold] "
- " hover: %lang:action|Показать предыдущую страницу|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Предыдущая[/bold] "
- " hover: Это первая страница"
info-pageNext:
- " [gold][bold]Следующая►[/bold]"
- " hover: %lang:action|Показать следующую страницу|%"
- " command: %0%"
info-pageNoNext:
- " [darkgray][bold]Следующая►[/bold]"
- " hover: Это последняя страница"
@@ -195,7 +200,7 @@ info-regionBought: "[darkgreen][bold]►[reset] Куплено %lang:player%."
info-regionReselling: "[darkgreen][bold]►[reset] Купленный %lang:player%, сейчас продаётся."
info-regionExtending:
- "[darkgreen][bold]►[reset] "
- "[bold]Продление для[/bold]"
- "[bold]Продление за[/bold]"
- " hover: Продлить аренду %region%"
- " hover: длительностью %duration% за %price%"
- " hover: %lang:action|Продлить аренду %region%|%"
@@ -203,14 +208,14 @@ info-regionExtending:
- ": [gray]%price% на %duration%."
info-regionCanBeRented:
- "[darkgreen][bold]►[reset] "
- "[bold]Аренда для[/bold]"
- "[bold]Аренда за[/bold]"
- " hover: Арендовать %region% за %price% на %duration%"
- " hover: %lang:action|Аренда %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% на %duration%."
info-regionCanBeBought:
- "[darkgreen][bold]►[reset] "
- "[bold]Купить для[/bold]"
- "[bold]Купить за[/bold]"
- " hover: Купить %region% за %price%"
- " hover: %lang:action|Купить %region%|%"
- " command: /areashop buy %region%"
@@ -250,11 +255,11 @@ info-regionTeleport:
- " hover: %lang:action|Телепортация на %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]установка места телепортации[/bold]"
- "[bold]установить точку телепортации[/bold]"
- " hover: %region%"
- " hover: %lang:action|Set teleport location|%"
- " hover: %lang:action|Установить точку телепорта|%"
- " command: /areashop settp %region%"
info-regionSigns: "[darkgreen][bold]►[reset] Подключенные таблички: [gray]%0%."
info-regionSigns: "[darkgreen][bold]►[reset] Связанные таблички: [gray]%0%."
info-regionSignLocation: "[gray](%0%, %1%, %2%, %3%)[reset]"
info-regionGroups: "[darkgreen][bold]►[reset] Назначенные группы: [gray]%0%."
info-regionInactiveUnrent: "[darkgreen][bold]►[reset] Авто снятие аренды после: [gray]%inactivetime% бездействия игрока."
@@ -263,9 +268,6 @@ info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Ты должен
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для аренды %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Ты должен быть внутри %lang:region% для его покупки."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для покупки %lang:region%."
info-regionRestoringRent: "[darkgreen][bold]►[reset] Восстановление включено [gray](регион будет сброшен после снятия аренды)%0%."
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Восстановление включено [gray](регион будет сброшен после продажи)%0%."
info-regionRestoringProfile: " (профиль: %0%)"
info-regionLandlord: "[darkgreen][bold]►[reset] Землевладелец: [gray]%lang:landlord% (Получит деньги)."
info-regionNotExisting: "Указанный регион не зарегистрирован: %0%."
@@ -280,14 +282,51 @@ setprice-noPermission: "У вас нет разрешения на измене
setprice-help: "/as setprice <price> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setprice-notRegistered: "Указанный регион не зарегистрирован: %0%."
setprice-wrongPrice: "'%0%' не допустимая цена."
setprice-successRent: "Цену региона %lang:region% изменено на %price% до %duration%."
setprice-successBuy: "Цену региона %lang:region% изменено на %price%."
setprice-successRemoved: "Цена в %lang:region% была удалена, использование новой цены из группы или файла default.yml, новая цена: %price%."
setprice-noLandlord: "У вас нет разрешения на изменение цены, потому что вы не землевладелец в %lang:region%."
setduration-noPermission: "У вас нет разрешения на изменение длительности аренды."
setduration-help: "/as setduration <amount> <identifier> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setduration-notRegistered: "%0% не зарегистрирован для сдачи в аренду."
setduration-wrongAmount: "'%0%' не является допустимым количеством, используйте целое число."
setduration-wrongFormat: "'%0%' не правильный формат времени, проверьте документацию на Bukkit."
setduration-success: "Длительность аренды в регионе %lang:region% изменена до '%duration%'."
setduration-noLandlord: "У вас нет разрешения на изменение длительности аренды, потому что вы не землевладелец в %lang:region%."
setduration-successRemoved: "Длительность аренды в %lang:region% было удалено, использование новой длительности аренды из группы или файла default.yml, новая длительность: %duration%."
setup-noRegion: "Вы не указали регион на второй строке."
setup-alreadyRentSign: "Регион уже добавлен в AreaShop в виде аренды региона, добавьте табличку с [as] на первой строке, или '/as addsign'."
setup-alreadyBuySign: "Регион уже добавлен в AreaShop в виде покупного региона, добавьте табличку с [as] на первой строке, или '/as addsign'."
setup-noDuration: "Вы не указали, на сколько времени этот регион можно арендовать, сделайте это на третьей строчке."
setup-wrongDuration: "Время указано не в правильном формате, например: 1 day."
setup-noPrice: "Вы не указали цену на четвертой строке."
setup-wrongPrice: "Вы не указали цену правильно, используйте только цифры ."
setup-rentSuccess: "Сдача аренды в регионе %lang:region% настроена правильно."
setup-buySuccess: "Покупка региона %lang:region% настроена правильно."
setup-noPermissionRent: "У вас нет разрешения на создание арендных регионов."
setup-noPermissionBuy: "У вас нет разрешения на создание проваемых регионов."
setup-couldNotDetect: "Найдено несколько областей с одинаковым приоритетом это/или родительский/дочерна связь, указать одно на второй строке (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
setup-blacklisted: "%0% находится в черном списке и не могут быть добавлены к AreaShop"
setup-noPermission: "Вы не можете добавить регион '%0%', вы не являетесь владельцем/участником или не имеете прав для этого."
destroy-noPermissionRent: "У вас нет разрешения на создание регионов для аренды."
destroy-noPermissionBuy: "У вас нет разрешения на создание регионов для продажи."
destroy-successRent: "%lang:region% успешно зарегистрирован в качестве региона для аренды."
destroy-successBuy: "%lang:region% успешно зарегистрирован в качестве региона для продажи."
teleport-help: "/as tp <region> [табличка]."
teleport-noRentOrBuy: "Указанный регион не зарегистрирован: %0%."
teleport-noPermission: "У вас нет разрешения для телепортации на ваш регион."
teleport-noPermissionOther: "У вас нет разрешения для телепортации на регионы которыми вы не владеете."
teleport-noPermissionSign: "У вас нет разрешения для телепортации к таблички вашего региона."
teleport-noPermissionOtherSign: "У вас нет разрешения для телепортации к табличек регионов которыми вы не владеете."
teleport-noPermissionFriend: "У вас нет разрешения для телепортации на регионы в которых вы добавлены как друг."
teleport-noPermissionFriendSign: "У вас нет разрешения для телепортации к табличкам регионов в которых вы добавлены как друг."
teleport-success: "Вы телепортированы к %lang:region%."
teleport-successSign: "Вы телепортированы к табличке возле %lang:region%."
teleport-noSafe: "Сохранение позиции не найдено в %lang:region%, нет места в регионе или превышен максимальный лимит (%0%/%1%)."
teleport-blocked: "Вы не можете телепортироваться, потому что положение находится за пределами региона, и вы вынуждены телепортироваться во внутрь."
teleport-changedToSign: "У вас есть только разрешение на телепортироваться к табличке, а не во внутрь региона, телепортация к табличке."
teleport-changedToNoSign: "Ни одна табличка не доступна что бы телепортироваться, попытка телепортироваться во внутрь региона вместо этого."
@@ -302,9 +341,12 @@ setteleport-reset: "Точка телепорта для %lang:region% была
find-help: "/as find <buy|rent> [стоимость] [группа]."
find-noPermission: "У вас нет разрешения на поиск регионов и телепортироваться к ним."
find-success: "Найден %0% регион: %lang:region%, при поиске с максимальной ценой в вашем балансе: %1%%2%."
find-successMax: "Найдено %0% регионов: %lang:region%, при поиске с максимальной ценой %1%%2%."
find-wrongMaxPrice: "Указанная максимальная цена имеет не правильный номер: %0%."
find-wrongGroup: "Указанная группа не существует: %0%."
find-noneFound: "Ни один %0% регион не найден при поиске с максимальной ценой в вашем балансе: %1%%2%."
find-noneFoundMax: "Ни один %0% регион не найден при поиске с максимальной ценой %1%%2%."
find-onlyInGroup: ", искать регионы только в группах: %0%."
groupadd-help: "/as groupadd <group> [имярегиона], если не указать имя, будут выбраны все регионы в вашем WorldEdit выделении."
@@ -338,12 +380,11 @@ schemevent-noPermission: "У вас нет разрешения на иници
add-help: "/as add <rent|buy> [rрегион] [мир]."
add-noPermission: "У вас нет разрешения добавлять регионы в AreaShop."
add-success: "AДобавлен к %0%: [gray]%1%."
add-success: "Добавлен в %0%: [gray]%1%."
add-failed: "Уже зарегистрирован: [gray]%0%."
add-blacklisted: "Включен в черный список : [gray]%0%."
add-specifyWorld: "Укажите мир региона при использовании из консоли."
add-incorrectWorld: "Мир '%0%' не найден, попробуйте еще раз (с учетом регистра)."
add-noRegion: "WorldGuard регион '%0%' не существует в этом мире."
add-noPermissionRegions: "Нет разрешения, чтобы добавить: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Вы либо не являетесь участником/владельцем этих регионов, либо не имеете разрешения добавлять свои регионы."
@@ -375,9 +416,20 @@ delsign-success: "Табличка была удалена из региона %
me-noPermission: "У вас нет прав, чтобы проверить, какие регионы вы имеете."
me-header: "Регионы %lang:tPlayer|%0%|%:"
me-notAPlayer: "Вы не являетесь игроком, которому доступны какие-либо регионы."
me-rentLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% истек"
- " hover: until %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "принадлежит %lang:player%"
- " hover: Вы добавили друга"
- ")."
me-nothing: "%lang:tPlayer|%0%|% не арендовали или покупали регионы и не добавлялись в друзья."
me-noPlayer: "%0% не может быть найден, вероятно, никогда не присоединился к серверу."
me-clickHint: "[gray][italic]Нажмите на имя региона , чтобы увидеть детали"
setowner-help: "/as setowner <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setowner-noPermission: "У вас нет прав, чтобы установить владельца региона."
@@ -385,6 +437,8 @@ setowner-noPermissionRent: "У вас нет прав, чтобы установ
setowner-noPermissionBuy: "У вас нет прав, чтобы установить владельца для покупки регионов."
setowner-notRegistered: "Указанный регион не зарегистрирован, владелец не может быть установлен."
setowner-noPlayer: "Не удалось получить UUID указанного игрока: %0%."
setowner-succesRent: "Владелец в %lang:region% успешно изменен на %lang:player%, орендований до %until% (%timeleft% истечет)."
setowner-succesRentExtend: "Владелец %lang:player%, аренда расширена на '%duration%', сейчас арендован до %until% (%timeleft% истечет)."
setowner-succesBuy: "Владелец в %lang:region% успешно изменен на %lang:player%."
resell-help: "/as resell <price> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
@@ -417,14 +471,15 @@ delfriend-noPermissionOther: "У вас нет разрешения на уда
delfriend-noPermission: "У вас нет разрешения на удаление друзей из вашего региона."
delfriend-successOther: "%lang:tPlayer|%0%|% был удален из друзей в регионе %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% был удален из друзей в вашем регионе %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% не добавлен до друзей в %lang:region%."
delfriend-noOwner: "Вы не можете удалять друзей из региона без владельца."
linksigns-multipleRegions: "Найдено несколько регионов: [gray]%0%."
linksigns-multipleRegionsAdvice: "Нажмите в другое время, чтобы попробовать еще раз или использовать '/as linksigns' чтобы остановить."
linksigns-multipleRegionsAdvice: "Нажмите в другое время, чтобы попробовать еще раз или используйте '/as linksigns' чтобы остановить."
linksigns-noRegions: "Не найдено регионов AreaShop в направлении взгляда, убедитесь что регион добавлен в AreaShop [gray](максимум расстояние в 100 блоков)."
linksigns-regionFound: "Регион %lang:region% был найден, теперь соедините с табличкой кликнув левой кнопкой миши ."
linksigns-signFound: "Найдена табличка в (%0%, %1%, %2%), теперь соедините с регионом кликнув правой кнопкой мыши ."
linksigns-noSign: "Никаких табличок обнаружено в направлении взгляда, убедитесь, что у вас есть прямой взгляд на табличку и нажмите снова [gray](максимум расстояние в 100 блоков)."
linksigns-regionFound: "Регион %lang:region% был выбран, теперь укажите табличку кликнув левой кнопкой мыши для его привязки."
linksigns-signFound: "Обнаружена табличка в (%0%, %1%, %2%), теперь укажите регион кликнув правой кнопкой мыши для ее привязки"
linksigns-noSign: "Никаких табличек не обнаружено в направлении взгляда, убедитесь, что у вас есть прямой взгляд на табличку и нажмите снова [gray](максимум расстояние в 100 блоков)."
linksigns-alreadyRegistered: "Эта табличка уже зарегистрирована в регионе %lang:region%, кликни еще раз, чтобы выбрать другую табличку."
linksigns-first: "Включен режим привязки табличек."
linksigns-next: "[gray]Клик лкм. выбрать табличку, клик пкм. выбрать регион, использовать /as linksigns для отключения режима."
@@ -446,8 +501,6 @@ stack-wrongAmount: "'%0%' не правильное количество рег
stack-wrongGap: "'%0%' не правильное число блоков для отступа между регионами."
stack-noSelection: "У вас нет выделения, которое указывает, где должен быть создан первый регион."
stack-addStart: "[gray]Добавлено %0% регионов около %1% в секунду."
stack-addComplete: "[gray]Добавление регионов прошло успешно."
stack-unclearDirection: "Посмотрите, пожалуйста, четко на север, восток, юг или запад, обнаружено %0%."
setlandlord-help: "/as setlandlord <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setlandlord-noPermission: "У вас не разрешения чтобы назначить землевладельца в регион."
@@ -488,12 +541,12 @@ timeleft-months: "%0% месяцев"
timeleft-days: "%0% дней"
timeleft-hours: "%0% часов"
timeleft-minutes: "%0% минут"
timeleft-second: "%0% секунда"
timeleft-second: "%0% секунд"
timeleft-seconds: "%0% секунд"
timeleft-ended: "Истек"
greeting-forrent: "%region% может быть арендован за %price% в %duration%"
greeting-rented: "%region% арендован игроком %player% до %untill%."
greeting-forrent: "%region% может быть арендован за %price% на %duration%"
greeting-rented: "%region% арендован игроком %player% до %until%."
greeting-forsale: "%region% может быть куплен за %price%."
greeting-bought: "%region% куплен игроком %player%."
greeting-resale: "%region% может быть куплен за %resaleprice% у игрока %player%."
+552
View File
@@ -0,0 +1,552 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Swedish, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|Använd %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Använd %0%|%"
- " command: %0%"
region: "%lang:tRegion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Område %0%"
- " hover: %lang:action|Regions information|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
tPlayer:
- "[bold]%0%[/bold]"
- " hover: Spelare %0%"
- " hover: %lang:action|Regioner av %0%|%"
- " command: /areashop info player %0%"
landlord:
- "[bold]%landlord%[/bold]"
- " hover: Hyresvärd %landlord%"
- " hover: %lang:action|Regioner av %landlord%|%"
- " command: /areashop info player %landlord%"
total-maximum: "Du kan inte hyra/köpa mer än %0% region(er) totalt (Du har redan %1% inom grupp '%2%')."
general-notReady: "AreaShop har inte laddat klart, vänligen vänta."
general-noWorld: "Du kan inte göra detta. Världen: %lang:region% är inte tillgänglig (värld '%world%')"
general-noRegion: "Du kan inte göra så, WorldGuard regionen är inte tillgänglig (region %lang:region%)"
general-noEconomy: "Det finns inget tillägg för ekonomisystem installerat eller så är det inte inställt korrekt. Meddela serverns ägare om detta."
general-cancelled: "%0%"
cmd-notValid: "Kommandot är inte tillgängligt, använd '/as help' för mer information."
cmd-onlyByPlayer: "Detta kommando kan enbart köras av en spelare."
cmd-weOnlyByPlayer: "Användning av WorldEdit är enbart tillgängligt för en spelare, specifiera regionens namn som extra argument."
cmd-noSelection: "Du har ingen WorldEdit område valt."
cmd-noRegionsFound: "Inga regioner registrerade i AreaShop finns i ditt val."
cmd-noWERegionsFound: "Inga WorldEdit regioner som korsar ditt val finns."
cmd-noRegionsAtLocation: "Inga regioner finns på din plats, ange en region som argument."
cmd-moreRegionsAtLocation: "Mer än en region har hittats på din plats, ange en region som argument."
cmd-automaticRegionOnlyByPlayer: "Att automatiskt avgöra regionen är enbart möjligt för spelare, ange en region som argument."
help-header: "Hjälpsidan, kommandon som du kan utföra."
help-noPermission: "Du har inte behörighet för att visa hjälpsidan."
help-alias: "Kommando alias: /areashop, /as."
help-help: "%lang:helpCommand|/as help|% Visar denna hjälpsida."
help-info: "%lang:helpCommand|/as info|% Få information om aktuella regioner."
help-rent: "%lang:helpCommand|/as rent|% Hyr en region eller förlänga din nuvarande hyra."
help-buy: "%lang:helpCommand|/as buy|% Köp en region."
help-unrent: "%lang:helpCommand|/as unrent|% Sluta hyra en region."
help-sell: "%lang:helpCommand|/as sell|% sälj en region."
help-reload: "%lang:helpCommand|/as reload|% Ladda om alla filer och uppdatera regionerna."
help-setrestore: "%lang:helpCommand|/as setrestore|% Ställ in återställning på/av och välj profil."
help-setprice: "%lang:helpCommand|/as setprice|% Ändra priset av en region."
help-setduration: "%lang:helpCommand|/as setduration|% Ändra varaktigheten för en hyraregion."
help-teleport: "%lang:helpCommand|/as tp|% Teleportera till en hyr-/köpregion."
help-setteleport: "%lang:helpCommand|/as settp|% Sätt ut teleporteringsposition för en region."
help-find: "%lang:helpCommand|/as find|% Hitta en ledig köpa eller hyra."
help-groupadd: "%lang:helpCommand|/as groupadd|% Lägg till en region till en grupp."
help-groupdel: "%lang:helpCommand|/as groupdel|% Radera en region från en grupp."
help-grouplist: "%lang:helpCommand|/as grouplist|% Visa alla grupper som för närvarande är registrerade."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Visa information om en grupp."
help-schemevent: "%lang:helpCommand|/as schemevent|% Utlös en schematisk händelse för en region."
help-add: "%lang:helpCommand|/as add|% Registrera en region som hyra eller köpa."
help-del: "%lang:helpCommand|/as del|% Radera en registrerad region från AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Lägg till en skylt till en existerande region."
help-delsign: "%lang:helpCommand|/as delsign|% Radera skylten du ser på."
help-me: "%lang:helpCommand|/as me|% Se vilka områden du har (+expiration)."
help-setowner: "%lang:helpCommand|/as setowner|% Bestäm regionens ägare eller förläng hyran."
help-resell: "%lang:helpCommand|/as resell|% Sätt en region i återförsäljarläge."
help-stopResell: "%lang:helpCommand|/as stopresell|% Sätt tillbaka en region i sålt läge."
help-addFriend: "%lang:helpCommand|/as addfriend|% Lägg till en vän till en region."
help-delFriend: "%lang:helpCommand|/as delfriend|% Ta bort en vän från en region."
help-linksigns: "%lang:helpCommand|/as linksigns|% Använd länkningsläge med gruppskylt."
help-stack: "%lang:helpCommand|/as stack|% Skapa flera regioner och lägg till dem."
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Ange hyresvärden för en region."
rent-help: "/as rent [region], regionen du står i kommer användas om inget är angivet."
rent-noPermission: "Du har inte behörighet att hyra en region."
rent-maximum: "Du kan inte hyra mer än %0% region(er) (du har redan %1% i grupp '%2%')."
rent-maximumExtend: "Du kan inte förlänga den här hyran för du har redan fler än %0% region(er) (du har redan %1% i grupp '%2%')."
rent-payError: "Något gick fel med betalningen, försök igen senare."
rent-rented: "Du hyrde %lang:region% fram till %until%, du kan förlänga din hyrtid genom att högerklicka skylten igen eller genom att använda /as rent."
rent-extended: "Du kan förlänga ditt hyrande av %lang:region% fram till %until%."
rent-extendedToMax: "Du förlängde ditt hyrande av %lang:region% fram till %until% (vilket är den maximala hyrtiden på %maxrenttime%)."
rent-lowMoneyExtend: "Du har inte tillräckligt med pengar för att förlänga hyran (du har %0% och du behöver %price%)."
rent-lowMoneyRent: "Du har inte tillräckligt med pengar för att hyra %lang:region% (du har %0% och du behöver %price%)."
rent-someoneElse: "Någon annan har redan hyrt %lang:region%."
rent-notRentable: "Den här regionen är inte tillgänglig för att hyras."
rent-maxExtends: "Du kan inte förlänga den här hyran mer (maximalt är %maxextends% times), men efter att hyran är över kan du hyra %lang:region% igen."
rent-maxRentTime: "Du kan inte hyra %lang:region% mer tid i förväg, maximal tid är %maxrenttime% och du har för tillfället hyrt den i %timeleft%."
rent-restrictedToWorld: "Du måste vara i världen '%world%' för att hyra %lang:region% (du är i '%0%')."
rent-restrictedToRegion: "Du måste vara innanför %lang:region% för att hyra den."
rent-expireWarning: "Din region %lang:region% har %timeleft% kvar, se till att föränga den om du vill ha kvar den."
rent-alreadyAtFull: "%lang:region% Är redan på eller över den maximala tiden du får hyra, du kan inte förlänga den än."
buy-help: "/as buy [region], regionen du står i kommer användas om ingen annan specifieras."
buy-noPermission: "Du har inte rättigheterna att köpa en region."
buy-noPermissionResell: "Du har inte rättigheterna att köpa en region i återsäljnings läge."
buy-noPermissionNoResell: "Du har inte rättigheterna att köpa en region som inte är i återsäljnings läge."
buy-notBuyable: "Regionen %lang:region% är inte tillgänglig att köpas."
buy-maximum: "Du kan inte köpa fler än %0% region(er) (du har redan %1% i grupp '%2%')."
buy-payError: "Något gick fel med betalningen, försök igen senare."
buy-succes: "Du köpte %lang:region%."
buy-successResale: "Du köpte %lang:region% från %lang:tPlayer|%0%|%."
buy-successSeller: "Din region %lang:region% har blivit såld till %lang:player% för %0%."
buy-lowMoney: "Du har inte tillräckligt med pengar för att köpa %lang:region% (du har %0% och du behöver %price%)."
buy-lowMoneyResell: "Du har inte tillräckligt med pengar för att köpa %lang:region% (du har %0% och du behöver %resellprice%)."
buy-yours: "Du äger redan %lang:region%."
buy-someoneElse: "Någon annan har redan köpt %lang:region%."
buy-restrictedToWorld: "Du måste befinna dig i världen '%world%' för att köpa %lang:region% (du befinner dig i '%0%')."
buy-restrictedToRegion: "Du måste vara innanför %lang:region% för att köpa den."
unrent-help: "/as unrent [region], regionen du står i kommer användas om inget är angivet."
unrent-noPermission: "Du har inte rättigheterna för att säga upp hyran av en region."
unrent-noPermissionOther: "Du har inte rättigheterna för att säga upp hyran av en annan region."
unrent-notRegistered: "Hyran för den här regionen kan inte tas bort då den inte är registrerad för uthyrning."
unrent-notRented: "Hyran för den här regionen kan inte tas bort då den inte är hyrd."
unrent-unrented: "%lang:region% för %lang:player% har fått sin hyrning borttagen."
unrent-expired: "Din hyrning av %lang:region% har löpt ut."
sell-help: "/as sell [region], regionen du står i kommer användas om ingen annan specifieras."
sell-notRegistered: "Den här regionen kan inte säljas då den inte är registrerad för att köpas."
sell-notBought: "Regionen kan inte säljas för det är ingens egendom."
sell-sold: "%lang:region% för %lang:player% har sålts."
sell-noPermission: "Du har inte rättigheterna att sälja den här regionen."
sell-noPermissionOther: "Du har inte rättigheterna att sälja en annan region."
reload-reloading: "Laddat om alla filer, kollar nu hyror och uppdaterar regioner."
reload-updateStart: "[gray]Uppdaterar %0% regioner med %1% per sekund."
reload-updateComplete: "[gray]Uppdatering av regioner är klar."
reload-noPermission: "Du har inte rättigheterna för att ladda om konfigureringsfiler."
reload-updateCommandChanged: "'/as updaterents' och '/as updatebuys' har tagits bort, '/as reload' uppdaterar även regioner nu så använd det kommandot istället."
info-noPermission: "Du har inte rättigheterna för att få information om regionerna."
info-allHeader: "Alla regioner%0%:"
info-rentedHeader: "Hyrda regioner%0%:"
info-forrentHeader: "Regioner för uthyrning%0%:"
info-forsaleHeader: "Regioner till salu%0%:"
info-soldHeader: "Sålda regioner%0%:"
info-resellingHeader: "Regioner för återsäljning%0%:"
info-nogroupHeader: "Regioner utan grupp%0%:"
info-limitedToGroup: " (begränsade till grupp %0%)"
info-nogroupNone: "Det finns inga regioner utan grupp."
info-noFiltergroup: "Grupp '%0%' finns inte och kan därför inte användas för att begränsa reslutaten."
info-noRegions: "Inga regioner kunde hittas."
info-wrongPage: "%0% är inte ett korrekt sidonummer."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]Uthyres för %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Uthyrd till %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]Till salu för %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Såld till %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Såld till %lang:player% (återsäljer)."
info-pageStatus: "[gold]Sida %0%/%1%"
info-pagePrevious:
- " [gold][bold]◄Föregående[/bold] "
- " hover: %lang:action|Visar föregående sida|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Föregående[/bold] "
- " hover: Detta är redan första sidan"
info-pageNext:
- " [gold][bold]Nästa►[/bold]"
- " hover: %lang:action|Visar nästa sida|%"
- " command: %0%"
info-pageNoNext:
- " [darkgray][bold]Nästa►[/bold]"
- " hover: Detta är redan sista sidan"
info-playerHelp: "/as info player <namn>."
info-playerRents: "Regioner hyrda av %lang:tPlayer|%0%|%: [gray]%1%"
info-playerNoRents: "%lang:tPlayer|%0%|% har inte hyrt någon region."
info-playerBuys: "Regioner köpta av %lang:tPlayer|%0%|%: [gray]%1%."
info-playerNoBuys: "%lang:tPlayer|%0%|% har inte köpt någon region."
info-regionHelp: "/as info region [namn], regionen du står i kommer användas om ingen annan specifieras."
info-regionHeaderRent: "[darkgreen]Information om %lang:region%:"
info-regionHeaderBuy: "[darkgreen]Information om %lang:region%:"
info-regionRented: "[darkgreen][bold]►[reset] Hyrd av %lang:player% tills: [gray]%until%."
info-regionBought: "[darkgreen][bold]►[reset] Köpt av %lang:player%."
info-regionReselling: "[darkgreen][bold]►[reset] Köpt av %lang:player%, ute till återförsäljning."
info-regionExtending:
- "[darkgreen][bold]►[reset] "
- "[bold]Förläng för[/bold]"
- " hover: Förläng hyrning av %region%"
- " hover: med %duration% för %price%"
- " hover: %lang:action|Förläng hyrning av %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeRented:
- "[darkgreen][bold]►[reset] "
- "[bold]Hyra för[/bold]"
- " hover: Hyr %region% för %price% per %duration%"
- " hover: %lang:action|Hyr %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeBought:
- "[darkgreen][bold]►[reset] "
- "[bold]Köp för[/bold]"
- " hover: Köp %region% för %price%"
- " hover: %lang:action|Köp %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
info-regionReselPrice: "[darkgreen][bold]►[reset] Återsäljningspris: [gray]%resellprice% (du kan köpa den från %lang:player%)."
info-regionFriends: "[darkgreen][bold]►[reset] Tillagda vänner: [gray]%0%."
info-friend: "%lang:tPlayer|%0%|%"
info-friendRemove:
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Ta bort%0% som vän|%"
- " command: /areashop delfriend %0% %region%"
info-regionMoneyBackBuy: "[darkgreen][bold]►[reset] Försäljning återbetalning: [gray]%moneyback% (%moneybackpercent%% av priset)."
info-regionMoneyBackBuyClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Försäljning återbetalning[/bold]"
- " hover: Sälj %region% och få tillbaka %moneyback%"
- " hover: %lang:action|Sälj%region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av priset)."
info-regionMoneyBackRent: "[darkgreen][bold]►[reset] Avbruten hyras återbetalning: [gray]%moneyback% (%moneybackpercent%% av återstående tid)."
info-regionMoneyBackRentClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Avbruten hyras återbetalning[/bold]"
- " hover: Avbryt hyra %region% och få tillbaka %moneyback%"
- " hover: %lang:action|Avbryt hyra %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av återstående tid)."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Maximalt antal expansioner: [gray]%maxextends% time(s)."
info-regionNoExtending: "[darkgreen][bold]►[reset] Hyran kan inte förlängas."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Expansioner kvar: [gray]%extendsleft% time(s) utav %maxextends%."
info-regionMaxRentTime: "[darkgreen][bold]►[reset] Hyra i förväg: [gray]%maxrenttime% max."
info-prefix: "[darkgreen][bold]►[reset] "
info-regionTeleport:
- "[bold]Gå till regionen[/bold]"
- " hover: %lang:action|Teleportera till %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]sätt ut teleporteringsplats[/bold]"
- " hover: %region%"
- " hover: %lang:action|Sätt ut teleporteringsplats|%"
- " command: /areashop settp %region%"
info-regionSigns: "[darkgreen][bold]►[reset] Connected signs: [gray]%0%."
info-regionSignLocation: "[gray](%0%, %1%, %2%, %3%)[reset]"
info-regionGroups: "[darkgreen][bold]►[reset] Tilldelade grupper: [gray]%0%."
info-regionInactiveUnrent: "[darkgreen][bold]►[reset] Avsluta hyrning automatiskt efter: [gray]%inactivetime% av inaktivetet från spelaren."
info-regionInactiveSell: "[darkgreen][bold]►[reset] Sälj automatiskt efter: [gray]%inactivetime% av inaktivetet från spelaren."
info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Du måste befinna dig innanför %lang:region% för att hyra den."
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Du måste befinna dig i världen '%world%' för att hyra %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Du måste befinna dig innanför %lang:region% för att köpa den."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Du måste vara i världen '%world%' för att köpa %lang:region%."
info-regionLandlord: "[darkgreen][bold]►[reset] Hyresvärd: [gray]%lang:landlord% (mottager pengarna)."
info-regionNotExisting: "Den specifierade regionen är inte registrerad: %0%."
setrestore-help: "/as setrestore <region> <true|false|general> [profile]."
setrestore-noPermission: "Du har inte rättigheterna att ändra återställnings inställningarna."
setrestore-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
setrestore-invalidSetting: "'%0%' är inte ett giltigt tillstånd, bör vara true, false eller general."
setrestore-success: "Återställningsläget för %lang:region% inställt till '%0%'."
setrestore-successProfile: "Återställningsläget för %lang:region% inställt till '%0%' och profilen till '%1%'."
setprice-noPermission: "Du har inte rättigheterna för att ställa in priset på en region."
setprice-help: "/as setprice <price> [region], regionen du står i kommer användas om ingen annan specifieras."
setprice-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
setprice-wrongPrice: "'%0%' är inte ett giltigt pris."
setprice-successRent: "Priset på regionen %lang:region% ändrad till %price% per %duration%."
setprice-successBuy: "Priset på regionen %lang:region% ändrad till %price%."
setprice-successRemoved: "Priset på %lang:region% har tagits bort, Den kommer nu använda priset från en grupp i filen default.yml, nytt pris: %price%."
setprice-noLandlord: "Du har inte rättigheterna att ändra priset för du inte är hyresvärd av %lang:region%."
setduration-noPermission: "Du har inte rättigheterna att ändra tiden för en hyra."
setduration-help: "/as setduration <amount> <identifier> [region], regionen du står i kommer användas om inget annat specifieras."
setduration-notRegistered: "%0% är inte registrerad för uthyrning."
setduration-wrongAmount: "'%0%' är inte ett giltigt nummer, använd ett helt nummer."
setduration-wrongFormat: "'%0%' är inte ett giltigt tidsformat, kolla dokumentationen på bukkit."
setduration-success: "Varaktigheten av region %lang:region% ändrad till '%duration%'."
setduration-noLandlord: "Du har inte rättigheterna att ändra varaktigheten för du är inte hyresvärd av %lang:region%."
setduration-successRemoved: "Varaktigheten av %lang:region% har tagits bort, det kommer nu använda den varaktighet som finns i filen default.yml, ny varaktighet: %duration%."
setup-noRegion: "Du specifierade inte någon region på andra raden."
setup-alreadyRentSign: "Regionen du specifierade är redan tillagd till AreaShop som en hyr region, lägg till skyltat med [as] på första raden eller '/as addsign'."
setup-alreadyBuySign: "Regionen du specifierade är redan tillagd till AreaShop som en köp region, lägg till skyltat med [as] på första raden eller '/as addsign'."
setup-noDuration: "Du specifierade inte hur länge regionen kan hyras, gör detta på den tredje raden."
setup-wrongDuration: "Tiden som specifieras är inte i rätt format, exempel: 1 day."
setup-noPrice: "Du specifierade inte priset på fjärde raden."
setup-wrongPrice: "Du specifierade inte priset korrekt, använd bara siffror."
setup-rentSuccess: "Hyrning av region %lang:region% är inställt korrekt."
setup-buySuccess: "Köp av region %lang:region% är inställt korrekt."
setup-noPermissionRent: "Du har inte rättigheterna för att ställa in regioner att hyra."
setup-noPermissionBuy: "Du har inte rättigheterna för att ställa in regioner att köpa."
setup-couldNotDetect: "Hittade flera regioner med samma prioritet och/eller förälder/barn-relation, specifiera en på den andra raden (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
setup-blacklisted: "%0% är svartlistad och kan inte läggas till i AreaShop."
setup-noPermission: "Du kan inte lägga till regionen '%0%', du är inte ägare/medlem i den eller så saknar du rättigheterna för det."
destroy-noPermissionRent: "Du har inte rättigheterna för att avregistrera en hyrbar region."
destroy-noPermissionBuy: "Du har inte rättigheterna för att avregistrera en köpbar region."
destroy-successRent: "%lang:region% avregistrerades som hyrbar region."
destroy-successBuy: "%lang:region% avregistrerades som köpbar region."
teleport-help: "/as tp <region> [skylt]."
teleport-noRentOrBuy: "Den specifierade regionen är inte registrerad: %0%."
teleport-noPermission: "Du har inte rättigheterna för att teleportera dig till din region."
teleport-noPermissionOther: "Du har inte rättigheterna för att teleportera dig till regioner du inte äger."
teleport-noPermissionSign: "Du har inte rättigheterna för att teleportera dig till skylten i din region."
teleport-noPermissionOtherSign: "Du har inte rättigheterna för att teleportera dig till skylten i regioner du inte äger."
teleport-noPermissionFriend: "Du har inte rättigheterna för att teleportera dig till regioner du är tillagd i som vän."
teleport-noPermissionFriendSign: "Du har inte rättigheterna för att teleportera dig till skylten i regioner du är tillagd i som vän."
teleport-success: "Du teleporterade till %lang:region%."
teleport-successSign: "Du teleporterade till skylten i %lang:region%."
teleport-noSafe: "Ingen säker plats hittades %lang:region%, inga platser i regionen kvar eller maximalt försök överskreds (%0%/%1%)."
teleport-blocked: "Du kan inte teleportera dig då den positionen befinner sig utanför regionen och du måste teleportera dig innanför."
teleport-changedToSign: "Du har bara rättigheterna för att teleportera till skylten och inte innanför regionen, teleporterar till skylt."
teleport-changedToNoSign: "Ingen skylt tillgänglig att teleportera till, försöker teleportera innanför regionen istället."
setteleport-help: "/as settp [region] [reset], regionen du står i kommer andvändas om inget specifieras."
setteleport-noPermission: "Du har inte rättigheterna att sätta ut teleporteringsplatsen."
setteleport-noPermissionOther: "Du har inte rättigheterna för att sätta ut teleporteringsplatsen för en region du inte äger."
setteleport-noRentOrBuy: "Den specifierade regionen är inte registrerad: %0%."
setteleport-success: "Teleporteringsplats för %lang:region% utsatt."
setteleport-notInside: "Platsen måste vara innanför regionen."
setteleport-reset: "Teleporteringsplats för %lang:region% har återställts."
find-help: "/as find <buy|rent> [maxpris] [grupp]."
find-noPermission: "Du har inte rättigheterna för att söka på regioner och teleportera till dem."
find-success: "Hittade en %0% region: %lang:region%, när sökande med maxpris av ditt konto: %1%%2%."
find-successMax: "Hittade en %0% region: %lang:region%, när sökande med maxpris på %1%%2%."
find-wrongMaxPrice: "Det specifierade maxpriset är inte ett korrekt nummer: %0%."
find-wrongGroup: "Den specifierade gruppen finns inte: %0%."
find-noneFound: "Ingen %0% region hittades när sökande med maxpris av ditt konto: %1%%2%."
find-noneFoundMax: "Ingen %0% region hittades när sökande med maxpris på %1%%2%."
find-onlyInGroup: ", sökte endast efter regioner i gruppen: %0%."
groupadd-help: "/as groupadd <group> [region], om ingen region är specifierad används alla regioner från din WorldEdit markering."
groupadd-noPermission: "Du har inte rättigheterna för att lägga till regioner i grupper."
groupadd-success: "Region %lang:region% har lagts till i grupp '%0%', den här gruppen har nu %1% medlem(mar)."
groupadd-failed: "Region %lang:region% är redan medlem i gruppen '%0%'."
groupadd-weSuccess: "Tillagd i grupp %0%: [gray]%1%."
groupadd-weFailed: "Var redan i grupp %0%: [gray]%1%."
groupdel-help: "/as groupdel <group> [region], Om inget område är specifierat används alla områden från ditt WorldEdit val."
groupdel-noPermission: "Du har inte rättigheterna att ta bort regioner från grupper."
groupdel-success: "Regionen %lang:region% har tagits bort från gruppen '%0%', den här gruppen har nu %1% medlem(mar)."
groupdel-failed: "Regionen %lang:region% är inte medlem i någon grupp '%0%'."
groupdel-weSuccess: "Borttagen från gruppen %0%: [gray]%1%."
groupdel-weFailed: "Var inte i någon grupp %0% ändå: [gray]%1%."
grouplist-noPermission: "Du har inte rättigheterna att visa registrerade grupper."
grouplist-noGroups: "Det finns för närvarande inga grupper registrerade."
grouplist-success: "Följande grupper är registrerade: [gray]%0%."
groupinfo-help: "/as groupinfo <grupp>."
groupinfo-noPermission: "Du har inte rättigheterna att visa information om en grupp."
groupinfo-noGroup: "Det finns ingen grupp registrerad med namnet '%0%', använd /as grouplist för att kolla grupper."
groupinfo-members: "Följande regioner är medlemmar i gruppen %0%: [gray]%1%."
groupinfo-noMembers: "Gruppen %0% har inga medlemmar."
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
schemevent-wrongEvent: "Det specifierade eventet '%0%' existerar inte, använd ett av följande: [gray]%1%."
schemevent-success: "Eventet '%0%' har blivit triggat för regionen %lang:region%."
schemevent-noPermission: "Du har inte rättigheterna för att trigga ett schematiskt event."
add-help: "/as add <rent|buy> [region] [värld]."
add-noPermission: "Du har inte rättigheterna att lägga till regioner i AreaShop."
add-success: "Tillagd som %0%: [gray]%1%."
add-failed: "Redan registrerad: [gray]%0%."
add-blacklisted: "På svartlistan: [gray]%0%."
add-specifyWorld: "Specifiera världen för regionen när consolen används."
add-incorrectWorld: "Värld '%0%' hittades inte, Försök igen (skiftlägeskänsligt)."
add-noPermissionRegions: "Saknar rättighet att lägga till: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Du är antingen inte medlem/ägare av dessa regioner eller så saknar du rättigheterna att lägga till dina regioner."
del-noPermission: "Du har inte rättigheterna att ta bort regioner."
del-success: "Borttagna regioner: [gray]%0%."
del-failed: "Ingen rättighet att ta bort eller inte registrerad: [gray]%0%."
addsign-help: "/as addsign [region] [profil]."
addsign-noSign: "Du tittar inte på en skylt."
addsign-noRegions: "Ingen region hittades runt skyltens position."
addsign-couldNotDetect: "Hittade flera regioner runt skylten, specifiera regionen med et extra argument (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
addsign-couldNotDetectSign: "Hittade flera regioner runt skylten, specifiera regionen på andra raden (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
addsign-wrongProfile: "Den specifierade profilen existerar inte, använd ett av följande (kolla konfig): [gray]%0%."
addsign-profile:
- "[bold]%0%[/bold]"
- " hover: Skyltprofil %0%"
- " hover: %lang:action|Använd denna profil|%"
- " Kommando: /areashop linksigns %0%"
addsign-success: "Skylten har lagts till i %lang:region%."
addsign-successProfile: "Skylten har lagts till i %lang:region% med profil %0%."
addsign-alreadyRegistered: "Den skylten är redan registrerad för %lang:region%."
addsign-noPermission: "Du har inte rättigheterna för att lägga till en skylt."
delsign-noSign: "Du tittar inte på en skylt."
delsign-noPermission: "Du har inte rättigheterna att ta bort en skylt."
delsign-noRegion: "Den skylten tillhör inte en AreaShop region."
delsign-success: "Skylten har tagits bort från regionen %lang:region%."
me-noPermission: "Du har inte rättigheterna att kolla vilka regioner du har."
me-header: "Regioner för %lang:tPlayer|%0%|%:"
me-notAPlayer: "Du är inte en spelare så du kan inte ha någon region."
me-rentLine:
- "[darkgreen][bold]►[nollställ] %lang:region% [gray]("
- "%timeleft% kvar"
- " hover: tills %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[nollställ] %lang:region%."
me-friendLine:
- "[darkgreen][bold]►[nollställ] %lang:region% [gray]("
- "ägd av %lang:player%"
- " hover: Du är tillagd som vän"
- ")."
me-nothing: "%lang:tPlayer|%0%|% har inte hyrt eller köpt någon region och är inte tillagd som vän i någon."
me-noPlayer: "%0% hittades inte, antagligen aldrig varit på servern."
me-clickHint: "[gray][italic]Klicka en regions namn för att se detaljer."
setowner-help: "/as setowner <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
setowner-noPermission: "Du har inte rättigheterna att bestämma ägare av en region."
setowner-noPermissionRent: "Du har inte rättigheterna att bestämma ägare av hyrda regioner."
setowner-noPermissionBuy: "Du har inte rättigheterna att bestämma ägare av köpta regioner."
setowner-notRegistered: "Den specifierade regionen är inte registrerad, ägare kan inte bestämmas."
setowner-noPlayer: "Kunde inte få fram UUID ab specifierad spelare: %0%."
setowner-succesRent: "Ägare av %lang:region% har ändrats till %lang:player%, hyrd till %until% (%timeleft% kvar)."
setowner-succesRentExtend: "Ägaren var redan %lang:player%, hyrtid utökad med '%duration%', hyrs nu till %until% (%timeleft% kvar)."
setowner-succesBuy: "Ägare av %lang:region% ändrad till %lang:player%."
resell-help: "/as resell <pris> [region], regionen du står i kommer användas om inte annan specifieras."
resell-wrongPrice: "'%0%' är inte ett giltigt pris."
resell-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
resell-notBought: "Du kan inte återsälja %lang:region% för den är inte såld än."
resell-success: "%lang:region% är satt till återsäljning för %resellprice%."
resell-noPermission: "Du har inte rättigheterna att sätta ut din region i återsäljningsläge."
resell-noPermissionOther: "Du har inte rättigheterna att sätta ut regioner i återsäljningsläge."
stopresell-help: "/as stopresell [region], regionen du står i kommer användas om inget annat specifieras."
stopresell-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
stopresell-notResell: "Du kan inte avsluta en återsäljning av %lang:region% för den är inte i återsäljningsläge."
stopresell-success: "%lang:region% är återsatt i sålt läge."
stopresell-noPermission: "Du har inte rättigheterna att ändra tillbaka din region till sålt läge."
stopresell-noPermissionOther: "Du har inte rättigheterna att ändra tillbaka regioner till sålt läge."
addfriend-help: "/as addfriend <spelare> [region], regionen du står i kommer användas om ingen annan specifieras."
addfriend-noPermissionOther: "Du har inte rättigheterna att lägga till vänner i regioner som inte tillhör dig."
addfriend-noPermission: "Du har inte rättigheterna att lägga till vänner i dina regioner."
addfriend-successOther: "%lang:tPlayer|%0%|% har lagts till som vän i region %lang:region%."
addfriend-success: "%lang:tPlayer|%0%|% har lagts till som vän i din region %lang:region%."
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% är redan tillagd som vän i %lang:region%."
addfriend-self: "Att lägga till en ägare av en region som vän vore meningslöst."
addfriend-noOwner: "Du kan inte lägga till vänner till en region som saknar ägare."
addfriend-notVisited: "Du kan inte lägga till %0% för han har inte besökt servern ännu."
delfriend-help: "/as delfriend <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
delfriend-noPermissionOther: "Du har inte rättigheterna att ta bort vänner från regioner som inte tillhör dig."
delfriend-noPermission: "Du har inte rättigheterna att ta bort vänner från din region."
delfriend-successOther: "%lang:tPlayer|%0%|% har tagits bort som vän från region %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% har tagits bort som vän från din region %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% är inte tillagd som vän i %lang:region%."
delfriend-noOwner: "Du kan inte ta bort en vän från en region som saknar ägare."
linksigns-multipleRegions: "Hittade flera regioner: [gray]%0%."
linksigns-multipleRegionsAdvice: "Klicka en annan gång för att försöka igen eller använd '/as linksigns' för att sluta."
linksigns-noRegions: "Hittade ingen AreaShop region åt det hållet din markör pekar, försäkra att regionen är tillagd i AreaShop [gray](maximalt avstånd 100 block)."
linksigns-regionFound: "Region %lang:region% har hittats, sikta mot en skylt och vänsterklicka för att länka den."
linksigns-signFound: "Hittade en skylt vid (%0%, %1%, %2%), sikta mot en region nu och högerklicka för att länka den."
linksigns-noSign: "Ingen skylt hittades åt det hållet din markering är vänd, försäkra dig att du har fri sikt mot en skylt och klicka igen [gray](maximalt avstånd 100 block)."
linksigns-alreadyRegistered: "Den skylten är redan registrerad för region %lang:region%, klicka igen för att välja en annan skylt."
linksigns-first: "Du har gått in i skylt-länknings läge."
linksigns-next: "[gray]Vänsterklicka för att välja en skylt, högerklicka för att välja en region, använd /as linksigns för att avsluta."
linksigns-noPermission: "Du har inte rättigheterna för att gå in i mass-länknings läge."
linksigns-stopped: "Avslutade skylt-länknings läge."
stack-help:
- "/as stack <mängd> <mellanrum> <namn> <rent|buy> [grupp].[break]"
- " [gray]<mängd> Antal regioner som kommer skapas.[break]"
- " [gray]<mellanrum> Avstånd i antal block mellan regionerna.[break]"
- " [gray]<namn> Namnet på regionerna (numrering kommer hamna efter det).[break]"
- " [gray]<rent|buy> Skapa hyr- eller köpregioner.[break]"
- " [gray][group] En grupp att lägga till de skapade regionerna i.[break]"
- " [gray]Regionerna kommer skapas åt det håll du är vänd åt."
stack-accepted: "Börjar skapa %0% %1% regioner med %2% block iemellan, namnen startar med %3% och har ett nummer efter sig.%4%"
stack-addToGroup: " Skapade regioner kommer läggas till i gruppen '%0%'."
stack-noPermission: "Du har inte rättigheterna att skapa och lägga till regioner i AreaShop i massläge."
stack-wrongAmount: "'%0%' är inte ett correct antal regioner."
stack-wrongGap: "'%0%' är inte ett correct nummer för antalet blocks mellanrum mellan regioner."
stack-noSelection: "Du har ingenting valt som visar var första regionen ska skapas."
stack-addStart: "[gray]Lägger till %0% regioner vid %1% per sekund."
setlandlord-help: "/as setlandlord <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
setlandlord-noPermission: "Du har inte rättigheterna att bestämma en hyresvärd för en region."
setlandlord-success: "%lang:landlord% har satts in som hyresvärd för %lang:region%."
message-help: "/as message <spelare> <meddelande...>"
message-noPermission: "Du har inte rättigheterna för att skicka AreaShop meddelanden."
message-notOnline: "%0% är inte online."
confirm-rent:
- "%lang:prefix%Är du säker på att du vill hyra %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att hyra %0%|%"
- " hover: %lang:action|Rent %0%|%"
- " command: /areashop rent %0%"
confirm-extend:
- "%lang:prefix%Är du säker på att du vill förlänga %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att förlänga %0%|%"
- " hover: %lang:action|Extend %0%|%"
- " command: /areashop rent %0%"
confirm-unrent:
- "%lang:prefix%Är du säker på att du vill sluta hyra %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att sluta hyra %0%|%"
- " hover: %lang:action|Stop renting %0%|%"
- " command: /areashop unrent %0%"
confirm-buy:
- "%lang:prefix%Är du säker på att du vill köpa %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att köpa %0%|%"
- " hover: %lang:action|Buy %0%|%"
- " command: /areashop buy %0%"
confirm-sell:
- "%lang:prefix%Är du säker på att du vill sälja %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att sälja %0%|%"
- " hover: %lang:action|Sell %0%|%"
- " command: /areashop sell %0%"
timeleft-years: "%0% år"
timeleft-months: "%0% månader"
timeleft-days: "%0% dagar"
timeleft-hours: "%0% timmar"
timeleft-minutes: "%0% minuter"
timeleft-second: "%0% sekund"
timeleft-seconds: "%0% sekunder"
timeleft-ended: "Utgånget"
greeting-forrent: "%region% kan hyras för %price% per %duration%."
greeting-rented: "%region% hyrs av %player% fram till %until%."
greeting-forsale: "%region% kan köpas för %price%."
greeting-bought: "%region% är köpt av %player%."
greeting-resale: "%region% kan köpas för %resaleprice% av %player%."
+6
View File
@@ -162,6 +162,12 @@ permissions:
areashop.teleportfriendsign:
description: Teleport to the sign of regions where you are added as friend
default: true
areashop.teleportavailable:
description: Teleport to regions which are available
default: true
areashop.teleportavailablesign:
description: Teleport to the sign of regions which are available
default: true
areashop.setteleport:
description: Set the teleport spot for your region
default: true
@@ -7,7 +7,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
import java.util.logging.Logger;
public interface AreaShopInterface {
void debugI(String message);
void debugI(Object... message);
YamlConfiguration getConfig();
WorldGuardPlugin getWorldGuard();
WorldEditPlugin getWorldEdit();
+4
View File
@@ -71,6 +71,10 @@ Old video for AreaShop v1.0: [Tutorial by VariationVault](https://www.youtube.co
* [Vault](http://dev.bukkit.org/bukkit-plugins/vault/): 1.4.1 or higher
* An economy plugin supported by Vault (check the [Vault page](http://dev.bukkit.org/bukkit-plugins/vault/) for a list of these)
### Extension plugins
Do you know a plugin that is nice to use with AreaShop? Let me know.
* [[Premium] Shop - a simple, intuitive shop plugin](https://www.spigotmc.org/resources/shop-a-simple-intuitive-shop-plugin.9628/updates): Let players buy and sell items from other players in or outside an AreaShop region, if restoring from schematic is enabled in AreaShop Shops will removed correctly.
### Metrics
This plugin utilizes Hidendra's plugin metrics system, which means that the following information is collected and sent to mcstats.org:
+1 -1
View File
@@ -16,7 +16,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version>
<version>1.8-R0.1-SNAPSHOT</version>
<type>jar</type>
<optional>true</optional>
</dependency>
@@ -41,11 +41,9 @@ public class WorldEditHandler5 extends WorldEditInterface {
}
clipBoard.place(editSession, origin, false);
} catch(MaxChangedBlocksException e) {
pluginInterface.getLogger().warning("Exeeded the block limit while restoring schematic of " + regionInterface.getName());
pluginInterface.getLogger().warning("Exeeded the block limit while restoring schematic of "+regionInterface.getName()+", limit in exception: "+e.getBlockLimit()+", limit passed by AreaShop: "+pluginInterface.getConfig().getInt("maximumBlocks"));
result = false;
} catch(DataException e) {
otherException = e;
} catch(IOException e) {
} catch(DataException|IOException e) {
otherException = e;
}
if(otherException != null) {
@@ -72,9 +70,7 @@ public class WorldEditHandler5 extends WorldEditInterface {
Exception otherException = null;
try {
SchematicFormat.MCEDIT.save(clipboard, file);
} catch (DataException e) {
otherException = e;
} catch (IOException e) {
} catch(DataException|IOException e) {
otherException = e;
}
if(otherException != null) {
+1 -1
View File
@@ -16,7 +16,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version>
<version>1.8-R0.1-SNAPSHOT</version>
<type>jar</type>
<optional>true</optional>
</dependency>
@@ -74,7 +74,7 @@ public class WorldEditHandler6 extends WorldEditInterface {
.build();
Operations.completeLegacy(operation);
} catch (MaxChangedBlocksException e) {
pluginInterface.getLogger().warning("Exeeded the block limit while restoring schematic of " + regionInterface.getName());
pluginInterface.getLogger().warning("Exeeded the block limit while restoring schematic of "+regionInterface.getName()+", limit in exception: "+e.getBlockLimit()+", limit passed by AreaShop: "+pluginInterface.getConfig().getInt("maximumBlocks"));
return false;
} catch (IOException e) {
pluginInterface.getLogger().warning("An error occured while restoring schematic of " + regionInterface.getName() + ", enable debug to see the complete stacktrace");
@@ -108,8 +108,8 @@ public class WorldEditHandler6 extends WorldEditInterface {
ForwardExtentCopy copy = new ForwardExtentCopy(editSession, new CuboidRegion(world, regionInterface.getRegion().getMinimumPoint(), regionInterface.getRegion().getMaximumPoint()), clipboard, regionInterface.getRegion().getMinimumPoint());
try {
Operations.completeLegacy(copy);
} catch (MaxChangedBlocksException e1) {
pluginInterface.getLogger().warning("Exeeded the block limit while saving schematic of " + regionInterface.getName());
} catch(MaxChangedBlocksException e) {
pluginInterface.getLogger().warning("Exeeded the block limit while saving schematic of "+regionInterface.getName()+", limit in exception: "+e.getBlockLimit()+", limit passed by AreaShop: "+pluginInterface.getConfig().getInt("maximumBlocks"));
return false;
}
Closer closer = Closer.create();
+1 -1
View File
@@ -16,7 +16,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version>
<version>1.8-R0.1-SNAPSHOT</version>
<type>jar</type>
<optional>true</optional>
</dependency>
+1 -1
View File
@@ -16,7 +16,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version>
<version>1.8-R0.1-SNAPSHOT</version>
<type>jar</type>
<optional>true</optional>
</dependency>
+1 -1
View File
@@ -16,7 +16,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version>
<version>1.8-R0.1-SNAPSHOT</version>
<type>jar</type>
<optional>true</optional>
</dependency>
+2 -2
View File
@@ -10,8 +10,8 @@
<repositories>
<repository>
<id>bukkit-repo</id>
<url>http://repo.bukkit.org/content/groups/public</url>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sk89q-repo-wg</id>