Compare commits

..
45 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
Thijs Wiefferink 064b129205 Change version to 2.3.2 and update languages
- Russian has been added
- Spelling errors in French have been corrected
2016-08-07 22:21:57 +02:00
Thijs Wiefferink 8111387f32 Improve friend line of /as me, add click hint
Change blue color of hover popup to gold, which will be used as action color
2016-08-07 22:06:09 +02:00
Thijs Wiefferink a4b23bebba Improve line of rented regions in info command 2016-08-07 21:49:44 +02:00
Thijs Wiefferink 7421e685fa Improve robustness of variable replacing in messages
- Once the limit is reached the argument replacer would still continue sometimes (if a the replacement itself triggers the limit and the inserted message increases the size of the message we are building and adds a parameter tag again, like %0%)
- The language tag replacer also stops earlier now, it did not have the above problem though
- Fixed FancyMessageFormat.insertMessage() not checking its parameters
- Message.get() with a limit will now return an empty message if the limit is reached to prevent problems like above.
- Closes #205
2016-08-07 00:09:30 +02:00
Christoph Krüger @Androkai 374b68d8fa Update VaultAPI-repo (#206)
The url of the Vault Maven repository has changed.
2016-08-06 22:36:26 +02:00
Thijs Wiefferink ca7a9664f3 Fix error in info command of rental region 2016-08-02 22:27:55 +02:00
Thijs Wiefferink e957b4fc73 Remove all reflection for sending fancy messages
- Reflection removed
- JSON is now fully escaped instead of lenient escaping
- Sending is now done with /tellraw
2016-08-01 21:31:14 +02:00
Thijs Wiefferink 6493bc4f78 Add empty lines if a page does not fill the screen
Relevant for commands like `/as info all` that can have pages
2016-08-01 21:28:11 +02:00
Thijs Wiefferink 2db1b6a243 Prevent updater throwing errors sometimes when BukkitDev is offline 2016-08-01 20:46:40 +02:00
Thijs Wiefferink 864662a3c4 Add javadocs to limitgroup inner class and setting methods 2016-08-01 20:23:49 +02:00
69 changed files with 2795 additions and 1883 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.1</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]);
}
@@ -42,7 +42,8 @@ public class InfoCommand extends CommandAreaShop {
* @param baseCommand The command to execute for next/previous page
*/
private void showSortedPagedList(CommandSender sender, List<? extends GeneralRegion> regions, RegionGroup filterGroup, String keyHeader, String pageInput, String baseCommand) {
int ITEMS_PER_PAGE = 18;
int MAX_ITEMS = 20;
int ITEMS_PER_PAGE = MAX_ITEMS-2;
int page = 1;
if(pageInput != null && Utils.isNumeric(pageInput)) {
try {
@@ -76,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());
}
@@ -88,6 +89,7 @@ public class InfoCommand extends CommandAreaShop {
totalPages = 1;
}
page = Math.max(1, Math.min(totalPages, page));
int linesPrinted = 1; // header
for(int i = (page-1)*ITEMS_PER_PAGE; i < page*ITEMS_PER_PAGE && i < regions.size(); i++) {
String state;
GeneralRegion region = regions.get(i);
@@ -107,8 +109,9 @@ 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)));
@@ -127,6 +130,10 @@ public class InfoCommand extends CommandAreaShop {
} else {
footer.append(Message.fromKey("info-pageNoNext"));
}
// Fill up space if the page is not full (aligns header nicely)
for(int i = linesPrinted; i < MAX_ITEMS-1; i++) {
sender.sendMessage(" ");
}
footer.send(sender);
long end = Calendar.getInstance().getTimeInMillis();
}
@@ -291,7 +298,7 @@ public class InfoCommand extends CommandAreaShop {
plugin.messageNoPrefix(sender, "info-regionRented", rent);
plugin.messageNoPrefix(sender, "info-regionExtending", rent);
// Money back
if(UnrentCommand.canUse(sender, buy)) {
if(UnrentCommand.canUse(sender, rent)) {
plugin.messageNoPrefix(sender, "info-regionMoneyBackRentClick", rent);
} else {
plugin.messageNoPrefix(sender, "info-regionMoneyBackRent", rent);
@@ -358,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()) {
@@ -437,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 {
@@ -101,11 +104,20 @@ public class MeCommand extends CommandAreaShop {
if(!foundSome) {
plugin.message(sender, "me-nothing", player.getName());
} else {
plugin.messageNoPrefix(sender, "me-clickHint");
}
}
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;
}
/**
@@ -664,8 +664,8 @@ public class Updater {
return true;
} catch (final IOException e) {
if (e.getMessage().contains("HTTP response code: 403")) {
this.plugin.getLogger().severe("dev.bukkit.org rejected the API key provided in plugins/Updater/config.yml");
if(e.getMessage() != null && e.getMessage().contains("HTTP response code: 403")) {
this.plugin.getLogger().severe("dev.bukkit.org rejected the API key provided in plugins/Updater/config.yml");
this.plugin.getLogger().severe("Please double-check your configuration to ensure it is correct.");
this.result = UpdateResult.FAIL_APIKEY;
} else {
@@ -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);
@@ -1,108 +0,0 @@
package me.wiefferink.areashop.messages;
import org.apache.commons.lang.Validate;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
/**
* Class made by glan3b (Github: https://github.com/glen3b) for the Fanciful project (Github: https://github.com/mkremins/fanciful)
*/
/**
* Represents a wrapper around an array class of an arbitrary reference type,
* which properly implements "value" hash code and equality functions.
* <p>
* This class is intended for use as a key to a map.
* </p>
* @param <E> The type of elements in the array.
* @author Glen Husman
* @see Arrays
*/
public final class ArrayWrapper<E> {
/**
* Creates an array wrapper with some elements.
* @param elements The elements of the array.
*/
public ArrayWrapper(E... elements) {
setArray(elements);
}
private E[] _array;
/**
* Retrieves a reference to the wrapped array instance.
* @return The array wrapped by this instance.
*/
public E[] getArray() {
return _array;
}
/**
* Set this wrapper to wrap a new array instance.
* @param array The new wrapped array.
*/
public void setArray(E[] array) {
Validate.notNull(array, "The array must not be null.");
_array = array;
}
/**
* Determines if this object has a value equivalent to another object.
* @see Arrays#equals(Object[], Object[])
*/
@SuppressWarnings("rawtypes")
@Override
public boolean equals(Object other) {
if(!(other instanceof ArrayWrapper)) {
return false;
}
return Arrays.equals(_array, ((ArrayWrapper)other)._array);
}
/**
* Gets the hash code represented by this objects value.
* @return This object's hash code.
* @see Arrays#hashCode(Object[])
*/
@Override
public int hashCode() {
return Arrays.hashCode(_array);
}
/**
* Converts an iterable element collection to an array of elements.
* The iteration order of the specified object will be used as the array element order.
* @param list The iterable of objects which will be converted to an array.
* @param c The type of the elements of the array.
* @param <T> The type
* @return An array of elements in the specified iterable.
*/
@SuppressWarnings("unchecked")
public static <T> T[] toArray(Iterable<? extends T> list, Class<T> c) {
int size = -1;
if(list instanceof Collection<?>) {
@SuppressWarnings("rawtypes")
Collection coll = (Collection)list;
size = coll.size();
}
if(size < 0) {
size = 0;
// Ugly hack: Count it ourselves
for(@SuppressWarnings("unused") T element : list) {
size++;
}
}
T[] result = (T[])Array.newInstance(c, size);
int i = 0;
for(T element : list) { // Assumes iteration order is consistent
result[i++] = element; // Assign array element at index THEN increment counter
}
return result;
}
}
@@ -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,25 +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();
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("]}");
}
return sb.toString();
return result;
}
@@ -134,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();
}
@@ -149,7 +165,14 @@ public class FancyMessageFormat {
* @param end The end of the variable to replace
*/
public static void insertMessage(List<String> message, List<String> insert, int line, int start, int end) {
if(insert == null || line < 0 || line >= message.size() || start < 0 || end < 0) {
return;
}
String lineContent = message.remove(line);
if(start > lineContent.length() || end > lineContent.length()) {
message.add(line, lineContent); // Repair damage
return;
}
if(isTaggedInteractive(lineContent)) {
lineContent = lineContent.replace("", "");
message.add(line, lineContent.substring(0, start)+convertToConsole(insert)+lineContent.substring(end));
@@ -255,7 +278,6 @@ public class FancyMessageFormat {
if(isTextLine || isHoverLine) {
// Parse inline tags
Color currentLineColor = currentColor;
Set<FormatType> currentLineFormatting = currentFormatting;
LinkedList<TextMessagePart> targetList = messagePart.content;
@@ -288,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);
@@ -307,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();
@@ -321,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;
}
@@ -337,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;
@@ -442,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('"');
@@ -498,7 +525,7 @@ public class FancyMessageFormat {
}
}
sb.append('"');
return sb.toString();
return sb;
}
@@ -530,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);
@@ -546,27 +573,28 @@ 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);
sb.append(",\"color\":\"").append(color.jsonValue).append("\"");
}
for(FormatType formatting : formatTypes) {
sb.append(',');
sb.append(formatting.jsonKey).append(':');
sb.append(",\"");
sb.append(formatting.jsonKey).append("\":");
sb.append("true");
}
sb.append('}');
return sb.toString();
return sb;
}
boolean hasFormatting() {
@@ -586,6 +614,7 @@ public class FancyMessageFormat {
private static class InteractiveMessagePart {
LinkedList<TextMessagePart> content = new LinkedList<>();
boolean newline = false;
// Click
ClickType clickType = null;
@@ -596,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:[");
sb.append("\"text\":\"\",\"extra\":[");
for(TextMessagePart textPart : content) {
sb.append(textPart.toJSON());
textPart.toJSON(sb);
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
@@ -629,27 +663,28 @@ public class FancyMessageFormat {
}
if(clickType != null) {
sb.append(',');
sb.append("clickEvent:{");
sb.append("action:").append(clickType.getJsonKey()).append(',');
sb.append("value:").append(quoteStringJson(clickContent));
sb.append("\"clickEvent\":{");
sb.append("\"action\":\"").append(clickType.getJsonKey()).append("\",");
sb.append("\"value\":");
quoteStringJson(clickContent, sb);
sb.append('}');
}
if(hoverType != null) {
sb.append(',');
sb.append("hoverEvent:{");
sb.append("action:").append(hoverType.getJsonKey()).append(',');
sb.append("value:");
sb.append("\"hoverEvent\":{");
sb.append("\"action\":\"").append(hoverType.getJsonKey()).append("\",");
sb.append("\"value\":");
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);
@@ -658,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+")";
}
}
@@ -1,100 +0,0 @@
package me.wiefferink.areashop.messages;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.lang.reflect.*;
import java.util.logging.Level;
/**
* Methods written by the Fanciful project (Github: https://github.com/mkremins/fanciful)
*/
public class FancyMessageSender {
private static Constructor<?> nmsPacketPlayOutChatConstructor;
public static boolean sendJSON(Player player, String jsonString) {
try {
Object handle = Reflection.getHandle(player);
Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle);
Reflection.getMethod(connection.getClass(), "sendPacket", Reflection.getNMSClass("Packet")).invoke(connection, createChatPacket(jsonString));
return true;
} catch(IllegalArgumentException e) {
Bukkit.getLogger().log(Level.WARNING, "Argument could not be passed.", e);
} catch(IllegalAccessException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not access method.", e);
} catch(InstantiationException e) {
Bukkit.getLogger().log(Level.WARNING, "Underlying class is abstract.", e);
} catch(InvocationTargetException e) {
Bukkit.getLogger().log(Level.WARNING, "A error has occured durring invoking of method.", e);
} catch(NoSuchMethodException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not find method.", e);
} catch(ClassNotFoundException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not find class.", e);
}
return false;
}
// The ChatSerializer's instance of Gson
private static Object nmsChatSerializerGsonInstance;
private static Method fromJsonMethod;
private static Object createChatPacket(String json) throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
if(nmsChatSerializerGsonInstance == null) {
// Find the field and its value, completely bypassing obfuscation
Class<?> chatSerializerClazz;
String version = Reflection.getVersion();
if(version == null || version.length() < 2) {
throw new RuntimeException("Could not get NMS version, found: "+version);
}
version = version.substring(1, version.length()-1); // Strip v and the . at the end
String[] parts = version.split("_");
if(parts.length < 3) {
throw new RuntimeException("Not enough parts in the version, found: "+version);
}
int majorVersion = Integer.parseInt(parts[0]);
int minorVersion = Integer.parseInt(parts[1]);
int revision = Integer.parseInt(parts[2].substring(1));
if((majorVersion <= 1 && minorVersion < 8) || (majorVersion == 1 && minorVersion == 8 && revision == 1)) {
chatSerializerClazz = Reflection.getNMSClass("ChatSerializer");
} else {
chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer");
}
if(chatSerializerClazz == null) {
throw new ClassNotFoundException("Can't find the ChatSerializer class");
}
for(Field declaredField : chatSerializerClazz.getDeclaredFields()) {
if(Modifier.isFinal(declaredField.getModifiers()) && Modifier.isStatic(declaredField.getModifiers()) && declaredField.getType().getName().endsWith("Gson")) {
// We've found our field
declaredField.setAccessible(true);
nmsChatSerializerGsonInstance = declaredField.get(null);
fromJsonMethod = nmsChatSerializerGsonInstance.getClass().getMethod("fromJson", String.class, Class.class);
break;
}
}
}
// Since the method is so simple, and all the obfuscated methods have the same name, it's easier to reimplement 'IChatBaseComponent a(String)' than to reflectively call it
// Of course, the implementation may change, but fuzzy matches might break with signature changes
Object serializedChatComponent = fromJsonMethod.invoke(nmsChatSerializerGsonInstance, json, Reflection.getNMSClass("IChatBaseComponent"));
if(nmsPacketPlayOutChatConstructor == null) {
try {
nmsPacketPlayOutChatConstructor = Reflection.getNMSClass("PacketPlayOutChat").getDeclaredConstructor(Reflection.getNMSClass("IChatBaseComponent"));
nmsPacketPlayOutChatConstructor.setAccessible(true);
} catch(NoSuchMethodException e) {
Bukkit.getLogger().log(Level.SEVERE, "Could not find Minecraft method or constructor.", e);
} catch(SecurityException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not access constructor.", e);
}
}
return nmsPacketPlayOutChatConstructor.newInstance(serializedChatComponent);
}
}
@@ -10,7 +10,7 @@ import java.util.*;
public class LanguageManager {
private AreaShop plugin = null;
private String languages[] = {"EN", "NL", "FR", "DE", "NO"};
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,9 @@ 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;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -26,6 +28,7 @@ public class Message {
private List<String> message;
private Object[] replacements;
private String key = null;
private boolean doLanguageReplacements = true;
/**
* Internal use only
@@ -38,7 +41,7 @@ public class Message {
* Empty message object
* @return this
*/
public static Message none() {
public static Message empty() {
return new Message();
}
@@ -74,7 +77,7 @@ public class Message {
* @return Message as a list
*/
public List<String> get() {
executeReplacements();
doReplacements();
return message;
}
@@ -84,10 +87,22 @@ public class Message {
* @return Message as a list
*/
private List<String> get(Limit limit) {
executeReplacements(limit);
if(limit.reached()) {
return new ArrayList<>();
}
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
@@ -96,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);
}
@@ -163,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)
@@ -172,22 +204,26 @@ 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 = FancyMessageSender.sendJSON((Player)target, 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));
}
}
if(sendPlain) { // Fancy messages disabled or broken
@@ -203,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;
@@ -248,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));
@@ -266,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;
}
/**
@@ -289,21 +329,43 @@ public class Message {
* - Else the parameter will replace its number surrounded with VARIABLESTART and VARIABLEEND
*/
private void replaceArgumentVariables(Limit limit) {
if(message == null || message.size() == 0 || replacements == null) {
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()) {
FancyMessageFormat.insertMessage(message, ((Message)param).get(limit), i, matches.start(), matches.end());
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, matcher.start(), matcher.end());
// Skip to end of insert
i = message.size()-startDiff;
}
number++;
} else {
@@ -319,7 +381,7 @@ public class Message {
* Replace all language variables in a message
*/
private void replaceLanguageVariables(Limit limit) {
if(message == null || message.size() == 0) {
if(message == null || message.size() == 0 || limit.reached()) {
return;
}
@@ -337,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) {
@@ -349,8 +411,12 @@ public class Message {
// Insert message
int startDiff = message.size()-i;
FancyMessageFormat.insertMessage(message, insert.get(limit), i, matches.start(), matches.end());
// Skip to end of insert, language tags already replaced
List<String> insertMessage = insert.get(limit);
if(limit.reached()) {
return;
}
FancyMessageFormat.insertMessage(message, insertMessage, i, matches.start(), matches.end());
// Skip to end of insert
i = message.size()-startDiff;
}
}
@@ -387,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);
}
}
@@ -1,219 +0,0 @@
package me.wiefferink.areashop.messages;
import org.bukkit.Bukkit;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Class made by glan3b (Github: https://github.com/glen3b) for the Fanciful project (Github: https://github.com/mkremins/fanciful)
*/
/**
* A class containing static utility methods and caches which are intended as reflective conveniences.
* Unless otherwise noted, upon failure methods will return {@code null}.
*/
public final class Reflection {
private static String _versionString;
private Reflection() {
}
/**
* Gets the version string from the package name of the CraftBukkit server implementation.
* This is needed to bypass the JAR package name changing on each update.
* @return The version string of the OBC and NMS packages, <em>including the trailing dot</em>.
*/
public synchronized static String getVersion() {
if(_versionString == null) {
if(Bukkit.getServer() == null) {
// The server hasn't started, static initializer call?
return null;
}
String name = Bukkit.getServer().getClass().getPackage().getName();
_versionString = name.substring(name.lastIndexOf('.')+1)+".";
}
return _versionString;
}
/**
* Stores loaded classes from the {@code net.minecraft.server} package.
*/
private static final Map<String, Class<?>> _loadedNMSClasses = new HashMap<String, Class<?>>();
/**
* Stores loaded classes from the {@code org.bukkit.craftbukkit} package (and subpackages).
*/
private static final Map<String, Class<?>> _loadedOBCClasses = new HashMap<String, Class<?>>();
/**
* Gets a {@link Class} object representing a type contained within the {@code net.minecraft.server} versioned package.
* The class instances returned by this method are cached, such that no lookup will be done twice (unless multiple threads are accessing this method simultaneously).
* @param className The name of the class, excluding the package, within NMS.
* @return The class instance representing the specified NMS class, or {@code null} if it could not be loaded.
*/
public synchronized static Class<?> getNMSClass(String className) {
if(_loadedNMSClasses.containsKey(className)) {
return _loadedNMSClasses.get(className);
}
String fullName = "net.minecraft.server."+getVersion()+className;
Class<?> clazz = null;
try {
clazz = Class.forName(fullName);
} catch(Exception e) {
e.printStackTrace();
_loadedNMSClasses.put(className, null);
return null;
}
_loadedNMSClasses.put(className, clazz);
return clazz;
}
/**
* Gets a {@link Class} object representing a type contained within the {@code org.bukkit.craftbukkit} versioned package.
* The class instances returned by this method are cached, such that no lookup will be done twice (unless multiple threads are accessing this method simultaneously).
* @param className The name of the class, excluding the package, within OBC. This name may contain a subpackage name, such as {@code inventory.CraftItemStack}.
* @return The class instance representing the specified OBC class, or {@code null} if it could not be loaded.
*/
public synchronized static Class<?> getOBCClass(String className) {
if(_loadedOBCClasses.containsKey(className)) {
return _loadedOBCClasses.get(className);
}
String fullName = "org.bukkit.craftbukkit."+getVersion()+className;
Class<?> clazz = null;
try {
clazz = Class.forName(fullName);
} catch(Exception e) {
e.printStackTrace();
_loadedOBCClasses.put(className, null);
return null;
}
_loadedOBCClasses.put(className, clazz);
return clazz;
}
/**
* Attempts to get the NMS handle of a CraftBukkit object.
* <p>
* The only match currently attempted by this method is a retrieval by using a parameterless {@code getHandle()} method implemented by the runtime type of the specified object.
* </p>
* @param obj The object for which to retrieve an NMS handle.
* @return The NMS handle of the specified object, or {@code null} if it could not be retrieved using {@code getHandle()}.
*/
public synchronized static Object getHandle(Object obj) {
try {
return getMethod(obj.getClass(), "getHandle").invoke(obj);
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
private static final Map<Class<?>, Map<String, Field>> _loadedFields = new HashMap<Class<?>, Map<String, Field>>();
/**
* Retrieves a {@link Field} instance declared by the specified class with the specified name.
* Java access modifiers are ignored during this retrieval. No guarantee is made as to whether the field
* returned will be an instance or static field.
* <p>
* A global caching mechanism within this class is used to store fields. Combined with synchronization, this guarantees that
* no field will be reflectively looked up twice.
* </p>
* <p>
* If a field is deemed suitable for return, {@link Field#setAccessible(boolean) setAccessible} will be invoked with an argument of {@code true} before it is returned.
* This ensures that callers do not have to check or worry about Java access modifiers when dealing with the returned instance.
* </p>
* @param clazz The class which contains the field to retrieve.
* @param name The declared name of the field in the class.
* @return A field object with the specified name declared by the specified class.
* @see Class#getDeclaredField(String)
*/
public synchronized static Field getField(Class<?> clazz, String name) {
Map<String, Field> loaded;
if(!_loadedFields.containsKey(clazz)) {
loaded = new HashMap<String, Field>();
_loadedFields.put(clazz, loaded);
} else {
loaded = _loadedFields.get(clazz);
}
if(loaded.containsKey(name)) {
// If the field is loaded (or cached as not existing), return the relevant value, which might be null
return loaded.get(name);
}
try {
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
loaded.put(name, field);
return field;
} catch(Exception e) {
// Error loading
e.printStackTrace();
// Cache field as not existing
loaded.put(name, null);
return null;
}
}
/**
* Contains loaded methods in a cache.
* The map maps [types to maps of [method names to maps of [parameter types to method instances]]].
*/
private static final Map<Class<?>, Map<String, Map<ArrayWrapper<Class<?>>, Method>>> _loadedMethods = new HashMap<Class<?>, Map<String, Map<ArrayWrapper<Class<?>>, Method>>>();
/**
* Retrieves a {@link Method} instance declared by the specified class with the specified name and argument types.
* Java access modifiers are ignored during this retrieval. No guarantee is made as to whether the field
* returned will be an instance or static field.
* <p>
* A global caching mechanism within this class is used to store method. Combined with synchronization, this guarantees that
* no method will be reflectively looked up twice.
* </p>
* <p>
* If a method is deemed suitable for return, {@link Method#setAccessible(boolean) setAccessible} will be invoked with an argument of {@code true} before it is returned.
* This ensures that callers do not have to check or worry about Java access modifiers when dealing with the returned instance.
* </p>
* <p>
* This method does <em>not</em> search superclasses of the specified type for methods with the specified signature.
* Callers wishing this behavior should use {@link Class#getDeclaredMethod(String, Class...)}.
* @param clazz The class which contains the method to retrieve.
* @param name The declared name of the method in the class.
* @param args The formal argument types of the method.
* @return A method object with the specified name declared by the specified class.
*/
public synchronized static Method getMethod(Class<?> clazz, String name,
Class<?>... args) {
if(!_loadedMethods.containsKey(clazz)) {
_loadedMethods.put(clazz, new HashMap<String, Map<ArrayWrapper<Class<?>>, Method>>());
}
Map<String, Map<ArrayWrapper<Class<?>>, Method>> loadedMethodNames = _loadedMethods.get(clazz);
if(!loadedMethodNames.containsKey(name)) {
loadedMethodNames.put(name, new HashMap<ArrayWrapper<Class<?>>, Method>());
}
Map<ArrayWrapper<Class<?>>, Method> loadedSignatures = loadedMethodNames.get(name);
ArrayWrapper<Class<?>> wrappedArg = new ArrayWrapper<Class<?>>(args);
if(loadedSignatures.containsKey(wrappedArg)) {
return loadedSignatures.get(wrappedArg);
}
for(Method m : clazz.getMethods()) {
if(m.getName().equals(name) && Arrays.equals(args, m.getParameterTypes())) {
m.setAccessible(true);
loadedSignatures.put(wrappedArg, m);
return m;
}
}
loadedSignatures.put(wrappedArg, null);
return null;
}
}
@@ -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;
}
@@ -794,7 +796,7 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
/**
* Teleport a player to the region
* Teleport a player to the region or sign
* @param player Player that should be teleported
* @param toSign true to teleport to the first sign of the region, false for teleporting to the region itself
* @param checkPermissions Set to true if teleport permissions should be checked, false otherwise
@@ -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;
}
}
@@ -1123,9 +1134,22 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
return false;
}
}
/**
* Teleport a player to the region or sign when he has permissions for it
* @param player Player that should be teleported
* @param toSign true to teleport to the first sign of the region, false for teleporting to the region itself
* @return true if the teleport succeeded, otherwise false
*/
public boolean teleportPlayer(Player player, boolean toSign) {
return teleportPlayer(player, toSign, true);
}
/**
* Teleport a player to the region when he has permissions for it
* @param player Player that should be teleported
* @return true if the teleport succeeded, otherwise false
*/
public boolean teleportPlayer(Player player) {
return teleportPlayer(player, false, true);
}
@@ -1195,7 +1219,16 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
// CONFIG
public boolean getBooleanSetting(String path) { // Handles strings as booleans
/**
* Get a boolean 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 (strings are handled as booleans)
*/
public boolean getBooleanSetting(String path) {
if(config.isSet(path)) {
if(config.isString(path)) {
return config.getString(path).equalsIgnoreCase("true");
@@ -1225,7 +1258,15 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
return this.getFileManager().getDefaultSettings().getBoolean(path);
}
/**
* Get a boolean 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 (strings are handled as booleans)
*/
public int getIntegerSetting(String path) {
if(config.isSet(path)) {
return config.getInt(path);
@@ -1245,7 +1286,15 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
return this.getFileManager().getDefaultSettings().getInt(path);
}
/**
* Get a double 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 double getDoubleSetting(String path) {
if(config.isSet(path)) {
return config.getDouble(path);
@@ -1265,7 +1314,15 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
return this.getFileManager().getDefaultSettings().getDouble(path);
}
/**
* Get a long 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 long getLongSetting(String path) {
if(config.isSet(path)) {
return config.getLong(path);
@@ -1285,7 +1342,15 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
return this.getFileManager().getDefaultSettings().getLong(path);
}
/**
* Get a string 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 String getStringSetting(String path) {
if(config.isSet(path)) {
return config.getString(path);
@@ -1305,7 +1370,15 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
return this.getFileManager().getDefaultSettings().getString(path);
}
/**
* Get a string list 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 List<String> getStringListSetting(String path) {
if(config.isSet(path)) {
return config.getStringList(path);
@@ -1325,7 +1398,95 @@ 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
* @param value The value to set it to, null to remove the setting
*/
public void setSetting(String path, Object value) {
config.set(path, value);
this.saveRequired();
@@ -1460,18 +1621,43 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
this.current = current;
this.limitingGroup = limitingGroup;
}
/**
* Check if the action is allowed
* @return true if the actions is allowed, otherwise false
*/
public boolean actionAllowed() {
return actionAllowed;
}
}
/**
* Get the type of the factor that is limiting the action, assuming actionAllowed() is false
* @return The type of the limiting factor
*/
public LimitType getLimitingFactor() {
return limitingFactor;
}
/**
* Get the maximum number of the group that is the limiting factor, assuming actionAllowed() is false
* @return The maximum
*/
public int getMaximum() {
return maximum;
}
/**
* Get the current number of regions in the group that is the limiting factor, assuming actionAllowed() is false
* @return The current number of regions the player has
*/
public int getCurrent() {
return current;
}
/**
* Get the name of the group that is limiting the action, assuming actionAllowed() is false
* @return The name of the group
*/
public String getLimitingGroup() {
return limitingGroup;
}
@@ -1538,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
@@ -1548,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
@@ -1580,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;
@@ -1622,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:
+68 -76
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.1, Percentage translated: 100% ║
# ║ 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,7 +8,7 @@
# ║ 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: "[blue][bold]<%0%>[/bold]"
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
@@ -35,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:
@@ -58,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."
@@ -66,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."
@@ -74,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."
@@ -90,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."
@@ -98,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%)."
@@ -111,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."
@@ -134,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."
@@ -142,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."
@@ -155,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%:"
@@ -178,22 +167,22 @@ 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% kann gemietet werden für %price% je %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region% wurde an %lang:player% verkauft."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region% kann gekauft werden für %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region% wurde an %lang:player% verkauft."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region% wurde an %lang:player% weiterverkauft."
info-pageStatus: "[gray]Seite %0%/%1%"
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:
- " [gray][bold]◄Vorherige[/bold] "
- " hover: %lang:action|Zeige Vorherige Seite|%"
- " [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:
- " [gray][bold]Nächste►[/bold]"
- " hover: %lang:action|Zeige nächste Seite.|%"
- " [gold][bold]Nächste►[/bold]"
- " hover: %lang:action|Zeige nächste Seite|%"
- " command: %0%"
info-pageNoNext:
- " [darkgray][bold]Nächste►[/bold]"
@@ -252,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]"
@@ -279,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%."
@@ -302,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."
@@ -319,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."
@@ -335,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%)."
@@ -399,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."
@@ -416,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."
@@ -431,11 +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](nach %until%, %timeleft% verbleibend)."
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](als Freund hinzugefügt, Besitzer: %lang:player%)."
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."
@@ -463,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."
@@ -477,13 +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%|% ist nicht als Freund der Region %lang:region% eingetragen."
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."
@@ -507,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."
@@ -520,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"
+38 -25
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.1, 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) ║
@@ -8,7 +8,7 @@
# ║ 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: "[blue][bold]<%0%>[/bold]"
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
@@ -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%:"
@@ -178,22 +180,22 @@ info-nogroupNone: "There are no regions without a group."
info-noFiltergroup: "Group '%0%' does not exist and therefore cannot be used to limit the results."
info-noRegions: "No regions have been found."
info-wrongPage: "%0% is not a correct page number."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: For rent for %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: Rented to %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: For sale for %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: Sold to %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: Sold to %lang:player% (reselling)."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]For rent for %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Rented to %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]For sale for %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Sold to %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Sold to %lang:player% (reselling)."
info-pageStatus:
- "[gray]Page %0%/%1%"
- "[gold]Page %0%/%1%"
info-pagePrevious:
- " [gray][bold]◄Previous[/bold] "
- " [gold][bold]◄Previous[/bold] "
- " hover: %lang:action|Show previous page|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Previous[/bold] "
- " hover: This is already the first page"
info-pageNext:
- " [gray][bold]Next►[/bold]"
- " [gold][bold]Next►[/bold]"
- " hover: %lang:action|Show next page|%"
- " command: %0%"
info-pageNoNext:
@@ -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."
@@ -436,11 +438,20 @@ delsign-success: "The sign has been removed from region %lang:region%."
me-noPermission: "You don't have permission to check which regions you have."
me-header: "Regions of %lang:tPlayer|%0%|%:"
me-notAPlayer: "You are not a player so you can't have any regions."
me-rentLine: "[darkgreen][bold]►[reset] %lang:region% [gray](until %until%, %timeleft% left)."
me-rentLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% left"
- " hover: until %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine: "[darkgreen][bold]►[reset] %lang:region% [gray](added as friend, owner: %lang:player%)."
me-friendLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "owned by %lang:player%"
- " hover: You are added as friend"
- ")."
me-nothing: "%lang:tPlayer|%0%|% has not rented or bought regions and is not added as friend to one."
me-noPlayer: "%0% cannot be found, probably never joined the server."
me-clickHint: "[gray][italic]Click a region name to see details."
setowner-help: "/as setowner <player> [region], the region you stand in will be used if not specified."
setowner-noPermission: "You don't have permission to set the owner of a region."
@@ -512,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."
+75 -83
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.1, Percentage translated: 100% ║
# ║ 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,26 +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: "[blue][bold]<%0%>[/bold]"
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%|%"
@@ -40,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%"
@@ -49,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."
@@ -58,38 +58,37 @@ 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-info: "%lang:helpCommand|/as info|% Avoir des informations par rapport aux régions."
help-rent: "%lang:helpCommand|/as rent|% Louez une région ou extendez votre location."
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 la duration d'une location."
help-setduration: "%lang:helpCommand|/as setduration|% Changer le temps de location d'une région."
help-teleport: "%lang:helpCommand|/as tp|% Se téléporter à une région vendue/louée."
help-setteleport: "%lang:helpCommand|/as settp|% Définir le point de téléportation d'une région."
help-find: "%lang:helpCommand|/as find|% Trouver une région à vendre/louer vide."
help-groupadd: "%lang:helpCommand|/as groupadd|% Ajouter une région à un groupe."
help-groupdel: "%lang:helpCommand|/as groupdel|% Supprimer une région d'un groupe."
help-grouplist: "%lang:helpCommand|/as grouplist|% Montrer tout les groupes."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Montrer des informations sur un groupe."
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|% Inscrire une région à la vente ou à la location."
help-del: "%lang:helpCommand|/as del|% Supprimer toutes les régions enregistrées par AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Ajouter un panneau d'une région existante."
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 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."
@@ -101,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 click 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 vous ne spécifiez pas la région, la région ou vous trouvez sera utilisée."
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."
@@ -125,26 +124,26 @@ buy-notBuyable: "La région %lang:region% n'est pas disponible à l'achat."
buy-maximum: "Vous ne pouvez pas acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
buy-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
buy-succes: "Vous avez acheté la région %lang:region%."
buy-successResale: "Vous avez acheté la région %lang:region% qui appartenait à %lang:tPlayer|%0%|%."
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."
@@ -155,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%:"
@@ -178,23 +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%: A louer pour %price% par %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: Loué à %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: A vendre pour %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: Vendu à %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: Vendu à %lang:player% (revente)."
info-pageStatus: "[gray]Page %0%/%1%"
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:
- " [gray][bold]◄Précédent[/bold] "
- " hover: %lang:action|Afficher la page précédente|%"
- " command: %0%"
- "⇥[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:
- " [gray][bold]Suivant►[/bold]"
- " hover: %lang:action|Afficher la page suivante|%"
- " command: %0%"
- "⇥[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"
@@ -232,7 +221,7 @@ info-regionCanBeBought:
- " command: /areashop buy %region%"
- ": [gray]%price%."
info-regionReselPrice: "[darkgreen][bold]►[reset] Prix de revente : [gray]%resellprice% (vous pouvez l'acheter à %player%)."
info-regionFriends: "[darkgreen][bold]►[reset] Amis de la région: [gray]%0%."
info-regionFriends: "[darkgreen][bold]►[reset] Ami(s) ajouté(s) : [gray]%0%."
info-friend: "%lang:tPlayer|%0%|%"
info-friendRemove:
- "%lang:info-friend|%0%|%"
@@ -279,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%."
@@ -317,8 +303,8 @@ setup-noDuration: "A la troisième ligne, vous n'avez pas spécifié la durée d
setup-wrongDuration: "Le temps spécifié n'est pas au bon format. Exemple : 1 day."
setup-noPrice: "A la quatrième ligne, vous n'avez pas spécifié le prix."
setup-wrongPrice: "Le prix spécifié n'est pas correct, n'utilisez que des chiffres s'il vous plaît."
setup-rentSuccess: "La location de la région %lang:region% est parfaitement parametré."
setup-buySuccess: "La vente de la région %lang:region% est parfaitement parametré."
setup-rentSuccess: "La location de la région %lang:region% est correctement configurée."
setup-buySuccess: "La vente de la région %lang:region% est correctement configurée."
setup-noPermissionRent: "Vous n'avez pas la permission de définir des région louables."
setup-noPermissionBuy: "Vous n'avez pas la permission de définir des régions achetables."
setup-couldNotDetect: "Multiples régions trouvées avec la même priorité et/ou étant de même nature : parent ou enfant. Spécifiez-en une sur la deuxième ligne. (2 des régions trouvées: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
@@ -349,9 +335,9 @@ setteleport-help: "/as settp [region] [reset], Si non spécifiée, cible la rég
setteleport-noPermission: "Vous n'avez pas la permission de définir un point de téléportation."
setteleport-noPermissionOther: "Vous n'avez pas la permission de définir l'emplacement de téléportation d'une région que vous ne possédez pas."
setteleport-noRentOrBuy: "La région spécifiée n'est pas enregistrée : %0%."
setteleport-success: "Le point de téléportation de %lang:region% à été définis."
setteleport-success: "Le point de téléportation de %lang:region% a été défini."
setteleport-notInside: "Le lieu doit se trouver dans votre région."
setteleport-reset: "Le point de téléportation de %lang:region% à été réinitialisé."
setteleport-reset: "Le point de téléportation de %lang:region% a été réinitialisé."
find-help: "/as find <buy|rent> [prix maximum] [group]"
find-noPermission: "Vous n'avez pas la permission de rechercher des régions et de vous y téléporter."
@@ -379,7 +365,7 @@ groupdel-weFailed: "Nous ne sommes de toute façon pas dans le groupe %0% : [gr
grouplist-noPermission: "Vous n'avez pas l'autorisation d'afficher les groupes enregistrés."
grouplist-noGroups: "Il n'y a actuellement aucun groupe enregistré."
grouplist-success: "Les groupes suivant sont enregistrés: [gray]%0%."
grouplist-success: "Les groupes suivants sont enregistrés: [gray]%0%."
groupinfo-help: "/as groupinfo <group>"
groupinfo-noPermission: "Vous n'avez pas la permission d'afficher des informations sur un groupe."
@@ -399,13 +385,12 @@ 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."
del-noPermission: "Vous n'avez pas la permission de supprimer des régions."
del-success: "Regions supprimés: [gray]%0%."
del-failed: "Pas de permission pour supprimer ou #Je comprend pas la suite#"
del-success: "Régions supprimées: [gray]%0%."
del-failed: "Vous n'avez pas la permission, ou vous n’être pas enregistré: [gray]%0%."
addsign-help: "/as addsign [region] [profile]"
addsign-noSign: "Vous ne regardez pas de panneau."
@@ -431,11 +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](pendant %until%, %timeleft% restant)."
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](ajouté comme ami, propriétaire: %lang:player%)."
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% non trouvé, il ne c'est peut être jamais connecté sur le serveur."
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."
@@ -458,7 +452,7 @@ resell-noPermissionOther: "Vous n'avez pas la permission de mettre des régions
stopresell-help: "/as stropresell [région], la région où vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
stopresell-notRegistered: "La région spécifiée n'est pas enregistrée : %0%."
stopresell-notResell: "Vous ne pouvez pas stopper la revente %lang:region% car elle n'est pas en mode revente."
stopresell-success: "%lang:region% est retourné en mode vente"
stopresell-success: "%lang:region% n'est plus en revente."
stopresell-noPermission: "Vous n'avez pas la permission de retirer votre région de la vente."
stopresell-noPermissionOther: "Vous n'avez pas la permission de retirer les régions de la vente."
@@ -507,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."
@@ -551,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%."
+32 -20
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.1, 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) ║
@@ -8,7 +8,7 @@
# ║ 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: "[blue][bold]<%0%>[/bold]"
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
@@ -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%:"
@@ -178,21 +181,21 @@ info-nogroupNone: "Er zijn geen gebieden zonder groep."
info-noFiltergroup: "Groep '%0%' bestaat niet en kan daardoor niet gebruikt worden om de resultaten te limiteren."
info-noRegions: "Er zijn geen gebieden gevonden."
info-wrongPage: "%0% is geen correct pagina nummer."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: Te huur voor %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: Verhuurd aan %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: Te koop voor %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: Verkocht aan %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: Verkocht aan %lang:player% (aan het doorverkopen)."
info-pageStatus: "[gray]Pagina %0%/%1%"
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]Te huur voor %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Verhuurd aan %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]Te koop voor %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkocht aan %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkocht aan %lang:player% (aan het doorverkopen)."
info-pageStatus: "[gold]Pagina %0%/%1%"
info-pagePrevious:
- " [gray][bold]◄Vorige[/bold] "
- " [gold][bold]◄Vorige[/bold] "
- " hover: %lang:action|Laat de vorige pagina zien|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Vorige[/bold] "
- " hover: Dit is al de eerste pagina"
info-pageNext:
- " [gray][bold]Volgende►[/bold]"
- " [gold][bold]Volgende►[/bold]"
- " hover: %lang:action|Laat de volgende pagina zien|%"
- " command: %0%"
info-pageNoNext:
@@ -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."
@@ -431,11 +432,20 @@ delsign-success: "Het bord is verwijderd van gebied %lang:region%."
me-noPermission: "Je hebt geen toestemming om te zien welke gebieden je hebt."
me-header: "Gebieden van %lang:tPlayer|%0%|%:"
me-notAPlayer: "Je bent geen speler dus je kunt geen gebieden hebben."
me-rentLine: "[darkgreen][bold]►[reset] %lang:region% [gray](tot %until%, %timeleft% over)."
me-rentLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% over"
- " hover: tot %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine: "[darkgreen][bold]►[reset] %lang:region% [gray](toegevoegd als vriend, eigenaar: %lang:player%)."
me-friendLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%lang:player% is eigenaar"
- " hover: Je bent toegevoegd als vriend"
- ")."
me-nothing: "%lang:tPlayer|%0%|% heeft geen gebieden gekocht of gehuurd en is niet als vriend toegevoegd bij gebieden."
me-noPlayer: "%0% kan niet gevonden worden, is waarschijnlijk nooit op de server geweest."
me-clickHint: "[gray][italic]Klik op een naam van een gebied voor details."
setowner-help: "/as setowner <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
setowner-noPermission: "Je hebt geen toestemming om de eigenaar van een gebied in te stellen."
@@ -507,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 -37
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.1, Percentage translated: 100% ║
# ║ 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) ║
@@ -8,8 +8,6 @@
# ║ 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: "[blue][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
@@ -58,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."
@@ -155,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%:"
@@ -178,23 +165,9 @@ info-nogroupNone: "Det er ingen regioner uten en gruppe."
info-noFiltergroup: "Gruppe '%0%' eksiterer ikke og kan derfor ikke bli brukt til å begrense resultatene."
info-noRegions: "Ingen regioner har blitt funnet."
info-wrongPage: "%0% er ikke et riktig side nummer."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: Til leie for %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: Utleid til %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: Til salgs for %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: Solgt til %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: Solgt til %lang:player% (videresalg)."
info-pageStatus: "[gray]Side %0%/%1%"
info-pagePrevious:
- " [gray][bold]◄Forrige[/bold] "
- " hover: %lang:action|Vis forrige side|%"
- " kommando: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Forrige[/bold] "
- " hover: Dette er første side"
info-pageNext:
- " [gray][bold]Neste►[/bold]"
- " hover: %lang:action|Vis neste side|%"
- " kommando: %0%"
info-pageNoNext:
- " [darkgray][bold]Neste►[/bold]"
- " hover: Dette er siste side"
@@ -279,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%."
@@ -399,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."
@@ -431,9 +400,7 @@ delsign-success: "Skiltet har blitt fjernet fra region %land:region%."
me-noPermission: "Du har ikke rettigheter til å sjekke hvilken regioner du har."
me-header: "Regioner til %lang:tPlayer|%0%|%:"
me-notAPlayer: "Du er ikke en spiller så du kan ikke ha noen regioner."
me-rentLine: "[darkgreen][bold]►[reset] %lang:region% [gray](frem til %until%, %timeleft% igjen)."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine: "[darkgreen][bold]►[reset] %lang:region% [gray](lagt til som venn, eier: %lang:player%)."
me-nothing: "%lang:tPlayer|%0%|% har ikke leid eller kjøpt regioner og er ikke lagt til som venn på noen."
me-noPlayer: "%0% kan ikke bli funnet, mest sannsynlig aldri vært på serveren."
@@ -477,7 +444,6 @@ delfriend-noPermissionOther: "Du har ikke rettigheter til å fjerne venner fra r
delfriend-noPermission: "Du har ikke rettigheter til å fjerne venner fra din region."
delfriend-successOther: "%lang:tPlayer|%0%|% har blitt fjernet som venn fra region %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% har blitt fjernet som venn fra din region %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% er ikke lagt til som venn i %lang:region."
delfriend-noOwner: "Du kan ikke fjerne venner fra en region uten eier."
linksigns-multipleRegions: "Fant flere regioner: [gray]%0%."
@@ -500,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."
@@ -507,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."
+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: 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) ║
# ║ 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|Используй %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Используй %0%|%"
- " command: %0%"
region: "%lang:tRegion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Регион %0%"
- " hover: %lang:action|Информация о регионе|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
tPlayer:
- "[bold]%0%[/bold]"
- " hover: Игрок %0%"
- " hover: %lang:action|Регионы %0%|%"
- " command: /areashop info player %0%"
landlord:
- "[bold]%landlord%[/bold]"
- " hover: Владелец %landlord%"
- " hover: %lang:action|Регионы %landlord%|%"
- " command: /areashop info player %landlord%"
total-maximum: "Вы не можете арендовать или купить больше, чем %0% регион(ов) (у вас уже имеется %1% в группе '%2%')."
general-notReady: "Плагин AreaShop еще не полностью загружен. Пожалуйста, подождите..."
general-noWorld: "Вы не можете сделать это, мир для %lang:region% не доступен (мир '%world%')."
general-noRegion: "Вы не можете сделать это, WorldGuard регион не доступен (регион %lang:region%)."
general-noEconomy: "На сервере нету плагина Экономии, либо он установлен некорректно. Оповестите администратора сервера об этом."
general-cancelled: "%0%"
cmd-notValid: "Ошибка в команде, используй '/as help' для получения дополнительной информации."
cmd-onlyByPlayer: "Эта команда может быть применена только игроком. "
cmd-weOnlyByPlayer: "Использование выделения доступно только для игроков, укажите название региона в качестве дополнительного аргумента."
cmd-noSelection: "Вы не имеете WorldEdit выделения."
cmd-noRegionsFound: "В выбранной области не найдено регионов, зарегистрированных в AreaShop."
cmd-noWERegionsFound: "Внутри вашего выделения не обнаружено регионов."
cmd-noRegionsAtLocation: "В вашем местоположении не найдено регионов, укажите регион в качестве аргумента."
cmd-moreRegionsAtLocation: "В вашем местоположении найдено несколько регионов, укажите название региона для уточнения."
cmd-automaticRegionOnlyByPlayer: "Автоматическое определение региона доступно только для игроков, укажите регион в качестве аргумента."
help-header: "Страница помощи. Команды которые Вам доступны."
help-noPermission: "У вас нет разрешения для просмотра страницы помощи."
help-alias: "Альтернативные команды: /areashop, /as."
help-help: "%lang:helpCommand|/as help|% Показать эту страницу помощи."
help-info: "%lang:helpCommand|/as info|% Получить информацию о текущих регионах."
help-rent: "%lang:helpCommand|/as rent|% Арендовать регион или расширить свою текущую аренду."
help-buy: "%lang:helpCommand|/as buy|% Купить регион."
help-unrent: "%lang:helpCommand|/as unrent|% Отказаться от аренды региона."
help-sell: "%lang:helpCommand|/as sell|% Продать регион."
help-reload: "%lang:helpCommand|/as reload|% Перезагрузить все файлы и обновить регионы."
help-setrestore: "%lang:helpCommand|/as setrestore|% Включить/выключить восстановление и выбрать профиль."
help-setprice: "%lang:helpCommand|/as setprice|% Изменить стоимость региона."
help-setduration: "%lang:helpCommand|/as setduration|% Изменить длительность аренды."
help-teleport: "%lang:helpCommand|/as tp|% Телепортироваться к вашему купленному/арендованному региону."
help-setteleport: "%lang:helpCommand|/as settp|% Установить точку телепортации для региона."
help-find: "%lang:helpCommand|/as find|% Найти свободный регион для покупки или аренды."
help-groupadd: "%lang:helpCommand|/as groupadd|% Добавить регион в группу."
help-groupdel: "%lang:helpCommand|/as groupdel|% Удалить регион из группы."
help-grouplist: "%lang:helpCommand|/as grouplist|% Показать все доступные группы."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Показать информацию о группе."
help-schemevent: "%lang:helpCommand|/as schemevent|% Вызвать схематическое событие для региона."
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-setowner: "%lang:helpCommand|/as setowner|% Установить владельца региона или расширить аренду."
help-resell: "%lang:helpCommand|/as resell|% Установить один из Ваших регионов в режим перепродажи."
help-stopResell: "%lang:helpCommand|/as stopresell|% Установить Ваш регион обратно в режим продано."
help-addFriend: "%lang:helpCommand|/as addfriend|% Добавить друга в ваш регион."
help-delFriend: "%lang:helpCommand|/as delfriend|% Удалить друга из вашего региона."
help-linksigns: "%lang:helpCommand|/as linksigns|% Используй, чтобы включить режим привязки табличек."
help-stack: "%lang:helpCommand|/as stack|% Создание нескольких регионов и добавлением их."
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Установить землевладельца в регион."
rent-help: "/as rent [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
rent-noPermission: "У вас не прав для аренды данного региона."
rent-maximum: "Вы не можете арендовать более %0% региона(ов) (у вас уже есть %1% в группе '%2%')."
rent-maximumExtend: "Вы не можете продлить эту аренду, потому что у вас есть более чем %0% регион(ов) (у вас имеется %1% в группе '%2%')."
rent-payError: "Что-то пошло не так с оплатой, повторите попытку позже."
rent-rented: "Вы арендовали %lang:region% до %until%, вы можете увеличить срок аренды еще раз нажав на табличку или использовать команду /as rent."
rent-extended: "Вы продлили свою аренду %lang:region% до %until%."
rent-extendedToMax: "Вы не можете арендовать регион %lang:region% до %until% (максимальное время аренды %maxrenttime%)."
rent-lowMoneyExtend: "У вас не достаточно денег для продления аренды (у вас %0%, а необходимо %price%)."
rent-lowMoneyRent: "У вас не хватает денег для аренды %lang:region% (у вас %0%, а необходимо %price%)."
rent-someoneElse: "Кто-то уже арендует регион %lang:region%."
rent-notRentable: "Этот регион не доступен для аренды."
rent-maxExtends: "Вы не можете продлить аренду на столько (максимум %maxextends%), однако после того как закончится срок аренды вы можете арендовать %lang:region% снова."
rent-maxRentTime: "Вы не можете арендовать %lang:region% на такой период, максимальное время аренды %maxrenttime%, вы пытаетесь арендовать на %timeleft%."
rent-restrictedToWorld: "Вы должны быть в мире '%world%', чтобы арендовать %lang:region% (вы находитесь в '%0%')."
rent-restrictedToRegion: "Вы должны находиться внутри %lang:region% для его аренды."
rent-expireWarning: "В вашем регионе %lang:region% закончится арендный срок %timeleft%, вы должны продлить аренду для его сохранения."
rent-alreadyAtFull: "%lang:region% уже на уровне или выше максимального времени аренды, вы не можете продлить его еще.."
buy-help: "/as buy [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
buy-noPermission: "У Вас нет прав для покупки региона."
buy-noPermissionResell: "У Вас нет прав для покупки региона в режиме перепродажи."
buy-noPermissionNoResell: "У Вас нет прав для покупки региона, который не находится в режиме перепродажи."
buy-notBuyable: "Регион %lang:region% не доступен для покупки."
buy-maximum: "Вы не можете купить более %0% региона(ов) (у Вас уже имеется %1% в группе '%2%')"
buy-payError: "Что-то пошло не так с оплатой, повторите попытку позже."
buy-succes: "Вы успешно купили %lang:region%."
buy-successResale: "Вы успешно купили %lang:region% в %lang:tPlayer|%0%|%."
buy-successSeller: "Ваш регион %lang:region% был продан %lang:player% за %0%."
buy-lowMoney: "У вас недостаточно денег чтобы купить %lang:region% (у вас %0%, а необходимо %price%)."
buy-lowMoneyResell: "У вас недостаточно денег чтобы купить %lang:region% (у вас %0%, а необходимо %resellprice%)."
buy-yours: "Вы уже владелец %lang:region%."
buy-someoneElse: "Кто-то уже купил %lang:region%."
buy-restrictedToWorld: "Вы должны быть в мире '%world%', чтобы купить %lang:region% (вы находитесь в '%0%')."
buy-restrictedToRegion: "Вы должны находиться внутри %lang:region% для его покупки."
unrent-help: "/as unrent [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
unrent-noPermission: "У вас нет разрешения на снятие аренды в регионе."
unrent-noPermissionOther: "У вас нет разрешения на снятие аренды в другом регионе."
unrent-notRegistered: "В регионе недоступно снятие аренды, потому что он не зарегистрирован для сдачи в аренду."
unrent-notRented: "В регионе нельзя снять аренду, потому что он не арендован."
unrent-unrented: "%lang:region% теперь не арендует %lang:player%."
unrent-expired: "Ваша аренда %lang:region% уже истекла."
sell-help: "/as sell [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
sell-notRegistered: "Этот регион не может быть продан, так как он не зарегистрирован на продажу."
sell-notBought: "Этот регион не может продан, так как не находится в чьей-либо собственности."
sell-sold: "%lang:region% был продан %lang:player%."
sell-noPermission: "У Вас нет прав для продажи региона."
sell-noPermissionOther: "У Вас нет прав для продажи другого региона."
reload-reloading: "Все файлы перезагружены, проверка аренд и обновление регионов."
reload-updateStart: "[gray]Обновление %0% регионов за %1% секунд."
reload-updateComplete: "[gray]Обновление регионов завершено."
reload-noPermission: "Недостаточно полномочий для того, чтобы перезагрузить конфиги плагина."
reload-updateCommandChanged: "'/as updaterents' и '/as updatebuys' были удалены, '/as reload' теперь будет также обновлять регионы, используйте эту команду взамен."
info-noPermission: "У Вас нет прав для получения информации о регионах."
info-allHeader: "Все регионы%0%:"
info-rentedHeader: "Арендовано регионов%0%:"
info-forrentHeader: "Регионы для аренды%0%:"
info-forsaleHeader: "Регионы для продажи%0%:"
info-soldHeader: "Продано регионов%0%:"
info-resellingHeader: "Перепродано регионов%0%:"
info-nogroupHeader: "Регионы без групп%0%:"
info-limitedToGroup: "(ограничение в группе %0%)"
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: Это последняя страница"
info-playerHelp: "/as info player <имяигрока>."
info-playerRents: "Регионы арендованные %lang:tPlayer|%0%|%: [gray]%1%"
info-playerNoRents: "%lang:tPlayer|%0%|% не арендовал регион."
info-playerBuys: "Регионы купленые %lang:tPlayer|%0%|%: [gray]%1%."
info-playerNoBuys: "%lang:tPlayer|%0%|% не покупал регион."
info-regionHelp: "/as info region [имярегиона], если не указано имя, будет выбран регион в котором вы стоите."
info-regionHeaderRent: "[darkgreen]Информация о %lang:region%:"
info-regionHeaderBuy: "[darkgreen]Информация о %lang:region%:"
info-regionRented: "[darkgreen][bold]►[reset] Арендован игроком %lang:player% до: [gray]%until%."
info-regionBought: "[darkgreen][bold]►[reset] Куплено %lang:player%."
info-regionReselling: "[darkgreen][bold]►[reset] Купленный %lang:player%, сейчас продаётся."
info-regionExtending:
- "[darkgreen][bold]►[reset] "
- "[bold]Продление за[/bold]"
- " hover: Продлить аренду %region%"
- " hover: длительностью %duration% за %price%"
- " hover: %lang:action|Продлить аренду %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% на %duration%."
info-regionCanBeRented:
- "[darkgreen][bold]►[reset] "
- "[bold]Аренда за[/bold]"
- " hover: Арендовать %region% за %price% на %duration%"
- " hover: %lang:action|Аренда %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% на %duration%."
info-regionCanBeBought:
- "[darkgreen][bold]►[reset] "
- "[bold]Купить за[/bold]"
- " hover: Купить %region% за %price%"
- " hover: %lang:action|Купить %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
info-regionReselPrice: "[darkgreen][bold]►[reset] Стоимость перепродажи: [gray]%resellprice% (вы можете купить его у %lang:player%)."
info-regionFriends: "[darkgreen][bold]►[reset] Добавленные друзья: [gray]%0%."
info-friend: "%lang:tPlayer|%0%|%"
info-friendRemove:
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Регион %region%"
- " hover: %lang:action|Удалить %0% из друзей|%"
- " command: /areashop delfriend %0% %region%"
info-regionMoneyBackBuy: "[darkgreen][bold]►[reset] Окупаемость продажи: [gray]%moneyback% (%moneybackpercent%% от стоимости)."
info-regionMoneyBackBuyClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Окупаемость продажи[/bold]"
- " hover: Продать %region% и получить обратно %moneyback%"
- " hover: %lang:action|Продать %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% от стоимости)."
info-regionMoneyBackRent: "[darkgreen][bold]►[reset] Окупаемость снятия аренды: [gray]%moneyback% (%moneybackpercent%% от оставшиеся времени)."
info-regionMoneyBackRentClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Окупаемость снятия аренды[/bold]"
- " hover: Снять аренду %region% и вернуть деньги %moneyback%"
- " hover: %lang:action|Снять аренду %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% от оставшиеся времени)."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Максимальное количество продления: [gray]%maxextends% раз(а)."
info-regionNoExtending: "[darkgreen][bold]►[reset] Аренду нельзя продлить."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Продленный осталось: [gray]%extendsleft% времени(раз) из %maxextends%."
info-regionMaxRentTime: "[darkgreen][bold]►[reset] пред заказ аренды: [gray]%maxrenttime% максимальный."
info-prefix: "[darkgreen][bold]►[reset] "
info-regionTeleport:
- "[bold]Переместится к региону[/bold]"
- " hover: %lang:action|Телепортация на %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]установить точку телепортации[/bold]"
- " hover: %region%"
- " hover: %lang:action|Установить точку телепорта|%"
- " command: /areashop settp %region%"
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% бездействия игрока."
info-regionInactiveSell: "[darkgreen][bold]►[reset] Авто продажа после: [gray]%inactivetime% бездействия игрока."
info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Ты должен быть внутри %lang:region% для его аренды."
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для аренды %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Ты должен быть внутри %lang:region% для его покупки."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для покупки %lang:region%."
info-regionLandlord: "[darkgreen][bold]►[reset] Землевладелец: [gray]%lang:landlord% (Получит деньги)."
info-regionNotExisting: "Указанный регион не зарегистрирован: %0%."
setrestore-help: "/as setrestore <регион> <true|false|general> [профиль]."
setrestore-noPermission: "У вас нет разрешения на изменение параметров восстановления."
setrestore-notRegistered: "Указанный регион не зарегистрирован: %0%."
setrestore-invalidSetting: "'%0%' не является допустимым значением, должно быть true, false или general."
setrestore-success: "Успешно установлен параметр восстановления %lang:region% до '%0%'."
setrestore-successProfile: "Успешно установлен параметр восстановления %lang:region% до '%0%' и профиль до '%1%'."
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: "Ни одна табличка не доступна что бы телепортироваться, попытка телепортироваться во внутрь региона вместо этого."
setteleport-help: "/as settp [регион] [сброс], если не указать параметры, будет выбран регион в котором вы находитесь."
setteleport-noPermission: "У вас нет прав, чтобы установить точку телепорта."
setteleport-noPermissionOther: "У вас нет прав, чтобы установить точку телепорта для региона, который вам не принадлежит."
setteleport-noRentOrBuy: "Указанный регион не зарегистрирован: %0%."
setteleport-success: "Точка телепорта для %lang:region% установлена."
setteleport-notInside: "Точка должно быть внутри региона."
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 выделении."
groupadd-noPermission: "У вас нет разрешения на добавление регионов к группам."
groupadd-success: "Регион %lang:region% был добавлен к группе '%0%', эта группа теперь имеет %1% участника(-ов)."
groupadd-failed: "Регион %lang:region% уже является участником группы '%0%'."
groupadd-weSuccess: "Добавлен к группе %0%: [gray]%1%."
groupadd-weFailed: "Уже были в группе %0%: [gray]%1%."
groupdel-help: "/as groupdel <group> [имярегиона], если не указать имя, будут выбраны все регионы в вашем WorldEdit выделении."
groupdel-noPermission: "У вас нет разрешения на удаление регионов из групп."
groupdel-success: "Регион %lang:region% был удален из группы '%0%', эта группа теперь имеет %1% участника(-ов)."
groupdel-failed: "Регион %lang:region% не является участником группы '%0%'."
groupdel-weSuccess: "Удален из группы %0%: [gray]%1%."
groupdel-weFailed: "Не были в группе %0% во всяком случае: [gray]%1%."
grouplist-noPermission: "У вас нет разрешения на отображение зарегистрированных групп."
grouplist-noGroups: "Нет доступных зарегистрированных груп."
grouplist-success: "Следующие группы были зарегистрированные: [gray]%0%."
groupinfo-help: "/as groupinfo <группа>."
groupinfo-noPermission: "У вас нет разрешения на отображение информации о группе."
groupinfo-noGroup: "Нет доступной зарегистрированной группы с именем '%0%', используй /as grouplist для вывода списка групп."
groupinfo-members: "Следующие регионы являются членами группы %0%: [gray]%1%."
groupinfo-noMembers: "Группа %0% не имеет участников."
schemevent-help: "/as schemevent <регион> <created|deleted|rented|unrented|bought|sold>."
schemevent-wrongEvent: "Событие '%0%' не существует, используйте одно из следующих действий: [gray]%1%."
schemevent-success: "Событие '%0%' успешно сработало для региона %lang:region%."
schemevent-noPermission: "У вас нет разрешения на иницииацию схематических событий"
add-help: "/as add <rent|buy> [rрегион] [мир]."
add-noPermission: "У вас нет разрешения добавлять регионы в AreaShop."
add-success: "Добавлен в %0%: [gray]%1%."
add-failed: "Уже зарегистрирован: [gray]%0%."
add-blacklisted: "Включен в черный список : [gray]%0%."
add-specifyWorld: "Укажите мир региона при использовании из консоли."
add-incorrectWorld: "Мир '%0%' не найден, попробуйте еще раз (с учетом регистра)."
add-noPermissionRegions: "Нет разрешения, чтобы добавить: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Вы либо не являетесь участником/владельцем этих регионов, либо не имеете разрешения добавлять свои регионы."
del-noPermission: "У вас нет разрешения на удаление регионов."
del-success: "Удалены регионы: [gray]%0%."
del-failed: "Нет разрешения на удаление или не зарегистрирован: [gray]%0%."
addsign-help: "/as addsign [регион] [профиль]."
addsign-noSign: "Вы не смотрите на табличку."
addsign-noRegions: "Не найдено регионов вокруг таблички."
addsign-couldNotDetect: "Найдено несколько регионов вокруг таблички, укажите регион в качестве дополнительного аргумента (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
addsign-couldNotDetectSign: "Найдено несколько регионов вокруг таблички, укажите регион на второй строке (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
addsign-wrongProfile: "Указанный профиль не существует, используйте одно из следующих действий (проверьте конфиг.): [gray]%0%."
addsign-profile:
- "[bold]%0%[/bold]"
- " hover: Табличка профиль %0%"
- " hover: %lang:action|Используйте этот профиль|%"
- " command: /areashop linksigns %0%"
addsign-success: "Табличка была добавлена для %lang:region%."
addsign-successProfile: "Табличка была добавлена для %lang:region% вместе с профилем %0%."
addsign-alreadyRegistered: "Эта табличка уже зарегистрирована в регионе %lang:region%."
addsign-noPermission: "У вас нет разрешения на добавление таблички."
delsign-noSign: "Вы не смотрите на табличку."
delsign-noPermission: "У вас нет разрешения на удаление таблички."
delsign-noRegion: "Эта табличка не принадлежит к регионам в AreaShop."
delsign-success: "Табличка была удалена из региона %lang:region%."
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: "У вас нет прав, чтобы установить владельца региона."
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> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
resell-wrongPrice: "'%0%' не является допустимой ценой."
resell-notRegistered: "Указанный регион не зарегистрирован: %0%."
resell-notBought: "Вы не можете перепродать %lang:region%, так как он еще не продан."
resell-success: "%lang:region% был успешно выставлен в режим перепродажи за %resellprice%."
resell-noPermission: "У Вас нет прав что бы установить ваш регион в режим перепродажи."
resell-noPermissionOther: "У Вас нет прав что бы установить регион в режим перепродажи."
stopresell-help: "/as stopresell [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
stopresell-notRegistered: "Указанный регион не зарегистрирован: %0%."
stopresell-notResell: "Вы не можете остановить перепродажу %lang:region% потому что регион не в режиме перепродажи."
stopresell-success: "%lang:region% был успешно выставлен в режим продажи."
stopresell-noPermission: "У вас нет прав, чтобы установить свой регион обратно в режим продажи."
stopresell-noPermissionOther: "У вас нет разрешения устанавливать регионы обратно в режим продажи."
addfriend-help: "/as addfriend <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
addfriend-noPermissionOther: "У вас нет разрешения на добавление друзей в регионы, которые не являются вашими."
addfriend-noPermission: "У вас нет разрешения на добавление друзей в вашем регионе."
addfriend-successOther: "%lang:tPlayer|%0%|% был добавлен до друзей в %lang:region%."
addfriend-success: "%lang:tPlayer|%0%|% был добавлен до друзей в вашем регионе %lang:region%."
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% уже добавлен до друзей в %lang:region%."
addfriend-self: "Добавление владельца региона как друга было бы бессмысленно."
addfriend-noOwner: "Вы не можете добавлять друзей в регионе без владельца."
addfriend-notVisited: "Вы не можете добавить %0% потому что он еще не посещал этот сервер."
delfriend-help: "/as delfriend <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
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-noRegions: "Не найдено регионов AreaShop в направлении взгляда, убедитесь что регион добавлен в AreaShop [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 для отключения режима."
linksigns-noPermission: "У вас нет разрешения для пользования режима привязки табличек."
linksigns-stopped: "Отключен режим привязки табличек."
stack-help:
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
- " [gray]<amount> Количество создаваемых регионов.[break]"
- " [gray]<gap> Дистанция в блоках между регионами.[break]"
- " [gray]<name> Имя региона (с числом за ним).[break]"
- " [gray]<rent|buy> сделать аренду или продажу.[break]"
- " [gray][group] Добавляет регионы в группу.[break]"
- " [gray]Регионы будут созданы в направлении взгляда."
stack-accepted: "Началось создание %0% %1% регионов с растоянием в %2% блок(ов), имена которых начинаются с %3% и имеют номера за ними.%4%"
stack-addToGroup: "Созданные регионы будут добавлены к группе '%0%'."
stack-noPermission: "У вас нет разрешения создавать и добавлять регионы AreaShop в большом количестве."
stack-wrongAmount: "'%0%' не правильное количество регионов."
stack-wrongGap: "'%0%' не правильное число блоков для отступа между регионами."
stack-noSelection: "У вас нет выделения, которое указывает, где должен быть создан первый регион."
stack-addStart: "[gray]Добавлено %0% регионов около %1% в секунду."
setlandlord-help: "/as setlandlord <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setlandlord-noPermission: "У вас не разрешения чтобы назначить землевладельца в регион."
setlandlord-success: "%lang:landlord% был успешно установлен как землевладелец в %lang:region%."
message-help: "/as message <игрок> <сообщение...>"
message-noPermission: "У вас нет разрешения на отправку AreaShop сообщений."
message-notOnline: "%0% не в сети."
confirm-rent:
- "%lang:prefix%Вы уверены, что вы хотите арендовать %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы арендовать %0%|%"
- " hover: %lang:action|Аренда %0%|%"
- " command: /areashop rent %0%"
confirm-extend:
- "%lang:prefix%Вы уверены, что вы хотите продлить %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы продлить %0%|%"
- " hover: %lang:action|Продлить %0%|%"
- " command: /areashop rent %0%"
confirm-unrent:
- "%lang:prefix%Вы уверены, что хотите снять аренду %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы снять аренду %0%|%"
- " hover: %lang:action|Снять аренду %0%|%"
- " command: /areashop unrent %0%"
confirm-buy:
- "%lang:prefix%Вы уверены, что хотите купить %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы купить %0%|%"
- " hover: %lang:action|Купить %0%|%"
- " command: /areashop buy %0%"
confirm-sell:
- "%lang:prefix%Вы уверены, что хотите продать %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы продать %0%|%"
- " hover: %lang:action|Продать %0%|%"
- " command: /areashop sell %0%"
timeleft-years: "%0% лет"
timeleft-months: "%0% месяцев"
timeleft-days: "%0% дней"
timeleft-hours: "%0% часов"
timeleft-minutes: "%0% минут"
timeleft-second: "%0% секунд"
timeleft-seconds: "%0% секунд"
timeleft-ended: "Истек"
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>
+4 -4
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>
@@ -19,7 +19,7 @@
</repository>
<repository>
<id>vault-repo</id>
<url>http://nexus.theyeticave.net/content/repositories/pub_releases</url>
<url>http://nexus.hc.to/content/repositories/pub_releases</url>
</repository>
</repositories>
@@ -40,4 +40,4 @@
<module>AreaShop</module>
</modules>
</project>
</project>